include/vcl/weld.hxx | 2 sd/source/ui/sidebar/MasterPagesSelector.cxx | 12 +-- vcl/inc/qt5/QtInstanceIconView.hxx | 13 ++- vcl/inc/salvtables.hxx | 2 vcl/qt5/QtInstanceIconView.cxx | 93 ++++++++++++++++++++++----- vcl/source/app/salvtables.cxx | 13 +-- vcl/unx/gtk3/gtkinst.cxx | 13 +-- 7 files changed, 104 insertions(+), 44 deletions(-)
New commits: commit b3925c4d1b25cf76836022114a36ade63746f209 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Thu Feb 13 13:01:22 2025 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Thu Feb 13 19:44:11 2025 +0100 tdf#130857 qt weld: Implement misc IconView methods These weld::IconView methods are similar to the corresponding weld::TreeView methods (except that the weld::IconView only has one dimension), so use the same approach as used in QtInstanceTreeView. Change-Id: I26a5a3190a1d95d61ae01512f13a200e48da068b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181615 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/vcl/inc/qt5/QtInstanceIconView.hxx b/vcl/inc/qt5/QtInstanceIconView.hxx index c10909367a8c..e2cd83355115 100644 --- a/vcl/inc/qt5/QtInstanceIconView.hxx +++ b/vcl/inc/qt5/QtInstanceIconView.hxx @@ -44,12 +44,12 @@ public: virtual OUString get_selected_text() const override; - virtual OUString get_id(int pos) const override; + virtual OUString get_id(int nPos) const override; virtual void select(int nPos) override; virtual void unselect(int pos) override; - virtual void set_image(int pos, VirtualDevice& rDevice) override; - virtual void set_text(int pos, const OUString& rText) override; - virtual void set_id(int pos, const OUString& rId) override; + virtual void set_image(int nPos, VirtualDevice& rDevice) override; + virtual void set_text(int nPos, const OUString& rText) override; + virtual void set_id(int nPos, const OUString& rId) override; virtual void remove(int pos) override; virtual tools::Rectangle get_rect(int pos) const override; @@ -68,6 +68,11 @@ public: virtual int n_children() const override; +private: + QModelIndex modelIndex(int nPos) const; + QModelIndex modelIndex(const weld::TreeIter& rIter) const; + static int position(const weld::TreeIter& rIter); + private Q_SLOTS: void handleActivated(); void handleSelectionChanged(); diff --git a/vcl/qt5/QtInstanceIconView.cxx b/vcl/qt5/QtInstanceIconView.cxx index 68fc416abf0d..9a5f970b5e45 100644 --- a/vcl/qt5/QtInstanceIconView.cxx +++ b/vcl/qt5/QtInstanceIconView.cxx @@ -10,6 +10,8 @@ #include <QtInstanceIconView.hxx> #include <QtInstanceIconView.moc> +#include <QtInstanceTreeIter.hxx> + #include <vcl/qt/QtUtils.hxx> // role used for the ID in the QStandardItem @@ -118,10 +120,18 @@ OUString QtInstanceIconView::get_selected_text() const return OUString(); } -OUString QtInstanceIconView::get_id(int) const +OUString QtInstanceIconView::get_id(int nPos) const { - assert(false && "Not implemented yet"); - return OUString(); + SolarMutexGuard g; + + OUString sId; + GetQtInstance().RunInMainThread([&] { + QVariant aRoleData = m_pModel->data(modelIndex(nPos), ROLE_ID); + if (aRoleData.canConvert<QString>()) + sId = toOUString(aRoleData.toString()); + }); + + return sId; } void QtInstanceIconView::select(int nPos) @@ -133,11 +143,36 @@ void QtInstanceIconView::select(int nPos) void QtInstanceIconView::unselect(int) { assert(false && "Not implemented yet"); } -void QtInstanceIconView::set_image(int, VirtualDevice&) { assert(false && "Not implemented yet"); } +void QtInstanceIconView::set_image(int nPos, VirtualDevice& rDevice) +{ + SolarMutexGuard g; + + GetQtInstance().RunInMainThread([&] { + QModelIndex aIndex = modelIndex(nPos); + QIcon aIcon = toQPixmap(rDevice); + m_pModel->setData(aIndex, aIcon, Qt::DecorationRole); + }); +} -void QtInstanceIconView::set_text(int, const OUString&) { assert(false && "Not implemented yet"); } +void QtInstanceIconView::set_text(int nPos, const OUString& rText) +{ + SolarMutexGuard g; -void QtInstanceIconView::set_id(int, const OUString&) { assert(false && "Not implemented yet"); } + GetQtInstance().RunInMainThread([&] { + QModelIndex aIndex = modelIndex(nPos); + m_pModel->setData(aIndex, toQString(rText)); + }); +} + +void QtInstanceIconView::set_id(int nPos, const OUString& rId) +{ + SolarMutexGuard g; + + GetQtInstance().RunInMainThread([&] { + QModelIndex aIndex = modelIndex(nPos); + m_pModel->setData(aIndex, toQString(rId), ROLE_ID); + }); +} void QtInstanceIconView::remove(int) { assert(false && "Not implemented yet"); } @@ -165,9 +200,13 @@ bool QtInstanceIconView::get_cursor(weld::TreeIter*) const return false; } -void QtInstanceIconView::set_cursor(const weld::TreeIter&) +void QtInstanceIconView::set_cursor(const weld::TreeIter& rIter) { - assert(false && "Not implemented yet"); + SolarMutexGuard g; + + GetQtInstance().RunInMainThread([&] { + m_pSelectionModel->setCurrentIndex(modelIndex(rIter), QItemSelectionModel::NoUpdate); + }); } bool QtInstanceIconView::get_iter_first(weld::TreeIter&) const @@ -176,16 +215,24 @@ bool QtInstanceIconView::get_iter_first(weld::TreeIter&) const return false; } -OUString QtInstanceIconView::get_id(const weld::TreeIter&) const +OUString QtInstanceIconView::get_id(const weld::TreeIter& rIter) const { - assert(false && "Not implemented yet"); - return OUString(); + return get_id(position(rIter)); } -OUString QtInstanceIconView::get_text(const weld::TreeIter&) const +OUString QtInstanceIconView::get_text(const weld::TreeIter& rIter) const { - assert(false && "Not implemented yet"); - return OUString(); + SolarMutexGuard g; + + OUString sText; + GetQtInstance().RunInMainThread([&] { + const QModelIndex aIndex = modelIndex(rIter); + const QVariant aData = m_pModel->data(aIndex); + assert(aData.canConvert<QString>() && "model data not a string"); + sText = toOUString(aData.toString()); + }); + + return sText; } bool QtInstanceIconView::iter_next_sibling(weld::TreeIter&) const @@ -194,9 +241,10 @@ bool QtInstanceIconView::iter_next_sibling(weld::TreeIter&) const return false; } -void QtInstanceIconView::scroll_to_item(const weld::TreeIter&) +void QtInstanceIconView::scroll_to_item(const weld::TreeIter& rIter) { - assert(false && "Not implemented yet"); + SolarMutexGuard g; + GetQtInstance().RunInMainThread([&] { m_pListView->scrollTo(modelIndex(rIter)); }); } void QtInstanceIconView::selected_foreach(const std::function<bool(weld::TreeIter&)>&) @@ -214,6 +262,19 @@ int QtInstanceIconView::n_children() const return nChildren; } +QModelIndex QtInstanceIconView::modelIndex(int nPos) const { return m_pModel->index(nPos, 0); } + +QModelIndex QtInstanceIconView::modelIndex(const weld::TreeIter& rIter) const +{ + return modelIndex(position(rIter)); +} + +int QtInstanceIconView::position(const weld::TreeIter& rIter) +{ + QModelIndex aModelIndex = static_cast<const QtInstanceTreeIter&>(rIter).modelIndex(); + return aModelIndex.row(); +} + void QtInstanceIconView::handleActivated() { SolarMutexGuard g; commit 5ebe96edb9ff876cea64f4974678d685468a350e Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Thu Feb 13 11:31:27 2025 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Thu Feb 13 19:44:03 2025 +0100 weld icon view: Pass VirtualDevice by ref instead of pointer Switch the weld::IconView::set_image param from VirtualDevice* to VirtualDevice&. This makes it consistent with the corresponding weld::TreeView::set_image variant and avoids the need to check for nullptr in the implementations (where nullptr was not used as an indicator that any previously set image should be cleared). Change-Id: I61b61acaef871a961465ba15e697267902f42596 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181610 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 8b8315401c55..a65a911d385e 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -1515,7 +1515,7 @@ public: virtual OUString get_id(int pos) const = 0; virtual void select(int pos) = 0; virtual void unselect(int pos) = 0; - virtual void set_image(int pos, VirtualDevice* pDevice) = 0; + virtual void set_image(int pos, VirtualDevice& rDevice) = 0; virtual void set_text(int pos, const OUString& rText) = 0; virtual void set_id(int pos, const OUString& rId) = 0; virtual void remove(int pos) = 0; diff --git a/sd/source/ui/sidebar/MasterPagesSelector.cxx b/sd/source/ui/sidebar/MasterPagesSelector.cxx index 33d87e4d919c..c65eb4d19bd7 100644 --- a/sd/source/ui/sidebar/MasterPagesSelector.cxx +++ b/sd/source/ui/sidebar/MasterPagesSelector.cxx @@ -335,8 +335,8 @@ void MasterPagesSelector::NotifyContainerChangeEvent (const MasterPageContainerC Image aPreview(mpContainer->GetPreviewForToken(rEvent.maChildToken)); if (aPreview.GetSizePixel().Width() > 0) { - VclPtr<VirtualDevice> aDev = GetVirtualDevice(aPreview); - mxPreviewIconView->set_image(nIndex, aDev); + VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aPreview); + mxPreviewIconView->set_image(nIndex, *pVDev); } } } @@ -392,16 +392,16 @@ void MasterPagesSelector::SetItem ( if (aPreview.GetSizePixel().Width() > 0) { - VclPtr<VirtualDevice> aVDev = GetVirtualDevice(aPreview); + VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aPreview); if (!mxPreviewIconView->get_id(nIndex).isEmpty()) { - mxPreviewIconView->set_image(nIndex, aVDev); + mxPreviewIconView->set_image(nIndex, *pVDev); mxPreviewIconView->set_id(nIndex, OUString::number(aToken)); } else { OUString sId = OUString::number(aToken); - mxPreviewIconView->insert(nIndex, nullptr, &sId, aVDev, nullptr); + mxPreviewIconView->insert(nIndex, nullptr, &sId, pVDev, nullptr); } AddTokenToIndexEntry(nIndex, aToken); @@ -494,7 +494,7 @@ void MasterPagesSelector::UpdateAllPreviews() if (aPreview.GetSizePixel().Width() > 0) { VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aPreview); - mxPreviewIconView->set_image(aIndex, pVDev); + mxPreviewIconView->set_image(aIndex, *pVDev); } else if (mpContainer->GetPreviewState(aToken) == MasterPageContainer::PS_CREATABLE) { diff --git a/vcl/inc/qt5/QtInstanceIconView.hxx b/vcl/inc/qt5/QtInstanceIconView.hxx index fb1d762f5dfe..c10909367a8c 100644 --- a/vcl/inc/qt5/QtInstanceIconView.hxx +++ b/vcl/inc/qt5/QtInstanceIconView.hxx @@ -47,7 +47,7 @@ public: virtual OUString get_id(int pos) const override; virtual void select(int nPos) override; virtual void unselect(int pos) override; - virtual void set_image(int pos, VirtualDevice* pDevice) override; + virtual void set_image(int pos, VirtualDevice& rDevice) override; virtual void set_text(int pos, const OUString& rText) override; virtual void set_id(int pos, const OUString& rId) override; virtual void remove(int pos) override; diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index e9bdf6245070..82f3b0b334f5 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -1989,7 +1989,7 @@ public: const OUString* getEntryData(int index) const; - virtual void set_image(int pos, VirtualDevice* rImage) override; + virtual void set_image(int pos, VirtualDevice& rImage) override; virtual void set_text(int pos, const OUString& rText) override; diff --git a/vcl/qt5/QtInstanceIconView.cxx b/vcl/qt5/QtInstanceIconView.cxx index c8b802f72c8f..68fc416abf0d 100644 --- a/vcl/qt5/QtInstanceIconView.cxx +++ b/vcl/qt5/QtInstanceIconView.cxx @@ -133,7 +133,7 @@ void QtInstanceIconView::select(int nPos) void QtInstanceIconView::unselect(int) { assert(false && "Not implemented yet"); } -void QtInstanceIconView::set_image(int, VirtualDevice*) { assert(false && "Not implemented yet"); } +void QtInstanceIconView::set_image(int, VirtualDevice&) { assert(false && "Not implemented yet"); } void QtInstanceIconView::set_text(int, const OUString&) { assert(false && "Not implemented yet"); } diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index d05c9419698a..4fc566044d86 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -5723,7 +5723,7 @@ OUString SalInstanceIconView::get_id(int pos) const return *pRet; } -void SalInstanceIconView::set_image(int pos, VirtualDevice* pIcon) +void SalInstanceIconView::set_image(int pos, VirtualDevice& rIcon) { SvTreeListEntry* aEntry = m_xIconView->GetEntry(nullptr, pos); if (aEntry == nullptr) @@ -5731,13 +5731,10 @@ void SalInstanceIconView::set_image(int pos, VirtualDevice* pIcon) SvLBoxContextBmp* aItem = static_cast<SvLBoxContextBmp*>(aEntry->GetFirstItem(SvLBoxItemType::ContextBmp)); - Image aImage; - if (pIcon) - { - const Point aNull(0, 0); - const Size aSize = pIcon->GetOutputSize(); - aImage = Image(pIcon->GetBitmapEx(aNull, aSize)); - } + const Point aNull(0, 0); + const Size aSize = rIcon.GetOutputSize(); + Image aImage(rIcon.GetBitmapEx(aNull, aSize)); + if (aItem == nullptr) { aEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aImage, aImage, false)); diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 92c40e5e91cd..84fed6c5c00e 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -17216,19 +17216,16 @@ private: return tools::Rectangle(aRect.x, aRect.y, aRect.x + aRect.width, aRect.y + aRect.height); } - void set_image(int pos, VirtualDevice* pIcon) override + void set_image(int pos, VirtualDevice& rIcon) override { GtkTreeModel* pModel = GTK_TREE_MODEL(m_pTreeStore); GtkTreeIter iter; if (gtk_tree_model_iter_nth_child(pModel, &iter, nullptr, pos)) { - if (pIcon) - { - GdkPixbuf* pixbuf = getPixbuf(*pIcon); - gtk_tree_store_set(m_pTreeStore, &iter, m_nImageCol, pixbuf, -1); - if (pixbuf) - g_object_unref(pixbuf); - } + GdkPixbuf* pixbuf = getPixbuf(rIcon); + gtk_tree_store_set(m_pTreeStore, &iter, m_nImageCol, pixbuf, -1); + if (pixbuf) + g_object_unref(pixbuf); } }