]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
Correct the fix that broke wxRegion::ConvertToBitmap().
[wxWidgets.git] / src / gtk / dataview.cpp
index a52da38744117da34f03abff7f235c1a512c2087..96ea64b8c60a59c485f7a8d21758264fa9db223b 100644 (file)
@@ -233,7 +233,7 @@ public:
     bool ItemChanged( const wxDataViewItem &item );
     bool ValueChanged( const wxDataViewItem &item, unsigned int col );
     bool Cleared();
     bool ItemChanged( const wxDataViewItem &item );
     bool ValueChanged( const wxDataViewItem &item, unsigned int col );
     bool Cleared();
-    bool BeforeReset(size_t old_Size,size_t new_size);
+    bool BeforeReset();
     bool AfterReset();
     void Resort();
 
     bool AfterReset();
     void Resort();
 
@@ -258,8 +258,12 @@ public:
     // item can be deleted already in the model
     int GetIndexOf( const wxDataViewItem &parent, const wxDataViewItem &item );
 
     // item can be deleted already in the model
     int GetIndexOf( const wxDataViewItem &parent, const wxDataViewItem &item );
 
+    virtual void OnInternalIdle();
+
 protected:
     void InitTree();
 protected:
     void InitTree();
+    void ScheduleRefresh();
+
     wxGtkTreeModelNode *FindNode( const wxDataViewItem &item );
     wxGtkTreeModelNode *FindNode( GtkTreeIter *iter );
     wxGtkTreeModelNode *FindParentNode( const wxDataViewItem &item );
     wxGtkTreeModelNode *FindNode( const wxDataViewItem &item );
     wxGtkTreeModelNode *FindNode( GtkTreeIter *iter );
     wxGtkTreeModelNode *FindParentNode( const wxDataViewItem &item );
@@ -282,8 +286,10 @@ private:
     GtkTargetEntry        m_dropTargetTargetEntry;
     wxCharBuffer          m_dropTargetTargetEntryTarget;
     wxDataObject         *m_dropDataObject;
     GtkTargetEntry        m_dropTargetTargetEntry;
     wxCharBuffer          m_dropTargetTargetEntryTarget;
     wxDataObject         *m_dropDataObject;
-    
+
     wxGtkDataViewModelNotifier *m_notifier;
     wxGtkDataViewModelNotifier *m_notifier;
+
+    bool                  m_dirty;
 };
 
 
 };
 
 
@@ -1487,9 +1493,9 @@ public:
     virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col );
     virtual bool Cleared();
     virtual void Resort();
     virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col );
     virtual bool Cleared();
     virtual void Resort();
-    virtual bool BeforeReset(size_t old_size,size_t new_size);
+    virtual bool BeforeReset();
     virtual bool AfterReset();
     virtual bool AfterReset();
-    
+
     void UpdateLastCount();
 
 private:
     void UpdateLastCount();
 
 private:
