/* * Copyright 2023 jacqueline * * SPDX-License-Identifier: GPL-3.0-only */ #include "widget_top_bar.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 "ui_events.hpp" #include "ui_fsm.hpp" #include "widgets/lv_img.h" #include "widgets/lv_label.h" #include "themes.hpp" LV_IMG_DECLARE(battery_empty); LV_IMG_DECLARE(battery_20); LV_IMG_DECLARE(battery_40); LV_IMG_DECLARE(battery_60); LV_IMG_DECLARE(battery_80); LV_IMG_DECLARE(battery_full); namespace ui { namespace widgets { static void back_click_cb(lv_event_t* ev) { events::Ui().Dispatch(internal::BackPressed{}); } TopBar::TopBar(lv_obj_t* parent, const Configuration& config) { container_ = lv_obj_create(parent); lv_obj_set_size(container_, lv_pct(100), 18); lv_obj_set_flex_flow(container_, LV_FLEX_FLOW_ROW); lv_obj_set_flex_align(container_, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_END); themes::Theme::instance()->ApplyStyle(container_, themes::Style::kTopBar); if (config.show_back_button) { back_button_ = lv_btn_create(container_); lv_obj_set_size(back_button_, LV_SIZE_CONTENT, LV_SIZE_CONTENT); lv_obj_t* button_icon = lv_label_create(back_button_); lv_label_set_text(button_icon, ""); lv_obj_set_style_text_font(button_icon, &font_symbols, 0); lv_obj_add_event_cb(back_button_, back_click_cb, LV_EVENT_CLICKED, NULL); } else { back_button_ = nullptr; } title_ = lv_label_create(container_); lv_label_set_text(title_, config.title.c_str()); lv_obj_set_flex_grow(title_, 1); playback_ = lv_label_create(container_); lv_label_set_text(playback_, ""); battery_ = lv_img_create(container_); } auto TopBar::Update(const State& state) -> void { switch (state.playback_state) { case PlaybackState::kIdle: lv_label_set_text(playback_, "-"); break; case PlaybackState::kPaused: lv_label_set_text(playback_, LV_SYMBOL_PAUSE); break; case PlaybackState::kPlaying: lv_label_set_text(playback_, LV_SYMBOL_PLAY); break; } if (state.battery_percent >= 95) { lv_img_set_src(battery_, &battery_full); } else if (state.battery_percent >= 75) { lv_img_set_src(battery_, &battery_80); lv_label_set_text(battery_, ">70"); } else if (state.battery_percent >= 55) { lv_img_set_src(battery_, &battery_60); lv_label_set_text(battery_, ">40"); } else if (state.battery_percent >= 35) { lv_img_set_src(battery_, &battery_40); } else if (state.battery_percent >= 15) { lv_img_set_src(battery_, &battery_20); } else { lv_img_set_src(battery_, &battery_empty); } } } // namespace widgets } // namespace ui