diff --git a/firmware/application/apps/ui_about_simple.cpp b/firmware/application/apps/ui_about_simple.cpp index 3d1e4c82..dd77cf47 100644 --- a/firmware/application/apps/ui_about_simple.cpp +++ b/firmware/application/apps/ui_about_simple.cpp @@ -1,5 +1,8 @@ #include "ui_about_simple.hpp" +#define ROLL_SPEED_FRAME_PER_LINE 60 +// cuz frame rate of pp screen is probably 60, scroll per sec + namespace ui { // TODO: Generate this automatically from github @@ -87,10 +90,42 @@ AboutView::AboutView(NavigationView& nav) { } } +void AboutView::on_frame_sync() { + if (interacted) return; + + if (frame_sync_count++ % ROLL_SPEED_FRAME_PER_LINE == 0) { + const auto current = menu_view.highlighted_index(); + const auto count = menu_view.item_count(); + + if (current < count - 1) { + menu_view.set_highlighted(current + 1); + } else { + menu_view.set_highlighted(0); + // ^ to go back to the REAL top instead of make the 2 at the top to make the title disappeares + menu_view.set_highlighted(2); // the first line that has human name + } + } +} + void AboutView::focus() { + button_ok.focus(); + menu_view.set_highlighted(2); // the first line that has human name +} + +bool AboutView::on_touch(const TouchEvent) { + interacted = true; + return false; +} + +bool AboutView::on_key(const KeyEvent) { + interacted = true; + return false; +} + +bool AboutView::on_encoder(const EncoderEvent) { + interacted = true; menu_view.focus(); - // put focus on last text line to make it more obvious that list is scrollable - menu_view.set_highlighted(10); + return false; } } /* namespace ui */ diff --git a/firmware/application/apps/ui_about_simple.hpp b/firmware/application/apps/ui_about_simple.hpp index f5e8488f..637a0312 100644 --- a/firmware/application/apps/ui_about_simple.hpp +++ b/firmware/application/apps/ui_about_simple.hpp @@ -14,6 +14,13 @@ class AboutView : public View { std::string title() const override { return "About"; }; private: + virtual bool on_key(const KeyEvent event); + virtual bool on_encoder(const EncoderEvent event); + virtual bool on_touch(const TouchEvent event); + + bool interacted{false}; + uint16_t frame_sync_count{0}; + void on_frame_sync(); MenuView menu_view{ {0, 0, 240, 264}, true}; @@ -22,6 +29,12 @@ class AboutView : public View { {240 / 3, 270, 240 / 3, 24}, "OK", }; + + MessageHandlerRegistration message_handler_frame_sync{ + Message::ID::DisplayFrameSync, + [this](const Message* const) { + this->on_frame_sync(); + }}; }; } // namespace ui diff --git a/firmware/tools/generate_ui-about-simple.cpp.py b/firmware/tools/generate_ui-about-simple.cpp.py index 3b920c06..846af10e 100644 --- a/firmware/tools/generate_ui-about-simple.cpp.py +++ b/firmware/tools/generate_ui-about-simple.cpp.py @@ -27,6 +27,9 @@ import sys cppheader = """#include "ui_about_simple.hpp" +#define ROLL_SPEED_FRAME_PER_LINE 60 +// cuz frame rate of pp screen is probably 60, scroll per sec + namespace ui { // Information: a line starting with a '#' will be yellow coloured @@ -69,10 +72,42 @@ AboutView::AboutView(NavigationView& nav) { } } +void AboutView::on_frame_sync() { + if (interacted) return; + + if (frame_sync_count++ % ROLL_SPEED_FRAME_PER_LINE == 0) { + const auto current = menu_view.highlighted_index(); + const auto count = menu_view.item_count(); + + if (current < count - 1) { + menu_view.set_highlighted(current + 1); + } else { + menu_view.set_highlighted(0); + // ^ to go back to the REAL top instead of make the 2 at the top to make the title disappeares + menu_view.set_highlighted(2); // the first line that has human name + } + } +} + void AboutView::focus() { + button_ok.focus(); + menu_view.set_highlighted(2); // the first line that has human name +} + +bool AboutView::on_touch(const TouchEvent) { + interacted = true; + return false; +} + +bool AboutView::on_key(const KeyEvent) { + interacted = true; + return false; +} + +bool AboutView::on_encoder(const EncoderEvent) { + interacted = true; menu_view.focus(); - // put focus on last text line to make it more obvious that list is scrollable - menu_view.set_highlighted(10); + return false; } } /* namespace ui */