+/*********** Popup *********/
+bool StandardPLPanel::popup( const QModelIndex & index, const QPoint &point, const QModelIndexList &selectionlist )
+{
+ VLCModel *model = qobject_cast<VLCModel*>(currentView->model());
+ QModelIndexList callerAsList;
+ callerAsList << ( index.isValid() ? index : QModelIndex() );
+ popupIndex = index; /* suitable for modal only */
+
+#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;
+ PLModel::actionsContainerType container;
+
+ /* Play/Stream/Info static actions */
+ if( index.isValid() )
+ {
+ ADD_MENU_ENTRY( QIcon( ":/menu/play" ), qtr(I_POP_PLAY),
+ container.ACTION_PLAY, callerAsList );
+
+ menu.addAction( QIcon( ":/menu/stream" ), qtr(I_POP_STREAM),
+ this, SLOT( popupStream() ) );
+
+ menu.addAction( QIcon(), qtr(I_POP_SAVE),
+ this, SLOT( popupSave() ) );
+
+ menu.addAction( QIcon( ":/menu/info" ), qtr(I_POP_INFO),
+ this, SLOT( popupInfoDialog() ) );
+
+ menu.addSeparator();
+
+ if( model->getURI( index ).startsWith( "file://" ) )
+ menu.addAction( QIcon( ":/type/folder-grey" ), qtr(I_POP_EXPLORE),
+ this, SLOT( popupExplore() ) );
+ }
+
+ /* In PL or ML, allow to add a file/folder */
+ if( model->canEdit() )
+ {
+ QIcon addIcon( ":/buttons/playlist/playlist_add" );
+
+ if( model->isTree() )
+ menu.addAction( addIcon, qtr(I_POP_NEWFOLDER),
+ this, SLOT( popupPromptAndCreateNode() ) );
+
+ menu.addSeparator();
+ if( model->isCurrentItem( model->rootIndex(), PLModel::IN_PLAYLIST ) )
+ {
+ menu.addAction( addIcon, qtr(I_PL_ADDF), THEDP, SLOT( simplePLAppendDialog()) );
+ menu.addAction( addIcon, qtr(I_PL_ADDDIR), THEDP, SLOT( PLAppendDir()) );
+ menu.addAction( addIcon, qtr(I_OP_ADVOP), THEDP, SLOT( PLAppendDialog()) );
+ }
+ else if( model->isCurrentItem( model->rootIndex(), PLModel::IN_MEDIALIBRARY ) )
+ {
+ menu.addAction( addIcon, qtr(I_PL_ADDF), THEDP, SLOT( simpleMLAppendDialog()) );
+ menu.addAction( addIcon, qtr(I_PL_ADDDIR), THEDP, SLOT( MLAppendDir() ) );
+ menu.addAction( addIcon, qtr(I_OP_ADVOP), THEDP, SLOT( MLAppendDialog() ) );
+ }
+ }
+
+ if( index.isValid() )
+ {
+ if( !model->isCurrentItem( model->rootIndex(), PLModel::IN_PLAYLIST ) )
+ {
+ ADD_MENU_ENTRY( QIcon(), qtr(I_PL_ADDPL),
+ container.ACTION_ADDTOPLAYLIST, selectionlist );
+ }
+ }
+
+ menu.addSeparator();
+
+ /* Item removal */
+ if( index.isValid() )
+ {
+ ADD_MENU_ENTRY( QIcon( ":/buttons/playlist/playlist_remove" ), qtr(I_POP_DEL),
+ container.ACTION_REMOVE, selectionlist );
+ }
+
+ if( model->canEdit() ) {
+ menu.addAction( QIcon( ":/toolbar/clear" ), qtr("Clear the playlist"),
+ model, SLOT( clearPlaylist() ) );
+ }
+
+ menu.addSeparator();
+
+ /* Playlist sorting */
+ QMenu *sortingMenu = new QMenu( qtr( "Sort by" ) );
+ /* Choose what columns to show in sorting menu, not sure if this should be configurable*/
+ QList<int> sortingColumns;
+ sortingColumns << COLUMN_TITLE << COLUMN_ARTIST << COLUMN_ALBUM << COLUMN_TRACK_NUMBER << COLUMN_URI;
+ container.action = container.ACTION_SORT;
+ container.indexes = callerAsList;
+ foreach( int Column, sortingColumns )
+ {
+ action = sortingMenu->addAction( qfu( psz_column_title( Column ) ) + " " + qtr("Ascending") );
+ container.column = model->columnFromMeta(Column) + 1;
+ action->setData( QVariant::fromValue( container ) );
+
+ action = sortingMenu->addAction( qfu( psz_column_title( Column ) ) + " " + qtr("Descending") );
+ container.column = -1 * (model->columnFromMeta(Column)+1);
+ action->setData( QVariant::fromValue( container ) );
+ }
+ menu.addMenu( sortingMenu );
+
+ /* Zoom */
+ QMenu *zoomMenu = new QMenu( qtr( "Display size" ) );
+ zoomMenu->addAction( qtr( "Increase" ), this, SLOT( increaseZoom() ) );
+ zoomMenu->addAction( qtr( "Decrease" ), this, SLOT( decreaseZoom() ) );
+ menu.addMenu( zoomMenu );
+
+ CONNECT( &menu, triggered( QAction * ), model, actionSlot( QAction * ) );
+
+ menu.addMenu( StandardPLPanel::viewSelectionMenu( this ) );
+
+ /* Display and forward the result */
+ if( !menu.isEmpty() )
+ {
+ menu.exec( point ); return true;
+ }
+ else return false;
+
+#undef ADD_MENU_ENTRY
+}
+
+QMenu* StandardPLPanel::viewSelectionMenu( StandardPLPanel *panel )
+{
+ QMenu *viewMenu = new QMenu( qtr( "Playlist View Mode" ) );
+ QSignalMapper *viewSelectionMapper = new QSignalMapper( viewMenu );
+ CONNECT( viewSelectionMapper, mapped( int ), panel, showView( int ) );
+
+ QActionGroup *viewGroup = new QActionGroup( viewMenu );
+# define MAX_VIEW StandardPLPanel::VIEW_COUNT
+ for( int i = 0; i < MAX_VIEW; i++ )
+ {
+ QAction *action = viewMenu->addAction( viewNames[i] );
+ action->setCheckable( true );
+ viewGroup->addAction( action );
+ viewSelectionMapper->setMapping( action, i );
+ CONNECT( action, triggered(), viewSelectionMapper, map() );
+ if( panel->currentViewIndex() == i )
+ action->setChecked( true );
+ }
+ return viewMenu;
+}
+
+void StandardPLPanel::popupSelectColumn( QPoint )