]> git.sesse.net Git - vlc/commitdiff
Use item-append when an item is appended to a node -> don't rebuild the whole tree
authorClément Stenac <zorglub@videolan.org>
Sun, 21 Nov 2004 22:40:48 +0000 (22:40 +0000)
committerClément Stenac <zorglub@videolan.org>
Sun, 21 Nov 2004 22:40:48 +0000 (22:40 +0000)
include/vlc_playlist.h
modules/gui/wxwindows/playlist.cpp
modules/gui/wxwindows/wxwindows.h
modules/services_discovery/sap.c
src/playlist/item-ext.c
src/playlist/playlist.c
src/playlist/view.c

index 5f37e52c5d4b5cae283641d619bf99919f8ac0f6..770e1a9dd592f134258449a9289c41ab5a4d1e34 100644 (file)
@@ -200,7 +200,7 @@ struct playlist_t
 /* Helper to add an item */
 struct playlist_add_t
 {
-    playlist_item_t *p_parent;
+    playlist_item_t *p_node;
     playlist_item_t *p_item;
     int i_view;
     int i_position;
index cc8bb708375950aa8c554c9a6d8d1ebf4a8538a9..851f168b30d945ef215683e66e3ab96b12a193ec 100644 (file)
@@ -55,6 +55,9 @@ static int PlaylistNext( vlc_object_t *, const char *,
                          vlc_value_t, vlc_value_t, void * );
 static int ItemChanged( vlc_object_t *, const char *,
                         vlc_value_t, vlc_value_t, void * );
+static int ItemAppended( vlc_object_t *p_this, const char *psz_variable,
+                      vlc_value_t oval, vlc_value_t nval, void *param );
+
 
 /*****************************************************************************
  * Event Table.
@@ -108,6 +111,7 @@ enum
 
     /* custom events */
     UpdateItem_Event,
+    AppendItem_Event,
 
     MenuDummy_Event = wxID_HIGHEST + 999,
 
@@ -363,26 +367,8 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ):
     font.SetPointSize(8);
     treectrl->SetFont( font );
 
-    /* Create the Up-Down buttons */
-#if 0
-    wxButton *up_button =
-        new wxButton( playlist_panel, Up_Event, wxU(_("Up") ) );
-    wxButton *down_button =
-        new wxButton( playlist_panel, Down_Event, wxU(_("Down") ) );
-
-    wxBoxSizer *updown_sizer = new wxBoxSizer( wxHORIZONTAL );
-    updown_sizer->Layout();
-    /* The top and bottom sizers */
-    wxBoxSizer *bottom_sizer = new wxBoxSizer( wxHORIZONTAL );
-    bottom_sizer->Add( up_button, 0, wxALIGN_LEFT | wxRIGHT, 3);
-    bottom_sizer->Add( down_button, 0, wxALIGN_LEFT | wxLEFT, 3);
-    bottom_sizer->Layout();
-#endif
     wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
     panel_sizer->Add( treectrl, 1, wxEXPAND | wxALL, 5 );
-#if 0
-    panel_sizer->Add( bottom_sizer, 0, wxALL, 5);
-#endif
     panel_sizer->Layout();
 
     playlist_panel->SetSizerAndFit( panel_sizer );
@@ -411,6 +397,8 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ):
     /* One item has been updated */
     var_AddCallback( p_playlist, "item-change", ItemChanged, this );
 
+    var_AddCallback( p_playlist, "item-append", ItemAppended, this );
+
     vlc_object_release( p_playlist );
 
     /* Update the playlist */
@@ -419,12 +407,6 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ):
 
 void Playlist::OnSize( wxSizeEvent& event)
 {
-#if 0
-    wxSize size = GetClientSize();
-    if( listview )
-        listview->SetColumnWidth( 0, size.x - listview->GetColumnWidth(1)
-                        - 15 /* margins */ );
-#endif
     event.Skip();
 }
 
@@ -517,6 +499,12 @@ wxTreeItemId Playlist::FindItem( wxTreeItemId root, playlist_item_t *p_item )
     wxTreeItemId item = treectrl->GetFirstChild( root, cookie );
     wxTreeItemId child;
 
+    if( !p_item )
+    {
+        wxTreeItemId dummy;
+        return dummy;
+    }
+
     while( item.IsOk() )
     {
         p_wxcurrent = (PlaylistItem *)treectrl->GetItemData( item );
@@ -580,6 +568,46 @@ void Playlist::SetCurrentItem( wxTreeItemId item )
     }
 }
 
