More settings implementation

This commit is contained in:
2026-05-30 17:42:43 -04:00
parent 8e588af378
commit 748ad13cd4
6 changed files with 120 additions and 72 deletions
+68 -54
View File
@@ -1,5 +1,5 @@
#include "palette_manip.h"
#include "src/resource_ids.auto.h"
#include "settings.h"
#include <pebble.h>
// window statics
@@ -26,18 +26,12 @@ static const GRect s_time_grects[4] = {GRect(s_x_l, 2, 69, 110), GRect(s_x_r, 2,
static const uint8_t s_temp_guage_x_pos = 6;
static const uint16_t s_fuel_guage_x_pos = PBL_DISPLAY_WIDTH - 23;
// persist statics&defines
static GColor8 s_mg_color;
static GColor8 s_fg_color;
#define storage_key_show_time_mg 0
#define storage_key_led_color 1
#define storage_key_bg_color 2
#define storage_key_mg_color 3
#define storage_key_fg_color 4
// settings statics
static ClaySettings settings;
// bitmaps
// bitmap statics
static GBitmap *s_font_bitmaps[10];
static GBitmap *s_time_mg_0;
static GBitmap *s_time_mg_8;
static GBitmap *s_c_icon;
static GBitmap *s_h_icon;
static GBitmap *s_e_icon;
@@ -82,7 +76,7 @@ static void fuel_update_proc(Layer *layer, GContext *ctx) {
static void temp_fuel_mg_update_proc_helper(Layer *layer, GContext *ctx, bool isFuel) {
GRect bounds = layer_get_bounds(layer);
graphics_context_set_fill_color(ctx, s_mg_color);
graphics_context_set_fill_color(ctx, settings.ColorMGBars);
graphics_fill_rect(ctx, bounds, 0, GCornerNone);
if (isFuel) {
graphics_context_set_stroke_color(ctx, GColorRed);
@@ -111,29 +105,21 @@ static void fuel_mg_update_proc(Layer *layer, GContext *ctx) {
static void main_window_load() {
Layer *window_layer = window_get_root_layer(s_main_window);
if (persist_exists(storage_key_led_color)) {
light_set_color_rgb888(persist_read_int(storage_key_led_color));
} else {
light_set_color(GColorWhite);
}
if (persist_exists(storage_key_bg_color)) {
window_set_background_color(s_main_window, (GColor8){.argb = persist_read_int(storage_key_bg_color)});
} else {
window_set_background_color(s_main_window, GColorBlue);
}
// background (+led) colors
light_set_color(settings.ColorLED); // no-op on unsupported platforms
window_set_background_color(s_main_window, settings.ColorBG);
s_temp_mg_layer = layer_create(GRect(s_temp_guage_x_pos - 1, 21, s_bar_width + 2, PBL_DISPLAY_HEIGHT - 43));
layer_set_update_proc(s_temp_mg_layer, temp_mg_update_proc);
s_fuel_mg_layer = layer_create(GRect(s_fuel_guage_x_pos - 1, 21, s_bar_width + 2, PBL_DISPLAY_HEIGHT - 43));
layer_set_update_proc(s_fuel_mg_layer, fuel_mg_update_proc);
if (persist_read_bool(storage_key_show_time_mg)) {
s_time_mg_0 = gbitmap_create_with_resource(RESOURCE_ID_0);
replace_gbitmap_color(GColorWhite, s_mg_color, s_time_mg_0, NULL);
if (settings.ShowTimeMG) {
s_time_mg_8 = gbitmap_create_with_resource(RESOURCE_ID_8);
replace_gbitmap_color(GColorWhite, settings.ColorMGTime, s_time_mg_8, NULL);
for (int i = 0; i < 4; ++i) {
s_time_mg_layers[i] = bitmap_layer_create(s_time_grects[i]);
bitmap_layer_set_bitmap(s_time_mg_layers[i], s_time_mg_0);
bitmap_layer_set_bitmap(s_time_mg_layers[i], s_time_mg_8);
bitmap_layer_set_compositing_mode(s_time_mg_layers[i], GCompOpSet);
layer_add_child(window_layer, bitmap_layer_get_layer(s_time_mg_layers[i]));
}
@@ -152,14 +138,14 @@ static void main_window_load() {
bitmap_layer_set_compositing_mode(s_e_layer, GCompOpSet);
bitmap_layer_set_compositing_mode(s_f_layer, GCompOpSet);
if (s_fg_color.argb != GColorWhite.argb) {
if (settings.ColorFG.argb != GColorWhite.argb) {
for (int i = 0; i < 10; ++i) {
replace_gbitmap_color(GColorWhite, s_fg_color, s_font_bitmaps[i], NULL);
replace_gbitmap_color(GColorWhite, settings.ColorFG, s_font_bitmaps[i], NULL);
}
replace_gbitmap_color(GColorWhite, s_fg_color, s_c_icon, NULL);
replace_gbitmap_color(GColorWhite, s_fg_color, s_h_icon, NULL);
replace_gbitmap_color(GColorWhite, s_fg_color, s_e_icon, NULL);
replace_gbitmap_color(GColorWhite, s_fg_color, s_f_icon, NULL);
replace_gbitmap_color(GColorWhite, settings.ColorFG, s_c_icon, NULL);
replace_gbitmap_color(GColorWhite, settings.ColorFG, s_h_icon, NULL);
replace_gbitmap_color(GColorWhite, settings.ColorFG, s_e_icon, NULL);
replace_gbitmap_color(GColorWhite, settings.ColorFG, s_f_icon, NULL);
}
for (int i = 0; i < 4; ++i) {
@@ -177,6 +163,7 @@ static void main_window_load() {
static void main_window_unload() {
layer_destroy(s_fuel_mg_layer);
layer_destroy(s_temp_mg_layer);
bitmap_layer_destroy(s_f_layer);
bitmap_layer_destroy(s_e_layer);
bitmap_layer_destroy(s_h_layer);
@@ -185,11 +172,12 @@ static void main_window_unload() {
if (s_time_mg_layers[i]) {
bitmap_layer_destroy(s_time_mg_layers[i]);
s_time_mg_layers[i] = NULL;
if (i == 0) {
gbitmap_destroy(s_time_mg_0);
}
}
}
if (s_time_mg_8) {
gbitmap_destroy(s_time_mg_8);
s_time_mg_8 = NULL;
}
}
static void update_minute_1() {
@@ -221,16 +209,6 @@ static void minute_handler(struct tm *tick_time, TimeUnits units_changed) {
}
static void soft_reload(bool first_load) {
if (persist_exists(storage_key_mg_color)) {
s_mg_color = (GColor8){.argb = persist_read_int(storage_key_mg_color)};
} else {
s_mg_color = GColorLightGray;
}
if (persist_exists(storage_key_fg_color)) {
s_fg_color = (GColor8){.argb = persist_read_int(storage_key_fg_color)};
} else {
s_fg_color = GColorWhite;
}
if (!first_load) {
window_stack_remove(s_main_window, false);
window_destroy(s_main_window);
@@ -245,23 +223,59 @@ static void soft_reload(bool first_load) {
static void inbox_received_handler(DictionaryIterator *iter, void *context) {
Tuple *ready_tuple = dict_find(iter, MESSAGE_KEY_PKJS_READY);
if (ready_tuple) {
APP_LOG(APP_LOG_LEVEL_DEBUG, "PKJS IS READY");
// TODO request temp bars from PKJS
return;
}
// TODO set up receive handler for temp bars; be sure to return after to avoid soft reloading
Tuple *time_mg_tuple = dict_find(iter, MESSAGE_KEY_CLAY_SHOW_TIME_MG);
if (time_mg_tuple) {
APP_LOG(APP_LOG_LEVEL_DEBUG, "TIME MG TOGGLED");
persist_write_bool(storage_key_show_time_mg, time_mg_tuple->value->int32 == 1);
soft_reload(false);
// TEMPERATURE DATA
Tuple *temp_bar_count = dict_find(iter, MESSAGE_KEY_PKJS_TEMP_BAR_COUNT);
if (temp_bar_count) {
// TODO
return;
}
// CLAY SETTINGS
Tuple *show_time_mg_tuple = dict_find(iter, MESSAGE_KEY_CLAY_SHOW_TIME_MG);
Tuple *color_led_tuple = dict_find(iter, MESSAGE_KEY_CLAY_LED_COLOR);
Tuple *color_bg_tuple = dict_find(iter, MESSAGE_KEY_CLAY_BG_COLOR);
Tuple *color_mg_bar_tuple = dict_find(iter, MESSAGE_KEY_CLAY_BAR_MG_COLOR);
Tuple *color_mg_time_tuple = dict_find(iter, MESSAGE_KEY_CLAY_TIME_MG_COLOR);
Tuple *color_fg_tuple = dict_find(iter, MESSAGE_KEY_CLAY_FG_COLOR);
if (show_time_mg_tuple) {
settings.ShowTimeMG = show_time_mg_tuple->value->uint8;
}
if (color_led_tuple) {
settings.ColorLED = GColorFromHEX(color_led_tuple->value->int32);
}
if (color_bg_tuple) {
settings.ColorBG = GColorFromHEX(color_bg_tuple->value->int32);
}
if (color_mg_bar_tuple) {
settings.ColorMGBars = GColorFromHEX(color_mg_bar_tuple->value->int32);
}
if (color_mg_time_tuple) {
settings.ColorMGTime = GColorFromHEX(color_mg_time_tuple->value->int32);
}
if (color_fg_tuple) {
settings.ColorFG = GColorFromHEX(color_fg_tuple->value->int32);
}
persist_write_data(STORAGE_KEY_SETTINGS, &settings, sizeof(settings));
soft_reload(false);
}
static void init() {
// load settings from persist (or set defaults if not present)
if (persist_exists(STORAGE_KEY_SETTINGS)) {
persist_read_data(STORAGE_KEY_SETTINGS, &settings, sizeof(settings));
} else {
settings.ShowTimeMG = false;
settings.ColorLED = GColorWhite;
settings.ColorBG = GColorBlue;
settings.ColorMGBars = GColorDarkGray;
settings.ColorMGTime = GColorDarkGray;
settings.ColorFG = GColorWhite;
}
// load bitmaps
s_font_bitmaps[0] = gbitmap_create_with_resource(RESOURCE_ID_0);
s_font_bitmaps[1] = gbitmap_create_with_resource(RESOURCE_ID_1);