@@ -1570,7 +1576,7 @@ void wxGtkDataViewModelNotifier::Resort()
 bool wxGtkDataViewModelNotifier::ItemChanged( const wxDataViewItem &item )
 {
     GtkWxTreeModel *wxgtk_model = m_internal->GetGtkModel();
 bool wxGtkDataViewModelNotifier::ItemChanged( const wxDataViewItem &item )
 {
     GtkWxTreeModel *wxgtk_model = m_internal->GetGtkModel();
-    
+
     GtkTreeIter iter;
     iter.stamp = wxgtk_model->stamp;
     iter.user_data = (gpointer) item.GetID();
     GtkTreeIter iter;
     iter.stamp = wxgtk_model->stamp;
     iter.user_data = (gpointer) item.GetID();
@@ -1589,7 +1595,7 @@ bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsig
 {
     GtkWxTreeModel *wxgtk_model = m_internal->GetGtkModel();
     wxDataViewCtrl *ctrl = m_internal->GetOwner();
 {
     GtkWxTreeModel *wxgtk_model = m_internal->GetGtkModel();
     wxDataViewCtrl *ctrl = m_internal->GetOwner();
-    
+
     // This adds GTK+'s missing MVC logic for ValueChanged
     unsigned int index;
     for (index = 0; index < ctrl->GetColumnCount(); index++)
     // This adds GTK+'s missing MVC logic for ValueChanged
     unsigned int index;
     for (index = 0; index < ctrl->GetColumnCount(); index++)
@@ -1627,44 +1633,44 @@ bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsig
     return false;
 }
 
     return false;
 }
 
-bool wxGtkDataViewModelNotifier::BeforeReset(size_t WXUNUSED(old_size), size_t WXUNUSED(new_size))
+bool wxGtkDataViewModelNotifier::BeforeReset()
 {
     GtkWidget *treeview = m_internal->GetOwner()->GtkGetTreeView();
     gtk_tree_view_set_model( GTK_TREE_VIEW(treeview), NULL );
 {
     GtkWidget *treeview = m_internal->GetOwner()->GtkGetTreeView();
     gtk_tree_view_set_model( GTK_TREE_VIEW(treeview), NULL );
-    
+
     return true;
 }
 
 bool wxGtkDataViewModelNotifier::AfterReset()
 {
     return true;
 }
 
 bool wxGtkDataViewModelNotifier::AfterReset()
 {
-    GtkWxTreeModel *wxgtk_model = m_internal->GetGtkModel();
     GtkWidget *treeview = m_internal->GetOwner()->GtkGetTreeView();
     GtkWidget *treeview = m_internal->GetOwner()->GtkGetTreeView();
-    
+    GtkWxTreeModel *wxgtk_model = m_internal->GetGtkModel();
+
+    m_internal->Cleared();
+
     gtk_tree_view_set_model( GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(wxgtk_model) );
 
     gtk_tree_view_set_model( GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(wxgtk_model) );
 
-    m_internal->Cleared(); 
-    
     return true;
 }
 
 bool wxGtkDataViewModelNotifier::Cleared()
 {
     GtkWxTreeModel *wxgtk_model = m_internal->GetGtkModel();
     return true;
 }
 
 bool wxGtkDataViewModelNotifier::Cleared()
 {
     GtkWxTreeModel *wxgtk_model = m_internal->GetGtkModel();
-    
+
     // There is no call to tell the model that everything
     // has been deleted so call row_deleted() for every
     // child of root...
 
     int count = m_internal->iter_n_children( NULL ); // number of children of root
     // There is no call to tell the model that everything
     // has been deleted so call row_deleted() for every
     // child of root...
 
     int count = m_internal->iter_n_children( NULL ); // number of children of root
-    
+
     GtkTreePath *path = gtk_tree_path_new_first();  // points to root
 
     int i;
     for (i = 0; i < count; i++)
         gtk_tree_model_row_deleted( GTK_TREE_MODEL(wxgtk_model), path );
     GtkTreePath *path = gtk_tree_path_new_first();  // points to root
 
     int i;
     for (i = 0; i < count; i++)
         gtk_tree_model_row_deleted( GTK_TREE_MODEL(wxgtk_model), path );
-    
+
     gtk_tree_path_free( path );
     gtk_tree_path_free( path );
-    
+
     m_internal->Cleared();
 
     return true;
     m_internal->Cleared();
 
     return true;
@@ -2635,7 +2641,7 @@ wxDataViewChoiceByIndexRenderer::wxDataViewChoiceByIndexRenderer( const wxArrayS
       wxDataViewChoiceRenderer( choices, mode, alignment )
 {
 }
       wxDataViewChoiceRenderer( choices, mode, alignment )
 {
 }
-                            
+
 void wxDataViewChoiceByIndexRenderer::GtkOnTextEdited(const gchar *itempath, const wxString& str)
 {
     wxVariant value( (long) GetChoices().Index( str ) );
 void wxDataViewChoiceByIndexRenderer::GtkOnTextEdited(const gchar *itempath, const wxString& str)
 {
     wxVariant value( (long) GetChoices().Index( str ) );
@@ -2654,13 +2660,13 @@ bool wxDataViewChoiceByIndexRenderer::SetValue( const wxVariant &value )
     wxVariant string_value = GetChoice( value.GetLong() );
     return wxDataViewChoiceRenderer::SetValue( string_value );
 }
     wxVariant string_value = GetChoice( value.GetLong() );
     return wxDataViewChoiceRenderer::SetValue( string_value );
 }
-    
+
 bool wxDataViewChoiceByIndexRenderer::GetValue( wxVariant &value ) const
 {
     wxVariant string_value;
     if (!wxDataViewChoiceRenderer::GetValue( string_value ))
          return false;
 bool wxDataViewChoiceByIndexRenderer::GetValue( wxVariant &value ) const
 {
     wxVariant string_value;
     if (!wxDataViewChoiceRenderer::GetValue( string_value ))
          return false;
-            
+
     value = (long) GetChoices().Index( string_value.GetString() );
     return true;
 }
     value = (long) GetChoices().Index( string_value.GetString() );
     return true;
 }
@@ -3001,7 +3007,7 @@ void wxDataViewColumn::OnInternalIdle()
 {
     if (m_isConnected)
         return;
 {
     if (m_isConnected)
         return;
-               
+
     if (GTK_WIDGET_REALIZED(GetOwner()->m_treeview))
     {
         GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column);
     if (GTK_WIDGET_REALIZED(GetOwner()->m_treeview))
     {
         GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column);
@@ -3011,8 +3017,8 @@ void wxDataViewColumn::OnInternalIdle()
                       G_CALLBACK (gtk_dataview_header_button_press_callback), this);
 
             // otherwise the event will be blocked by GTK+
                       G_CALLBACK (gtk_dataview_header_button_press_callback), this);
 
             // otherwise the event will be blocked by GTK+
-            gtk_tree_view_column_set_clickable( column, TRUE ); 
-            
+            gtk_tree_view_column_set_clickable( column, TRUE );
+
             m_isConnected = true;
         }
     }
             m_isConnected = true;
         }
     }
@@ -3380,7 +3386,7 @@ wxDataViewCtrlInternal::wxDataViewCtrlInternal( wxDataViewCtrl *owner, wxDataVie
 {
     m_owner = owner;
     m_wx_model = wx_model;
 {
     m_owner = owner;
     m_wx_model = wx_model;
-    
+
     m_gtk_model = NULL;
     m_root = NULL;
     m_sort_order = GTK_SORT_ASCENDING;
     m_gtk_model = NULL;
     m_root = NULL;
     m_sort_order = GTK_SORT_ASCENDING;
@@ -3390,6 +3396,8 @@ wxDataViewCtrlInternal::wxDataViewCtrlInternal( wxDataViewCtrl *owner, wxDataVie
     m_dragDataObject = NULL;
     m_dropDataObject = NULL;
 
     m_dragDataObject = NULL;
     m_dropDataObject = NULL;
 
+    m_dirty = false;
+
     m_gtk_model = wxgtk_tree_model_new();
     m_gtk_model->internal = this;
 
     m_gtk_model = wxgtk_tree_model_new();
     m_gtk_model->internal = this;
 
@@ -3401,7 +3409,7 @@ wxDataViewCtrlInternal::wxDataViewCtrlInternal( wxDataViewCtrl *owner, wxDataVie
 
     if (!m_wx_model->IsVirtualListModel())
         InitTree();
 
     if (!m_wx_model->IsVirtualListModel())
         InitTree();
-        
+
     gtk_tree_view_set_model( GTK_TREE_VIEW(m_owner->GtkGetTreeView()), GTK_TREE_MODEL(m_gtk_model) );
 }
 
     gtk_tree_view_set_model( GTK_TREE_VIEW(m_owner->GtkGetTreeView()), GTK_TREE_MODEL(m_gtk_model) );
 }
 
@@ -3409,7 +3417,7 @@ wxDataViewCtrlInternal::~wxDataViewCtrlInternal()
 {
     m_wx_model->RemoveNotifier( m_notifier );
 
 {
     m_wx_model->RemoveNotifier( m_notifier );
 
-    // remove the model from the GtkTreeView before it gets destroyed 
+    // remove the model from the GtkTreeView before it gets destroyed
     gtk_tree_view_set_model( GTK_TREE_VIEW( m_owner->GtkGetTreeView() ), NULL );
 
     g_object_unref( m_gtk_model );
     gtk_tree_view_set_model( GTK_TREE_VIEW( m_owner->GtkGetTreeView() ), NULL );
 
     g_object_unref( m_gtk_model );
@@ -3418,6 +3426,21 @@ wxDataViewCtrlInternal::~wxDataViewCtrlInternal()
     delete m_dropDataObject;
 }
 
     delete m_dropDataObject;
 }
 
+void wxDataViewCtrlInternal::ScheduleRefresh()
+{
+    m_dirty = true;
+}
+
+void wxDataViewCtrlInternal::OnInternalIdle()
+{
+    if (m_dirty)
+    {
+        GtkWidget *widget = m_owner->GtkGetTreeView();
+        gtk_widget_queue_draw( widget );
+        m_dirty = false;
+    }
+}
+
 void wxDataViewCtrlInternal::InitTree()
 {
     wxDataViewItem item;
 void wxDataViewCtrlInternal::InitTree()
 {
     wxDataViewItem item;
@@ -3432,7 +3455,7 @@ void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node )
     {
         wxDataViewItemArray children;
         unsigned int count = m_wx_model->GetChildren( node->GetItem(), children );
     {
         wxDataViewItemArray children;
         unsigned int count = m_wx_model->GetChildren( node->GetItem(), children );
-        
+
         unsigned int pos;
         for (pos = 0; pos < count; pos++)
         {
         unsigned int pos;
         for (pos = 0; pos < count; pos++)
         {
@@ -3602,9 +3625,11 @@ bool wxDataViewCtrlInternal::Cleared()
         delete m_root;
         m_root = NULL;
     }
         delete m_root;
         m_root = NULL;
     }
-        
+
     InitTree();
     InitTree();
-    
+
+    ScheduleRefresh();
+
     return true;
 }
 
     return true;
 }
 
@@ -3612,6 +3637,8 @@ void wxDataViewCtrlInternal::Resort()
 {
     if (!m_wx_model->IsVirtualListModel())
         m_root->Resort();
 {
     if (!m_wx_model->IsVirtualListModel())
         m_root->Resort();
+
+    ScheduleRefresh();
 }
 
 bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
 }
 
 bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
@@ -3628,6 +3655,8 @@ bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDa
             parent_node->AddLeave( item.GetID() );
     }
 
             parent_node->AddLeave( item.GetID() );
     }
 
+    ScheduleRefresh();
+
     return true;
 }
 
     return true;
 }
 
@@ -3642,6 +3671,8 @@ bool wxDataViewCtrlInternal::ItemDeleted( const wxDataViewItem &parent, const wx
         parent_node->DeleteChild( item.GetID() );
     }
 
         parent_node->DeleteChild( item.GetID() );
     }
 