+void Playlist::AppendItem( wxCommandEvent& event )
+{
+    playlist_add_t *p_add = (playlist_add_t *)event.GetClientData();
+
+    playlist_t *p_playlist =
+        (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
+                                       FIND_ANYWHERE );
+    if( p_playlist == NULL )
+    {
+        event.Skip();
+        return;
+    }
+
+    if( p_add->i_view != i_current_view )
+    {
+        vlc_object_release( p_playlist );
+        event.Skip();
+        return;
+    }
+
+    wxTreeItemId node = FindItem( treectrl->GetRootItem(), p_add->p_node );
+    if( !node.IsOk() )
+    {
+        vlc_object_release( p_playlist );
+        event.Skip();
+        return;
+    }
+
+    wxTreeItemId item = treectrl->AppendItem( node,
+                           wxL2U( p_add->p_item->input.psz_name ), -1,-1,
+                           new PlaylistItem( p_add->p_item ) );
+    treectrl->SetItemImage( item, p_add->p_item->input.i_type );
+
+    if( item.IsOk() && p_add->p_item->i_children == -1 )
+    {
+        UpdateTreeItem( p_playlist, item );
+    }
+    vlc_object_release( p_playlist );
+}
+
 void Playlist::UpdateItem( int i )
 {
     if( i < 0 ) return; /* Sanity check */
@@ -606,7 +634,7 @@ void Playlist::UpdateItem( int i )
     vlc_object_release(p_playlist);
 }
 
