[vlc-commits] commit: Qt: allow sorting by any meta in any view using right-click menu ( Jakob Leben )

git version control git at videolan.org
Thu Mar 4 10:34:08 CET 2010


vlc | branch: master | Jakob Leben <jleben at videolan.org> | Thu Mar  4 10:31:45 2010 +0100| [fcc3616f567ed1b6cc5113e49d7c4c307ba6cafc] | committer: Jakob Leben 

Qt: allow sorting by any meta in any view using right-click menu

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

 .../gui/qt4/components/playlist/playlist_model.cpp |   38 +++++++++++++-------
 .../gui/qt4/components/playlist/playlist_model.hpp |    7 ++--
 2 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/modules/gui/qt4/components/playlist/playlist_model.cpp b/modules/gui/qt4/components/playlist/playlist_model.cpp
index 3d63618..ed70f4b 100644
--- a/modules/gui/qt4/components/playlist/playlist_model.cpp
+++ b/modules/gui/qt4/components/playlist/playlist_model.cpp
@@ -72,6 +72,7 @@ PLModel::PLModel( playlist_t *_p_playlist,  /* THEPL */
     i_cached_id       = -1;
     i_cached_input_id = -1;
     i_popup_item      = i_popup_parent = -1;
+    sortingMenu       = NULL;
 
     rootItem          = NULL; /* PLItem rootItem, will be set in rebuild( ) */
 
@@ -102,6 +103,7 @@ PLModel::PLModel( playlist_t *_p_playlist,  /* THEPL */
 PLModel::~PLModel()
 {
     delete rootItem;
+    delete sortingMenu;
 }
 
 Qt::DropActions PLModel::supportedDropActions() const
@@ -952,12 +954,25 @@ bool PLModel::popup( const QModelIndex & index, const QPoint &point, const QMode
     if( i_popup_item > -1 )
     {
         menu.addSeparator();
-        QMenu *sort_menu = menu.addMenu( qtr( "Sort by" ) + QString(" ") +
-            qfu( psz_column_title( columnToMeta( index.column() ) ) ) );
-        sort_menu->addAction( qtr( "Ascending" ),
-            this, SLOT( popupSortAsc() ) );
-        sort_menu->addAction( qtr( "Descending" ),
-            this, SLOT( popupSortDesc() ) );
+        if( !sortingMenu )
+        {
+            sortingMenu = new QMenu( qtr( "Sort by" ) );
+            sortingMapper = new QSignalMapper( this );
+            int i, j;
+            for( i = 1, j = 1; i < COLUMN_END; i <<= 1, j++ )
+            {
+                if( i == COLUMN_NUMBER ) continue;
+                QMenu *m = sortingMenu->addMenu( qfu( psz_column_title( i ) ) );
+                QAction *asc = m->addAction( qtr("Ascending") );
+                QAction *desc = m->addAction( qtr("Descending") );
+                sortingMapper->setMapping( asc, j );
+                sortingMapper->setMapping( desc, -j );
+                CONNECT( asc, triggered(), sortingMapper, map() );
+                CONNECT( desc, triggered(), sortingMapper, map() );
+            }
+            CONNECT( sortingMapper, mapped( int ), this, popupSort( int ) );
+        }
+        menu.addMenu( sortingMenu );
     }
     if( !menu.isEmpty() )
     {
@@ -1065,12 +1080,9 @@ void PLModel::popupAddNode()
     PL_UNLOCK;
 }
 
-void PLModel::popupSortAsc()
-{
-    sort( i_popup_parent, i_popup_column, Qt::AscendingOrder );
-}
-
-void PLModel::popupSortDesc()
+void PLModel::popupSort( int column )
 {
-    sort( i_popup_parent, i_popup_column, Qt::DescendingOrder );
+    sort( i_popup_parent,
+          column > 0 ? column - 1 : -column - 1,
+          column > 0 ? Qt::AscendingOrder : Qt::DescendingOrder );
 }
diff --git a/modules/gui/qt4/components/playlist/playlist_model.hpp b/modules/gui/qt4/components/playlist/playlist_model.hpp
index 2bd9ef2..4b31f1f 100644
--- a/modules/gui/qt4/components/playlist/playlist_model.hpp
+++ b/modules/gui/qt4/components/playlist/playlist_model.hpp
@@ -43,8 +43,8 @@
 #include <QSignalMapper>
 #include <QAbstractItemModel>
 #include <QVariant>
+#include <QAction>
 
-class QSignalMapper;
 class PLItem;
 
 class PLModel : public QAbstractItemModel
@@ -145,6 +145,8 @@ private:
     /* Popup */
     int i_popup_item, i_popup_parent, i_popup_column;
     QModelIndexList current_selection;
+    QMenu *sortingMenu;
+    QSignalMapper *sortingMapper;
 
     /* Lookups */
     PLItem *findById( PLItem *, int );
@@ -165,8 +167,7 @@ private slots:
     void popupSave();
     void popupExplore();
     void popupAddNode();
-    void popupSortAsc();
-    void popupSortDesc();
+    void popupSort( int column );
     void processInputItemUpdate( input_item_t *);
     void processInputItemUpdate( input_thread_t* p_input );
     void processItemRemoval( int i_id );



More information about the vlc-commits mailing list