virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col ) = 0;
virtual bool Cleared() = 0;
- // this is needed for the virtual list model under GTK+
- virtual bool BeforeReset( size_t WXUNUSED(old_size), size_t WXUNUSED(new_size) ) { return true; }
+ // some platforms, such as GTK+, may need a two step procedure for ::Reset()
+ virtual bool BeforeReset() { return true; }
virtual bool AfterReset() { return Cleared(); }
virtual void Resort() = 0;
bool ValueChanged( const wxDataViewItem &item, unsigned int col );
bool Cleared();
- // this is needed for the virtual list model under GTK+
- bool BeforeReset( size_t old_size, size_t new_size );
+ // some platforms, such as GTK+, may need a two step procedure for ::Reset()
+ bool BeforeReset();
bool AfterReset();
return *v1-*v2;
}
-#define INITIAL_NUMBER_OF_ITEMS 100000
+#define INITIAL_NUMBER_OF_ITEMS 10000
MyListModel::MyListModel() :
wxDataViewVirtualListModel( INITIAL_NUMBER_OF_ITEMS )
{
- m_virtualItems = INITIAL_NUMBER_OF_ITEMS;
-
// the first 100 items are really stored in this model;
// all the others are synthesized on request
static const unsigned NUMBER_REAL_ITEMS = 100;
void MyListModel::DeleteItem( const wxDataViewItem &item )
{
unsigned int row = GetRow( item );
+
if (row >= m_textColValues.GetCount())
return;
void MyListModel::AddMany()
{
- m_virtualItems += 1000;
- Reset( m_textColValues.GetCount() + m_virtualItems );
+ Reset( GetCount()+1000 );
}
void MyListModel::GetValueByRow( wxVariant &variant,
return wxT("string");
}
- virtual unsigned int GetRowCount()
- {
- return m_textColValues.GetCount();
- }
-
virtual void GetValueByRow( wxVariant &variant,
unsigned int row, unsigned int col ) const;
virtual bool GetAttrByRow( unsigned int row, unsigned int col,
wxArrayString m_textColValues;
wxArrayString m_iconColValues;
wxIcon m_icon[2];
- int m_virtualItems;
};
return ret;
}
-bool wxDataViewModel::BeforeReset( size_t old_size, size_t new_size )
+bool wxDataViewModel::BeforeReset()
{
bool ret = true;
for (iter = m_notifiers.begin(); iter != m_notifiers.end(); ++iter)
{
wxDataViewModelNotifier* notifier = *iter;
- if (!notifier->BeforeReset(old_size,new_size))
+ if (!notifier->BeforeReset())
ret = false;
}
void wxDataViewIndexListModel::Reset( unsigned int new_size )
{
+ /* wxDataViewModel:: */ BeforeReset();
+
m_hash.Clear();
// IDs are ordered until an item gets deleted or inserted
m_nextFreeID = new_size + 1;
- /* wxDataViewModel:: */ Cleared();
+ /* wxDataViewModel:: */ AfterReset();
}
void wxDataViewIndexListModel::RowPrepended()
void wxDataViewVirtualListModel::Reset( unsigned int new_size )
{
- /* wxDataViewModel:: */ BeforeReset( m_size, new_size );
+ /* wxDataViewModel:: */ BeforeReset();
m_size = new_size;
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 );
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();
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();
- gtk_tree_view_set_model( GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(wxgtk_model) );
-
m_internal->Cleared();
+ gtk_tree_view_set_model( GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(wxgtk_model) );
+
return true;
}
m_dragDataObject = NULL;
m_dropDataObject = NULL;
+ m_dirty = false;
+
m_gtk_model = wxgtk_tree_model_new();
m_gtk_model->internal = this;
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;
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;
}
void wxDataViewCtrl::OnInternalIdle()
{
wxWindow::OnInternalIdle();
+
+ m_internal->OnInternalIdle();
unsigned int cols = GetColumnCount();
unsigned int i;