include/vcl/weld.hxx | 10 +++++++++ vcl/inc/salvtables.hxx | 6 +++++ vcl/source/app/salvtables.cxx | 29 ++++++++++++++++++++++++++ vcl/unx/gtk3/gtkinst.cxx | 46 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+)
New commits: commit a130f0f406e67cda098adc3086e937317f737583 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Tue May 24 18:43:45 2022 +0200 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Wed Jun 1 16:29:42 2022 +0200 Implement weld::IconView::[gs]et_item_width Change-Id: I211e3c21b4e0148c4ff6fc9931838e37ccd0cc41 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134897 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index aacbc7c310c4..dba513870818 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -1350,6 +1350,9 @@ protected: OUString signal_query_tooltip(const TreeIter& rIter) { return m_aQueryTooltipHdl.Call(rIter); } public: + virtual int get_item_width() const = 0; + virtual void set_item_width(int width) = 0; + virtual void insert(int pos, const OUString* pStr, const OUString* pId, const OUString* pIconName, TreeIter* pRet) = 0; diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index 7752b5243c11..45e9700ad2c8 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -1761,6 +1761,9 @@ private: public: SalInstanceIconView(::IconView* pIconView, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + virtual int get_item_width() const override; + virtual void set_item_width(int width) override; + virtual void freeze() override; virtual void thaw() override; diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 4755c94e51cb..4432b4c5afe6 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -5308,6 +5308,9 @@ SalInstanceIconView::SalInstanceIconView(::IconView* pIconView, SalInstanceBuild m_xIconView->SetPopupMenuHdl(LINK(this, SalInstanceIconView, CommandHdl)); } +int SalInstanceIconView::get_item_width() const { return m_xIconView->GetEntryWidth(); } +void SalInstanceIconView::set_item_width(int width) { m_xIconView->SetEntryWidth(width); } + void SalInstanceIconView::freeze() { bool bIsFirstFreeze = IsFirstFreeze(); diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 1f61fc49db3d..0575aa8c3c7a 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -16252,6 +16252,16 @@ public: m_nIdCol = m_nTextCol + 1; } + virtual int get_item_width() const override + { + return gtk_icon_view_get_item_width(m_pIconView); + } + + virtual void set_item_width(int width) override + { + gtk_icon_view_set_item_width(m_pIconView, width); + } + virtual void insert(int pos, const OUString* pText, const OUString* pId, const OUString* pIconName, weld::TreeIter* pRet) override { disable_notify_events(); commit 1c2d3b069859f466f59f35e50819fadc0ab61af7 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Mon May 23 12:48:15 2022 +0300 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Wed Jun 1 16:29:28 2022 +0200 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.kagan...@collabora.com> diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 06cb4d037b3b..aacbc7c310c4 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -1343,9 +1343,11 @@ protected: Link<IconView&, void> m_aSelectionChangeHdl; Link<IconView&, bool> m_aItemActivatedHdl; Link<const CommandEvent&, bool> m_aCommandHdl; + Link<const TreeIter&, OUString> m_aQueryTooltipHdl; void signal_selection_changed() { m_aSelectionChangeHdl.Call(*this); } bool signal_item_activated() { return m_aItemActivatedHdl.Call(*this); } + OUString signal_query_tooltip(const TreeIter& rIter) { return m_aQueryTooltipHdl.Call(rIter); } public: virtual void insert(int pos, const OUString* pStr, const OUString* pId, @@ -1381,6 +1383,11 @@ public: void connect_command(const Link<const CommandEvent&, bool>& rLink) { m_aCommandHdl = rLink; } + virtual void connect_query_tooltip(const Link<const TreeIter&, OUString>& rLink) + { + m_aQueryTooltipHdl = rLink; + } + virtual OUString get_selected_id() const = 0; virtual void clear() = 0; 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)