Added wxDataViewListIndexModel::RowsDeleted() and various related corrections

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50764 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2007-12-17 11:28:02 +00:00
parent ea3a345f1c
commit 8b6cf9bf10
5 changed files with 130 additions and 8 deletions

View File

@ -91,6 +91,14 @@ Call this after a row has been changed.
Call this after a row has been deleted. Call this after a row has been deleted.
\membersection{wxDataViewIndexListModel::RowsDeleted}\label{wxdataviewindexlistmodelrowdeleted}
\func{void}{RowsDeleted}{\param{const wxArrayInt &}{rows}}
Call this after rows have been deleted. The array will internally
get copied and sorted in descending order so that the rows with
the highest position will be deleted first.
\membersection{wxDataViewIndexListModel::RowInserted}\label{wxdataviewindexlistmodelrowinserted} \membersection{wxDataViewIndexListModel::RowInserted}\label{wxdataviewindexlistmodelrowinserted}
\func{void}{RowInserted}{\param{unsigned int }{before}} \func{void}{RowInserted}{\param{unsigned int }{before}}

View File

@ -245,6 +245,7 @@ public:
void RowInserted( unsigned int before ); void RowInserted( unsigned int before );
void RowAppended(); void RowAppended();
void RowDeleted( unsigned int row ); void RowDeleted( unsigned int row );
void RowsDeleted( const wxArrayInt &rows );
void RowChanged( unsigned int row ); void RowChanged( unsigned int row );
void RowValueChanged( unsigned int row, unsigned int col ); void RowValueChanged( unsigned int row, unsigned int col );

View File

