From 67e456fdeb4af2d2cc5878b2917a96cf410d1654 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 19 Sep 2026 17:33:59 +0300 Subject: [PATCH] Added variable scrollbar length, max item count to 24, fixed an NVM bug --- design/Percentage.pxo | Bin 32211 -> 36440 bytes package.json | 34 ++++----- resources/images/scroll_bar_bottom.png | Bin 0 -> 97 bytes resources/images/scroll_bar_full.png | Bin 158 -> 0 bytes resources/images/scroll_bar_half.png | Bin 146 -> 0 bytes resources/images/scroll_bar_middle.png | Bin 0 -> 100 bytes resources/images/scroll_bar_third.png | Bin 142 -> 0 bytes resources/images/scroll_bar_top.png | Bin 0 -> 101 bytes screenshots/icon_big.png | Bin 0 -> 1183 bytes screenshots/icon_small.png | Bin 0 -> 525 bytes src/c/items.c | 30 ++++++-- src/c/items.h | 5 +- src/c/scrolllayer.c | 94 ++++++++++++------------- src/c/scrolllayer.h | 1 + src/pkjs/config.js | 2 +- 15 files changed, 92 insertions(+), 74 deletions(-) create mode 100644 resources/images/scroll_bar_bottom.png delete mode 100644 resources/images/scroll_bar_full.png delete mode 100644 resources/images/scroll_bar_half.png create mode 100644 resources/images/scroll_bar_middle.png delete mode 100644 resources/images/scroll_bar_third.png create mode 100644 resources/images/scroll_bar_top.png create mode 100644 screenshots/icon_big.png create mode 100644 screenshots/icon_small.png diff --git a/design/Percentage.pxo b/design/Percentage.pxo index c80ca4066e37f318c0ffab07e0e3517e373bd650..13d6f8055fa01722c741b4e532912a7479690261 100644 GIT binary patch delta 7446 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 delta 6671 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 diff --git a/package.json b/package.json index 5870c37..29b4196 100644 --- a/package.json +++ b/package.json @@ -23,18 +23,6 @@ "projectType": "native", "resources": { "media": [ - { - "file": "images/scroll_bar_half.png", - "name": "IMAGE_SCROLL_BAR_HALF", - "targetPlatforms": null, - "type": "bitmap" - }, - { - "file": "images/scroll_bar_full.png", - "name": "IMAGE_SCROLL_BAR_FULL", - "targetPlatforms": null, - "type": "bitmap" - }, { "file": "images/item_background.png", "name": "IMAGE_ITEM_BACKGROUND", @@ -87,15 +75,27 @@ "type": "font" }, { - "file": "images/scroll_bar_third.png", - "name": "IMAGE_SCROLL_BAR_THIRD", + "file": "images/menu_icon.png", + "menuIcon": true, + "name": "IMAGE_MENU_ICON", "targetPlatforms": null, "type": "bitmap" }, { - "file": "images/menu_icon.png", - "menuIcon": true, - "name": "IMAGE_MENU_ICON", + "file": "images/scroll_bar_top.png", + "name": "IMAGE_SCROLL_BAR_TOP", + "targetPlatforms": null, + "type": "bitmap" + }, + { + "file": "images/scroll_bar_middle.png", + "name": "IMAGE_SCROLL_BAR_MIDDLE", + "targetPlatforms": null, + "type": "bitmap" + }, + { + "file": "images/scroll_bar_bottom.png", + "name": "IMAGE_SCROLL_BAR_BOTTOM", "targetPlatforms": null, "type": "bitmap" } diff --git a/resources/images/scroll_bar_bottom.png b/resources/images/scroll_bar_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..fe78875ec0b1d240f2d20254da5aaf8fccb47cb8 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^AT|>R8<0#)^t}M27>k44ofy`glX(f`NPD_ChH%VG rPHAYq@Si8*V3r#j5U9PGG=qVm_8Jq*`B)x5pfUzeS3j3^P6A8Xy_0BGuw5!vxPR+W(Sv5z2KRY^83>@pdAdJu6{1-oD!M<9Lh62 diff --git a/resources/images/scroll_bar_half.png b/resources/images/scroll_bar_half.png deleted file mode 100644 index 0431b40d0d071a2f0945116698276669558275a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)Q38<5O>@2U=@7>k44ofy`glX(f`_;|WFhIn+o zy>7^NK!L|OaJIEsdyDg>g|0eoS>NAldd=H(yXx}qIb16@sjgg_+;x5VszQbH|314b s2yn14H97z(pO13uZ=^5zxc>YdnJ?Vme(Akf05q4u)78&qol`;+0E1UFp8x;= diff --git a/resources/images/scroll_bar_middle.png b/resources/images/scroll_bar_middle.png new file mode 100644 index 0000000000000000000000000000000000000000..1036cbe1a2647277fbafa8ca1ceab05ac4a69601 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^AT|>R8<0#)^t}M27>k44ofy`glX(f`$a%UrhH%VG vj@kO^e?1!;Tib>WS9xwQy3FBh*8%Ejzr`9cD@pw$P$h$>tDnm{r-UW|SwR|n literal 0 HcmV?d00001 diff --git a/resources/images/scroll_bar_third.png b/resources/images/scroll_bar_third.png deleted file mode 100644 index 2b6dbb904c5cafb76ccd93b0d6ee5d2def079f59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^Ahrny8<5=Wv@!umF%}28J29*~C-V}>@$htU4DslE zd(DuKL4kw$z%~0*${#0MtSCI_B7D3|sUT6$@UdK@N}3A8ls7Y4Ur&y-p0IKMKMe@@ kAzjpOn#R8<0#)^t}M27>k44ofy`glX(f`$a}gthH%VG xPHAWgUH$KW`T?dxha@B=B_t$fZ17BCX5ib(!V@_=X>F!6A$c4r(iW-s^x+X#wOL02m)R1Y%r~y9? z!sw$!I^CJjYS?htW`^Y~|E<$$If7pdd#P)^Pw(D?t&cMI5>C)QTCWE%xOE@E0qO5y zAjrlZK*h28NDL+b4GQec2LTdUtOsnxeh>_^|5w|t8DVhKbIiWf-FpX@f+yL>z9@Nz zyKPna7*IdyIOR31vP#@?9MinqHcL9@s~X84+i~_fPJLv14+Wq~%0gXHwuPD~*H-hZ zE=H?1mYesDsY8u-Oo|M-&q1RSS8)QMjeUaiB#t%_d@0tT37^W8$~nu^J0SNEY0zo?(aA^Z|Y9L`L72uZ6hff zsDXG_iTIIN7?GEWu7IXJN*%q~fs@~_ECJGA*pm`<4=3=7ZX@Hew0Kn@ad;QE=ys+L z3%Ha$Pl^eAqP$yLC zYzviDYR(PSM99|rGNQ4R);nwxCnY4iflpt9ItLd|uV=zWp8u*j&o5#{!^A(K5NFf| z&}vL?mk)conXXlgXIV&OD{DqlvXfuMo465)o_du4)GaxCx%Y9V6+g&$ehOVDeREly zzv1APLWD8bySrl9hdL+Qw2pO0rsg^JXXeRLY8oi?w@#C3g@4-KXqBXt?(nC79Vlnu z3nB+;Dnw$GuurM?MoY4}%RCXQymV9s(Y_5bN)>>Gh_opd``Bb!szB-aBw706=r39p zo}|I1wwh91jGyLsu$N|^k8ag#AZFR9CFApv{4daMpPhqAs_u3Q`%q`On|@6f7uw+P zjJ)w{hR{-UvB!sOv7$C(x_%QXyU;a|+_Il%8^vmpS3phi!UaU)zq!?L1gl|x>^JlL z6?uhHz9H_>%-DaIu9arL)QT(Hb$um@j%M{xFHhOoPvR2-3-5WqF( l31kR<1V(}u!IPrSK;`lmxjB)yilJB1u^oYq8 zGo_sFObM6gLr>R-m@F}BCsfYq5;o^i>-EGU#)-^W?Z>FdD=BvVE;(~vwSK!k#AM|d z`y4ApNtolKJLu(t==`gvAY!t`?Cz93Eq3KZbK0tuISw(|Vxl{cHQtk=a$9tM#C*D# zE-B;~@opXWW1{bFbbPlI#8ipdtw&btpIcH8Qzd3T*OQ}iiC1^rmV%gSF`gW6-glRR zm@Y9^j><8%vu4L<-+flsgP3kHt2+}teN_J?TNtOR>2sOAcagi#e5|BxL{k zfS6lis->tqo08_8qKN4h6P2=B|8$K*OqZBXm%?4C>#p=)q#&kCOjbXo`qzimQ;k!p z`c&GjFja5Z-htGPXRQMXwO19ou z-N~+TyHcopt1I8ro#_%3orfIbM2x@?nAppN7{nkZ76HV>;zf=@Oiau#-_XRKt>nVX P00000NkvXXu0mjfnRxq> literal 0 HcmV?d00001 diff --git a/src/c/items.c b/src/c/items.c index d12fd14..b604c54 100644 --- a/src/c/items.c +++ b/src/c/items.c @@ -5,21 +5,37 @@ #include "src/c/scrolllayer.h" +static const uint32_t ITEMS_NVM_KEYS[NUM_KEYS] = {1, 2, 3, 4, 5, 6}; + item_list_t s_items; // ------------ NVM ------------ void items_nvm_load() { - if (persist_exists(ITEMS_NVM_KEY)) { - persist_read_data(ITEMS_NVM_KEY, s_items.items, sizeof(s_items.items)); - } - else { - memset(s_items.items, 0, sizeof(s_items.items)); - } + memset(s_items.items, 0, sizeof(s_items.items)); + + for (int chunk = 0; chunk < NUM_KEYS; chunk++) { + int start = chunk * ITEMS_PER_KEY; + + persist_read_data( + ITEMS_NVM_KEYS[chunk], + &s_items.items[start], + ITEMS_PER_KEY * sizeof(item_t) + ); + } } void items_nvm_save() { - persist_write_data(ITEMS_NVM_KEY, s_items.items, sizeof(s_items.items)); + for (int chunk = 0; chunk < NUM_KEYS; chunk++) { + int start = chunk * ITEMS_PER_KEY; + int count = ITEMS_PER_KEY; + + persist_write_data( + ITEMS_NVM_KEYS[chunk], + &s_items.items[start], + count * sizeof(item_t) + ); + } } // ------------ ITEMS ------------ diff --git a/src/c/items.h b/src/c/items.h index 33fdeb0..a470b37 100644 --- a/src/c/items.h +++ b/src/c/items.h @@ -2,8 +2,9 @@ // NVM -#define ITEMS_NVM_KEY 1 -#define MAX_ITEMS 9 +#define ITEMS_PER_KEY 4 +#define NUM_KEYS 6 +#define MAX_ITEMS 24 #define MAX_CHARACTERS 41 diff --git a/src/c/scrolllayer.c b/src/c/scrolllayer.c index d87b122..7d8d0c0 100644 --- a/src/c/scrolllayer.c +++ b/src/c/scrolllayer.c @@ -12,10 +12,9 @@ static GBitmap *s_plus_bitmap; static GBitmap *s_minus_bitmap; static GBitmap *s_background_plus_pressed_bitmap; static GBitmap *s_background_minus_pressed_bitmap; -static GBitmap *s_scroll_bar_current_bitmap; -static GBitmap *s_scroll_bar_full_bitmap; -static GBitmap *s_scroll_bar_half_bitmap; -static GBitmap *s_scroll_bar_third_bitmap; +static GBitmap *s_scroll_bar_top_bitmap; +static GBitmap *s_scroll_bar_middle_bitmap; +static GBitmap *s_scroll_bar_bottom_bitmap; // TOUCH BUTTONS static GRect item_1_plus_button; @@ -47,7 +46,7 @@ static void scroll_up(ClickRecognizerRef recognizer, void *context) { // Move scroll bar GRect scroll_frame = layer_get_frame(s_scroll_bar_layer); int scroll_frame_y = scroll_frame.origin.y - scroll_frame.size.h; - if (scroll_frame_y < SCROLL_BAR_ORIGIN_HEIGHT) { + if ((scroll_frame_y < SCROLL_BAR_ORIGIN_HEIGHT) || (s_scroll_page == 0)) { scroll_frame_y = SCROLL_BAR_ORIGIN_HEIGHT; } scroll_frame.origin.y = scroll_frame_y; @@ -74,10 +73,12 @@ static void scroll_down(ClickRecognizerRef recognizer, void *context) { s_scroll_page = ((MAX_ITEMS / MAX_UI_ITEMS) - 1); } + APP_LOG(APP_LOG_LEVEL_DEBUG, "Page %d of %d", s_scroll_page, (s_scroll_items.page_count - 1)); + // Move scroll bar GRect scroll_frame = layer_get_frame(s_scroll_bar_layer); int scroll_frame_y = scroll_frame.origin.y + scroll_frame.size.h; - if (scroll_frame_y > (SCROLL_BAR_ORIGIN_HEIGHT_END - scroll_frame.size.h)) { + if ((scroll_frame_y > (SCROLL_BAR_ORIGIN_HEIGHT_END - scroll_frame.size.h)) || (s_scroll_page == (s_scroll_items.page_count - 1))) { scroll_frame_y = (SCROLL_BAR_ORIGIN_HEIGHT_END - scroll_frame.size.h); } scroll_frame.origin.y = scroll_frame_y; @@ -123,8 +124,22 @@ static void bar_draw(Layer *layer, GContext *ctx) { } static void scroll_bar_draw(Layer *layer, GContext *ctx) { - GRect bounds = gbitmap_get_bounds(s_scroll_bar_current_bitmap); - graphics_draw_bitmap_in_rect(ctx, s_scroll_bar_current_bitmap, GRect(0, 0, bounds.size.w, bounds.size.h)); + GRect bounds = layer_get_bounds(s_scroll_bar_layer); + + // TOP + GRect top_bounds = bounds; + top_bounds.size.h = 2; + graphics_draw_bitmap_in_rect(ctx, s_scroll_bar_top_bitmap, GRect(0, 0, top_bounds.size.w, top_bounds.size.h)); + + // MIDDLE + GRect middle_bounds = bounds; + middle_bounds.size.h -= 4; + graphics_draw_bitmap_in_rect(ctx, s_scroll_bar_middle_bitmap, GRect(0, 2, middle_bounds.size.w, middle_bounds.size.h)); + + // BOTTOM + GRect bottom_bounds = bounds; + bottom_bounds.size.h = 2; + graphics_draw_bitmap_in_rect(ctx, s_scroll_bar_bottom_bitmap, GRect(0, (bounds.size.h - 2), bottom_bounds.size.w, bottom_bounds.size.h)); } static void fill_percentage_buffer(scroll_items_t *items, int element, int total, float percentage) { @@ -243,26 +258,25 @@ void scroll_layer_remove_items() { void scroll_layer_update_scrollbar() { GRect scroll_box = layer_get_bounds(s_scroll_bar_layer); GRect scroll_frame = layer_get_frame(s_scroll_bar_layer); - - if (s_scroll_items.page_count == 2) { - scroll_box.size.h = 82; - scroll_frame.size.h = 82; - s_scroll_bar_current_bitmap = s_scroll_bar_half_bitmap; - } - else if (s_scroll_items.page_count == 3) { - scroll_box.size.h = 52; - scroll_frame.size.h = 52; - s_scroll_bar_current_bitmap = s_scroll_bar_third_bitmap; - } - else { - scroll_box.size.h = 160; - scroll_frame.size.h = 160; - s_scroll_bar_current_bitmap = s_scroll_bar_full_bitmap; - } - + scroll_box.size.h = SCROLL_BAR_HEAIGHT / s_scroll_items.page_count; + scroll_frame.size.h = SCROLL_BAR_HEAIGHT / s_scroll_items.page_count; layer_set_bounds(s_scroll_bar_layer, scroll_box); + + // Scroll position update + s_scroll_y = 0; + s_scroll_page = 0; + + // Move scroll bar + int scroll_frame_y = SCROLL_BAR_ORIGIN_HEIGHT; + scroll_frame.origin.y = scroll_frame_y; layer_set_frame(s_scroll_bar_layer, scroll_frame); layer_mark_dirty(s_scroll_bar_layer); + + scroll_layer_set_content_offset( + s_scroll_layer, + GPoint(0, -s_scroll_y), + true + ); } static void touch_update_element(scroll_items_t *items, int element, int *inc_value_ptr) { @@ -436,9 +450,9 @@ void scrolllayer_init(Layer *parent, Window *window) { s_minus_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_MINUS_BUTTON); s_background_plus_pressed_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BACKGROUND_PLUS_PRESSED); s_background_minus_pressed_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_BACKGROUND_MINUS_PRESSED); - s_scroll_bar_full_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_SCROLL_BAR_FULL); - s_scroll_bar_half_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_SCROLL_BAR_HALF); - s_scroll_bar_third_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_SCROLL_BAR_THIRD); + s_scroll_bar_top_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_SCROLL_BAR_TOP); + s_scroll_bar_middle_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_SCROLL_BAR_MIDDLE); + s_scroll_bar_bottom_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_SCROLL_BAR_BOTTOM); // Create ScrollLayer s_scroll_layer = scroll_layer_create(bounds); @@ -463,22 +477,8 @@ void scrolllayer_init(Layer *parent, Window *window) { // Add scroll bar GRect scroll_box = SCROLL_BAR_FRAME_RECT; - if (s_scroll_items.page_count == 2) { - scroll_box.size.h = 82; - s_scroll_bar_layer = layer_create(scroll_box); - s_scroll_bar_current_bitmap = s_scroll_bar_half_bitmap; - - } - else if (s_scroll_items.page_count == 3) { - scroll_box.size.h = 52; - s_scroll_bar_layer = layer_create(scroll_box); - s_scroll_bar_current_bitmap = s_scroll_bar_third_bitmap; - } - else { - scroll_box.size.h = 160; - s_scroll_bar_layer = layer_create(scroll_box); - s_scroll_bar_current_bitmap = s_scroll_bar_full_bitmap; - } + scroll_box.size.h = SCROLL_BAR_HEAIGHT / s_scroll_items.page_count; + s_scroll_bar_layer = layer_create(scroll_box); layer_set_update_proc(s_scroll_bar_layer, scroll_bar_draw); layer_add_child(parent, s_scroll_bar_layer); @@ -503,9 +503,9 @@ void scrolllayer_deinit() { gbitmap_destroy(s_minus_bitmap); gbitmap_destroy(s_background_plus_pressed_bitmap); gbitmap_destroy(s_background_minus_pressed_bitmap); - gbitmap_destroy(s_scroll_bar_full_bitmap); - gbitmap_destroy(s_scroll_bar_half_bitmap); - gbitmap_destroy(s_scroll_bar_third_bitmap); + gbitmap_destroy(s_scroll_bar_top_bitmap); + gbitmap_destroy(s_scroll_bar_middle_bitmap); + gbitmap_destroy(s_scroll_bar_bottom_bitmap); // Destroy scroll bar layer_destroy(s_scroll_bar_layer); diff --git a/src/c/scrolllayer.h b/src/c/scrolllayer.h index 3cd3148..17e933e 100644 --- a/src/c/scrolllayer.h +++ b/src/c/scrolllayer.h @@ -9,6 +9,7 @@ // SCROLLLAYER POSITION #define SCROLLLAYER_FRAME_RECT GRect(5, 30, 174, 168) #define SCROLL_BAR_FRAME_RECT GRect(180, 34, 10, 160) +#define SCROLL_BAR_HEAIGHT 160 #define SCROLL_BAR_ORIGIN_HEIGHT 34 #define SCROLL_BAR_ORIGIN_HEIGHT_END 34 + 160 #define PERCENTAGE_BAR_WIDTH 112 diff --git a/src/pkjs/config.js b/src/pkjs/config.js index 62760ed..a400dd7 100644 --- a/src/pkjs/config.js +++ b/src/pkjs/config.js @@ -5,7 +5,7 @@ module.exports = [ }, { "type": "text", - "defaultValue": "Add/remove/update up to 9 items. Name character limit is 40. If more than 10 characters, font goes smaller. If numbers go higher than 1000, use percentage." + "defaultValue": "Add/remove/update up to 24 items. Name character limit is 40. If more than 10 characters, font goes smaller. If numbers go higher than 1000, use percentage." }, {