pebble/src/fw/applib/ui/option_menu_window.h
2025-01-27 11:38:16 -08:00

126 lines
4.7 KiB
C

/*
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "applib/ui/ui.h"
#define OPTION_MENU_CHOICE_NONE (-1)
#define OPTION_MENU_STATUS_SEPARATOR_MODE PBL_IF_RECT_ELSE(StatusBarLayerSeparatorModeDotted, \
StatusBarLayerSeparatorModeNone)
typedef struct OptionMenu OptionMenu;
typedef void (*OptionMenuSelectCallback)(OptionMenu *option_menu, int selection, void *context);
typedef uint16_t (*OptionMenuGetNumRowsCallback)(OptionMenu *option_menu, void *context);
typedef void (*OptionMenuDrawRowCallback)(OptionMenu *option_menu, GContext *ctx,
const Layer *cell_layer, const GRect *text_frame,
uint32_t row, bool selected, void *context);
typedef void (*OptionMenuUnloadCallback)(OptionMenu *option_menu, void *context);
typedef uint16_t (*OptionMenuGetCellHeightCallback)(OptionMenu *option_menu, uint16_t row,
bool selected, void *context);
typedef struct OptionMenuCallbacks {
OptionMenuSelectCallback select;
OptionMenuGetNumRowsCallback get_num_rows;
OptionMenuDrawRowCallback draw_row;
OptionMenuUnloadCallback unload;
OptionMenuGetCellHeightCallback get_cell_height;
} OptionMenuCallbacks;
typedef struct OptionMenuColors {
GColor background;
GColor foreground;
} OptionMenuColors;
typedef enum OptionMenuContentType {
//! Content consists of title subtitle or single-line title with ample vertical spacing.
OptionMenuContentType_Default,
//! Content consists of a single line.
OptionMenuContentType_SingleLine,
//! Content consists of two lines.
OptionMenuContentType_DoubleLine,
OptionMenuContentTypeCount
} OptionMenuContentType;
struct OptionMenu {
Window window;
StatusBarLayer status_layer;
MenuLayer menu_layer;
const char *title;
GFont title_font;
OptionMenuContentType content_type;
GBitmap chosen_image;
GBitmap not_chosen_image;
bool icons_enabled;
OptionMenuCallbacks callbacks;
void *context;
int choice;
OptionMenuColors status_colors;
OptionMenuColors normal_colors;
OptionMenuColors highlight_colors;
};
typedef struct {
const char *title;
int choice;
OptionMenuContentType content_type;
OptionMenuColors status_colors;
OptionMenuColors highlight_colors;
bool icons_enabled;
} OptionMenuConfig;
uint16_t option_menu_default_cell_height(OptionMenuContentType content_type, bool selected);
void option_menu_set_status_colors(OptionMenu *option_menu, GColor background, GColor foreground);
void option_menu_set_normal_colors(OptionMenu *option_menu, GColor background, GColor foreground);
void option_menu_set_highlight_colors(OptionMenu *option_menu, GColor background,
GColor foreground);
//! @internal
//! This is currently the only way to set callbacks, which follows (calling it now) 4.x conventions.
//! If option menu must be exported to 3.x, a pass-by value wrapper must be created.
void option_menu_set_callbacks(OptionMenu *option_menu, const OptionMenuCallbacks *callbacks,
void *context);
void option_menu_set_title(OptionMenu *option_menu, const char *title);
void option_menu_set_choice(OptionMenu *option_menu, int choice);
void option_menu_set_content_type(OptionMenu *option_menu, OptionMenuContentType content_type);
// enable or disable radio button icons
void option_menu_set_icons_enabled(OptionMenu *option_menu, bool icons_enabled);
void option_menu_reload_data(OptionMenu *option_menu);
//! @internal
//! Use this to set common initialization parameters rather than a group of the particular setters.
void option_menu_configure(OptionMenu *option_menu, const OptionMenuConfig *config);
void option_menu_init(OptionMenu *option_menu);
void option_menu_deinit(OptionMenu *option_menu);
OptionMenu *option_menu_create(void);
void option_menu_destroy(OptionMenu *option_menu);
void option_menu_system_draw_row(OptionMenu *option_menu, GContext *ctx, const Layer *cell_layer,
const GRect *cell_frame, const char *title, bool selected,
void *context);