[vlc-commits] Qt: extension dialog: update checkboxes if a check state was changed

Daniel Amm git at videolan.org
Mon Jun 15 19:27:16 CEST 2015


vlc | branch: master | Daniel Amm <da2424 at t-online.de> | Mon Jun 15 18:19:46 2015 +0200| [1a2f7b20412973d6748bd3188130aba7b6d5e855] | committer: Jean-Baptiste Kempf

Qt: extension dialog: update checkboxes if a check state was changed

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1a2f7b20412973d6748bd3188130aba7b6d5e855
---

 modules/gui/qt4/components/simple_preferences.cpp |   43 +++++++++++++++++++++
 modules/gui/qt4/components/simple_preferences.hpp |    1 +
 2 files changed, 44 insertions(+)

diff --git a/modules/gui/qt4/components/simple_preferences.cpp b/modules/gui/qt4/components/simple_preferences.cpp
index 8195b18..8372700 100644
--- a/modules/gui/qt4/components/simple_preferences.cpp
+++ b/modules/gui/qt4/components/simple_preferences.cpp
@@ -1352,6 +1352,8 @@ void SPrefsPanel::assoDialog()
 #undef aTv
 #undef aTa
 
+    CONNECT( filetypeList, itemChanged(QTreeWidgetItem*, int), this, updateCheckBoxes(QTreeWidgetItem*, int) );
+
     QDialogButtonBox *buttonBox = new QDialogButtonBox( d );
     QPushButton *closeButton = new QPushButton( qtr( "&Apply" ) );
     QPushButton *clearButton = new QPushButton( qtr( "&Cancel" ) );
@@ -1368,6 +1370,47 @@ void SPrefsPanel::assoDialog()
     listAsso.clear();
 }
 
+void SPrefsPanel::updateCheckBoxes(QTreeWidgetItem* item, int column)
+{
+    if( column != 0 )
+        return;
+
+    /* temporarily block signals to avoid signal loops */
+    bool b_signalsBlocked = item->treeWidget()->blockSignals(true);
+
+    /* A parent checkbox was changed */
+    if( item->parent() == 0 )
+    {
+        Qt::CheckState checkState = item->checkState(0);
+        for( int i = 0; i < item->childCount(); i++ )
+        {
+            item->child(i)->setCheckState(0, checkState);
+        }
+    }
+
+    /* A child checkbox was changed */
+    else
+    {
+        bool b_diff = false;
+        for( int i = 0; i < item->parent()->childCount(); i++ )
+        {
+            if( i != item->parent()->indexOfChild(item) && item->checkState(0) != item->parent()->child(i)->checkState(0) )
+            {
+                b_diff = true;
+                break;
+            }
+        }
+
+        if( b_diff )
+            item->parent()->setCheckState(0, Qt::PartiallyChecked);
+        else
+            item->parent()->setCheckState(0, item->checkState(0));
+    }
+
+    /* Stop signal blocking */
+    item->treeWidget()->blockSignals(b_signalsBlocked);
+}
+
 void addAsso( QVLCRegistry *qvReg, const char *psz_ext )
 {
     QString s_path( "VLC" ); s_path += psz_ext;
diff --git a/modules/gui/qt4/components/simple_preferences.hpp b/modules/gui/qt4/components/simple_preferences.hpp
index 531fb94..8b14323 100644
--- a/modules/gui/qt4/components/simple_preferences.hpp
+++ b/modules/gui/qt4/components/simple_preferences.hpp
@@ -122,6 +122,7 @@ private slots:
     void langChanged( int );
 #ifdef _WIN32
     void assoDialog();
+    void updateCheckBoxes( QTreeWidgetItem*, int );
     void saveAsso();
 #endif
     void configML();



More information about the vlc-commits mailing list