From 46623c09e83a872a0c3fcc60e666be09de91cc41 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Sun, 16 Jan 2011 22:18:24 -0500 Subject: [PATCH] attempt to move creation of playlist objects into the GUI thread at all times --- .../databasecommand_createdynamicplaylist.cpp | 61 ++++++++++++------- .../databasecommand_createdynamicplaylist.h | 14 ++--- .../databasecommand_createplaylist.cpp | 44 +++++++++---- .../database/databasecommand_createplaylist.h | 13 ++-- src/tomahawkwindow.cpp | 18 ++++++ src/tomahawkwindow.h | 6 +- 6 files changed, 107 insertions(+), 49 deletions(-) diff --git a/src/libtomahawk/database/databasecommand_createdynamicplaylist.cpp b/src/libtomahawk/database/databasecommand_createdynamicplaylist.cpp index 90c3c2109..5f25c391b 100644 --- a/src/libtomahawk/database/databasecommand_createdynamicplaylist.cpp +++ b/src/libtomahawk/database/databasecommand_createdynamicplaylist.cpp @@ -8,6 +8,7 @@ #include "dynamic/GeneratorInterface.h" #include "network/servent.h" +#include "tomahawk/tomahawkapp.h" using namespace Tomahawk; @@ -32,7 +33,7 @@ void DatabaseCommand_CreateDynamicPlaylist::exec( DatabaseImpl* lib ) { qDebug() << Q_FUNC_INFO; - Q_ASSERT( !m_playlist.isNull() ); + Q_ASSERT( !( m_playlist.isNull() && m_v.isNull() ) ); Q_ASSERT( !source().isNull() ); DatabaseCommand_CreatePlaylist::createPlaylist( lib, true ); @@ -40,26 +41,36 @@ DatabaseCommand_CreateDynamicPlaylist::exec( DatabaseImpl* lib ) TomahawkSqlQuery cre = lib->newquery(); - cre.prepare( QString( "INSERT INTO dynamic_playlist( guid, pltype, plmode ) " - "VALUES( '%1', '%2', %3 )" ).arg( m_playlist->guid() ).arg( m_playlist->type() ).arg( m_playlist->mode() ) ); - + cre.prepare( "INSERT INTO dynamic_playlist( guid, pltype, plmode ) " + "VALUES( ?, ?, ? )" ); + + if( m_playlist.isNull() ) { + QVariantMap m = m_v.toMap(); + cre.addBindValue( m.value( "guid" ) ); + cre.addBindValue( m.value( "type" ) ); + cre.addBindValue( m.value( "mode" ) ); + } else { + cre.addBindValue( m_playlist->guid() ); + cre.addBindValue( m_playlist->type() ); + cre.addBindValue( m_playlist->mode() ); + } cre.exec(); - // save the controls - cre = lib->newquery(); - cre.prepare( "INSERT INTO dynamic_playlist_controls( id, selectedType, match, input) " - "VALUES( :id, :selectedType, :match, :input )" ); - foreach( const dyncontrol_ptr& control, m_playlist->generator()->controls() ) { - - cre.bindValue( ":id", control->id() ); - cre.bindValue( ":selectedType", control->selectedType() ); - cre.bindValue( ":match", control->match() ); - cre.bindValue( ":input", control->input() ); - - qDebug() << "CREATE DYNPLAYLIST CONTROL:" << cre.boundValues(); - - cre.exec(); - } + // save the controls -- wait, no controls in a new playlist :P +// cre = lib->newquery(); +// cre.prepare( "INSERT INTO dynamic_playlist_controls( id, selectedType, match, input) " +// "VALUES( :id, :selectedType, :match, :input )" ); +// foreach( const dyncontrol_ptr& control, m_playlist->generator()->controls() ) { +// +// cre.bindValue( ":id", control->id() ); +// cre.bindValue( ":selectedType", control->selectedType() ); +// cre.bindValue( ":match", control->match() ); +// cre.bindValue( ":input", control->input() ); +// +// qDebug() << "CREATE DYNPLAYLIST CONTROL:" << cre.boundValues(); +// +// cre.exec(); +// } } @@ -71,8 +82,16 @@ DatabaseCommand_CreateDynamicPlaylist::postCommitHook() return; qDebug() << Q_FUNC_INFO << "..reporting.."; - m_playlist->reportCreated( m_playlist ); - + if( m_playlist.isNull() ) { + source_ptr src = source(); + QMetaObject::invokeMethod( TomahawkApp::instance()->mainWindow(), + "createDynamicPlaylist", + Qt::BlockingQueuedConnection, + QGenericArgument( "Tomahawk::source_ptr", (const void*)&src ), + Q_ARG( QVariant, m_v ) ); + } else { + m_playlist->reportCreated( m_playlist ); + } if( source()->isLocal() ) Servent::instance()->triggerDBSync(); } diff --git a/src/libtomahawk/database/databasecommand_createdynamicplaylist.h b/src/libtomahawk/database/databasecommand_createdynamicplaylist.h index cbb1c7068..cdf180155 100644 --- a/src/libtomahawk/database/databasecommand_createdynamicplaylist.h +++ b/src/libtomahawk/database/databasecommand_createdynamicplaylist.h @@ -23,19 +23,15 @@ public: QVariant playlistV() const { - return QJson::QObjectHelper::qobject2qvariant( (QObject*)m_playlist.data() ); + if( m_v.isNull() ) + return QJson::QObjectHelper::qobject2qvariant( (QObject*)m_playlist.data() ); + else + return m_v; } void setPlaylistV( const QVariant& v ) { - qDebug() << "***********" << Q_FUNC_INFO << v; - using namespace Tomahawk; - - DynamicPlaylist* p = new DynamicPlaylist( source(), v.toMap().value( "type", QString() ).toString() ); - QJson::QObjectHelper::qvariant2qobject( v.toMap(), p ); - m_playlist = dynplaylist_ptr( p ); - - setPlaylist( m_playlist.staticCast() ); + m_v = v; } private: diff --git a/src/libtomahawk/database/databasecommand_createplaylist.cpp b/src/libtomahawk/database/databasecommand_createplaylist.cpp index 376e24182..123333daf 100644 --- a/src/libtomahawk/database/databasecommand_createplaylist.cpp +++ b/src/libtomahawk/database/databasecommand_createplaylist.cpp @@ -3,6 +3,7 @@ #include #include "network/servent.h" +#include "tomahawk/tomahawkapp.h" using namespace Tomahawk; @@ -40,7 +41,18 @@ DatabaseCommand_CreatePlaylist::postCommitHook() return; qDebug() << Q_FUNC_INFO << "..reporting.."; - m_playlist->reportCreated( m_playlist ); + if( m_playlist.isNull() ) { + source_ptr src = source(); + QMetaObject::invokeMethod( TomahawkApp::instance()->mainWindow(), + "createPlaylist", + Qt::BlockingQueuedConnection, + QGenericArgument( "Tomahawk::source_ptr", (const void*)&src ), + Q_ARG( QVariant, m_v ) + ); + } else { + m_playlist->reportCreated( m_playlist ); + } + if( source()->isLocal() ) Servent::instance()->triggerDBSync(); @@ -50,21 +62,31 @@ void DatabaseCommand_CreatePlaylist::createPlaylist( DatabaseImpl* lib, bool dynamic) { qDebug() << Q_FUNC_INFO; - Q_ASSERT( !m_playlist.isNull() ); + Q_ASSERT( !( m_playlist.isNull() && m_v.isNull() ) ); Q_ASSERT( !source().isNull() ); TomahawkSqlQuery cre = lib->newquery(); cre.prepare( "INSERT INTO playlist( guid, source, shared, title, info, creator, lastmodified, dynplaylist) " - "VALUES( :guid, :source, :shared, :title, :info, :creator, :lastmodified, :dynplaylist )" ); - cre.bindValue( ":guid", m_playlist->guid() ); - cre.bindValue( ":source", source()->isLocal() ? QVariant(QVariant::Int) : source()->id() ); - cre.bindValue( ":shared", m_playlist->shared() ); - cre.bindValue( ":title", m_playlist->title() ); - cre.bindValue( ":info", m_playlist->info() ); - cre.bindValue( ":creator", m_playlist->creator() ); - cre.bindValue( ":lastmodified", m_playlist->lastmodified() ); - cre.bindValue( ":dynplaylist", dynamic ); + "VALUES( :guid, :source, :shared, :title, :info, :creator, :lastmodified, :dynplaylist )" ); + cre.bindValue( ":source", source()->isLocal() ? QVariant(QVariant::Int) : source()->id() ); + cre.bindValue( ":dynplaylist", dynamic ); + if( !m_playlist.isNull() ) { + cre.bindValue( ":guid", m_playlist->guid() ); + cre.bindValue( ":shared", m_playlist->shared() ); + cre.bindValue( ":title", m_playlist->title() ); + cre.bindValue( ":info", m_playlist->info() ); + cre.bindValue( ":creator", m_playlist->creator() ); + cre.bindValue( ":lastmodified", m_playlist->lastmodified() ); + } else { + QVariantMap m = m_v.toMap(); + cre.bindValue( ":guid", m.value( "guid" ) ); + cre.bindValue( ":shared", m.value( "shared" ) ); + cre.bindValue( ":title", m.value( "title" ) ); + cre.bindValue( ":info", m.value( "info" ) ); + cre.bindValue( ":creator", m.value( "creator" ) ); + cre.bindValue( ":lastmodified", m.value( "lastmodified", 0 ) ); + } qDebug() << "CREATE PLAYLIST:" << cre.boundValues(); cre.exec(); diff --git a/src/libtomahawk/database/databasecommand_createplaylist.h b/src/libtomahawk/database/databasecommand_createplaylist.h index 6f0badc31..40b2c3de0 100644 --- a/src/libtomahawk/database/databasecommand_createplaylist.h +++ b/src/libtomahawk/database/databasecommand_createplaylist.h @@ -25,17 +25,15 @@ public: QVariant playlistV() const { - return QJson::QObjectHelper::qobject2qvariant( (QObject*)m_playlist.data() ); + if( m_v.isNull() ) + return QJson::QObjectHelper::qobject2qvariant( (QObject*)m_playlist.data() ); + else + return m_v; } void setPlaylistV( const QVariant& v ) { - qDebug() << "***********" << Q_FUNC_INFO << v; - using namespace Tomahawk; - - Playlist* p = new Playlist( source() ); - QJson::QObjectHelper::qvariant2qobject( v.toMap(), p ); - m_playlist = playlist_ptr( p ); + m_v = v; } protected: @@ -44,6 +42,7 @@ protected: bool report() { return m_report; } void setPlaylist( const Tomahawk::playlist_ptr& playlist ) { m_playlist = playlist; } + QVariant m_v; private: Tomahawk::playlist_ptr m_playlist; bool m_report; // call Playlist::reportCreated? diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp index bdcb20c8d..8f5a464fd 100644 --- a/src/tomahawkwindow.cpp +++ b/src/tomahawkwindow.cpp @@ -374,6 +374,24 @@ TomahawkWindow::createPlaylist( bool dynamic ) } +void +TomahawkWindow::createPlaylist( const Tomahawk::source_ptr& src, + const QVariant& contents) +{ + playlist_ptr p = playlist_ptr( new Playlist( src ) ); + QJson::QObjectHelper::qvariant2qobject( contents.toMap(), p.data() ); + p->reportCreated( p ); +} + +void +TomahawkWindow::createDynamicPlaylist( const Tomahawk::source_ptr& src, + const QVariant& contents) +{ + dynplaylist_ptr p = dynplaylist_ptr( new DynamicPlaylist( src, contents.toMap().value( "type", QString() ).toString() ) ); + QJson::QObjectHelper::qvariant2qobject( contents.toMap(), p.data() ); + p->reportCreated( p ); +} + void TomahawkWindow::onPlaybackLoading( const Tomahawk::result_ptr& result ) diff --git a/src/tomahawkwindow.h b/src/tomahawkwindow.h index e5960c41a..b0e2ef2e6 100644 --- a/src/tomahawkwindow.h +++ b/src/tomahawkwindow.h @@ -47,7 +47,11 @@ public slots: void createPlaylist( bool dynamic = false ); void loadSpiff(); void showSettingsDialog(); - + + // called by the playlist creation dbcmds + void createPlaylist( const Tomahawk::source_ptr& src, const QVariant& contents ); + void createDynamicPlaylist( const Tomahawk::source_ptr& src, const QVariant& contents ); + private slots: void scanFinished(); void rescanCollectionManually();