Added concept of Background Screen that allows for construction of pages before knowing the final parent.

This will allow for easy creation of "pages" that can be layed out internally and passed to different screens and cleaned up when screens are cleaned up by the screen manager

add set width and height to base elements that allow for easy resizing

Create a settings page and make it red.
Test adding 2 tabs with the Page

this currently does not do anything fantastic on simulator but it sets a strong foundation for managing multiple pages
This commit is contained in:
Matthew Colvin 2023-09-22 19:59:24 -05:00
parent 7fd53ef2f8
commit 1cc65594a9
12 changed files with 103 additions and 28 deletions

View file

@ -12,6 +12,18 @@ void UIElement::AddElement(UIElement *anUIElement) {
bool UIElement::IsVisible() { return lv_obj_is_visible(mLvglSelf); } bool UIElement::IsVisible() { return lv_obj_is_visible(mLvglSelf); }
void UIElement::SetWidth(uint16_t aWidth) {
lv_obj_set_width(mLvglSelf, aWidth);
}
void UIElement::SetHeight(uint16_t aHeight) {
lv_obj_set_height(mLvglSelf, aHeight);
}
int16_t UIElement::GetHeight() { return lv_obj_get_height(mLvglSelf); };
int16_t UIElement::GetWidth() { return lv_obj_get_width(mLvglSelf); }
void UIElement::SetVisiblity(bool aVisible) { void UIElement::SetVisiblity(bool aVisible) {
if (aVisible == IsVisible()) { if (aVisible == IsVisible()) {
return; return;

View file

@ -16,6 +16,12 @@ public:
void SetVisiblity(bool aVisibility); void SetVisiblity(bool aVisibility);
bool IsVisible(); bool IsVisible();
virtual void SetWidth(uint16_t aWidth);
virtual void SetHeight(uint16_t aHeight);
int16_t GetWidth();
int16_t GetHeight();
virtual void AddElement(UIElement *anElement); virtual void AddElement(UIElement *anElement);
ID GetID() { return mId; }; ID GetID() { return mId; };

View file

@ -7,7 +7,8 @@ public:
static constexpr auto INVALID = 0; static constexpr auto INVALID = 0;
enum class Screens { enum class Screens {
Home = static_cast<int>(INVALID) + 1, Background = static_cast<int>(INVALID) + 1,
Home,
INVALID_SCREEN_ID INVALID_SCREEN_ID
}; };

View file

@ -1,10 +1,16 @@
#include "BackgroundScreen.hpp"
#include "PageBase.hpp" #include "PageBase.hpp"
using namespace UI::Page; using namespace UI::Page;
Base::Base(ID aID) : UIElement(lv_obj_create(nullptr), aID) {} Base::Base(ID aID)
: Base(lv_obj_create(Screen::BackgroundScreen::getLvInstance()), aID) {}
Base::Base(lv_obj_t *aLvglSelf, ID aID) : UIElement(aLvglSelf, aID) {} Base::Base(lv_obj_t *aLvglSelf, ID aID) : UIElement(aLvglSelf, aID) {
SetHeight(lv_pct(100));
SetWidth(lv_pct(100));
lv_obj_set_align(aLvglSelf, LV_ALIGN_CENTER);
}
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));

View file

@ -0,0 +1,7 @@
#include "SettingsPage.hpp"
using namespace UI::Page;
SettingsPage::SettingsPage() : Base(ID::Pages::Settings) {
SetBgColor(lv_color_make(255, 0, 0));
}

View file

@ -0,0 +1,8 @@
#include "PageBase.hpp"
namespace UI::Page {
class SettingsPage : public Base {
public:
SettingsPage();
};
} // namespace UI::Page

View file

@ -1,13 +1,19 @@
#include "BackgroundScreen.hpp"
#include "TabView.hpp" #include "TabView.hpp"
#include <string>
using namespace UI::Page; using namespace UI::Page;
TabView::TabView(ID aId) TabView::TabView(ID aId)
: Base(lv_tabview_create(nullptr, LV_DIR_TOP, 0), aId) {} : Base(lv_tabview_create(Screen::BackgroundScreen::getLvInstance(),
LV_DIR_TOP, 0),
aId) {}
void TabView::AddTab(Page::Base::Ptr aPage, std::string aTitle) {
auto tab = std::make_unique<Base>(
lv_tabview_add_tab(LvglSelf(), aTitle.c_str()), aPage->GetID());
void TabView::AddTab(Page::Base::Ptr aPage) {
auto tab = std::make_unique<Base>(lv_tabview_add_tab(LvglSelf(), "fake"),
aPage->GetID());
tab->AddElement(aPage.get()); tab->AddElement(aPage.get());
mTabs.push_back(std::move(tab)); mTabs.push_back(std::move(tab));
} }

View file

@ -5,7 +5,7 @@ namespace UI::Page {
class TabView : public Base { class TabView : public Base {
public: public:
TabView(ID aId); TabView(ID aId);
void AddTab(Page::Base::Ptr aPage); void AddTab(Page::Base::Ptr aPage, std::string aTitle);
protected: protected:
void OnShow() {} void OnShow() {}

View file

@ -0,0 +1,18 @@
#include "BackgroundScreen.hpp"
using namespace UI::Screen;
BackgroundScreen *BackgroundScreen::mInstance = nullptr;
BackgroundScreen *BackgroundScreen::GetInstance() {
if (!mInstance) {
mInstance = new BackgroundScreen();
}
return mInstance;
};
lv_obj_t *BackgroundScreen::getLvInstance() {
return GetInstance()->LvglSelf();
}
BackgroundScreen::BackgroundScreen() : Base(ID::Screens::Background) {}

View file

@ -0,0 +1,15 @@
#include "ScreenBase.hpp"
namespace UI::Screen {
/// @brief Due to the way LVGL utilizes screens we basically need a canvas to
/// create new pages on
/// by adding things to this screen and then moving them to their own page.
class BackgroundScreen : Base {
public:
static BackgroundScreen *GetInstance();
static lv_obj_t *getLvInstance();
private:
BackgroundScreen();
static BackgroundScreen *mInstance;
};
} // namespace UI::Screen

View file

@ -1,22 +1,21 @@
#include "HomeScreen.hpp" #include "HomeScreen.hpp"
#include "SettingsPage.hpp"
using namespace UI::Screen; using namespace UI::Screen;
HomeScreen::HomeScreen() HomeScreen::HomeScreen()
: Base(UI::ID::Screens::Home), mMyTabView(ID(ID::Pages::INVALID_PAGE_ID)), : Base(UI::ID::Screens::Home), mTabView(ID(ID::Pages::INVALID_PAGE_ID)) {
mTabView(nullptr) { SetBgColor(lv_color_black());
AddElement(&mMyTabView);
mMyTabView.SetBgColor(lv_color_black());
SetBgColor(lv_color_white());
SetPushAnimation(LV_SCR_LOAD_ANIM_FADE_IN); SetPushAnimation(LV_SCR_LOAD_ANIM_FADE_IN);
AddElement(&mTabView); // Adds Tabview to Homescreen
// Adds pages to the Tab view
mTabView.AddTab(std::make_unique<Page::SettingsPage>(), "Settings");
mTabView.AddTab(std::make_unique<Page::SettingsPage>(), "Settings1");
} }
// void HomeScreen::SetBgColor(lv_color_t value, lv_style_selector_t selector) { void HomeScreen::SetBgColor(lv_color_t value, lv_style_selector_t selector) {
// mTabView.SetBgColor(value, selector); mTabView.SetBgColor(value, selector);
// UI::UIElement::SetBgColor(value, selector); UI::UIElement::SetBgColor(value, selector);
// }
void HomeScreen::AddPage(Page::Base::Ptr aPage) {
// mTabView.AddElement(aPage.get());
mPages.push_back(std::move(aPage));
} }

View file

@ -2,21 +2,18 @@
#include "PageBase.hpp" #include "PageBase.hpp"
#include "ScreenBase.hpp" #include "ScreenBase.hpp"
#include "TabView.hpp" #include "TabView.hpp"
#include <string>
namespace UI::Screen { namespace UI::Screen {
class HomeScreen : public Base { class HomeScreen : public Base {
public: public:
HomeScreen(); HomeScreen();
// void SetBgColor(lv_color_t value, void SetBgColor(lv_color_t value,
// lv_style_selector_t selector = LV_PART_MAIN) override; lv_style_selector_t selector = LV_PART_MAIN) override;
void AddPage(Page::Base::Ptr aPage);
private: private:
Page::TabView mMyTabView; Page::TabView mTabView;
lv_obj_t *mTabView;
std::vector<Page::Base::Ptr> mPages;
}; };
} // namespace UI::Screen } // namespace UI::Screen