diff --git a/src/libtomahawk/CMakeLists.txt b/src/libtomahawk/CMakeLists.txt index 55bbb25b6..e72a306e2 100644 --- a/src/libtomahawk/CMakeLists.txt +++ b/src/libtomahawk/CMakeLists.txt @@ -95,6 +95,7 @@ set( libSources playlist/dynamic/DynamicControl.cpp playlist/dynamic/GeneratorFactory.cpp playlist/dynamic/GeneratorInterface.cpp + playlist/dynamic/DynamicView.cpp playlist/dynamic/echonest/EchonestGenerator.cpp playlist/dynamic/echonest/EchonestControl.cpp playlist/dynamic/widgets/DynamicWidget.cpp @@ -227,6 +228,7 @@ set( libHeaders playlist/dynamic/DynamicControl.h playlist/dynamic/GeneratorFactory.h playlist/dynamic/GeneratorInterface.h + playlist/dynamic/DynamicView.h playlist/dynamic/echonest/EchonestGenerator.h playlist/dynamic/echonest/EchonestControl.h playlist/dynamic/widgets/DynamicWidget.h diff --git a/src/libtomahawk/playlist/dynamic/DynamicView.cpp b/src/libtomahawk/playlist/dynamic/DynamicView.cpp new file mode 100644 index 000000000..03f9b66ad --- /dev/null +++ b/src/libtomahawk/playlist/dynamic/DynamicView.cpp @@ -0,0 +1,62 @@ +/**************************************************************************************** + * Copyright (c) 2011 Leo Franchi <lfranchi@kde.org> * + * * + * This program is free software; you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free Software * + * Foundation; either version 2 of the License, or (at your option) any later * + * version. * + * * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY * + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * + * PARTICULAR PURPOSE. See the GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License along with * + * this program. If not, see <http://www.gnu.org/licenses/>. * + ****************************************************************************************/ + +#include "DynamicView.h" +#include <QPainter> +#include <widgets/overlaywidget.h> + +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 ); + + connect( &m_showTimer, SIGNAL( timeout() ), m_fadeOut, SLOT( start() ) ); + +} + +DynamicView::~DynamicView() +{ + +} + +void +DynamicView::showMessageTimeout( const QString& title, const QString& body ) +{ + m_title = title; + m_body = body; + m_showTimer.start(); +} + +void +DynamicView::paintEvent( QPaintEvent* event ) +{ + if ( m_showTimer.isActive() || m_fadeOut->state() == QPropertyAnimation::Running ) + { + QPainter painter( viewport() ); + overlay()->setText( QString( "%1\n%2" ).arg( m_title, m_body ) ); + overlay()->paint( &painter ); + } else { + PlaylistView::paintEvent( event ); + } +} diff --git a/src/libtomahawk/playlist/dynamic/DynamicView.h b/src/libtomahawk/playlist/dynamic/DynamicView.h new file mode 100644 index 000000000..4711fc45a --- /dev/null +++ b/src/libtomahawk/playlist/dynamic/DynamicView.h @@ -0,0 +1,51 @@ +/**************************************************************************************** + * Copyright (c) 2011 Leo Franchi <lfranchi@kde.org> * + * * + * This program is free software; you can redistribute it and/or modify it under * + * the terms of the GNU General Public License as published by the Free Software * + * Foundation; either version 2 of the License, or (at your option) any later * + * version. * + * * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY * + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * + * PARTICULAR PURPOSE. See the GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License along with * + * this program. If not, see <http://www.gnu.org/licenses/>. * + ****************************************************************************************/ + +#ifndef DYNAMIC_VIEW_H +#define DYNAMIC_VIEW_H + +#include "playlist/playlistview.h" +#include <QTimer> +#include <QPropertyAnimation> + +namespace Tomahawk +{ + +class DynamicView : public PlaylistView +{ + Q_OBJECT +public: + explicit DynamicView( QWidget* parent = 0 ); + virtual ~DynamicView(); + +public slots: + void showMessageTimeout( const QString& title, const QString& body ); + +protected: + virtual void paintEvent( QPaintEvent* event ); + +private: + QTimer m_showTimer; + QPropertyAnimation* m_fadeOut; + + QString m_title; + QString m_body; +}; + +}; + + +#endif diff --git a/src/libtomahawk/playlist/dynamic/GeneratorInterface.h b/src/libtomahawk/playlist/dynamic/GeneratorInterface.h index 9f42e2003..435525aa1 100644 --- a/src/libtomahawk/playlist/dynamic/GeneratorInterface.h +++ b/src/libtomahawk/playlist/dynamic/GeneratorInterface.h @@ -94,8 +94,7 @@ public: void removeControl( const dyncontrol_ptr& control ); signals: - void controlsInvalid( const QString& shortTitle, const QString& message ); - void onDemandFailed(); + void error( const QString& title, const QString& body); void generated( const QList< Tomahawk::query_ptr>& queries ); void nextTrackGenerated( const Tomahawk::query_ptr& track ); diff --git a/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp b/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp index 3520fc44d..4f0cb374b 100644 --- a/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp +++ b/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp @@ -85,7 +85,7 @@ EchonestGenerator::generate ( int number ) connect( reply, SIGNAL( finished() ), this, SLOT( staticFinished() ) ); } catch( std::runtime_error& e ) { qWarning() << "Got invalid controls!" << e.what(); - emit controlsInvalid( "Controls were not valid", QString::fromLatin1( e.what() ) ); + emit error( "Filters are not valid", e.what() ); } } @@ -100,7 +100,7 @@ EchonestGenerator::startOnDemand() connect( reply, SIGNAL( finished() ), this, SLOT( dynamicStarted() ) ); } catch( std::runtime_error& e ) { qWarning() << "Got invalid controls!" << e.what(); - emit controlsInvalid( "Controls were not valid", QString::fromLatin1( e.what() ) ); + emit error( "Filters are not valid", e.what() ); } } @@ -131,8 +131,9 @@ EchonestGenerator::staticFinished() try { songs = Echonest::DynamicPlaylist::parseStaticPlaylist( reply ); } catch( const Echonest::ParseError& e ) { - qWarning() << "libechonest threw an error trying to parse the static playlist!" << e.errorType() << e.what(); + qWarning() << "libechonest threw an error trying to parse the static playlist! code" << e.errorType() << "error desc:" << e.what(); + emit error( "The Echo Nest returned an error creating the playlist", e.what() ); return; } @@ -170,7 +171,7 @@ EchonestGenerator::dynamicStarted() emit nextTrackGenerated( songQuery ); } catch( const Echonest::ParseError& e ) { qWarning() << "libechonest threw an error parsing the start of the dynamic playlist:" << e.errorType() << e.what(); - emit onDemandFailed(); + emit error( "The Echo Nest returned an error starting the station", e.what() ); } } @@ -188,6 +189,7 @@ EchonestGenerator::dynamicFetched() emit nextTrackGenerated( songQuery ); } catch( const Echonest::ParseError& e ) { qWarning() << "libechonest threw an error parsing the next song of the dynamic playlist:" << e.errorType() << e.what(); + emit error( "The Echo Nest returned an error getting the next song", e.what() ); } } diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp index cd5398a76..553d688da 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp @@ -33,6 +33,7 @@ #include "ReadOrWriteWidget.h" #include "CollapsibleControls.h" #include "DynamicControlWrapper.h" +#include "dynamic/DynamicView.h" using namespace Tomahawk; @@ -86,7 +87,7 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget m_layout->addWidget( m_controls ); m_model = new PlaylistModel( this ); - m_view = new PlaylistView( this ); + m_view = new DynamicView( this ); m_view->setModel( m_model ); m_view->setContentsMargins( 0, 0, 0, 0 ); m_layout->addWidget( m_view ); @@ -125,6 +126,7 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist ) disconnect( m_playlist->generator().data(), SIGNAL( generated( QList<Tomahawk::query_ptr> ) ), this, SLOT( tracksGenerated( QList<Tomahawk::query_ptr> ) ) ); disconnect( m_playlist.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision) ), this, SLOT(onRevisionLoaded( Tomahawk::DynamicPlaylistRevision) ) ); disconnect( m_playlist->generator().data(), SIGNAL( nextTrackGenerated( Tomahawk::query_ptr ) ), this, SLOT( onDemandFetched( Tomahawk::query_ptr ) ) ); + disconnect( m_playlist->generator().data(), SIGNAL( error( QString, QString ) ), m_view, SLOT( showMessageTimeout( QString, QString ) ) ); } m_playlist = playlist; @@ -140,6 +142,7 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist ) connect( m_playlist->generator().data(), SIGNAL( generated( QList<Tomahawk::query_ptr> ) ), this, SLOT( tracksGenerated( QList<Tomahawk::query_ptr> ) ) ); connect( m_playlist.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ), this, SLOT( onRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ) ); connect( m_playlist->generator().data(), SIGNAL( nextTrackGenerated( Tomahawk::query_ptr ) ), this, SLOT( onDemandFetched( Tomahawk::query_ptr ) ) ); + connect( m_playlist->generator().data(), SIGNAL( error( QString, QString ) ), m_view, SLOT( showMessageTimeout( QString, QString ) ) ); } diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h index 31d23dbe0..c8058c10d 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h @@ -38,6 +38,9 @@ class ReadOrWriteWidget; namespace Tomahawk { +class DynamicView; + + class CollapsibleControls; @@ -93,7 +96,7 @@ private: CollapsibleControls* m_controls; - PlaylistView* m_view; + DynamicView* m_view; PlaylistModel* m_model; };