[vlc-devel] [vlc-commits] Qt: PLModel: try to agregate inserts for efficiency
Naohiro KORIYAMA
nkoriyama at gmail.com
Mon Jun 11 07:59:23 CEST 2012
Hello,
This commit also broke UPnP.
Best regards,
2012/6/7 Francois Cartegnie <git at videolan.org>:
> vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Jun 6 19:05:58 2012 +0200| [bd0ae7ec66f9e94b877ec1b206fce52eb133b0ae] | committer: Francois Cartegnie
>
> Qt: PLModel: try to agregate inserts for efficiency
>
>> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bd0ae7ec66f9e94b877ec1b206fce52eb133b0ae
> ---
>
> .../gui/qt4/components/playlist/playlist_model.cpp | 79 ++++++++++++++++++--
> .../gui/qt4/components/playlist/playlist_model.hpp | 12 +++
> 2 files changed, 85 insertions(+), 6 deletions(-)
>
> diff --git a/modules/gui/qt4/components/playlist/playlist_model.cpp b/modules/gui/qt4/components/playlist/playlist_model.cpp
> index 3a9f550..d178d99 100644
> --- a/modules/gui/qt4/components/playlist/playlist_model.cpp
> +++ b/modules/gui/qt4/components/playlist/playlist_model.cpp
> @@ -48,6 +48,7 @@
> #include <QDesktopServices>
> #include <QInputDialog>
> #include <QSignalMapper>
> +#include <QTimer>
>
> #define I_NEW_DIR \
> I_DIR_OR_FOLDER( N_("Create Directory"), N_( "Create Folder" ) )
> @@ -100,6 +101,7 @@ PLModel::PLModel( playlist_t *_p_playlist, /* THEPL */
> this, processItemAppend( int, int ) );
> CONNECT( THEMIM, playlistItemRemoved( int ),
> this, processItemRemoval( int ) );
> + CONNECT( &insertBufferCommitTimer, timeout(), this, commitBufferedRowInserts() );
> }
>
> PLModel::~PLModel()
> @@ -628,6 +630,68 @@ void PLModel::processItemRemoval( int i_id )
> removeItem( i_id );
> }
>
> +void PLModel::commitBufferedRowInserts()
> +{
> + PLItem *toemit = NULL;
> + insertBufferCommitTimer.stop();
> + insertBufferMutex.lock();
> + if ( !insertBuffer.isEmpty() )
> + {
> + beginInsertRows( index( insertBufferRoot, 0 ), insertbuffer_firstrow, insertbuffer_lastrow );
> + foreach (PLItem *item, insertBuffer)
> + {
> + insertBufferRoot->insertChild( item, insertbuffer_firstrow++ );
> + if( item->inputItem() == THEMIM->currentInputItem() )
> + toemit = item;
> + }
> + endInsertRows();
> + insertBuffer.clear();
> + }
> + insertBufferMutex.unlock();
> + if ( toemit )
> + emit currentIndexChanged( index( toemit, 0 ) );
> +}
> +
> +/*
> + Tries to agregate linear inserts of single row. Sends
> + more efficient updates notifications to views and then
> + avoids the flickering effect.
> +*/
> +void PLModel::bufferedRowInsert( PLItem *item, PLItem *parent, int pos )
> +{
> + insertBufferMutex.lock();
> + if ( ! insertBuffer.isEmpty() )
> + {
> + /* Check if we're doing linear insert */
> + if ( parent != insertBufferRoot || pos != insertbuffer_lastrow + 1 )
> + {
> + insertBufferMutex.unlock();
> + commitBufferedRowInserts();
> + bufferedRowInsert( item, parent, pos );
> + return;
> + }
> + }
> +
> + if ( insertBuffer.isEmpty() )
> + {
> + insertBuffer << item;
> + insertBufferRoot = parent;
> + insertbuffer_firstrow = pos;
> + insertbuffer_lastrow = pos;
> + } else {
> + insertBuffer << item;
> + insertbuffer_lastrow++;
> + }
> + insertBufferMutex.unlock();
> +
> + /* Schedule commit */
> + if ( ! insertBufferCommitTimer.isActive() )
> + {
> + insertBufferCommitTimer.setSingleShot( true );
> + insertBufferCommitTimer.start( 100 );
> + }
> +}
> +
> void PLModel::processItemAppend( int i_item, int i_parent )
> {
> playlist_item_t *p_item = NULL;
> @@ -657,12 +721,7 @@ void PLModel::processItemAppend( int i_item, int i_parent )
> PL_UNLOCK;
>
> /* We insert the newItem (children) inside the parent */
> - beginInsertRows( index( nodeParentItem, 0 ), pos, pos );
> - nodeParentItem->insertChild( newItem, pos );
> - endInsertRows();
> -
> - if( newItem->inputItem() == THEMIM->currentInputItem() )
> - emit currentIndexChanged( index( newItem, 0 ) );
> + bufferedRowInsert( newItem, nodeParentItem, pos );
>
> if( latestSearch.isEmpty() ) return;
> search( latestSearch, index( rootItem, 0), false /*FIXME*/ );
> @@ -693,6 +752,7 @@ void PLModel::rebuild( playlist_item_t *p_root )
>
> void PLModel::takeItem( PLItem *item )
> {
> + commitBufferedRowInserts();
> assert( item );
> PLItem *parent = item->parent();
> assert( parent );
> @@ -705,6 +765,7 @@ void PLModel::takeItem( PLItem *item )
>
> void PLModel::insertChildren( PLItem *node, QList<PLItem*>& items, int i_pos )
> {
> + commitBufferedRowInserts();
> assert( node );
> int count = items.count();
> if( !count ) return;
> @@ -720,6 +781,7 @@ void PLModel::insertChildren( PLItem *node, QList<PLItem*>& items, int i_pos )
> void PLModel::removeItem( PLItem *item )
> {
> if( !item ) return;
> + commitBufferedRowInserts();
>
> i_cached_id = -1;
> i_cached_input_id = -1;
> @@ -822,6 +884,9 @@ void PLModel::sort( const int i_root_id, const int column, Qt::SortOrder order )
>
> PLItem *item = findById( rootItem, i_root_id );
> if( !item ) return;
> +
> + commitBufferedRowInserts();
> +
> QModelIndex qIndex = index( item, 0 );
> int count = item->childCount();
> if( count )
> @@ -868,6 +933,8 @@ void PLModel::search( const QString& search_text, const QModelIndex & idx, bool
> {
> latestSearch = search_text;
>
> + commitBufferedRowInserts();
> +
> /** \todo Fire the search with a small delay ? */
> PL_LOCK;
> {
> diff --git a/modules/gui/qt4/components/playlist/playlist_model.hpp b/modules/gui/qt4/components/playlist/playlist_model.hpp
> index 133928f..9eee44f 100644
> --- a/modules/gui/qt4/components/playlist/playlist_model.hpp
> +++ b/modules/gui/qt4/components/playlist/playlist_model.hpp
> @@ -41,6 +41,8 @@
> #include <QAbstractItemModel>
> #include <QVariant>
> #include <QModelIndex>
> +#include <QTimer>
> +#include <QMutex>
>
> class PLItem;
> class PLSelector;
> @@ -130,6 +132,15 @@ private:
>
> static QIcon icons[ITEM_TYPE_NUMBER];
>
> + /* single row linear inserts agregation */
> + void bufferedRowInsert( PLItem *item, PLItem *parent, int pos );
> + PLItem *insertBufferRoot;
> + int insertbuffer_firstrow;
> + int insertbuffer_lastrow;
> + QTimer insertBufferCommitTimer;
> + QList<PLItem *> insertBuffer;
> + QMutex insertBufferMutex;
> +
> /* Custom model private methods */
> /* Lookups */
> QStringList selectedURIs();
> @@ -192,6 +203,7 @@ private slots:
> void processInputItemUpdate( input_thread_t* p_input );
> void processItemRemoval( int i_id );
> void processItemAppend( int item, int parent );
> + void commitBufferedRowInserts();
> void activateItem( playlist_item_t *p_item );
> void increaseZoom();
> void decreaseZoom();
>
> _______________________________________________
> vlc-commits mailing list
> vlc-commits at videolan.org
> http://mailman.videolan.org/listinfo/vlc-commits
--
KORIYAMA, Naohiro
nkoriyama at gmail.com
More information about the vlc-devel
mailing list