1
0
Fork 0
InfiniTime/src/displayapp/screens/List.cpp
Riku Isokoski 7c7a8602c4 screens: Remove displayapp parameter from screen
The DisplayApp class isn't used in the Screen base class and most
screens, so requiring it is pointless.

In this commit, DisplayApp pointers were added to screens which use it
and the explicit Screen constructor was removed in those screens.
2023-02-25 16:56:03 +02:00

85 lines
3.3 KiB
C++

#include "displayapp/screens/List.h"
#include "displayapp/DisplayApp.h"
#include "displayapp/screens/Symbols.h"
#include "displayapp/InfiniTimeTheme.h"
using namespace Pinetime::Applications::Screens;
namespace {
void ButtonEventHandler(lv_obj_t* obj, lv_event_t event) {
auto* screen = static_cast<List*>(obj->user_data);
screen->OnButtonEvent(obj, event);
}
}
List::List(uint8_t screenID,
uint8_t numScreens,
DisplayApp* app,
Controllers::Settings& settingsController,
std::array<Applications, MAXLISTITEMS>& applications)
: app {app}, settingsController {settingsController}, pageIndicator(screenID, numScreens) {
// Set the background to Black
lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(0, 0, 0));
settingsController.SetSettingsMenu(screenID);
pageIndicator.Create();
lv_obj_t* container = lv_cont_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_bg_opa(container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP);
static constexpr int innerPad = 4;
lv_obj_set_style_local_pad_inner(container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, innerPad);
lv_obj_set_style_local_border_width(container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 0);
lv_obj_set_pos(container, 0, 0);
lv_obj_set_width(container, LV_HOR_RES - 8);
lv_obj_set_height(container, LV_VER_RES);
lv_cont_set_layout(container, LV_LAYOUT_COLUMN_LEFT);
for (int i = 0; i < MAXLISTITEMS; i++) {
apps[i] = applications[i].application;
if (applications[i].application != Apps::None) {
static constexpr int btnHeight = (LV_HOR_RES_MAX - ((MAXLISTITEMS - 1) * innerPad)) / MAXLISTITEMS;
itemApps[i] = lv_btn_create(container, nullptr);
lv_obj_set_style_local_radius(itemApps[i], LV_BTN_PART_MAIN, LV_STATE_DEFAULT, btnHeight / 3);
lv_obj_set_style_local_bg_color(itemApps[i], LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Colors::bgAlt);
lv_obj_set_width(itemApps[i], LV_HOR_RES - 8);
lv_obj_set_height(itemApps[i], btnHeight);
lv_obj_set_event_cb(itemApps[i], ButtonEventHandler);
lv_btn_set_layout(itemApps[i], LV_LAYOUT_OFF);
itemApps[i]->user_data = this;
lv_obj_set_style_local_clip_corner(itemApps[i], LV_BTN_PART_MAIN, LV_STATE_DEFAULT, true);
lv_obj_t* icon = lv_label_create(itemApps[i], nullptr);
lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
lv_label_set_text_static(icon, applications[i].icon);
lv_label_set_long_mode(icon, LV_LABEL_LONG_CROP);
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
lv_obj_set_width(icon, btnHeight);
lv_obj_align(icon, nullptr, LV_ALIGN_IN_LEFT_MID, 0, 0);
lv_obj_t* text = lv_label_create(itemApps[i], nullptr);
lv_label_set_text_fmt(text, "%s", applications[i].name);
lv_obj_align(text, icon, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
}
}
}
List::~List() {
lv_obj_clean(lv_scr_act());
}
void List::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
if (event == LV_EVENT_CLICKED) {
for (int i = 0; i < MAXLISTITEMS; i++) {
if (apps[i] != Apps::None && object == itemApps[i]) {
app->StartApp(apps[i], DisplayApp::FullRefreshDirections::Up);
running = false;
return;
}
}
}
}