Add visiblity API for UIElements

Add ability for Screen Manager to display screens
and retain others underneath in a stack fasion.
This commit is contained in:
MatthewColvin 2023-09-16 21:43:07 -05:00
parent 52cb2e7ce2
commit dfbfd7a6a8
9 changed files with 88 additions and 12 deletions

View file

@ -8,6 +8,13 @@ Manager &Manager::getInstance() { return mManager; }
Manager::Manager() {} Manager::Manager() {}
void Manager::pushScreen(std::unique_ptr<UI::Screen::Base> aPage) { void Manager::pushScreen(Screen::Base::Ptr aScreen,
pages.push(std::move(aPage)); lv_scr_load_anim_t aPushAnimation) {
aScreen->SetPushAnimation(aPushAnimation);
pushScreen(std::move(aScreen));
}
void Manager::pushScreen(Screen::Base::Ptr aScreen) {
mScreens.push(std::move(aScreen));
mScreens.top()->Show();
} }

View file

@ -1,3 +1,5 @@
#pragma once
#include "ScreenBase.hpp" #include "ScreenBase.hpp"
#include <memory> #include <memory>
#include <stack> #include <stack>
@ -8,13 +10,14 @@ class Manager {
public: public:
static Manager &getInstance(); static Manager &getInstance();
void pushScreen(std::unique_ptr<UI::Screen::Base> aPage); void pushScreen(Screen::Base::Ptr aScreen);
void pushScreen(Screen::Base::Ptr aScreen, lv_scr_load_anim_t aPushAnimation);
private: private:
Manager(); Manager();
static Manager mManager; static Manager mManager;
std::stack<std::unique_ptr<UI::Screen::Base>> pages; std::stack<Screen::Base::Ptr> mScreens;
}; };
} // namespace UI::Screen } // namespace UI::Screen

View file

@ -6,8 +6,31 @@ UIElement::UIElement(lv_obj_t *aLvglSelf, ID aId)
mLvglSelf->user_data = this; mLvglSelf->user_data = this;
} }
UIElement::SetBgColor(lv_color_t aColor, lv_style_selector_t aStyle) { bool UIElement::IsVisible() { return lv_obj_is_visible(mLvglSelf); }
void UIElement::SetVisiblity(bool aVisible) {
if (aVisible == IsVisible()) {
return;
}
if (aVisible) {
Show();
} else {
Hide();
}
}
void UIElement::SetBgColor(lv_color_t aColor, lv_style_selector_t aStyle) {
lv_obj_set_style_bg_color(mLvglSelf, aColor, aStyle); lv_obj_set_style_bg_color(mLvglSelf, aColor, aStyle);
}; };
void UIElement::Show() {
lv_obj_clear_flag(mLvglSelf, LV_OBJ_FLAG_HIDDEN);
OnShow();
}
void UIElement::Hide() {
lv_obj_add_flag(mLvglSelf, LV_OBJ_FLAG_HIDDEN);
OnHide();
}
} // namespace UI } // namespace UI

View file

@ -10,9 +10,29 @@ class UIElement {
public: public:
UIElement(lv_obj_t *aLvglSelf, const ID aId = ID()); UIElement(lv_obj_t *aLvglSelf, const ID aId = ID());
SetBgColor(lv_color_t value, lv_style_selector_t selector = LV_PART_MAIN); void SetBgColor(lv_color_t value,
lv_style_selector_t selector = LV_PART_MAIN);
void SetVisiblity(bool aVisibility);
bool IsVisible();
lv_obj_t *operator()() { return mLvglSelf; }
protected: protected:
/// @brief get Lvgl object refernce to use in LVGL APIs
/// @return lvgl object a
lv_obj_t *LvglSelf() { return mLvglSelf; }
/// @brief Show Element
virtual void Show();
/// @brief Hide Element
virtual void Hide();
/// @brief Override in child class to run something after element is shown
virtual void OnShow() = 0;
/// @brief Override in child class to run something after element is hidden
virtual void OnHide() = 0;
private:
lv_obj_t *mLvglSelf; lv_obj_t *mLvglSelf;
const ID mId; const ID mId;
}; };

