[vlc-commits] Qt: MLModel: rework menu signaling

Francois Cartegnie git at videolan.org
Thu Jul 19 14:23:23 CEST 2012


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Jul 18 21:26:35 2012 +0200| [26222c9ba9e73afe4517b4ab974184bc185ef7c6] | committer: Francois Cartegnie

Qt: MLModel: rework menu signaling

(see previous commit)

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

 modules/gui/qt4/components/playlist/ml_model.cpp |  137 ++++++++++++++--------
 modules/gui/qt4/components/playlist/ml_model.hpp |   12 +-
 2 files changed, 91 insertions(+), 58 deletions(-)

diff --git a/modules/gui/qt4/components/playlist/ml_model.cpp b/modules/gui/qt4/components/playlist/ml_model.cpp
index 607d94d..0b0305a 100644
--- a/modules/gui/qt4/components/playlist/ml_model.cpp
+++ b/modules/gui/qt4/components/playlist/ml_model.cpp
@@ -509,6 +509,64 @@ QString MLModel::getURI( const QModelIndex &index ) const
     return QString();
 }
 
+void MLModel::actionSlot( QAction *action )
+{
+    char *uri = NULL, *path = NULL;
+    QString name;
+    QStringList mrls;
+    QModelIndex index;
+    bool ok;
+    playlist_item_t *p_item;
+
+    actionsContainerType a = action->data().value<actionsContainerType>();
+    switch ( a.action )
+    {
+
+    case actionsContainerType::ACTION_PLAY:
+        play( a.indexes.first() );
+        break;
+
+    case actionsContainerType::ACTION_ADDTOPLAYLIST:
+        break;
+
+    case actionsContainerType::ACTION_INFO:
+        if( a.indexes.first().isValid() )
+        {
+            input_item_t* p_input = getItem( a.indexes.first() )->inputItem();
+            MediaInfoDialog *mid = new MediaInfoDialog( p_intf, p_input );
+            mid->setParent( PlaylistDialog::getInstance( p_intf ),
+                            Qt::Dialog );
+            mid->show();
+        }
+        break;
+
+    case actionsContainerType::ACTION_STREAM:
+        mrls = selectedURIs( & a.indexes );
+        if( !mrls.isEmpty() )
+            THEDP->streamingDialog( NULL, mrls[0], false );
+        break;
+
+    case actionsContainerType::ACTION_EXPLORE:
+        break;
+
+    case actionsContainerType::ACTION_SAVE:
+        mrls = selectedURIs( & a.indexes );
+        if( !mrls.isEmpty() )
+            THEDP->streamingDialog( NULL, mrls[0] );
+        break;
+
+    case actionsContainerType::ACTION_ADDNODE:
+        break;
+
+    case actionsContainerType::ACTION_REMOVE:
+        doDelete( a.indexes );
+        break;
+
+    case actionsContainerType::ACTION_SORT:
+        break;
+    }
+}
+
 QModelIndex MLModel::rootIndex() const
 {
     // FIXME
@@ -535,18 +593,36 @@ bool MLModel::isCurrentItem( const QModelIndex &index, playLocation where ) cons
     return false;
 }
 
