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.
85 lines
3.3 KiB
C++
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;
|
|
}
|
|
}
|
|
}
|
|
}
|