diff --git a/design/Percentage.pxo b/design/Percentage.pxo index c80ca40..13d6f80 100644 Binary files a/design/Percentage.pxo and b/design/Percentage.pxo differ 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 0000000..fe78875 Binary files /dev/null and b/resources/images/scroll_bar_bottom.png differ diff --git a/resources/images/scroll_bar_full.png b/resources/images/scroll_bar_full.png deleted file mode 100644 index 8d12363..0000000 Binary files a/resources/images/scroll_bar_full.png and /dev/null differ diff --git a/resources/images/scroll_bar_half.png b/resources/images/scroll_bar_half.png deleted file mode 100644 index 0431b40..0000000 Binary files a/resources/images/scroll_bar_half.png and /dev/null differ diff --git a/resources/images/scroll_bar_middle.png b/resources/images/scroll_bar_middle.png new file mode 100644 index 0000000..1036cbe Binary files /dev/null and b/resources/images/scroll_bar_middle.png differ diff --git a/resources/images/scroll_bar_third.png b/resources/images/scroll_bar_third.png deleted file mode 100644 index 2b6dbb9..0000000 Binary files a/resources/images/scroll_bar_third.png and /dev/null differ diff --git a/resources/images/scroll_bar_top.png b/resources/images/scroll_bar_top.png new file mode 100644 index 0000000..84a30cf Binary files /dev/null and b/resources/images/scroll_bar_top.png differ diff --git a/screenshots/icon_big.png b/screenshots/icon_big.png new file mode 100644 index 0000000..c96bc28 Binary files /dev/null and b/screenshots/icon_big.png differ diff --git a/screenshots/icon_small.png b/screenshots/icon_small.png new file mode 100644 index 0000000..0e49bfc Binary files /dev/null and b/screenshots/icon_small.png differ 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." }, {