@ -353,6 +353,17 @@ private:
bool m_classicalMusicIsKnownToControl; bool m_classicalMusicIsKnownToControl;
}; };
static int my_sort_reverse( int *v1, int *v2 )
{
return *v2-*v1;
}
static int my_sort( int *v1, int *v2 )
{
return *v1-*v2;
}
class MyListModel: public wxDataViewIndexListModel class MyListModel: public wxDataViewIndexListModel
{ {
public: public:
@ -388,6 +399,34 @@ public:
m_array.RemoveAt( row ); m_array.RemoveAt( row );
RowDeleted( row ); RowDeleted( row );
} }
void DeleteItems( const wxDataViewItemArray &items )
{
wxArrayInt rows;
unsigned int i;
for (i = 0; i < items.GetCount(); i++)
{
unsigned int row = GetRow( items[i] );
rows.Add( row );
}
// Sort in descending order so that the last
// row will be deleted first. Otherwise the
// remaining indeces would all be wrong.
rows.Sort( my_sort_reverse );
for (i = 0; i < rows.GetCount(); i++)
m_array.RemoveAt( rows[i] );
// This is just to test if wxDataViewCtrl can
// cope with removing rows not sorted in
// descending order
rows.Sort( my_sort );
RowsDeleted( rows );
}
void AddMany()
{
}
// implementation of base class virtuals to define model // implementation of base class virtuals to define model
@ -522,6 +561,7 @@ public:
void OnRightClick( wxMouseEvent &event ); void OnRightClick( wxMouseEvent &event );
void OnGoto( wxCommandEvent &event); void OnGoto( wxCommandEvent &event);
void OnAddMany( wxCommandEvent &event);
private: private:
wxDataViewCtrl* m_musicCtrl; wxDataViewCtrl* m_musicCtrl;
@ -552,7 +592,7 @@ bool MyApp::OnInit(void)
// build the first frame // build the first frame
MyFrame *frame = MyFrame *frame =
new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 40, 40, 800, 440); new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 40, 40, 800, 540);
frame->Show(true); frame->Show(true);
SetTopWindow(frame); SetTopWindow(frame);
@ -583,7 +623,8 @@ enum
ID_PREPEND_LIST = 200, ID_PREPEND_LIST = 200,
ID_DELETE_LIST = 201, ID_DELETE_LIST = 201,
ID_GOTO = 202 ID_GOTO = 202,
ID_ADD_MANY = 203
}; };
BEGIN_EVENT_TABLE(MyFrame, wxFrame) BEGIN_EVENT_TABLE(MyFrame, wxFrame)
@ -595,6 +636,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_BUTTON( ID_PREPEND_LIST, MyFrame::OnPrependList ) EVT_BUTTON( ID_PREPEND_LIST, MyFrame::OnPrependList )
EVT_BUTTON( ID_DELETE_LIST, MyFrame::OnDeleteList ) EVT_BUTTON( ID_DELETE_LIST, MyFrame::OnDeleteList )
EVT_BUTTON( ID_GOTO, MyFrame::OnGoto) EVT_BUTTON( ID_GOTO, MyFrame::OnGoto)
EVT_BUTTON( ID_ADD_MANY, MyFrame::OnAddMany)
EVT_DATAVIEW_ITEM_VALUE_CHANGED( ID_MUSIC_CTRL, MyFrame::OnValueChanged ) EVT_DATAVIEW_ITEM_VALUE_CHANGED( ID_MUSIC_CTRL, MyFrame::OnValueChanged )
@ -696,9 +738,12 @@ MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int
button_sizer->Add( new wxButton( this, ID_DELETE_MUSIC, "Delete selected"), 0, wxALL, 10 ); button_sizer->Add( new wxButton( this, ID_DELETE_MUSIC, "Delete selected"), 0, wxALL, 10 );
button_sizer->Add( new wxButton( this, ID_DELETE_YEAR, "Delete \"Year\" column"), 0, wxALL, 10 ); button_sizer->Add( new wxButton( this, ID_DELETE_YEAR, "Delete \"Year\" column"), 0, wxALL, 10 );
button_sizer->Add( 10, 10, 1 ); button_sizer->Add( 10, 10, 1 );
button_sizer->Add( new wxButton( this, ID_PREPEND_LIST, "Prepend"), 0, wxALL, 10 ); wxFlexGridSizer *grid_sizer = new wxFlexGridSizer( 2, 2 );
button_sizer->Add( new wxButton( this, ID_DELETE_LIST, "Delete selected"), 0, wxALL, 10 ); grid_sizer->Add( new wxButton( this, ID_PREPEND_LIST, "Prepend"), 0, wxALL, 2 );
button_sizer->Add( new wxButton( this, ID_GOTO, "Goto 50"), 0, wxALL, 10 ); grid_sizer->Add( new wxButton( this, ID_DELETE_LIST, "Delete selected"), 0, wxALL, 2 );
grid_sizer->Add( new wxButton( this, ID_GOTO, "Goto 50"), 0, wxALL, 2 );
grid_sizer->Add( new wxButton( this, ID_ADD_MANY, "Add 1000"), 0, wxALL, 2 );
button_sizer->Add( grid_sizer, 0, wxALL, 10 );
main_sizer->Add( button_sizer, 0, wxGROW, 0 ); main_sizer->Add( button_sizer, 0, wxGROW, 0 );
@ -783,9 +828,8 @@ void MyFrame::OnDeleteList( wxCommandEvent& WXUNUSED(event) )
{ {
wxDataViewItemArray items; wxDataViewItemArray items;
int len = m_listCtrl->GetSelections( items ); int len = m_listCtrl->GetSelections( items );
for( int i = 0; i < len; i ++ ) if (len > 0)
if (items[i].IsOk()) m_list_model->DeleteItems( items );
m_list_model->DeleteItem( items[i] );
} }
void MyFrame::OnValueChanged( wxDataViewEvent &event ) void MyFrame::OnValueChanged( wxDataViewEvent &event )
@ -925,6 +969,12 @@ void MyFrame::OnGoto(wxCommandEvent& WXUNUSED(event))
m_listCtrl->EnsureVisible(item,m_col); m_listCtrl->EnsureVisible(item,m_col);
} }
void MyFrame::OnAddMany(wxCommandEvent& WXUNUSED(event))
{
m_list_model->AddMany();
}
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
{ {
wxAboutDialogInfo info; wxAboutDialogInfo info;

View File

@ -385,6 +385,8 @@ void wxDataViewIndexListModel::RowDeleted( unsigned int row )
{ {
if (m_useHash) if (m_useHash)
{ {
m_ordered = false;
wxDataViewItem item( m_hash[row] ); wxDataViewItem item( m_hash[row] );
wxDataViewModel::ItemDeleted( wxDataViewItem(0), item ); wxDataViewModel::ItemDeleted( wxDataViewItem(0), item );
m_hash.RemoveAt( row ); m_hash.RemoveAt( row );
@ -397,6 +399,47 @@ void wxDataViewIndexListModel::RowDeleted( unsigned int row )
} }
} }
static int my_sort( int *v1, int *v2 )
{
return *v2-*v1;
}
void wxDataViewIndexListModel::RowsDeleted( const wxArrayInt &rows )
{
wxArrayInt sorted = rows;
sorted.Sort( my_sort );
if (m_useHash)
{
m_ordered = false;
wxDataViewItemArray array;
unsigned int i;
for (i = 0; i < rows.GetCount(); i++)
{
wxDataViewItem item( m_hash[rows[i]] );
array.Add( item );
}
wxDataViewModel::ItemsDeleted( wxDataViewItem(0), array );
for (i = 0; i < sorted.GetCount(); i++)
m_hash.RemoveAt( sorted[i] );
}
else
{
wxDataViewItemArray array;
unsigned int i;
for (i = 0; i < sorted.GetCount(); i++)
{
wxDataViewItem item( (void*) sorted[i] );
array.Add( item );
}
wxDataViewModel::ItemsDeleted( wxDataViewItem(0), array );
m_lastIndex -= rows.GetCount();
}
}
void wxDataViewIndexListModel::RowChanged( unsigned int row ) void wxDataViewIndexListModel::RowChanged( unsigned int row )
{ {
wxDataViewModel::ItemChanged( GetItem(row) ); wxDataViewModel::ItemChanged( GetItem(row) );

View File

@ -2048,6 +2048,13 @@ bool Walker( wxDataViewTreeNode * node, DoJob & func )
bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxDataViewItem & item) bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxDataViewItem & item)
{ {
if (!m_root)
{
m_count++;
UpdateDisplay();
return true;
}
SortPrepare(); SortPrepare();
wxDataViewTreeNode * node; wxDataViewTreeNode * node;
@ -2081,6 +2088,19 @@ void DestroyTreeHelper( wxDataViewTreeNode * node);
bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent,
const wxDataViewItem& item) const wxDataViewItem& item)
{ {
if (!m_root)
{
m_count--;
if( m_currentRow > GetRowCount() )
m_currentRow = m_count - 1;
m_selection.Empty();
UpdateDisplay();
return true;
}
wxDataViewTreeNode * node = FindNode(parent); wxDataViewTreeNode * node = FindNode(parent);
wxCHECK_MSG( node != NULL, false, "item not found" ); wxCHECK_MSG( node != NULL, false, "item not found" );