]> git.sesse.net Git - vlc/commitdiff
Qt: allow sorting by any meta in any view using right-click menu
authorJakob Leben <jleben@videolan.org>
Thu, 4 Mar 2010 09:31:45 +0000 (10:31 +0100)
committerJakob Leben <jleben@videolan.org>
Thu, 4 Mar 2010 09:31:45 +0000 (10:31 +0100)
modules/gui/qt4/components/playlist/playlist_model.cpp
modules/gui/qt4/components/playlist/playlist_model.hpp

index 3d63618aacf6f5eb9522b48630462ddce84d02f3..ed70f4bba2937ec3931ee68040348185a37eb18a 100644 (file)
@@ -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 );
 }
index 2bd9ef2e7df314daee8c2587e22027dfdf9554c8..4b31f1f29e8f6d2363da55836a0dd6a16866773c 100644 (file)
@@ -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 );