Commit 5c8f39a1 authored by Ilkka Ollakka's avatar Ilkka Ollakka

qt4: remove model from PLItem, and do emitting signals from model

Also emit layoutAboutToBeChanged/layoutChanged() more. Speeds up
playlist-view atleast for me
parent 00b9d166
...@@ -29,11 +29,9 @@ ...@@ -29,11 +29,9 @@
#include <assert.h> #include <assert.h>
#include "qt4.hpp" #include "qt4.hpp"
#include "components/playlist/playlist_model.hpp" #include "playlist_item.hpp"
#include <vlc_intf_strings.h> #include <vlc_intf_strings.h>
#include <QSettings>
#include "sorting.h" #include "sorting.h"
/************************************************************************* /*************************************************************************
...@@ -48,29 +46,27 @@ ...@@ -48,29 +46,27 @@
*/ */
void PLItem::init( playlist_item_t *_playlist_item, PLItem *parent, PLModel *m, QSettings *settings ) void PLItem::init( playlist_item_t *_playlist_item, PLItem *parent )
{ {
parentItem = parent; /* Can be NULL, but only for the rootItem */ parentItem = parent; /* Can be NULL, but only for the rootItem */
i_id = _playlist_item->i_id; /* Playlist item specific id */ i_id = _playlist_item->i_id; /* Playlist item specific id */
model = m; /* PLModel (QAbsmodel) */
p_input = _playlist_item->p_input; p_input = _playlist_item->p_input;
vlc_gc_incref( p_input ); vlc_gc_incref( p_input );
assert( model ); /* We need a model */
} }
/* /*
Constructors Constructors
Call the above function init Call the above function init
*/ */
PLItem::PLItem( playlist_item_t *p_item, PLItem *parent, PLModel *m ) PLItem::PLItem( playlist_item_t *p_item, PLItem *parent )
{ {
init( p_item, parent, m, NULL ); init( p_item, parent );
} }
PLItem::PLItem( playlist_item_t * p_item, QSettings *settings, PLModel *m ) PLItem::PLItem( playlist_item_t * p_item )
{ {
init( p_item, NULL, m, settings ); init( p_item, NULL );
} }
PLItem::~PLItem() PLItem::~PLItem()
...@@ -85,22 +81,15 @@ PLItem::~PLItem() ...@@ -85,22 +81,15 @@ PLItem::~PLItem()
*/ */
void PLItem::insertChild( PLItem *item, int i_pos, bool signal ) void PLItem::insertChild( PLItem *item, int i_pos, bool signal )
{ {
if( signal )
model->beginInsertRows( model->index( this , 0 ), i_pos, i_pos );
children.insert( i_pos, item ); children.insert( i_pos, item );
if( signal )
model->endInsertRows();
} }
void PLItem::remove( PLItem *removed ) void PLItem::remove( PLItem *removed, int i_depth )
{ {
if( model->i_depth == DEPTH_SEL || parentItem ) if( i_depth == DEPTH_SEL || parentItem )
{ {
int i_index = parentItem->children.indexOf( removed ); int i_index = parentItem->children.indexOf( removed );
model->beginRemoveRows( model->index( parentItem, 0 ),
i_index, i_index );
parentItem->children.removeAt( i_index ); parentItem->children.removeAt( i_index );
model->endRemoveRows();
} }
} }
......
...@@ -40,8 +40,8 @@ class PLItem ...@@ -40,8 +40,8 @@ class PLItem
{ {
friend class PLModel; friend class PLModel;
public: public:
PLItem( playlist_item_t *, PLItem *parent, PLModel * ); PLItem( playlist_item_t *, PLItem *parent );
PLItem( playlist_item_t *, QSettings *, PLModel * ); PLItem( playlist_item_t * );
~PLItem(); ~PLItem();
int row() const; int row() const;
...@@ -49,10 +49,10 @@ public: ...@@ -49,10 +49,10 @@ public:
void insertChild( PLItem *, int p, bool signal = true ); void insertChild( PLItem *, int p, bool signal = true );
void appendChild( PLItem *item, bool signal = true ) void appendChild( PLItem *item, bool signal = true )
{ {
insertChild( item, children.count(), signal ); children.insert( children.count(), item );
}; };
void remove( PLItem *removed ); void remove( PLItem *removed, int i_depth );
PLItem *child( int row ) { return children.value( row ); }; PLItem *child( int row ) { return children.value( row ); };
int childCount() const { return children.count(); }; int childCount() const { return children.count(); };
...@@ -67,9 +67,8 @@ protected: ...@@ -67,9 +67,8 @@ protected:
input_item_t *p_input; input_item_t *p_input;
private: private:
void init( playlist_item_t *, PLItem *, PLModel *, QSettings * ); void init( playlist_item_t *, PLItem * );
PLItem *parentItem; PLItem *parentItem;
PLModel *model;
}; };
#endif #endif
......
...@@ -294,7 +294,7 @@ void PLModel::removeItem( int i_id ) ...@@ -294,7 +294,7 @@ void PLModel::removeItem( int i_id )
{ {
PLItem *item = FindById( rootItem, i_id ); PLItem *item = FindById( rootItem, i_id );
if( currentItem && item && currentItem->p_input == item->p_input ) currentItem = NULL; if( currentItem && item && currentItem->p_input == item->p_input ) currentItem = NULL;
if( item ) item->remove( item ); if( item ) item->remove( item, i_depth );
} }
/* callbacks and slots */ /* callbacks and slots */
...@@ -357,7 +357,7 @@ QVariant PLModel::data( const QModelIndex &index, int role ) const ...@@ -357,7 +357,7 @@ QVariant PLModel::data( const QModelIndex &index, int role ) const
int columncount = 0; int columncount = 0;
int metadata = 1; int metadata = 1;
if( item->model->i_depth == DEPTH_SEL ) if( i_depth == DEPTH_SEL )
{ {
vlc_mutex_lock( &item->p_input->lock ); vlc_mutex_lock( &item->p_input->lock );
QString returninfo = QString( qfu( item->p_input->psz_name ) ); QString returninfo = QString( qfu( item->p_input->psz_name ) );
...@@ -716,8 +716,12 @@ void PLModel::ProcessItemAppend( const playlist_add_t *p_add ) ...@@ -716,8 +716,12 @@ void PLModel::ProcessItemAppend( const playlist_add_t *p_add )
p_item->p_parent->i_id != rootItem->i_id ) p_item->p_parent->i_id != rootItem->i_id )
goto end; goto end;
newItem = new PLItem( p_item, nodeItem, this ); newItem = new PLItem( p_item, nodeItem );
emit layoutAboutToBeChanged();
emit beginInsertRows( index( newItem, 0 ), nodeItem->childCount(), nodeItem->childCount()+1 );
nodeItem->appendChild( newItem ); nodeItem->appendChild( newItem );
emit endInsertRows();
emit layoutChanged();
UpdateTreeItem( p_item, newItem, true ); UpdateTreeItem( p_item, newItem, true );
end: end:
PL_UNLOCK; PL_UNLOCK;
...@@ -738,23 +742,25 @@ void PLModel::rebuild( playlist_item_t *p_root ) ...@@ -738,23 +742,25 @@ void PLModel::rebuild( playlist_item_t *p_root )
/* Invalidate cache */ /* Invalidate cache */
i_cached_id = i_cached_input_id = -1; i_cached_id = i_cached_input_id = -1;
emit layoutAboutToBeChanged();
PL_LOCK; PL_LOCK;
/* Clear the tree */ /* Clear the tree */
if( rootItem ) if( rootItem )
{ {
if( rootItem->children.size() ) if( rootItem->children.size() )
{ {
beginRemoveRows( index( rootItem, 0 ), 0, emit beginRemoveRows( index( rootItem, 0 ), 0,
rootItem->children.size() -1 ); rootItem->children.size() -1 );
qDeleteAll( rootItem->children ); qDeleteAll( rootItem->children );
rootItem->children.clear(); rootItem->children.clear();
endRemoveRows(); emit endRemoveRows();
} }
} }
if( p_root ) if( p_root )
{ {
delete rootItem; delete rootItem;
rootItem = new PLItem( p_root, getSettings(), this ); rootItem = new PLItem( p_root );
} }
assert( rootItem ); assert( rootItem );
/* Recreate from root */ /* Recreate from root */
...@@ -783,8 +789,10 @@ void PLModel::rebuild( playlist_item_t *p_root ) ...@@ -783,8 +789,10 @@ void PLModel::rebuild( playlist_item_t *p_root )
/* This function must be entered WITH the playlist lock */ /* This function must be entered WITH the playlist lock */
void PLModel::UpdateNodeChildren( PLItem *root ) void PLModel::UpdateNodeChildren( PLItem *root )
{ {
emit layoutAboutToBeChanged();
playlist_item_t *p_node = playlist_ItemGetById( p_playlist, root->i_id ); playlist_item_t *p_node = playlist_ItemGetById( p_playlist, root->i_id );
UpdateNodeChildren( p_node, root ); UpdateNodeChildren( p_node, root );
emit layoutChanged();
} }
/* This function must be entered WITH the playlist lock */ /* This function must be entered WITH the playlist lock */
...@@ -793,9 +801,11 @@ void PLModel::UpdateNodeChildren( playlist_item_t *p_node, PLItem *root ) ...@@ -793,9 +801,11 @@ void PLModel::UpdateNodeChildren( playlist_item_t *p_node, PLItem *root )
for( int i = 0; i < p_node->i_children ; i++ ) for( int i = 0; i < p_node->i_children ; i++ )
{ {
if( p_node->pp_children[i]->i_flags & PLAYLIST_DBL_FLAG ) continue; if( p_node->pp_children[i]->i_flags & PLAYLIST_DBL_FLAG ) continue;
PLItem *newItem = new PLItem( p_node->pp_children[i], root, this ); PLItem *newItem = new PLItem( p_node->pp_children[i], root );
root->appendChild( newItem, false ); emit beginInsertRows( index( newItem, 0 ), root->childCount(), root->childCount()+1 );
UpdateTreeItem( newItem, false, true ); root->appendChild( newItem );
emit endInsertRows();
UpdateTreeItem( newItem, true, true );
if( i_depth == DEPTH_PL && p_node->pp_children[i]->i_children != -1 ) if( i_depth == DEPTH_PL && p_node->pp_children[i]->i_children != -1 )
UpdateNodeChildren( p_node->pp_children[i], newItem ); UpdateNodeChildren( p_node->pp_children[i], newItem );
} }
...@@ -875,7 +885,10 @@ void PLModel::doDeleteItem( PLItem *item, QModelIndexList *fullList ) ...@@ -875,7 +885,10 @@ void PLModel::doDeleteItem( PLItem *item, QModelIndexList *fullList )
else else
playlist_NodeDelete( p_playlist, p_item, true, false ); playlist_NodeDelete( p_playlist, p_item, true, false );
/* And finally, remove it from the tree */ /* And finally, remove it from the tree */
item->remove( item ); emit beginRemoveRows( index( item->parentItem, 0), item->parentItem->children.indexOf( item ),
item->parentItem->children.indexOf( item )+1 );
item->remove( item, i_depth );
emit endRemoveRows();
PL_UNLOCK; PL_UNLOCK;
} }
...@@ -985,18 +998,18 @@ void PLModel::viewchanged( int meta ) ...@@ -985,18 +998,18 @@ void PLModel::viewchanged( int meta )
if( i_showflags & meta ) if( i_showflags & meta )
/* Removing columns */ /* Removing columns */
{ {
beginRemoveColumns( parent, index, index+1 ); emit beginRemoveColumns( parent, index, index+1 );
i_showflags &= ~( meta ); i_showflags &= ~( meta );
getSettings()->setValue( "qt-pl-showflags", i_showflags ); getSettings()->setValue( "qt-pl-showflags", i_showflags );
endRemoveColumns(); emit endRemoveColumns();
} }
else else
{ {
/* Adding columns */ /* Adding columns */
beginInsertColumns( parent, index, index+1 ); emit beginInsertColumns( parent, index, index+1 );
i_showflags |= meta; i_showflags |= meta;
getSettings()->setValue( "qt-pl-showflags", i_showflags ); getSettings()->setValue( "qt-pl-showflags", i_showflags );
endInsertColumns(); emit endInsertColumns();
} }
emit columnsChanged( meta ); emit columnsChanged( meta );
rebuild(); rebuild();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment