M changelog.md => changelog.md +2 -0
@@ 16,6 16,7 @@
### Fixed
+* `[messages]` In new message window fixed clearing text on options/recipient choice
* `[Text]` Newline handling fix.
* `[appmgr]` Fix for closing applications.
@@ 593,3 594,4 @@
* `[test]` Improved modem testing with modem shutdown detection.
* `[build]` Add support for auto-releases.
+
M module-apps/application-messages/windows/NewMessage.cpp => module-apps/application-messages/windows/NewMessage.cpp +7 -1
@@ 23,6 23,9 @@
namespace gui
{
+ std::unique_ptr<NewMessageWindow::MessageMemento> NewMessageWindow::memento =
+ std::make_unique<NewMessageWindow::MessageMemento>();
+
NewMessageWindow::NewMessageWindow(app::Application *app) : AppWindow(app, name::window::new_sms)
{
buildInterface();
@@ 35,6 38,7 @@ namespace gui
void NewMessageWindow::onBeforeShow(ShowMode mode, SwitchData *data)
{
+ memento->getState(message);
if (data == nullptr) {
return;
}
@@ 80,6 84,7 @@ namespace gui
if (recipient->getText().empty()) {
auto data = std::make_unique<PhonebookSearchReuqest>();
data->disableAppClose = true;
+ memento->setState(message);
return app::manager::Controller::switchApplication(
application, app::name_phonebook, name::window::main_window, std::move(data));
}
@@ 242,6 247,7 @@ namespace gui
if (event.state == InputEvent::State::keyReleasedShort && event.keyCode == KeyCode::KEY_LF) {
auto app = dynamic_cast<app::ApplicationMessages *>(application);
assert(app != nullptr);
+ memento->setState(message);
return app->newMessageOptions(getName(), message);
}
return false;
@@ 262,7 268,6 @@ namespace gui
// Nothing to do if text is empty.
return;
}
-
if (const auto handled = handleMessageText(); !handled) {
message->clear();
}
@@ 360,4 365,5 @@ namespace gui
app->updateDraft(sms, text);
message->clear();
}
+
} // namespace gui
M module-apps/application-messages/windows/NewMessage.hpp => module-apps/application-messages/windows/NewMessage.hpp +36 -2
@@ 21,8 21,8 @@ namespace gui
bool onInput(const InputEvent &inputEvent) override;
void onBeforeShow(ShowMode mode, SwitchData *data) override;
- void onClose() override;
void buildInterface() override;
+ void onClose() override;
private:
bool selectContact();
@@ 37,12 37,46 @@ namespace gui
-> bool;
void storeMessageDraft(const utils::PhoneNumber::View &number, const UTF8 &text);
void storeMessageDraft(SMSRecord &sms, const UTF8 &text);
-
static inline constexpr std::chrono::milliseconds getThreadTimeout{1000};
gui::Text *recipient = nullptr;
gui::Text *message = nullptr;
gui::VBox *body = nullptr;
std::shared_ptr<ContactRecord> contact;
utils::PhoneNumber::View phoneNumber;
+
+ /// MessageMemento class provides buffer-like functionality for message field of NewMessageWindow.
+ /// 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 : public Item
+ {
+ gui::Text *state = nullptr;
+
+ public:
+ /// sets memento and leaves the origin pointing to default-constructed object
+ void setState(gui::Text *&_state)
+ {
+ assert(_state);
+ LOG_DEBUG("setting memento for NewMessageWindow");
+ if (state == nullptr) {
+ state = new gui::Text();
+ state->parent = this;
+ }
+ std::swap(state->parent, _state->parent);
+ std::swap(state, _state);
+ }
+ void getState(gui::Text *&_state)
+ {
+ if (state == nullptr) {
+ return;
+ }
+ assert(_state);
+ LOG_DEBUG("getting memento for NewMessageWindow");
+ std::swap(state->parent, _state->parent);
+ std::swap(state, _state);
+ delete state;
+ state = nullptr;
+ }
+ };
+ static std::unique_ptr<MessageMemento> memento;
};
} /* namespace gui */