-bool MLModel::popup( const QModelIndex & index, const QPoint &point, const QModelIndexList &list )
+bool MLModel::popup( const QModelIndex & index, const QPoint &point, const QModelIndexList &selectionlist )
 {
-    current_selection = list;
-    current_index = index;
+    QModelIndexList callerAsList;
+    callerAsList << ( index.isValid() ? index : QModelIndex() );
+
+#define ADD_MENU_ENTRY( icon, title, act, data ) \
+    action = menu.addAction( icon, title ); \
+    container.action = act; \
+    container.indexes = data; \
+    action->setData( QVariant::fromValue( container ) )
+
+    /* */
     QMenu menu;
+    QAction *action;
+    VLCModel::actionsContainerType container;
+
     if( index.isValid() )
     {
-        menu.addAction( QIcon( ":/menu/play" ), qtr(I_POP_PLAY), this, SLOT( popupPlay() ) );
-        menu.addAction( QIcon( ":/menu/stream" ),
-                        qtr(I_POP_STREAM), this, SLOT( popupStream() ) );
-        menu.addAction( qtr(I_POP_SAVE), this, SLOT( popupSave() ) );
-        menu.addAction( QIcon( ":/menu/info" ), qtr(I_POP_INFO), this, SLOT( popupInfo() ) );
+        ADD_MENU_ENTRY( QIcon( ":/menu/play" ), qtr(I_POP_PLAY),
+                        container.ACTION_PLAY, callerAsList );
+
+        ADD_MENU_ENTRY( QIcon( ":/menu/stream" ), qtr(I_POP_STREAM),
+                        container.ACTION_STREAM, selectionlist );
+
+        ADD_MENU_ENTRY( QIcon(), qtr(I_POP_SAVE),
+                        container.ACTION_SAVE, selectionlist );
+
+        ADD_MENU_ENTRY( QIcon( ":/menu/info" ), qtr(I_POP_INFO),
+                        container.ACTION_INFO, callerAsList );
+
         menu.addSeparator();
     }
 
@@ -559,8 +635,8 @@ bool MLModel::popup( const QModelIndex & index, const QPoint &point, const QMode
 
     if( index.isValid() )
     {
-        menu.addAction( QIcon( ":/buttons/playlist/playlist_remove" ),
-                        qtr(I_POP_DEL), this, SLOT( popupDel() ) );
+        ADD_MENU_ENTRY( QIcon( ":/buttons/playlist/playlist_remove" ), qtr(I_POP_DEL),
+                        container.ACTION_REMOVE, selectionlist );
         menu.addSeparator();
     }
     if( !menu.isEmpty() )
@@ -570,53 +646,18 @@ bool MLModel::popup( const QModelIndex & index, const QPoint &point, const QMode
     else return false;
 }
 
-void MLModel::popupPlay()
-{
-    play( current_index );
-}
-
-void MLModel::popupDel()
-{
-    doDelete( current_selection );
-}
-
-void MLModel::popupInfo()
-{
-    MLItem *item = static_cast< MLItem* >( current_index.internalPointer() );
-    input_item_t* p_input = ml_CreateInputItem( p_ml,  item->id() );
-    MediaInfoDialog *mid = new MediaInfoDialog( p_intf, p_input );
-    mid->setParent( PlaylistDialog::getInstance( p_intf ),
-                    Qt::Dialog );
-    mid->show();
-}
-
-QStringList MLModel::selectedURIs()
+QStringList MLModel::selectedURIs( QModelIndexList *current_selection )
 {
     QStringList list;
-    for( int i = 0; i < current_selection.count(); i++ )
+    for( int i = 0; i < current_selection->count(); i++ )
     {
-        QModelIndex idx = current_selection.value(i);
+        QModelIndex idx = current_selection->value(i);
         MLItem *item = static_cast< MLItem* >( idx.internalPointer() );
         list.append( QString( item->getUri().toString() ) );
     }
     return list;
 }
 
-void MLModel::popupStream()
-{
-    QStringList mrls = selectedURIs();
-    if( !mrls.isEmpty() )
-        THEDP->streamingDialog( NULL, mrls[0], false );
-
-}
-
-void MLModel::popupSave()
-{
-    QStringList mrls = selectedURIs();
-    if( !mrls.isEmpty() )
-        THEDP->streamingDialog( NULL, mrls[0] );
-}
-
 QModelIndex MLModel::getIndexByMLID( int id ) const
 {
     for( int i = 0; i < rowCount( ); i++ )
diff --git a/modules/gui/qt4/components/playlist/ml_model.hpp b/modules/gui/qt4/components/playlist/ml_model.hpp
index 10e5e52..f01ae6a 100644
--- a/modules/gui/qt4/components/playlist/ml_model.hpp
+++ b/modules/gui/qt4/components/playlist/ml_model.hpp
@@ -95,7 +95,7 @@ public:
     void clear();
     virtual bool popup( const QModelIndex & index, const QPoint &point, const QModelIndexList &list );
     void play( const QModelIndex &idx );
-    QStringList selectedURIs();
+    QStringList selectedURIs( QModelIndexList * );
     virtual QString getURI( const QModelIndex &index ) const;
     virtual QModelIndex rootIndex() const;
     virtual bool isTree() const;
@@ -105,13 +105,7 @@ public:
 
 public slots:
     void activateItem( const QModelIndex &index );
-
-protected slots:
-    void popupDel();
-    void popupPlay();
-    void popupInfo();
-    void popupStream();
-    void popupSave();
+    virtual void actionSlot( QAction *action );
 
 protected:
     void remove( MLItem *item );
@@ -126,8 +120,6 @@ private:
     QList< MLItem* > items;
     media_library_t* p_ml;
 
-    QModelIndex current_index;
-    QModelIndexList current_selection;
 };
 
 #endif



More information about the vlc-commits mailing list