Improve organization of NeatBarLayer struct

This commit is contained in:
2026-07-20 20:19:40 -04:00
parent 147a230c97
commit 70004c432d
2 changed files with 38 additions and 22 deletions
+27 -18
View File
@@ -38,7 +38,7 @@ static NeatBarLayer *s_current_neat_bar = NULL;
static GRect s_get_home_frame(NeatBarLayer *neat_bar, uint8_t button_index) {
int16_t y_offset = neat_bar->main_grect.origin.y;
int8_t spread = neat_bar->spread;
int8_t spread = neat_bar->icons_spread;
uint16_t width = neat_bar->main_grect.size.w;
switch (button_index) {
@@ -141,7 +141,7 @@ static void s_select_up_handler(ClickRecognizerRef recognizer, void *context) {
static void s_main_layer_update_proc(Layer *layer, GContext *ctx) {
graphics_context_set_antialiased(ctx, false);
graphics_context_set_fill_color(ctx, s_current_neat_bar->background_color);
graphics_fill_rect(ctx, layer_get_bounds(layer), s_current_neat_bar->corner_radius, s_current_neat_bar->x_offset > 0 ? GCornersAll : GCornersLeft);
graphics_fill_rect(ctx, layer_get_bounds(layer), s_current_neat_bar->bar_corner_radius, s_current_neat_bar->bar_x_offset > 0 ? GCornersAll : GCornersLeft);
}
static void s_base_click_config_provider(void *config_context) {
@@ -166,7 +166,7 @@ inline static void s_update_click_config_provider(NeatBarLayer *neat_bar) {
static void s_recenter_icons(NeatBarLayer *neat_bar) {
int16_t y_offset = neat_bar->main_grect.origin.y;
int8_t spread = neat_bar->spread;
int8_t spread = neat_bar->icons_spread;
if (neat_bar->up_layer) {
layer_set_frame(bitmap_layer_get_layer(neat_bar->up_layer),
GRect(ICON_X_OFFSET, UP_Y - spread - y_offset, neat_bar->main_grect.size.w, 25));
@@ -217,10 +217,10 @@ void neat_bar_layer_set_animations_duration(NeatBarLayer *neat_bar, uint8_t dura
// default: 0
void neat_bar_layer_set_floating(NeatBarLayer *neat_bar, uint16_t x_offset) {
if (x_offset == neat_bar->x_offset) {
if (x_offset == neat_bar->bar_x_offset) {
return;
}
neat_bar->x_offset = x_offset;
neat_bar->bar_x_offset = x_offset;
neat_bar->main_grect.origin.x = PBL_DISPLAY_WIDTH - neat_bar->main_grect.size.w - x_offset;
layer_set_frame(neat_bar->main_layer, neat_bar->main_grect);
layer_mark_dirty(neat_bar->main_layer);
@@ -234,9 +234,9 @@ void neat_bar_layer_set_width(NeatBarLayer *neat_bar, uint16_t width) {
neat_bar->main_grect.origin.x = PBL_DISPLAY_WIDTH - width;
neat_bar->main_grect.size.w = width;
layer_set_frame(neat_bar->main_layer, neat_bar->main_grect);
if (neat_bar->x_offset > 0) {
uint16_t x = neat_bar->x_offset;
neat_bar->x_offset = 0; // force update
if (neat_bar->bar_x_offset > 0) {
uint16_t x = neat_bar->bar_x_offset;
neat_bar->bar_x_offset = 0; // force update
neat_bar_layer_set_floating(neat_bar, x);
} else {
layer_mark_dirty(neat_bar->main_layer);
@@ -267,10 +267,10 @@ void neat_bar_layer_set_y_offset(NeatBarLayer *neat_bar, uint16_t y_offset) {
// default: 0
void neat_bar_layer_set_corner_radius(NeatBarLayer *neat_bar, uint16_t corner_radius) {
if (corner_radius == neat_bar->corner_radius) {
if (corner_radius == neat_bar->bar_corner_radius) {
return;
}
neat_bar->corner_radius = corner_radius;
neat_bar->bar_corner_radius = corner_radius;
layer_mark_dirty(neat_bar->main_layer);
}
@@ -285,10 +285,10 @@ void neat_bar_layer_set_background_color(NeatBarLayer *neat_bar, GColor backgrou
// default: 0
void neat_bar_layer_set_spread(NeatBarLayer *neat_bar, int8_t spread) {
if (spread == neat_bar->spread) {
if (spread == neat_bar->icons_spread) {
return;
}
neat_bar->spread = spread;
neat_bar->icons_spread = spread;
s_recenter_icons(neat_bar);
}
@@ -312,8 +312,8 @@ void neat_bar_layer_set_icon(NeatBarLayer *neat_bar, ButtonId button_id, GBitmap
}
if (!current_bitmap_layer) {
int16_t adjusted_y = (button_id == BUTTON_ID_UP) ? y_pos - neat_bar->spread
: (button_id == BUTTON_ID_DOWN) ? y_pos + neat_bar->spread
int16_t adjusted_y = (button_id == BUTTON_ID_UP) ? y_pos - neat_bar->icons_spread
: (button_id == BUTTON_ID_DOWN) ? y_pos + neat_bar->icons_spread
: y_pos;
current_bitmap_layer = bitmap_layer_create(GRect(ICON_X_OFFSET, adjusted_y, neat_bar->main_grect.size.w, 25));
layer_add_child(neat_bar->main_layer, bitmap_layer_get_layer(current_bitmap_layer));
@@ -338,23 +338,32 @@ void neat_bar_layer_set_icon(NeatBarLayer *neat_bar, ButtonId button_id, GBitmap
NeatBarLayer *neat_bar_layer_create() {
NeatBarLayer *neat_bar = malloc(sizeof(NeatBarLayer));
// layerage
neat_bar->main_grect = s_base_grect_rect;
neat_bar->main_layer = layer_create(s_base_grect_rect);
neat_bar->up_layer = NULL;
neat_bar->down_layer = NULL;
neat_bar->select_layer = NULL;
// stock cfg/plumbing
neat_bar->click_config_provider = NULL;
neat_bar->background_color = GColorBlack;
neat_bar->corner_radius = 0;
neat_bar->x_offset = 0;
neat_bar->spread = 0;
neat_bar->context = NULL;
// neat_bar exclusives :D
neat_bar->bar_corner_radius = 0;
neat_bar->bar_x_offset = 0;
neat_bar->icons_spread = 0;
neat_bar->animations_move_on_y_axis = false;
neat_bar->animations_move_distance = ANIM_DISTANCE;
neat_bar->animations_duration = 144;
// state tracking
neat_bar->up_pressed = false;
neat_bar->select_pressed = false;
neat_bar->down_pressed = false;
neat_bar->context = NULL;
layer_set_update_proc(neat_bar->main_layer, s_main_layer_update_proc);
s_current_neat_bar = neat_bar;
return neat_bar;
+11 -4
View File
@@ -6,24 +6,31 @@
#include <pebble.h>
typedef struct {
// layerage
struct Window *window;
GRect main_grect;
Layer *main_layer;
BitmapLayer *up_layer;
BitmapLayer *down_layer;
BitmapLayer *select_layer;
// stock cfg/plumbing
ClickConfigProvider click_config_provider;
GColor8 background_color;
uint16_t corner_radius;
uint16_t x_offset;
int8_t spread;
void *context;
// neat_bar exclusives :D
uint16_t bar_corner_radius;
uint16_t bar_x_offset;
int8_t icons_spread;
bool animations_move_on_y_axis;
int8_t animations_move_distance;
uint8_t animations_duration;
// state tracking
bool up_pressed;
bool select_pressed;
bool down_pressed;
void *context;
} NeatBarLayer;
void neat_bar_layer_add_to_window(NeatBarLayer *neat_bar, Window *window);