From 1860d7732ab22d302ab7abf0381c7eef5dcd7b10 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 2 Jul 2012 23:08:07 +0200 Subject: [PATCH] * Moved style/view specific model stuff into PlayableProxyModel. --- src/libtomahawk/playlist/PlayableModel.cpp | 106 +--------------- src/libtomahawk/playlist/PlayableModel.h | 19 --- .../playlist/PlayableProxyModel.cpp | 117 ++++++++++++++++++ src/libtomahawk/playlist/PlayableProxyModel.h | 20 +++ 4 files changed, 143 insertions(+), 119 deletions(-) diff --git a/src/libtomahawk/playlist/PlayableModel.cpp b/src/libtomahawk/playlist/PlayableModel.cpp index c108a49d9..0af16f581 100644 --- a/src/libtomahawk/playlist/PlayableModel.cpp +++ b/src/libtomahawk/playlist/PlayableModel.cpp @@ -41,7 +41,6 @@ PlayableModel::PlayableModel( QObject* parent, bool loading ) : QAbstractItemModel( parent ) , m_rootItem( new PlayableItem( 0, this ) ) , m_readOnly( true ) - , m_style( Detailed ) , m_loading( loading ) { connect( AudioEngine::instance(), SIGNAL( started( Tomahawk::result_ptr ) ), SLOT( onPlaybackStarted( Tomahawk::result_ptr ) ), Qt::DirectConnection ); @@ -49,9 +48,6 @@ PlayableModel::PlayableModel( QObject* parent, bool loading ) m_header << tr( "Artist" ) << tr( "Title" ) << tr( "Composer" ) << tr( "Album" ) << tr( "Track" ) << tr( "Duration" ) << tr( "Bitrate" ) << tr( "Age" ) << tr( "Year" ) << tr( "Size" ) << tr( "Origin" ) << tr( "Score" ) << tr( "Name" ); - - m_headerStyle[ Detailed ] << Artist << Track << Composer << Album << AlbumPos << Duration << Bitrate << Age << Year << Filesize << Origin << Score; - m_headerStyle[ Collection ] << Name << Composer << Duration << Bitrate << Age << Year << Filesize << Origin; } @@ -94,23 +90,7 @@ PlayableModel::columnCount( const QModelIndex& parent ) const { Q_UNUSED( parent ); - switch ( m_style ) - { - case Short: - case ShortWithAvatars: - case Large: - return 1; - break; - - case Collection: - return 8; - break; - - case Detailed: - default: - return 12; - break; - } + return 12; } @@ -183,10 +163,7 @@ PlayableModel::queryData( const query_ptr& query, int column, int role ) const if ( role != Qt::DisplayRole ) // && role != Qt::ToolTipRole ) return QVariant(); - if ( !m_headerStyle.contains( m_style ) ) - return query->track(); - - switch( m_headerStyle[ m_style ].at( column ) ) + switch ( column ) { case Artist: return query->artist(); @@ -229,7 +206,7 @@ PlayableModel::queryData( const query_ptr& query, int column, int role ) const } if ( query->numResults() ) { - switch( m_headerStyle[ m_style ].at( column ) ) + switch ( column ) { case Bitrate: if ( query->results().first()->bitrate() > 0 ) @@ -283,16 +260,6 @@ PlayableModel::data( const QModelIndex& index, int role ) const return QVariant( columnAlignment( index.column() ) ); } - if ( role == StyleRole ) - { - return m_style; - } - - if ( role == Qt::SizeHintRole && !m_itemSize.isEmpty() ) - { - return m_itemSize; - } - if ( !entry->query().isNull() ) { return queryData( entry->query()->displayQuery(), index.column(), role ); @@ -317,10 +284,8 @@ PlayableModel::headerData( int section, Qt::Orientation orientation, int role ) if ( role == Qt::DisplayRole && section >= 0 ) { - if ( m_headerStyle.contains( m_style ) ) - { - return m_header.at( m_headerStyle[ m_style ].at( section ) ); - } + if ( section < m_header.count() ) + return m_header.at( section ); else return tr( "Name" ); } @@ -334,28 +299,6 @@ PlayableModel::headerData( int section, Qt::Orientation orientation, int role ) } -void -PlayableModel::updateDetailedInfo( const QModelIndex& index ) -{ - if ( style() != PlayableModel::Short && style() != PlayableModel::Large ) - return; - - PlayableItem* item = itemFromIndex( index ); - if ( item->query().isNull() ) - return; - - if ( style() == PlayableModel::Short || style() == PlayableModel::Large ) - { - item->query()->cover( QSize( 0, 0 ) ); - } - - if ( style() == PlayableModel::Large ) - { - item->query()->loadSocialActions(); - } -} - - void PlayableModel::setCurrentItem( const QModelIndex& index ) { @@ -717,47 +660,10 @@ PlayableModel::ensureResolved() } -void -PlayableModel::setStyle( PlayableModel::PlayableItemStyle style ) -{ - m_style = style; -} - - -QList< double > -PlayableModel::columnWeights() const -{ - QList< double > w; - - switch ( m_style ) - { - case Short: - case ShortWithAvatars: - case Large: - w << 1.0; - break; - - case Collection: - w << 0.42 << 0.12 << 0.07 << 0.07 << 0.07 << 0.07 << 0.07; // << 0.11; - break; - - case Detailed: - default: - w << 0.16 << 0.16 << 0.14 << 0.12 << 0.05 << 0.05 << 0.05 << 0.05 << 0.05 << 0.05 << 0.09; // << 0.03; - break; - } - - return w; -} - - Qt::Alignment PlayableModel::columnAlignment( int column ) const { - if ( !m_headerStyle.contains( m_style ) ) - return Qt::AlignLeft; - - switch( m_headerStyle[ m_style ].at( column ) ) + switch ( column ) { case Age: case AlbumPos: diff --git a/src/libtomahawk/playlist/PlayableModel.h b/src/libtomahawk/playlist/PlayableModel.h index 04ee5a20e..deacf8720 100644 --- a/src/libtomahawk/playlist/PlayableModel.h +++ b/src/libtomahawk/playlist/PlayableModel.h @@ -38,12 +38,6 @@ class DLLEXPORT PlayableModel : public QAbstractItemModel Q_OBJECT public: - enum PlayableItemStyle - { Detailed = 0, Short = 1, ShortWithAvatars = 2, Large = 3, Collection = 4 }; - - enum PlayableModelRole - { StyleRole = Qt::UserRole + 1 }; - enum Columns { Artist = 0, Track = 1, @@ -63,9 +57,6 @@ public: explicit PlayableModel( QObject* parent = 0, bool loading = true ); virtual ~PlayableModel(); - PlayableModel::PlayableItemStyle style() const { return m_style; } - void setStyle( PlayableModel::PlayableItemStyle style ); - virtual QModelIndex index( int row, int column, const QModelIndex& parent ) const; virtual QModelIndex parent( const QModelIndex& child ) const; @@ -87,8 +78,6 @@ public: virtual int columnCount( const QModelIndex& parent = QModelIndex() ) const; virtual bool hasChildren( const QModelIndex& parent ) const; - QList< double > columnWeights() const; - virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const; virtual QVariant headerData( int section, Qt::Orientation orientation, int role ) const; @@ -113,11 +102,6 @@ public: /// Returns a flat list of all tracks in this model QList< Tomahawk::query_ptr > queries() const; - void updateDetailedInfo( const QModelIndex& index ); - - QSize itemSize() const { return m_itemSize; } - void setItemSize( const QSize& size ) { m_itemSize = size; } - void startLoading(); void finishLoading(); @@ -176,7 +160,6 @@ private: PlayableItem* m_rootItem; QPersistentModelIndex m_currentIndex; Tomahawk::QID m_currentUuid; - QSize m_itemSize; bool m_readOnly; @@ -184,10 +167,8 @@ private: QString m_description; QPixmap m_icon; - QHash< PlayableItemStyle, QList > m_headerStyle; QStringList m_header; - PlayableItemStyle m_style; bool m_loading; }; diff --git a/src/libtomahawk/playlist/PlayableProxyModel.cpp b/src/libtomahawk/playlist/PlayableProxyModel.cpp index 5efe43514..b281a2d9b 100644 --- a/src/libtomahawk/playlist/PlayableProxyModel.cpp +++ b/src/libtomahawk/playlist/PlayableProxyModel.cpp @@ -36,12 +36,16 @@ PlayableProxyModel::PlayableProxyModel( QObject* parent ) , m_showOfflineResults( true ) , m_hideDupeItems( false ) , m_maxVisibleItems( -1 ) + , m_style( Detailed ) { setFilterCaseSensitivity( Qt::CaseInsensitive ); setSortCaseSensitivity( Qt::CaseInsensitive ); setDynamicSortFilter( true ); setSourcePlayableModel( 0 ); + + m_headerStyle[ Detailed ] << PlayableModel::Artist << PlayableModel::Track << PlayableModel::Composer << PlayableModel::Album << PlayableModel::AlbumPos << PlayableModel::Duration << PlayableModel::Bitrate << PlayableModel::Age << PlayableModel::Year << PlayableModel::Filesize << PlayableModel::Origin << PlayableModel::Score; + m_headerStyle[ Collection ] << PlayableModel::Name << PlayableModel::Composer << PlayableModel::Duration << PlayableModel::Bitrate << PlayableModel::Age << PlayableModel::Year << PlayableModel::Filesize << PlayableModel::Origin; } @@ -461,3 +465,116 @@ PlayableProxyModel::playlistInterface() return m_playlistInterface; } + + +int +PlayableProxyModel::columnCount( const QModelIndex& parent ) const +{ + Q_UNUSED( parent ); + + switch ( m_style ) + { + case Short: + case ShortWithAvatars: + case Large: + return 1; + break; + + case Collection: + return 8; + break; + + case Detailed: + default: + return 12; + break; + } +} + + +QVariant +PlayableProxyModel::data( const QModelIndex& index, int role ) const +{ + if ( role == StyleRole ) + { + return m_style; + } + + if ( !sourceModel() ) + return QVariant(); + if ( !m_headerStyle.contains( m_style ) ) + return QVariant(); + + PlayableModel::Columns col = m_headerStyle[ m_style ].at( index.column() ); + QModelIndex sourceIdx = mapToSource( index ); + QModelIndex idx = sourceModel()->index( sourceIdx.row(), (int)col, sourceIdx.parent() ); + + return idx.data( role ); +} + + +QVariant +PlayableProxyModel::headerData( int section, Qt::Orientation orientation, int role ) const +{ + if ( !sourceModel() ) + return QVariant(); + if ( !m_headerStyle.contains( m_style ) ) + return QVariant(); + + if ( section < m_headerStyle[ m_style ].count() ) + { + PlayableModel::Columns col = m_headerStyle[ m_style ].at( section ); + return sourceModel()->headerData( (int)col, orientation, role ); + } + else + return sourceModel()->headerData( 255, orientation, role ); +} + + +QList< double > +PlayableProxyModel::columnWeights() const +{ + QList< double > w; + + switch ( m_style ) + { + case Short: + case ShortWithAvatars: + case Large: + w << 1.0; + break; + + case Collection: + w << 0.42 << 0.12 << 0.07 << 0.07 << 0.07 << 0.07 << 0.07; // << 0.11; + break; + + case Detailed: + default: + w << 0.16 << 0.16 << 0.14 << 0.12 << 0.05 << 0.05 << 0.05 << 0.05 << 0.05 << 0.05 << 0.09; // << 0.03; + break; + } + + return w; +} + + +void +PlayableProxyModel::updateDetailedInfo( const QModelIndex& index ) +{ + if ( style() != PlayableProxyModel::Short && style() != PlayableProxyModel::Large ) + return; + + PlayableItem* item = itemFromIndex( mapToSource( index ) ); + if ( item->query().isNull() ) + return; + + if ( style() == PlayableProxyModel::Short || style() == PlayableProxyModel::Large ) + { + item->query()->cover( QSize( 0, 0 ) ); + } + + if ( style() == PlayableProxyModel::Large ) + { + item->query()->loadSocialActions(); + } +} diff --git a/src/libtomahawk/playlist/PlayableProxyModel.h b/src/libtomahawk/playlist/PlayableProxyModel.h index dd4cf0d9d..79b496317 100644 --- a/src/libtomahawk/playlist/PlayableProxyModel.h +++ b/src/libtomahawk/playlist/PlayableProxyModel.h @@ -32,6 +32,12 @@ class DLLEXPORT PlayableProxyModel : public QSortFilterProxyModel Q_OBJECT public: + enum PlayableItemStyle + { Detailed = 0, Short = 1, ShortWithAvatars = 2, Large = 3, Collection = 4 }; + + enum PlayableProxyModelRole + { StyleRole = Qt::UserRole + 1 }; + explicit PlayableProxyModel ( QObject* parent = 0 ); virtual ~PlayableProxyModel() {} @@ -41,6 +47,9 @@ public: virtual bool isLoading() const; + PlayableProxyModel::PlayableItemStyle style() const { return m_style; } + void setStyle( PlayableProxyModel::PlayableItemStyle style ) { m_style = style; } + virtual QPersistentModelIndex currentIndex() const { return mapFromSource( m_model->currentItem() ); } virtual void setCurrentIndex( const QModelIndex& index ) { m_model->setCurrentItem( mapToSource( index ) ); } @@ -63,6 +72,14 @@ public: virtual Tomahawk::playlistinterface_ptr playlistInterface(); + QList< double > columnWeights() const; + + virtual int columnCount( const QModelIndex& parent = QModelIndex() ) const; + virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const; + virtual QVariant headerData( int section, Qt::Orientation orientation, int role ) const; + + void updateDetailedInfo( const QModelIndex& index ); + signals: void filterChanged( const QString& filter ); @@ -86,6 +103,9 @@ private: bool m_showOfflineResults; bool m_hideDupeItems; int m_maxVisibleItems; + + QHash< PlayableItemStyle, QList > m_headerStyle; + PlayableItemStyle m_style; }; #endif // TRACKPROXYMODEL_H