From 4147866c712bcc4b703cb9e69a06c4a72a1d2d00 Mon Sep 17 00:00:00 2001 From: Przemyslaw Brudny Date: Tue, 20 Jul 2021 21:30:27 +0200 Subject: [PATCH] [EGD-7211] Sim contacts import selector UI part Added sim contacts import selector UI part. Fixed BoxLayout focusChangedCallback. Fixed SetFont redraw. Refactored Check and CheckWithLabel widgets. --- .../widgets/CustomCheckBoxWithLabel.cpp | 2 +- .../widgets/InputLinesWithLabelIWidget.cpp | 4 -- .../ApplicationSettings.cpp | 7 +++ .../application-settings/CMakeLists.txt | 4 ++ .../models/network/SimContactsImportModel.cpp | 47 ++++++++++++++ .../models/network/SimContactsImportModel.hpp | 27 ++++++++ .../SimContactsImportWindowPresenter.cpp | 19 ++++++ .../SimContactsImportWindowPresenter.hpp | 37 +++++++++++ .../widgets/network/ApnInputWidget.cpp | 4 -- .../network/SimContactImportSelectWidget.cpp | 41 ++++++++++++ .../network/SimContactImportSelectWidget.hpp | 22 +++++++ .../windows/network/SimCardsWindow.cpp | 5 +- .../network/SimContactsImportWindow.cpp | 49 +++++++++++++++ .../network/SimContactsImportWindow.hpp | 29 +++++++++ module-gui/gui/widgets/BoxLayout.cpp | 2 +- module-gui/gui/widgets/CheckBox.cpp | 57 ++++++++--------- module-gui/gui/widgets/CheckBox.hpp | 15 ++--- module-gui/gui/widgets/CheckBoxWithLabel.cpp | 62 ++++++++++--------- module-gui/gui/widgets/CheckBoxWithLabel.hpp | 38 +++++------- module-gui/gui/widgets/RichTextParser.cpp | 2 +- module-gui/gui/widgets/Text.cpp | 3 +- 21 files changed, 374 insertions(+), 102 deletions(-) create mode 100644 module-apps/application-settings/models/network/SimContactsImportModel.cpp create mode 100644 module-apps/application-settings/models/network/SimContactsImportModel.hpp create mode 100644 module-apps/application-settings/presenter/network/SimContactsImportWindowPresenter.cpp create mode 100644 module-apps/application-settings/presenter/network/SimContactsImportWindowPresenter.hpp create mode 100644 module-apps/application-settings/widgets/network/SimContactImportSelectWidget.cpp create mode 100644 module-apps/application-settings/widgets/network/SimContactImportSelectWidget.hpp create mode 100644 module-apps/application-settings/windows/network/SimContactsImportWindow.cpp create mode 100644 module-apps/application-settings/windows/network/SimContactsImportWindow.hpp diff --git a/module-apps/application-alarm-clock/widgets/CustomCheckBoxWithLabel.cpp b/module-apps/application-alarm-clock/widgets/CustomCheckBoxWithLabel.cpp index 8594ee730824da96bb5e40e695a8e860d0068f20..11c59108ccefd4f4495a2c5ac3d622b228c4059c 100644 --- a/module-apps/application-alarm-clock/widgets/CustomCheckBoxWithLabel.cpp +++ b/module-apps/application-alarm-clock/widgets/CustomCheckBoxWithLabel.cpp @@ -91,7 +91,7 @@ namespace gui { for (auto const &[key, dayName] : weekDays) { if (descriptionLabel->getText() == utils::translate(dayName)) { - checkBox->setImageVisible(checkBoxData.getData(static_cast(key))); + checkBox->setCheck(checkBoxData.getData(static_cast(key))); } } } diff --git a/module-apps/application-phonebook/widgets/InputLinesWithLabelIWidget.cpp b/module-apps/application-phonebook/widgets/InputLinesWithLabelIWidget.cpp index 1e11019426fdd40ed7389cf1e1196b7275cec54b..cb691933f2364927ec1e7f1538379916d0d79a1c 100644 --- a/module-apps/application-phonebook/widgets/InputLinesWithLabelIWidget.cpp +++ b/module-apps/application-phonebook/widgets/InputLinesWithLabelIWidget.cpp @@ -60,15 +60,11 @@ namespace gui focusChangedCallback = [&](Item &item) { setFocusItem(focus ? vBox : nullptr); - auto tempText = inputText->getText(); - if (focus) { inputText->setFont(style::window::font::mediumbold); - inputText->setText(tempText); } else { inputText->setFont(style::window::font::medium); - inputText->setText(tempText); } return true; }; diff --git a/module-apps/application-settings/ApplicationSettings.cpp b/module-apps/application-settings/ApplicationSettings.cpp index 470c60c871f31daf20ecf62e9259604605dba15b..0a0262d16a06c313d2180afe283528897679a79a 100644 --- a/module-apps/application-settings/ApplicationSettings.cpp +++ b/module-apps/application-settings/ApplicationSettings.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -379,6 +380,12 @@ namespace app windowsFactory.attach(gui::window::name::sim_pin_settings, [](Application *app, const std::string &name) { return std::make_unique(app); }); + windowsFactory.attach(gui::window::name::import_contacts, [&](Application *app, const std::string &name) { + auto model = std::make_unique(this); + auto presenter = std::make_unique(std::move(model)); + return std::make_unique(app, std::move(presenter)); + }); + windowsFactory.attach(gui::window::name::new_apn, [](Application *app, const std::string &name) { return std::make_unique(app); }); diff --git a/module-apps/application-settings/CMakeLists.txt b/module-apps/application-settings/CMakeLists.txt index 9033456c545ad4b4c1cba14590082a8facab8c16..1b443e29fe91675b3979be9298628e7d79451e13 100644 --- a/module-apps/application-settings/CMakeLists.txt +++ b/module-apps/application-settings/CMakeLists.txt @@ -19,6 +19,7 @@ target_sources( ${PROJECT_NAME} models/bluetooth/BluetoothSettingsModel.cpp models/network/ApnSettingsModel.cpp models/network/NewApnModel.cpp + models/network/SimContactsImportModel.cpp models/display-keypad/QuotesModel.cpp models/display-keypad/CategoriesModel.cpp models/apps/AudioSettingsModel.cpp @@ -27,12 +28,14 @@ target_sources( ${PROJECT_NAME} models/system/SARInfoRepository.cpp models/system/FactoryData.cpp models/system/TechnicalInformationModel.cpp + presenter/network/SimContactsImportWindowPresenter.cpp presenter/system/SARInfoWindowPresenter.cpp presenter/system/TechnicalWindowPresenter.cpp widgets/SpinBoxOptionSettings.cpp widgets/advanced/ColorTestListItem.cpp widgets/advanced/ColorTestListView.cpp widgets/network/ApnInputWidget.cpp + widgets/network/SimContactImportSelectWidget.cpp widgets/display-keypad/QuoteWidget.cpp widgets/display-keypad/CategoryWidget.cpp widgets/apps/SettingsSoundItem.cpp @@ -55,6 +58,7 @@ target_sources( ${PROJECT_NAME} windows/network/NetworkWindow.cpp windows/network/SimCardsWindow.cpp windows/network/SimPINSettingsWindow.cpp + windows/network/SimContactsImportWindow.cpp windows/network/ApnSettingsWindow.cpp windows/network/ApnOptionsWindow.cpp windows/network/NewApnWindow.cpp diff --git a/module-apps/application-settings/models/network/SimContactsImportModel.cpp b/module-apps/application-settings/models/network/SimContactsImportModel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4c2f6f5c6ff4ace7ab096c3d03d6635b1e24a44d --- /dev/null +++ b/module-apps/application-settings/models/network/SimContactsImportModel.cpp @@ -0,0 +1,47 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "SimContactsImportModel.hpp" + +#include +#include +#include + +SimContactsImportModel::SimContactsImportModel(app::Application *app) : application(app) +{ + createData(); +} + +auto SimContactsImportModel::requestRecordsCount() -> unsigned int +{ + return internalData.size(); +} + +auto SimContactsImportModel::getMinimalItemSpaceRequired() const -> unsigned int +{ + return style::window::label::big_h + style::margins::big; +} + +void SimContactsImportModel::requestRecords(const uint32_t offset, const uint32_t limit) +{ + setupModel(offset, limit); + list->onProviderDataUpdate(); +} + +auto SimContactsImportModel::getItem(gui::Order order) -> gui::ListItem * +{ + return getRecord(order); +} + +void SimContactsImportModel::createData() +{ + for (auto item : internalData) { + item->deleteByList = false; + } +} + +void SimContactsImportModel::clearData() +{ + list->reset(); + eraseInternalData(); +} diff --git a/module-apps/application-settings/models/network/SimContactsImportModel.hpp b/module-apps/application-settings/models/network/SimContactsImportModel.hpp new file mode 100644 index 0000000000000000000000000000000000000000..fabe7e06b436aeb8ebfb05d2011daddb9141122e --- /dev/null +++ b/module-apps/application-settings/models/network/SimContactsImportModel.hpp @@ -0,0 +1,27 @@ +// 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 + +class SimContactsImportModel : public app::InternalModel, public gui::ListItemProvider +{ + private: + app::Application *application = nullptr; + std::vector importedRecords; + + public: + explicit SimContactsImportModel(app::Application *app); + + void createData(); + void clearData(); + + [[nodiscard]] auto requestRecordsCount() -> unsigned int override; + [[nodiscard]] auto getMinimalItemSpaceRequired() const -> unsigned int override; + auto getItem(gui::Order order) -> gui::ListItem * override; + void requestRecords(const uint32_t offset, const uint32_t limit) override; +}; diff --git a/module-apps/application-settings/presenter/network/SimContactsImportWindowPresenter.cpp b/module-apps/application-settings/presenter/network/SimContactsImportWindowPresenter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9f224ef6b6b14a9736df352040e51df993a9f3e6 --- /dev/null +++ b/module-apps/application-settings/presenter/network/SimContactsImportWindowPresenter.cpp @@ -0,0 +1,19 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "SimContactsImportWindowPresenter.hpp" + +SimContactsImportWindowPresenter::SimContactsImportWindowPresenter( + std::shared_ptr simContactsProvider) + : simContactsProvider{std::move(simContactsProvider)} +{} + +std::shared_ptr SimContactsImportWindowPresenter::getSimContactsProvider() const +{ + return simContactsProvider; +} + +void SimContactsImportWindowPresenter::clearProviderData() const +{ + simContactsProvider->clearData(); +} diff --git a/module-apps/application-settings/presenter/network/SimContactsImportWindowPresenter.hpp b/module-apps/application-settings/presenter/network/SimContactsImportWindowPresenter.hpp new file mode 100644 index 0000000000000000000000000000000000000000..6600a5eed6de7eff74b3cca6655affed8ea969b3 --- /dev/null +++ b/module-apps/application-settings/presenter/network/SimContactsImportWindowPresenter.hpp @@ -0,0 +1,37 @@ +// 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 + +class SimContactsImportWindowContract +{ + public: + class View + { + public: + virtual ~View() noexcept = default; + }; + class Presenter : public app::BasePresenter + { + public: + virtual ~Presenter() noexcept = default; + + virtual std::shared_ptr getSimContactsProvider() const = 0; + virtual void clearProviderData() const = 0; + }; +}; + +class SimContactsImportWindowPresenter : public SimContactsImportWindowContract::Presenter +{ + public: + explicit SimContactsImportWindowPresenter(std::shared_ptr simContactsProvider); + + std::shared_ptr getSimContactsProvider() const override; + void clearProviderData() const override; + + private: + std::shared_ptr simContactsProvider; +}; diff --git a/module-apps/application-settings/widgets/network/ApnInputWidget.cpp b/module-apps/application-settings/widgets/network/ApnInputWidget.cpp index 4d29eabc549169dc8654ff44c91429404bb4bf8f..03415c4828337633ce4bca5041dae794f63069a9 100644 --- a/module-apps/application-settings/widgets/network/ApnInputWidget.cpp +++ b/module-apps/application-settings/widgets/network/ApnInputWidget.cpp @@ -57,15 +57,11 @@ namespace gui focusChangedCallback = [&](Item &item) { setFocusItem(focus ? vBox : nullptr); - auto tempText = inputText->getText(); - if (focus) { inputText->setFont(style::window::font::mediumbold); - inputText->setText(tempText); } else { inputText->setFont(style::window::font::medium); - inputText->setText(tempText); } return true; }; diff --git a/module-apps/application-settings/widgets/network/SimContactImportSelectWidget.cpp b/module-apps/application-settings/widgets/network/SimContactImportSelectWidget.cpp new file mode 100644 index 0000000000000000000000000000000000000000..767e18ed4757ec74d02efdfd3c94bc7689768fa9 --- /dev/null +++ b/module-apps/application-settings/widgets/network/SimContactImportSelectWidget.cpp @@ -0,0 +1,41 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "SimContactImportSelectWidget.hpp" + +namespace gui +{ + SimContactImportSelectWidget::SimContactImportSelectWidget( + std::string contactName, + const std::function &bottomBarTemporaryMode, + const std::function &bottomBarRestoreFromTemporaryMode) + { + setEdges(RectangleEdge::None); + setMinimumSize(style::window::default_body_width, style::window::label::big_h); + setMargins(gui::Margins(style::widgets::leftMargin, style::margins::big, 0, 0)); + + checkBoxWithLabel = new gui::CheckBoxWithLabel(this, + 0, + 0, + 0, + 0, + contactName, + bottomBarTemporaryMode, + bottomBarRestoreFromTemporaryMode, + BottomBar::Side::LEFT); + + inputCallback = [&]([[maybe_unused]] Item &item, const InputEvent &event) { + return checkBoxWithLabel->onInput(event); + }; + + focusChangedCallback = [&](Item &item) { + setFocusItem(focus ? checkBoxWithLabel : nullptr); + return true; + }; + + dimensionChangedCallback = [&](gui::Item &, const BoundingBox &newDim) -> bool { + checkBoxWithLabel->setArea({0, 0, newDim.w, newDim.h}); + return true; + }; + } +} /* namespace gui */ diff --git a/module-apps/application-settings/widgets/network/SimContactImportSelectWidget.hpp b/module-apps/application-settings/widgets/network/SimContactImportSelectWidget.hpp new file mode 100644 index 0000000000000000000000000000000000000000..f250d0d1ef84a3c8d71375c5cccbc9205cde2047 --- /dev/null +++ b/module-apps/application-settings/widgets/network/SimContactImportSelectWidget.hpp @@ -0,0 +1,22 @@ +// 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 +{ + class SimContactImportSelectWidget : public ListItem + { + private: + gui::CheckBoxWithLabel *checkBoxWithLabel = nullptr; + + public: + SimContactImportSelectWidget(std::string contactName, + const std::function &bottomBarTemporaryMode = nullptr, + const std::function &bottomBarRestoreFromTemporaryMode = nullptr); + }; + +} /* namespace gui */ diff --git a/module-apps/application-settings/windows/network/SimCardsWindow.cpp b/module-apps/application-settings/windows/network/SimCardsWindow.cpp index 01c2d0489adaa53c46c1620db9f799e46995a974..478982042ad749a9645e1b19eb88b394debcc2e0 100644 --- a/module-apps/application-settings/windows/network/SimCardsWindow.cpp +++ b/module-apps/application-settings/windows/network/SimCardsWindow.cpp @@ -82,7 +82,6 @@ namespace gui gui::option::SettingRightItem::ArrowWhite, false)); -#if DISABLED_SETTINGS_OPTIONS == 1 optList.emplace_back(std::make_unique( utils::translate("app_settings_network_import_contacts_from_sim_card"), [=](gui::Item &item) { @@ -90,8 +89,8 @@ namespace gui return true; }, nullptr, - nullptr)); -#endif // DISABLED_SETTINGS_OPTIONS + nullptr, + gui::option::SettingRightItem::ArrowWhite)); bottomBar->setText(BottomBar::Side::CENTER, utils::translate(style::strings::common::select)); diff --git a/module-apps/application-settings/windows/network/SimContactsImportWindow.cpp b/module-apps/application-settings/windows/network/SimContactsImportWindow.cpp new file mode 100644 index 0000000000000000000000000000000000000000..85dbc1d02faeabedeb76111002e7b18551da83b0 --- /dev/null +++ b/module-apps/application-settings/windows/network/SimContactsImportWindow.cpp @@ -0,0 +1,49 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "SimContactsImportWindow.hpp" + +#include + +namespace gui +{ + SimContactsImportWindow::SimContactsImportWindow( + app::Application *app, std::unique_ptr simImportPresenter) + : AppWindow(app, gui::window::name::import_contacts), presenter(std::move(simImportPresenter)) + { + presenter->attach(this); + buildInterface(); + } + + void SimContactsImportWindow::onBeforeShow(ShowMode mode, SwitchData *data) + { + list->rebuildList(); + } + + void SimContactsImportWindow::onClose(CloseReason reason) + { + if (reason != CloseReason::PhoneLock) { + presenter->clearProviderData(); + } + } + + void SimContactsImportWindow::buildInterface() + { + AppWindow::buildInterface(); + + setTitle(utils::translate("app_settings_network_import_contacts_from_sim_card")); + + bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); + bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::translate(::style::strings::common::back)); + + list = new ListView(this, + style::window::default_left_margin, + style::window::default_vertical_pos, + style::listview::body_width_with_scroll, + style::window::default_body_height, + presenter->getSimContactsProvider(), + listview::ScrollBarType::Fixed); + + setFocusItem(list); + } +} // namespace gui diff --git a/module-apps/application-settings/windows/network/SimContactsImportWindow.hpp b/module-apps/application-settings/windows/network/SimContactsImportWindow.hpp new file mode 100644 index 0000000000000000000000000000000000000000..c57baf701e790a54edbf50a44d95ef63da5fec7d --- /dev/null +++ b/module-apps/application-settings/windows/network/SimContactsImportWindow.hpp @@ -0,0 +1,29 @@ +// 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 + +namespace gui +{ + class SimContactsImportWindow : public AppWindow, public SimContactsImportWindowContract::View + { + + public: + SimContactsImportWindow(app::Application *app, + std::unique_ptr presenter); + + private: + ListView *list = nullptr; + + void buildInterface() override; + void onBeforeShow(ShowMode mode, SwitchData *data) override; + void onClose(CloseReason reason) override; + + std::shared_ptr presenter; + }; + +} // namespace gui diff --git a/module-gui/gui/widgets/BoxLayout.cpp b/module-gui/gui/widgets/BoxLayout.cpp index 2cf5c7c74dad87200a5d78c9903754913b21fbc5..d882d506fa79adafdb80f21d166cbb8b8966d237 100644 --- a/module-gui/gui/widgets/BoxLayout.cpp +++ b/module-gui/gui/widgets/BoxLayout.cpp @@ -46,7 +46,7 @@ namespace gui else this->setFocusItem(nullptr); this->setNavigation(); - if (this->focusChangedCallback) { + if (this->focusChangedCallback && state != focus) { this->focusChangedCallback(*this); } return true; diff --git a/module-gui/gui/widgets/CheckBox.cpp b/module-gui/gui/widgets/CheckBox.cpp index 07ebc97e4ad320c238a439036603089fad298a52..25913ba87e76843ba7a9055b1a9e6c7bbbe06fc9 100644 --- a/module-gui/gui/widgets/CheckBox.cpp +++ b/module-gui/gui/widgets/CheckBox.cpp @@ -2,8 +2,8 @@ // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "CheckBox.hpp" -#include "InputEvent.hpp" #include "Style.hpp" +#include #include namespace gui @@ -14,19 +14,18 @@ namespace gui const uint32_t &y, const uint32_t &w, const uint32_t &h, - std::function bottomBarTemporaryMode, - std::function bottomBarRestoreFromTemporaryMode, - bool textOnLeft) + const std::function &bottomBarTemporaryMode, + const std::function &bottomBarRestoreFromTemporaryMode, + BottomBar::Side bottomBarSide) : HBox(parent, x, y, w, h), bottomBarTemporaryMode(bottomBarTemporaryMode), - bottomBarRestoreFromTemporaryMode(bottomBarRestoreFromTemporaryMode), textOnLeft(textOnLeft) + bottomBarRestoreFromTemporaryMode(bottomBarRestoreFromTemporaryMode), bottomBarSide(bottomBarSide) { setEdges(RectangleEdge::Bottom); setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); - image = new Image("small_tick_W_M"); + image = new Image(this, "small_tick_W_M"); image->setVisible(false); - addWidget(image); applyCallbacks(); } @@ -35,17 +34,22 @@ namespace gui { focusChangedCallback = [&](Item &item) { if (focus) { - setFocusItem(image); - if (image->visible) { - bottomBarTemporaryMode(utils::translate("common_uncheck")); + if (isChecked()) { + if (bottomBarTemporaryMode) { + bottomBarTemporaryMode(utils::translate("common_uncheck")); + } } else { - bottomBarTemporaryMode(utils::translate("common_check")); + if (bottomBarTemporaryMode) { + bottomBarTemporaryMode(utils::translate("common_check")); + } } } else { setFocusItem(nullptr); - bottomBarRestoreFromTemporaryMode(); + if (bottomBarRestoreFromTemporaryMode) { + bottomBarRestoreFromTemporaryMode(); + } } return true; }; @@ -54,37 +58,30 @@ namespace gui if (!event.isShortRelease()) { return false; } - if (textOnLeft) { - if (event.is(gui::KeyCode::KEY_LF)) { - image->setVisible(!image->visible); - if (image->visible) { + if ((bottomBarSide == BottomBar::Side::LEFT && event.is(gui::KeyCode::KEY_LF)) || + (bottomBarSide == BottomBar::Side::CENTER && event.is(gui::KeyCode::KEY_ENTER))) { + setCheck(!isChecked()); + if (isChecked()) { + if (bottomBarTemporaryMode) { bottomBarTemporaryMode(utils::translate("common_uncheck")); } - else { - bottomBarTemporaryMode(utils::translate("common_check")); - } - return true; } - } - else { - if (event.is(gui::KeyCode::KEY_ENTER)) { - image->setVisible(!image->visible); - if (image->visible) { - bottomBarTemporaryMode(utils::translate("common_uncheck")); - } - else { + else { + if (bottomBarTemporaryMode) { bottomBarTemporaryMode(utils::translate("common_check")); } - return true; } + return true; } + return false; }; } - void CheckBox::setImageVisible(bool state) + void CheckBox::setCheck(bool state) { image->setVisible(state); + resizeItems(); } bool CheckBox::isChecked() diff --git a/module-gui/gui/widgets/CheckBox.hpp b/module-gui/gui/widgets/CheckBox.hpp index ff3375f9fae513a6832f2891c4c80f227dd5c1e7..a31281301699ce6dfb45239b8dd6674f92e796bc 100644 --- a/module-gui/gui/widgets/CheckBox.hpp +++ b/module-gui/gui/widgets/CheckBox.hpp @@ -1,10 +1,11 @@ -// 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 "BoxLayout.hpp" #include "Image.hpp" -#include +#include "BottomBar.hpp" namespace gui { @@ -13,7 +14,7 @@ namespace gui Image *image = nullptr; std::function bottomBarTemporaryMode = nullptr; std::function bottomBarRestoreFromTemporaryMode = nullptr; - bool textOnLeft = true; + BottomBar::Side bottomBarSide = BottomBar::Side::LEFT; void applyCallbacks(); @@ -23,11 +24,11 @@ namespace gui const uint32_t &y, const uint32_t &w, const uint32_t &h, - std::function bottomBarTemporaryMode = nullptr, - std::function bottomBarRestoreFromTemporaryMode = nullptr, - bool textOnLeft = true); + const std::function &bottomBarTemporaryMode = nullptr, + const std::function &bottomBarRestoreFromTemporaryMode = nullptr, + BottomBar::Side bottomBarSide = BottomBar::Side::LEFT); - void setImageVisible(bool state); + void setCheck(bool state); bool isChecked(); }; diff --git a/module-gui/gui/widgets/CheckBoxWithLabel.cpp b/module-gui/gui/widgets/CheckBoxWithLabel.cpp index 0d0647bae191703af63ec5089dd771651d01aa6f..e62d143c5811c261339093c14bb980184192da1e 100644 --- a/module-gui/gui/widgets/CheckBoxWithLabel.cpp +++ b/module-gui/gui/widgets/CheckBoxWithLabel.cpp @@ -1,42 +1,48 @@ -// 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 "CheckBoxWithLabel.hpp" namespace gui { - CheckBoxWithLabel::CheckBoxWithLabel( - Item *parent, int x, int y, UTF8 description, std::function clickCallback) + CheckBoxWithLabel::CheckBoxWithLabel(Item *parent, + uint32_t x, + uint32_t y, + uint32_t w, + uint32_t h, + const UTF8 &description, + const std::function &bottomBarTemporaryMode, + const std::function &bottomBarRestoreFromTemporaryMode, + gui::BottomBar::Side textSide) + : HBox{parent, x, y, w, h} { - auto body = new gui::HBox(nullptr, x, y, style::window::default_body_width, style::window::label::big_h); - body->setEdges(gui::RectangleEdge::None); - - label = - new gui::Label(nullptr, 0, 0, style::checkbox::description_width, style::window::label::big_h, description); - check = new gui::CheckBox(nullptr, - style::checkbox::check_x, - style::checkbox::check_y, - style::checkbox::check_width, - style::window::label::small_h); - check->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); + setEdges(gui::RectangleEdge::None); - label->activatedCallback = [=](Item &item) { - setChecked(!check->isChecked()); - if (clickCallback) { - clickCallback(*this); + check = + new gui::CheckBox(this, 0, 0, 0, 0, bottomBarTemporaryMode, bottomBarRestoreFromTemporaryMode, textSide); + check->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); + check->setMinimumSize(60, style::window::label::big_h); + setChecked(true); + + label = new gui::Label(this, 0, 0, 0, 0, description); + label->setEdges(RectangleEdge::None); + label->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); + label->setMargins(gui::Margins(style::window::default_left_margin, 0, 0, 0)); + label->setFont(style::window::font::big); + label->setMinimumHeight(style::window::label::big_h); + label->setMaximumWidth(style::window::default_body_width); + + focusChangedCallback = [&](Item &item) { + if (focus) { + label->setFont(style::window::font::bigbold); + } + else { + label->setFont(style::window::font::big); } return true; }; - style::window::decorateOption(label); - style::window::decorate(check); - - /* - * We need to add widgets after decorate to correctly redraw them - */ - parent->addWidget(body); - body->addWidget(label); - body->addWidget(check); + resizeItems(); } bool CheckBoxWithLabel::isChecked() const @@ -46,6 +52,6 @@ namespace gui void CheckBoxWithLabel::setChecked(bool state) { - check->setImageVisible(state); + check->setCheck(state); } } // namespace gui diff --git a/module-gui/gui/widgets/CheckBoxWithLabel.hpp b/module-gui/gui/widgets/CheckBoxWithLabel.hpp index 4be8504ea5a09736e7c6ec3180519c442dd8e48f..f7f48d50573d487cffde6ba8940e948d37026b4f 100644 --- a/module-gui/gui/widgets/CheckBoxWithLabel.hpp +++ b/module-gui/gui/widgets/CheckBoxWithLabel.hpp @@ -1,36 +1,32 @@ -// 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 style::checkbox -{ - const inline int check_x = 400; - const inline int check_y = 25; - const inline int description_width = 380; - const inline int check_width = 40; -} // namespace style::checkbox +#include "CheckBox.hpp" +#include "Label.hpp" +#include "BottomBar.hpp" namespace gui { - class CheckBoxWithLabel : public gui::Item + class CheckBoxWithLabel : public gui::HBox { + private: + gui::CheckBox *check = nullptr; + gui::Label *label = nullptr; + public: CheckBoxWithLabel(Item *parent, - int x, - int y, - UTF8 description, - std::function checkCallback = nullptr); - - ~CheckBoxWithLabel() override = default; + uint32_t x, + uint32_t y, + uint32_t w, + uint32_t h, + const UTF8 &description, + const std::function &bottomBarTemporaryMode = nullptr, + const std::function &bottomBarRestoreFromTemporaryMode = nullptr, + BottomBar::Side bottomBarSide = BottomBar::Side::LEFT); void setChecked(bool state); auto isChecked() const -> bool; - - private: - gui::CheckBox *check = nullptr; - gui::Label *label = nullptr; }; } // namespace gui diff --git a/module-gui/gui/widgets/RichTextParser.cpp b/module-gui/gui/widgets/RichTextParser.cpp index ce647ef60b1883ecb88f1a497ed29f05258a7344..5af028c039755deee894352fa19474da9cdf2cac 100644 --- a/module-gui/gui/widgets/RichTextParser.cpp +++ b/module-gui/gui/widgets/RichTextParser.cpp @@ -524,7 +524,7 @@ namespace gui::text { log_parser("parsing: %s", text.c_str()); if (text.empty() || base_style == nullptr) { - LOG_ERROR("no: %s", text.empty() ? "text" : "base style"); + log_parser("no: %s", text.empty() ? "text" : "base style"); return nullptr; } diff --git a/module-gui/gui/widgets/Text.cpp b/module-gui/gui/widgets/Text.cpp index 03f433204a960db3f1b3755a21c21320870383d2..e7a1d8520a16983bc6343b6ac9026835324ed70d 100644 --- a/module-gui/gui/widgets/Text.cpp +++ b/module-gui/gui/widgets/Text.cpp @@ -209,8 +209,7 @@ namespace gui if (format.getFont() != newFont) { format.setFont(newFont); - buildCursor(); - drawLines(); + buildDocument(getText()); } }