vcl/inc/qt5/QtInstanceTreeView.hxx |   11 +++--
 vcl/qt5/QtInstanceTreeView.cxx     |   68 ++++++++++++++++++++++++++++++++-----
 2 files changed, 66 insertions(+), 13 deletions(-)

New commits:
commit bb6a98f5dad7bf99eaa690d52b21c1f51e42fca3
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Fri Feb 21 14:43:01 2025 +0100
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Sat Feb 22 10:52:12 2025 +0100

    tdf#130857 qt weld: Implement QtInstanceTreeView::{g,s}et_toggle
    
    Use QStandardItem::checkState [1] and
    QStandardItem::setCheckState [2] to retrieve/set the state.
    
    Add 2 static helper methods to map between vcl Tristate
    and Qt::CheckState.
    
    [1] https://doc.qt.io/qt-6/qstandarditem.html#checkState
    [2] https://doc.qt.io/qt-6/qstandarditem.html#setCheckState
    
    Change-Id: I4a77f3cd0ed69c879beca81821c8c2546923006d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182004
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/vcl/inc/qt5/QtInstanceTreeView.hxx 
b/vcl/inc/qt5/QtInstanceTreeView.hxx
index aa0249af6dcf..0edcf22d6095 100644
--- a/vcl/inc/qt5/QtInstanceTreeView.hxx
+++ b/vcl/inc/qt5/QtInstanceTreeView.hxx
@@ -48,8 +48,8 @@ public:
     virtual void set_sensitive(int nRow, bool bSensitive, int nCol = -1) 
override;
     virtual bool get_sensitive(int nRow, int nCol) const override;
     virtual void set_id(int row, const OUString& rId) override;
-    virtual void set_toggle(int row, TriState eState, int col = -1) override;
-    virtual TriState get_toggle(int row, int col = -1) const override;
+    virtual void set_toggle(int nRow, TriState eState, int nCol = -1) override;
+    virtual TriState get_toggle(int nRow, int nCol = -1) const override;
     virtual void set_image(int nRow, const OUString& rImage, int nCol = -1) 
override;
     virtual void set_image(int nRow, VirtualDevice& rImage, int nCol = -1) 
override;
     virtual void set_image(int nRow, const 
css::uno::Reference<css::graphic::XGraphic>& rImage,
@@ -100,8 +100,8 @@ public:
     virtual void set_text_emphasis(const weld::TreeIter& rIter, bool bOn, int 
col) override;
     virtual bool get_text_emphasis(const weld::TreeIter& rIter, int col) const 
override;
     virtual void set_text_align(const weld::TreeIter& rIter, double fAlign, 
int col) override;
-    virtual void set_toggle(const weld::TreeIter& rIter, TriState bOn, int col 
= -1) override;
-    virtual TriState get_toggle(const weld::TreeIter& rIter, int col = -1) 
const override;
+    virtual void set_toggle(const weld::TreeIter& rIter, TriState bOn, int 
nCol = -1) override;
+    virtual TriState get_toggle(const weld::TreeIter& rIter, int nCol = -1) 
const override;
     virtual OUString get_text(const weld::TreeIter& rIter, int nCol = -1) 
const override;
     virtual void set_id(const weld::TreeIter& rIter, const OUString& rId) 
override;
     virtual OUString get_id(const weld::TreeIter& rIter) const override;
@@ -193,6 +193,9 @@ private:
     QModelIndex firstTextColumnModelIndex(int nRow) const;
     static QAbstractItemView::SelectionMode mapSelectionMode(SelectionMode 
eMode);
 
+    static Qt::CheckState toQtCheckState(TriState eTristate);
+    static TriState toVclTriState(Qt::CheckState eCheckState);
+
 private Q_SLOTS:
     void handleActivated();
     void handleSelectionChanged();
diff --git a/vcl/qt5/QtInstanceTreeView.cxx b/vcl/qt5/QtInstanceTreeView.cxx
index effcfd66d03b..2a87f398f5af 100644
--- a/vcl/qt5/QtInstanceTreeView.cxx
+++ b/vcl/qt5/QtInstanceTreeView.cxx
@@ -228,12 +228,31 @@ void QtInstanceTreeView::set_id(int nRow, const OUString& 
rId)
     });
 }
 
