diff --git a/src/libtomahawk/database/databasecommand_alltracks.cpp b/src/libtomahawk/database/databasecommand_alltracks.cpp index 469c53881..8d4fd9522 100644 --- a/src/libtomahawk/database/databasecommand_alltracks.cpp +++ b/src/libtomahawk/database/databasecommand_alltracks.cpp @@ -110,7 +110,6 @@ DatabaseCommand_AllTracks::exec( DatabaseImpl* dbi ) qDebug() << Q_FUNC_INFO << ql.length(); - if ( ql.count() ) - emit tracks( ql, m_collection ); + emit tracks( ql, m_collection ); emit done( m_collection ); } diff --git a/src/libtomahawk/playlist/collectionflatmodel.cpp b/src/libtomahawk/playlist/collectionflatmodel.cpp index 167398d6e..f5f6d8d8f 100644 --- a/src/libtomahawk/playlist/collectionflatmodel.cpp +++ b/src/libtomahawk/playlist/collectionflatmodel.cpp @@ -159,7 +159,10 @@ void CollectionFlatModel::onTracksAdded( const QList& tracks, const Tomahawk::collection_ptr& collection ) { if ( !tracks.count() ) + { + emit trackCountChanged( rowCount( QModelIndex() ) ); return; + } int c = rowCount( QModelIndex() ); QPair< int, int > crows; diff --git a/src/libtomahawk/playlist/collectionview.cpp b/src/libtomahawk/playlist/collectionview.cpp index 494e7349e..61ed017ef 100644 --- a/src/libtomahawk/playlist/collectionview.cpp +++ b/src/libtomahawk/playlist/collectionview.cpp @@ -32,6 +32,15 @@ CollectionView::~CollectionView() } +void +CollectionView::setModel( TrackModel* model ) +{ + TrackView::setModel( model ); + + connect( model, SIGNAL( trackCountChanged( unsigned int ) ), SLOT( onTrackCountChanged( unsigned int ) ) ); +} + + void CollectionView::dragEnterEvent( QDragEnterEvent* event ) { @@ -74,14 +83,13 @@ CollectionView::onCustomContextMenu( const QPoint& pos ) void -CollectionView::paintEvent( QPaintEvent* event ) +CollectionView::onTrackCountChanged( unsigned int tracks ) { - TrackView::paintEvent( event ); - QPainter painter( viewport() ); - - if ( !model()->trackCount() ) + if ( tracks == 0 ) { overlay()->setText( tr( "This collection is empty." ) ); - overlay()->paint( &painter ); + overlay()->show(); } + else + overlay()->hide(); } diff --git a/src/libtomahawk/playlist/collectionview.h b/src/libtomahawk/playlist/collectionview.h index f1b152785..9fd3f3483 100644 --- a/src/libtomahawk/playlist/collectionview.h +++ b/src/libtomahawk/playlist/collectionview.h @@ -15,12 +15,14 @@ public: explicit CollectionView( QWidget* parent = 0 ); ~CollectionView(); + virtual void setModel( TrackModel* model ); + private slots: void onCustomContextMenu( const QPoint& pos ); + void onTrackCountChanged( unsigned int tracks ); protected: virtual void dragEnterEvent( QDragEnterEvent* event ); - void paintEvent( QPaintEvent* event ); private: void setupMenus(); diff --git a/src/libtomahawk/playlist/playlistmodel.cpp b/src/libtomahawk/playlist/playlistmodel.cpp index fc0e92f6d..5b65dada1 100644 --- a/src/libtomahawk/playlist/playlistmodel.cpp +++ b/src/libtomahawk/playlist/playlistmodel.cpp @@ -89,8 +89,8 @@ PlaylistModel::loadPlaylist( const Tomahawk::playlist_ptr& playlist ) emit endInsertRows(); } - qDebug() << rowCount( QModelIndex() ); emit loadingFinished(); + emit trackCountChanged( rowCount( QModelIndex() ) ); } @@ -181,7 +181,10 @@ void PlaylistModel::onTracksInserted( unsigned int row, const QList& tracks, const Tomahawk::collection_ptr& collection ) { if ( !tracks.count() ) + { + emit trackCountChanged( rowCount( QModelIndex() ) ); return; + } int c = row; QPair< int, int > crows; @@ -207,7 +210,6 @@ PlaylistModel::onTracksInserted( unsigned int row, const QListtrackCount() ) + if ( tracks == 0 ) { overlay()->setText( tr( "This playlist is currently empty. Add some tracks to it and enjoy the music!" ) ); - overlay()->paint( &painter ); + overlay()->show(); } + else + overlay()->hide(); } diff --git a/src/libtomahawk/playlist/playlistview.h b/src/libtomahawk/playlist/playlistview.h index 84aaa83bd..3aafe8002 100644 --- a/src/libtomahawk/playlist/playlistview.h +++ b/src/libtomahawk/playlist/playlistview.h @@ -15,14 +15,14 @@ public: explicit PlaylistView( QWidget* parent = 0 ); ~PlaylistView(); - void setModel( TrackModel* model ); + virtual void setModel( TrackModel* model ); protected: void keyPressEvent( QKeyEvent* event ); - void paintEvent( QPaintEvent* event ); private slots: void onCustomContextMenu( const QPoint& pos ); + void onTrackCountChanged( unsigned int tracks ); void addItemsToPlaylist(); void deleteItems(); diff --git a/src/libtomahawk/playlist/trackview.cpp b/src/libtomahawk/playlist/trackview.cpp index 5ea2b06ba..8e9a3d522 100644 --- a/src/libtomahawk/playlist/trackview.cpp +++ b/src/libtomahawk/playlist/trackview.cpp @@ -251,13 +251,6 @@ TrackView::paintEvent( QPaintEvent* event ) QTreeView::paintEvent( event ); QPainter painter( viewport() ); - if ( !proxyModel()->filter().isEmpty() && !proxyModel()->trackCount() && - model()->trackCount() ) - { - m_overlay->setText( tr( "Sorry, your filter '%1' did not match any results." ).arg( proxyModel()->filter() ) ); - m_overlay->paint( &painter ); - } - if ( m_dragging ) { // draw drop indicator @@ -290,7 +283,15 @@ TrackView::onFilterChanged( const QString& ) if ( selectedIndexes().count() ) scrollTo( selectedIndexes().at( 0 ), QAbstractItemView::PositionAtCenter ); - reset(); + if ( !proxyModel()->filter().isEmpty() && !proxyModel()->trackCount() && + model()->trackCount() ) + { + m_overlay->setText( tr( "Sorry, your filter '%1' did not match any results." ).arg( proxyModel()->filter() ) ); + m_overlay->show(); + } + else + if ( model()->trackCount() ) + m_overlay->hide(); } diff --git a/src/libtomahawk/playlist/trackview.h b/src/libtomahawk/playlist/trackview.h index 0c5547313..8965aad1b 100644 --- a/src/libtomahawk/playlist/trackview.h +++ b/src/libtomahawk/playlist/trackview.h @@ -30,7 +30,7 @@ public: TrackHeader* header() const { return m_header; } OverlayWidget* overlay() const { return m_overlay; } - void setModel( TrackModel* model ); + virtual void setModel( TrackModel* model ); QModelIndex contextMenuIndex() const { return m_contextMenuIndex; } void setContextMenuIndex( const QModelIndex& idx ) { m_contextMenuIndex = idx; } diff --git a/src/libtomahawk/widgets/overlaywidget.cpp b/src/libtomahawk/widgets/overlaywidget.cpp index e752d9f5b..5149c5726 100644 --- a/src/libtomahawk/widgets/overlaywidget.cpp +++ b/src/libtomahawk/widgets/overlaywidget.cpp @@ -5,17 +5,20 @@ #include #define CORNER_ROUNDNESS 16.0 -#define FADEIN_DURATION 500 +#define FADING_DURATION 500 #define FONT_SIZE 18 -#define OPACITY 0.80 +#define OPACITY 0.86 -OverlayWidget::OverlayWidget( QAbstractItemView* parent ) - : QWidget() // this is on purpose! +OverlayWidget::OverlayWidget( QWidget* parent ) + : QWidget( parent ) // this is on purpose! + , m_opacity( 0.00 ) , m_parent( parent ) { resize( 380, 220 ); setAttribute( Qt::WA_TranslucentBackground, true ); + + setOpacity( m_opacity ); } @@ -28,74 +31,50 @@ void OverlayWidget::setOpacity( qreal opacity ) { m_opacity = opacity; - m_parent->reset(); + repaint(); } void OverlayWidget::setText( const QString& text ) { - if ( text == m_text ) - return; - - if ( isEnabled() ) - { - QPropertyAnimation* animation = new QPropertyAnimation( this, "opacity" ); - animation->setDuration( FADEIN_DURATION ); - animation->setStartValue( 0.00 ); - animation->setEndValue( OPACITY ); - animation->start(); - } - else - m_opacity = OPACITY; - m_text = text; - m_pixmap = QPixmap(); -} - - -QPixmap -OverlayWidget::pixmap() -{ - if ( m_pixmap.isNull() ) - { - QPixmap p( contentsRect().size() ); - p.fill( Qt::transparent ); - render( &p ); - - m_pixmap = p; - } - - return m_pixmap; } void -OverlayWidget::paint( QPainter* painter ) +OverlayWidget::show() { - if ( !isEnabled() ) - return; + QPropertyAnimation* animation = new QPropertyAnimation( this, "opacity" ); + animation->setDuration( FADING_DURATION ); + animation->setStartValue( 0.00 ); + animation->setEndValue( OPACITY ); + animation->start(); +} - pixmap(); // cache the image - QRect center( QPoint( ( painter->viewport().width() - m_pixmap.width() ) / 2, - ( painter->viewport().height() - m_pixmap.height() ) / 2 ), m_pixmap.size() ); - - painter->save(); - painter->setOpacity( m_opacity ); - painter->drawPixmap( center, m_pixmap ); - painter->restore(); +void +OverlayWidget::hide() +{ + QPropertyAnimation* animation = new QPropertyAnimation( this, "opacity" ); + animation->setDuration( FADING_DURATION ); + animation->setEndValue( 0.00 ); + animation->start(); } void OverlayWidget::paintEvent( QPaintEvent* event ) { + QPoint center( ( m_parent->width() - width() ) / 2, ( m_parent->height() - height() ) / 2 ); + move( center ); + QPainter p( this ); QRect r = contentsRect(); p.setBackgroundMode( Qt::TransparentMode ); p.setRenderHint( QPainter::Antialiasing ); + p.setOpacity( m_opacity ); QPen pen( palette().dark().color(), .5 ); p.setPen( pen ); diff --git a/src/libtomahawk/widgets/overlaywidget.h b/src/libtomahawk/widgets/overlaywidget.h index a24b0a370..52c402012 100644 --- a/src/libtomahawk/widgets/overlaywidget.h +++ b/src/libtomahawk/widgets/overlaywidget.h @@ -12,18 +12,18 @@ Q_OBJECT Q_PROPERTY( qreal opacity READ opacity WRITE setOpacity ) public: - OverlayWidget( QAbstractItemView* parent ); + OverlayWidget( QWidget* parent ); ~OverlayWidget(); - QPixmap pixmap(); - qreal opacity() const { return m_opacity; } void setOpacity( qreal opacity ); QString text() const { return m_text; } void setText( const QString& text ); - void paint( QPainter* painter ); +public slots: + void show(); + void hide(); protected: // void changeEvent( QEvent* e ); @@ -31,10 +31,9 @@ protected: private: QString m_text; - QPixmap m_pixmap; qreal m_opacity; - QAbstractItemView* m_parent; + QWidget* m_parent; }; -#endif // WELCOMEWIDGET_H +#endif // OVERLAYWIDGET_H diff --git a/src/libtomahawk/widgets/welcomewidget.cpp b/src/libtomahawk/widgets/welcomewidget.cpp index c6693a8b3..e8118daec 100644 --- a/src/libtomahawk/widgets/welcomewidget.cpp +++ b/src/libtomahawk/widgets/welcomewidget.cpp @@ -56,6 +56,14 @@ WelcomeWidget::updatePlaylists() ui->playlistWidget->addItem( item ); item->setData( Qt::DisplayRole, playlist->title() ); } + + if ( !playlists.count() ) + { + ui->playlistWidget->overlay()->setText( tr( "You have not played any playlists yet." ) ); + ui->playlistWidget->overlay()->show(); + } + else + ui->playlistWidget->overlay()->hide(); } @@ -178,3 +186,10 @@ PlaylistDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, painter->restore(); } + + +PlaylistWidget::PlaylistWidget( QWidget* parent ) + : QListWidget( parent ) +{ + m_overlay = new OverlayWidget( this ); +} diff --git a/src/libtomahawk/widgets/welcomewidget.h b/src/libtomahawk/widgets/welcomewidget.h index c98e8a148..79f700448 100644 --- a/src/libtomahawk/widgets/welcomewidget.h +++ b/src/libtomahawk/widgets/welcomewidget.h @@ -15,6 +15,7 @@ #include "dllmacro.h" class PlaylistModel; +class OverlayWidget; namespace Ui { @@ -60,6 +61,18 @@ private: }; +class DLLEXPORT PlaylistWidget : public QListWidget +{ +public: + PlaylistWidget( QWidget* parent = 0 ); + + OverlayWidget* overlay() const { return m_overlay; } + +private: + OverlayWidget* m_overlay; +}; + + class DLLEXPORT WelcomeWidget : public QWidget { Q_OBJECT diff --git a/src/libtomahawk/widgets/welcomewidget.ui b/src/libtomahawk/widgets/welcomewidget.ui index bbd6b2846..f6e22e442 100644 --- a/src/libtomahawk/widgets/welcomewidget.ui +++ b/src/libtomahawk/widgets/welcomewidget.ui @@ -41,7 +41,7 @@ - + @@ -66,6 +66,11 @@ QTreeView
playlist/playlistview.h
+ + PlaylistWidget + QListWidget +
widgets/welcomewidget.h
+