]> git.sesse.net Git - vlc/commitdiff
Qt: efficient iconView browsing demands a specialized playlist event
authorJakob Leben <jleben@videolan.org>
Sat, 30 Jan 2010 07:43:26 +0000 (08:43 +0100)
committerJakob Leben <jleben@videolan.org>
Sat, 30 Jan 2010 09:18:26 +0000 (10:18 +0100)
modules/gui/qt4/components/playlist/standardpanel.cpp
modules/gui/qt4/components/playlist/standardpanel.hpp
modules/gui/qt4/input_manager.cpp
modules/gui/qt4/input_manager.hpp
src/playlist/engine.c
src/playlist/item.c

index 998e9d052084bce96b77b3c8caa306c5f2cd31f8..c258f84f65ffd9f05d8b641c3b0edaf16159b380 100644 (file)
@@ -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 );
 }
index 78c6920e6ccb5e2270af4dd54054fbff81d7f0db..a84367875c244a391fd286ae647d2fba95c47a26 100644 (file)
@@ -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
index ffa2c6501b42111cd79d831d70db16f6718cdb0e..7a5278328c4cdf3523680a4fb8fa44f175a28b1b 100644 (file)
@@ -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<IMEvent*>( 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<input_item_t*>( 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 )
 {
index 1e62627851496053ea195e439f05b8993a562db8..229f568cb6936dc5447b8721115ccad542c6d9b2 100644 (file)
@@ -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
index 7ac8407a05a294ac61be769ffe8840c07c5fc814..b492c909f8f1a5589c9dc54e290e17883ba59671 100644 (file)
@@ -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 );
index 94c27b3a3e2ed0a9e8c9e733b94c2bd6059b65dd..c935d8c94f189f2200d9b702c113db7d3d8d6683 100644 (file)
@@ -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;
     }