diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-01-09 15:45:46 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-01-10 15:13:45 +0100 |
commit | 14e26096f0476b8ecb70511c304a0cdf5440ef7a (patch) | |
tree | 9aca765b2599b23ad5d88e37877c345c1a71c254 /vcl | |
parent | 9b97efd4228489f2e54a948e676917e50902fd33 (diff) |
make welded toolbars on-demand that were previously on-demand
Change-Id: I795723260deb317093e83d951d968e0b3d3a1850
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86531
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/app/salvtables.cxx | 37 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 20 |
2 files changed, 46 insertions, 11 deletions
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 3ef767cb13fe..0dd8825754dc 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -950,8 +950,11 @@ private: std::map<sal_uInt16, VclPtr<vcl::Window>> m_aFloats; std::map<sal_uInt16, VclPtr<PopupMenu>> m_aMenus; + OString m_sStartShowIdent; + DECL_LINK(ClickHdl, ToolBox*, void); DECL_LINK(DropdownClick, ToolBox*, void); + DECL_LINK(MenuToggleListener, VclWindowEvent&, void); public: SalInstanceToolbar(ToolBox* pToolBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) @@ -1024,6 +1027,9 @@ public: sal_uInt16 nItemId = m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)); assert (m_xToolBox->GetItemBits(nItemId) & ToolBoxItemBits::DROPDOWN); + if (rIdent == m_sStartShowIdent) + return true; + auto aFloat = m_aFloats.find(nItemId); if (aFloat != m_aFloats.end()) { @@ -1045,9 +1051,17 @@ public: vcl::Window* pFloat = pPopoverWidget ? pPopoverWidget->getWidget() : nullptr; if (pFloat) + { + pFloat->AddEventListener(LINK(this, SalInstanceToolbar, MenuToggleListener)); pFloat->EnableDocking(); + } sal_uInt16 nId = m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)); + auto xOldFloat = m_aFloats[nId]; + if (xOldFloat) + { + xOldFloat->RemoveEventListener(LINK(this, SalInstanceToolbar, MenuToggleListener)); + } m_aFloats[nId] = pFloat; m_aMenus[nId] = nullptr; } @@ -1161,9 +1175,26 @@ IMPL_LINK_NOARG(SalInstanceToolbar, DropdownClick, ToolBox*, void) { sal_uInt16 nItemId = m_xToolBox->GetCurItemId(); - OString sIdent = m_xToolBox->GetItemCommand(nItemId).toUtf8(); - signal_show_menu(sIdent); - set_menu_item_active(sIdent, true); + m_sStartShowIdent = m_xToolBox->GetItemCommand(nItemId).toUtf8(); + signal_toggle_menu(m_sStartShowIdent); + set_menu_item_active(m_sStartShowIdent, true); + m_sStartShowIdent.clear(); +} + +IMPL_LINK(SalInstanceToolbar, MenuToggleListener, VclWindowEvent&, rEvent, void) +{ + if (rEvent.GetId() == VclEventId::WindowEndPopupMode) + { + for (auto& rFloat : m_aFloats) + { + if (rEvent.GetWindow() == rFloat.second) + { + sal_uInt16 nItemId = rFloat.first; + signal_toggle_menu(m_xToolBox->GetItemCommand(nItemId).toUtf8()); + break; + } + } + } } namespace { diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index bc53e4cf3cce..d52fb782df6a 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -7118,7 +7118,7 @@ private: if (pMenuButton) { m_aMenuButtonMap[id] = std::make_unique<GtkInstanceMenuButton>(pMenuButton, m_pBuilder, false); - g_signal_connect(pToolItem, "show-menu", G_CALLBACK(signalItemShowMenu), this); + g_signal_connect(pMenuButton, "toggled", G_CALLBACK(signalItemToggled), this); } g_signal_connect(pToolItem, "clicked", G_CALLBACK(signalItemClicked), this); } @@ -7136,17 +7136,23 @@ private: signal_clicked(OString(pStr, pStr ? strlen(pStr) : 0)); } - static void signalItemShowMenu(GtkMenuToolButton* pItem, gpointer widget) + static void signalItemToggled(GtkToggleButton* pItem, gpointer widget) { GtkInstanceToolbar* pThis = static_cast<GtkInstanceToolbar*>(widget); SolarMutexGuard aGuard; - pThis->signal_item_show_menu(pItem); + pThis->signal_item_toggled(pItem); } - void signal_item_show_menu(GtkMenuToolButton* pItem) + void signal_item_toggled(GtkToggleButton* pItem) { - const gchar* pStr = gtk_buildable_get_name(GTK_BUILDABLE(pItem)); - signal_show_menu(OString(pStr, pStr ? strlen(pStr) : 0)); + for (auto& a : m_aMenuButtonMap) + { + if (a.second->getWidget() == GTK_WIDGET(pItem)) + { + signal_toggle_menu(a.first); + break; + } + } } static void set_item_image(GtkToolButton* pItem, const css::uno::Reference<css::graphic::XGraphic>& rIcon) @@ -7189,7 +7195,6 @@ public: for (auto& a : m_aMap) { g_signal_handlers_block_by_func(a.second, reinterpret_cast<void*>(signalItemClicked), this); - g_signal_handlers_block_by_func(a.second, reinterpret_cast<void*>(signalItemShowMenu), this); } } @@ -7197,7 +7202,6 @@ public: { for (auto& a : m_aMap) { - g_signal_handlers_unblock_by_func(a.second, reinterpret_cast<void*>(signalItemShowMenu), this); g_signal_handlers_unblock_by_func(a.second, reinterpret_cast<void*>(signalItemClicked), this); } } |