diff options
author | Szymon Kłos <szymon.klos@collabora.com> | 2021-03-01 19:27:04 +0100 |
---|---|---|
committer | Jan Holesovsky <kendy@collabora.com> | 2021-03-04 10:52:56 +0100 |
commit | 81e0a4a859d6f47cca9c54482e30be0b7d7355cc (patch) | |
tree | f6b68fdc108ab0f9c8b1b89f8d4302310dfd577b /vcl/inc/jsdialog/jsdialogbuilder.hxx | |
parent | be688de877ad5e96836e7bd0a9d70b80d6dabdf2 (diff) |
jsdialog: send selection change for icon view
- add posibility to send additional actions
- send selection change for icon view as separate
command - optimization, no need for rendering
Change-Id: I02dd129068baf32c265612a1cfa2c2af20319ae9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111767
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Jan Holesovsky <kendy@collabora.com>
Diffstat (limited to 'vcl/inc/jsdialog/jsdialogbuilder.hxx')
-rw-r--r-- | vcl/inc/jsdialog/jsdialogbuilder.hxx | 61 |
1 files changed, 58 insertions, 3 deletions
diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index c228967eb0f5..13e9db2a178e 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -28,6 +28,7 @@ #include <boost/property_tree/ptree_fwd.hpp> #include <deque> +#include <unordered_map> class ToolBox; class SfxViewShell; @@ -35,6 +36,7 @@ class VclMultiLineEdit; class IconView; typedef std::map<OString, weld::Widget*> WidgetMap; +typedef std::unordered_map<std::string, OUString> ActionDataMap; namespace jsdialog { @@ -42,10 +44,51 @@ enum MessageType { FullUpdate, WidgetUpdate, - Close + Close, + Action }; } +class JSDialogMessageInfo +{ +public: + jsdialog::MessageType m_eType; + VclPtr<vcl::Window> m_pWindow; + std::unique_ptr<ActionDataMap> m_pData; + +private: + void copy(const JSDialogMessageInfo& rInfo) + { + this->m_eType = rInfo.m_eType; + this->m_pWindow = rInfo.m_pWindow; + if (rInfo.m_pData) + { + std::unique_ptr<ActionDataMap> pData(new ActionDataMap(*rInfo.m_pData)); + this->m_pData = std::move(pData); + } + } + +public: + JSDialogMessageInfo(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, + std::unique_ptr<ActionDataMap> pData) + : m_eType(eType) + , m_pWindow(pWindow) + , m_pData(std::move(pData)) + { + } + + JSDialogMessageInfo(const JSDialogMessageInfo& rInfo) { copy(rInfo); } + + JSDialogMessageInfo& operator=(JSDialogMessageInfo aInfo) + { + if (this == &aInfo) + return *this; + + copy(aInfo); + return *this; + } +}; + class JSDialogNotifyIdle : public Idle { // used to send message @@ -56,7 +99,7 @@ class JSDialogNotifyIdle : public Idle std::string m_LastNotificationMessage; bool m_bForce; - std::deque<std::pair<jsdialog::MessageType, VclPtr<vcl::Window>>> m_aMessageQueue; + std::deque<JSDialogMessageInfo> m_aMessageQueue; public: JSDialogNotifyIdle(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, @@ -66,13 +109,16 @@ public: void clearQueue(); void forceUpdate(); - void sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow); + void sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, + std::unique_ptr<ActionDataMap> pData = nullptr); private: void send(const boost::property_tree::ptree& rTree); boost::property_tree::ptree generateFullUpdate() const; boost::property_tree::ptree generateWidgetUpdate(VclPtr<vcl::Window> pWindow) const; boost::property_tree::ptree generateCloseMessage() const; + boost::property_tree::ptree generateActionMessage(VclPtr<vcl::Window> pWindow, + std::unique_ptr<ActionDataMap> pData) const; }; class VCL_DLLPUBLIC JSDialogSender @@ -92,6 +138,7 @@ public: virtual void sendFullUpdate(bool bForce = false); void sendClose(); virtual void sendUpdate(VclPtr<vcl::Window> pWindow, bool bForce = false); + virtual void sendAction(VclPtr<vcl::Window> pWindow, std::unique_ptr<ActionDataMap> pData); void flush() { mpIdleNotify->Invoke(); } protected: @@ -234,6 +281,8 @@ public: virtual void sendUpdate(bool bForce = false) = 0; virtual void sendFullUpdate(bool bForce = false) = 0; + + virtual void sendAction(std::unique_ptr<ActionDataMap> pData) = 0; }; template <class BaseInstanceClass, class VclClass> @@ -323,6 +372,12 @@ public: if ((!m_bIsFreezed || bForce) && m_pSender) m_pSender->sendFullUpdate(bForce); } + + virtual void sendAction(std::unique_ptr<ActionDataMap> pData) override + { + if (!m_bIsFreezed && m_pSender && pData) + m_pSender->sendAction(BaseInstanceClass::m_xWidget, std::move(pData)); + } }; class VCL_DLLPUBLIC JSDialog : public JSWidget<SalInstanceDialog, ::Dialog> |