Commit bc778682 authored by Jakob Leben's avatar Jakob Leben

Qt: add a list view

parent 01de7da1
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "components/playlist/icon_view.hpp" #include "components/playlist/icon_view.hpp"
#include "components/playlist/playlist_model.hpp" #include "components/playlist/playlist_model.hpp"
#include "components/playlist/sorting.h"
#include "input_manager.hpp" #include "input_manager.hpp"
#include <QApplication> #include <QApplication>
...@@ -41,141 +42,213 @@ ...@@ -41,141 +42,213 @@
#define ITEMS_SPACING 10 #define ITEMS_SPACING 10
#define ART_RADIUS 5 #define ART_RADIUS 5
QString AbstractPlViewItemDelegate::getMeta( const QModelIndex & index, int meta ) const
static const QRect drawRect = QRect( 0, 0, RECT_SIZE_W, RECT_SIZE_H );
static const QRect artRect = drawRect.adjusted( OFFSET - 1, 2, - OFFSET, - OFFSET *2 );
void PlListViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{ {
PLItem *currentItem = static_cast<PLItem*>( index.internalPointer() ); return index.model()->index( index.row(),
assert( currentItem ); PLModel::columnFromMeta( meta ),
index.parent() )
.data().toString();
}
char *meta = input_item_GetTitleFbName( currentItem->inputItem() ); void AbstractPlViewItemDelegate::paintPlayingItemBg( QPainter *painter, const QStyleOptionViewItem & option ) const
QString title = qfu( meta ); {
free( meta ); painter->save();
painter->setOpacity( 0.5 );
painter->setBrush( QBrush( Qt::gray ) );
painter->fillRect( option.rect, option.palette.color( QPalette::Dark ) );
painter->restore();
}
meta = input_item_GetArtist( currentItem->inputItem() ); QPixmap AbstractPlViewItemDelegate::getArtPixmap( const QModelIndex & index, const QSize & size ) const
QString artist = qfu( meta ); {
free( meta ); PLItem *item = static_cast<PLItem*>( index.internalPointer() );
assert( item );
/* Primary ArtUrl */ QString artUrl = InputManager::decodeArtURL( item->inputItem() );
QString artUrl = InputManager::decodeArtURL( currentItem->inputItem() );
/* else look up through all children and use the first picture found */
if( artUrl.isEmpty() ) if( artUrl.isEmpty() )
{ {
for( int i = 0; i < currentItem->childCount(); i++ ) for( int i = 0; i < item->childCount(); i++ )
{ {
artUrl = InputManager::decodeArtURL( currentItem->child( i )->inputItem() ); artUrl = InputManager::decodeArtURL( item->child( i )->inputItem() );
if( !artUrl.isEmpty() ) if( !artUrl.isEmpty() )
break; break;
} }
} }
/*if( option.state & QStyle::State_Selected ) QPixmap artPix( size );
painter->fillRect(option.rect, option.palette.highlight());*/
QApplication::style()->drawPrimitive( QStyle::PE_PanelItemViewItem, &option,
painter );
/* Pixmap where all the rendering will happen and that will be cached */ QString key = artUrl + QString("%1%2").arg(size.width()).arg(size.height());
QPixmap pix;
QString key = title + artist + artUrl if( !QPixmapCache::find( key, artPix ))
+ QString( index.data( PLModel::IsCurrentRole ).toBool() );
if(QPixmapCache::find( key, pix ))
{ {
// cool, we found it in the cache QPixmap tmp;
painter->drawPixmap( option.rect, pix ); bool cache = false;
return; if( artUrl.isEmpty() || !tmp.load( artUrl ) )
{
tmp = QPixmap( ":/noart64" ).scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation );
}
else
{
tmp = tmp.scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation );
cache = true;
}
artPix.fill( Qt::black );
QPainter p( &artPix );
p.drawPixmap( (size.width() - tmp.width()) / 2,
(size.height() - tmp.height()) / 2,
tmp );
if( cache ) QPixmapCache::insert( key, artPix );
} }
/* Background decorations */ return artPix;
pix = QPixmap( RECT_SIZE_W, RECT_SIZE_H ); }
pix.fill( Qt::transparent );
QPainter *pixpainter = new QPainter( &pix ); void PlIconViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
QString title = getMeta( index, COLUMN_TITLE );
QString artist = getMeta( index, COLUMN_ARTIST );
pixpainter->setRenderHints( QPixmap artPix = getArtPixmap( index, QSize( ART_SIZE, ART_SIZE ) );
QPainter::Antialiasing | QPainter::SmoothPixmapTransform |
QPainter::TextAntialiasing ); QApplication::style()->drawPrimitive( QStyle::PE_PanelItemViewItem, &option,
painter );
painter->save();
if( index.data( PLModel::IsCurrentRole ).toBool() ) if( index.data( PLModel::IsCurrentRole ).toBool() )
{ {
pixpainter->save(); painter->save();
pixpainter->setOpacity( 0.2 ); painter->setOpacity( 0.2 );
pixpainter->setBrush( QBrush( Qt::gray ) ); painter->setBrush( QBrush( Qt::gray ) );
pixpainter->drawRoundedRect( 0, 0, RECT_SIZE_W, RECT_SIZE_H, ART_RADIUS, ART_RADIUS ); painter->drawRoundedRect( option.rect.adjusted( 0, 0, -1, -1 ), ART_RADIUS, ART_RADIUS );
pixpainter->restore(); painter->restore();
} }
// Draw the drop shadow QRect artRect = option.rect.adjusted( OFFSET - 1, 2, - OFFSET, - OFFSET *2 );
pixpainter->save();
pixpainter->setOpacity( 0.7 );
pixpainter->setBrush( QBrush( Qt::gray ) );
pixpainter->drawRoundedRect( artRect.adjusted( 2, 2, 2, 2 ), ART_RADIUS, ART_RADIUS );
pixpainter->restore();
// load album art in the pixmap // Draw the drop shadow
QPixmap artPix; painter->save();
if( artUrl.isEmpty() || !artPix.load( artUrl ) ) painter->setOpacity( 0.7 );
artPix = QPixmap( ":/noart64" ); painter->setBrush( QBrush( Qt::darkGray ) );
else painter->setPen( Qt::NoPen );
artPix = artPix.scaled( ART_SIZE, ART_SIZE, painter->drawRoundedRect( artRect.adjusted( 0, 0, 2, 2 ), ART_RADIUS, ART_RADIUS );
Qt::KeepAspectRatioByExpanding ); painter->restore();
// Draw the art pixmap // Draw the art pixmap
QPainterPath artRectPath; QPainterPath artRectPath;
artRectPath.addRoundedRect( artRect, ART_RADIUS, ART_RADIUS ); artRectPath.addRoundedRect( artRect, ART_RADIUS, ART_RADIUS );
pixpainter->setClipPath( artRectPath ); painter->setClipPath( artRectPath );
pixpainter->drawPixmap( artRect, artPix ); painter->drawPixmap( artRect, artPix );
pixpainter->setClipping( false ); painter->setClipping( false );
/* */ if( option.state & QStyle::State_Selected )
QColor text = qApp->palette().text().color(); painter->setPen( option.palette.color( QPalette::HighlightedText ) );
// Draw title
pixpainter->setPen( text );
QFont font; QFont font;
font.setPointSize( 7 ); font.setPointSize( 7 );
font.setItalic( true );
font.setBold( index.data( Qt::FontRole ).value<QFont>().bold() ); font.setBold( index.data( Qt::FontRole ).value<QFont>().bold() );
pixpainter->setFont( font );
QFontMetrics fm = pixpainter->fontMetrics(); // Draw title
QRect textRect = drawRect.adjusted( 1, ART_SIZE + 4, 0, -1 ); font.setItalic( true );
painter->setFont( font );
QFontMetrics fm = painter->fontMetrics();
QRect textRect = option.rect.adjusted( 1, ART_SIZE + 8, 0, -1 );
textRect.setHeight( fm.height() + 1 ); textRect.setHeight( fm.height() + 1 );
pixpainter->drawText( textRect, painter->drawText( textRect,
fm.elidedText( title, Qt::ElideRight, textRect.width() ), fm.elidedText( title, Qt::ElideRight, textRect.width() ),
QTextOption( Qt::AlignCenter ) ); QTextOption( Qt::AlignCenter ) );
// Draw artist // Draw artist
pixpainter->setPen( text.lighter( 220 ) ); painter->setPen( painter->pen().color().lighter( 150 ) );
font.setItalic( false ); font.setItalic( false );
pixpainter->setFont( font ); painter->setFont( font );
fm = pixpainter->fontMetrics(); fm = painter->fontMetrics();
textRect = textRect.adjusted( 0, textRect.height(), textRect = textRect.adjusted( 0, textRect.height(),
0, textRect.height() ); 0, textRect.height() );
pixpainter->drawText( textRect, painter->drawText( textRect,
fm.elidedText( artist, Qt::ElideRight, textRect.width() ), fm.elidedText( artist, Qt::ElideRight, textRect.width() ),
QTextOption( Qt::AlignCenter ) ); QTextOption( Qt::AlignCenter ) );
painter->restore();
}
delete pixpainter; // Ensure all paint operations have finished QSize PlIconViewItemDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
return QSize( RECT_SIZE_W, RECT_SIZE_H );
}
// Here real drawing happens #define LISTVIEW_ART_SIZE 45
painter->drawPixmap( option.rect, pix );
// Cache the rendering void PlListViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
QPixmapCache::insert( key, pix ); {
QModelIndex parent = index.parent();
QModelIndex i;
QString title = getMeta( index, COLUMN_TITLE );
QString duration = getMeta( index, COLUMN_DURATION );
if( !duration.isEmpty() ) title += QString(" [%1]").arg( duration );
QString artist = getMeta( index, COLUMN_ARTIST );
QString album = getMeta( index, COLUMN_ALBUM );
QString trackNum = getMeta( index, COLUMN_TRACK_NUMBER );
QString artistAlbum = artist
+ ( artist.isEmpty() ? QString() : QString( ": " ) )
+ album
+ ( album.isEmpty() || trackNum.isEmpty() ?
QString() : QString( " [#%1]" ).arg( trackNum ) );
QPixmap artPix = getArtPixmap( index, QSize( LISTVIEW_ART_SIZE, LISTVIEW_ART_SIZE ) );
QApplication::style()->drawPrimitive( QStyle::PE_PanelItemViewItem, &option, painter );
if( index.data( PLModel::IsCurrentRole ).toBool() )
paintPlayingItemBg( painter, option );
painter->drawPixmap( option.rect.topLeft() + QPoint(3,3), artPix );
int textH = option.fontMetrics.height() + 2;
int margin = ( option.rect.height() / 2 ) - textH;
QRect textRect = option.rect.adjusted( LISTVIEW_ART_SIZE + 10,
margin,
-10,
margin * -1 - ( artistAlbum.isEmpty() ? 0 : textH ) );
painter->save();
if( option.state & QStyle::State_Selected )
painter->setPen( option.palette.color( QPalette::HighlightedText ) );
QTextOption textOpt( Qt::AlignVCenter | Qt::AlignLeft );
textOpt.setWrapMode( QTextOption::NoWrap );
QFont f( option.font );
if( index.data( PLModel::IsCurrentRole ).toBool() ) f.setBold( true );
f.setItalic( true );
painter->setFont( f );
painter->drawText( textRect, title, textOpt );
f.setItalic( false );
painter->setFont( f );
textRect.moveTop( textRect.top() + textH );
painter->drawText( textRect, artistAlbum, textOpt );
painter->restore();
} }
QSize PlListViewItemDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const QSize PlListViewItemDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
{ {
return QSize( RECT_SIZE_W, RECT_SIZE_H ); return QSize( LISTVIEW_ART_SIZE + 6, LISTVIEW_ART_SIZE + 6 );
} }
PlIconView::PlIconView( PLModel *model, QWidget *parent ) : QListView( parent ) PlIconView::PlIconView( PLModel *model, QWidget *parent ) : QListView( parent )
{ {
setModel( model ); setModel( model );
...@@ -183,12 +256,24 @@ PlIconView::PlIconView( PLModel *model, QWidget *parent ) : QListView( parent ) ...@@ -183,12 +256,24 @@ PlIconView::PlIconView( PLModel *model, QWidget *parent ) : QListView( parent )
setMovement( QListView::Static ); setMovement( QListView::Static );
setResizeMode( QListView::Adjust ); setResizeMode( QListView::Adjust );
setGridSize( QSize( RECT_SIZE_W, RECT_SIZE_H ) ); setGridSize( QSize( RECT_SIZE_W, RECT_SIZE_H ) );
setUniformItemSizes( true );
setWrapping( true ); setWrapping( true );
setUniformItemSizes( true );
setSelectionMode( QAbstractItemView::ExtendedSelection ); setSelectionMode( QAbstractItemView::ExtendedSelection );
setAcceptDrops( true ); setAcceptDrops( true );
PlListViewItemDelegate *pl = new PlListViewItemDelegate( this ); PlIconViewItemDelegate *delegate = new PlIconViewItemDelegate( this );
setItemDelegate( pl ); setItemDelegate( delegate );
} }
PlListView::PlListView( PLModel *model, QWidget *parent ) : QListView( parent )
{
setModel( model );
setViewMode( QListView::ListMode );
setUniformItemSizes( true );
setSelectionMode( QAbstractItemView::ExtendedSelection );
setAcceptDrops( true );
setAlternatingRowColors( true );
PlListViewItemDelegate *delegate = new PlListViewItemDelegate( this );
setItemDelegate( delegate );
}
...@@ -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