Commit bc778682 authored by Jakob Leben's avatar Jakob Leben

Qt: add a list view

parent 01de7da1
...@@ -30,12 +30,32 @@ ...@@ -30,12 +30,32 @@
class QPainter; class QPainter;
class PLModel; class PLModel;
class PlListViewItemDelegate : public QStyledItemDelegate class AbstractPlViewItemDelegate : public QStyledItemDelegate
{
public:
AbstractPlViewItemDelegate( QWidget * parent = 0 ) : QStyledItemDelegate(parent) {}
QString getMeta( const QModelIndex & index, int meta ) const;
void paintPlayingItemBg( QPainter *painter, const QStyleOptionViewItem & option ) const;
QPixmap getArtPixmap( const QModelIndex & index, const QSize & size ) const;
};
class PlIconViewItemDelegate : public AbstractPlViewItemDelegate
{ {
Q_OBJECT Q_OBJECT
public: public:
PlListViewItemDelegate(QWidget *parent = 0) : QStyledItemDelegate(parent) {} PlIconViewItemDelegate(QWidget *parent = 0) : AbstractPlViewItemDelegate(parent) {}
void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;
};
class PlListViewItemDelegate : public AbstractPlViewItemDelegate
{
Q_OBJECT
public:
PlListViewItemDelegate(QWidget *parent = 0) : AbstractPlViewItemDelegate(parent) {}
void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const; void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;
...@@ -49,5 +69,13 @@ public: ...@@ -49,5 +69,13 @@ public:
PlIconView( PLModel *model, QWidget *parent = 0 ); PlIconView( PLModel *model, QWidget *parent = 0 );
}; };
class PlListView : public QListView
{
Q_OBJECT
public:
PlListView( PLModel *model, QWidget *parent = 0 );
};
#endif #endif
...@@ -339,7 +339,12 @@ QVariant PLModel::data( const QModelIndex &index, int role ) const ...@@ -339,7 +339,12 @@ QVariant PLModel::data( const QModelIndex &index, int role ) const
QFont f; f.setBold( true ); return QVariant( f ); QFont f; f.setBold( true ); return QVariant( f );
} }
} }
else if( role == Qt::BackgroundRole && isCurrent( index ) )
{
return QVariant( QBrush( Qt::gray ) );
}
else if( role == IsCurrentRole ) return QVariant( isCurrent( index ) ); else if( role == IsCurrentRole ) return QVariant( isCurrent( index ) );
return QVariant(); return QVariant();
} }
...@@ -532,7 +537,7 @@ PLItem * PLModel::findInner( PLItem *root, int i_id, bool b_input ) ...@@ -532,7 +537,7 @@ PLItem * PLModel::findInner( PLItem *root, int i_id, bool b_input )
#undef CACHE #undef CACHE
#undef ICACHE #undef ICACHE
int PLModel::columnToMeta( int _column ) const int PLModel::columnToMeta( int _column )
{ {
int meta = 1; int meta = 1;
int column = 0; int column = 0;
...@@ -546,7 +551,7 @@ int PLModel::columnToMeta( int _column ) const ...@@ -546,7 +551,7 @@ int PLModel::columnToMeta( int _column ) const
return meta; return meta;
} }
int PLModel::columnFromMeta( int meta_col ) const int PLModel::columnFromMeta( int meta_col )
{ {
int meta = 1; int meta = 1;
int column = 0; int column = 0;
......
...@@ -90,6 +90,8 @@ public: ...@@ -90,6 +90,8 @@ public:
QModelIndex currentIndex(); QModelIndex currentIndex();
bool isCurrent( const QModelIndex &index ) const; bool isCurrent( const QModelIndex &index ) const;
int itemId( const QModelIndex &index ) const; int itemId( const QModelIndex &index ) const;
static int columnFromMeta( int meta_column );
static int columnToMeta( int column );
/* Actions */ /* Actions */
void popup( const QModelIndex & index, const QPoint &point, const QModelIndexList &list ); void popup( const QModelIndex & index, const QPoint &point, const QModelIndexList &list );
...@@ -147,8 +149,6 @@ private: ...@@ -147,8 +149,6 @@ private:
PLItem *findById( PLItem *, int ); PLItem *findById( PLItem *, int );
PLItem *findByInput( PLItem *, int ); PLItem *findByInput( PLItem *, int );
PLItem *findInner( PLItem *, int , bool ); PLItem *findInner( PLItem *, int , bool );
int columnFromMeta( int meta_column ) const;
int columnToMeta( int column ) const;
bool canEdit() const; bool canEdit() const;
PLItem *p_cached_item; PLItem *p_cached_item;
......
...@@ -73,6 +73,7 @@ static inline char * psz_column_meta( input_item_t *p_item, uint32_t i_column ) ...@@ -73,6 +73,7 @@ static inline char * psz_column_meta( input_item_t *p_item, uint32_t i_column )
return input_item_GetTitleFbName( p_item ); return input_item_GetTitleFbName( p_item );
case COLUMN_DURATION: case COLUMN_DURATION:
i_duration = input_item_GetDuration( p_item ) / 1000000; i_duration = input_item_GetDuration( p_item ) / 1000000;
if( i_duration == 0 ) return NULL;
secstotimestr( psz_duration, i_duration ); secstotimestr( psz_duration, i_duration );
return strdup( psz_duration ); return strdup( psz_duration );
case COLUMN_ARTIST: case COLUMN_ARTIST:
......
...@@ -52,6 +52,10 @@ ...@@ -52,6 +52,10 @@
#include "sorting.h" #include "sorting.h"
static const QString viewNames[] = { qtr( "Detailed View" ),
qtr( "Icon View" ),
qtr( "List View" ) };
StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent,
intf_thread_t *_p_intf, intf_thread_t *_p_intf,
playlist_t *p_playlist, playlist_t *p_playlist,
...@@ -64,6 +68,7 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, ...@@ -64,6 +68,7 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent,
iconView = NULL; iconView = NULL;
treeView = NULL; treeView = NULL;
listView = NULL;
model = new PLModel( p_playlist, p_intf, p_root, this ); model = new PLModel( p_playlist, p_intf, p_root, this );
currentRootId = -1; currentRootId = -1;
...@@ -101,15 +106,13 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, ...@@ -101,15 +106,13 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent,
QActionGroup *actionGroup = new QActionGroup( this ); QActionGroup *actionGroup = new QActionGroup( this );
treeViewAction = actionGroup->addAction( "Detailed view" ); for( int i = 0; i < VIEW_COUNT; i++ )
treeViewAction->setCheckable( true ); {
viewSelectionMapper->setMapping( treeViewAction, TREE_VIEW ); viewActions[i] = actionGroup->addAction( viewNames[i] );
CONNECT( treeViewAction, triggered(), viewSelectionMapper, map() ); viewActions[i]->setCheckable( true );
viewSelectionMapper->setMapping( viewActions[i], i );
iconViewAction = actionGroup->addAction( "Icon view" ); CONNECT( viewActions[i], triggered(), viewSelectionMapper, map() );
iconViewAction->setCheckable( true ); }
viewSelectionMapper->setMapping( iconViewAction, ICON_VIEW );
CONNECT( iconViewAction, triggered(), viewSelectionMapper, map() );
BUTTONACT( viewButton, cycleViews() ); BUTTONACT( viewButton, cycleViews() );
QMenu *viewMenu = new QMenu( this ); QMenu *viewMenu = new QMenu( this );
...@@ -138,7 +141,12 @@ StandardPLPanel::~StandardPLPanel() ...@@ -138,7 +141,12 @@ StandardPLPanel::~StandardPLPanel()
getSettings()->beginGroup("Playlist"); getSettings()->beginGroup("Playlist");
if( treeView ) if( treeView )
getSettings()->setValue( "headerStateV2", treeView->header()->saveState() ); getSettings()->setValue( "headerStateV2", treeView->header()->saveState() );
getSettings()->setValue( "view-mode", ( currentView == iconView ) ? ICON_VIEW : TREE_VIEW ); if( currentView == treeView )
getSettings()->setValue( "view-mode", TREE_VIEW );
else if( currentView == listView )
getSettings()->setValue( "view-mode", LIST_VIEW );
else if( currentView == iconView )
getSettings()->setValue( "view-mode", ICON_VIEW );
getSettings()->endGroup(); getSettings()->endGroup();
} }
...@@ -287,6 +295,21 @@ void StandardPLPanel::createIconView() ...@@ -287,6 +295,21 @@ void StandardPLPanel::createIconView()
layout->addWidget( iconView, 1, 0, 1, -1 ); layout->addWidget( iconView, 1, 0, 1, -1 );
} }
void StandardPLPanel::createListView()
{
listView = new PlListView( model, this );
listView->setContextMenuPolicy( Qt::CustomContextMenu );
CONNECT( listView, customContextMenuRequested( const QPoint & ),
this, popupPlView( const QPoint & ) );
CONNECT( listView, activated( const QModelIndex & ),
this, activate( const QModelIndex & ) );
CONNECT( locationBar, invoked( const QModelIndex & ),
listView, setRootIndex( const QModelIndex & ) );
layout->addWidget( listView, 1, 0, 1, -1 );
}
void StandardPLPanel::createTreeView() void StandardPLPanel::createTreeView()
{ {
/* Create and configure the QTreeView */ /* Create and configure the QTreeView */
...@@ -354,9 +377,10 @@ void StandardPLPanel::showView( int i_view ) ...@@ -354,9 +377,10 @@ void StandardPLPanel::showView( int i_view )
createTreeView(); createTreeView();
locationBar->setIndex( treeView->rootIndex() ); locationBar->setIndex( treeView->rootIndex() );
if( iconView ) iconView->hide(); if( iconView ) iconView->hide();
if( listView ) listView->hide();
treeView->show(); treeView->show();
currentView = treeView; currentView = treeView;
treeViewAction->setChecked( true ); viewActions[i_view]->setChecked( true );
break; break;
} }
case ICON_VIEW: case ICON_VIEW:
...@@ -364,11 +388,31 @@ void StandardPLPanel::showView( int i_view ) ...@@ -364,11 +388,31 @@ void StandardPLPanel::showView( int i_view )
if( iconView == NULL ) if( iconView == NULL )
createIconView(); createIconView();
locationBar->setIndex( iconView->rootIndex() );
if( treeView ) treeView->hide(); if( treeView ) treeView->hide();
if( listView ) {
listView->hide();
iconView->setRootIndex( listView->rootIndex() );
}
locationBar->setIndex( iconView->rootIndex() );
iconView->show(); iconView->show();
currentView = iconView; currentView = iconView;
iconViewAction->setChecked( true ); viewActions[i_view]->setChecked( true );
break;
}
case LIST_VIEW:
{
if( listView == NULL )
createListView();
if( treeView ) treeView->hide();
if( iconView ) {
iconView->hide();
listView->setRootIndex( iconView->rootIndex() );
}
locationBar->setIndex( listView->rootIndex() );
listView->show();
currentView = listView;
viewActions[i_view]->setChecked( true );
break; break;
} }
default:; default:;
...@@ -380,6 +424,8 @@ void StandardPLPanel::cycleViews() ...@@ -380,6 +424,8 @@ void StandardPLPanel::cycleViews()
if( currentView == iconView ) if( currentView == iconView )
showView( TREE_VIEW ); showView( TREE_VIEW );
else if( currentView == treeView ) else if( currentView == treeView )
showView( LIST_VIEW );
else if( currentView == listView )
showView( ICON_VIEW ); showView( ICON_VIEW );
else else
assert( 0 ); assert( 0 );
...@@ -395,8 +441,8 @@ void StandardPLPanel::activate( const QModelIndex &index ) ...@@ -395,8 +441,8 @@ void StandardPLPanel::activate( const QModelIndex &index )
{ {
if( model->hasChildren( index ) ) if( model->hasChildren( index ) )
{ {
if( currentView == iconView ) { if( currentView == iconView || currentView == listView ) {
iconView->setRootIndex( index ); currentView->setRootIndex( index );
locationBar->setIndex( index ); locationBar->setIndex( index );
} }
} }
...@@ -429,8 +475,8 @@ void StandardPLPanel::browseInto( input_item_t *p_input ) ...@@ -429,8 +475,8 @@ void StandardPLPanel::browseInto( input_item_t *p_input )
playlist_Unlock( THEPL ); playlist_Unlock( THEPL );
if( currentView == iconView ) { if( currentView == iconView || currentView == listView ) {
iconView->setRootIndex( index ); currentView->setRootIndex( index );
locationBar->setIndex( index ); locationBar->setIndex( index );
} }
else else
......
...@@ -46,6 +46,7 @@ class QPushButton; ...@@ -46,6 +46,7 @@ class QPushButton;
class QKeyEvent; class QKeyEvent;
class QWheelEvent; class QWheelEvent;
class PlIconView; class PlIconView;
class PlListView;
class LocationBar; class LocationBar;
class StandardPLPanel: public QWidget class StandardPLPanel: public QWidget
...@@ -64,6 +65,14 @@ protected: ...@@ -64,6 +65,14 @@ protected:
PLModel *model; PLModel *model;
private: private:
enum {
TREE_VIEW = 0,
ICON_VIEW,
LIST_VIEW,
VIEW_COUNT
};
intf_thread_t *p_intf; intf_thread_t *p_intf;
QWidget *parent; QWidget *parent;
...@@ -74,8 +83,10 @@ private: ...@@ -74,8 +83,10 @@ private:
QTreeView *treeView; QTreeView *treeView;
PlIconView *iconView; PlIconView *iconView;
PlListView *listView;
QAbstractItemView *currentView; QAbstractItemView *currentView;
QAction *viewActions[ VIEW_COUNT ];
QAction *iconViewAction, *treeViewAction; QAction *iconViewAction, *treeViewAction;
int currentRootId; int currentRootId;
QSignalMapper *selectColumnsSigMapper; QSignalMapper *selectColumnsSigMapper;
...@@ -83,14 +94,9 @@ private: ...@@ -83,14 +94,9 @@ private:
int last_activated_id; int last_activated_id;
enum {
TREE_VIEW = 0,
ICON_VIEW,
COVER_VIEW,
};
void createTreeView(); void createTreeView();
void createIconView(); void createIconView();
void createListView();
public slots: public slots:
virtual void setRoot( playlist_item_t * ); virtual void setRoot( playlist_item_t * );
......
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