diff --git a/src/libtomahawk/database/databasecommand_alltracks.cpp b/src/libtomahawk/database/databasecommand_alltracks.cpp index 2d0b48221..f3bf6812d 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/dynamic/DynamicView.cpp b/src/libtomahawk/playlist/dynamic/DynamicView.cpp index b4d0996bc..50f0a9a89 100644 --- a/src/libtomahawk/playlist/dynamic/DynamicView.cpp +++ b/src/libtomahawk/playlist/dynamic/DynamicView.cpp @@ -20,22 +20,12 @@ #include "trackmodel.h" #include - using namespace Tomahawk; DynamicView::DynamicView( QWidget* parent ) : PlaylistView( parent ) { - m_showTimer.setInterval( 5000 ); - m_showTimer.setSingleShot( true ); - - m_fadeOut = new QPropertyAnimation( overlay(), "opacity" ); - m_fadeOut->setDuration( 500 ); - m_fadeOut->setEndValue( 0 ); - m_fadeOut->setEasingCurve( QEasingCurve::InOutQuad ); - - connect( &m_showTimer, SIGNAL( timeout() ), m_fadeOut, SLOT( start() ) ); } @@ -44,27 +34,33 @@ DynamicView::~DynamicView() } +void +DynamicView::setModel( TrackModel* model) +{ + PlaylistView::setModel( model ); + + connect( model, SIGNAL( trackCountChanged( unsigned int ) ), SLOT( onTrackCountChanged( unsigned int ) ) ); +} + + void DynamicView::showMessageTimeout( const QString& title, const QString& body ) { m_title = title; m_body = body; - m_showTimer.start(); - viewport()->update(); + + overlay()->setText( QString( "%1:\n\n%2" ).arg( m_title, m_body ) ); + overlay()->show( 5 ); } void -DynamicView::paintEvent( QPaintEvent* event ) +DynamicView::onTrackCountChanged( unsigned int tracks ) { - QPainter painter( viewport() ); - if ( m_showTimer.isActive() || m_fadeOut->state() == QPropertyAnimation::Running ) + if ( tracks == 0 ) { - overlay()->setText( QString( "%1:\n\n%2" ).arg( m_title, m_body ) ); - overlay()->paint( &painter ); - } else if( !model()->trackCount() ) { overlay()->setText( tr( "Add some filters above, and press Generate to get started!" ) ); - overlay()->paint( &painter ); - } else { - PlaylistView::paintEvent( event ); + overlay()->show(); } + else + overlay()->hide(); } diff --git a/src/libtomahawk/playlist/dynamic/DynamicView.h b/src/libtomahawk/playlist/dynamic/DynamicView.h index 4711fc45a..f27ff1104 100644 --- a/src/libtomahawk/playlist/dynamic/DynamicView.h +++ b/src/libtomahawk/playlist/dynamic/DynamicView.h @@ -21,6 +21,7 @@ #include #include +class TrackModel; namespace Tomahawk { @@ -31,11 +32,13 @@ public: explicit DynamicView( QWidget* parent = 0 ); virtual ~DynamicView(); + virtual void setModel( TrackModel* model ); + public slots: void showMessageTimeout( const QString& title, const QString& body ); -protected: - virtual void paintEvent( QPaintEvent* event ); +private slots: + void onTrackCountChanged( unsigned int ); private: QTimer m_showTimer; diff --git a/src/libtomahawk/playlist/playlistmodel.cpp b/src/libtomahawk/playlist/playlistmodel.cpp index eeee32ae2..c0e62cddf 100644 --- a/src/libtomahawk/playlist/playlistmodel.cpp +++ b/src/libtomahawk/playlist/playlistmodel.cpp @@ -90,8 +90,8 @@ PlaylistModel::loadPlaylist( const Tomahawk::playlist_ptr& playlist ) emit endInsertRows(); } - qDebug() << rowCount( QModelIndex() ); emit loadingFinished(); + emit trackCountChanged( rowCount( QModelIndex() ) ); } @@ -194,7 +194,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; @@ -220,7 +223,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 34ef4e522..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 @@ -289,6 +282,16 @@ TrackView::onFilterChanged( const QString& ) { if ( selectedIndexes().count() ) scrollTo( selectedIndexes().at( 0 ), QAbstractItemView::PositionAtCenter ); + + 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 c15163382..92e1a6650 100644 --- a/src/libtomahawk/widgets/overlaywidget.cpp +++ b/src/libtomahawk/widgets/overlaywidget.cpp @@ -4,18 +4,24 @@ #include #include -#define CORNER_ROUNDNESS 32.0 -#define FADEIN_DURATION 500 +#define CORNER_ROUNDNESS 16.0 +#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 ); + + m_timer.setSingleShot( true ); + connect( &m_timer, SIGNAL( timeout() ), this, SLOT( hide() ) ); } @@ -28,77 +34,67 @@ void OverlayWidget::setOpacity( qreal opacity ) { m_opacity = opacity; - m_parent->viewport()->update(); + + if ( m_opacity == 0.00 && !isHidden() ) + { + QWidget::hide(); + } + else if ( m_opacity > 0.00 && isHidden() ) + { + QWidget::show(); + } + + 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( int timeoutSecs ) { - if ( !isEnabled() ) - return; + QPropertyAnimation* animation = new QPropertyAnimation( this, "opacity" ); + animation->setDuration( FADING_DURATION ); + animation->setStartValue( 0.00 ); + animation->setEndValue( OPACITY ); + animation->start(); + + if( timeoutSecs > 0 ) + m_timer.start( timeoutSecs * 1000 ); +} - 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 ); - p.setPen( palette().shadow().color() ); - p.setBrush( palette().shadow() ); + QPen pen( palette().dark().color(), .5 ); + p.setPen( pen ); + p.setBrush( palette().highlight() ); p.drawRoundedRect( r, CORNER_ROUNDNESS, CORNER_ROUNDNESS ); @@ -110,6 +106,6 @@ OverlayWidget::paintEvent( QPaintEvent* event ) f.setBold( true ); p.setFont( f ); - p.setPen( palette().light().color() ); + p.setPen( palette().highlightedText().color() ); p.drawText( r.adjusted( 16, 16, -16, -16 ), text(), to ); } diff --git a/src/libtomahawk/widgets/overlaywidget.h b/src/libtomahawk/widgets/overlaywidget.h index a24b0a370..28af6ea34 100644 --- a/src/libtomahawk/widgets/overlaywidget.h +++ b/src/libtomahawk/widgets/overlaywidget.h @@ -5,6 +5,7 @@ #include #include "dllmacro.h" +#include class DLLEXPORT OverlayWidget : public QWidget { @@ -12,18 +13,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( int timeoutSecs = 0 ); + void hide(); protected: // void changeEvent( QEvent* e ); @@ -31,10 +32,10 @@ protected: private: QString m_text; - QPixmap m_pixmap; qreal m_opacity; - QAbstractItemView* m_parent; + QWidget* m_parent; + QTimer m_timer; }; -#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
+
diff --git a/src/scrobbler.cpp b/src/scrobbler.cpp index 228604b9a..6f5689921 100644 --- a/src/scrobbler.cpp +++ b/src/scrobbler.cpp @@ -140,6 +140,9 @@ Scrobbler::scrobble() { Q_ASSERT( QThread::currentThread() == thread() ); + if ( !m_scrobbler || m_track.isNull() ) + return; + qDebug() << Q_FUNC_INFO << m_track.toString(); m_scrobbler->cache( m_track ); m_scrobbler->submit();