From 1c18ac422b0f5f21de408a66610c1ac6bb15258e Mon Sep 17 00:00:00 2001 From: rrandomsky Date: Sun, 17 Sep 2023 20:09:07 +0200 Subject: [PATCH] [MOS-195] Phone number input style unification Unification of input style for phone number. Now every time when the user will provide a phone number in gui the right function key (RF key) will be work as CLEAR. This means that if any number is in the phone number field, the RF key will remove the last character. Otherwise it'll work as typical BACK button. This changes also provide ability to add * and # sign to number. --- .../windows/NewMessage.cpp | 87 +++++++++++++++---- .../windows/NewMessage.hpp | 5 +- .../models/NewContactModel.cpp | 44 ++++++++-- .../models/NewContactModel.hpp | 4 + .../InputBoxWithLabelAndIconWidget.cpp | 6 +- .../InputBoxWithLabelAndIconWidget.hpp | 6 +- .../widgets/InputLinesWithLabelWidget.cpp | 22 ++++- .../widgets/InputLinesWithLabelWidget.hpp | 25 +++--- .../windows/PhonebookNewContact.cpp | 2 +- module-gui/gui/widgets/text/Text.cpp | 41 ++++++++- module-gui/gui/widgets/text/Text.hpp | 5 +- pure_changelog.md | 1 + 12 files changed, 201 insertions(+), 47 deletions(-) diff --git a/module-apps/application-messages/windows/NewMessage.cpp b/module-apps/application-messages/windows/NewMessage.cpp index 5b79b203000877f6a399d8d3be15263f41575aac..d942e9135b44d65a9cb76329d380e1c0e25470f1 100644 --- a/module-apps/application-messages/windows/NewMessage.cpp +++ b/module-apps/application-messages/windows/NewMessage.cpp @@ -46,14 +46,40 @@ namespace gui state.reset(); } - private: + protected: std::unique_ptr state; }; + class NewMessageWindow::RecipientMemento : public NewMessageWindow::MessageMemento + { + public: + void setState(const gui::Text *currentState, const std::shared_ptr chosenContact) + { + if (chosenContact != nullptr && !chosenContact->numbers.empty()) { + phoneNumberView = std::make_unique(chosenContact->numbers.at(0).number); + } + + MessageMemento::setState(currentState); + } + + void restoreState(gui::Text *currentState, utils::PhoneNumber::View *currentPhoneNumberView) + { + if (currentPhoneNumberView != nullptr && phoneNumberView != nullptr) { + *currentPhoneNumberView = *phoneNumberView; + phoneNumberView.reset(); + } + + MessageMemento::restoreState(currentState); + } + + private: + std::unique_ptr phoneNumberView; + }; + std::unique_ptr NewMessageWindow::mementoMessage = std::make_unique(); - std::unique_ptr NewMessageWindow::mementoRecipient = - std::make_unique(); + std::unique_ptr NewMessageWindow::mementoRecipient = + std::make_unique(); NewMessageWindow::NewMessageWindow(app::ApplicationCommon *app) : AppWindow(app, name::window::new_sms), app::AsyncCallbackReceiver{app} @@ -74,8 +100,10 @@ namespace gui void NewMessageWindow::onBeforeShow(ShowMode mode, SwitchData *data) { - mementoMessage->restoreState(message); - mementoRecipient->restoreState(recipient); + restoreMessageAndRecipientFromMemo(); + if (!recipient->isEmpty()) { + body->setFocusItem(message); + } if (data == nullptr) { return; } @@ -186,10 +214,14 @@ namespace gui navBar->setActive(nav_bar::Side::Left, false); if (recipient->getText().empty()) { navBar->setText(nav_bar::Side::Center, utils::translate(style::strings::common::contacts)); + navBar->setText(nav_bar::Side::Right, utils::translate(style::strings::common::back)); return; } navBar->setActive(nav_bar::Side::Center, false); + navBar->setText(nav_bar::Side::Right, utils::translate("app_call_clear")); + return; } + navBar->setText(nav_bar::Side::Right, utils::translate(style::strings::common::back)); } void NewMessageWindow::buildInterface() @@ -231,15 +263,15 @@ namespace gui }; recipient->inputCallback = [this]([[maybe_unused]] Item &, const InputEvent &inputEvent) -> bool { if (contact != nullptr) { - if (inputEvent.isShortRelease(KeyCode::KEY_PND)) { + if (inputEvent.isShortRelease(KeyCode::KEY_RF)) { recipient->clear(); return true; } - if (inputEvent.isDigit()) { + if (inputEvent.isDigit() || inputEvent.is(KeyCode::KEY_AST) || inputEvent.is(KeyCode::KEY_PND)) { return true; } } - if (inputEvent.isShortRelease(KeyCode::KEY_RF)) { + if (inputEvent.isShortRelease(KeyCode::KEY_RF) && recipient->isEmpty()) { onClose(CloseReason::WindowSwitch); } return false; @@ -288,6 +320,7 @@ namespace gui return true; }; message->focusChangedCallback = [=](Item &) -> bool { + navBar->setText(nav_bar::Side::Right, utils::translate(style::strings::common::back)); if (recipient->getText().empty()) { navBar->setActive(nav_bar::Side::Center, false); } @@ -301,8 +334,7 @@ namespace gui if (event.isShortRelease(KeyCode::KEY_LF)) { auto app = dynamic_cast(application); assert(app != nullptr); - mementoMessage->setState(message); - mementoRecipient->setState(recipient); + storeMessageAndRecipientInMemo(); return app->newMessageOptions(getName(), message); } if (event.isShortRelease(KeyCode::KEY_RF)) { @@ -312,7 +344,8 @@ namespace gui }; body->addWidget(message); body->addWidget(new Span(Axis::Y, body->getHeight())); - message->setText(""); // to set actual size of Text + recipient->setText(""); // to clean up before load from memo + message->setText(""); // to clean up before load from memo body->setEdges(gui::RectangleEdge::None); body->setVisible(true); @@ -322,14 +355,8 @@ namespace gui void NewMessageWindow::onClose(CloseReason reason) { - if (message->getText().empty()) { - // Nothing to do if text is empty. - return; - } - if (reason != CloseReason::ApplicationClose) { - mementoMessage->setState(message); - mementoRecipient->setState(recipient); + storeMessageAndRecipientInMemo(); message->clear(); return; } @@ -410,4 +437,28 @@ namespace gui message->clear(); } + void NewMessageWindow::storeMessageAndRecipientInMemo() + { + mementoMessage->setState(message); + mementoRecipient->setState(recipient, contact); + } + + void NewMessageWindow::restoreMessageAndRecipientFromMemo() + { + mementoMessage->restoreState(message); + mementoRecipient->restoreState(recipient, &phoneNumber); + + if (phoneNumber.getNonEmpty() == "") { + return; + } + + contact = DBServiceAPI::MatchContactByPhoneNumber(application, phoneNumber); + if (!contact || contact->isTemporary()) { + recipient->setText(phoneNumber.getFormatted()); + } + else { + recipient->setText(contact->getFormattedName()); + } + } + } // namespace gui diff --git a/module-apps/application-messages/windows/NewMessage.hpp b/module-apps/application-messages/windows/NewMessage.hpp index 8f737f67c4e63ae68aacb3029f959c1d3b5ca84c..e94c6922740cccabdd3109966e8d7314b76cccce 100644 --- a/module-apps/application-messages/windows/NewMessage.hpp +++ b/module-apps/application-messages/windows/NewMessage.hpp @@ -50,7 +50,10 @@ namespace gui /// MessageMemento shall be used whenever there is a need for temporary window switch in normal (uninterrupted) /// flow of new message preparation, such as using options or recipient selection. class MessageMemento; + class RecipientMemento; static std::unique_ptr mementoMessage; - static std::unique_ptr mementoRecipient; + static std::unique_ptr mementoRecipient; + void storeMessageAndRecipientInMemo(); + void restoreMessageAndRecipientFromMemo(); }; } /* namespace gui */ diff --git a/module-apps/application-phonebook/models/NewContactModel.cpp b/module-apps/application-phonebook/models/NewContactModel.cpp index 6fd9d73e739f5ed2df89df5da046a0492b4cc710..6913a232d59c8f01ac55278ee93fce65ce449b5d 100644 --- a/module-apps/application-phonebook/models/NewContactModel.cpp +++ b/module-apps/application-phonebook/models/NewContactModel.cpp @@ -4,9 +4,6 @@ #include "NewContactModel.hpp" #include "apps-common/windows/AppWindow.hpp" -#include "application-phonebook/widgets/ContactListItem.hpp" -#include "application-phonebook/widgets/InputBoxWithLabelAndIconWidget.hpp" -#include "application-phonebook/widgets/InputLinesWithLabelWidget.hpp" #include "application-phonebook/ApplicationPhonebook.hpp" #include @@ -37,13 +34,18 @@ auto NewContactModel::getItem(gui::Order order) -> gui::ListItem * void NewContactModel::createData() { - constexpr auto navBarOptionsLabelSide = gui::nav_bar::Side::Left; - auto app = application; + constexpr auto navBarOptionsLabelSide = gui::nav_bar::Side::Left; + constexpr auto navBarClearOrBackLabelSide = gui::nav_bar::Side::Right; + auto app = application; internalData.push_back(new gui::InputLinesWithLabelWidget( phonebookInternals::ListItemName::FirstName, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app, this](const UTF8 &text, bool isRFKeyFunctionAsClear) { + app->getCurrentWindow()->setNavBarText(text, navBarClearOrBackLabelSide); + isRFKeyForClearFunction = isRFKeyFunctionAsClear; + }, [app](const UTF8 &text, bool active) { app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); @@ -58,6 +60,10 @@ void NewContactModel::createData() phonebookInternals::ListItemName::SecondName, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app, this](const UTF8 &text, bool isRFKeyFunctionAsClear) { + app->getCurrentWindow()->setNavBarText(text, navBarClearOrBackLabelSide); + isRFKeyForClearFunction = isRFKeyFunctionAsClear; + }, [app](const UTF8 &text, bool active) { app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); @@ -72,6 +78,10 @@ void NewContactModel::createData() phonebookInternals::ListItemName::Number, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app, this](const UTF8 &text, bool isRFKeyFunctionAsClear) { + app->getCurrentWindow()->setNavBarText(text, navBarClearOrBackLabelSide); + isRFKeyForClearFunction = isRFKeyFunctionAsClear; + }, [app](const UTF8 &text, bool active) { app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); @@ -86,6 +96,10 @@ void NewContactModel::createData() phonebookInternals::ListItemName::SecondNumber, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app, this](const UTF8 &text, bool isRFKeyFunctionAsClear) { + app->getCurrentWindow()->setNavBarText(text, navBarClearOrBackLabelSide); + isRFKeyForClearFunction = isRFKeyFunctionAsClear; + }, [app](const UTF8 &text, bool active) { app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); @@ -100,6 +114,10 @@ void NewContactModel::createData() phonebookInternals::ListItemName::Email, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app, this](const UTF8 &text, bool isRFKeyFunctionAsClear) { + app->getCurrentWindow()->setNavBarText(text, navBarClearOrBackLabelSide); + isRFKeyForClearFunction = isRFKeyFunctionAsClear; + }, [app](const UTF8 &text, bool active) { app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); @@ -129,6 +147,10 @@ void NewContactModel::createData() phonebookInternals::ListItemName::Address, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app, this](const UTF8 &text, bool isRFKeyFunctionAsClear) { + app->getCurrentWindow()->setNavBarText(text, navBarClearOrBackLabelSide); + isRFKeyForClearFunction = isRFKeyFunctionAsClear; + }, [app](const UTF8 &text, bool active) { app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); @@ -144,6 +166,10 @@ void NewContactModel::createData() phonebookInternals::ListItemName::Note, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app, this](const UTF8 &text, bool isRFKeyFunctionAsClear) { + app->getCurrentWindow()->setNavBarText(text, navBarClearOrBackLabelSide); + isRFKeyForClearFunction = isRFKeyFunctionAsClear; + }, [app](const UTF8 &text, bool active) { app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); @@ -238,6 +264,10 @@ void NewContactModel::openTextOptions(gui::Text *text) bool NewContactModel::isAnyUnsavedChange(std::shared_ptr contactRecord) { for (const auto &item : internalData) { + if (auto itemInputWiget = dynamic_cast(item)) { + + itemInputWiget->inputText->isInputMode(InputMode::phone); + } if (item->onCheckUnsavedChangeCallback) { if (item->onCheckUnsavedChangeCallback(contactRecord)) { return true; @@ -246,3 +276,7 @@ bool NewContactModel::isAnyUnsavedChange(std::shared_ptr contactR } return false; // there is no change between already provided data and saved ones } +bool NewContactModel::isRightFunctionKeyForClearFunction() +{ + return isRFKeyForClearFunction; +} diff --git a/module-apps/application-phonebook/models/NewContactModel.hpp b/module-apps/application-phonebook/models/NewContactModel.hpp index 6e2304615d77e9f27be6feb4d5e69999fb995020..f2bf3fe0a585b8df057d468aa7214189728e9008 100644 --- a/module-apps/application-phonebook/models/NewContactModel.hpp +++ b/module-apps/application-phonebook/models/NewContactModel.hpp @@ -5,6 +5,8 @@ #include "application-phonebook/data/PhonebookItemData.hpp" #include "application-phonebook/widgets/ContactListItem.hpp" +#include "application-phonebook/widgets/InputBoxWithLabelAndIconWidget.hpp" +#include "application-phonebook/widgets/InputLinesWithLabelWidget.hpp" #include "InternalModel.hpp" #include "Application.hpp" @@ -16,6 +18,7 @@ class NewContactModel : public app::InternalModel, publi private: app::ApplicationCommon *application = nullptr; PhonebookItemData::RequestType requestType = PhonebookItemData::RequestType::Internal; + bool isRFKeyForClearFunction = false; // By default, is for BACK function void openTextOptions(gui::Text *text); @@ -29,6 +32,7 @@ class NewContactModel : public app::InternalModel, publi bool verifyData(); bool emptyData(); bool isAnyUnsavedChange(std::shared_ptr contactRecord); + bool isRightFunctionKeyForClearFunction(); [[nodiscard]] auto getRequestType() -> PhonebookItemData::RequestType; [[nodiscard]] auto requestRecordsCount() -> unsigned int override; diff --git a/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.cpp b/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.cpp index 28f986fc880b186ff71123ceab07c714ee0a70b2..a71d861815a77b313c9306dacbcb34dc5f404fae 100644 --- a/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.cpp +++ b/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.cpp @@ -15,9 +15,11 @@ namespace gui InputBoxWithLabelAndIconWidget::InputBoxWithLabelAndIconWidget( phonebookInternals::ListItemName listItemName, std::function navBarTemporaryMode, - std::function navBarRestoreFromTemporaryMode) + std::function navBarRestoreFromTemporaryMode, + std::function navBarSetRFKeyLabel) : listItemName(listItemName), navBarTemporaryMode(std::move(navBarTemporaryMode)), - navBarRestoreFromTemporaryMode(std::move(navBarRestoreFromTemporaryMode)) + navBarRestoreFromTemporaryMode(std::move(navBarRestoreFromTemporaryMode)), + navBarSetRFKeyLabel(std::move(navBarSetRFKeyLabel)) { setMinimumSize(phonebookStyle::inputBoxWithLabelAndIconIWidget::w, phonebookStyle::inputBoxWithLabelAndIconIWidget::h); diff --git a/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.hpp b/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.hpp index b80a292e0edbb77ab1c5b59bfef3546bf77f23a3..a9f83d6a77adf2f8d3472bda67559dd755fc8bf6 100644 --- a/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.hpp +++ b/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -22,7 +22,8 @@ namespace gui public: InputBoxWithLabelAndIconWidget(phonebookInternals::ListItemName listItemName, std::function navBarTemporaryMode = nullptr, - std::function navBarRestoreFromTemporaryMode = nullptr); + std::function navBarRestoreFromTemporaryMode = nullptr, + std::function navBarSetRFKeyLabel = nullptr); ~InputBoxWithLabelAndIconWidget() override = default; gui::HBox *hBox = nullptr; gui::Label *inputBoxLabel = nullptr; @@ -33,6 +34,7 @@ namespace gui private: std::function navBarTemporaryMode = nullptr; std::function navBarRestoreFromTemporaryMode = nullptr; + std::function navBarSetRFKeyLabel = nullptr; void applyItemNameSpecificSettings(); diff --git a/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.cpp b/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.cpp index 192847188e036c6fd2c475c9433ad05904a32ff4..c1d1e538609f689696ad3d163d08f11b5ec366ab 100644 --- a/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.cpp +++ b/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.cpp @@ -14,14 +14,15 @@ namespace gui phonebookInternals::ListItemName listItemName, const std::function &navBarTemporaryMode, const std::function &navBarRestoreFromTemporaryMode, + const std::function &navBarSetRFKeyLabel, const std::function &navBarSetOptionsLabel, const std::function &selectSpecialCharacter, const std::function restoreFunction)> &restoreInputMode, const std::function &inputOptions, - unsigned int lines) + std::uint32_t lines) : listItemName(listItemName), navBarTemporaryMode(navBarTemporaryMode), - navBarRestoreFromTemporaryMode(navBarRestoreFromTemporaryMode), navBarSetOptionsLabel(navBarSetOptionsLabel), - inputOptions(inputOptions) + navBarRestoreFromTemporaryMode(navBarRestoreFromTemporaryMode), navBarSetRFKeyLabel(navBarSetRFKeyLabel), + navBarSetOptionsLabel(navBarSetOptionsLabel), inputOptions(inputOptions) { setMinimumSize(phonebookStyle::inputLinesWithLabelWidget::w, phonebookStyle::inputLinesWithLabelWidget::title_label_h + @@ -78,6 +79,8 @@ namespace gui const auto optionsLabelState = !inputText->isEmpty() || Clipboard::getInstance().hasData(); this->navBarSetOptionsLabel(utils::translate(style::strings::common::options), optionsLabelState); } + + setRightFunctionKayLabel(); } else { inputText->setCursorStartPosition(CursorStartPosition::DocumentBegin); @@ -106,6 +109,8 @@ namespace gui } } + setRightFunctionKayLabel(); + return result; }; @@ -114,6 +119,7 @@ namespace gui return true; }; + applyItemNameSpecificSettings(); setEdges(RectangleEdge::None); } @@ -303,5 +309,15 @@ namespace gui return contact->note != inputText->getText(); }; } + void InputLinesWithLabelWidget::setRightFunctionKayLabel() + { + if (inputText != nullptr && inputText->isInputMode(InputMode::phone) && this->navBarSetRFKeyLabel && + !inputText->isEmpty()) { + navBarSetRFKeyLabel(utils::translate(utils::translate("app_call_clear")), true); + } + else { + navBarSetRFKeyLabel(utils::translate(style::strings::common::back), false); + } + } } /* namespace gui */ diff --git a/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.hpp b/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.hpp index 17488f3aa7eebe6d1e8ed70e97d535461b0f684a..715253911f81552a1d3026ef71bfe8190a15deb4 100644 --- a/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.hpp +++ b/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.hpp @@ -18,13 +18,14 @@ namespace gui public: explicit InputLinesWithLabelWidget( phonebookInternals::ListItemName listItemName, - const std::function &navBarTemporaryMode = nullptr, - const std::function &navBarRestoreFromTemporaryMode = nullptr, - const std::function &navBarSetOptionsLabel = nullptr, - const std::function &selectSpecialCharacter = nullptr, - const std::function restoreFunction)> &restoreInputMode = nullptr, - const std::function &inputOptions = nullptr, - unsigned int lines = 1); + const std::function &navBarTemporaryMode = nullptr, + const std::function &navBarRestoreFromTemporaryMode = nullptr, + const std::function &navBarSetRFKeyLabel = nullptr, + const std::function &navBarSetOptionsLabel = nullptr, + const std::function &selectSpecialCharacter = nullptr, + const std::function restoreFunction)> &restoreInputMode = nullptr, + const std::function &inputOptions = nullptr, + std::uint32_t lines = 1); VBox *vBox = nullptr; Label *titleLabel = nullptr; @@ -33,11 +34,13 @@ namespace gui private: phonebookInternals::ListItemName listItemName; void applyItemNameSpecificSettings(); + void setRightFunctionKayLabel(); - std::function navBarTemporaryMode = nullptr; - std::function navBarRestoreFromTemporaryMode = nullptr; - std::function navBarSetOptionsLabel = nullptr; - std::function inputOptions = nullptr; + std::function navBarTemporaryMode = nullptr; + std::function navBarRestoreFromTemporaryMode = nullptr; + std::function navBarSetRFKeyLabel = nullptr; + std::function navBarSetOptionsLabel = nullptr; + std::function inputOptions = nullptr; void firstNameHandler(); void secondNameHandler(); diff --git a/module-apps/application-phonebook/windows/PhonebookNewContact.cpp b/module-apps/application-phonebook/windows/PhonebookNewContact.cpp index bae32a4044b0ae1f2bafe48cd0dfeefb1eb12288..3834d9327c28be5089451a0731b5ac609936710b 100644 --- a/module-apps/application-phonebook/windows/PhonebookNewContact.cpp +++ b/module-apps/application-phonebook/windows/PhonebookNewContact.cpp @@ -151,7 +151,7 @@ namespace gui return true; } else if (!inputEvent.isShortRelease(KeyCode::KEY_RF) || !shouldCurrentAppBeIgnoredOnSwitchBack()) { - if (isAnyUnsavedUserDataInWindow()) { + if (!newContactModel->isRightFunctionKeyForClearFunction() && isAnyUnsavedUserDataInWindow()) { if (inputEvent.isShortRelease(gui::KeyCode::KEY_RF) || inputEvent.isLongRelease(gui::KeyCode::KEY_RF)) { showDialogUnsavedChanges([this]() { application->returnToPreviousWindow(); diff --git a/module-gui/gui/widgets/text/Text.cpp b/module-gui/gui/widgets/text/Text.cpp index 8892daa6bbfe7ff3fede5f0e007d2fc4d62060b9..3c03498ba63885df81782c053ad2fd95f73ac043 100644 --- a/module-gui/gui/widgets/text/Text.cpp +++ b/module-gui/gui/widgets/text/Text.cpp @@ -360,6 +360,19 @@ namespace gui this->inputMode = mode; } + bool Text::isInputMode(InputMode::Mode mode) + { + if (inputMode == nullptr) { + LOG_WARN("Pointer to inputMode is set as nullptr"); + return false; + } + + if (inputMode->is(mode)) { + return true; + } + return false; + } + std::string Text::getInputModeKeyMap() { if (inputMode == nullptr) { @@ -546,7 +559,8 @@ namespace gui auto Text::handleRotateInputMode(const InputEvent &inputEvent) -> bool { - if (inputMode != nullptr && inputEvent.isShortRelease(gui::KeyCode::KEY_AST)) { + if (inputMode != nullptr && !inputMode->is(InputMode::phone) && + inputEvent.isShortRelease(gui::KeyCode::KEY_AST)) { inputMode->next(); return true; } @@ -572,6 +586,9 @@ namespace gui auto Text::handleActivation(const InputEvent &inputEvent) -> bool { + if (inputMode && inputMode->is(InputMode::phone)) { + return false; + } return inputEvent.isShortRelease(KeyCode::KEY_AST) && Rect::onActivated(nullptr); } @@ -637,7 +654,13 @@ namespace gui if (!isMode(EditMode::Edit)) { return false; } - if (inputEvent.isShortRelease(removeKey)) { + + if (document->isEmpty() && inputMode->is(InputMode::phone)) { + return false; + } + + auto removeKeyCode = inputMode->is(InputMode::phone) ? removeKeyForPhone : removeKey; + if (inputEvent.isShortRelease(removeKeyCode)) { setCursorStartPosition(CursorStartPosition::Offset); @@ -655,7 +678,9 @@ namespace gui if (!isMode(EditMode::Edit)) { return false; } - if (inputEvent.isLongRelease(removeKey)) { + + auto removeKeyCode = inputMode->is(InputMode::phone) ? removeKeyForPhone : removeKey; + if (inputEvent.isLongRelease(removeKeyCode)) { if (!document->isEmpty()) { removeFromCursor(); return true; @@ -1034,6 +1059,16 @@ namespace gui return false; } + bool Text::removeWholeText() + { + bool returnValue = false; + while (!document->isEmpty()) { + cursor->removeChar(); + returnValue = true; + } + return returnValue; + } + void Text::onTextChanged() { if (textChangedCallback) { diff --git a/module-gui/gui/widgets/text/Text.hpp b/module-gui/gui/widgets/text/Text.hpp index 66c2b97d6b073a1d662440c5297c592658465abf..220f9901b4292d5b20ebd9925ebac8e7f84bb04d 100644 --- a/module-gui/gui/widgets/text/Text.hpp +++ b/module-gui/gui/widgets/text/Text.hpp @@ -29,7 +29,8 @@ namespace gui unsigned int cursorPos; }; - constexpr KeyCode removeKey = KeyCode::KEY_PND; + constexpr KeyCode removeKey = KeyCode::KEY_PND; + constexpr KeyCode removeKeyForPhone = KeyCode::KEY_RF; /// @brief Widget that holds multiple lines of text. /// @@ -171,6 +172,7 @@ namespace gui /// move ownership of mode ptr to Text void setInputMode(InputMode *&&mode); + bool isInputMode(InputMode::Mode mode); std::string getInputModeKeyMap(); InputMode::Mode detectInputMode(); @@ -209,6 +211,7 @@ namespace gui bool addChar(std::uint32_t utf8); bool removeChar(); + bool removeWholeText(); void onTextChanged(); void setTextChangedCallback(TextChangedCallback &&callback); }; diff --git a/pure_changelog.md b/pure_changelog.md index c76bbddfeda088f2c1ddb2c0b81ba9a33b1c81ec..20e968d7bca00800818e5baa716470bcdcd71c48 100644 --- a/pure_changelog.md +++ b/pure_changelog.md @@ -47,6 +47,7 @@ * Fixed losing unsaved user data when tethering is switching on * Fixed invalid elapsed time in music player after playing and pausing track from songs list view * Fixed disappearing "Call" label in Phonebook app +* Fixed phone number input style unification ## [1.7.2 2023-07-28]