View file

@ -3,6 +3,6 @@
using namespace UI::Screen; using namespace UI::Screen;
HomeScreen::HomeScreen() : Base(UI::ID::Screens::Home) { HomeScreen::HomeScreen() : Base(UI::ID::Screens::Home) {
SetBgColor(lv_color_white());
SetPushAnimation(LV_SCR_LOAD_ANIM_FADE_IN);
} }

View file

@ -7,3 +7,12 @@ Base::Base(ID aId) : UIElement(lv_obj_create(NULL), aId) {}
void Base::AddWidget(Widget::Base::Ptr aWidget) { void Base::AddWidget(Widget::Base::Ptr aWidget) {
mWidgets.push_back(std::move(aWidget)); mWidgets.push_back(std::move(aWidget));
} }
void Base::Show() {
lv_scr_load_anim(LvglSelf(), mPushAnimation, 1000, 1000, false);
UIElement::Show();
}
void Base::SetPushAnimation(lv_scr_load_anim_t aShowAnimation) {
mPushAnimation = aShowAnimation;
}

View file

@ -7,17 +7,27 @@
#include <vector> #include <vector>
namespace UI::Screen { namespace UI::Screen {
class Manager;
class Base : public UIElement {
friend Manager;
class Base : UIElement {
public: public:
typedef std::unique_ptr<Base> Ptr; typedef std::unique_ptr<Base> Ptr;
Base(ID aId); Base(ID aId);
void AddWidget(Widget::Base::Ptr aWidget); void AddWidget(Widget::Base::Ptr aWidget);
void SetPushAnimation(lv_scr_load_anim_t aPushAnimation);
protected:
void Show() override;
void OnShow() override{};
void OnHide() override{};
private: private:
std::vector<Widget::Base::Ptr> mWidgets; std::vector<Widget::Base::Ptr> mWidgets;
lv_scr_load_anim_t mPushAnimation = LV_SCR_LOAD_ANIM_NONE;
}; };
} // namespace UI::Screen } // namespace UI::Screen

View file

@ -10,6 +10,10 @@ public:
Base(lv_obj_t *aLvglSelf); Base(lv_obj_t *aLvglSelf);
protected:
void OnShow() override{};
void OnHide() override{};
private: private:
}; };

View file

@ -1,10 +1,10 @@
// OMOTE firmware for ESP32 // OMOTE firmware for ESP32
// 2023 Maximilian Kern // 2023 Maximilian Kern
#include <lvgl.h>
#include "HardwareRevX.hpp" #include "HardwareRevX.hpp"
#include "OmoteUI.hpp" #include "OmoteUI.hpp"
#include "omoteconfig.h" #include "omoteconfig.h"
#include <lvgl.h>
std::shared_ptr<HardwareRevX> hal = nullptr; std::shared_ptr<HardwareRevX> hal = nullptr;
@ -12,7 +12,7 @@ void setup() {
hal = HardwareRevX::getInstance(); hal = HardwareRevX::getInstance();
hal->init(); hal->init();
auto ui = OmoteUI::getInstance(hal); auto ui = UI::Basic::OmoteUI::getInstance(hal);
ui->layout_UI(); ui->layout_UI();
lv_timer_handler(); // Run the LVGL UI once before the loop takes over lv_timer_handler(); // Run the LVGL UI once before the loop takes over
@ -20,5 +20,5 @@ void setup() {
void loop() { void loop() {
HardwareRevX::getInstance()->loopHandler(); HardwareRevX::getInstance()->loopHandler();
OmoteUI::getInstance()->loopHandler(); UI::Basic::OmoteUI::getInstance()->loopHandler();
} }