From f8df6db392a3948c7da7b981815233b305e9a841 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 5 Mar 2011 02:46:24 +0100 Subject: [PATCH] * A playlist's title now updates in the sidebar when it gets changed. --- .../databasecommand_renameplaylist.cpp | 3 + src/libtomahawk/playlist.cpp | 2 +- src/libtomahawk/playlist.h | 45 ++++++----- src/sourcetree/sourcetreeitem.cpp | 81 +++++++++++++------ src/sourcetree/sourcetreeitem.h | 6 +- 5 files changed, 88 insertions(+), 49 deletions(-) diff --git a/src/libtomahawk/database/databasecommand_renameplaylist.cpp b/src/libtomahawk/database/databasecommand_renameplaylist.cpp index 52ae79558..7363d823e 100644 --- a/src/libtomahawk/database/databasecommand_renameplaylist.cpp +++ b/src/libtomahawk/database/databasecommand_renameplaylist.cpp @@ -29,6 +29,8 @@ DatabaseCommand_RenamePlaylist::exec( DatabaseImpl* lib ) cre.bindValue( ":id", m_playlistguid ); cre.bindValue( ":title", m_playlistTitle ); + qDebug() << Q_FUNC_INFO << m_playlistTitle << m_playlistguid; + cre.exec(); } @@ -46,6 +48,7 @@ DatabaseCommand_RenamePlaylist::postCommitHook() playlist_ptr playlist = source()->collection()->playlist( m_playlistguid ); Q_ASSERT( !playlist.isNull() ); + qDebug() << "Renaming old playlist" << playlist->title() << "to" << m_playlistTitle << m_playlistguid; playlist->setTitle( m_playlistTitle ); if( source()->isLocal() ) diff --git a/src/libtomahawk/playlist.cpp b/src/libtomahawk/playlist.cpp index 00c644593..7ce3c795d 100644 --- a/src/libtomahawk/playlist.cpp +++ b/src/libtomahawk/playlist.cpp @@ -389,7 +389,7 @@ Playlist::setNewRevision( const QString& rev, source_ptr -Playlist::author() +Playlist::author() const { return m_source; } diff --git a/src/libtomahawk/playlist.h b/src/libtomahawk/playlist.h index adfbb65c2..c3ae79175 100644 --- a/src/libtomahawk/playlist.h +++ b/src/libtomahawk/playlist.h @@ -33,10 +33,10 @@ Q_PROPERTY( QVariant query READ queryVariant WRITE setQueryVariant ) public: PlaylistEntry(); virtual ~PlaylistEntry(); - + void setQuery( const Tomahawk::query_ptr& q ); const Tomahawk::query_ptr& query() const; - + // I wish Qt did this for me once i specified the Q_PROPERTIES: void setQueryVariant( const QVariant& v ); QVariant queryVariant() const; @@ -59,7 +59,7 @@ public: source_ptr lastSource() const; void setLastSource( source_ptr s ); -private: +private: QString m_guid; Tomahawk::query_ptr m_query; QString m_annotation; @@ -97,7 +97,7 @@ friend class ::DatabaseCommand_CreatePlaylist; public: ~Playlist(); - + static Tomahawk::playlist_ptr load( const QString& guid ); // one CTOR is private, only called by DatabaseCommand_LoadAllPlaylists @@ -113,14 +113,14 @@ public: virtual void loadRevision( const QString& rev = "" ); - source_ptr author(); - const QString& currentrevision() { return m_currentrevision; } - const QString& title() { return m_title; } - const QString& info() { return m_info; } - const QString& creator() { return m_creator; } - unsigned int lastmodified() { return m_lastmodified; } - const QString& guid() { return m_guid; } - bool shared() const { return m_shared; } + source_ptr author() const; + QString currentrevision() const { return m_currentrevision; } + QString title() const { return m_title; } + QString info() const { return m_info; } + QString creator() const { return m_creator; } + QString guid() const { return m_guid; } + bool shared() const { return m_shared; } + unsigned int lastmodified() const { return m_lastmodified; } const QList< plentry_ptr >& entries() { return m_entries; } virtual void addEntry( const Tomahawk::query_ptr& query, const QString& oldrev ); @@ -132,7 +132,7 @@ public: // maybe friend QObjectHelper and make them private? explicit Playlist( const source_ptr& author ); void setCurrentrevision( const QString& s ) { m_currentrevision = s; } - void setTitle( const QString& s ) { m_title = s; } + void setTitle( const QString& s ) { m_title = s; emit changed(); } void setInfo( const QString& s ) { m_info = s; } void setCreator( const QString& s ) { m_creator = s; } void setGuid( const QString& s ) { m_guid = s; } @@ -148,12 +148,12 @@ public: virtual PlaylistInterface::RepeatMode repeatMode() const { return PlaylistInterface::NoRepeat; } virtual bool shuffled() const { return false; } - + virtual void setRepeatMode( PlaylistInterface::RepeatMode ) {} virtual void setShuffled( bool ) {} - + virtual void setFilter( const QString& pattern ) {} - + signals: /// emitted when the playlist revision changes (whenever the playlist changes) void revisionLoaded( Tomahawk::PlaylistRevision ); @@ -161,6 +161,9 @@ signals: /// watch for this to see when newly created playlist is synced to DB (if you care) void created(); + /// renamed etc. + void changed(); + void repeatModeChanged( PlaylistInterface::RepeatMode mode ); void shuffleModeChanged( bool enabled ); @@ -201,24 +204,24 @@ protected: const QString& info, const QString& creator, bool shared ); - + QList< plentry_ptr > newEntries( const QList< plentry_ptr >& entries ); PlaylistRevision setNewRevision( const QString& rev, const QList& neworderedguids, const QList& oldorderedguids, bool is_newest_rev, const QMap< QString, Tomahawk::plentry_ptr >& addedmap ); - + QList addEntriesInternal( const QList& queries ); - + private slots: void onResultsFound( const QList& results ); void onResolvingFinished(); - + private: Playlist(); void init(); - + source_ptr m_source; QString m_currentrevision; QString m_guid, m_title, m_info, m_creator; diff --git a/src/sourcetree/sourcetreeitem.cpp b/src/sourcetree/sourcetreeitem.cpp index 96fa06a8d..4fd22a4d3 100644 --- a/src/sourcetree/sourcetreeitem.cpp +++ b/src/sourcetree/sourcetreeitem.cpp @@ -41,7 +41,7 @@ SourceTreeItem::SourceTreeItem( const source_ptr& source, QObject* parent ) SLOT( onPlaylistsAdded( QList ) ) ); connect( source->collection().data(), SIGNAL( playlistsDeleted( QList ) ), SLOT( onPlaylistsDeleted( QList ) ) ); - + connect( source->collection().data(), SIGNAL( dynamicPlaylistsAdded( QList ) ), SLOT( onDynamicPlaylistsAdded( QList ) ) ); connect( source->collection().data(), SIGNAL( dynamicPlaylistsDeleted( QList ) ), @@ -88,14 +88,14 @@ SourceTreeItem::onPlaylistsAdded( const QList& playlists ) { m_playlists.append( p ); qlonglong ptr = reinterpret_cast( &m_playlists.last() ); - qDebug() << "Setting playlist ptr to:" << ptr; - + connect( p.data(), SIGNAL( revisionLoaded( Tomahawk::PlaylistRevision ) ), - SLOT( onPlaylistLoaded( Tomahawk::PlaylistRevision ) ), - Qt::QueuedConnection); - + SLOT( onPlaylistLoaded( Tomahawk::PlaylistRevision ) ), Qt::QueuedConnection ); + connect( p.data(), SIGNAL( changed() ), + SLOT( onPlaylistChanged() ), Qt::QueuedConnection ); + qDebug() << "Playlist added:" << p->title() << p->creator() << p->info() << ptr; - + playlistAddedInternal( ptr, p, false ); } } @@ -109,7 +109,7 @@ SourceTreeItem::onPlaylistsDeleted( const QList& playlists ) { qlonglong ptr = qlonglong( p.data() ); qDebug() << "Playlist removed:" << p->title() << p->creator() << p->info() << ptr; - + QStandardItem* item = m_columns.at( 0 ); int rows = item->rowCount(); for ( int i = rows - 1; i >= 0; i-- ) @@ -118,7 +118,7 @@ SourceTreeItem::onPlaylistsDeleted( const QList& playlists ) qlonglong piptr = pi->data( PlaylistPointer ).toLongLong(); playlist_ptr* pl = reinterpret_cast(piptr); SourcesModel::SourceType type = static_cast( pi->data( Type ).toInt() ); - + if ( type == SourcesModel::PlaylistSource && ptr == qlonglong( pl->data() ) ) { m_playlists.removeAll( p ); @@ -133,8 +133,7 @@ void SourceTreeItem::onPlaylistLoaded( Tomahawk::PlaylistRevision revision ) { qlonglong ptr = reinterpret_cast( sender() ); - qDebug() << "sender ptr:" << ptr; - + QStandardItem* item = m_columns.at( 0 ); int rows = item->rowCount(); for ( int i = 0; i < rows; i++ ) @@ -143,10 +142,9 @@ SourceTreeItem::onPlaylistLoaded( Tomahawk::PlaylistRevision revision ) qlonglong piptr = pi->data( PlaylistPointer ).toLongLong(); playlist_ptr* pl = reinterpret_cast(piptr); SourcesModel::SourceType type = static_cast( pi->data( Type ).toInt() ); - + if ( type == SourcesModel::PlaylistSource && ptr == qlonglong( pl->data() ) ) { - qDebug() << "Found normal playlist!"; pi->setEnabled( true ); m_current_revisions.insert( pl->data()->guid(), revision.revisionguid ); } @@ -154,6 +152,38 @@ SourceTreeItem::onPlaylistLoaded( Tomahawk::PlaylistRevision revision ) } +void +SourceTreeItem::onPlaylistChanged() +{ + qlonglong ptr = reinterpret_cast( sender() ); + + QStandardItem* item = m_columns.at( 0 ); + int rows = item->rowCount(); + for ( int i = 0; i < rows; i++ ) + { + QStandardItem* pi = item->child( i ); + SourcesModel::SourceType type = static_cast( pi->data( Type ).toInt() ); + + if ( type == SourcesModel::PlaylistSource ) + { + qlonglong piptr = pi->data( PlaylistPointer ).toLongLong(); + playlist_ptr* pl = reinterpret_cast(piptr); + + if ( ptr == qlonglong( pl->data() ) ) + pi->setText( pl->data()->title() ); + } + if ( type == SourcesModel::DynamicPlaylistSource ) + { + qlonglong piptr = pi->data( DynamicPlaylistPointer ).toLongLong(); + dynplaylist_ptr* pl = reinterpret_cast(piptr); + + if ( ptr == qlonglong( pl->data() ) ) + pi->setText( pl->data()->title() ); + } + } +} + + void SourceTreeItem::onDynamicPlaylistsAdded( const QList< dynplaylist_ptr >& playlists ) { @@ -162,13 +192,14 @@ SourceTreeItem::onDynamicPlaylistsAdded( const QList< dynplaylist_ptr >& playlis { m_dynplaylists.append( p ); qlonglong ptr = reinterpret_cast( &m_dynplaylists.last() ); -// qDebug() << "Setting dynamic ptr to:" << ptr; + connect( p.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision) ), - SLOT( onDynamicPlaylistLoaded( Tomahawk::DynamicPlaylistRevision ) ), - Qt::QueuedConnection); - + SLOT( onDynamicPlaylistLoaded( Tomahawk::DynamicPlaylistRevision ) ), Qt::QueuedConnection ); + connect( p.data(), SIGNAL( changed() ), + SLOT( onPlaylistChanged() ), Qt::QueuedConnection ); + // qDebug() << "Dynamic Playlist added:" << p->title() << p->creator() << p->info() << p->currentrevision() << ptr; - + playlistAddedInternal( ptr, p, true ); } } @@ -182,7 +213,7 @@ SourceTreeItem::onDynamicPlaylistsDeleted( const QList< dynplaylist_ptr >& playl { qlonglong ptr = qlonglong( p.data() ); // qDebug() << "dynamic playlist removed:" << p->title() << p->creator() << p->info() << ptr; - + QStandardItem* item = m_columns.at( 0 ); int rows = item->rowCount(); for ( int i = rows - 1; i >= 0; i-- ) @@ -191,7 +222,8 @@ SourceTreeItem::onDynamicPlaylistsDeleted( const QList< dynplaylist_ptr >& playl qlonglong piptr = pi->data( DynamicPlaylistPointer ).toLongLong(); dynplaylist_ptr* pl = reinterpret_cast(piptr); SourcesModel::SourceType type = static_cast( pi->data( Type ).toInt() ); - //qDebug() << "Deleting dynamic playlsit:" << pl->isNull(); + + //qDebug() << "Deleting dynamic playlist:" << pl->isNull(); if ( type == SourcesModel::DynamicPlaylistSource && ptr == qlonglong( pl->data() ) ) { m_dynplaylists.removeAll( p ); @@ -206,7 +238,7 @@ void SourceTreeItem::onDynamicPlaylistLoaded( DynamicPlaylistRevision revision ) { qlonglong ptr = reinterpret_cast( sender() ); - + QStandardItem* item = m_columns.at( 0 ); int rows = item->rowCount(); for ( int i = 0; i < rows; i++ ) @@ -215,10 +247,9 @@ SourceTreeItem::onDynamicPlaylistLoaded( DynamicPlaylistRevision revision ) qlonglong piptr = pi->data( DynamicPlaylistPointer ).toLongLong(); playlist_ptr* pl = reinterpret_cast(piptr); SourcesModel::SourceType type = static_cast( pi->data( Type ).toInt() ); -// qDebug() << "found dynamic playlist:" << (*pl)->title() << type; + if ( type == SourcesModel::DynamicPlaylistSource && ptr == qlonglong( pl->data() ) ) { - //qDebug() << "Found dynamicplaylist!"; pi->setEnabled( true ); m_current_dynamic_revisions.insert( pl->data()->guid(), revision.revisionguid ); } @@ -235,10 +266,10 @@ void SourceTreeItem::playlistAddedInternal( qlonglong ptr, const Tomahawk::playl subitem->setData( ptr, dynamic ? DynamicPlaylistPointer : PlaylistPointer ); subitem->setData( dynamic ? SourcesModel::DynamicPlaylistSource : SourcesModel::PlaylistSource, Type ); subitem->setData( (qlonglong)this, SourceItemPointer ); - + m_columns.at( 0 )->appendRow( subitem ); // Q_ASSERT( qobject_cast((parent()->parent()) ) ); // qobject_cast((parent()->parent()))->expandAll(); - + p->loadRevision(); } diff --git a/src/sourcetree/sourcetreeitem.h b/src/sourcetree/sourcetreeitem.h index fbbaa8349..caedb01a3 100644 --- a/src/sourcetree/sourcetreeitem.h +++ b/src/sourcetree/sourcetreeitem.h @@ -47,13 +47,15 @@ private slots: void onPlaylistsAdded( const QList& playlists ); void onPlaylistsDeleted( const QList& playlists ); void onPlaylistLoaded( Tomahawk::PlaylistRevision revision ); - + void onPlaylistChanged(); + void onDynamicPlaylistsAdded( const QList& playlists ); void onDynamicPlaylistsDeleted( const QList& playlists ); void onDynamicPlaylistLoaded( Tomahawk::DynamicPlaylistRevision revision ); + private: void playlistAddedInternal( qlonglong ptr, const Tomahawk::playlist_ptr& pl, bool dynamic ); - + QList m_columns; Tomahawk::source_ptr m_source; SourceTreeItemWidget* m_widget;