From: Jakob Leben Date: Sat, 30 Jan 2010 07:43:26 +0000 (+0100) Subject: Qt: efficient iconView browsing demands a specialized playlist event X-Git-Tag: 1.1.0-ff~686 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=b59984266a5e8af16810da1093d500b950250853;p=vlc Qt: efficient iconView browsing demands a specialized playlist event --- diff --git a/modules/gui/qt4/components/playlist/standardpanel.cpp b/modules/gui/qt4/components/playlist/standardpanel.cpp index 998e9d0520..c258f84f65 100644 --- a/modules/gui/qt4/components/playlist/standardpanel.cpp +++ b/modules/gui/qt4/components/playlist/standardpanel.cpp @@ -130,8 +130,8 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, getSettings()->endGroup(); - CONNECT( THEMIM, inputChanged( input_thread_t * ), - this, handleInputChange( input_thread_t * ) ); + CONNECT( THEMIM, leafBecameParent( input_item_t *), + this, browseInto( input_item_t * ) ); CONNECT( model, currentChanged( const QModelIndex& ), this, handleExpansion( const QModelIndex& ) ); @@ -410,7 +410,7 @@ void StandardPLPanel::wheelEvent( QWheelEvent *e ) void StandardPLPanel::activate( const QModelIndex &index ) { - last_activated_id = model->itemId( index ); + last_activated_id = model->getItem( index )->inputItem()->i_id; if( model->hasChildren( index ) ) { if( currentView == iconView ) { @@ -425,26 +425,22 @@ void StandardPLPanel::activate( const QModelIndex &index ) } } -void StandardPLPanel::handleInputChange( input_thread_t *p_input_thread ) +void StandardPLPanel::browseInto( input_item_t *p_input ) { - if( currentView != iconView ) return; - input_item_t *p_input_item = input_GetItem( p_input_thread ); - if( !p_input_item ) return; + if( p_input->i_id != last_activated_id ) return; playlist_Lock( THEPL ); - playlist_item_t *p_item = playlist_ItemGetByInput( THEPL, p_input_item ); + playlist_item_t *p_item = playlist_ItemGetByInput( THEPL, p_input ); + assert( p_item != NULL ); - if( p_item && p_item->p_parent && - p_item->p_parent->i_id == last_activated_id ) - { - QModelIndex index = model->index( p_item->p_parent->i_id, 0 ); + if( currentView == iconView ) { + QModelIndex index = model->index( p_item->i_id, 0 ); iconView->setRootIndex( index ); - //title->setText( index.data().toString() ); locationBar->setIndex( index ); - last_activated_id = p_item->i_id; } + last_activated_id = p_item->pp_children[0]->p_input->i_id; playlist_Unlock( THEPL ); } diff --git a/modules/gui/qt4/components/playlist/standardpanel.hpp b/modules/gui/qt4/components/playlist/standardpanel.hpp index 78c6920e6c..a84367875c 100644 --- a/modules/gui/qt4/components/playlist/standardpanel.hpp +++ b/modules/gui/qt4/components/playlist/standardpanel.hpp @@ -107,7 +107,7 @@ private slots: void showView( int ); void cycleViews(); void activate( const QModelIndex & ); - void handleInputChange( input_thread_t * ); + void browseInto( input_item_t * ); }; class LocationBar : public QToolBar diff --git a/modules/gui/qt4/input_manager.cpp b/modules/gui/qt4/input_manager.cpp index ffa2c6501b..7a5278328c 100644 --- a/modules/gui/qt4/input_manager.cpp +++ b/modules/gui/qt4/input_manager.cpp @@ -37,6 +37,8 @@ static int ItemChanged( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ); +static int LeafToParent( vlc_object_t *, const char *, + vlc_value_t, vlc_value_t, void * ); static int PLItemChanged( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ); static int PLItemAppended( vlc_object_t *, const char *, @@ -905,6 +907,7 @@ MainInputManager::MainInputManager( intf_thread_t *_p_intf ) var_AddCallback( THEPL, "item-change", ItemChanged, im ); var_AddCallback( THEPL, "item-current", PLItemChanged, this ); var_AddCallback( THEPL, "activity", PLItemChanged, this ); + var_AddCallback( THEPL, "leaf-to-parent", LeafToParent, this ); var_AddCallback( THEPL, "playlist-item-append", PLItemAppended, this ); var_AddCallback( THEPL, "playlist-item-deleted", PLItemRemoved, this ); var_AddCallback( THEPL, "random", RandomChanged, this ); @@ -947,6 +950,7 @@ MainInputManager::~MainInputManager() var_DelCallback( THEPL, "activity", PLItemChanged, this ); var_DelCallback( THEPL, "item-change", ItemChanged, im ); + var_DelCallback( THEPL, "leaf-to-parent", LeafToParent, this ); var_DelCallback( THEPL, "item-current", PLItemChanged, this ); var_DelCallback( THEPL, "playlist-item-append", PLItemAppended, this ); @@ -972,6 +976,7 @@ void MainInputManager::customEvent( QEvent *event ) int type = event->type(); PLEvent *plEv; + IMEvent *imEv; // msg_Dbg( p_intf, "New MainIM Event of type: %i", type ); switch( type ) @@ -997,6 +1002,9 @@ void MainInputManager::customEvent( QEvent *event ) case RepeatChanged_Type: notifyRepeatLoop(); return; + case LeafToParent_Type: + imEv = static_cast( event ); + emit leafBecameParent( imEv->p_item ); default: if( type != ItemChanged_Type ) return; } @@ -1135,6 +1143,17 @@ static int PLItemChanged( vlc_object_t *p_this, const char *psz_var, return VLC_SUCCESS; } +static int LeafToParent( vlc_object_t *p_this, const char *psz_var, + vlc_value_t oldval, vlc_value_t newval, void *param ) +{ + MainInputManager *mim = (MainInputManager*)param; + + IMEvent *event = new IMEvent( LeafToParent_Type, + static_cast( newval.p_address ) ); + QApplication::postEvent( mim, event ); + return VLC_SUCCESS; +} + static int VolumeChanged( vlc_object_t *p_this, const char *psz_var, vlc_value_t oldval, vlc_value_t newval, void *param ) { diff --git a/modules/gui/qt4/input_manager.hpp b/modules/gui/qt4/input_manager.hpp index 1e62627851..229f568cb6 100644 --- a/modules/gui/qt4/input_manager.hpp +++ b/modules/gui/qt4/input_manager.hpp @@ -61,6 +61,7 @@ enum { RandomChanged_Type, LoopChanged_Type, RepeatChanged_Type, + LeafToParent_Type, /* SignalChanged_Type, */ FullscreenControlToggle_Type = QEvent::User + IMEventType + 20, @@ -77,6 +78,7 @@ enum { NORMAL, /* loop: 0, repeat: 0 */ class IMEvent : public QEvent { friend class InputManager; +friend class MainInputManager; public: IMEvent( int type, input_item_t *p_input = NULL ) : QEvent( (QEvent::Type)(type) ) @@ -288,6 +290,7 @@ signals: void playlistItemRemoved( int itemId ); void randomChanged( bool ); void repeatLoopChanged( int ); + void leafBecameParent( input_item_t * ); }; #endif diff --git a/src/playlist/engine.c b/src/playlist/engine.c index 7ac8407a05..b492c909f8 100644 --- a/src/playlist/engine.c +++ b/src/playlist/engine.c @@ -279,6 +279,7 @@ static void VariablesInit( playlist_t *p_playlist ) var_SetBool( p_playlist, "intf-change", true ); var_Create( p_playlist, "item-change", VLC_VAR_ADDRESS ); + var_Create( p_playlist, "leaf-to-parent", VLC_VAR_ADDRESS ); var_Create( p_playlist, "playlist-item-deleted", VLC_VAR_INTEGER ); var_SetInteger( p_playlist, "playlist-item-deleted", -1 ); diff --git a/src/playlist/item.c b/src/playlist/item.c index 94c27b3a3e..c935d8c94f 100644 --- a/src/playlist/item.c +++ b/src/playlist/item.c @@ -626,6 +626,7 @@ static playlist_item_t *ItemToNode( playlist_t *p_playlist, pl_priv(p_playlist)->b_reset_currently_playing = true; vlc_cond_signal( &pl_priv(p_playlist)->signal ); var_SetAddress( p_playlist, "item-change", p_item_in_category->p_input ); + var_SetAddress( p_playlist, "leaf-to-parent", p_item_in_category->p_input ); PL_UNLOCK_IF( !b_locked ); return p_item_in_category; }