From 53e2fae8fbf21cd87194a0ba39b37dbe36761231 Mon Sep 17 00:00:00 2001 From: Lefucjusz Date: Mon, 13 Mar 2023 15:53:59 +0100 Subject: [PATCH] [MOS-178] Add input mode displaying timeout Added timeout for displaying selected input mode - now it automatically disappears after 3 seconds since last change was made. --- .../windows/MmiPullWindow.cpp | 5 +- .../widgets/SMSInputWidget.cpp | 5 +- .../windows/NewMessage.cpp | 5 +- .../windows/SearchStart.cpp | 10 ++- .../windows/NoteEditWindow.cpp | 7 +- .../windows/SearchEngineWindow.cpp | 10 ++- .../models/NewContactModel.cpp | 66 ++++++++++++++++--- .../models/NewContactModel.hpp | 4 +- .../widgets/InputLinesWithLabelWidget.cpp | 24 ++++--- .../widgets/InputLinesWithLabelWidget.hpp | 5 +- .../windows/PhonebookMainWindow.cpp | 12 ++-- .../windows/PhonebookNewContact.cpp | 9 +-- .../windows/PhonebookSearch.cpp | 5 +- .../models/network/NewApnModel.cpp | 35 ++++++++-- .../widgets/network/ApnInputWidget.cpp | 16 +++-- .../widgets/network/ApnInputWidget.hpp | 16 +++-- .../windows/advanced/UITestWindow.cpp | 14 ++-- .../windows/bluetooth/PhoneNameWindow.cpp | 10 ++- .../display-keypad/QuotesAddWindow.cpp | 7 +- module-apps/apps-common/windows/AppWindow.cpp | 12 ++++ module-apps/apps-common/windows/AppWindow.hpp | 8 ++- .../windows/AppWindowConstants.hpp | 16 +++-- .../gui/widgets/text/modes/InputMode.cpp | 28 ++++---- .../gui/widgets/text/modes/InputMode.hpp | 16 +++-- pure_changelog.md | 1 + 25 files changed, 252 insertions(+), 94 deletions(-) diff --git a/module-apps/application-desktop/windows/MmiPullWindow.cpp b/module-apps/application-desktop/windows/MmiPullWindow.cpp index dbe8ea11e326c468adad1a536722e2f2c9a28ffd..58e5d0f16a4f5acc393319095c0c48d52a45048a 100644 --- a/module-apps/application-desktop/windows/MmiPullWindow.cpp +++ b/module-apps/application-desktop/windows/MmiPullWindow.cpp @@ -60,7 +60,10 @@ MmiPullWindow::MmiPullWindow(app::ApplicationCommon *app, const std::string &nam {InputMode::digit, InputMode::Abc, InputMode::ABC, InputMode::abc}, [=](const UTF8 &text1) { navBarTemporaryMode(text1); }, [=]() { navBarRestoreFromTemporaryMode(); }, - [=]() { selectSpecialCharacter(); })); + [=]() { selectSpecialCharacter(); }, + [=](std::function restoreFunction) { + application->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); addWidget(InputBox); } diff --git a/module-apps/application-messages/widgets/SMSInputWidget.cpp b/module-apps/application-messages/widgets/SMSInputWidget.cpp index 02b14f4f5b1994fd7b892c57097f6f38be17462f..8ec8515c6e18c8db8e2505508425bf3046ee5d01 100644 --- a/module-apps/application-messages/widgets/SMSInputWidget.cpp +++ b/module-apps/application-messages/widgets/SMSInputWidget.cpp @@ -57,7 +57,10 @@ namespace gui {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, [=](const UTF8 &Text) { application->getCurrentWindow()->navBarTemporaryMode(Text); }, [=]() { application->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, - [=]() { application->getCurrentWindow()->selectSpecialCharacter(); })); + [=]() { application->getCurrentWindow()->selectSpecialCharacter(); }, + [=](std::function restoreFunction) { + application->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); inputText->inputCallback = [this, application]([[maybe_unused]] Item &, const InputEvent &event) { if (event.isShortRelease(KeyCode::KEY_LF)) { diff --git a/module-apps/application-messages/windows/NewMessage.cpp b/module-apps/application-messages/windows/NewMessage.cpp index c9df71161794a71087fc83b621f44a5647a9402d..153adc6314716593410aad91201cd2473cb9676d 100644 --- a/module-apps/application-messages/windows/NewMessage.cpp +++ b/module-apps/application-messages/windows/NewMessage.cpp @@ -264,7 +264,10 @@ namespace gui {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, [=](const UTF8 &text) { navBarTemporaryMode(text); }, [=]() { navBarRestoreFromTemporaryMode(); }, - [=]() { selectSpecialCharacter(); })); + [=]() { selectSpecialCharacter(); }, + [=](std::function restoreFunction) { + application->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); message->setPenFocusWidth(style::window::default_border_focus_w); message->setPenWidth(style::window::default_border_rect_no_focus); message->setFont(style::window::font::medium); diff --git a/module-apps/application-messages/windows/SearchStart.cpp b/module-apps/application-messages/windows/SearchStart.cpp index e2fa83523d64ee3a929a03c1cf2a02a512bebfd0..c3a788fa9ba79ed874256a9f3072eb35258f1bab 100644 --- a/module-apps/application-messages/windows/SearchStart.cpp +++ b/module-apps/application-messages/windows/SearchStart.cpp @@ -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 #include "ApplicationMessages.hpp" @@ -23,12 +23,16 @@ namespace gui body = new gui::Item(); body->setBoundingBox(bodySize()); addWidget(body); - auto text = inputBox(this, utils::translate("common_search_uc"), "search_32px_W_G"); + + const auto text = inputBox(this, utils::translate("common_search_uc"), "search_32px_W_G"); text->setInputMode(new InputMode( {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, [=](const UTF8 &Text) { application->getCurrentWindow()->navBarTemporaryMode(Text); }, [=]() { application->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, - [=]() { application->getCurrentWindow()->selectSpecialCharacter(); })); + [=]() { application->getCurrentWindow()->selectSpecialCharacter(); }, + [=](std::function restoreFunction) { + application->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); inputCallback = [=](Item &, const InputEvent &inputEvent) -> bool { auto app = dynamic_cast(application); diff --git a/module-apps/application-notes/windows/NoteEditWindow.cpp b/module-apps/application-notes/windows/NoteEditWindow.cpp index ab9ec6feddb823f263a50c623389580a5f087b10..98f9d92099d29199226b0b77ad2755d2e327d006 100644 --- a/module-apps/application-notes/windows/NoteEditWindow.cpp +++ b/module-apps/application-notes/windows/NoteEditWindow.cpp @@ -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 #include "NoteEditWindow.hpp" @@ -75,7 +75,10 @@ namespace app::notes {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, [=](const UTF8 &text) { navBarTemporaryMode(text); }, [=]() { navBarRestoreFromTemporaryMode(); }, - [=]() { selectSpecialCharacter(); })); + [=]() { selectSpecialCharacter(); }, + [=](std::function restoreFunction) { + application->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); edit->setTextChangedCallback([this](Item &, const UTF8 &text) { const auto count = text.length(); setCharactersCount(count); diff --git a/module-apps/application-notes/windows/SearchEngineWindow.cpp b/module-apps/application-notes/windows/SearchEngineWindow.cpp index 02b77cb77dd58c970c8149f509770e8f759d0220..2836dbade2366e2bf57118a5980107e5e3160024 100644 --- a/module-apps/application-notes/windows/SearchEngineWindow.cpp +++ b/module-apps/application-notes/windows/SearchEngineWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, 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 #include "SearchEngineWindow.hpp" @@ -35,6 +35,14 @@ namespace app::notes navBar->setText(gui::nav_bar::Side::Right, utils::translate(style::strings::common::back)); input = gui::inputBox(this, utils::translate("common_search_uc"), "search_32px_W_G"); + input->setInputMode(new InputMode( + {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, + [=](const UTF8 &text) { application->getCurrentWindow()->navBarTemporaryMode(text); }, + [=]() { application->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [=]() { application->getCurrentWindow()->selectSpecialCharacter(); }, + [=](std::function restoreFunction) { + application->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); setFocusItem(input); } diff --git a/module-apps/application-phonebook/models/NewContactModel.cpp b/module-apps/application-phonebook/models/NewContactModel.cpp index 46b261873bd3df6c897b09888a6bf0ec6475d2f5..625606455e0b3fc520a0e234291c30b2d64de3d1 100644 --- a/module-apps/application-phonebook/models/NewContactModel.cpp +++ b/module-apps/application-phonebook/models/NewContactModel.cpp @@ -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 #include "NewContactModel.hpp" @@ -24,7 +24,7 @@ auto NewContactModel::getMinimalItemSpaceRequired() const -> unsigned int return phonebookStyle::inputLinesWithLabelWidget::h; } -void NewContactModel::requestRecords(const uint32_t offset, const uint32_t limit) +void NewContactModel::requestRecords(const std::uint32_t offset, const std::uint32_t limit) { setupModel(offset, limit); list->onProviderDataUpdate(); @@ -37,41 +37,77 @@ auto NewContactModel::getItem(gui::Order order) -> gui::ListItem * void NewContactModel::createData() { + constexpr auto navBarOptionsLabelSide = gui::nav_bar::Side::Left; 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](const UTF8 &text, bool active) { + app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); + app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); + }, [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + }, [&](gui::Text *text) { openTextOptions(text); })); internalData.push_back(new gui::InputLinesWithLabelWidget( phonebookInternals::ListItemName::SecondName, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app](const UTF8 &text, bool active) { + app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); + app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); + }, [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + }, [&](gui::Text *text) { openTextOptions(text); })); internalData.push_back(new gui::InputLinesWithLabelWidget( phonebookInternals::ListItemName::Number, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app](const UTF8 &text, bool active) { + app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); + app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); + }, [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + }, [&](gui::Text *text) { openTextOptions(text); })); internalData.push_back(new gui::InputLinesWithLabelWidget( phonebookInternals::ListItemName::SecondNumber, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app](const UTF8 &text, bool active) { + app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); + app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); + }, [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + }, [&](gui::Text *text) { openTextOptions(text); })); internalData.push_back(new gui::InputLinesWithLabelWidget( phonebookInternals::ListItemName::Email, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app](const UTF8 &text, bool active) { + app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); + app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); + }, [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + }, [&](gui::Text *text) { openTextOptions(text); })); internalData.push_back(new gui::InputBoxWithLabelAndIconWidget( @@ -93,7 +129,14 @@ void NewContactModel::createData() phonebookInternals::ListItemName::Address, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app](const UTF8 &text, bool active) { + app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); + app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); + }, [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + }, [&](gui::Text *text) { openTextOptions(text); }, 2)); @@ -101,7 +144,14 @@ void NewContactModel::createData() phonebookInternals::ListItemName::Note, [app](const UTF8 &text, bool emptyOthers) { app->getCurrentWindow()->navBarTemporaryMode(text, emptyOthers); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + [app](const UTF8 &text, bool active) { + app->getCurrentWindow()->setNavBarText(text, navBarOptionsLabelSide); + app->getCurrentWindow()->setNavBarActive(navBarOptionsLabelSide, active); + }, [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + }, [&](gui::Text *text) { openTextOptions(text); }, 2)); @@ -118,7 +168,7 @@ void NewContactModel::clearData() bool NewContactModel::verifyData() { - for (auto item : internalData) { + for (const auto &item : internalData) { if (item->onVerifyCallback) { std::string errorMessage; if (!item->onVerifyCallback(errorMessage)) { @@ -143,7 +193,7 @@ bool NewContactModel::verifyData() void NewContactModel::saveData(std::shared_ptr contactRecord) { - for (auto item : internalData) { + for (const auto &item : internalData) { if (item->onSaveCallback) { item->onSaveCallback(contactRecord); } @@ -152,20 +202,20 @@ void NewContactModel::saveData(std::shared_ptr contactRecord) void NewContactModel::loadData(std::shared_ptr contactRecord, gui::SwitchData *data) { - for (auto item : internalData) { + for (const auto &item : internalData) { if (item->onLoadCallback) { item->onLoadCallback(contactRecord); } } - if (auto message = dynamic_cast(data); message != nullptr) { + if (const auto message = dynamic_cast(data); message != nullptr) { requestType = message->getRequestType(); } } bool NewContactModel::emptyData() { - for (auto item : internalData) { + for (const auto &item : internalData) { if (item->onEmptyCallback) { if (!item->onEmptyCallback()) { return false; @@ -182,6 +232,6 @@ bool NewContactModel::emptyData() void NewContactModel::openTextOptions(gui::Text *text) { - std::unique_ptr data = std::make_unique(text); + auto data = std::make_unique(text); application->switchWindow(gui::window::name::input_options, std::move(data)); } diff --git a/module-apps/application-phonebook/models/NewContactModel.hpp b/module-apps/application-phonebook/models/NewContactModel.hpp index 68e32a0f6e029d2c23a29f98e7e9eed3486dc6d1..43474d548312be3fc64c2b1acd0d35a9c0a69ac8 100644 --- a/module-apps/application-phonebook/models/NewContactModel.hpp +++ b/module-apps/application-phonebook/models/NewContactModel.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 @@ -34,5 +34,5 @@ class NewContactModel : public app::InternalModel, publi [[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; + void requestRecords(std::uint32_t offset, std::uint32_t limit) override; }; diff --git a/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.cpp b/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.cpp index ef718a98604610f55dddff18b4b7f20725072c6c..f68e7cb70b02d2c0faa502116ee1fe87a345ff88 100644 --- a/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.cpp +++ b/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.cpp @@ -14,11 +14,14 @@ namespace gui phonebookInternals::ListItemName listItemName, const std::function &navBarTemporaryMode, const std::function &navBarRestoreFromTemporaryMode, + const std::function &navBarSetOptionsLabel, const std::function &selectSpecialCharacter, + const std::function restoreFunction)> &restoreInputMode, const std::function &inputOptions, unsigned int lines) : listItemName(listItemName), navBarTemporaryMode(navBarTemporaryMode), - navBarRestoreFromTemporaryMode(navBarRestoreFromTemporaryMode), inputOptions(inputOptions) + navBarRestoreFromTemporaryMode(navBarRestoreFromTemporaryMode), navBarSetOptionsLabel(navBarSetOptionsLabel), + inputOptions(inputOptions) { setMinimumSize(phonebookStyle::inputLinesWithLabelWidget::w, phonebookStyle::inputLinesWithLabelWidget::title_label_h + @@ -55,7 +58,8 @@ namespace gui {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, [=](const UTF8 &text) { this->navBarTemporaryMode(text, true); }, [=]() { this->navBarRestoreFromTemporaryMode(); }, - [=]() { selectSpecialCharacter(); })); + [=]() { selectSpecialCharacter(); }, + [=](std::function restoreFunction) { restoreInputMode(std::move(restoreFunction)); })); inputText->setPenFocusWidth(style::window::default_border_focus_w); inputText->setPenWidth(style::window::default_border_no_focus_w); inputText->setEditMode(EditMode::Edit); @@ -70,8 +74,9 @@ namespace gui inputText->setUnderlineThickness(style::window::default_border_focus_w); inputText->setFont(style::window::font::mediumbold); - if (!inputText->isEmpty() || Clipboard::getInstance().gotData()) { - this->navBarTemporaryMode(utils::translate(style::strings::common::options), false); + if (this->navBarSetOptionsLabel) { + const auto optionsLabelState = !inputText->isEmpty() || Clipboard::getInstance().gotData(); + this->navBarSetOptionsLabel(utils::translate(style::strings::common::options), optionsLabelState); } } else { @@ -79,16 +84,19 @@ namespace gui inputText->setUnderlineThickness(style::window::default_border_rect_no_focus); inputText->setFont(style::window::font::medium); - this->navBarRestoreFromTemporaryMode(); + if (this->navBarSetOptionsLabel) { + this->navBarSetOptionsLabel(utils::translate(style::strings::common::options), false); + } } return true; }; inputCallback = [&](Item &item, const InputEvent &event) { - auto result = inputText->onInput(event); + const auto result = inputText->onInput(event); - if (!event.is(KeyCode::KEY_AST) && (!inputText->isEmpty() || Clipboard::getInstance().gotData())) { - this->navBarTemporaryMode(utils::translate(style::strings::common::options), false); + if (!event.is(KeyCode::KEY_AST) && this->navBarSetOptionsLabel) { + const auto optionsLabelState = !inputText->isEmpty() || Clipboard::getInstance().gotData(); + this->navBarSetOptionsLabel(utils::translate(style::strings::common::options), optionsLabelState); } if (event.isShortRelease(gui::KeyCode::KEY_LF) && diff --git a/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.hpp b/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.hpp index da7570488fb7686825e73431272686feeef6a60a..17488f3aa7eebe6d1e8ed70e97d535461b0f684a 100644 --- a/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.hpp +++ b/module-apps/application-phonebook/widgets/InputLinesWithLabelWidget.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, 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 @@ -20,7 +20,9 @@ namespace gui 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); @@ -34,6 +36,7 @@ namespace gui std::function navBarTemporaryMode = nullptr; std::function navBarRestoreFromTemporaryMode = nullptr; + std::function navBarSetOptionsLabel = nullptr; std::function inputOptions = nullptr; void firstNameHandler(); diff --git a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp index a0bc7a185fad610169bcc2a94e80ba67e6f1ea3e..122666bd68f56fdfe9d68548f8e0ff73ec82edad 100644 --- a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp +++ b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp @@ -11,7 +11,6 @@ #include
#include
#include -#include #include namespace gui @@ -64,15 +63,18 @@ namespace gui contactsList->emptyListCallback = [this]() { onEmptyList(); }; contactsList->notEmptyListCallback = [this]() { onListFilled(); }; - phonebookModel->setDisplayMode(static_cast(ContactDisplayMode::SortedByLetter)); + phonebookModel->setDisplayMode(static_cast(ContactDisplayMode::SortedByLetter)); contactsList->rebuildList(gui::listview::RebuildType::Full); - auto app = application; - inputMode = std::make_unique( + const auto app = application; + inputMode = std::make_unique( std::list{InputMode::ABC, InputMode::abc}, [app](const UTF8 &text) { app->getCurrentWindow()->navBarTemporaryMode(text); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, - [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }); + [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + }); } void PhonebookMainWindow::destroyInterface() diff --git a/module-apps/application-phonebook/windows/PhonebookNewContact.cpp b/module-apps/application-phonebook/windows/PhonebookNewContact.cpp index c532b576a4b5c9f93f2e64dd569c7981f822f2c4..269c5dc30aa9d5466113b582825c1b525d5fe52e 100644 --- a/module-apps/application-phonebook/windows/PhonebookNewContact.cpp +++ b/module-apps/application-phonebook/windows/PhonebookNewContact.cpp @@ -90,7 +90,7 @@ namespace gui return false; } - auto *item = dynamic_cast(data); + const auto item = dynamic_cast(data); if (item == nullptr) { return false; } @@ -146,7 +146,6 @@ namespace gui auto PhonebookNewContact::verifyAndSave() -> bool { - LOG_DEBUG("%s", __FUNCTION__); if (!contact->isTemporary()) { auto result = DBServiceAPI::verifyContact(application, *contact); switch (result) { @@ -194,8 +193,7 @@ namespace gui } } - std::unique_ptr data = - std::make_unique(contact, newContactModel->getRequestType()); + auto data = std::make_unique(contact, newContactModel->getRequestType()); data->ignoreCurrentWindowOnStack = true; application->switchWindow(gui::window::name::contact, std::move(data)); return true; @@ -273,8 +271,7 @@ namespace gui auto metaData = std::make_unique(gui::DialogMetadata{ contact->getFormattedName(ContactRecord::NameFormatType::Title), icon, text, "", [=]() -> bool { - std::unique_ptr data = - std::make_unique(contact, newContactModel->getRequestType()); + auto data = std::make_unique(contact, newContactModel->getRequestType()); this->application->switchWindow(gui::name::window::main_window, std::move(data)); return true; diff --git a/module-apps/application-phonebook/windows/PhonebookSearch.cpp b/module-apps/application-phonebook/windows/PhonebookSearch.cpp index 512856da43481cef4b9f5e1512b4351b1cd5b405..82bbf8755d4a70aeadb213b8976b8bf40951ea26 100644 --- a/module-apps/application-phonebook/windows/PhonebookSearch.cpp +++ b/module-apps/application-phonebook/windows/PhonebookSearch.cpp @@ -24,7 +24,10 @@ namespace gui {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, [=](const UTF8 &Text) { application->getCurrentWindow()->navBarTemporaryMode(Text); }, [=]() { application->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, - [=]() { application->getCurrentWindow()->selectSpecialCharacter(); })); + [=]() { application->getCurrentWindow()->selectSpecialCharacter(); }, + [=](std::function restoreFunction) { + application->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); navBar->setActive(nav_bar::Side::Left, false); navBar->setActive(nav_bar::Side::Center, true); diff --git a/module-apps/application-settings/models/network/NewApnModel.cpp b/module-apps/application-settings/models/network/NewApnModel.cpp index 02b895f7c37ffd4060e64a9b6acea4ad68656778..3fba42c1fa30135676a9786d294f4e5ff86220b9 100644 --- a/module-apps/application-settings/models/network/NewApnModel.cpp +++ b/module-apps/application-settings/models/network/NewApnModel.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, 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 #include "NewApnModel.hpp" @@ -43,43 +43,64 @@ void NewApnModel::createData() [app](const UTF8 &text) { app->getCurrentWindow()->navBarTemporaryMode(text); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + }, [this](const std::string &text) { this->apnNameChanged(text); })); internalData.emplace_back(new gui::ApnInputWidget( settingsInternals::ListItemName::APN, [app](const UTF8 &text) { app->getCurrentWindow()->navBarTemporaryMode(text); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, - [app]() { app->getCurrentWindow()->selectSpecialCharacter(); })); + [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); internalData.emplace_back(new gui::ApnInputWidget( settingsInternals::ListItemName::Username, [app](const UTF8 &text) { app->getCurrentWindow()->navBarTemporaryMode(text); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, - [app]() { app->getCurrentWindow()->selectSpecialCharacter(); })); + [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); internalData.emplace_back(new gui::ApnInputWidget( settingsInternals::ListItemName::Password, [app](const UTF8 &text) { app->getCurrentWindow()->navBarTemporaryMode(text); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, - [app]() { app->getCurrentWindow()->selectSpecialCharacter(); })); + [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); internalData.emplace_back(new gui::ApnInputWidget( settingsInternals::ListItemName::AuthType, [app](const UTF8 &text) { app->getCurrentWindow()->navBarTemporaryMode(text); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, - [app]() { app->getCurrentWindow()->selectSpecialCharacter(); })); + [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); internalData.emplace_back(new gui::ApnInputWidget( settingsInternals::ListItemName::ApnType, [app](const UTF8 &text) { app->getCurrentWindow()->navBarTemporaryMode(text); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, - [app]() { app->getCurrentWindow()->selectSpecialCharacter(); })); + [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); internalData.emplace_back(new gui::ApnInputWidget( settingsInternals::ListItemName::ApnProtocol, [app](const UTF8 &text) { app->getCurrentWindow()->navBarTemporaryMode(text); }, [app]() { app->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, - [app]() { app->getCurrentWindow()->selectSpecialCharacter(); })); + [app]() { app->getCurrentWindow()->selectSpecialCharacter(); }, + [app](std::function restoreFunction) { + app->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); for (auto item : internalData) { item->deleteByList = false; diff --git a/module-apps/application-settings/widgets/network/ApnInputWidget.cpp b/module-apps/application-settings/widgets/network/ApnInputWidget.cpp index f2f0a8f1aec4021c2c1d2b7b70514a51d5680324..a53c7c9a7b4be358b088eaea4aa16d952675fd49 100644 --- a/module-apps/application-settings/widgets/network/ApnInputWidget.cpp +++ b/module-apps/application-settings/widgets/network/ApnInputWidget.cpp @@ -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 #include "ApnInputWidget.hpp" @@ -11,12 +11,13 @@ namespace gui { ApnInputWidget::ApnInputWidget(settingsInternals::ListItemName listItemName, - std::function navBarTemporaryMode, - std::function navBarRestoreFromTemporaryMode, - std::function selectSpecialCharacter, - std::function contentChanged, + const std::function &navBarTemporaryMode, + const std::function &navBarRestoreFromTemporaryMode, + const std::function &selectSpecialCharacter, + const std::function restoreFunction)> &restoreInputMode, + const std::function &contentChanged, unsigned int lines) - : listItemName(listItemName), checkTextContent(std::move(contentChanged)) + : listItemName(listItemName), checkTextContent(contentChanged) { setMinimumSize(style::settings::widget::apnInputWidget::w, style::settings::widget::apnInputWidget::title_label_h + @@ -49,7 +50,8 @@ namespace gui {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, [=](const UTF8 &text) { navBarTemporaryMode(text); }, [=]() { navBarRestoreFromTemporaryMode(); }, - [=]() { selectSpecialCharacter(); })); + [=]() { selectSpecialCharacter(); }, + [=](std::function restoreFunction) { restoreInputMode(std::move(restoreFunction)); })); inputText->setPenFocusWidth(style::window::default_border_focus_w); inputText->setPenWidth(style::window::default_border_no_focus_w); inputText->setEditMode(EditMode::Edit); diff --git a/module-apps/application-settings/widgets/network/ApnInputWidget.hpp b/module-apps/application-settings/widgets/network/ApnInputWidget.hpp index 9a0413ede2fbe60cbdad865bf7b751d074cee6ef..cdad2c6bbe43d8392195b12f9a40676edd1f4cfa 100644 --- a/module-apps/application-settings/widgets/network/ApnInputWidget.hpp +++ b/module-apps/application-settings/widgets/network/ApnInputWidget.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2021, 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 @@ -16,12 +16,14 @@ namespace gui settingsInternals::ListItemName listItemName; public: - ApnInputWidget(settingsInternals::ListItemName listItemName, - std::function navBarTemporaryMode = nullptr, - std::function navBarRestoreFromTemporaryMode = nullptr, - std::function selectSpecialCharacter = nullptr, - std::function contentChanged = nullptr, - unsigned int lines = 1); + explicit ApnInputWidget( + settingsInternals::ListItemName listItemName, + const std::function &navBarTemporaryMode = nullptr, + const std::function &navBarRestoreFromTemporaryMode = nullptr, + const std::function &selectSpecialCharacter = nullptr, + const std::function restoreFunction)> &restoreInputMode = nullptr, + const std::function &contentChanged = nullptr, + unsigned int lines = 1); private: VBox *vBox = nullptr; diff --git a/module-apps/application-settings/windows/advanced/UITestWindow.cpp b/module-apps/application-settings/windows/advanced/UITestWindow.cpp index dfcf8c06f573e96c11ac2a3e2913d883fcf1140a..5e6cd25ca3dc61b869288159e3a4c7f137dc440f 100644 --- a/module-apps/application-settings/windows/advanced/UITestWindow.cpp +++ b/module-apps/application-settings/windows/advanced/UITestWindow.cpp @@ -1,16 +1,13 @@ -// 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 #include "UITestWindow.hpp" - -#include - #include #include +#include namespace gui { - UiTestWindow::UiTestWindow(app::ApplicationCommon *app) : AppWindow(app, "TEST_UI") { AppWindow::buildInterface(); @@ -55,9 +52,12 @@ namespace gui text->addText(TextBlock("special chars too", Font(27).raw(), TextBlock::End::None)); text->setInputMode(new InputMode( {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, - [=](const UTF8 &text) { navBarTemporaryMode(text); }, + [=](const UTF8 &temporaryText) { navBarTemporaryMode(temporaryText); }, [=]() { navBarRestoreFromTemporaryMode(); }, - [=]() { selectSpecialCharacter(); })); + [=]() { selectSpecialCharacter(); }, + [=](std::function restoreFunction) { + application->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); text->setPenFocusWidth(0); setFocusItem(text); } diff --git a/module-apps/application-settings/windows/bluetooth/PhoneNameWindow.cpp b/module-apps/application-settings/windows/bluetooth/PhoneNameWindow.cpp index 018ba04715a94f140c350c97a7d5dee34c55e1f9..7f6843e103e5a01b8c0566ab0f9e901875a27bff 100644 --- a/module-apps/application-settings/windows/bluetooth/PhoneNameWindow.cpp +++ b/module-apps/application-settings/windows/bluetooth/PhoneNameWindow.cpp @@ -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 #include "PhoneNameWindow.hpp" @@ -25,6 +25,14 @@ namespace gui setTitle(utils::translate("app_settings_bluetooth_phone_name")); inputField = inputBox(this, utils::translate("app_settings_bluetooth_phone_name")); + inputField->setInputMode(new InputMode( + {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, + [=](const UTF8 &text) { application->getCurrentWindow()->navBarTemporaryMode(text); }, + [=]() { application->getCurrentWindow()->navBarRestoreFromTemporaryMode(); }, + nullptr, + [=](std::function restoreFunction) { + application->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); navBar->setActive(nav_bar::Side::Left, false); navBar->setActive(nav_bar::Side::Center, true); navBar->setActive(nav_bar::Side::Right, true); diff --git a/module-apps/application-settings/windows/display-keypad/QuotesAddWindow.cpp b/module-apps/application-settings/windows/display-keypad/QuotesAddWindow.cpp index aefdd4704a2385b39cb1f55db4bdeb6605c76529..e0ac5bc75182751457f3043b18d219637d23f49a 100644 --- a/module-apps/application-settings/windows/display-keypad/QuotesAddWindow.cpp +++ b/module-apps/application-settings/windows/display-keypad/QuotesAddWindow.cpp @@ -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 #include "QuotesAddWindow.hpp" @@ -78,7 +78,10 @@ namespace gui {InputMode::Abc, InputMode::ABC, InputMode::abc, InputMode::digit}, [=](const UTF8 &text) { navBarTemporaryMode(text); }, [=]() { navBarRestoreFromTemporaryMode(); }, - [=]() { selectSpecialCharacter(); })); + [=]() { selectSpecialCharacter(); }, + [=](std::function restoreFunction) { + application->getCurrentWindow()->startInputModeRestoreTimer(std::move(restoreFunction)); + })); authorText->setTextLimitType(gui::TextLimitType::MaxSignsCount, maxAuthorCharactersCount); auto quoteHeader = new HBox(vBox, 0, 0, 0, 0); diff --git a/module-apps/apps-common/windows/AppWindow.cpp b/module-apps/apps-common/windows/AppWindow.cpp index db97512be3082ee5950ea005259d35d032e56dad..a46a6af024a4fb32a1f786acc7352de5ba7417f6 100644 --- a/module-apps/apps-common/windows/AppWindow.cpp +++ b/module-apps/apps-common/windows/AppWindow.cpp @@ -309,4 +309,16 @@ namespace gui return application->GetName() + separator + getName(); } + void AppWindow::startInputModeRestoreTimer(std::function inputModeRestoreFunction) + { + if (inputModeRestoreFunction == nullptr) { + return; + } + + inputModeRestoreTimer = sys::TimerFactory::createSingleShotTimer( + application, gui::name::timer::input_mode_timer, inputModeRestoreTimeout, [=](sys::Timer &) { + inputModeRestoreFunction(); + }); + inputModeRestoreTimer.start(); + } } /* namespace gui */ diff --git a/module-apps/apps-common/windows/AppWindow.hpp b/module-apps/apps-common/windows/AppWindow.hpp index 2f9ac961e1e312b031ff8628d338fd0989f2adf7..ef21cb4dc29d8ba0109befacf94c36315168480e 100644 --- a/module-apps/apps-common/windows/AppWindow.hpp +++ b/module-apps/apps-common/windows/AppWindow.hpp @@ -10,6 +10,7 @@ #include #include #include "AppWindowConstants.hpp" +#include namespace app { @@ -53,6 +54,9 @@ namespace gui bool preventsAutoLock = false; bool preventsLongPressLock = false; + const std::chrono::milliseconds inputModeRestoreTimeout = std::chrono::seconds{3}; + sys::TimerHandle inputModeRestoreTimer; + public: AppWindow() = delete; AppWindow(app::ApplicationCommon *app, std::string name); @@ -73,7 +77,7 @@ namespace gui bool updateSignalStrength(); bool updateNetworkAccessTechnology(); void updatePhoneMode(sys::phone_modes::PhoneMode mode); - bool updateTethering(const sys::phone_modes::Tethering state); + bool updateTethering(sys::phone_modes::Tethering state); [[nodiscard]] bool preventsAutoLocking() const noexcept; virtual RefreshModes updateTime(); @@ -115,6 +119,8 @@ namespace gui /// @note it would be much better to just have "body item" instead /// but it would mean not insignificant refactor BoundingBox bodySize(); + + void startInputModeRestoreTimer(std::function inputModeRestoreFunction = nullptr); }; } /* namespace gui */ diff --git a/module-apps/apps-common/windows/AppWindowConstants.hpp b/module-apps/apps-common/windows/AppWindowConstants.hpp index f93b99300de8da70df9078b3a89429b51e968f5f..57788a622685dff929bd5a5b435e7372864092f1 100644 --- a/module-apps/apps-common/windows/AppWindowConstants.hpp +++ b/module-apps/apps-common/windows/AppWindowConstants.hpp @@ -1,9 +1,17 @@ -// Copyright (c) 2017-2021, 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 -namespace gui::name::window +namespace gui::name { - inline constexpr auto main_window = "MainWindow"; -} // namespace gui::name::window + namespace window + { + inline constexpr auto main_window = "MainWindow"; + } + + namespace timer + { + inline constexpr auto input_mode_timer = "InputModeTimer"; + } +} // namespace gui::name diff --git a/module-gui/gui/widgets/text/modes/InputMode.cpp b/module-gui/gui/widgets/text/modes/InputMode.cpp index 81e348d9ba2988cc7d796e16c6765347893d86b3..58a0d8444d61d25bee5b27fdc9a2f26aefcc81ec 100644 --- a/module-gui/gui/widgets/text/modes/InputMode.cpp +++ b/module-gui/gui/widgets/text/modes/InputMode.cpp @@ -34,12 +34,14 @@ static std::string getInputName(InputMode::Mode m) } InputMode::InputMode(std::list mode_list, - std::function show_type_cb, - std::function restore_after_show_type_cb, - std::function show_special_char_selector) - : input_mode_list(std::move(mode_list)), show_type_cb(std::move(show_type_cb)), - restore_after_show_type_cb(std::move(restore_after_show_type_cb)), - show_special_char_selector(std::move(show_special_char_selector)) + std::function show_type_callback, + std::function restore_after_show_type_callback, + std::function show_special_char_selector, + std::function restore_function)> restore_timer_callback) + : input_mode_list(std::move(mode_list)), show_type_callback(std::move(show_type_callback)), + restore_after_show_type_callback(std::move(restore_after_show_type_callback)), + show_special_char_selector(std::move(show_special_char_selector)), + restore_timer_callback(std::move(restore_timer_callback)) { // failsafe if (input_mode_list.empty()) { @@ -82,22 +84,26 @@ const std::string &InputMode::get(InputMode::Mode mode) void InputMode::show_input_type() { LOG_INFO("Mode: %d", modeNow()); - if (show_type_cb) { - show_type_cb(getInputName(modeNow())); + if (show_type_callback) { + show_type_callback(getInputName(modeNow())); + } + + if (restore_timer_callback) { + restore_timer_callback([this]() { show_restore(); }); } } void InputMode::show_restore() { - if (restore_after_show_type_cb) { - restore_after_show_type_cb(); + if (restore_after_show_type_callback) { + restore_after_show_type_callback(); } } void InputMode::select_special_char() { - LOG_INFO("Special character selector"); if (show_special_char_selector) { + LOG_INFO("Special character selector"); show_special_char_selector(); } } diff --git a/module-gui/gui/widgets/text/modes/InputMode.hpp b/module-gui/gui/widgets/text/modes/InputMode.hpp index 45911a3eef1517b5ea52593e0437df01d2a8b079..6c99dedca8b7e59cfd334f4581b0f90258926538 100644 --- a/module-gui/gui/widgets/text/modes/InputMode.hpp +++ b/module-gui/gui/widgets/text/modes/InputMode.hpp @@ -25,20 +25,22 @@ class InputMode InputMode() = delete; // list of enabled input modes std::list input_mode_list = {}; - uint32_t input_mode_list_pos = 0; - std::function show_type_cb = nullptr; - std::function restore_after_show_type_cb = nullptr; + std::uint32_t input_mode_list_pos = 0; + std::function show_type_callback = nullptr; + std::function restore_after_show_type_callback = nullptr; std::function show_special_char_selector = nullptr; + std::function restore_function)> restore_timer_callback = nullptr; Mode modeNow() const; void show_input_type(); public: void show_restore(); - InputMode(std::list mode_list, - std::function show_type_cb = nullptr, - std::function restore_after_show_type_cb = nullptr, - std::function show_special_char_selector = nullptr); + explicit InputMode(std::list mode_list, + std::function show_type_callback = nullptr, + std::function restore_after_show_type_callback = nullptr, + std::function show_special_char_selector = nullptr, + std::function restore_function)> restore_timer_callback = nullptr); void next(); const std::string &get(); diff --git a/pure_changelog.md b/pure_changelog.md index c3945068df556ce2cce4f1a076541ef6dbb55bb3..12a715c2626b215c7c03ebc18ed70b38a74d46cb 100644 --- a/pure_changelog.md +++ b/pure_changelog.md @@ -9,6 +9,7 @@ * Added date formatting of received/sent SMS * Added meditation parameters to non-volatile memory * Added missing translations for EULA in French, Spanish and Swedish +* Added input mode selection display timeout ### Changed / Improved