[Libreoffice-commits] core.git: include/vcl vcl/source vcl/unx
Caolán McNamara (via logerrit)
logerrit at kemper.freedesktop.org
Thu Jan 9 16:03:36 UTC 2020
include/vcl/weld.hxx | 5 +++++
vcl/source/app/salvtables.cxx | 5 ++++-
vcl/unx/gtk3/gtk3gtkinst.cxx | 22 ++++++++++++++++++++++
3 files changed, 31 insertions(+), 1 deletion(-)
New commits:
commit 1327fa4b1dff932500c690c263840fde192988ed
Author: Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu Jan 9 10:11:18 2020 +0000
Commit: Caolán McNamara <caolanm at redhat.com>
CommitDate: Thu Jan 9 17:03:02 2020 +0100
add hook for on-demand welded toolbar popover creation
Change-Id: I662976a62281909e30d5b256e10ddcf2ceee2595
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86474
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index c8ccf4291338..e205ea2459c6 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -1956,8 +1956,10 @@ class VCL_DLLPUBLIC Toolbar : virtual public Widget
{
protected:
Link<const OString&, void> m_aClickHdl;
+ Link<const OString&, void> m_aShowMenuHdl;
void signal_clicked(const OString& rIdent) { m_aClickHdl.Call(rIdent); }
+ void signal_show_menu(const OString& rIdent) { m_aShowMenuHdl.Call(rIdent); }
public:
virtual void set_item_sensitive(const OString& rIdent, bool bSensitive) = 0;
@@ -1995,6 +1997,9 @@ public:
virtual vcl::ImageType get_icon_size() const = 0;
void connect_clicked(const Link<const OString&, void>& rLink) { m_aClickHdl = rLink; }
+ // m_aShowMenuHdl is called before the menu is shown.
+ // It can be used to populate the menu on demand with set_item_popover/set_item_menu
+ void connect_show_menu(const Link<const OString&, void>& rLink) { m_aShowMenuHdl = rLink; }
};
class VCL_DLLPUBLIC SizeGroup
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 910778b2da6e..3ef767cb13fe 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -1160,7 +1160,10 @@ IMPL_LINK_NOARG(SalInstanceToolbar, ClickHdl, ToolBox*, void)
IMPL_LINK_NOARG(SalInstanceToolbar, DropdownClick, ToolBox*, void)
{
sal_uInt16 nItemId = m_xToolBox->GetCurItemId();
- set_menu_item_active(m_xToolBox->GetItemCommand(nItemId).toUtf8(), true);
+
+ OString sIdent = m_xToolBox->GetItemCommand(nItemId).toUtf8();
+ signal_show_menu(sIdent);
+ set_menu_item_active(sIdent, true);
}
namespace {
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index bc7802987366..bc53e4cf3cce 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -7116,7 +7116,10 @@ private:
OString id(pStr, pStr ? strlen(pStr) : 0);
m_aMap[id] = pToolItem;
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(pToolItem, "clicked", G_CALLBACK(signalItemClicked), this);
}
@@ -7133,6 +7136,19 @@ private:
signal_clicked(OString(pStr, pStr ? strlen(pStr) : 0));
}
+ static void signalItemShowMenu(GtkMenuToolButton* pItem, gpointer widget)
+ {
+ GtkInstanceToolbar* pThis = static_cast<GtkInstanceToolbar*>(widget);
+ SolarMutexGuard aGuard;
+ pThis->signal_item_show_menu(pItem);
+ }
+
+ void signal_item_show_menu(GtkMenuToolButton* pItem)
+ {
+ const gchar* pStr = gtk_buildable_get_name(GTK_BUILDABLE(pItem));
+ signal_show_menu(OString(pStr, pStr ? strlen(pStr) : 0));
+ }
+
static void set_item_image(GtkToolButton* pItem, const css::uno::Reference<css::graphic::XGraphic>& rIcon)
{
GtkWidget* pImage = nullptr;
@@ -7171,13 +7187,19 @@ public:
void disable_item_notify_events()
{
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);
+ }
}
void enable_item_notify_events()
{
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);
+ }
}
virtual void set_item_sensitive(const OString& rIdent, bool bSensitive) override
More information about the Libreoffice-commits
mailing list