From 9860b13b1b9fa56cf5c99a274d4b37a8a149b3d5 Mon Sep 17 00:00:00 2001 From: Pierre Lamot Date: Fri, 17 Dec 2021 16:44:18 +0100 Subject: [PATCH] qt: partially update model when possible on media deletion/update --- modules/gui/qt/medialibrary/mlalbummodel.cpp | 25 ++++++--- .../gui/qt/medialibrary/mlalbumtrackmodel.cpp | 31 ++++++----- modules/gui/qt/medialibrary/mlartistmodel.cpp | 19 +++++-- modules/gui/qt/medialibrary/mlgenremodel.cpp | 15 +++++- .../qt/medialibrary/mlplaylistlistmodel.cpp | 33 ++++++++---- .../gui/qt/medialibrary/mlplaylistmodel.cpp | 20 ++++--- .../gui/qt/medialibrary/mlrecentsmodel.cpp | 9 ++-- .../qt/medialibrary/mlrecentsvideomodel.cpp | 2 +- modules/gui/qt/medialibrary/mlurlmodel.cpp | 4 +- .../qt/medialibrary/mlvideofoldersmodel.cpp | 17 ++++-- .../qt/medialibrary/mlvideogroupsmodel.cpp | 53 +++++++++++++++---- modules/gui/qt/medialibrary/mlvideomodel.cpp | 21 ++++++-- 12 files changed, 182 insertions(+), 67 deletions(-) diff --git a/modules/gui/qt/medialibrary/mlalbummodel.cpp b/modules/gui/qt/medialibrary/mlalbummodel.cpp index ef1cd079d2..0c47ec5b62 100644 --- a/modules/gui/qt/medialibrary/mlalbummodel.cpp +++ b/modules/gui/qt/medialibrary/mlalbummodel.cpp @@ -63,23 +63,36 @@ void MLAlbumModel::onVlcMlEvent(const MLEvent &event) switch( event.i_type ) { case VLC_ML_EVENT_ALBUM_ADDED: + { + emit resetRequested(); + return; + } case VLC_ML_EVENT_ALBUM_DELETED: + { + MLItemId itemId(event.deletion.i_entity_id, VLC_ML_PARENT_UNKNOWN); + deleteItemInCache(itemId); + return; + } case VLC_ML_EVENT_ALBUM_UPDATED: - m_need_reset = true; - break; + { + MLItemId itemId(event.modification.i_entity_id, VLC_ML_PARENT_UNKNOWN); + updateItemInCache(itemId); + return; + } case VLC_ML_EVENT_ARTIST_DELETED: if ( m_parent.id != 0 && m_parent.type == VLC_ML_PARENT_ARTIST && event.deletion.i_entity_id == m_parent.id ) - m_need_reset = true; - break; + emit resetRequested(); + return; case VLC_ML_EVENT_GENRE_DELETED: if ( m_parent.id != 0 && m_parent.type == VLC_ML_PARENT_GENRE && event.deletion.i_entity_id == m_parent.id ) - m_need_reset = true; - break; + emit resetRequested();; + return; default: break; } + MLBaseModel::onVlcMlEvent( event ); } diff --git a/modules/gui/qt/medialibrary/mlalbumtrackmodel.cpp b/modules/gui/qt/medialibrary/mlalbumtrackmodel.cpp index e33e531242..e78bd03230 100644 --- a/modules/gui/qt/medialibrary/mlalbumtrackmodel.cpp +++ b/modules/gui/qt/medialibrary/mlalbumtrackmodel.cpp @@ -115,30 +115,37 @@ void MLAlbumTrackModel::onVlcMlEvent(const MLEvent &event) { case VLC_ML_EVENT_MEDIA_ADDED: if ( event.creation.media.i_subtype == VLC_ML_MEDIA_SUBTYPE_ALBUMTRACK ) - m_need_reset = true; - break; + emit resetRequested(); + return; case VLC_ML_EVENT_MEDIA_UPDATED: + { + MLItemId itemId(event.modification.i_entity_id, VLC_ML_PARENT_UNKNOWN); + updateItemInCache(itemId); + return; + } case VLC_ML_EVENT_MEDIA_DELETED: - // FIXME: Not optimal, this will trigger a clean/refresh for video - // media as well, but this needs fixing in the medialibrary - m_need_reset = true; - break; + { + MLItemId itemId(event.deletion.i_entity_id, VLC_ML_PARENT_UNKNOWN); + deleteItemInCache(itemId); + return; + } case VLC_ML_EVENT_ALBUM_UPDATED: if ( m_parent.id != 0 && m_parent.type == VLC_ML_PARENT_ALBUM && m_parent.id == event.modification.i_entity_id ) - m_need_reset = true; - break; + emit resetRequested(); + return; case VLC_ML_EVENT_ALBUM_DELETED: if ( m_parent.id != 0 && m_parent.type == VLC_ML_PARENT_ALBUM && m_parent.id == event.deletion.i_entity_id ) - m_need_reset = true; - break; + emit resetRequested(); + return; case VLC_ML_EVENT_GENRE_DELETED: if ( m_parent.id != 0 && m_parent.type == VLC_ML_PARENT_GENRE && m_parent.id == event.deletion.i_entity_id ) - m_need_reset = true; - break; + emit resetRequested(); + return; } + MLBaseModel::onVlcMlEvent( event ); } diff --git a/modules/gui/qt/medialibrary/mlartistmodel.cpp b/modules/gui/qt/medialibrary/mlartistmodel.cpp index 228c7cdb48..53b7a4d5f4 100644 --- a/modules/gui/qt/medialibrary/mlartistmodel.cpp +++ b/modules/gui/qt/medialibrary/mlartistmodel.cpp @@ -89,16 +89,27 @@ void MLArtistModel::onVlcMlEvent(const MLEvent &event) switch (event.i_type) { case VLC_ML_EVENT_ARTIST_ADDED: + emit resetRequested(); + return; case VLC_ML_EVENT_ARTIST_UPDATED: + { + MLItemId itemId(event.deletion.i_entity_id, VLC_ML_PARENT_UNKNOWN); + updateItemInCache(itemId); + return; + } case VLC_ML_EVENT_ARTIST_DELETED: - m_need_reset = true; - break; + { + MLItemId itemId(event.deletion.i_entity_id, VLC_ML_PARENT_UNKNOWN); + deleteItemInCache(itemId); + return; + } case VLC_ML_EVENT_GENRE_DELETED: if ( m_parent.id != 0 && m_parent.type == VLC_ML_PARENT_GENRE && m_parent.id == event.deletion.i_entity_id ) - m_need_reset = true; - break; + emit resetRequested(); + return; } + MLBaseModel::onVlcMlEvent(event); } diff --git a/modules/gui/qt/medialibrary/mlgenremodel.cpp b/modules/gui/qt/medialibrary/mlgenremodel.cpp index ab541cd52b..cc5612d870 100644 --- a/modules/gui/qt/medialibrary/mlgenremodel.cpp +++ b/modules/gui/qt/medialibrary/mlgenremodel.cpp @@ -87,11 +87,22 @@ void MLGenreModel::onVlcMlEvent(const MLEvent &event) switch (event.i_type) { case VLC_ML_EVENT_GENRE_ADDED: + emit resetRequested(); + return; case VLC_ML_EVENT_GENRE_UPDATED: + { + MLItemId itemId(event.modification.i_entity_id, VLC_ML_PARENT_UNKNOWN); + updateItemInCache(itemId); + return; + } case VLC_ML_EVENT_GENRE_DELETED: - m_need_reset = true; - break; + { + MLItemId itemId(event.deletion.i_entity_id, VLC_ML_PARENT_UNKNOWN); + deleteItemInCache(itemId); + return; + } } + MLBaseModel::onVlcMlEvent(event); } diff --git a/modules/gui/qt/medialibrary/mlplaylistlistmodel.cpp b/modules/gui/qt/medialibrary/mlplaylistlistmodel.cpp index b62997868b..59138691e2 100644 --- a/modules/gui/qt/medialibrary/mlplaylistlistmodel.cpp +++ b/modules/gui/qt/medialibrary/mlplaylistlistmodel.cpp @@ -351,20 +351,33 @@ QString MLPlaylistListModel::getCover(MLPlaylist * playlist) const void MLPlaylistListModel::onVlcMlEvent(const MLEvent & event) /* override */ { + if (m_transactionPending + && (event.i_type == VLC_ML_EVENT_PLAYLIST_UPDATED + || event.i_type == VLC_ML_EVENT_PLAYLIST_DELETED + || event.i_type == VLC_ML_EVENT_PLAYLIST_ADDED)) + { + m_resetAfterTransaction = true; + return; + } + switch (event.i_type) { - case VLC_ML_EVENT_PLAYLIST_UPDATED: - case VLC_ML_EVENT_PLAYLIST_ADDED: case VLC_ML_EVENT_PLAYLIST_DELETED: { - if(m_transactionPending) - m_resetAfterTransaction = true; - else - { - m_need_reset = true; - // NOTE: Maybe we should call this from MLBaseModel ? - emit resetRequested(); - } + MLItemId itemId(event.deletion.i_entity_id, VLC_ML_PARENT_PLAYLIST); + deleteItemInCache(itemId); + return; + } + case VLC_ML_EVENT_PLAYLIST_UPDATED: + { + + MLItemId itemId(event.modification.i_entity_id, VLC_ML_PARENT_PLAYLIST); + updateItemInCache(itemId); + return; + } + case VLC_ML_EVENT_PLAYLIST_ADDED: + { + emit resetRequested(); break; } default: diff --git a/modules/gui/qt/medialibrary/mlplaylistmodel.cpp b/modules/gui/qt/medialibrary/mlplaylistmodel.cpp index 801ad0532d..5c96c0cb17 100644 --- a/modules/gui/qt/medialibrary/mlplaylistmodel.cpp +++ b/modules/gui/qt/medialibrary/mlplaylistmodel.cpp @@ -420,17 +420,23 @@ void MLPlaylistModel::onVlcMlEvent(const MLEvent & event) /* override */ { switch (event.i_type) { + case VLC_ML_EVENT_MEDIA_UPDATED: + { + MLItemId itemId(event.modification.i_entity_id, VLC_ML_PARENT_UNKNOWN); + updateItemInCache(itemId); + return; + } case VLC_ML_EVENT_PLAYLIST_UPDATED: { - if (m_transactionPending) - m_resetAfterTransaction = true; - else + MLItemId itemId(event.modification.i_entity_id, VLC_ML_PARENT_PLAYLIST); + if (m_parent == itemId) { - m_need_reset = true; - // NOTE: Maybe we should call this from MLBaseModel ? - emit resetRequested(); + if (m_transactionPending) + m_resetAfterTransaction = true; + else + emit resetRequested(); } - break; + return; } default: break; diff --git a/modules/gui/qt/medialibrary/mlrecentsmodel.cpp b/modules/gui/qt/medialibrary/mlrecentsmodel.cpp index 56d3bf0903..faa547d86b 100644 --- a/modules/gui/qt/medialibrary/mlrecentsmodel.cpp +++ b/modules/gui/qt/medialibrary/mlrecentsmodel.cpp @@ -80,13 +80,10 @@ void MLRecentsModel::onVlcMlEvent( const MLEvent &event ) switch ( event.i_type ) { case VLC_ML_EVENT_HISTORY_CHANGED: + { emit resetRequested(); - break; - case VLC_ML_EVENT_MEDIA_ADDED: - case VLC_ML_EVENT_MEDIA_UPDATED: - case VLC_ML_EVENT_MEDIA_DELETED: - m_need_reset = true; - break; + return; + } default: break; } diff --git a/modules/gui/qt/medialibrary/mlrecentsvideomodel.cpp b/modules/gui/qt/medialibrary/mlrecentsvideomodel.cpp index 852af0997c..d973e8e82f 100644 --- a/modules/gui/qt/medialibrary/mlrecentsvideomodel.cpp +++ b/modules/gui/qt/medialibrary/mlrecentsvideomodel.cpp @@ -53,7 +53,7 @@ void MLRecentsVideoModel::onVlcMlEvent(const MLEvent & event) /* override */ { case VLC_ML_EVENT_HISTORY_CHANGED: emit resetRequested(); - break; + return; default: break; } diff --git a/modules/gui/qt/medialibrary/mlurlmodel.cpp b/modules/gui/qt/medialibrary/mlurlmodel.cpp index f362267635..85059ec95a 100644 --- a/modules/gui/qt/medialibrary/mlurlmodel.cpp +++ b/modules/gui/qt/medialibrary/mlurlmodel.cpp @@ -99,8 +99,8 @@ void MLUrlModel::onVlcMlEvent(const MLEvent &event) { case VLC_ML_EVENT_MEDIA_UPDATED: case VLC_ML_EVENT_HISTORY_CHANGED: - m_need_reset = true; - break; + emit resetRequested(); + return; } MLBaseModel::onVlcMlEvent( event ); } diff --git a/modules/gui/qt/medialibrary/mlvideofoldersmodel.cpp b/modules/gui/qt/medialibrary/mlvideofoldersmodel.cpp index 98fc5c4325..6c9bb39505 100644 --- a/modules/gui/qt/medialibrary/mlvideofoldersmodel.cpp +++ b/modules/gui/qt/medialibrary/mlvideofoldersmodel.cpp @@ -135,14 +135,21 @@ void MLVideoFoldersModel::onVlcMlEvent(const MLEvent & event) /* override */ switch (type) { case VLC_ML_EVENT_FOLDER_ADDED: + { + emit resetRequested(); + return; + } case VLC_ML_EVENT_FOLDER_UPDATED: + { + MLItemId itemId(event.modification.i_entity_id, VLC_ML_PARENT_FOLDER); + updateItemInCache(itemId); + return; + } case VLC_ML_EVENT_FOLDER_DELETED: { - m_need_reset = true; - - emit resetRequested(); - - break; + MLItemId itemId(event.deletion.i_entity_id, VLC_ML_PARENT_FOLDER); + deleteItemInCache(itemId); + return; } default: break; diff --git a/modules/gui/qt/medialibrary/mlvideogroupsmodel.cpp b/modules/gui/qt/medialibrary/mlvideogroupsmodel.cpp index 4431a3c3f1..897261cfa2 100644 --- a/modules/gui/qt/medialibrary/mlvideogroupsmodel.cpp +++ b/modules/gui/qt/medialibrary/mlvideogroupsmodel.cpp @@ -164,18 +164,53 @@ void MLVideoGroupsModel::onVlcMlEvent(const MLEvent & event) /* override */ switch (type) { - case VLC_ML_EVENT_GROUP_ADDED: - case VLC_ML_EVENT_GROUP_UPDATED: - case VLC_ML_EVENT_GROUP_DELETED: + case VLC_ML_EVENT_GROUP_ADDED: + { + emit resetRequested(); + return; + } + case VLC_ML_EVENT_MEDIA_ADDED: + { + if (event.creation.media.i_type == VLC_ML_MEDIA_TYPE_VIDEO) { - m_need_reset = true; - - // NOTE: Maybe we should call this from MLBaseModel ? emit resetRequested(); - break; + return; } - default: - break; + break; + } + case VLC_ML_EVENT_GROUP_UPDATED: + { + MLItemId itemId(event.modification.i_entity_id, VLC_ML_PARENT_GROUP); + updateItemInCache(itemId); + return; + } + case VLC_ML_EVENT_MEDIA_UPDATED: + { + if (event.creation.media.i_type == VLC_ML_MEDIA_TYPE_VIDEO) + { + MLItemId itemId(event.modification.i_entity_id, VLC_ML_PARENT_UNKNOWN); + updateItemInCache(itemId); + return; + } + break; + } + case VLC_ML_EVENT_GROUP_DELETED: + { + MLItemId itemId(event.deletion.i_entity_id, VLC_ML_PARENT_GROUP); + deleteItemInCache(itemId); + return; + } + case VLC_ML_EVENT_MEDIA_DELETED: + { + if (event.creation.media.i_type == VLC_ML_MEDIA_TYPE_VIDEO) + { + MLItemId itemId(event.deletion.i_entity_id, VLC_ML_PARENT_UNKNOWN); + deleteItemInCache(itemId); + } + return; + } + default: + break; } MLBaseModel::onVlcMlEvent(event); diff --git a/modules/gui/qt/medialibrary/mlvideomodel.cpp b/modules/gui/qt/medialibrary/mlvideomodel.cpp index 28480b83f5..75bbe207c5 100644 --- a/modules/gui/qt/medialibrary/mlvideomodel.cpp +++ b/modules/gui/qt/medialibrary/mlvideomodel.cpp @@ -144,13 +144,28 @@ QByteArray MLVideoModel::criteriaToName(vlc_ml_sorting_criteria_t criteria) cons void MLVideoModel::onVlcMlEvent(const MLEvent &event) { + if (event.creation.media.i_type != VLC_ML_MEDIA_TYPE_VIDEO) + return MLBaseModel::onVlcMlEvent( event ); + switch (event.i_type) { case VLC_ML_EVENT_MEDIA_ADDED: - case VLC_ML_EVENT_MEDIA_UPDATED: - case VLC_ML_EVENT_MEDIA_DELETED: - m_need_reset = true; + { + emit resetRequested(); break; + } + case VLC_ML_EVENT_MEDIA_UPDATED: + { + MLItemId itemId(event.modification.i_entity_id, VLC_ML_PARENT_UNKNOWN); + updateItemInCache(itemId); + return; + } + case VLC_ML_EVENT_MEDIA_DELETED: + { + MLItemId itemId(event.deletion.i_entity_id, VLC_ML_PARENT_UNKNOWN); + deleteItemInCache(itemId); + return; + } default: break; }