-void Playlist::UpdateTreeItem( playlist_t *p_playlist ,wxTreeItemId item )
+void Playlist::UpdateTreeItem( playlist_t *p_playlistwxTreeItemId item )
 {
     playlist_item_t *p_item  =
             ((PlaylistItem *)treectrl->GetItemData( item ))->p_item;
@@ -1512,9 +1540,12 @@ void Playlist::OnPlaylistEvent( wxCommandEvent& event )
 {
     switch( event.GetId() )
     {
-    case UpdateItem_Event:
-        UpdateItem( event.GetInt() );
-        break;
+        case UpdateItem_Event:
+            UpdateItem( event.GetInt() );
+            break;
+        case AppendItem_Event:
+            AppendItem( event );
+            break;
     }
 }
 
@@ -1562,3 +1593,18 @@ static int ItemChanged( vlc_object_t *p_this, const char *psz_variable,
 
     return 0;
 }
+
+static int ItemAppended( vlc_object_t *p_this, const char *psz_variable,
+                         vlc_value_t oval, vlc_value_t nval, void *param )
+{
+    Playlist *p_playlist_dialog = (Playlist *)param;
+
+    playlist_add_t *p_add = (playlist_add_t *)malloc(sizeof( playlist_add_t));
+    memcpy( p_add, nval.p_address, sizeof( playlist_add_t ) );
+
+    wxCommandEvent event( wxEVT_PLAYLIST, AppendItem_Event );
+    event.SetClientData( (void *)p_add );
+    p_playlist_dialog->AddPendingEvent( event );
+
+    return VLC_SUCCESS;
+}
index b4b898f0b7d21a633f88aa69664f36c344931b29..96b07f80803de44081c8951cd17465fba6e8664d 100644 (file)
@@ -779,6 +779,7 @@ public:
     void UpdatePlaylist();
     void ShowPlaylist( bool show );
     void UpdateItem( int );
+    void AppendItem( wxCommandEvent& );
 
     bool b_need_update;
 
index 8c0eb9f70d6125b5498d129b3417ea8f07fc30b4..4b3ea98acf624f7f0f2f8530febce7196a31d0f4 100644 (file)
@@ -255,6 +255,7 @@ static int Open( vlc_object_t *p_this )
     playlist_t          *p_playlist;
     playlist_view_t     *p_view;
     char                *psz_addr;
+    vlc_value_t         val;
 
     p_sys->i_timeout = config_GetInt( p_sd,"sap-timeout" );
 
@@ -320,6 +321,8 @@ static int Open( vlc_object_t *p_this )
     p_view = playlist_ViewFind( p_playlist, VIEW_CATEGORY );
     p_sys->p_node = playlist_NodeCreate( p_playlist, VIEW_CATEGORY,
                                          _("SAP"), p_view->p_root );
+    val.b_bool = VLC_TRUE;
+    var_Set( p_playlist, "intf-change", val );
 
     vlc_object_release( p_playlist );
 
index 409dae477971e467d722134afe8a43a74456db97..cd6c6c733760ad9143fed5c4b078810ddb8e8c16 100644 (file)
@@ -120,6 +120,8 @@ int playlist_AddItem( playlist_t *p_playlist, playlist_item_t *p_item,
     vlc_bool_t b_end = VLC_FALSE;
     playlist_view_t *p_view = NULL;
 
+    playlist_add_t *p_add = (playlist_add_t *)malloc(sizeof( playlist_add_t));
+
     vlc_mutex_lock( &p_playlist->object_lock );
 
     /*
@@ -196,12 +198,19 @@ int playlist_AddItem( playlist_t *p_playlist, playlist_item_t *p_item,
         {
             playlist_NodeAppend( p_playlist, VIEW_CATEGORY, p_item,
                                  p_playlist->p_general );
+            p_add->p_item = p_item;
+            p_add->p_node = p_playlist->p_general;
+            p_add->i_view = VIEW_CATEGORY;
+            val.p_address = p_add;
+            var_Set( p_playlist, "item-append", val );
         }
         else
         {
             playlist_NodeInsert( p_playlist, VIEW_CATEGORY, p_item,
                                  p_playlist->p_general, i_pos );
         }
+
+
         p_view = playlist_ViewFind( p_playlist, VIEW_ALL );
         playlist_ItemAddParent( p_item, VIEW_ALL, p_view->p_root );
 
@@ -212,6 +221,12 @@ int playlist_AddItem( playlist_t *p_playlist, playlist_item_t *p_item,
         {
             playlist_NodeAppend( p_playlist, VIEW_SIMPLE,p_item,
                                   p_view->p_root );
+            p_add->p_item = p_item;
+            p_add->p_node = p_view->p_root;
+            p_add->i_view = VIEW_SIMPLE;
+            val.p_address = p_add;
+            var_Set( p_playlist, "item-append", val );
+
         }
         else
         {
@@ -219,6 +234,7 @@ int playlist_AddItem( playlist_t *p_playlist, playlist_item_t *p_item,
                                   p_view->p_root, i_pos );
         }
 
+
         /* FIXME : Update sorted views */
 
         if( p_playlist->i_index >= i_pos )
@@ -248,8 +264,11 @@ int playlist_AddItem( playlist_t *p_playlist, playlist_item_t *p_item,
 
     vlc_mutex_unlock( &p_playlist->object_lock );
 
-    val.b_bool = VLC_TRUE;
-    var_Set( p_playlist, "intf-change", val );
+    if( b_end == VLC_FALSE )
+    {
+        val.b_bool = VLC_TRUE;
+        var_Set( p_playlist, "intf-change", val );
+    }
 
     return p_item->input.i_id;
 }
@@ -275,6 +294,8 @@ int playlist_NodeAddItem( playlist_t *p_playlist, playlist_item_t *p_item,
     int i_position;
     playlist_view_t *p_view;
 
+    playlist_add_t *p_add = (playlist_add_t *)malloc(sizeof( playlist_add_t));
+
     vlc_mutex_lock( &p_playlist->object_lock );
 
     /* Sanity checks */
@@ -327,6 +348,12 @@ int playlist_NodeAddItem( playlist_t *p_playlist, playlist_item_t *p_item,
     /* TODO: Handle modes */
     playlist_NodeAppend( p_playlist, i_view, p_item, p_parent );
 
+    p_add->p_item = p_item;
+    p_add->p_node = p_parent;
+    p_add->i_view = i_view;
+    val.p_address = p_add;
+    var_Set( p_playlist, "item-append", val );
+
     /* We update the ALL view directly */
     p_view = playlist_ViewFind( p_playlist, VIEW_ALL );
     playlist_ItemAddParent( p_item, VIEW_ALL, p_view->p_root );
@@ -350,7 +377,7 @@ int playlist_NodeAddItem( playlist_t *p_playlist, playlist_item_t *p_item,
     vlc_mutex_unlock( &p_playlist->object_lock );
 
     val.b_bool = VLC_TRUE;
-    var_Set( p_playlist, "intf-change", val );
+//    var_Set( p_playlist, "intf-change", val );
 
     return p_item->input.i_id;
 }
index dcb9e46db3a2ab1de54e098456f24f35e71eaae1..61fad2f854d4056671199e7e7c7da179588b54ea 100644 (file)
@@ -82,6 +82,8 @@ playlist_t * __playlist_Create ( vlc_object_t *p_parent )
     val.i_int = -1;
     var_Set( p_playlist, "item-change", val );
 
+    var_Create( p_playlist, "item-append", VLC_VAR_ADDRESS );
+
     var_Create( p_playlist, "playlist-current", VLC_VAR_INTEGER );
     val.i_int = -1;
     var_Set( p_playlist, "playlist-current", val );
@@ -363,7 +365,6 @@ int playlist_vaControl( playlist_t * p_playlist, int i_query, va_list args )
     }
 
     vlc_mutex_unlock( &p_playlist->object_lock );
-    fprintf(stderr,"control done, request is %i\n", p_playlist->request.b_request);
     return VLC_SUCCESS;
 }
 
index 50729e5eb60a7d9665ea0b2b41879b858f3885d2..dd62aa4b13c8949b794117935dde494787d61a0c 100644 (file)
@@ -242,6 +242,8 @@ playlist_item_t * playlist_NodeCreate( playlist_t *p_playlist, int i_view,
     /* Create the item */
     playlist_item_t *p_item = (playlist_item_t *)malloc(
                                         sizeof( playlist_item_t ) );
+    vlc_value_t val;
+    playlist_add_t *p_add = (playlist_add_t*)malloc( sizeof(playlist_add_t));
 
     vlc_input_item_Init( VLC_OBJECT(p_playlist), &p_item->input );
     if( p_item == NULL )
@@ -286,6 +288,12 @@ playlist_item_t * playlist_NodeCreate( playlist_t *p_playlist, int i_view,
         playlist_NodeAppend( p_playlist, i_view, p_item, p_parent );
     }
 
+    p_add->p_node = p_parent;
+    p_add->p_item = p_item;
+    p_add->i_view = i_view;
+    val.p_address = p_add;
+    var_Set( p_playlist, "item-append", val);
+
     return p_item;
 }