[vlc-devel] [PATCH 09/21] qt: allow multple subtitle selection from TrackListModel

Prince Gupta guptaprince8832 at gmail.com
Fri Oct 23 15:21:03 CEST 2020


---
 modules/gui/qt/player/input_models.cpp | 30 ++++++++++++++++++++++++--
 modules/gui/qt/player/input_models.hpp |  9 +++++++-
 2 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/modules/gui/qt/player/input_models.cpp b/modules/gui/qt/player/input_models.cpp
index 3164ad845c..e45955a627 100644
--- a/modules/gui/qt/player/input_models.cpp
+++ b/modules/gui/qt/player/input_models.cpp
@@ -66,8 +66,8 @@ bool TrackListModel::setData(const QModelIndex &index, const QVariant &value, in
         vlc_es_id_t *es_id = m_data[row].m_id.get();
         const enum es_format_category_e cat = vlc_es_id_GetCat(es_id);
         enum vlc_player_select_policy policy =
-            cat == VIDEO_ES ? VLC_PLAYER_SELECT_SIMULTANEOUS
-                            : VLC_PLAYER_SELECT_EXCLUSIVE;
+            ( cat ==  VIDEO_ES ) || m_multiSelect ? VLC_PLAYER_SELECT_SIMULTANEOUS
+                                                  : VLC_PLAYER_SELECT_EXCLUSIVE;
         vlc_player_SelectEsId(m_player, es_id, policy);
     }
     else
@@ -153,6 +153,32 @@ QHash<int, QByteArray> TrackListModel::roleNames() const
     return roleNames;
 }
 
+void TrackListModel::setMultiSelect(bool multiSelect)
+{
+    if (m_multiSelect == multiSelect)
+        return;
+
+    m_multiSelect = multiSelect;
+    if ( !m_multiSelect && getCount() > 1 )
+    {
+        int firstSelectedIndex = -1;
+        for ( int i = 0; i < getCount(); i++ )
+        {
+            if ( data( index( i ), Qt::CheckStateRole ).toBool() )
+            {
+                if (firstSelectedIndex != -1)
+                    setData( index(i), false, Qt::CheckStateRole );
+                else
+                    firstSelectedIndex = i;
+            }
+        }
+
+        if ( firstSelectedIndex != -1 )
+            setData( index(firstSelectedIndex), true, Qt::CheckStateRole );
+    }
+    emit multiSelectChanged(m_multiSelect);
+}
+
 TrackListModel::Data::Data(const vlc_player_track *track_info)
     : m_title( qfu(track_info->name) )
     , m_id( track_info->es_id, true )
diff --git a/modules/gui/qt/player/input_models.hpp b/modules/gui/qt/player/input_models.hpp
index d8f9db5467..f1b6730450 100644
--- a/modules/gui/qt/player/input_models.hpp
+++ b/modules/gui/qt/player/input_models.hpp
@@ -45,7 +45,7 @@ class TrackListModel : public QAbstractListModel
 {
     Q_OBJECT
     Q_PROPERTY(int count READ getCount NOTIFY countChanged)
-
+    Q_PROPERTY(bool multiSelect READ getMultiSelect WRITE setMultiSelect NOTIFY multiSelectChanged)
 
 public:
     TrackListModel(vlc_player_t* player, QObject* parent = nullptr);
@@ -68,8 +68,14 @@ public:
 
     inline int getCount() const { return m_data.size(); }
 
+    inline bool getMultiSelect() const { return m_multiSelect; }
+
+public slots:
+    void setMultiSelect(bool multiSelect);
+
 signals:
     void countChanged();
+    void multiSelectChanged(bool multiSelect);
 
 private:
     vlc_player_t* m_player;
@@ -88,6 +94,7 @@ private:
         bool m_selected = false;
     };
     QList<Data> m_data;
+    bool m_multiSelect = false; // this only work for subtitles
 };
 
 /**
-- 
2.25.1



More information about the vlc-devel mailing list