From a21e02f91e176a35edc2a87208b15710962f0a3c Mon Sep 17 00:00:00 2001 From: Jakub Pyszczak Date: Tue, 9 Mar 2021 14:39:06 +0100 Subject: [PATCH] [EGD-5743] Added phone modes popup Implementation of phone modes window. Minor fixes of previous approach. --- image/assets/lang/English.json | 1 + module-apps/Application.cpp | 19 ++- module-apps/Application.hpp | 3 + module-apps/CMakeLists.txt | 2 +- .../ApplicationAlarmClock.cpp | 2 +- .../ApplicationAntenna.cpp | 2 +- .../ApplicationCalculator.cpp | 2 +- .../ApplicationCalendar.cpp | 2 +- .../application-call/ApplicationCall.cpp | 2 +- .../ApplicationCallLog.cpp | 2 +- .../application-clock/ApplicationClock.cpp | 2 +- .../ApplicationDesktop.cpp | 2 +- .../ApplicationMeditation.cpp | 2 +- .../ApplicationMessages.cpp | 2 +- .../ApplicationMusicPlayer.cpp | 2 +- .../application-notes/ApplicationNotes.cpp | 2 +- .../ApplicationOnBoarding.cpp | 2 +- .../ApplicationPhonebook.cpp | 2 +- .../ApplicationSettings.cpp | 2 +- module-apps/popups/HomeModesWindow.cpp | 51 ++++++++ .../{windows => popups}/HomeModesWindow.hpp | 21 +-- module-apps/popups/Popups.hpp | 1 + module-apps/popups/VolumeWindow.cpp | 18 +-- module-apps/popups/VolumeWindow.hpp | 2 +- module-apps/popups/data/PopupData.hpp | 18 ++- module-apps/widgets/ModesBox.cpp | 122 ++++++++++++------ module-apps/widgets/ModesBox.hpp | 64 ++++----- module-apps/windows/HomeModesWindow.cpp | 36 ------ 28 files changed, 231 insertions(+), 157 deletions(-) create mode 100644 module-apps/popups/HomeModesWindow.cpp rename module-apps/{windows => popups}/HomeModesWindow.hpp (50%) delete mode 100644 module-apps/windows/HomeModesWindow.cpp diff --git a/image/assets/lang/English.json b/image/assets/lang/English.json index 6de6adad7..e878d56be 100644 --- a/image/assets/lang/English.json +++ b/image/assets/lang/English.json @@ -84,6 +84,7 @@ "home_modes_connected": "CONNECTED", "home_modes_notdisturb": "DO NOT DISTURB", "home_modes_offline": "OFFLINE", + "home_modes_message_only": "Message only", "topbar_battery_charging": "Charg", "topbar_battery_plugged": "Plug", "app_alarm_clock_title_main": "Alarm clock", diff --git a/module-apps/Application.cpp b/module-apps/Application.cpp index d3b2b7d0d..c93157c6f 100644 --- a/module-apps/Application.cpp +++ b/module-apps/Application.cpp @@ -87,18 +87,31 @@ namespace app default_window(gui::name::window::main_window), windowsStack(this), keyTranslator{std::make_unique()}, startInBackground{startInBackground}, callbackStorage{std::make_unique()}, topBarManager{std::make_unique()}, - settings(std::make_unique(this)) + settings(std::make_unique(this)), + phoneModeObserver(std::make_unique()) { topBarManager->enableIndicators({gui::top_bar::Indicator::Time}); topBarManager->set(utils::dateAndTimeSettings.isTimeFormat12() ? gui::top_bar::TimeMode::Time12h : gui::top_bar::TimeMode::Time24h); bus.channels.push_back(sys::BusChannel::ServiceCellularNotifications); + bus.channels.push_back(sys::BusChannel::PhoneModeChanges); longPressTimer = sys::TimerFactory::createPeriodicTimer(this, "LongPress", std::chrono::milliseconds{key_timer_ms}, [this](sys::Timer &) { longPressTimerCallback(); }); + phoneModeObserver->connect(this); + phoneModeObserver->subscribe( + [=](sys::phone_modes::PhoneMode phoneMode, sys::phone_modes::Tethering tetheringMode) { + using namespace gui::popup; + if (getCurrentWindow()->getName() == window::phone_modes_window) { + updateWindow(window::phone_modes_window, std::make_unique(phoneMode)); + } + else { + switchWindow(window::phone_modes_window, std::make_unique(phoneMode)); + } + }); connect(typeid(AppRefreshMessage), [this](sys::Message *msg) -> sys::MessagePointer { return handleAppRefresh(msg); }); connect(sevm::BatteryStatusChangeMessage(), [&](sys::Message *) { return handleBatteryStatusChange(); }); @@ -673,6 +686,10 @@ namespace app }); break; case ID::PhoneModes: + windowsFactory.attach(window::phone_modes_window, [](Application *app, const std::string &name) { + return std::make_unique(app, window::phone_modes_window); + }); + break; case ID::Brightness: break; } diff --git a/module-apps/Application.hpp b/module-apps/Application.hpp index 458d364db..85c60d546 100644 --- a/module-apps/Application.hpp +++ b/module-apps/Application.hpp @@ -17,6 +17,8 @@ #include "bsp/keyboard/key_codes.hpp" // for bsp #include "gui/Common.hpp" // for ShowMode #include "projdefs.h" // for pdMS_TO_TICKS +#include + #include #include // for list #include // for allocator, map @@ -380,6 +382,7 @@ namespace app /// application's settings std::unique_ptr settings; + std::unique_ptr phoneModeObserver; public: void setLockScreenPasscodeOn(bool screenPasscodeOn) noexcept; diff --git a/module-apps/CMakeLists.txt b/module-apps/CMakeLists.txt index cff4bdd19..1ba5a93e8 100644 --- a/module-apps/CMakeLists.txt +++ b/module-apps/CMakeLists.txt @@ -30,8 +30,8 @@ set( SOURCES "widgets/InputBox.cpp" "popups/VolumeWindow.cpp" "popups/WindowWithTimer.cpp" + "popups/HomeModesWindow.cpp" "windows/BrightnessWindow.cpp" - "windows/HomeModesWindow.cpp" "widgets/BrightnessBox.cpp" "widgets/ModesBox.cpp" "widgets/BarGraph.cpp" diff --git a/module-apps/application-alarm-clock/ApplicationAlarmClock.cpp b/module-apps/application-alarm-clock/ApplicationAlarmClock.cpp index ce317a062..da5607b78 100644 --- a/module-apps/application-alarm-clock/ApplicationAlarmClock.cpp +++ b/module-apps/application-alarm-clock/ApplicationAlarmClock.cpp @@ -108,7 +108,7 @@ namespace app style::alarmClock::window::name::dialogYesNo, [](Application *app, const std::string &name) { return std::make_unique(app, name); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationAlarmClock::destroyUserInterface() diff --git a/module-apps/application-antenna/ApplicationAntenna.cpp b/module-apps/application-antenna/ApplicationAntenna.cpp index 0cd92af01..ea1192514 100644 --- a/module-apps/application-antenna/ApplicationAntenna.cpp +++ b/module-apps/application-antenna/ApplicationAntenna.cpp @@ -178,7 +178,7 @@ namespace app return std::make_unique(app); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationAntenna::destroyUserInterface() diff --git a/module-apps/application-calculator/ApplicationCalculator.cpp b/module-apps/application-calculator/ApplicationCalculator.cpp index 8ef741ac8..e707babbd 100644 --- a/module-apps/application-calculator/ApplicationCalculator.cpp +++ b/module-apps/application-calculator/ApplicationCalculator.cpp @@ -43,7 +43,7 @@ namespace app return std::make_unique(app, name); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationCalculator::destroyUserInterface() diff --git a/module-apps/application-calendar/ApplicationCalendar.cpp b/module-apps/application-calendar/ApplicationCalendar.cpp index c16958b3c..bd9e6c745 100644 --- a/module-apps/application-calendar/ApplicationCalendar.cpp +++ b/module-apps/application-calendar/ApplicationCalendar.cpp @@ -143,7 +143,7 @@ namespace app return std::make_unique(app, event_reminder_window); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationCalendar::destroyUserInterface() diff --git a/module-apps/application-call/ApplicationCall.cpp b/module-apps/application-call/ApplicationCall.cpp index 7502c5a1d..b4167c260 100644 --- a/module-apps/application-call/ApplicationCall.cpp +++ b/module-apps/application-call/ApplicationCall.cpp @@ -222,7 +222,7 @@ namespace app windowsFactory.attach(app::window::name_dialogConfirm, [](Application *app, const std::string &name) { return std::make_unique(app, name); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } bool ApplicationCall::showNotification(std::function action, diff --git a/module-apps/application-calllog/ApplicationCallLog.cpp b/module-apps/application-calllog/ApplicationCallLog.cpp index 95e3aef64..9577c3d50 100644 --- a/module-apps/application-calllog/ApplicationCallLog.cpp +++ b/module-apps/application-calllog/ApplicationCallLog.cpp @@ -98,7 +98,7 @@ namespace app return std::make_unique(app, name); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationCallLog::destroyUserInterface() diff --git a/module-apps/application-clock/ApplicationClock.cpp b/module-apps/application-clock/ApplicationClock.cpp index 9bc1964db..4dc51de45 100644 --- a/module-apps/application-clock/ApplicationClock.cpp +++ b/module-apps/application-clock/ApplicationClock.cpp @@ -86,7 +86,7 @@ namespace app return std::make_unique(app, name); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationClock::destroyUserInterface() diff --git a/module-apps/application-desktop/ApplicationDesktop.cpp b/module-apps/application-desktop/ApplicationDesktop.cpp index a0a9ba6c2..8f81c45b9 100644 --- a/module-apps/application-desktop/ApplicationDesktop.cpp +++ b/module-apps/application-desktop/ApplicationDesktop.cpp @@ -449,7 +449,7 @@ namespace app return std::make_unique(app, desktop_mmi_internal); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationDesktop::destroyUserInterface() diff --git a/module-apps/application-meditation/ApplicationMeditation.cpp b/module-apps/application-meditation/ApplicationMeditation.cpp index cddc944d1..4cf58888b 100644 --- a/module-apps/application-meditation/ApplicationMeditation.cpp +++ b/module-apps/application-meditation/ApplicationMeditation.cpp @@ -53,7 +53,7 @@ namespace app return std::make_unique(app); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationMeditation::destroyUserInterface() diff --git a/module-apps/application-messages/ApplicationMessages.cpp b/module-apps/application-messages/ApplicationMessages.cpp index 1871fb22e..3128fd6af 100644 --- a/module-apps/application-messages/ApplicationMessages.cpp +++ b/module-apps/application-messages/ApplicationMessages.cpp @@ -149,7 +149,7 @@ namespace app return std::make_unique(app); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationMessages::destroyUserInterface() diff --git a/module-apps/application-music-player/ApplicationMusicPlayer.cpp b/module-apps/application-music-player/ApplicationMusicPlayer.cpp index b81dfad90..22ba98e84 100644 --- a/module-apps/application-music-player/ApplicationMusicPlayer.cpp +++ b/module-apps/application-music-player/ApplicationMusicPlayer.cpp @@ -69,7 +69,7 @@ namespace app return std::make_unique(app); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationMusicPlayer::destroyUserInterface() diff --git a/module-apps/application-notes/ApplicationNotes.cpp b/module-apps/application-notes/ApplicationNotes.cpp index 17635f3ab..d9c18a576 100644 --- a/module-apps/application-notes/ApplicationNotes.cpp +++ b/module-apps/application-notes/ApplicationNotes.cpp @@ -122,7 +122,7 @@ namespace app utils::localize.get("app_phonebook_options_title"), [](Application *app, const std::string &name) { return std::make_unique(app, name); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationNotes::destroyUserInterface() diff --git a/module-apps/application-onboarding/ApplicationOnBoarding.cpp b/module-apps/application-onboarding/ApplicationOnBoarding.cpp index 110f76214..6239d40fc 100644 --- a/module-apps/application-onboarding/ApplicationOnBoarding.cpp +++ b/module-apps/application-onboarding/ApplicationOnBoarding.cpp @@ -126,7 +126,7 @@ namespace app return std::make_unique(app); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationOnBoarding::destroyUserInterface() diff --git a/module-apps/application-phonebook/ApplicationPhonebook.cpp b/module-apps/application-phonebook/ApplicationPhonebook.cpp index 620e1b286..3d4c41d7c 100644 --- a/module-apps/application-phonebook/ApplicationPhonebook.cpp +++ b/module-apps/application-phonebook/ApplicationPhonebook.cpp @@ -147,7 +147,7 @@ namespace app return std::make_unique(app); }); - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationPhonebook::destroyUserInterface() diff --git a/module-apps/application-settings/ApplicationSettings.cpp b/module-apps/application-settings/ApplicationSettings.cpp index 42f5bd77c..24502c2ed 100644 --- a/module-apps/application-settings/ApplicationSettings.cpp +++ b/module-apps/application-settings/ApplicationSettings.cpp @@ -163,7 +163,7 @@ namespace app }); } - attachPopups({gui::popup::ID::Volume}); + attachPopups({gui::popup::ID::Volume, gui::popup::ID::PhoneModes}); } void ApplicationSettings::destroyUserInterface() diff --git a/module-apps/popups/HomeModesWindow.cpp b/module-apps/popups/HomeModesWindow.cpp new file mode 100644 index 000000000..ab1534125 --- /dev/null +++ b/module-apps/popups/HomeModesWindow.cpp @@ -0,0 +1,51 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "HomeModesWindow.hpp" +#include "widgets/ModesBox.hpp" +#include "data/PopupData.hpp" + +#include +#include +#include + +namespace gui +{ + HomeModesWindow::HomeModesWindow(app::Application *app, const std::string &name) : WindowWithTimer(app, name) + { + buildInterface(); + } + + void HomeModesWindow::buildInterface() + { + AppWindow::buildInterface(); + + bottomBar->setVisible(false); + topBar->setVisible(false); + + modesBox = new ModesBox(this, 0, style::window::modes::top_offset); + } + + void HomeModesWindow::rebuild() + {} + + void HomeModesWindow::onBeforeShow(ShowMode mode, SwitchData *data) + { + WindowWithTimer::onBeforeShow(mode, data); + const auto popupData = dynamic_cast(data); + if (popupData != nullptr) { + const auto currentMode = popupData->getPhoneMode(); + modesBox->update(currentMode); + } + } + + bool HomeModesWindow::onInput(const gui::InputEvent &inputEvent) + { + if ((inputEvent.isShortPress())) { + if (inputEvent.keyCode == KeyCode::KEY_RF) { + return false; + } + } + return AppWindow::onInput(inputEvent); + } +} // namespace gui diff --git a/module-apps/windows/HomeModesWindow.hpp b/module-apps/popups/HomeModesWindow.hpp similarity index 50% rename from module-apps/windows/HomeModesWindow.hpp rename to module-apps/popups/HomeModesWindow.hpp index a1a10f818..c6556428a 100644 --- a/module-apps/windows/HomeModesWindow.hpp +++ b/module-apps/popups/HomeModesWindow.hpp @@ -1,32 +1,23 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once -#include "module-apps/Application.hpp" -#include "AppWindow.hpp" -#include "module-apps/widgets/BarGraph.hpp" -#include "module-apps/widgets/ModesBox.hpp" -#include +#include "popups/WindowWithTimer.hpp" namespace gui { - class HomeModesWindow : public AppWindow + class ModesBox; + class HomeModesWindow : public WindowWithTimer { protected: ModesBox *modesBox = nullptr; public: HomeModesWindow(app::Application *app, const std::string &name); - - ~HomeModesWindow() override; - void onBeforeShow(ShowMode mode, SwitchData *data) override; - void rebuild() override; - void buildInterface() override; - - void destroyInterface() override; + bool onInput(const gui::InputEvent &inputEvent) override; }; -}; // namespace gui +} // namespace gui diff --git a/module-apps/popups/Popups.hpp b/module-apps/popups/Popups.hpp index d7577afe5..5e57c9976 100644 --- a/module-apps/popups/Popups.hpp +++ b/module-apps/popups/Popups.hpp @@ -4,6 +4,7 @@ #pragma once #include +#include #include diff --git a/module-apps/popups/VolumeWindow.cpp b/module-apps/popups/VolumeWindow.cpp index 1d8e15e8b..893a2d392 100644 --- a/module-apps/popups/VolumeWindow.cpp +++ b/module-apps/popups/VolumeWindow.cpp @@ -53,14 +53,16 @@ namespace gui void VolumeWindow::onBeforeShow(ShowMode mode, SwitchData *data) { WindowWithTimer::onBeforeShow(mode, data); - const auto popupData = static_cast(data); - volume = popupData->getVolume(); - audioContext = popupData->getAudioContext(); - if (volumeBar != nullptr) { - volumeBar->setValue(volume); - } - if (volumeText != nullptr) { - showProperText(audioContext, volume); + const auto popupData = dynamic_cast(data); + if (popupData) { + volume = popupData->getVolume(); + audioContext = popupData->getAudioContext(); + if (volumeBar != nullptr) { + volumeBar->setValue(volume); + } + if (volumeText != nullptr) { + showProperText(audioContext, volume); + } } } diff --git a/module-apps/popups/VolumeWindow.hpp b/module-apps/popups/VolumeWindow.hpp index 763b6f5bb..db78ac6fe 100644 --- a/module-apps/popups/VolumeWindow.hpp +++ b/module-apps/popups/VolumeWindow.hpp @@ -52,4 +52,4 @@ namespace gui void buildInterface() override; bool onInput(const gui::InputEvent &inputEvent) override; }; -}; // namespace gui +} // namespace gui diff --git a/module-apps/popups/data/PopupData.hpp b/module-apps/popups/data/PopupData.hpp index 43ab30e50..423826282 100644 --- a/module-apps/popups/data/PopupData.hpp +++ b/module-apps/popups/data/PopupData.hpp @@ -1,9 +1,10 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include +#include namespace gui { @@ -30,4 +31,19 @@ namespace gui const audio::Volume volume; const AudioContext audioContext; }; + + class ModesPopupData : public SwitchData + { + public: + explicit ModesPopupData(const sys::phone_modes::PhoneMode phoneMode) : SwitchData(), phoneMode{phoneMode} + {} + + [[nodiscard]] auto getPhoneMode() const noexcept -> sys::phone_modes::PhoneMode + { + return phoneMode; + } + + private: + const sys::phone_modes::PhoneMode phoneMode; + }; } // namespace gui diff --git a/module-apps/widgets/ModesBox.cpp b/module-apps/widgets/ModesBox.cpp index 4fb8e45b9..a3df3b1bf 100644 --- a/module-apps/widgets/ModesBox.cpp +++ b/module-apps/widgets/ModesBox.cpp @@ -1,11 +1,20 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include #include "ModesBox.hpp" +#include +#include +#include + namespace gui { + namespace img::dot + { + constexpr auto name = "dot_12px_hard_alpha_W_G"; + } // namespace img::dot + ModesBox::ModesBox(Item *parent, uint32_t x, uint32_t y) : VBox(parent, x, y, style::window::modes::width, style::window::modes::height) { @@ -15,43 +24,77 @@ namespace gui addOffline(); } + void ModesBox::update(const sys::phone_modes::PhoneMode &phoneMode) + { + using PhoneMode = sys::phone_modes::PhoneMode; + auto getUpdateValues = [&phoneMode](const PhoneMode &compare) -> std::pair { + return (phoneMode == compare) ? std::make_pair(style::window::font::largelight, true) + : std::make_pair(style::window::font::medium, false); + }; + connected->update(getUpdateValues(PhoneMode::Connected)); + notDisturb->update(getUpdateValues(PhoneMode::DoNotDisturb)); + offline->update(getUpdateValues(PhoneMode::Offline)); + if (phoneMode == PhoneMode::Offline) { + messageOnly->setVisible(true); + } + else { + messageOnly->setVisible(false); + } + } + void ModesBox::addConnected() { - connected = new ModeRow(this, 0, 0, style::window::modes::width, style::window::modes::connected::height); + connected = new ModeRow(this, + 0, + 0, + style::window::modes::width, + style::window::modes::height / style::window::modes::number_of_entries); connected->addText(utils::localize.get(style::window::modes::connected::title_key), style::window::font::medium, - Margins(style::window::modes::connected::margin::left, 0, 0, 0), - style::window::modes::connected::width, - style::window::modes::connected::height); - connected->resizeItems(); + style::window::modes::text::width, + style::window::modes::height / style::window::modes::number_of_entries); + + connected->addImage(img::dot::name); } void ModesBox::addNotDisturb() { - notDisturb = new ModeRow(this, 0, 0, style::window::modes::width, style::window::modes::notdisturb::height); - notDisturb->addText( - utils::localize.get(style::window::modes::notdisturb::title_key), - style::window::font::largelight, - Margins( - style::window::modes::notdisturb::margin::left, 0, style::window::modes::notdisturb::margin::right, 0), - style::window::modes::notdisturb::width, - style::window::modes::notdisturb::height); - notDisturb->addImage("dot_12px_hard_alpha_W_G"); - notDisturb->setMargins(Margins( - 0, style::window::modes::notdisturb::margin::top, 0, style::window::modes::notdisturb::margin::bottom)); - notDisturb->resizeItems(); + notDisturb = new ModeRow(this, + 0, + 0, + style::window::modes::width, + style::window::modes::height / style::window::modes::number_of_entries); + + notDisturb->addText(utils::localize.get(style::window::modes::notdisturb::title_key), + style::window::font::medium, + style::window::modes::text::width, + style::window::modes::height / style::window::modes::number_of_entries); + notDisturb->addImage(img::dot::name); } void ModesBox::addOffline() { - offline = new ModeRow(this, 0, 0, style::window::modes::width, style::window::modes::offline::height); - + offline = new ModeRow(this, + 0, + 0, + style::window::modes::width, + style::window::modes::height / style::window::modes::number_of_entries); offline->addText(utils::localize.get(style::window::modes::offline::title_key), style::window::font::medium, - Margins(style::window::modes::offline::margin::left, 0, 0, 0), - style::window::modes::offline::width, - style::window::modes::offline::height); - offline->resizeItems(); + style::window::modes::text::width, + style::window::modes::height / style::window::modes::number_of_entries); + offline->addImage(img::dot::name); + + messageOnly = new ModeRow(this, + 0, + 0, + style::window::modes::width, + style::window::modes::height / style::window::modes::number_of_entries); + + messageOnly->addText(utils::localize.get(style::window::modes::offline::description_key), + style::window::font::verysmall, + style::window::modes::text::width, + style::window::modes::height / style::window::modes::number_of_entries); } ModeRow::ModeRow(Item *parent, uint32_t x, uint32_t y, uint32_t width, uint32_t height) @@ -60,25 +103,30 @@ namespace gui this->setEdges(RectangleEdge::None); } - void ModeRow::addText( - const std::string &text, const std::string &fontSize, const Margins &margin, uint32_t width, uint32_t height) + void ModeRow::addText(const std::string &text, const std::string &fontSize, uint32_t width, uint32_t height) { - label = new Label(this, 0, 0, width, height); - label->setMinimumSize(width, height); + label = new Label(this, 0, 0, width, height, text); label->setEdges(gui::RectangleEdge::None); - label->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); - label->activeItem = false; - label->setText(text); + label->setAlignment(Alignment(gui::Alignment::Horizontal::Right, gui::Alignment::Vertical::Center)); label->setFont(fontSize); - label->setMargins(margin); + } + + void ModeRow::update(std::pair &¶ms) + { + const auto [font, imgVisibility] = params; + img->setVisible(imgVisibility); + label->setFont(font); } void ModeRow::addImage(const std::string &imageName) { - img = new Image(this, 0, 0, 0, 0); - img->setMinimumSize(style::window::modes::image::width, style::window::modes::image::height); - img->setAlignment(Alignment(gui::Alignment::Horizontal::Right, gui::Alignment::Vertical::Center)); - img->set(imageName); - img->setMargins(Margins(style::window::modes::image::margin::left, 0, 0, 0)); + img = new ImageBox(this, + 0, + 0, + style::window::modes::image::width, + style::window::modes::height / style::window::modes::number_of_entries, + new Image(imageName)); + + img->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); } } // namespace gui diff --git a/module-apps/widgets/ModesBox.hpp b/module-apps/widgets/ModesBox.hpp index 2348641be..6d14c688f 100644 --- a/module-apps/widgets/ModesBox.hpp +++ b/module-apps/widgets/ModesBox.hpp @@ -1,91 +1,71 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include #include -#include +#include + +namespace sys::phone_modes +{ + enum class PhoneMode; +} // namespace sys::phone_modes namespace style::window::modes { - constexpr inline auto invision_diff = 26; - - constexpr inline auto left_offset = style::window_width / 4; constexpr inline auto top_offset = 182; - constexpr inline auto bottom_offset = 257; + constexpr inline auto bottom_offset = 235; constexpr inline auto height = style::window_height - top_offset - bottom_offset; - constexpr inline auto width = style::window_width - left_offset; - + constexpr inline auto width = style::window_width; + constexpr inline auto number_of_entries = 4; namespace connected { constexpr inline auto title_key = "home_modes_connected"; - constexpr inline auto width = 129; - constexpr inline auto height = 33; - namespace margin - { - constexpr inline auto left = 296 - style::window::modes::left_offset + invision_diff; - constexpr inline auto right = 20; - } // namespace margin } // namespace connected namespace notdisturb { constexpr inline auto title_key = "home_modes_notdisturb"; - constexpr inline auto width = 297 + invision_diff; - constexpr inline auto height = 51; - namespace margin - { - constexpr inline auto top = 20; - constexpr inline auto left = 128 - style::window::modes::left_offset; - constexpr inline auto bottom = 20; - constexpr inline auto right = 0; - } // namespace margin } // namespace notdisturb namespace offline { constexpr inline auto title_key = "home_modes_offline"; - constexpr inline auto width = 88; - constexpr inline auto height = 33; - - namespace margin - { - constexpr inline auto left = 337 - style::window::modes::left_offset + invision_diff; - constexpr inline auto right = 10; - } // namespace margin + constexpr inline auto description_key = "home_modes_message_only"; } // namespace offline namespace image { - namespace margin - { - constexpr inline auto left = 7; - } - constexpr inline auto width = 10; - constexpr inline auto height = 20; + constexpr inline auto width = 55; } // namespace image + namespace text + { + constexpr inline auto width = style::window::modes::width - style::window::modes::image::width; + } // namespace text } // namespace style::window::modes namespace gui { + class ImageBox; + class ModeRow : public HBox { Label *label = nullptr; - Image *img = nullptr; + ImageBox *img = nullptr; public: ModeRow(Item *parent = nullptr, uint32_t x = 0, uint32_t y = 0, uint32_t width = 0, uint32_t height = 0); void addText(const std::string &text, const std::string &fontSize, - const Margins &margin, uint32_t width, uint32_t height); + void update(std::pair &¶ms); void addImage(const std::string &imageName); }; @@ -94,14 +74,14 @@ namespace gui ModeRow *connected = nullptr; ModeRow *notDisturb = nullptr; ModeRow *offline = nullptr; + ModeRow *messageOnly = nullptr; void addConnected(); - void addNotDisturb(); - void addOffline(); public: ModesBox(Item *parent = nullptr, uint32_t x = 0, uint32_t y = 0); + void update(const sys::phone_modes::PhoneMode &phoneMode); }; } // namespace gui diff --git a/module-apps/windows/HomeModesWindow.cpp b/module-apps/windows/HomeModesWindow.cpp deleted file mode 100644 index 3a083cf7f..000000000 --- a/module-apps/windows/HomeModesWindow.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#include -#include -#include "HomeModesWindow.hpp" - -namespace gui -{ - HomeModesWindow::HomeModesWindow(app::Application *app, const std::string &name) : AppWindow(app, name) - { - buildInterface(); - } - - void HomeModesWindow::buildInterface() - { - AppWindow::buildInterface(); - modesBox = new ModesBox(this, style::window::modes::left_offset, style::window::modes::top_offset); - } - - void HomeModesWindow::rebuild() - {} - - void HomeModesWindow::destroyInterface() - { - erase(); - } - - HomeModesWindow::~HomeModesWindow() - { - destroyInterface(); - } - - void HomeModesWindow::onBeforeShow(ShowMode mode, SwitchData *data) - {} -} // namespace gui