From 2374891236fbede14dc2548e1dc7790b662a5d5d Mon Sep 17 00:00:00 2001 From: Jakob Leben Date: Sun, 30 Aug 2009 04:08:57 +0200 Subject: [PATCH] qt4: let QTreeView manage visible playlist columns selection And remove a lot of unnecessary code. --- .../gui/qt4/components/playlist/panels.hpp | 4 +- .../components/playlist/playlist_model.cpp | 137 +++--------------- .../components/playlist/playlist_model.hpp | 12 +- .../qt4/components/playlist/standardpanel.cpp | 86 +++++------ 4 files changed, 56 insertions(+), 183 deletions(-) diff --git a/modules/gui/qt4/components/playlist/panels.hpp b/modules/gui/qt4/components/playlist/panels.hpp index 6876f0c035..4654b09e3f 100644 --- a/modules/gui/qt4/components/playlist/panels.hpp +++ b/modules/gui/qt4/components/playlist/panels.hpp @@ -75,7 +75,7 @@ private: QTreeView *view; QPushButton *repeatButton, *randomButton, *addButton, *gotoPlayingButton; int currentRootId; - QSignalMapper *ContextUpdateMapper; + QSignalMapper *selectColumnsSigMapper; public slots: void removeItem( int ); virtual void setRoot( int ); @@ -90,7 +90,7 @@ private slots: void setCurrentRootId( int ); void popupAdd(); void popupSelectColumn( QPoint ); - void checkSortingIndicator( int ); + void toggleColumnShown( int ); }; #endif diff --git a/modules/gui/qt4/components/playlist/playlist_model.cpp b/modules/gui/qt4/components/playlist/playlist_model.cpp index 62704e7724..0d5f7b5630 100644 --- a/modules/gui/qt4/components/playlist/playlist_model.cpp +++ b/modules/gui/qt4/components/playlist/playlist_model.cpp @@ -78,17 +78,6 @@ PLModel::PLModel( playlist_t *_p_playlist, /* THEPL */ rootItem = NULL; /* PLItem rootItem, will be set in rebuild( ) */ - if( i_depth == DEPTH_SEL ) - i_showflags = 0; - else - { - i_showflags = getSettings()->value( "qt-pl-showflags", COLUMN_DEFAULT ).toInt(); - if( i_showflags < 1) - i_showflags = COLUMN_DEFAULT; /* reasonable default to show something */ - else if ( i_showflags >= COLUMN_END ) - i_showflags = COLUMN_END - 1; /* show everything */ - } - /* Icons initialization */ #define ADD_ICON(type, x) icons[ITEM_TYPE_##type] = QIcon( QPixmap( x ) ) ADD_ICON( UNKNOWN , type_unknown_xpm ); @@ -102,20 +91,15 @@ PLModel::PLModel( playlist_t *_p_playlist, /* THEPL */ ADD_ICON( NODE, ":/type/node" ); #undef ADD_ICON - ContextUpdateMapper = new QSignalMapper(this); - rebuild( p_root ); CONNECT( THEMIM->getIM(), metaChanged( input_item_t *), this, processInputItemUpdate( input_item_t *) ); CONNECT( THEMIM, inputChanged( input_thread_t * ), this, processInputItemUpdate( input_thread_t* ) ); - CONNECT( ContextUpdateMapper, mapped( int ), this, toggleColumnShown( int ) ); } PLModel::~PLModel() { - if(i_depth == -1) - getSettings()->setValue( "qt-pl-showflags", i_showflags ); delCallbacks(); delete rootItem; } @@ -374,7 +358,7 @@ QVariant PLModel::data( const QModelIndex &index, int role ) const return QVariant(returninfo); } - int metadata = columnToMeta( index.column(), i_showflags ); + int metadata = columnToMeta( index.column() ); if( metadata == COLUMN_END ) return QVariant(); QString returninfo; @@ -423,7 +407,7 @@ QVariant PLModel::headerData( int section, Qt::Orientation orientation, if( i_depth == DEPTH_SEL ) return QVariant( QString("") ); - int meta_col = columnToMeta( section, i_showflags ); + int meta_col = columnToMeta( section ); if( meta_col == COLUMN_END ) return QVariant(); @@ -478,17 +462,7 @@ QModelIndex PLModel::parent( const QModelIndex &index ) const int PLModel::columnCount( const QModelIndex &i) const { - int columnCount=0; - int metadata=1; - if( i_depth == DEPTH_SEL ) return 1; - - while( metadata < COLUMN_END ) - { - if( metadata & i_showflags ) - columnCount++; - metadata <<= 1; - } - return columnCount; + return i_depth == DEPTH_SEL ? 1 : columnFromMeta( COLUMN_END ); } int PLModel::rowCount( const QModelIndex &parent ) const @@ -625,48 +599,32 @@ PLItem *PLModel::getItem( QModelIndex index ) return static_cast( index.internalPointer() ); } -/* -Computes meta data column id from shown column index and shown columns flags. -Returns COLUMN_END in case of failure. -*/ -int PLModel::columnToMeta( int column, int shown_flags ) const +int PLModel::columnToMeta( int _column ) const { int meta = 1; - int index = -1; + int column = 0; - while( meta < COLUMN_END ) + while( column != _column && meta != COLUMN_END ) { - if( meta & shown_flags ) - index++; - if( index == column ) - break; meta <<= 1; + column++; } return meta; } -/* -Computes shown column index from meta data column id and shown columns flags. -meta_col must be contained in shown_flags! -*/ -int PLModel::columnFromMeta( int meta_col, int shown_flags ) const +int PLModel::columnFromMeta( int meta_col ) const { - assert( meta_col & shown_flags ); - int meta = 1; - int index = -1; + int column = 0; - while( meta < COLUMN_END ) + while( meta != meta_col && meta != COLUMN_END ) { - if( meta & shown_flags ) - index++; - if( meta == meta_col ) - break; meta <<= 1; + column++; } - return index; + return column; } /************************* Updates handling *****************************/ @@ -930,20 +888,8 @@ void PLModel::sort( int column, Qt::SortOrder order ) void PLModel::sort( int i_root_id, int column, Qt::SortOrder order ) { - int i_index = -1; - int i_flag = 0; - - int i_column = 1; - for( i_column = 1; i_column != COLUMN_END; i_column<<=1 ) - { - if( ( shownFlags() & i_column ) ) - i_index++; - if( column == i_index ) - { - i_flag = i_column; - break; - } - } + int meta = columnToMeta( column ); + if( meta == COLUMN_END ) return; PLItem *item = findById( rootItem, i_root_id ); if( !item ) return; @@ -960,10 +906,10 @@ void PLModel::sort( int i_root_id, int column, Qt::SortOrder order ) { playlist_item_t *p_root = playlist_ItemGetById( p_playlist, i_root_id ); - if( p_root && i_flag ) + if( p_root ) { playlist_RecursiveNodeSort( p_playlist, p_root, - i_column_sorting( i_flag ), + i_column_sorting( meta ), order == Qt::AscendingOrder ? ORDER_NORMAL : ORDER_REVERSE ); } @@ -1031,7 +977,7 @@ void PLModel::popup( QModelIndex & index, QPoint &point, QModelIndexList list ) menu->addAction( qtr(I_POP_INFO), this, SLOT( popupInfo() ) ); menu->addSeparator(); QMenu *sort_menu = menu->addMenu( qtr( "Sort by ") + - qfu( psz_column_title( columnToMeta( index.column(), i_showflags ) ) ) ); + qfu( psz_column_title( columnToMeta( index.column() ) ) ) ); sort_menu->addAction( qtr( "Ascending" ), this, SLOT( popupSortAsc() ) ); sort_menu->addAction( qtr( "Descending" ), @@ -1044,58 +990,9 @@ void PLModel::popup( QModelIndex & index, QPoint &point, QModelIndexList list ) menu->addSeparator(); menu->addAction( qtr( I_POP_EXPLORE ), this, SLOT( popupExplore() ) ); } - if( tree || i_popup_item > -1 ) - menu->addSeparator(); - QMenu *col_selector = menu->addMenu( qtr( "Visible columns" ) ); - makeColumnSelectMenu( col_selector ); menu->popup( point ); } -void PLModel::makeColumnSelectMenu( QMenu *menu ) -{ - int i_column = 1; - for( i_column = 1; i_column != COLUMN_END; i_column<<=1 ) - { - QAction* option = menu->addAction( - qfu( psz_column_title( i_column ) ) ); - option->setCheckable( true ); - option->setChecked( shownFlags() & i_column ); - ContextUpdateMapper->setMapping( option, i_column ); - CONNECT( option, triggered(), ContextUpdateMapper, map() ); - } -} - -void PLModel::toggleColumnShown( int meta ) -{ - assert( meta ); - if( rootItem ) - { - if( i_showflags & meta ) - { - /* Removing columns */ - int index = columnFromMeta( meta, i_showflags ); - - beginRemoveColumns( QModelIndex(), index, index ); - i_showflags &= ~( meta ); - getSettings()->setValue( "qt-pl-showflags", i_showflags ); - endRemoveColumns(); - } - else - { - /* Adding columns */ - int sf = i_showflags; - sf |= meta; - int index = columnFromMeta( meta, sf ); - beginInsertColumns( QModelIndex(), index, index ); - i_showflags = sf; - getSettings()->setValue( "qt-pl-showflags", i_showflags ); - endInsertColumns(); - } - - emit columnsChanged( meta ); - } -} - void PLModel::popupDel() { doDelete( current_selection ); diff --git a/modules/gui/qt4/components/playlist/playlist_model.hpp b/modules/gui/qt4/components/playlist/playlist_model.hpp index a10311602b..2ff33321cb 100644 --- a/modules/gui/qt4/components/playlist/playlist_model.hpp +++ b/modules/gui/qt4/components/playlist/playlist_model.hpp @@ -113,7 +113,6 @@ public: /* Lookups */ QStringList selectedURIs(); bool hasRandom(); bool hasLoop(); bool hasRepeat(); - int shownFlags() { return i_showflags; } QModelIndex index( PLItem *, int c ) const; QModelIndex currentIndex( ) { return index( currentItem, 0 ); }; bool isCurrent( const QModelIndex &index ) const; @@ -128,8 +127,6 @@ public: void removeItem( int ); void rebuild(); void rebuild( playlist_item_t * ); - /* Helpers */ - void makeColumnSelectMenu( QMenu *menu ); private: /* General */ @@ -139,7 +136,6 @@ private: playlist_t *p_playlist; intf_thread_t *p_intf; int i_depth; - int i_showflags; static QIcon icons[ITEM_TYPE_NUMBER]; @@ -166,15 +162,14 @@ private: /* Popup */ int i_popup_item, i_popup_parent, i_popup_column; QModelIndexList current_selection; - QSignalMapper *ContextUpdateMapper; /* Lookups */ PLItem *findById( PLItem *, int ); PLItem *findByInput( PLItem *, int ); PLItem *findInner( PLItem *, int , bool ); static inline PLItem *getItem( QModelIndex index ); - int columnFromMeta( int meta_column, int shown_flags ) const; - int columnToMeta( int column, int shown_flags ) const; + int columnFromMeta( int meta_column ) const; + int columnToMeta( int column ) const; PLItem *p_cached_item; PLItem *p_cached_item_bi; int i_cached_id; @@ -183,8 +178,6 @@ private: signals: void shouldRemove( int ); void currentChanged( const QModelIndex& ); - void columnsChanged( int ); - public slots: void activateItem( const QModelIndex &index ); @@ -203,7 +196,6 @@ private slots: void popupAddNode(); void popupSortAsc(); void popupSortDesc(); - void toggleColumnShown( int meta_column ); void processInputItemUpdate( input_item_t *); void processInputItemUpdate( input_thread_t* p_input ); }; diff --git a/modules/gui/qt4/components/playlist/standardpanel.cpp b/modules/gui/qt4/components/playlist/standardpanel.cpp index 770d0c467d..c12baa4a55 100644 --- a/modules/gui/qt4/components/playlist/standardpanel.cpp +++ b/modules/gui/qt4/components/playlist/standardpanel.cpp @@ -83,9 +83,13 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, } else { - /* Configure the size of the header */ - view->header()->resizeSection( 0, 200 ); - view->header()->resizeSection( 1, 80 ); + int m, c; + for( m = 1, c = 0; m != COLUMN_END; m <<= 1, c++ ) + { + view->setColumnHidden( c, !( m & COLUMN_DEFAULT ) ); + if( m == COLUMN_TITLE ) view->header()->resizeSection( c, 200 ); + else if( m == COLUMN_DURATION ) view->header()->resizeSection( c, 80 ); + } } view->header()->setSortIndicatorShown( true ); view->header()->setClickable( true ); @@ -101,8 +105,6 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, 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 ) ); @@ -172,6 +174,9 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, layout->addLayout( buttons ); // layout->addWidget( bar ); setLayout( layout ); + + selectColumnsSigMapper = new QSignalMapper( this ); + CONNECT( selectColumnsSigMapper, mapped( int ), this, toggleColumnShown( int ) ); } /* Function to toggle between the Repeat states */ @@ -260,59 +265,38 @@ void StandardPLPanel::popupAdd() + 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 ) +void StandardPLPanel::popupSelectColumn( QPoint pos ) { - int index=0; - - if( view->header()->isSortIndicatorShown() == false ) - return; - - int sortIndex = view->header()->sortIndicatorSection(); - if( sortIndex < 0 || sortIndex > view->header()->count() || meta == 0 ) - return; + QMenu menu; - int _meta = meta; - - while( _meta ) + int i, j; + for( i = 1, j = 0; i < COLUMN_END; i <<= 1, j++ ) { - if( _meta & model->shownFlags() ) - index++; - _meta >>= 1; + QAction* option = menu.addAction( + qfu( psz_column_title( i ) ) ); + option->setCheckable( true ); + option->setChecked( !view->isColumnHidden( j ) ); + selectColumnsSigMapper->setMapping( option, j ); + CONNECT( option, triggered(), selectColumnsSigMapper, map() ); } - - /* 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() ); + menu.exec( QCursor::pos() ); } -void StandardPLPanel::popupSelectColumn( QPoint pos ) +void StandardPLPanel::toggleColumnShown( int i ) { - QMenu selectColMenu; - - model->makeColumnSelectMenu( &selectColMenu ); - - selectColMenu.exec( QCursor::pos() ); + if( view->isColumnHidden( i ) ) + { + view->setColumnHidden( i, false ); + } + else + { + int visible = 0; + int m, c; + for( m = 1, c = 0; m != COLUMN_END && visible < 2; m <<= 1, c++ ) + if( !view->isColumnHidden( c ) ) visible++; + if( visible < 2 ) return; + view->setColumnHidden( i, true ); + } } /* Search in the playlist */ -- 2.39.2