From 6a47edcd35884095946f761fa3aa2367c7c26442 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 28 Sep 2023 10:43:48 +1000 Subject: Use databinding for the top bar. It's so nice now! --- src/ui/include/model_top_bar.hpp | 26 ++++++++++++++++++++++++++ src/ui/include/screen.hpp | 12 +++++++----- src/ui/include/screen_menu.hpp | 3 ++- src/ui/include/screen_playing.hpp | 4 +++- src/ui/include/screen_settings.hpp | 19 +++++++++++-------- src/ui/include/screen_track_browser.hpp | 2 ++ src/ui/include/ui_fsm.hpp | 5 ++--- src/ui/include/widget_top_bar.hpp | 27 +++++++-------------------- 8 files changed, 60 insertions(+), 38 deletions(-) create mode 100644 src/ui/include/model_top_bar.hpp (limited to 'src/ui/include') diff --git a/src/ui/include/model_top_bar.hpp b/src/ui/include/model_top_bar.hpp new file mode 100644 index 00000000..c0f148f3 --- /dev/null +++ b/src/ui/include/model_top_bar.hpp @@ -0,0 +1,26 @@ +/* + * Copyright 2023 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#pragma once + +#include "battery.hpp" +#include "bindey/property.h" + +#include "track.hpp" + +namespace ui { +namespace models { + +struct TopBar { + bindey::property battery_state; + + // Shared with the Playback model + bindey::property& is_playing; + bindey::property>& current_track; +}; + +} // namespace models +} // namespace ui diff --git a/src/ui/include/screen.hpp b/src/ui/include/screen.hpp index ac7b19f8..e9eaeeb0 100644 --- a/src/ui/include/screen.hpp +++ b/src/ui/include/screen.hpp @@ -16,6 +16,7 @@ #include "core/lv_obj_tree.h" #include "event_binding.hpp" #include "lvgl.h" +#include "model_top_bar.hpp" #include "nod/nod.hpp" #include "widget_top_bar.hpp" @@ -37,8 +38,6 @@ class Screen { */ virtual auto Tick() -> void {} - auto UpdateTopBar(const widgets::TopBar::State& state) -> void; - auto root() -> lv_obj_t* { return root_; } auto content() -> lv_obj_t* { return content_; } @@ -52,8 +51,9 @@ class Screen { } protected: - auto CreateTopBar(lv_obj_t* parent, const widgets::TopBar::Configuration&) - -> widgets::TopBar*; + auto CreateTopBar(lv_obj_t* parent, + const widgets::TopBar::Configuration&, + models::TopBar& model) -> widgets::TopBar*; std::pmr::vector data_bindings_; std::pmr::vector> event_bindings_; @@ -78,7 +78,9 @@ class Screen { class MenuScreen : public Screen { public: - MenuScreen(const std::pmr::string& title, bool show_back_button = true); + MenuScreen(models::TopBar&, + const std::pmr::string& title, + bool show_back_button = true); }; } // namespace ui diff --git a/src/ui/include/screen_menu.hpp b/src/ui/include/screen_menu.hpp index be2a9493..a83346f6 100644 --- a/src/ui/include/screen_menu.hpp +++ b/src/ui/include/screen_menu.hpp @@ -12,6 +12,7 @@ #include "index.hpp" #include "lvgl.h" +#include "model_top_bar.hpp" #include "screen.hpp" #include "screen_settings.hpp" @@ -20,7 +21,7 @@ namespace screens { class Menu : public MenuScreen { public: - explicit Menu(std::vector indexes); + explicit Menu(models::TopBar&, std::vector indexes); ~Menu(); private: diff --git a/src/ui/include/screen_playing.hpp b/src/ui/include/screen_playing.hpp index fff9cc35..185c55cc 100644 --- a/src/ui/include/screen_playing.hpp +++ b/src/ui/include/screen_playing.hpp @@ -18,6 +18,7 @@ #include "database.hpp" #include "future_fetcher.hpp" #include "model_playback.hpp" +#include "model_top_bar.hpp" #include "screen.hpp" #include "track.hpp" #include "track_queue.hpp" @@ -31,7 +32,8 @@ namespace screens { */ class Playing : public Screen { public: - explicit Playing(models::Playback& playback_model, + explicit Playing(models::TopBar&, + models::Playback& playback_model, std::weak_ptr db, audio::TrackQueue& queue); ~Playing(); diff --git a/src/ui/include/screen_settings.hpp b/src/ui/include/screen_settings.hpp index 4e1936a2..1a4672ed 100644 --- a/src/ui/include/screen_settings.hpp +++ b/src/ui/include/screen_settings.hpp @@ -18,6 +18,7 @@ #include "index.hpp" #include "lvgl.h" +#include "model_top_bar.hpp" #include "nvs.hpp" #include "screen.hpp" @@ -26,12 +27,12 @@ namespace screens { class Settings : public MenuScreen { public: - Settings(); + Settings(models::TopBar&); }; class Bluetooth : public MenuScreen { public: - Bluetooth(drivers::Bluetooth& bt, drivers::NvsStorage& nvs); + Bluetooth(models::TopBar&, drivers::Bluetooth& bt, drivers::NvsStorage& nvs); auto ChangeEnabledState(bool enabled) -> void; auto RefreshDevicesList() -> void; @@ -53,7 +54,7 @@ class Bluetooth : public MenuScreen { class Headphones : public MenuScreen { public: - Headphones(drivers::NvsStorage& nvs); + Headphones(models::TopBar&, drivers::NvsStorage& nvs); auto ChangeMaxVolume(uint8_t index) -> void; auto ChangeCustomVolume(int8_t diff) -> void; @@ -71,7 +72,9 @@ class Headphones : public MenuScreen { class Appearance : public MenuScreen { public: - Appearance(drivers::NvsStorage& nvs, drivers::Display& display); + Appearance(models::TopBar&, + drivers::NvsStorage& nvs, + drivers::Display& display); auto ChangeBrightness(uint_fast8_t) -> void; auto CommitBrightness() -> void; @@ -86,22 +89,22 @@ class Appearance : public MenuScreen { class InputMethod : public MenuScreen { public: - InputMethod(); + InputMethod(models::TopBar&); }; class Storage : public MenuScreen { public: - Storage(); + Storage(models::TopBar&); }; class FirmwareUpdate : public MenuScreen { public: - FirmwareUpdate(); + FirmwareUpdate(models::TopBar&); }; class About : public MenuScreen { public: - About(); + About(models::TopBar&); }; } // namespace screens diff --git a/src/ui/include/screen_track_browser.hpp b/src/ui/include/screen_track_browser.hpp index fdeb3afe..719306f0 100644 --- a/src/ui/include/screen_track_browser.hpp +++ b/src/ui/include/screen_track_browser.hpp @@ -14,6 +14,7 @@ #include "lvgl.h" #include "database.hpp" +#include "model_top_bar.hpp" #include "screen.hpp" namespace ui { @@ -22,6 +23,7 @@ namespace screens { class TrackBrowser : public Screen { public: TrackBrowser( + models::TopBar&, std::weak_ptr db, const std::pmr::string& title, std::future*>&& initial_page); diff --git a/src/ui/include/ui_fsm.hpp b/src/ui/include/ui_fsm.hpp index cb3e651c..24f0c270 100644 --- a/src/ui/include/ui_fsm.hpp +++ b/src/ui/include/ui_fsm.hpp @@ -17,6 +17,7 @@ #include "gpios.hpp" #include "lvgl_task.hpp" #include "model_playback.hpp" +#include "model_top_bar.hpp" #include "nvs.hpp" #include "relative_wheel.hpp" #include "screen_playing.hpp" @@ -82,7 +83,6 @@ class UiState : public tinyfsm::Fsm { protected: void PushScreen(std::shared_ptr); void PopScreen(); - void UpdateTopBar(); static std::unique_ptr sTask; static std::shared_ptr sServices; @@ -94,8 +94,7 @@ class UiState : public tinyfsm::Fsm { static std::shared_ptr sCurrentModal; static models::Playback sPlaybackModel; - - static bindey::property sPropBatteryState; + static models::TopBar sTopBarModel; }; namespace states { diff --git a/src/ui/include/widget_top_bar.hpp b/src/ui/include/widget_top_bar.hpp index 1a2c826a..b240188c 100644 --- a/src/ui/include/widget_top_bar.hpp +++ b/src/ui/include/widget_top_bar.hpp @@ -9,9 +9,11 @@ #include #include +#include "bindey/binding.h" #include "lvgl.h" #include "memory_resource.hpp" +#include "model_top_bar.hpp" namespace ui { @@ -24,33 +26,18 @@ class TopBar { std::pmr::string title; }; - enum class PlaybackState { - kIdle, - kPaused, - kPlaying, - }; - - struct State { - PlaybackState playback_state; - uint_fast8_t battery_percent; - bool is_charging; - }; - - explicit TopBar(lv_obj_t* parent, const Configuration& config); + explicit TopBar(lv_obj_t* parent, + const Configuration& config, + models::TopBar& model); auto root() -> lv_obj_t* { return container_; } auto button() -> lv_obj_t* { return back_button_; } - auto Update(const State&) -> void; - private: - lv_obj_t* container_; + std::vector bindings_; + lv_obj_t* container_; lv_obj_t* back_button_; - lv_obj_t* title_; - lv_obj_t* playback_; - lv_obj_t* battery_; - lv_obj_t* charging_; }; } // namespace widgets -- cgit v1.2.3