diff --git a/src/libtomahawk/database/DatabaseCommand.cpp b/src/libtomahawk/database/DatabaseCommand.cpp index e287cfe45..b86fd2d53 100644 --- a/src/libtomahawk/database/DatabaseCommand.cpp +++ b/src/libtomahawk/database/DatabaseCommand.cpp @@ -29,6 +29,7 @@ #include "DatabaseCommand_DeleteDynamicPlaylist.h" #include "DatabaseCommand_SetDynamicPlaylistRevision.h" #include "DatabaseCommand_SocialAction.h" +#include "DatabaseCommand_ShareTrack.h" #include "utils/Logger.h" #include "DatabaseCommand_SetCollectionAttributes.h" @@ -185,6 +186,13 @@ DatabaseCommand::factory( const QVariant& op, const source_ptr& source ) QJson::QObjectHelper::qvariant2qobject( op.toMap(), cmd ); return cmd; } + else if( name == "sharetrack" ) + { + DatabaseCommand_ShareTrack * cmd = new DatabaseCommand_ShareTrack; + cmd->setSource( source ); + QJson::QObjectHelper::qvariant2qobject( op.toMap(), cmd ); + return cmd; + } qDebug() << "Unknown database command" << name; // Q_ASSERT( false ); diff --git a/src/libtomahawk/database/DatabaseCommand_ShareTrack.cpp b/src/libtomahawk/database/DatabaseCommand_ShareTrack.cpp index 18cacf101..b905b8835 100644 --- a/src/libtomahawk/database/DatabaseCommand_ShareTrack.cpp +++ b/src/libtomahawk/database/DatabaseCommand_ShareTrack.cpp @@ -66,14 +66,14 @@ DatabaseCommand_ShareTrack::exec( DatabaseImpl* dbi ) void DatabaseCommand_ShareTrack::postCommitHook() { - if ( !m_query.isNull() ) - return; - if ( source()->isLocal() ) Servent::instance()->triggerDBSync(); - QString myDbid = Database::instance()->impl()->dbid(); - QString sourceDbid = source()->userName(); //userName is actually a dbid -_-' + if ( !m_query.isNull() ) + return; + + QString myDbid = SourceList::instance()->getLocal()->nodeId(); + QString sourceDbid = source()->nodeId(); if ( myDbid != m_recipient || sourceDbid == m_recipient ) return; diff --git a/src/libtomahawk/database/DatabaseCommand_ShareTrack.h b/src/libtomahawk/database/DatabaseCommand_ShareTrack.h index ecc351f75..6ab805857 100644 --- a/src/libtomahawk/database/DatabaseCommand_ShareTrack.h +++ b/src/libtomahawk/database/DatabaseCommand_ShareTrack.h @@ -28,7 +28,7 @@ #include "DllMacro.h" -class DatabaseCommand_ShareTrack : public DatabaseCommandLoggable +class DLLEXPORT DatabaseCommand_ShareTrack : public DatabaseCommandLoggable { Q_OBJECT Q_PROPERTY( QString artist READ artist WRITE setArtist ) diff --git a/src/libtomahawk/playlist/InboxModel.h b/src/libtomahawk/playlist/InboxModel.h index 0a9d50249..754b2ad20 100644 --- a/src/libtomahawk/playlist/InboxModel.h +++ b/src/libtomahawk/playlist/InboxModel.h @@ -30,8 +30,6 @@ public: explicit InboxModel( QObject* parent = 0 ); virtual ~InboxModel(); -signals: - public slots: }; diff --git a/src/sourcetree/items/SourceItem.cpp b/src/sourcetree/items/SourceItem.cpp index 2afb47b48..e0e63b6fa 100644 --- a/src/sourcetree/items/SourceItem.cpp +++ b/src/sourcetree/items/SourceItem.cpp @@ -21,6 +21,9 @@ #include "SourceItem.h" #include "CategoryItems.h" +#include "database/Database.h" +#include "database/DatabaseCommand_ShareTrack.h" +#include "DropJob.h" #include "PlaylistItems.h" #include "ViewManager.h" #include "Playlist.h" @@ -677,6 +680,21 @@ SourceItem::getRecentPlaysPage() const } +void +SourceItem::onTracksDropped( const QList< query_ptr >& queries ) +{ + foreach ( const query_ptr& query, queries ) + { + DatabaseCommand_ShareTrack* cmd = + new DatabaseCommand_ShareTrack( query, m_source->nodeId() ); + + Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) ); + } + tDebug() << "I am" << SourceList::instance()->getLocal()->nodeId(); + tDebug() << "Dropped tracks on source item" << text() << m_source->friendlyName() << m_source->nodeId(); +} + + CategoryItem* SourceItem::stationsCategory() const { @@ -703,3 +721,43 @@ SourceItem::setPlaylistsCategory(CategoryItem* item) { m_playlists = item; } + + +bool +SourceItem::willAcceptDrag( const QMimeData* data ) const +{ + return DropJob::acceptsMimeData( data, DropJob::Track ); +} + + +bool +SourceItem::dropMimeData( const QMimeData* data, Qt::DropAction action ) +{ + Q_UNUSED( action ); + + QList< Tomahawk::query_ptr > queries; + if ( !DropJob::acceptsMimeData( data, DropJob::Track ) ) + return false; + + if ( source()->isLocal() ) + return false; + + DropJob* dj = new DropJob(); + dj->setDropTypes( DropJob::Track ); + + connect( dj, SIGNAL( tracks( QList< Tomahawk::query_ptr > ) ), + this, SLOT( onTracksDropped( QList< Tomahawk::query_ptr > ) ) ); + dj->tracksFromMimeData( data, false, false ); + return true; +} + + +SourceTreeItem::DropTypes +SourceItem::supportedDropTypes( const QMimeData* data ) const +{ + if ( data->hasFormat( "application/tomahawk.result.list" ) || + data->hasFormat( "application/tomahawk.query.list" ) ) + return DropTypeThisTrack; + + return DropTypesNone; +} diff --git a/src/sourcetree/items/SourceItem.h b/src/sourcetree/items/SourceItem.h index 9501bcf76..16e2085f9 100644 --- a/src/sourcetree/items/SourceItem.h +++ b/src/sourcetree/items/SourceItem.h @@ -55,6 +55,10 @@ public: void setStationsCategory( CategoryItem* item ); void setPlaylistsCategory( CategoryItem* item ); + virtual bool willAcceptDrag( const QMimeData* data ) const; + virtual bool dropMimeData( const QMimeData* data, Qt::DropAction action ); + virtual DropTypes supportedDropTypes( const QMimeData* data ) const; + public slots: virtual void activate(); @@ -90,6 +94,8 @@ private slots: Tomahawk::ViewPage* recentPlaysClicked(); Tomahawk::ViewPage* getRecentPlaysPage() const; + void onTracksDropped( const QList< Tomahawk::query_ptr >& queries ); + private: void playlistsAddedInternal( SourceTreeItem* parent, const QList< Tomahawk::dynplaylist_ptr >& playlists ); template< typename T >