-void QtInstanceTreeView::set_toggle(int, TriState, int) { assert(false && "Not 
implemented yet"); }
+void QtInstanceTreeView::set_toggle(int nRow, TriState eState, int nCol)
+{
+    assert(nCol != -1 && "Special column index -1 not handled yet");
+
+    SolarMutexGuard g;
+
+    GetQtInstance().RunInMainThread([&] {
+        const QModelIndex aIndex = modelIndex(nRow, nCol);
+        m_pModel->itemFromIndex(aIndex)->setCheckState(toQtCheckState(eState));
+    });
+}
 
-TriState QtInstanceTreeView::get_toggle(int, int) const
+TriState QtInstanceTreeView::get_toggle(int nRow, int nCol) const
 {
-    assert(false && "Not implemented yet");
-    return TRISTATE_INDET;
+    assert(nCol != -1 && "Special column index -1 not handled yet");
+
+    SolarMutexGuard g;
+
+    TriState eState = TRISTATE_INDET;
+    GetQtInstance().RunInMainThread([&] {
+        const QModelIndex aIndex = modelIndex(nRow, nCol);
+        eState = toVclTriState(m_pModel->itemFromIndex(aIndex)->checkState());
+    });
+
+    return eState;
 }
 
 void QtInstanceTreeView::set_image(int nRow, const OUString& rImage, int nCol)
@@ -557,15 +576,14 @@ void QtInstanceTreeView::set_text_align(const 
weld::TreeIter&, double, int)
     assert(false && "Not implemented yet");
 }
 
-void QtInstanceTreeView::set_toggle(const weld::TreeIter&, TriState, int)
+void QtInstanceTreeView::set_toggle(const weld::TreeIter& rIter, TriState bOn, 
int nCol)
 {
-    assert(false && "Not implemented yet");
+    set_toggle(rowIndex(rIter), bOn, nCol);
 }
 
-TriState QtInstanceTreeView::get_toggle(const weld::TreeIter&, int) const
+TriState QtInstanceTreeView::get_toggle(const weld::TreeIter& rIter, int nCol) 
const
 {
-    assert(false && "Not implemented yet");
-    return TRISTATE_INDET;
+    return get_toggle(rowIndex(rIter), nCol);
 }
 
 OUString QtInstanceTreeView::get_text(const weld::TreeIter& rIter, int nCol) 
const
@@ -914,6 +932,38 @@ QModelIndex 
QtInstanceTreeView::firstTextColumnModelIndex(int nRow) const
     return QModelIndex();
 }
 
+Qt::CheckState QtInstanceTreeView::toQtCheckState(TriState eTristate)
+{
+    switch (eTristate)
+    {
+        case TRISTATE_FALSE:
+            return Qt::CheckState::Unchecked;
+        case TRISTATE_TRUE:
+            return Qt::CheckState::Checked;
+        case TRISTATE_INDET:
+            return Qt::CheckState::PartiallyChecked;
+        default:
+            assert(false && "unhandled Tristate value");
+            return Qt::CheckState::PartiallyChecked;
+    }
+}
+
+TriState QtInstanceTreeView::toVclTriState(Qt::CheckState eTristate)
+{
+    switch (eTristate)
+    {
+        case Qt::CheckState::Unchecked:
+            return TRISTATE_FALSE;
+        case Qt::CheckState::Checked:
+            return TRISTATE_TRUE;
+        case Qt::CheckState::PartiallyChecked:
+            return TRISTATE_INDET;
+        default:
+            assert(false && "unhandled Qt::CheckState value");
+            return TRISTATE_INDET;
+    }
+}
+
 void QtInstanceTreeView::handleActivated()
 {
     SolarMutexGuard g;

Reply via email to