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
+1
View File
@@ -1,3 +1,4 @@
/build
/.clangd
/.lock-waf*
/package-lock.json
+2 -1
View File
@@ -32,7 +32,8 @@
"CLAY_SHOW_TIME_MG",
"CLAY_LED_COLOR",
"CLAY_BG_COLOR",
"CLAY_MG_COLOR",
"CLAY_BAR_MG_COLOR",
"CLAY_TIME_MG_COLOR",
"CLAY_FG_COLOR"
],
"resources": {
+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);
+15
View File
@@ -0,0 +1,15 @@
#pragma once
#include <pebble.h>
#define STORAGE_KEY_SETTINGS 69
typedef struct ClaySettings {
bool ShowTimeMG;
GColor ColorLED;
GColor ColorBG;
GColor ColorMGBars;
GColor ColorMGTime;
GColor ColorFG;
} __attribute__((__packed__)) ClaySettings;
_Static_assert(sizeof(ClaySettings) <= 256, "ClaySettings exceeds Pebble 256-byte persist limit!");
+17 -7
View File
@@ -12,6 +12,7 @@ module.exports = [
"defaultValue": "Options"
},
{
"id": "time_mg_toggle",
"type": "toggle",
"messageKey": "CLAY_SHOW_TIME_MG",
"defaultValue": false,
@@ -30,13 +31,15 @@ module.exports = [
{
"id": "custom_colors_toggle",
"type": "toggle",
"messageKey": "PRIV_CUSTOM_COLORS_TOGGLE",
"defaultValue": false,
"label": "Use custom colors"
},
{
"id": "color_preset_selector",
"type": "select",
"defaultValue": "Standard",
"messageKey": "PRIV_COLOR_PRESET_TOGGLE",
"defaultValue": "civic_standard",
"label": "Color Preset",
"options": [
{
@@ -52,10 +55,9 @@ module.exports = [
{
"id": "custom_color_led",
"type": "color",
"capabilities": ["PLATFORM_EMERY"],
"messageKey": "CLAY_LED_COLOR",
"defaultValue": "0000ff",
"label": "LED color",
"defaultValue": "ffffff",
"label": "Backlight color (Time 2)",
"sunlight": false,
},
{
@@ -67,11 +69,19 @@ module.exports = [
"sunlight": false,
},
{
"id": "custom_color_mg",
"id": "custom_color_mg_bars",
"type": "color",
"messageKey": "CLAY_MG_COLOR",
"messageKey": "CLAY_BAR_MG_COLOR",
"defaultValue": "aaaaaa",
"label": "Midground color",
"label": "Bar midground color",
"sunlight": false,
},
{
"id": "custom_color_mg_time",
"type": "color",
"messageKey": "CLAY_TIME_MG_COLOR",
"defaultValue": "555555",
"label": "Time segment midground color",
"sunlight": false,
},
{
+17 -10
View File
@@ -4,34 +4,41 @@ module.exports = function (minified) {
var $ = minified.$;
var HTML = minified.HTML;
// TODO set LED color (only on emery)
function setColorsToPreset() {
selectedPreset = clayConfig.getItemById('color_preset_selector').get()
var selectedPreset = clayConfig.getItemById('color_preset_selector').get();
switch (selectedPreset) {
case 'civic_si':
clayConfig.getItemById('custom_color_bg').set('ff0000');
clayConfig.getItemById('custom_color_mg').set('aaaaaa');
clayConfig.getItemById('custom_color_fg').set('ffffff');
clayConfig.getItemById('custom_color_led').set('ff0000');
clayConfig.getItemById('custom_color_bg').set('000000');
clayConfig.getItemById('custom_color_mg_bars').set('555555');
clayConfig.getItemById('custom_color_mg_time').set('555555');
clayConfig.getItemById('custom_color_fg').set('ff0000');
break
default:
clayConfig.getItemById('custom_color_led').set('ffffff');
clayConfig.getItemById('custom_color_bg').set('0000ff');
clayConfig.getItemById('custom_color_mg').set('aaaaaa');
clayConfig.getItemById('custom_color_mg_bars').set('555555');
clayConfig.getItemById('custom_color_mg_time').set('555555');
clayConfig.getItemById('custom_color_fg').set('ffffff');
}
}
// TODO show/hide LED color selector (only on emery)
function toggleCustomColors() {
setColorsToPreset();
if (this.get()) {
clayConfig.getItemById('color_preset_selector').hide();
clayConfig.getItemById('custom_color_led').show();
clayConfig.getItemById('custom_color_bg').show();
clayConfig.getItemById('custom_color_mg').show();
clayConfig.getItemById('custom_color_mg_bars').show();
clayConfig.getItemById('custom_color_mg_time').show();
clayConfig.getItemById('custom_color_fg').show();
} else {
setColorsToPreset();
clayConfig.getItemById('color_preset_selector').show();
clayConfig.getItemById('custom_color_led').hide();
clayConfig.getItemById('custom_color_bg').hide();
clayConfig.getItemById('custom_color_mg').hide();
clayConfig.getItemById('custom_color_mg_bars').hide();
clayConfig.getItemById('custom_color_mg_time').hide();
clayConfig.getItemById('custom_color_fg').hide();
}
}
@@ -41,6 +48,6 @@ module.exports = function (minified) {
toggleCustomColors.call(customColorsToggle);
customColorsToggle.on('change', toggleCustomColors);
clayConfig.getItemById('color_preset_selector').on('change', setColorsToPreset());
clayConfig.getItemById('color_preset_selector').on('change', setColorsToPreset);
});
};