diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-09-28 10:43:48 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-09-28 10:43:48 +1000 |
| commit | 6a47edcd35884095946f761fa3aa2367c7c26442 (patch) | |
| tree | 5b34e1bf14759dcc78b6611b1b6538dc03119860 /src/ui/widget_top_bar.cpp | |
| parent | f09ba5ffd53bf7d28e0dc516c00a8f69ca7efae9 (diff) | |
| download | tangara-fw-6a47edcd35884095946f761fa3aa2367c7c26442.tar.gz | |
Use databinding for the top bar. It's so nice now!
Diffstat (limited to 'src/ui/widget_top_bar.cpp')
| -rw-r--r-- | src/ui/widget_top_bar.cpp | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/src/ui/widget_top_bar.cpp b/src/ui/widget_top_bar.cpp index c38f4fe2..ba9ee5cb 100644 --- a/src/ui/widget_top_bar.cpp +++ b/src/ui/widget_top_bar.cpp @@ -5,13 +5,16 @@ */ #include "widget_top_bar.hpp" +#include "battery.hpp" #include "core/lv_group.h" #include "core/lv_obj.h" #include "event_queue.hpp" #include "extra/layouts/flex/lv_flex.h" #include "font/lv_symbol_def.h" #include "font_symbols.hpp" +#include "model_top_bar.hpp" #include "themes.hpp" +#include "track.hpp" #include "ui_events.hpp" #include "ui_fsm.hpp" #include "widgets/lv_img.h" @@ -34,7 +37,9 @@ static void back_click_cb(lv_event_t* ev) { events::Ui().Dispatch(internal::BackPressed{}); } -TopBar::TopBar(lv_obj_t* parent, const Configuration& config) { +TopBar::TopBar(lv_obj_t* parent, + const Configuration& config, + models::TopBar& model) { container_ = lv_obj_create(parent); lv_obj_set_size(container_, lv_pct(100), 20); lv_obj_set_flex_flow(container_, LV_FLEX_FLOW_ROW); @@ -54,49 +59,51 @@ TopBar::TopBar(lv_obj_t* parent, const Configuration& config) { back_button_ = nullptr; } - title_ = lv_label_create(container_); + lv_obj_t* title_ = lv_label_create(container_); lv_label_set_text(title_, config.title.c_str()); lv_obj_set_flex_grow(title_, 1); - playback_ = lv_img_create(container_); - battery_ = lv_img_create(container_); - charging_ = lv_label_create(container_); + lv_obj_t* playback = lv_img_create(container_); - themes::Theme::instance()->ApplyStyle(container_, themes::Style::kTopBar); -} + bindings_.push_back(model.is_playing.onChangedAndNow([=](bool is_playing) { + lv_img_set_src(playback, is_playing ? &kIconPlay : &kIconPause); + })); + bindings_.push_back(model.current_track.onChangedAndNow( + [=](const std::optional<database::TrackId>& id) { + if (id) { + lv_obj_clear_flag(playback, LV_OBJ_FLAG_HIDDEN); + } else { + lv_obj_add_flag(playback, LV_OBJ_FLAG_HIDDEN); + } + })); -auto TopBar::Update(const State& state) -> void { - switch (state.playback_state) { - case PlaybackState::kIdle: - lv_img_set_src(playback_, NULL); - break; - case PlaybackState::kPaused: - lv_img_set_src(playback_, &kIconPause); - break; - case PlaybackState::kPlaying: - lv_img_set_src(playback_, &kIconPlay); - break; - } + lv_obj_t* battery = lv_img_create(container_); + lv_obj_t* charging = lv_label_create(container_); - if (state.is_charging) { - lv_label_set_text(charging_, "+"); - } else { - lv_label_set_text(charging_, ""); - } + bindings_.push_back(model.battery_state.onChangedAndNow( + [=](const battery::Battery::BatteryState& state) { + if (state.is_charging) { + lv_label_set_text(charging, "+"); + } else { + lv_label_set_text(charging, ""); + } - if (state.battery_percent >= 95) { - lv_img_set_src(battery_, &kIconBatteryFull); - } else if (state.battery_percent >= 75) { - lv_img_set_src(battery_, &kIconBattery80); - } else if (state.battery_percent >= 55) { - lv_img_set_src(battery_, &kIconBattery60); - } else if (state.battery_percent >= 35) { - lv_img_set_src(battery_, &kIconBattery40); - } else if (state.battery_percent >= 15) { - lv_img_set_src(battery_, &kIconBattery20); - } else { - lv_img_set_src(battery_, &kIconBatteryEmpty); - } + if (state.percent >= 95) { + lv_img_set_src(battery, &kIconBatteryFull); + } else if (state.percent >= 75) { + lv_img_set_src(battery, &kIconBattery80); + } else if (state.percent >= 55) { + lv_img_set_src(battery, &kIconBattery60); + } else if (state.percent >= 35) { + lv_img_set_src(battery, &kIconBattery40); + } else if (state.percent >= 15) { + lv_img_set_src(battery, &kIconBattery20); + } else { + lv_img_set_src(battery, &kIconBatteryEmpty); + } + })); + + themes::Theme::instance()->ApplyStyle(container_, themes::Style::kTopBar); } } // namespace widgets |
