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();
// item can be deleted already in the model
int GetIndexOf( const wxDataViewItem &parent, const wxDataViewItem &item );
+ virtual void OnInternalIdle();
+
protected:
void InitTree();
+ void ScheduleRefresh();
+
wxGtkTreeModelNode *FindNode( const wxDataViewItem &item );
wxGtkTreeModelNode *FindNode( GtkTreeIter *iter );
wxGtkTreeModelNode *FindParentNode( const wxDataViewItem &item );
GtkTargetEntry m_dropTargetTargetEntry;
wxCharBuffer m_dropTargetTargetEntryTarget;
wxDataObject *m_dropDataObject;
-
+
wxGtkDataViewModelNotifier *m_notifier;
+
+ bool m_dirty;
};
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();
-
+
void UpdateLastCount();
private:
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();
{
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++)
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 );
-
+
return true;
}
bool wxGtkDataViewModelNotifier::AfterReset()
{
- GtkWxTreeModel *wxgtk_model = m_internal->GetGtkModel();
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) );
- m_internal->Cleared();
-
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
-
+
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 );
-
+
m_internal->Cleared();
return true;
wxDataViewChoiceRenderer( choices, mode, alignment )
{
}
-
+
void wxDataViewChoiceByIndexRenderer::GtkOnTextEdited(const gchar *itempath, const wxString& str)
{
wxVariant value( (long) GetChoices().Index( str ) );
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;
-
+
value = (long) GetChoices().Index( string_value.GetString() );
return true;
}
{
if (m_isConnected)
return;
-
+
if (GTK_WIDGET_REALIZED(GetOwner()->m_treeview))
{
GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column);
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_owner = owner;
m_wx_model = wx_model;
-
+
m_gtk_model = NULL;
m_root = NULL;
m_sort_order = GTK_SORT_ASCENDING;
m_dragDataObject = NULL;
m_dropDataObject = NULL;
+ m_dirty = false;
+
m_gtk_model = wxgtk_tree_model_new();
m_gtk_model->internal = this;
if (!m_wx_model->IsVirtualListModel())
InitTree();
-
+
gtk_tree_view_set_model( GTK_TREE_VIEW(m_owner->GtkGetTreeView()), GTK_TREE_MODEL(m_gtk_model) );
}
{
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 );
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;
{
wxDataViewItemArray children;
unsigned int count = m_wx_model->GetChildren( node->GetItem(), children );
-
+
unsigned int pos;
for (pos = 0; pos < count; pos++)
{
delete m_root;
m_root = NULL;
}
-
+
InitTree();
-
+
+ ScheduleRefresh();
+
return true;
}
{
if (!m_wx_model->IsVirtualListModel())
m_root->Resort();
+
+ ScheduleRefresh();
}
bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
parent_node->AddLeave( item.GetID() );
}
+ ScheduleRefresh();
+
return true;
}
parent_node->DeleteChild( item.GetID() );
}
+ ScheduleRefresh();
+
return true;
}
while (node)
{
int pos = node->GetChildren().Index( id );
-
+
gtk_tree_path_prepend_index( retval, pos );
id = node->GetItem().GetID();
{
wxWindow::OnInternalIdle();
+ m_internal->OnInternalIdle();
+
unsigned int cols = GetColumnCount();
unsigned int i;
for (i = 0; i < cols; i++)
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 )
void wxDataViewCtrl::EnsureVisible(const wxDataViewItem& item,
const wxDataViewColumn *WXUNUSED(column))
{
+ m_ensureVisibleDefered = item;
ExpandAncestors(item);
GtkTreeIter iter;