Commit 23748912 authored by jpd's avatar jpd
Browse files

qt4: let QTreeView manage visible playlist columns selection

And remove a lot of unnecessary code.
parent 73cad20b
......@@ -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
......@@ -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<PLItem*>( 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 );
......
......@@ -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 );
};
......
......@@ -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 */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment