diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2022-05-23 12:48:15 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2022-06-01 16:29:28 +0200 |
commit | 1c2d3b069859f466f59f35e50819fadc0ab61af7 (patch) | |
tree | e7db2e1f1056fddd2a78821a112bf234fbe04ca5 /vcl | |
parent | c90db9e43db509bef6892c8443480ffa9ed8bbe0 (diff) |
Implement weld::IconView::connect_query_tooltip
Change-Id: I8a8540e240d6a7046f564404c7c3b6bff8c2f04d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134806
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/salvtables.hxx | 3 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 26 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtkinst.cxx | 36 |
3 files changed, 65 insertions, 0 deletions
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index 3f574237444b..7752b5243c11 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -1756,6 +1756,7 @@ private: DECL_LINK(DeSelectHdl, SvTreeListBox*, void); DECL_LINK(DoubleClickHdl, SvTreeListBox*, bool); DECL_LINK(CommandHdl, const CommandEvent&, bool); + DECL_LINK(TooltipHdl, const HelpEvent&, bool); public: SalInstanceIconView(::IconView* pIconView, SalInstanceBuilder* pBuilder, bool bTakeOwnership); @@ -1770,6 +1771,8 @@ public: virtual void insert(int pos, const OUString* pStr, const OUString* pId, const VirtualDevice* pIcon, weld::TreeIter* pRet) override; + virtual void connect_query_tooltip(const Link<const weld::TreeIter&, OUString>& rLink) override; + virtual OUString get_selected_id() const override; virtual OUString get_selected_text() const override; diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index fd7739f3c460..4755c94e51cb 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -5404,6 +5404,32 @@ void SalInstanceIconView::insert(int pos, const OUString* pStr, const OUString* enable_notify_events(); } +IMPL_LINK(SalInstanceIconView, TooltipHdl, const HelpEvent&, rHEvt, bool) +{ + if (notify_events_disabled()) + return false; + Point aPos(m_xIconView->ScreenToOutputPixel(rHEvt.GetMousePosPixel())); + SvTreeListEntry* pEntry = m_xIconView->GetEntry(aPos); + if (pEntry) + { + SalInstanceTreeIter aIter(pEntry); + OUString aTooltip = signal_query_tooltip(aIter); + if (aTooltip.isEmpty()) + return false; + Size aSize(m_xIconView->GetOutputSizePixel().Width(), m_xIconView->GetEntryHeight()); + tools::Rectangle aScreenRect( + m_xIconView->OutputToScreenPixel(m_xIconView->GetEntryPosition(pEntry)), aSize); + Help::ShowQuickHelp(m_xIconView, aScreenRect, aTooltip); + } + return true; +} + +void SalInstanceIconView::connect_query_tooltip(const Link<const weld::TreeIter&, OUString>& rLink) +{ + weld::IconView::connect_query_tooltip(rLink); + m_xIconView->SetTooltipHdl(LINK(this, SalInstanceIconView, TooltipHdl)); +} + OUString SalInstanceIconView::get_selected_id() const { assert(m_xIconView->IsUpdateMode() && "don't request selection when frozen"); diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index c61f6d650261..1f61fc49db3d 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -16099,6 +16099,7 @@ private: #if !GTK_CHECK_VERSION(4, 0, 0) gulong m_nPopupMenu; #endif + gulong m_nQueryTooltipSignalId = 0; ImplSVEvent* m_pSelectionChangeEvent; DECL_LINK(async_signal_selection_changed, void*, void); @@ -16145,6 +16146,32 @@ private: pThis->handle_item_activated(); } + static gboolean signalQueryTooltip(GtkWidget* /*pGtkWidget*/, gint x, gint y, + gboolean keyboard_tip, GtkTooltip* tooltip, + gpointer widget) + { + GtkInstanceIconView* pThis = static_cast<GtkInstanceIconView*>(widget); + GtkTreeIter iter; + GtkIconView* pIconView = pThis->m_pIconView; + GtkTreeModel* pModel = gtk_icon_view_get_model(pIconView); + GtkTreePath* pPath = nullptr; +#if GTK_CHECK_VERSION(4, 0, 0) + if (!gtk_icon_view_get_tooltip_context(pIconView, x, y, keyboard_tip, &pModel, &pPath, &iter)) + return false; +#else + if (!gtk_icon_view_get_tooltip_context(pIconView, &x, &y, keyboard_tip, &pModel, &pPath, &iter)) + return false; +#endif + OUString aTooltip = pThis->signal_query_tooltip(GtkInstanceTreeIter(iter)); + if (!aTooltip.isEmpty()) + { + gtk_tooltip_set_text(tooltip, OUStringToOString(aTooltip, RTL_TEXTENCODING_UTF8).getStr()); + gtk_icon_view_set_tooltip_item(pIconView, tooltip, pPath); + } + gtk_tree_path_free(pPath); + return !aTooltip.isEmpty(); + } + void insert_item(GtkTreeIter& iter, int pos, const OUString* pId, const OUString* pText, const OUString* pIconName) { gtk_tree_store_insert_with_values(m_pTreeStore, &iter, nullptr, pos, @@ -16251,6 +16278,12 @@ public: enable_notify_events(); } + virtual void connect_query_tooltip(const Link<const weld::TreeIter&, OUString>& rLink) override + { + weld::IconView::connect_query_tooltip(rLink); + m_nQueryTooltipSignalId = g_signal_connect(m_pIconView, "query-tooltip", G_CALLBACK(signalQueryTooltip), this); + } + virtual OUString get_selected_id() const override { assert(gtk_icon_view_get_model(m_pIconView) && "don't request selection when frozen"); @@ -16495,6 +16528,9 @@ public: if (m_pSelectionChangeEvent) Application::RemoveUserEvent(m_pSelectionChangeEvent); + if (m_nQueryTooltipSignalId) + g_signal_handler_disconnect(m_pIconView, m_nQueryTooltipSignalId); + g_signal_handler_disconnect(m_pIconView, m_nItemActivatedSignalId); g_signal_handler_disconnect(m_pIconView, m_nSelectionChangedSignalId); #if !GTK_CHECK_VERSION(4, 0, 0) |