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);
         }
     }
 

Reply via email to