diff --git a/src/libtomahawk/CMakeLists.txt b/src/libtomahawk/CMakeLists.txt index d6eacf3d8..918b18270 100644 --- a/src/libtomahawk/CMakeLists.txt +++ b/src/libtomahawk/CMakeLists.txt @@ -72,6 +72,7 @@ set( libGuiSources playlist/TreeWidget.cpp playlist/ViewHeader.cpp playlist/LovedTracksModel.cpp + playlist/RecentlyLovedTracksModel.cpp playlist/TopLovedTracksModel.cpp playlist/RecentlyAddedModel.cpp playlist/RecentlyPlayedModel.cpp diff --git a/src/libtomahawk/playlist/LovedTracksModel.cpp b/src/libtomahawk/playlist/LovedTracksModel.cpp index efcbf2217..b053b71b7 100644 --- a/src/libtomahawk/playlist/LovedTracksModel.cpp +++ b/src/libtomahawk/playlist/LovedTracksModel.cpp @@ -21,8 +21,9 @@ #include "SourceList.h" -LovedTracksModel::LovedTracksModel( QObject *parent ) - : PlaylistModel( parent, new LovedTracksModelPrivate( this ) ) + +void +LovedTracksModel::init() { Q_D( LovedTracksModel ); d->smoothingTimer.setInterval( 300 ); @@ -32,6 +33,20 @@ LovedTracksModel::LovedTracksModel( QObject *parent ) } +LovedTracksModel::LovedTracksModel( QObject *parent ) + : PlaylistModel( parent, new LovedTracksModelPrivate( this ) ) +{ + init(); +} + + +LovedTracksModel::LovedTracksModel(QObject *parent, LovedTracksModelPrivate *d) + : PlaylistModel( parent, d ) +{ + init(); +} + + LovedTracksModel::~LovedTracksModel() { } diff --git a/src/libtomahawk/playlist/LovedTracksModel.h b/src/libtomahawk/playlist/LovedTracksModel.h index 5f7fcce6a..f4ae883ae 100644 --- a/src/libtomahawk/playlist/LovedTracksModel.h +++ b/src/libtomahawk/playlist/LovedTracksModel.h @@ -30,7 +30,6 @@ class DLLEXPORT LovedTracksModel : public PlaylistModel Q_OBJECT public: - explicit LovedTracksModel( QObject* parent = 0 ); virtual ~LovedTracksModel(); unsigned int limit() const; @@ -41,9 +40,14 @@ public: public slots: void setSource( const Tomahawk::source_ptr& source ); -private slots: +protected slots: virtual void loadTracks(); +protected: + explicit LovedTracksModel( QObject* parent = 0 ); + explicit LovedTracksModel( QObject* parent, LovedTracksModelPrivate* d ); + +private slots: void onSourcesReady(); void onSourceAdded( const Tomahawk::source_ptr& source ); void onTrackLoved(); @@ -52,6 +56,9 @@ private slots: private: Q_DECLARE_PRIVATE( LovedTracksModel ) + + void init(); + }; #endif // LOVEDTRACKSMODEL_H diff --git a/src/libtomahawk/playlist/RecentlyLovedTracksModel.cpp b/src/libtomahawk/playlist/RecentlyLovedTracksModel.cpp new file mode 100644 index 000000000..872d37577 --- /dev/null +++ b/src/libtomahawk/playlist/RecentlyLovedTracksModel.cpp @@ -0,0 +1,66 @@ +/* === This file is part of Tomahawk Player - === + * + * Copyright 2013, Uwe L. Korn + * + * Tomahawk 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 3 of the License, or + * (at your option) any later version. + * + * Tomahawk 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 Tomahawk. If not, see . + */ + +#include "RecentlyLovedTracksModel_p.h" + +#include "database/Database.h" +#include "database/DatabaseCommand_GenericSelect.h" +#include "Source.h" + +RecentlyLovedTracksModel::RecentlyLovedTracksModel( QObject* parent ) + : LovedTracksModel( parent, new RecentlyLovedTracksModelPrivate( this ) ) +{ +} + + +RecentlyLovedTracksModel::~RecentlyLovedTracksModel() +{ +} + + +void +RecentlyLovedTracksModel::loadTracks() +{ + Q_D( RecentlyLovedTracksModel ); + startLoading(); + + QString sql; + if ( d->source.isNull() ) + { + sql = QString( "SELECT track.name, artist.name, source " + "FROM social_attributes, track, artist " + "WHERE social_attributes.id = track.id AND artist.id = track.artist AND social_attributes.k = 'Love' AND social_attributes.v = 'true' " + "GROUP BY track.id " + "ORDER BY social_attributes.timestamp DESC LIMIT %1" ) + .arg( d->limit ); + } + else + { + sql = QString( "SELECT track.name, artist.name " + "FROM social_attributes, track, artist " + "WHERE social_attributes.id = track.id AND artist.id = track.artist AND social_attributes.k = 'Love' AND social_attributes.v = 'true' AND social_attributes.source %1 " + "GROUP BY track.id " + "ORDER BY social_attributes.timestamp DESC " + ) + .arg( d->source->isLocal() ? "IS NULL" : QString( "= %1" ).arg( d->source->id() ) ); + } + + Tomahawk::DatabaseCommand_GenericSelect* cmd = new Tomahawk::DatabaseCommand_GenericSelect( sql, Tomahawk::DatabaseCommand_GenericSelect::Track, -1, 0 ); + connect( cmd, SIGNAL( tracks( QList ) ), this, SLOT( tracksLoaded( QList ) ) ); + Tomahawk::Database::instance()->enqueue( Tomahawk::dbcmd_ptr( cmd ) ); +} diff --git a/src/libtomahawk/playlist/RecentlyLovedTracksModel.h b/src/libtomahawk/playlist/RecentlyLovedTracksModel.h new file mode 100644 index 000000000..8b6396552 --- /dev/null +++ b/src/libtomahawk/playlist/RecentlyLovedTracksModel.h @@ -0,0 +1,41 @@ +/* === This file is part of Tomahawk Player - === + * + * Copyright 2013, Uwe L. Korn + * + * Tomahawk 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 3 of the License, or + * (at your option) any later version. + * + * Tomahawk 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 Tomahawk. If not, see . + */ + +#pragma once +#ifndef RECENTLYLOVEDTRACKSMODEL_H +#define RECENTLYLOVEDTRACKSMODEL_H + +#include "LovedTracksModel.h" + +class RecentlyLovedTracksModelPrivate; + +class RecentlyLovedTracksModel : public LovedTracksModel +{ + Q_OBJECT +public: + explicit RecentlyLovedTracksModel(QObject *parent = 0); + virtual ~RecentlyLovedTracksModel(); + +protected slots: + virtual void loadTracks(); + +private: + Q_DECLARE_PRIVATE( RecentlyLovedTracksModel ) +}; + +#endif // RECENTLYLOVEDTRACKSMODEL_H diff --git a/src/libtomahawk/playlist/RecentlyLovedTracksModel_p.h b/src/libtomahawk/playlist/RecentlyLovedTracksModel_p.h new file mode 100644 index 000000000..8e2faa9ab --- /dev/null +++ b/src/libtomahawk/playlist/RecentlyLovedTracksModel_p.h @@ -0,0 +1,36 @@ +/* === This file is part of Tomahawk Player - === + * + * Copyright 2013, Uwe L. Korn + * + * Tomahawk 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 3 of the License, or + * (at your option) any later version. + * + * Tomahawk 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 Tomahawk. If not, see . + */ + +#ifndef RECENTLYLOVEDTRACKSMODEL_P_H +#define RECENTLYLOVEDTRACKSMODEL_P_H + +#include "RecentlyLovedTracksModel.h" +#include "LovedTracksModel_p.h" + +class RecentlyLovedTracksModelPrivate : public LovedTracksModelPrivate +{ +public: + RecentlyLovedTracksModelPrivate( RecentlyLovedTracksModel* q ) + : LovedTracksModelPrivate( q ) + { + } + + Q_DECLARE_PUBLIC( RecentlyLovedTracksModel ) +}; + +#endif // RECENTLYLOVEDTRACKSMODEL_P_H diff --git a/src/libtomahawk/playlist/TopLovedTracksModel.h b/src/libtomahawk/playlist/TopLovedTracksModel.h index 5ca627a81..6753aa33a 100644 --- a/src/libtomahawk/playlist/TopLovedTracksModel.h +++ b/src/libtomahawk/playlist/TopLovedTracksModel.h @@ -33,7 +33,7 @@ public: explicit TopLovedTracksModel( QObject* parent = 0 ); virtual ~TopLovedTracksModel(); -private slots: +protected slots: void loadTracks(); private: