Don't delete model in views destructor as several

views can have the same model and memory doesn't
    like getting freed several times.
  Sorting actually works. Not yet editing the sorted
    data.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37766 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2006-02-28 21:41:13 +00:00
parent 8f850e2831
commit 241cb04bd8
2 changed files with 136 additions and 7 deletions

View File

@ -171,6 +171,49 @@ private:
wxString m_colour;
};
// -------------------------------------
// MyUnsortedTextModel
// -------------------------------------
class MyUnsortedTextModel: public wxDataViewListModel
{
public:
MyUnsortedTextModel()
{
m_list.Add( wxT("This") );
m_list.Add( wxT("is") );
m_list.Add( wxT("an") );
m_list.Add( wxT("unsorted") );
m_list.Add( wxT("list") );
m_list.Add( wxT("of") );
m_list.Add( wxT("words.") );
}
virtual size_t GetNumberOfRows() { return m_list.GetCount(); }
virtual size_t GetNumberOfCols() { return 2; }
virtual wxString GetColType( size_t col ) { return wxT("string"); }
virtual wxVariant GetValue( size_t col, size_t row )
{
if (col == 0)
return m_list[row];
wxString tmp;
tmp.Printf( wxT("item(%d;%d)"), (int)row, (int)col );
return tmp;
}
virtual bool SetValue( wxVariant &variant, size_t col, size_t row )
{
if (col == 0)
{
m_list[row] = variant.GetString();
return true;
}
return false;
}
wxArrayString m_list;
};
// -------------------------------------
// MyApp
// -------------------------------------
@ -199,6 +242,24 @@ private:
wxDataViewCtrl* dataview_right;
};
// -------------------------------------
// MySortingFrame
// -------------------------------------
class MySortingFrame: public wxFrame
{
public:
MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
public:
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
private:
wxDataViewCtrl* dataview_left;
wxDataViewCtrl* dataview_right;
};
// -------------------------------------
// MyApp
// -------------------------------------
@ -210,10 +271,12 @@ IMPLEMENT_APP (MyApp)
bool MyApp::OnInit(void)
{
MyFrame *frame = new MyFrame(NULL, _T("Dynamic wxWidgets App"), 50, 50, 600, 340);
MyFrame *frame = new MyFrame(NULL, wxT("wxDataViewCtrl test"), 10, 10, 800, 340);
frame->Show(true);
MySortingFrame *frame2 = new MySortingFrame(NULL, wxT("wxDataViewCtrl test"), 10, 350, 400, 240);
frame2->Show(true);
SetTopWindow(frame);
return true;
@ -309,4 +372,75 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
dialog.ShowModal();
}
// -------------------------------------
// MySortingFrame
// -------------------------------------
MySortingFrame::MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
{
#ifdef __WXMSW__
SetIcon(wxIcon(_T("mondrian")));
#else
SetIcon(wxIcon(mondrian_xpm));
#endif
wxMenu *file_menu = new wxMenu;
file_menu->Append(DYNAMIC_ABOUT, _T("&About"));
file_menu->Append(DYNAMIC_QUIT, _T("E&xit"));
wxMenuBar *menu_bar = new wxMenuBar;
menu_bar->Append(file_menu, _T("&File"));
SetMenuBar(menu_bar);
// You used to have to do some casting for param 4, but now there are type-safe handlers
Connect( DYNAMIC_QUIT, wxID_ANY,
wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MySortingFrame::OnQuit) );
Connect( DYNAMIC_ABOUT, wxID_ANY,
wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MySortingFrame::OnAbout) );
CreateStatusBar();
// Left wxDataViewCtrl
dataview_left = new wxDataViewCtrl( this, -1 );
MyUnsortedTextModel *model = new MyUnsortedTextModel;
dataview_left->AssociateModel( model );
wxDataViewTextCell *text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_cell, 0 );
dataview_left->AppendColumn( column );
dataview_left->AppendTextColumn( wxT("second"), 1 );
// Right wxDataViewCtrl using the sorting model
dataview_right = new wxDataViewCtrl( this, -1 );
wxDataViewSortedListModel *sorted_model =
new wxDataViewSortedListModel( model );
dataview_right->AssociateModel( sorted_model );
text_cell = new wxDataViewTextCell( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
column = new wxDataViewColumn( wxT("editable"), text_cell, 0 );
dataview_right->AppendColumn( column );
dataview_right->AppendTextColumn( wxT("second"), 1 );
// layout dataview controls.
wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
sizer->Add( dataview_left, 1, wxGROW );
sizer->Add(10,10);
sizer->Add( dataview_right, 1, wxGROW );
SetSizer( sizer );
}
void MySortingFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
{
Close(true);
}
void MySortingFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
{
wxMessageDialog dialog(this, _T("This demonstrates the dataview control sorting"),
_T("About DataView"), wxOK);
dialog.ShowModal();
}

View File

@ -431,15 +431,10 @@ wxDataViewCtrlBase::wxDataViewCtrlBase()
wxDataViewCtrlBase::~wxDataViewCtrlBase()
{
if (m_model)
delete m_model;
}
bool wxDataViewCtrlBase::AssociateModel( wxDataViewListModel *model )
{
if (m_model)
delete m_model;
m_model = model;
return true;