+    ScheduleRefresh();
+
     return true;
 }
 
     return true;
 }
 
@@ -3768,7 +3799,7 @@ GtkTreePath *wxDataViewCtrlInternal::get_path( GtkTreeIter *iter )
         while (node)
         {
             int pos = node->GetChildren().Index( id );
         while (node)
         {
             int pos = node->GetChildren().Index( id );
-            
+
             gtk_tree_path_prepend_index( retval, pos );
 
             id = node->GetItem().GetID();
             gtk_tree_path_prepend_index( retval, pos );
 
             id = node->GetItem().GetID();
@@ -4508,6 +4539,8 @@ void wxDataViewCtrl::OnInternalIdle()
 {
     wxWindow::OnInternalIdle();
 
 {
     wxWindow::OnInternalIdle();
 
+    m_internal->OnInternalIdle();
+
     unsigned int cols = GetColumnCount();
     unsigned int i;
     for (i = 0; i < cols; i++)
     unsigned int cols = GetColumnCount();
     unsigned int i;
     for (i = 0; i < cols; i++)
@@ -4515,6 +4548,16 @@ void wxDataViewCtrl::OnInternalIdle()
         wxDataViewColumn *col = GetColumn( i );
         col->OnInternalIdle();
     }
         wxDataViewColumn *col = GetColumn( i );
         col->OnInternalIdle();
     }
+
+    if (m_ensureVisibleDefered.IsOk())
+    {
+        ExpandAncestors(m_ensureVisibleDefered);
+        GtkTreeIter iter;
+        iter.user_data = (gpointer) m_ensureVisibleDefered.GetID();
+        wxGtkTreePath path(m_internal->get_path( &iter ));
+        gtk_tree_view_scroll_to_cell( GTK_TREE_VIEW(m_treeview), path, NULL, false, 0.0, 0.0 );
+        m_ensureVisibleDefered = wxDataViewItem(0);
+    }
 }
 
 bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model )
 }
 
 bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model )
@@ -4915,6 +4958,7 @@ void wxDataViewCtrl::UnselectAll()
 void wxDataViewCtrl::EnsureVisible(const wxDataViewItem& item,
                                    const wxDataViewColumn *WXUNUSED(column))
 {
 void wxDataViewCtrl::EnsureVisible(const wxDataViewItem& item,
                                    const wxDataViewColumn *WXUNUSED(column))
 {
+    m_ensureVisibleDefered = item;
     ExpandAncestors(item);
 
     GtkTreeIter iter;
     ExpandAncestors(item);
 
     GtkTreeIter iter;