Skip to content

Commit

Permalink
Create Base Implementation of OnShow and OnHide that notify all owned…
Browse files Browse the repository at this point in the history
… elements of their shown status

Update OnShow and OnHide to be aware of current set visibility.
  • Loading branch information
MatthewColvin committed Oct 12, 2023
1 parent 7d68cce commit c7f9482
Show file tree
Hide file tree
Showing 11 changed files with 99 additions and 81 deletions.
13 changes: 3 additions & 10 deletions Platformio/OmoteUI/UIs/BasicRefactored/page/DisplaySettings.cpp
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
#include "BrightnessSlider.hpp"
#include "DisplaySettings.hpp"
#include "BrightnessSlider.hpp"

using namespace UI::Page;

DisplaySettings::DisplaySettings(std::shared_ptr<DisplayAbstract> aDisplay)
: Base(UI::ID::Pages::DisplaySettings), mDisplay(aDisplay),
mBrightnessSlider(AddElement<Widget::BrightnessSlider>(std::make_unique<Widget::BrightnessSlider>(mDisplay))) {
mBrightnessSlider(AddElement<Widget::BrightnessSlider>(
std::make_unique<Widget::BrightnessSlider>(mDisplay))) {
SetBgColor(Color::GREY);

mBrightnessSlider->SetWidth(GetContentWidth());
mBrightnessSlider->SetHeight(80);
mBrightnessSlider->AlignTo(this, LV_ALIGN_TOP_MID);
}

void DisplaySettings::OnShow() {

};

void DisplaySettings::OnHide(){

};
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ class DisplaySettings : public Base {
public:
DisplaySettings(std::shared_ptr<DisplayAbstract> aDisplay);

void OnShow() override;
void OnHide() override;

std::string GetTitle() override { return "Display Settings"; };

private:
Expand Down
2 changes: 0 additions & 2 deletions Platformio/OmoteUI/UIs/BasicRefactored/screen/HomeScreen.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ class HomeScreen : public Base {
lv_style_selector_t selector = LV_PART_MAIN) override;

protected:
void OnShow() override{};
void OnHide() override{};
bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) override;

private:
Expand Down
12 changes: 12 additions & 0 deletions Platformio/OmoteUI/UIs/BasicRefactored/widget/BrightnessSlider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ BrightnessSlider::BrightnessSlider(std::shared_ptr<DisplayAbstract> aDisplay)
mLabel->AlignTo(this, LV_ALIGN_TOP_MID);
mSlider->AlignTo(mLabel, LV_ALIGN_OUT_BOTTOM_MID);
mSlider->SetWidth(GetContentWidth() - GetContentWidth() * 0.25f);
SetVisiblity(false);
}

void BrightnessSlider::OnShow() {
mSlider->SetValue(mDisplay->getBrightness());
Base::OnShow();
}

void BrightnessSlider::SetHeight(lv_coord_t aHeight) {
Expand All @@ -30,4 +32,14 @@ void BrightnessSlider::SetHeight(lv_coord_t aHeight) {
mLabel->AlignTo(this, LV_ALIGN_TOP_MID);
mSlider->AlignTo(mLabel, LV_ALIGN_OUT_BOTTOM_MID, 0,
mLabel->GetContentHeight());
}

bool BrightnessSlider::OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) {
using ID = KeyPressAbstract::KeyId;
using Type = KeyPressAbstract::KeyEvent::Type;
if (aKeyEvent.mId == ID::Aux1 && aKeyEvent.mType == Type::Press) {
SetVisiblity(!IsSetVisible());
return true;
}
return false;
}
24 changes: 14 additions & 10 deletions Platformio/OmoteUI/UIs/BasicRefactored/widget/BrightnessSlider.hpp
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
#pragma once
#include "WidgetBase.hpp"
#include "DisplayAbstract.h"
#include "WidgetBase.hpp"

namespace UI::Widget{
namespace UI::Widget {
class Slider;
class Label;

class BrightnessSlider : public Base{
class BrightnessSlider : public Base {
public:
BrightnessSlider(std::shared_ptr<DisplayAbstract> aDisplay);
BrightnessSlider(std::shared_ptr<DisplayAbstract> aDisplay);

void SetHeight(lv_coord_t aHeight) override;

protected:
void OnShow() override;
bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) override;

void OnShow() override;
void SetHeight(lv_coord_t aHeight) override;
private:
std::shared_ptr<DisplayAbstract> mDisplay;
Slider* mSlider;
Label* mLabel;
std::shared_ptr<DisplayAbstract> mDisplay;
Slider *mSlider;
Label *mLabel;
};

}
} // namespace UI::Widget
47 changes: 33 additions & 14 deletions Platformio/OmoteUI/core/UIElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ bool UIElement::IsVisible() {
return lv_obj_is_visible(mLvglSelf);
}

