From e49512bf4fd32f5871c5d2c146dce5167bedf7b5 Mon Sep 17 00:00:00 2001 From: mkamonMdt Date: Thu, 4 Feb 2021 12:37:38 +0100 Subject: [PATCH] [EGD-5619] Add unified implementation of active icons This PR provides unified and reusable implementation of active icons used in windows system-wide. --- image/assets/lang/English.json | 1 + module-apps/CMakeLists.txt | 5 +- .../windows/MessagesMainWindow.cpp | 4 +- .../windows/NewMessage.cpp | 6 +- .../windows/OptionsMessages.cpp | 6 +- .../ApplicationPhonebook.cpp | 4 +- .../application-phonebook/CMakeLists.txt | 2 - .../data/PhonebookItemData.hpp | 39 +++---- .../widgets/InformationWidget.cpp | 37 +++--- .../widgets/InformationWidget.hpp | 17 +-- .../widgets/NumberWithIconsWidget.cpp | 107 ------------------ .../widgets/NumberWithIconsWidget.hpp | 30 ----- .../windows/PhonebookMainWindow.cpp | 6 +- .../options/type/OptionWithActiveIcons.cpp | 71 ++++++++++++ .../options/type/OptionWithActiveIcons.hpp | 35 ++++++ module-apps/widgets/ActiveIconFactory.cpp | 80 +++++++++++++ module-apps/widgets/ActiveIconFactory.hpp | 26 +++++ module-apps/widgets/TextWithIconsWidget.cpp | 40 +++++++ module-apps/widgets/TextWithIconsWidget.hpp | 29 +++++ module-gui/gui/widgets/Style.hpp | 8 ++ 20 files changed, 356 insertions(+), 197 deletions(-) delete mode 100644 module-apps/application-phonebook/widgets/NumberWithIconsWidget.cpp delete mode 100644 module-apps/application-phonebook/widgets/NumberWithIconsWidget.hpp create mode 100644 module-apps/options/type/OptionWithActiveIcons.cpp create mode 100644 module-apps/options/type/OptionWithActiveIcons.hpp create mode 100644 module-apps/widgets/ActiveIconFactory.cpp create mode 100644 module-apps/widgets/ActiveIconFactory.hpp create mode 100644 module-apps/widgets/TextWithIconsWidget.cpp create mode 100644 module-apps/widgets/TextWithIconsWidget.hpp diff --git a/image/assets/lang/English.json b/image/assets/lang/English.json index c2d209859a7059c83a7515308364721141ad7a44..fba05c574317365cf29ed6c19f32c3596958c05a 100644 --- a/image/assets/lang/English.json +++ b/image/assets/lang/English.json @@ -308,6 +308,7 @@ "app_messages_offline": "You're offline.\n\nTo send a SMS\n switch to the Connected mode.", "app_messages_thread_draft": "Draft: ", "app_messages_thread_not_sent": "Not sent: ", + "app_messages_thread_from_this": "From this message", "app_messages_thread_you": "You: ", "app_settings_title_main": "Settings", "app_settings_title_main_new": "Settings New", diff --git a/module-apps/CMakeLists.txt b/module-apps/CMakeLists.txt index 1c885c8aa650ddc103617d747cd8b21d7fb197e6..dc701c1de8e88a2485ce2766408d42c052e73e27 100644 --- a/module-apps/CMakeLists.txt +++ b/module-apps/CMakeLists.txt @@ -30,13 +30,16 @@ set( SOURCES "widgets/BrightnessBox.cpp" "widgets/ModesBox.cpp" "widgets/BarGraph.cpp" + "widgets/ActiveIconFactory.cpp" + "widgets/TextWithIconsWidget.cpp" "options/OptionsModel.cpp" "options/type/OptionSimple.cpp" "options/type/OptionCall.cpp" "options/type/OptionContact.cpp" "options/type/OptionSetting.cpp" "options/type/OptionChangePin.cpp" - ) + "options/type/OptionWithActiveIcons.cpp" + ) add_library(${PROJECT_NAME} STATIC ${SOURCES} ${BOARD_SOURCES}) diff --git a/module-apps/application-messages/windows/MessagesMainWindow.cpp b/module-apps/application-messages/windows/MessagesMainWindow.cpp index 51e37be1be920c2cd49851afa3c1b5f62cda058e..197792cda4bf037ff89f562e79f21973d525c0a2 100644 --- a/module-apps/application-messages/windows/MessagesMainWindow.cpp +++ b/module-apps/application-messages/windows/MessagesMainWindow.cpp @@ -1,4 +1,4 @@ -// 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 "MessagesMainWindow.hpp" @@ -108,7 +108,7 @@ namespace gui { LOG_INFO("Data: %s", data ? data->getDescription().c_str() : ""); { - auto pdata = dynamic_cast(data); + auto pdata = dynamic_cast(data); if (pdata != nullptr) { using db::query::ThreadGetByContactID; auto query = std::make_unique(pdata->result->ID); diff --git a/module-apps/application-messages/windows/NewMessage.cpp b/module-apps/application-messages/windows/NewMessage.cpp index 73f4b3ea8771bdc0d66fbfd2d7d2919e8c28c21d..60dd38ccd243a62b6e1e8ca8cf824ea5d9e04f4b 100644 --- a/module-apps/application-messages/windows/NewMessage.cpp +++ b/module-apps/application-messages/windows/NewMessage.cpp @@ -1,4 +1,4 @@ -// 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 "NewMessage.hpp" @@ -67,7 +67,7 @@ namespace gui return; } - if (auto searchRequest = dynamic_cast(data); searchRequest != nullptr) { + if (auto searchRequest = dynamic_cast(data); searchRequest != nullptr) { LOG_INFO("Received search results"); contact = searchRequest->result; recipient->setText(contact->getFormattedName()); @@ -109,7 +109,7 @@ namespace gui memento->setState(message); return app::manager::Controller::sendAction(application, app::manager::actions::ShowContacts, - std::make_unique(), + std::make_unique(), app::manager::OnSwitchBehaviour::RunInBackground); } return true; diff --git a/module-apps/application-messages/windows/OptionsMessages.cpp b/module-apps/application-messages/windows/OptionsMessages.cpp index 198d779ba94939726716ebf43f224769b9158d7a..cfc8eb71260f4ddcc10d3dcd9b4c074621e84dac 100644 --- a/module-apps/application-messages/windows/OptionsMessages.cpp +++ b/module-apps/application-messages/windows/OptionsMessages.cpp @@ -1,4 +1,4 @@ -// 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 "OptionsMessages.hpp" @@ -7,16 +7,14 @@ #include #include +#include #include -#include #include #include #include #include -using namespace style::window; - std::list smsWindowOptions(app::ApplicationMessages *app, const SMSRecord &record) { ContactRecord contact = DBServiceAPI::ContactGetByIDWithTemporary(app, record.contactID)->front(); diff --git a/module-apps/application-phonebook/ApplicationPhonebook.cpp b/module-apps/application-phonebook/ApplicationPhonebook.cpp index a3dc7d4bf11d554523c7ce120ff74654f256dae9..48cef132d64c8f858bdfc0b50d908731bbb2f9a8 100644 --- a/module-apps/application-phonebook/ApplicationPhonebook.cpp +++ b/module-apps/application-phonebook/ApplicationPhonebook.cpp @@ -1,4 +1,4 @@ -// 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 "ApplicationPhonebook.hpp" @@ -166,7 +166,7 @@ namespace app if (main_window->isSearchRequested()) { searchModel->messagesSelectCallback = [=](gui::PhonebookItem *item) { - std::unique_ptr data = std::make_unique(); + std::unique_ptr data = std::make_unique(); data->result = item->contact; data->setDescription("PhonebookSearchRequest"); return app::manager::Controller::switchBack( diff --git a/module-apps/application-phonebook/CMakeLists.txt b/module-apps/application-phonebook/CMakeLists.txt index b3035b75617a9f366eea851d854a4abc3657bb4b..94a833e74cf16d2d524b2a1b2c9f46ce46301a5c 100644 --- a/module-apps/application-phonebook/CMakeLists.txt +++ b/module-apps/application-phonebook/CMakeLists.txt @@ -19,7 +19,6 @@ target_sources( ${PROJECT_NAME} "${CMAKE_CURRENT_LIST_DIR}/widgets/InputBoxWithLabelAndIconWidget.cpp" "${CMAKE_CURRENT_LIST_DIR}/widgets/InputLinesWithLabelIWidget.cpp" "${CMAKE_CURRENT_LIST_DIR}/widgets/OutputLinesTextWithLabelWidget.cpp" - "${CMAKE_CURRENT_LIST_DIR}/widgets/NumberWithIconsWidget.cpp" "${CMAKE_CURRENT_LIST_DIR}/widgets/PhonebookItem.cpp" "${CMAKE_CURRENT_LIST_DIR}/widgets/PhonebookListView.cpp" "${CMAKE_CURRENT_LIST_DIR}/widgets/ContactFlagsWidget.cpp" @@ -48,7 +47,6 @@ target_sources( ${PROJECT_NAME} "${CMAKE_CURRENT_LIST_DIR}/widgets/OutputLinesTextWithLabelWidget.hpp" "${CMAKE_CURRENT_LIST_DIR}/widgets/PhonebookListView.hpp" "${CMAKE_CURRENT_LIST_DIR}/widgets/PhonebookItem.hpp" - "${CMAKE_CURRENT_LIST_DIR}/widgets/NumberWithIconsWidget.hpp" "${CMAKE_CURRENT_LIST_DIR}/windows/PhonebookContactDetails.hpp" "${CMAKE_CURRENT_LIST_DIR}/windows/PhonebookNewContact.hpp" "${CMAKE_CURRENT_LIST_DIR}/windows/PhonebookNamecardOptions.hpp" diff --git a/module-apps/application-phonebook/data/PhonebookItemData.hpp b/module-apps/application-phonebook/data/PhonebookItemData.hpp index ec8538172be35f4031ac3ea744ae3569d492036d..9fe807afd3d9e063dec3d390028a9abe49c745c6 100644 --- a/module-apps/application-phonebook/data/PhonebookItemData.hpp +++ b/module-apps/application-phonebook/data/PhonebookItemData.hpp @@ -1,4 +1,4 @@ -// 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 @@ -12,30 +12,32 @@ class PhonebookItemData : public gui::SwitchData { + std::string text; + std::shared_ptr contact = nullptr; + public: - PhonebookItemData(std::shared_ptr contact, const std::string &text = "") - : text(text), contact(contact){}; - virtual ~PhonebookItemData(){}; - std::shared_ptr getContact() + PhonebookItemData() = default; + explicit PhonebookItemData(std::shared_ptr contact, const std::string &text = "") + : text(text), contact(std::move(contact)){}; + + std::shared_ptr getContact() const { return contact; } - public: - PhonebookItemData() : contact(nullptr) - {} - std::string text; - std::shared_ptr contact = nullptr; + const std::string &getText() const noexcept + { + return text; + } }; class PhonebookSearchQuery : public gui::SwitchData { public: - PhonebookSearchQuery(std::string _searchQuery) : searchQuery(_searchQuery){}; - virtual ~PhonebookSearchQuery(){}; - std::string getQuery() + explicit PhonebookSearchQuery(std::string searchQuery) : searchQuery(std::move(searchQuery)){}; + const std::string &getQuery() const noexcept { - return (searchQuery); + return searchQuery; } protected: @@ -47,7 +49,6 @@ class PhonebookSearchResultsData : public gui::SwitchData public: PhonebookSearchResultsData() = delete; PhonebookSearchResultsData(std::unique_ptr model) : model(std::move(model)){}; - virtual ~PhonebookSearchResultsData(){}; std::unique_ptr consumeSearchResultsModel() { @@ -61,14 +62,14 @@ class PhonebookSearchResultsData : public gui::SwitchData bool consumed = false; }; -class PhonebookSearchReuqest : public gui::SwitchData +class PhonebookSearchRequest : public gui::SwitchData { public: std::string request = ""; std::shared_ptr> results = nullptr; - PhonebookSearchReuqest(std::string request, std::shared_ptr> results) - : request(request), results(results) + PhonebookSearchRequest(std::string request, std::shared_ptr> results) + : request(std::move(request)), results(std::move(results)) {} - PhonebookSearchReuqest() = default; + PhonebookSearchRequest() = default; std::shared_ptr result = nullptr; }; diff --git a/module-apps/application-phonebook/widgets/InformationWidget.cpp b/module-apps/application-phonebook/widgets/InformationWidget.cpp index e5ff4e30169cff5b1a8006d4b1634bfa96bcc72b..73ba023de575cb4a23bec1a1f88f53f5372f354b 100644 --- a/module-apps/application-phonebook/widgets/InformationWidget.cpp +++ b/module-apps/application-phonebook/widgets/InformationWidget.cpp @@ -1,10 +1,12 @@ -// 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 "InformationWidget.hpp" #include "AppWindow.hpp" #include "application-phonebook/data/PhonebookStyle.hpp" +#include "widgets/TextWithIconsWidget.hpp" +#include "widgets/ActiveIconFactory.hpp" #include #include @@ -32,28 +34,31 @@ namespace gui titleLabel->activeItem = false; onLoadCallback = [=](std::shared_ptr contact) { - if (contact->numbers.size() > 0) { + auto createBox = [=](const utils::PhoneNumber::View &number, const UTF8 &font) { + auto numberHBox = new TextWithIconsWidget(vBox); + ActiveIconFactory factory(app); + numberHBox->addText(number.getFormatted(), font); + numberHBox->addIcon(factory.makeCallIcon(number)); + numberHBox->addIcon(factory.makeSMSIcon(number)); + return numberHBox; + }; + if (contact->numbers.size() > 0) { setMinimumHeight(widgetMinimumArea.h + phonebookStyle::numbersWithIconsWidget::h); - - primaryNumberHBox = new NumberWithIconsWidget( - app, contact->numbers[0].number, style::window::font::mediumbold, nullptr); - vBox->addWidget(primaryNumberHBox); + primaryNumberHBox = createBox(contact->numbers[0].number, style::window::font::mediumbold); } if (contact->numbers.size() > 1) { setMinimumHeight(widgetMinimumArea.h + phonebookStyle::numbersWithIconsWidget::h); - secondNumberHBox = - new NumberWithIconsWidget(app, contact->numbers[1].number, style::window::font::medium, nullptr); - - vBox->addWidget(secondNumberHBox); + secondaryNumberHBox = createBox(contact->numbers[1].number, style::window::font::medium); // Set proper navigation if second number is present - primaryNumberHBox->smsImage->setNavigationItem(NavigationDirection::DOWN, secondNumberHBox->smsImage); - primaryNumberHBox->phoneImage->setNavigationItem(NavigationDirection::DOWN, - secondNumberHBox->phoneImage); + primaryNumberHBox->icons[0]->setNavigationItem(NavigationDirection::DOWN, + secondaryNumberHBox->icons[0]); + primaryNumberHBox->icons[1]->setNavigationItem(NavigationDirection::DOWN, + secondaryNumberHBox->icons[1]); - secondNumberHBox->smsImage->setNavigationItem(NavigationDirection::UP, primaryNumberHBox->smsImage); - secondNumberHBox->phoneImage->setNavigationItem(NavigationDirection::UP, primaryNumberHBox->phoneImage); + secondaryNumberHBox->icons[0]->setNavigationItem(NavigationDirection::UP, primaryNumberHBox->icons[0]); + secondaryNumberHBox->icons[1]->setNavigationItem(NavigationDirection::UP, primaryNumberHBox->icons[1]); } if (contact->mail.length() > 0) { setMinimumHeight(widgetMinimumArea.h + phonebookStyle::informationWidget::email_text_h + @@ -94,7 +99,7 @@ namespace gui } // Clear VBox down navigation if second number is present. - if (secondNumberHBox != nullptr) { + if (secondaryNumberHBox != nullptr) { primaryNumberHBox->clearNavigationItem(NavigationDirection::DOWN); } diff --git a/module-apps/application-phonebook/widgets/InformationWidget.hpp b/module-apps/application-phonebook/widgets/InformationWidget.hpp index 194e4dc585025f91fdaf35d5f1117889ce29df54..d4781afdaca49edee87fd76c9c40055ff58d0325 100644 --- a/module-apps/application-phonebook/widgets/InformationWidget.hpp +++ b/module-apps/application-phonebook/widgets/InformationWidget.hpp @@ -1,4 +1,4 @@ -// 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 @@ -6,25 +6,26 @@ #include "application-phonebook/data/PhonebookInternals.hpp" #include "application-phonebook/data/PhonebookItemData.hpp" #include "application-phonebook/widgets/ContactListItem.hpp" -#include "NumberWithIconsWidget.hpp" #include #include namespace gui { + class TextWithIconsWidget; + class InformationWidget : public ContactListItem { public: InformationWidget(app::Application *app); ~InformationWidget() override = default; auto onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) -> bool override; - VBox *vBox = nullptr; - Label *titleLabel = nullptr; - NumberWithIconsWidget *primaryNumberHBox = nullptr; - NumberWithIconsWidget *secondNumberHBox = nullptr; - Text *emailText = nullptr; - Item *savedFocusItem = nullptr; + VBox *vBox = nullptr; + Label *titleLabel = nullptr; + TextWithIconsWidget *primaryNumberHBox = nullptr; + TextWithIconsWidget *secondaryNumberHBox = nullptr; + Text *emailText = nullptr; + Item *savedFocusItem = nullptr; }; } /* namespace gui */ diff --git a/module-apps/application-phonebook/widgets/NumberWithIconsWidget.cpp b/module-apps/application-phonebook/widgets/NumberWithIconsWidget.cpp deleted file mode 100644 index c3f984f15b87a0069a887e6510f62c98c24a03c4..0000000000000000000000000000000000000000 --- a/module-apps/application-phonebook/widgets/NumberWithIconsWidget.cpp +++ /dev/null @@ -1,107 +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 "NumberWithIconsWidget.hpp" - -#include "application-phonebook/data/PhonebookStyle.hpp" - -#include - -#include -#include -#include - -namespace gui -{ - NumberWithIconsWidget::NumberWithIconsWidget(app::Application *app, - const utils::PhoneNumber::View &number, - const std::string &font, - Item *parent) - : HBox(parent, 0, 0, 0, 0) - { - setReverseOrder(true); - setMinimumSize(phonebookStyle::informationWidget::w, phonebookStyle::numbersWithIconsWidget::h); - setEdges(gui::RectangleEdge::None); - setAlignment(Alignment(gui::Alignment::Horizontal::Right, gui::Alignment::Vertical::Center)); - - smsImage = new ImageBox(this, - 0, - 0, - phonebookStyle::numbersWithIconsWidget::sms_image_w, - phonebookStyle::numbersWithIconsWidget::sms_image_h, - new Image("mail")); - smsImage->inputCallback = [=](Item &item, const InputEvent &input) { - if (input.keyCode == KeyCode::KEY_ENTER && input.state == InputEvent::State::keyReleasedShort) { - LOG_INFO("SMS operation started"); - auto data = std::make_unique(number, std::string{}); - data->ignoreCurrentWindowOnStack = true; - return app::manager::Controller::sendAction(app, - app::manager::actions::CreateSms, - std::move(data), - app::manager::OnSwitchBehaviour::RunInBackground); - } - return false; - }; - - phoneImage = new ImageBox(this, - 0, - 0, - phonebookStyle::numbersWithIconsWidget::phone_image_w, - phonebookStyle::numbersWithIconsWidget::phone_image_h, - new Image("phonebook_phone_ringing")); - phoneImage->setMargins(Margins(phonebookStyle::numbersWithIconsWidget::phone_image_margin_left, - 0, - phonebookStyle::numbersWithIconsWidget::phone_image_margin_right, - 0)); - phoneImage->inputCallback = [=](Item &item, const InputEvent &input) { - if (input.keyCode == KeyCode::KEY_ENTER && input.state == InputEvent::State::keyReleasedShort) { - app::manager::Controller::sendAction(app, - app::manager::actions::Dial, - std::make_unique(number), - app::manager::OnSwitchBehaviour::RunInBackground); - LOG_INFO("Call operation started"); - } - return false; - }; - - numberText = new TextFixedSize(this, 0, 0, 0, 0); - numberText->setUnderline(false); - numberText->setMaximumSize(phonebookStyle::informationWidget::w, - phonebookStyle::numbersWithIconsWidget::number_text_h); - numberText->setFont(font); - numberText->setEdges(gui::RectangleEdge::None); - numberText->setEditMode(EditMode::Browse); - numberText->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); - numberText->setText(number.getFormatted()); - numberText->activeItem = false; - - focusChangedCallback = [&](Item &item) { - setFocusItem(focus ? phoneImage : nullptr); - return true; - }; - - phoneImage->focusChangedCallback = [&, app](Item &item) { - if (phoneImage->focus) { - phoneImage->setEdges(RectangleEdge::Bottom | RectangleEdge::Top); - app->getCurrentWindow()->bottomBarTemporaryMode( - utils::localize.get(style::strings::common::call), BottomBar::Side::CENTER, false); - } - else { - phoneImage->setEdges(RectangleEdge::None); - } - return true; - }; - - smsImage->focusChangedCallback = [&, app](Item &item) { - if (smsImage->focus) { - smsImage->setEdges(RectangleEdge::Bottom | RectangleEdge::Top); - app->getCurrentWindow()->bottomBarTemporaryMode( - utils::localize.get(style::strings::common::send), BottomBar::Side::CENTER, false); - } - else { - smsImage->setEdges(RectangleEdge::None); - } - return true; - }; - } -} /* namespace gui */ diff --git a/module-apps/application-phonebook/widgets/NumberWithIconsWidget.hpp b/module-apps/application-phonebook/widgets/NumberWithIconsWidget.hpp deleted file mode 100644 index 7090130182aa0c9dae2e323880f911350f65c2e1..0000000000000000000000000000000000000000 --- a/module-apps/application-phonebook/widgets/NumberWithIconsWidget.hpp +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. -// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md - -#pragma once - -#include "Application.hpp" - -#include -#include -#include -#include -#include - -namespace gui -{ - class NumberWithIconsWidget : public HBox - { - public: - NumberWithIconsWidget(app::Application *app, - const utils::PhoneNumber::View &number, - const std::string &font, - Item *parent); - ~NumberWithIconsWidget() override = default; - - TextFixedSize *numberText = nullptr; - ImageBox *phoneImage = nullptr; - ImageBox *smsImage = nullptr; - }; - -} /* namespace gui */ diff --git a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp index d4131b5b585f7a10109febde4e0ace91d2de9743..216c011e91af035da9df15c34d3ee33d62b63768 100644 --- a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp +++ b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp @@ -1,4 +1,4 @@ -// 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 "PhonebookMainWindow.hpp" @@ -97,12 +97,12 @@ namespace gui { LOG_INFO("onBeforeShow"); - auto contactRequest = dynamic_cast(data); + auto contactRequest = dynamic_cast(data); requestedSearch = contactRequest != nullptr; if (requestedSearch) { enableNewContact = false; phonebookModel->messagesSelectCallback = [=](gui::PhonebookItem *item) { - std::unique_ptr data = std::make_unique(); + std::unique_ptr data = std::make_unique(); data->result = item->contact; data->setDescription("PhonebookSearchRequest"); return app::manager::Controller::switchBack( diff --git a/module-apps/options/type/OptionWithActiveIcons.cpp b/module-apps/options/type/OptionWithActiveIcons.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2f4caf14ba2d57a94b5ab521d5238e09a9140293 --- /dev/null +++ b/module-apps/options/type/OptionWithActiveIcons.cpp @@ -0,0 +1,71 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "OptionWithActiveIcons.hpp" +#include +#include +#include + +using namespace gui::option; + +namespace +{ + [[nodiscard]] auto makeIcon(gui::ActiveIconFactory &factory, + const std::shared_ptr &contact, + OptionWithActiveIcons::BasicIcon icon) -> gui::ImageBox * + { + switch (icon) { + case OptionWithActiveIcons::BasicIcon::SendSMS: + return factory.makeSMSIcon(contact->numbers.front().number); + case OptionWithActiveIcons::BasicIcon::Call: + return factory.makeCallIcon(contact->numbers.front().number); + case OptionWithActiveIcons::BasicIcon::AddContact: + return factory.makeAddContactIcon(contact); + } + return nullptr; + } +} // namespace + +OptionWithActiveIcons::OptionWithActiveIcons(app::Application *app, + std::shared_ptr contact, + std::vector icons) + : app{app}, contact{std::move(contact)}, icons{std::move(icons)} +{} + +auto OptionWithActiveIcons::build() const -> ListItem * +{ + auto optionItem = new gui::ListItem(); + optionItem->setMinimumSize(style::window::default_body_width, style::window::label::big_h); + auto optionBodyHBox = new gui::TextWithIconsWidget(optionItem); + const auto &number = contact->numbers.front().number; + optionBodyHBox->addText(!number.getE164().empty() ? number.getE164() : number.getFormatted(), + style::window::font::bigbold); + + ActiveIconFactory factory(app); + for (auto icon : icons) { + optionBodyHBox->addIcon(makeIcon(factory, contact, icon)); + } + + optionItem->dimensionChangedCallback = [optionBodyHBox](gui::Item &, const BoundingBox &newDim) -> bool { + optionBodyHBox->setPosition(0, 0); + optionBodyHBox->setSize(newDim.w, newDim.h); + return true; + }; + + optionItem->inputCallback = [optionBodyHBox](Item &, const InputEvent &inputEvent) { + return optionBodyHBox->onInput(inputEvent); + }; + + optionItem->focusChangedCallback = [optionItem, optionBodyHBox, this](gui::Item &item) -> bool { + optionItem->setEdges(RectangleEdge::None); + if (item.focus) { + item.setFocusItem(optionBodyHBox); + } + else { + item.setFocusItem(nullptr); + app->getCurrentWindow()->bottomBarRestoreFromTemporaryMode(); + } + return true; + }; + return optionItem; +} diff --git a/module-apps/options/type/OptionWithActiveIcons.hpp b/module-apps/options/type/OptionWithActiveIcons.hpp new file mode 100644 index 0000000000000000000000000000000000000000..a8cf6809b3c26589e774bb3757044446470d00b3 --- /dev/null +++ b/module-apps/options/type/OptionWithActiveIcons.hpp @@ -0,0 +1,35 @@ +// 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 "OptionBase.hpp" +#include + +namespace app +{ + class Application; +} + +namespace gui::option +{ + class OptionWithActiveIcons : public Base + { + public: + enum class BasicIcon + { + SendSMS, + Call, + AddContact + }; + OptionWithActiveIcons(app::Application *app, + std::shared_ptr contact, + std::vector icons); + + private: + app::Application *app; + std::shared_ptr contact; + std::vector icons; + [[nodiscard]] auto build() const -> ListItem * override; + }; +} // namespace gui::option diff --git a/module-apps/widgets/ActiveIconFactory.cpp b/module-apps/widgets/ActiveIconFactory.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1461982f09c27c2751b9257e0fcfd9d2b268c0b7 --- /dev/null +++ b/module-apps/widgets/ActiveIconFactory.cpp @@ -0,0 +1,80 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "ActiveIconFactory.hpp" + +#include +#include +#include +#include +#include +#include + +using namespace gui; + +ActiveIconFactory::ActiveIconFactory(app::Application *app) : app{app} +{ + assert(app); +} + +auto ActiveIconFactory::makeCustomIcon(const UTF8 &image, + std::function onActivated, + std::string bottomBarActivatedName) -> ImageBox * +{ + auto icon = new ImageBox(nullptr, 0, 0, style::widgets::iconsSize, style::widgets::iconsSize, new Image(image)); + icon->activeItem = onActivated.operator bool(); + icon->activatedCallback = std::move(onActivated); + icon->focusChangedCallback = [icon, application = app, name = std::move(bottomBarActivatedName)](Item &item) { + if (icon->focus) { + icon->setEdges(RectangleEdge::Bottom | RectangleEdge::Top); + application->getCurrentWindow()->bottomBarTemporaryMode( + utils::localize.get(name), BottomBar::Side::CENTER, false); + } + else { + icon->setEdges(RectangleEdge::None); + } + return true; + }; + return icon; +} + +auto ActiveIconFactory::makeSMSIcon(const utils::PhoneNumber::View &number) -> ImageBox * +{ + return makeCustomIcon( + "mail", + [application = app, number](gui::Item &item) { + auto data = std::make_unique(number, std::string{}); + data->ignoreCurrentWindowOnStack = true; + return app::manager::Controller::sendAction(application, + app::manager::actions::CreateSms, + std::move(data), + app::manager::OnSwitchBehaviour::RunInBackground); + }, + style::strings::common::send); +} + +auto ActiveIconFactory::makeCallIcon(const utils::PhoneNumber::View &number) -> ImageBox * +{ + return makeCustomIcon( + "phonebook_phone_ringing", + [application = app, number](gui::Item &item) { + return app::manager::Controller::sendAction(application, + app::manager::actions::Dial, + std::make_unique(number), + app::manager::OnSwitchBehaviour::RunInBackground); + }, + style::strings::common::call); +} + +auto ActiveIconFactory::makeAddContactIcon(const std::shared_ptr &contact) -> ImageBox * +{ + return makeCustomIcon( + "cross", + [application = app, contact](gui::Item &item) { + return app::manager::Controller::sendAction(application, + app::manager::actions::EditContact, + std::make_unique(contact), + app::manager::OnSwitchBehaviour::RunInBackground); + }, + "common_add"); +} diff --git a/module-apps/widgets/ActiveIconFactory.hpp b/module-apps/widgets/ActiveIconFactory.hpp new file mode 100644 index 0000000000000000000000000000000000000000..1bb84ede7e0af58f6a10a8db4378fecc727ebc46 --- /dev/null +++ b/module-apps/widgets/ActiveIconFactory.hpp @@ -0,0 +1,26 @@ +// 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 "ImageBox.hpp" +#include +#include + +namespace gui +{ + class ActiveIconFactory + { + app::Application *app; + + public: + explicit ActiveIconFactory(app::Application *app); + + [[nodiscard]] auto makeCustomIcon(const UTF8 &image, + std::function onActivated, + std::string bottomBarActivatedName) -> ImageBox *; + [[nodiscard]] auto makeSMSIcon(const utils::PhoneNumber::View &number) -> ImageBox *; + [[nodiscard]] auto makeCallIcon(const utils::PhoneNumber::View &number) -> ImageBox *; + [[nodiscard]] auto makeAddContactIcon(const std::shared_ptr &contact) -> ImageBox *; + }; +} // namespace gui diff --git a/module-apps/widgets/TextWithIconsWidget.cpp b/module-apps/widgets/TextWithIconsWidget.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1d0d36b1a3dc8048204c7eaa45898710c4b34efb --- /dev/null +++ b/module-apps/widgets/TextWithIconsWidget.cpp @@ -0,0 +1,40 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "TextWithIconsWidget.hpp" +#include +#include +#include +#include "Application.hpp" + +using namespace gui; + +TextWithIconsWidget::TextWithIconsWidget(gui::Item *parent) +{ + assert(parent); + setMinimumSize(style::window::default_body_width, style::widgets::h); + setEdges(gui::RectangleEdge::None); + setAlignment(Alignment(gui::Alignment::Horizontal::Right, gui::Alignment::Vertical::Center)); + parent->addWidget(this); +} +void TextWithIconsWidget::addIcon(ImageBox *icon) +{ + assert(icon); + icon->setMargins(Margins(0, 0, style::widgets::rightMargin, 0)); + addWidget(icon); + icons.push_back(icon); +} + +void TextWithIconsWidget::addText(const std::string &text, const UTF8 &font) +{ + auto numberText = new TextFixedSize(this, 0, 0, 0, 0); + numberText->setUnderline(false); + numberText->setMaximumSize(style::window::default_body_width, style::widgets::h); + numberText->setFont(font); + numberText->setEdges(gui::RectangleEdge::None); + numberText->setEditMode(EditMode::Browse); + numberText->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); + numberText->setMargins(Margins(style::widgets::leftMargin, 0, 0, 0)); + numberText->setRichText(text); + numberText->activeItem = false; +} diff --git a/module-apps/widgets/TextWithIconsWidget.hpp b/module-apps/widgets/TextWithIconsWidget.hpp new file mode 100644 index 0000000000000000000000000000000000000000..627e3a7bc92a1e21703cd78cd84f08cb485576d4 --- /dev/null +++ b/module-apps/widgets/TextWithIconsWidget.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 +namespace app +{ + class Application; +} + +namespace gui +{ + + class TextWithIconsWidget : public HBox + { + app::Application *app = nullptr; + + public: + explicit TextWithIconsWidget(gui::Item *parent); + + void addIcon(ImageBox *icon); + void addText(const std::string &text, const UTF8 &font); + + std::vector icons; + }; + +} /* namespace gui */ diff --git a/module-gui/gui/widgets/Style.hpp b/module-gui/gui/widgets/Style.hpp index 0dd1cd02ddd8e38cf0e073f236c6445115c25dc2..700e044e1935bf00edce4cb49b707e26e397fb04 100644 --- a/module-gui/gui/widgets/Style.hpp +++ b/module-gui/gui/widgets/Style.hpp @@ -259,4 +259,12 @@ namespace style inline constexpr auto default_left_text_padding = 10U; } // namespace padding + namespace widgets + { + inline constexpr auto h = 55U; + inline constexpr auto iconsSize = h; + inline constexpr auto leftMargin = 10U; + inline constexpr auto rightMargin = 10U; + } // namespace widgets + }; // namespace style