// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include "Common.hpp" #include "popups/Disposition.hpp" #include "SwitchData.hpp" #include "gui/input/InputEvent.hpp" #include "BaseAppMessage.hpp" #include "AppSwitchReason.hpp" #include "AppStartupReason.hpp" #include #include #include #include namespace app { class AppActionRequest : public AppMessage { public: AppActionRequest(manager::actions::ActionId _actionId, manager::actions::ActionParamsPtr _data) : AppMessage(MessageType::AppAction), actionId{_actionId}, data{std::move(_data)} {} manager::actions::ActionId getAction() const noexcept { return actionId; } manager::actions::ActionParamsPtr &getData() noexcept { return data; } private: manager::actions::ActionId actionId; manager::actions::ActionParamsPtr data; }; class ActionHandledResponse : public sys::ResponseMessage { public: explicit ActionHandledResponse(sys::ReturnCodes retCode = sys::ReturnCodes::Success) : sys::ResponseMessage{retCode, MessageType::AppAction} {} }; // this message is used to notify application about switching event. Application will gain or lose focus upon // receiving this message. Application gains focus when it was in init or active background state. Application loose // focus when it was in active foreground state. if no window is specified it is assumed that MainWindow is the // target class AppSwitchMessage : public AppMessage { private: // name of the application to which switch is performed. std::string targetApplication; // name of the window to which switch should be performed. std::string targetWindow; // optional data for the target window. std::unique_ptr data; StartupReason startupReason = StartupReason::Launch; public: AppSwitchMessage(const std::string &targetApplication, const std::string &targetWindow, std::unique_ptr data, StartupReason startupReason) : AppMessage(MessageType::AppSwitch), targetApplication{targetApplication}, targetWindow{targetWindow}, data{std::move(data)}, startupReason{startupReason} {}; virtual ~AppSwitchMessage(){}; [[nodiscard]] std::string getTargetWindowName() const noexcept { return targetWindow; }; [[nodiscard]] std::unique_ptr &getData() { return data; }; [[nodiscard]] std::string getTargetApplicationName() const noexcept { return targetApplication; }; [[nodiscard]] StartupReason getApplicationStartupReason() const noexcept { return startupReason; }; }; class AppRefreshMessage : public AppMessage { protected: gui::RefreshModes mode; std::string window_name; public: AppRefreshMessage(gui::RefreshModes mode, std::string window_name) : mode{mode}, window_name(std::move(window_name)){}; [[nodiscard]] const gui::RefreshModes &getMode() const { return mode; } [[nodiscard]] const std::string &getWindowName() const { return window_name; } }; class AppSwitchWindowMessage : public AppMessage { protected: std::string window; std::string senderWindow; gui::ShowMode command; SwitchReason reason; std::unique_ptr data; public: AppSwitchWindowMessage() = delete; AppSwitchWindowMessage(const std::string &window, const std::string senderWindow, std::unique_ptr data, gui::ShowMode command = gui::ShowMode::GUI_SHOW_INIT, SwitchReason reason = SwitchReason::SwitchRequest) : AppMessage(MessageType::AppSwitchWindow), window{window}, senderWindow{senderWindow}, command{command}, reason{reason}, data{std::move(data)} {}; virtual ~AppSwitchWindowMessage() = default; [[nodiscard]] virtual bool toPopupRequest() const { return false; } const std::string &getWindowName() const { return window; }; const std::string &getSenderWindowName() const { return senderWindow; }; const gui::ShowMode &getCommand() const { return command; }; [[nodiscard]] SwitchReason getReason() const noexcept { return reason; } std::unique_ptr &getData() { return data; }; virtual std::pair getSwitchData() { return {window, gui::popup::WindowDisposition}; } }; class AppUpdateWindowMessage : public AppMessage { private: const std::string window; const std::unique_ptr data; const gui::ShowMode command; const gui::RefreshModes refreshMode; public: AppUpdateWindowMessage(const std::string &window, std::unique_ptr data, gui::ShowMode command = gui::ShowMode::GUI_SHOW_INIT, gui::RefreshModes refreshMode = gui::RefreshModes::GUI_REFRESH_FAST) : AppMessage(), window{window}, data{std::move(data)}, command{command}, refreshMode{refreshMode} {} [[nodiscard]] auto getWindowName() const { return window; } [[nodiscard]] const auto &getData() const noexcept { return data; } [[nodiscard]] auto getCommand() const noexcept { return command; } [[nodiscard]] auto getRefreshMode() const noexcept { return refreshMode; } }; class AppInputEventMessage : public AppMessage { protected: gui::InputEvent event; public: explicit AppInputEventMessage(gui::InputEvent evt) : AppMessage(MessageType::AppInputEvent), event{evt} {} const gui::InputEvent &getEvent() { return event; }; operator std::string() const override { const auto &rawKey = event.getRawKey(); std::stringstream ss; ss << "{ "; ss << "state: " << c_str(event.getState()) << ", "; ss << "RawKey: " << c_str(rawKey.keyCode) << "}"; ss << "t0: " << rawKey.timePress << ", t1: " << rawKey.timeRelease; ss << " }"; return ss.str().c_str(); } }; class AppRebuildMessage : public AppMessage { public: AppRebuildMessage() : AppMessage(MessageType::AppRebuild){}; virtual ~AppRebuildMessage(){}; }; class AppLostFocusMessage : public AppMessage { public: AppLostFocusMessage() : AppMessage{MessageType::AppFocusLost} {} }; class AppSwitchBackMessage : public AppMessage { public: AppSwitchBackMessage() : AppMessage(MessageType::AppSwitchBack) {} }; } // namespace app