diff --git a/main/gui.c b/main/gui.c index 4c6b3ef2..8e5efb60 100644 --- a/main/gui.c +++ b/main/gui.c @@ -1578,7 +1578,7 @@ static bool text_scroll_frame_callback(gui_view_node_t* node, void* extra_args) return true; } -void gui_set_text_scroll(gui_view_node_t* node, color_t background_color) +static void init_text_scroll(gui_view_node_t* node, color_t background_color) { JADE_ASSERT(node); JADE_ASSERT(node->kind == TEXT); @@ -1594,6 +1594,11 @@ void gui_set_text_scroll(gui_view_node_t* node, color_t background_color) scroll_data->selected_background_color = background_color; node->text->scroll = scroll_data; +} + +void gui_set_text_scroll(gui_view_node_t* node, color_t background_color) +{ + init_text_scroll(node, background_color); // now push this to the list of updatable elements so that it gets updated every frame push_updatable(node, text_scroll_frame_callback, NULL); @@ -1612,6 +1617,35 @@ void gui_set_text_scroll_selected( node->text->scroll->selected_background_color = selected_background_color; } +static void reset_text_scroll(gui_view_node_t* node) +{ + JADE_ASSERT(node); + JADE_ASSERT(node->kind == TEXT); + + if (node->text->scroll) { + node->text->scroll->prev_offset = 0; + node->text->scroll->offset = 0; + node->text->scroll->going_back = false; + node->text->scroll->wait = GUI_SCROLL_WAIT_END; + } +} + +static void set_status_bar_title_scroll(const bool scroll) +{ + JADE_ASSERT(status_bar.title); + JADE_ASSERT(status_bar.title->kind == TEXT); + + if (scroll && !status_bar.title->text->scroll) { + init_text_scroll(status_bar.title, TFT_BLACK); + } else if (!scroll && status_bar.title->text->scroll) { + free(status_bar.title->text->scroll); + status_bar.title->text->scroll = NULL; + } + + reset_text_scroll(status_bar.title); + status_bar.updated = true; +} + void gui_set_text_noise(gui_view_node_t* node, color_t background_color) { JADE_ASSERT(node); @@ -2348,6 +2382,11 @@ static bool update_status_bar(const bool force_redraw) status_bar.battery_update_counter--; + if (current_activity->status_bar_title_scroll && status_bar.title->text->scroll + && text_scroll_frame_callback(status_bar.title, NULL)) { + status_bar.updated = true; + } + if (status_bar.updated || force_redraw) { render_node(status_bar.root, status_bar_cs, 0); status_bar.updated = false; @@ -2406,6 +2445,7 @@ static size_t handle_gui_input_queue(bool* switched_activities) if (current_activity->status_bar) { const bool force_redraw = true; update_text_node_text(status_bar.title, current_activity->title ? current_activity->title : ""); + set_status_bar_title_scroll(current_activity->status_bar_title_scroll); update_status_bar(force_redraw); } @@ -2802,6 +2842,19 @@ void gui_set_activity_title(gui_activity_t* activity, const char* title) } } +void gui_set_activity_status_bar_title_scroll(gui_activity_t* activity, const bool scroll) +{ + JADE_ASSERT(activity); + JADE_ASSERT(activity->status_bar); + + JADE_SEMAPHORE_TAKE(gui_mutex); + activity->status_bar_title_scroll = scroll; + if (current_activity && activity == current_activity) { + set_status_bar_title_scroll(scroll); + } + JADE_SEMAPHORE_GIVE(gui_mutex); +} + gui_activity_t* gui_current_activity(void) { return current_activity; } #ifdef CONFIG_BOARD_TYPE_JADE_ANY diff --git a/main/gui.h b/main/gui.h index 96e4f662..1e55576a 100644 --- a/main/gui.h +++ b/main/gui.h @@ -339,6 +339,8 @@ struct __attribute__((__packed__)) gui_activity_t { // add the status bar on top of this activity (top 24px) bool status_bar; + // allow the status bar title to scroll when it does not fit + bool status_bar_title_scroll; // title shown in the status bar (if enabled) char* title; // should that cursor "wrap around" when you reach one end? @@ -478,6 +480,7 @@ void gui_activity_set_active_selection( gui_activity_t* activity, gui_view_node_t** nodes, size_t num_nodes, const bool* active, gui_view_node_t* selected); void gui_set_activity_title(gui_activity_t* activity, const char* title); +void gui_set_activity_status_bar_title_scroll(gui_activity_t* activity, bool scroll); gui_activity_t* gui_current_activity(void); gui_activity_t* gui_display_splash(void); diff --git a/main/ui/dashboard.c b/main/ui/dashboard.c index 6c30fd11..fcbdeefd 100644 --- a/main/ui/dashboard.c +++ b/main/ui/dashboard.c @@ -64,6 +64,7 @@ gui_activity_t* make_home_screen_activity(const char* device_name, const char* f gui_activity_t* act = NULL; gui_make_activity_ex(&act, true, device_name, false); JADE_ASSERT(act); + gui_set_activity_status_bar_title_scroll(act, true); gui_view_node_t* node; gui_view_node_t* hsplit;