X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fgui%2Fqt4%2Fcomponents%2Fplaylist%2Fstandardpanel.cpp;h=4ac1da2240845f635b0430e7267306f4ec1a71ac;hb=5a38d2b20e1c04853679206bf2e7ec839d450563;hp=2d1a8b69aa0b103094e459023079a0ecd0723c22;hpb=2bde17e1579fd13cb0c067baebb1b984e1186cda;p=vlc diff --git a/modules/gui/qt4/components/playlist/standardpanel.cpp b/modules/gui/qt4/components/playlist/standardpanel.cpp index 2d1a8b69aa..4ac1da2240 100644 --- a/modules/gui/qt4/components/playlist/standardpanel.cpp +++ b/modules/gui/qt4/components/playlist/standardpanel.cpp @@ -27,25 +27,23 @@ #include "qt4.hpp" #include "dialogs_provider.hpp" + #include "components/playlist/playlist_model.hpp" #include "components/playlist/panels.hpp" #include "util/customwidgets.hpp" #include -#include #include #include #include #include #include #include -#include #include #include #include #include - #include #include "sorting.h" @@ -62,45 +60,49 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, layout->setSpacing( 0 ); layout->setMargin( 0 ); /* Create and configure the QTreeView */ - view = new QVLCTreeView( 0 ); - view->setSortingEnabled( true ); - view->sortByColumn( 0 , Qt::AscendingOrder ); + view = new QVLCTreeView; view->setModel( model ); view->setIconSize( QSize( 20, 20 ) ); view->setAlternatingRowColors( true ); view->setAnimated( true ); + view->setSelectionBehavior( QAbstractItemView::SelectRows ); view->setSelectionMode( QAbstractItemView::ExtendedSelection ); view->setDragEnabled( true ); view->setAcceptDrops( true ); view->setDropIndicatorShown( true ); - view->setAutoScroll( true ); + view->header()->setSortIndicator( -1 , Qt::AscendingOrder ); + view->setUniformRowHeights( true ); + view->setSortingEnabled( true ); + -#if HAS_QT43 + getSettings()->beginGroup("Playlist"); if( getSettings()->contains( "headerState" ) ) { - view->header()->restoreState( getSettings()->value( "headerState" ).toByteArray() ); - msg_Dbg( p_intf, "exists" ); + view->header()->restoreState( + getSettings()->value( "headerState" ).toByteArray() ); } else -#endif { /* Configure the size of the header */ view->header()->resizeSection( 0, 200 ); view->header()->resizeSection( 1, 80 ); - view->header()->setSortIndicatorShown( true ); - view->header()->setClickable( true ); - view->header()->setContextMenuPolicy( Qt::CustomContextMenu ); } + view->header()->setSortIndicatorShown( true ); + view->header()->setClickable( true ); + view->header()->setContextMenuPolicy( Qt::CustomContextMenu ); + getSettings()->endGroup(); /* Connections for the TreeView */ CONNECT( view, activated( const QModelIndex& ) , model,activateItem( const QModelIndex& ) ); CONNECT( view, rightClicked( QModelIndex , QPoint ), this, doPopup( QModelIndex, QPoint ) ); - CONNECT( model, dataChanged( const QModelIndex&, const QModelIndex& ), - this, handleExpansion( const QModelIndex& ) ); CONNECT( view->header(), customContextMenuRequested( const QPoint & ), this, popupSelectColumn( QPoint ) ); + CONNECT( model, currentChanged( const QModelIndex& ), + this, handleExpansion( const QModelIndex& ) ); + CONNECT( model, columnsChanged( int ), + this, checkSortingIndicator( int ) ); currentRootId = -1; CONNECT( parent, rootChanged( int ), this, setCurrentRootId( int ) ); @@ -110,49 +112,46 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, /* Add item to the playlist button */ addButton = new QPushButton; - addButton->setIcon( QIcon( ":/playlist_add" ) ); + addButton->setIcon( QIcon( ":/buttons/playlist/playlist_add" ) ); addButton->setMaximumWidth( 30 ); BUTTONACT( addButton, popupAdd() ); buttons->addWidget( addButton ); /* Random 2-state button */ randomButton = new QPushButton( this ); - if( model->hasRandom() ) - { - randomButton->setIcon( QIcon( ":/shuffle_on" )); - randomButton->setToolTip( qtr( I_PL_RANDOM )); - } - else - { - randomButton->setIcon( QIcon( ":/shuffle_off" ) ); - randomButton->setToolTip( qtr( I_PL_NORANDOM )); - } + randomButton->setIcon( QIcon( ":/buttons/playlist/shuffle_on" )); + randomButton->setToolTip( qtr( I_PL_RANDOM )); + randomButton->setCheckable( true ); + randomButton->setChecked( model->hasRandom() ); BUTTONACT( randomButton, toggleRandom() ); buttons->addWidget( randomButton ); /* Repeat 3-state button */ repeatButton = new QPushButton( this ); + repeatButton->setToolTip( qtr( "Click to toggle between loop one, loop all" ) ); + repeatButton->setCheckable( true ); + if( model->hasRepeat() ) { - repeatButton->setIcon( QIcon( ":/repeat_one" ) ); - repeatButton->setToolTip( qtr( I_PL_REPEAT )); + repeatButton->setIcon( QIcon( ":/buttons/playlist/repeat_one" ) ); + repeatButton->setChecked( true ); } else if( model->hasLoop() ) { - repeatButton->setIcon( QIcon( ":/repeat_all" ) ); - repeatButton->setToolTip( qtr( I_PL_LOOP )); + repeatButton->setIcon( QIcon( ":/buttons/playlist/repeat_all" ) ); + repeatButton->setChecked( true ); } else { - repeatButton->setIcon( QIcon( ":/repeat_off" ) ); - repeatButton->setToolTip( qtr( I_PL_NOREPEAT )); + repeatButton->setIcon( QIcon( ":/buttons/playlist/repeat_one" ) ); + repeatButton->setChecked( false ); } BUTTONACT( repeatButton, toggleRepeat() ); buttons->addWidget( repeatButton ); /* Goto */ gotoPlayingButton = new QPushButton; - BUTTON_SET_ACT_I( gotoPlayingButton, "", jump_to, + BUTTON_SET_ACT_I( gotoPlayingButton, "", buttons/playlist/jump_to, qtr( "Show the current item" ), gotoPlayingItem() ); buttons->addWidget( gotoPlayingButton ); @@ -163,15 +162,10 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, QLabel *filter = new QLabel( qtr(I_PL_SEARCH) + " " ); buttons->addWidget( filter ); - searchLine = new ClickLineEdit( qtr(I_PL_FILTER), 0 ); - searchLine->setMinimumWidth( 80 ); - CONNECT( searchLine, textChanged(QString), this, search(QString)); - buttons->addWidget( searchLine ); filter->setBuddy( searchLine ); - - QPushButton *clear = new QPushButton; - clear->setMaximumWidth( 30 ); - BUTTON_SET_ACT_I( clear, "", clear, qtr( "Clear" ), clearFilter() ); - buttons->addWidget( clear ); + SearchLineEdit *search = new SearchLineEdit( this ); + buttons->addWidget( search ); + filter->setBuddy( search ); + CONNECT( search, textChanged( const QString& ), this, search( const QString& ) ); /* Finish the layout */ layout->addWidget( view ); @@ -186,20 +180,20 @@ void StandardPLPanel::toggleRepeat() if( model->hasRepeat() ) { model->setRepeat( false ); model->setLoop( true ); - repeatButton->setIcon( QIcon( ":/repeat_all" ) ); - repeatButton->setToolTip( qtr( I_PL_LOOP )); + repeatButton->setIcon( QIcon( ":/buttons/playlist/repeat_all" ) ); + repeatButton->setChecked( true ); } else if( model->hasLoop() ) { model->setRepeat( false ) ; model->setLoop( false ); - repeatButton->setIcon( QIcon( ":/repeat_off" ) ); - repeatButton->setToolTip( qtr( I_PL_NOREPEAT )); + repeatButton->setChecked( false ); + repeatButton->setIcon( QIcon( ":/buttons/playlist/repeat_one" ) ); } else { - model->setRepeat( true ); - repeatButton->setIcon( QIcon( ":/repeat_one" ) ); - repeatButton->setToolTip( qtr( I_PL_REPEAT )); + model->setRepeat( true ); model->setLoop( false ); + repeatButton->setChecked( true ); + repeatButton->setIcon( QIcon( ":/buttons/playlist/repeat_one" ) ); } } @@ -208,10 +202,6 @@ void StandardPLPanel::toggleRandom() { bool prev = model->hasRandom(); model->setRandom( !prev ); - randomButton->setIcon( prev ? - QIcon( ":/shuffle_off" ) : - QIcon( ":/shuffle_on" ) ); - randomButton->setToolTip( prev ? qtr( I_PL_NORANDOM ) : qtr(I_PL_RANDOM ) ); } void StandardPLPanel::gotoPlayingItem() @@ -219,10 +209,9 @@ void StandardPLPanel::gotoPlayingItem() view->scrollTo( view->currentIndex() ); } -void StandardPLPanel::handleExpansion( const QModelIndex &index ) +void StandardPLPanel::handleExpansion( const QModelIndex& index ) { - if( model->isCurrent( index ) ) - view->scrollTo( index, QAbstractItemView::EnsureVisible ); + view->scrollTo( index ); } void StandardPLPanel::setCurrentRootId( int _new ) @@ -253,29 +242,76 @@ void StandardPLPanel::popupAdd() if( currentRootId == THEPL->p_local_category->i_id || currentRootId == THEPL->p_local_onelevel->i_id ) { - popup.addAction( qtr(I_PL_ADDF), THEDP, SLOT(PLAppendDialog()) ); + popup.addAction( qtr(I_PL_ADDF), THEDP, SLOT( simplePLAppendDialog()) ); popup.addAction( qtr(I_PL_ADDDIR), THEDP, SLOT( PLAppendDir()) ); + popup.addAction( qtr(I_OP_ADVOP), THEDP, SLOT( PLAppendDialog()) ); } else if( ( THEPL->p_ml_category && currentRootId == THEPL->p_ml_category->i_id ) || ( THEPL->p_ml_onelevel && currentRootId == THEPL->p_ml_onelevel->i_id ) ) { - popup.addAction( qtr(I_PL_ADDF), THEDP, SLOT( MLAppendDialog() ) ); + popup.addAction( qtr(I_PL_ADDF), THEDP, SLOT( simpleMLAppendDialog()) ); popup.addAction( qtr(I_PL_ADDDIR), THEDP, SLOT( MLAppendDir() ) ); + popup.addAction( qtr(I_OP_ADVOP), THEDP, SLOT( MLAppendDialog() ) ); } + popup.exec( QCursor::pos() - addButton->mapFromGlobal( QCursor::pos() ) + QPoint( 0, addButton->height() ) ); } +/* Set sortingindicator to -1 if it's on column thats removed, + * else check that it's still showing on correct column + */ +void StandardPLPanel::checkSortingIndicator( int meta ) +{ + int index=0; + + if( view->header()->isSortIndicatorShown() == false ) + return; + + int sortIndex = view->header()->sortIndicatorSection(); + if( sortIndex < 0 || sortIndex > view->header()->count() || meta == 0 ) + return; + + int _meta = meta; + + while( _meta ) + { + if( _meta & model->shownFlags() ) + index++; + _meta >>= 1; + } + + /* Adding column */ + if( model->shownFlags() & meta ) + { + /* If column is added before sortIndex, move it one to right*/ + if( sortIndex >= index ) + { + sortIndex += 1; + } + } else { + /* Column removed */ + if( sortIndex == index ) + { + sortIndex = -1; + } else if( sortIndex > index ) + { + /* Move indicator left one step*/ + sortIndex -= 1; + } + } + view->header()->setSortIndicator( sortIndex , + view->header()->sortIndicatorOrder() ); +} + void StandardPLPanel::popupSelectColumn( QPoint pos ) { ContextUpdateMapper = new QSignalMapper(this); QMenu selectColMenu; - CONNECT( ContextUpdateMapper, mapped( int ), model, viewchanged( int ) ); - int i_column = 1; for( i_column = 1; i_column != COLUMN_END; i_column<<=1 ) { @@ -287,17 +323,13 @@ void StandardPLPanel::popupSelectColumn( QPoint pos ) CONNECT( option, triggered(), ContextUpdateMapper, map() ); } - selectColMenu.exec( QCursor::pos() ); -} + CONNECT( ContextUpdateMapper, mapped( int ), model, viewchanged( int ) ); -/* ClearFilter LineEdit */ -void StandardPLPanel::clearFilter() -{ - searchLine->setText( "" ); + selectColMenu.exec( QCursor::pos() ); } /* Search in the playlist */ -void StandardPLPanel::search( QString searchText ) +void StandardPLPanel::search( const QString& searchText ) { model->search( searchText ); } @@ -315,8 +347,7 @@ void StandardPLPanel::doPopup( QModelIndex index, QPoint point ) void StandardPLPanel::setRoot( int i_root_id ) { QPL_LOCK; - playlist_item_t *p_item = playlist_ItemGetById( THEPL, i_root_id, - pl_Locked ); + playlist_item_t *p_item = playlist_ItemGetById( THEPL, i_root_id ); assert( p_item ); p_item = playlist_GetPreferredNode( THEPL, p_item ); assert( p_item ); @@ -352,11 +383,9 @@ void StandardPLPanel::deleteSelection() StandardPLPanel::~StandardPLPanel() { -#if HAS_QT43 - getSettings()->beginGroup("playlistdialog"); + getSettings()->beginGroup("Playlist"); getSettings()->setValue( "headerState", view->header()->saveState() ); getSettings()->endGroup(); -#endif }