bool UIElement::IsSetVisible() {
auto lock = LvglResourceManager::GetInstance().scopeLock();
return !lv_obj_has_flag(mLvglSelf, LV_OBJ_FLAG_HIDDEN);
}

void UIElement::SetWidth(lv_coord_t aWidth) {
LvglResourceManager::GetInstance().AttemptNow(
[this, aWidth] { lv_obj_set_width(mLvglSelf, aWidth); });
Expand Down Expand Up @@ -227,7 +232,7 @@ void UIElement::AlignTo(UIElement *anElementToAlignTo, lv_align_t anAlignment,
}

void UIElement::SetVisiblity(bool aVisible) {
if (aVisible == IsVisible()) {
if (aVisible == !lv_obj_has_flag(mLvglSelf, LV_OBJ_FLAG_HIDDEN)) {
return;
}
if (aVisible) {
Expand All @@ -249,26 +254,27 @@ void UIElement::SetBgOpacity(lv_opa_t aOpacity, lv_style_selector_t aStyle) {
});
}

void UIElement::StartLvglEventHandler(){
if(mIsHandlingLvglEvents){ return; }
void UIElement::StartLvglEventHandler() {
if (mIsHandlingLvglEvents) {
return;
}
lv_obj_add_event_cb(mLvglSelf, UIElement::LvglEventHandler, LV_EVENT_ALL,
this);
mIsHandlingLvglEvents = true;
}
void UIElement::StopLvglEventHandler(){
if(!mIsHandlingLvglEvents){return;}
lv_obj_remove_event_cb_with_user_data(mLvglSelf,UIElement::LvglEventHandler,
void UIElement::StopLvglEventHandler() {
if (!mIsHandlingLvglEvents) {
return;
}
lv_obj_remove_event_cb_with_user_data(mLvglSelf, UIElement::LvglEventHandler,
this);
mIsHandlingLvglEvents = false;
}

void UIElement::Show() {
if (IsVisible()) {
if (IsSetVisible()) {
return;
}
for (auto &elem : mContainedElements) {
elem->OnShow();
}
{
auto lock = LvglResourceManager::GetInstance().scopeLock();
lv_obj_clear_flag(mLvglSelf, LV_OBJ_FLAG_HIDDEN);
Expand All @@ -277,19 +283,32 @@ void UIElement::Show() {
}

void UIElement::Hide() {
if (!IsVisible()) {
if (!IsSetVisible()) {
return;
}
for (auto &elem : mContainedElements) {
elem->OnHide();
}
{
auto lock = LvglResourceManager::GetInstance().scopeLock();
lv_obj_add_flag(mLvglSelf, LV_OBJ_FLAG_HIDDEN);
}
OnHide();
}

void UIElement::OnHide() {
for (auto &elem : mContainedElements) {
if (!IsSetVisible()) {
elem->OnHide();
}
}
}

void UIElement::OnShow() {
for (auto &elem : mContainedElements) {
if (!lv_obj_has_flag(mLvglSelf, LV_OBJ_FLAG_HIDDEN)) {
elem->OnShow();
}
}
}

//////////////////// Statics //////////////////////////

void UIElement::LvglEventHandler(lv_event_t *anEvent) {
Expand Down
6 changes: 3 additions & 3 deletions Platformio/OmoteUI/core/UIElement.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class UIElement {

void SetVisiblity(bool aVisibility);
bool IsVisible();
bool IsSetVisible();

virtual void SetWidth(lv_coord_t aWidth);
virtual void SetHeight(lv_coord_t aHeight);
Expand Down Expand Up @@ -87,7 +88,6 @@ class UIElement {
mLvglKeepAliveTime = aTimeToKeepLvglObj;
}


void StartLvglEventHandler();
void StopLvglEventHandler();

Expand All @@ -101,9 +101,9 @@ class UIElement {
/// @brief Hide Element
virtual void Hide();
/// @brief Override in child class to run something after element is shown
virtual void OnShow() = 0;
virtual void OnShow();
/// @brief Override in child class to run something after element is hidden
virtual void OnHide() = 0;
virtual void OnHide();

// Override in object to handle LVGL events for that object
virtual void OnLvglEvent(lv_event_t *anEvent){};
Expand Down
2 changes: 0 additions & 2 deletions Platformio/OmoteUI/core/screen/ScreenBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ class Base : public UIElement {

protected:
void Show() override;
void OnShow() override{};
void OnHide() override{};
bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) override;

private:
Expand Down
37 changes: 17 additions & 20 deletions Platformio/OmoteUI/core/widget/List.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,27 @@
using namespace UI;
using namespace UI::Widget;

ListItem::ListItem(lv_obj_t *aListItem, std::function<void()> onItemSelected):
UIElement(aListItem,ID()),
mSelectedHandler(std::move(onItemSelected)){}
ListItem::ListItem(lv_obj_t *aListItem, std::function<void()> onItemSelected)
: UIElement(aListItem, ID()), mSelectedHandler(std::move(onItemSelected)) {}

void ListItem::OnLvglEvent(lv_event_t* anEvent){
if(anEvent->code == LV_EVENT_CLICKED){
if(mSelectedHandler){
mSelectedHandler();
}
void ListItem::OnLvglEvent(lv_event_t *anEvent) {
if (anEvent->code == LV_EVENT_CLICKED) {
if (mSelectedHandler) {
mSelectedHandler();
}
}
}

List::List():Base(lv_list_create(Screen::BackgroundScreen::getLvInstance()),ID::Widgets::List){
StopLvglEventHandler();
List::List()
: Base(lv_list_create(Screen::BackgroundScreen::getLvInstance()),
ID::Widgets::List) {
StopLvglEventHandler();
}

void List::AddItem(std::string aTitle, const char* aSymbol, std::function<void()> onItemSelected){
auto lvListItem = lv_list_add_btn(LvglSelf(),aSymbol,aTitle.c_str());
mListItems.push_back(std::make_unique<ListItem>(lvListItem, std::move(onItemSelected)));
mListItems.back()->SetHeight(lv_pct(20));
void List::AddItem(std::string aTitle, const char *aSymbol,
std::function<void()> onItemSelected) {
auto lvListItem = lv_list_add_btn(LvglSelf(), aSymbol, aTitle.c_str());
mListItems.push_back(
std::make_unique<ListItem>(lvListItem, std::move(onItemSelected)));
mListItems.back()->SetHeight(lv_pct(20));
}

void List::OnLvglEvent(lv_event_t* anEvent){
if(anEvent->code == LV_EVENT_CLICKED){
auto tgt = anEvent->target;
}
}
32 changes: 17 additions & 15 deletions Platformio/OmoteUI/core/widget/List.hpp
Original file line number Diff line number Diff line change
@@ -1,30 +1,32 @@
#pragma once
#include "WidgetBase.hpp"
#include <string>

namespace UI::Widget{
namespace UI::Widget {

class ListItem : public UIElement{
class ListItem : public UIElement {
public:
ListItem(lv_obj_t* aListItem, std::function<void()> onItemSelected);
ListItem(lv_obj_t *aListItem, std::function<void()> onItemSelected);

protected:
void OnLvglEvent(lv_event_t* anEvent) override;
bool OnKeyEvent(KeyPressAbstract::KeyEvent anEvent)override{return false;};
void OnShow()override{};
void OnHide()override{};
void OnLvglEvent(lv_event_t *anEvent) override;
bool OnKeyEvent(KeyPressAbstract::KeyEvent anEvent) override {
return false;
};

private:
std::function<void()> mSelectedHandler;
std::function<void()> mSelectedHandler;
};

class List : public Base{
class List : public Base {
public:
List();
void AddItem(std::string aTitle, const char* aSymbol, std::function<void()> onItemSelected);
List();
void AddItem(std::string aTitle, const char *aSymbol,
std::function<void()> onItemSelected);

protected:
void OnLvglEvent(lv_event_t* anEvent)override;

private:
std::vector<UIElement::Ptr> mListItems;
std::vector<UIElement::Ptr> mListItems;
};

}
} // namespace UI::Widget
2 changes: 0 additions & 2 deletions Platformio/OmoteUI/core/widget/WidgetBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ class Base : public UIElement {
virtual ~Base() override = default;

protected:
void OnShow() override{};
void OnHide() override{};
bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) override {
return false;
};
Expand Down

0 comments on commit c7f9482

Please sign in to comment.