Send events from port-specific code, not common code, tested in samples

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47694 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2007-07-24 09:15:04 +00:00
parent 351461fc83
commit d8331a013b
4 changed files with 106 additions and 51 deletions

View File

@@ -576,7 +576,7 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&);
#define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn) #define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn)
#define EVT_DATAVIEW_COLUMN_SORTED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_SORTED, id, fn) #define EVT_DATAVIEW_COLUMN_SORTED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_SORTED, id, fn)
#define EVT_DATAVIEW_MODEL_ITEM_ADDED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ITEM_APPENDED, id, fn) #define EVT_DATAVIEW_MODEL_ITEM_ADDED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ITEM_ADDED, id, fn)
#define EVT_DATAVIEW_MODEL_ITEM_DELETED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ITEM_DELETED, id, fn) #define EVT_DATAVIEW_MODEL_ITEM_DELETED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ITEM_DELETED, id, fn)
#define EVT_DATAVIEW_MODEL_ITEM_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ITEM_CHANGED, id, fn) #define EVT_DATAVIEW_MODEL_ITEM_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ITEM_CHANGED, id, fn)
#define EVT_DATAVIEW_MODEL_VALUE_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_VALUE_CHANGED, id, fn) #define EVT_DATAVIEW_MODEL_VALUE_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_VALUE_CHANGED, id, fn)

View File

@@ -412,6 +412,10 @@ public:
void OnPrependList(wxCommandEvent& event); void OnPrependList(wxCommandEvent& event);
void OnDeleteList(wxCommandEvent& event); void OnDeleteList(wxCommandEvent& event);
void OnValueChanged( wxDataViewEvent &event );
void OnItemAdded( wxDataViewEvent &event );
void OnItemDeleted( wxDataViewEvent &event );
private: private:
wxDataViewCtrl* m_musicCtrl; wxDataViewCtrl* m_musicCtrl;
wxObjectDataPtr<MyMusicModel> m_music_model; wxObjectDataPtr<MyMusicModel> m_music_model;
@@ -461,6 +465,8 @@ enum
ID_ABOUT = wxID_ABOUT, ID_ABOUT = wxID_ABOUT,
ID_EXIT = wxID_EXIT, ID_EXIT = wxID_EXIT,
ID_MUSIC_CTRL = 50,
ID_ADD_MOZART = 100, ID_ADD_MOZART = 100,
ID_DELETE_MUSIC = 101, ID_DELETE_MUSIC = 101,
@@ -475,11 +481,16 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_BUTTON( ID_DELETE_MUSIC, MyFrame::OnDeleteMusic ) EVT_BUTTON( ID_DELETE_MUSIC, MyFrame::OnDeleteMusic )
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_DATAVIEW_MODEL_ITEM_ADDED( ID_MUSIC_CTRL, MyFrame::OnItemAdded )
EVT_DATAVIEW_MODEL_ITEM_DELETED( ID_MUSIC_CTRL, MyFrame::OnItemDeleted )
EVT_DATAVIEW_MODEL_VALUE_CHANGED( ID_MUSIC_CTRL, MyFrame::OnValueChanged )
END_EVENT_TABLE() END_EVENT_TABLE()
MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h)) wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
{ {
m_log = NULL;
SetIcon(wxICON(sample)); SetIcon(wxICON(sample));
// build the menus: // build the menus:
@@ -501,7 +512,7 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
// MyMusic // MyMusic
m_musicCtrl = new wxDataViewCtrl( this, wxID_ANY, wxDefaultPosition, m_musicCtrl = new wxDataViewCtrl( this, ID_MUSIC_CTRL, wxDefaultPosition,
wxDefaultSize ); wxDefaultSize );
m_music_model = new MyMusicModel; m_music_model = new MyMusicModel;
@@ -581,6 +592,30 @@ void MyFrame::OnDeleteList( wxCommandEvent& WXUNUSED(event) )
m_list_model->DeleteItem( item ); m_list_model->DeleteItem( item );
} }
void MyFrame::OnItemAdded( wxDataViewEvent &event )
{
if (!m_log)
return;
m_log->AppendText( "EVT_DATAVIEW_MODEL_ITEM_ADDED\n" );
}
void MyFrame::OnItemDeleted( wxDataViewEvent &event )
{
if (!m_log)
return;
m_log->AppendText( "EVT_DATAVIEW_MODEL_ITEM_DELETED\n" );
}
void MyFrame::OnValueChanged( wxDataViewEvent &event )
{
if (!m_log)
return;
m_log->AppendText( "EVT_DATAVIEW_MODEL_VALUE_CHANGED\n" );
}
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
{ {
wxAboutDialogInfo info; wxAboutDialogInfo info;

View File

@@ -528,42 +528,6 @@ void wxDataViewColumnBase::SetFlags(int flags)
SetHidden((flags & wxDATAVIEW_COL_HIDDEN) != 0); SetHidden((flags & wxDATAVIEW_COL_HIDDEN) != 0);
} }
// ---------------------------------------------------------
// wxDataViewEventModelNotifier
// ---------------------------------------------------------
class WXDLLIMPEXP_ADV wxDataViewEventModelNotifier: public wxDataViewModelNotifier
{
public:
wxDataViewEventModelNotifier( wxDataViewCtrl *ctrl ) { m_ctrl = ctrl; }
bool SendEvent( wxEventType event_type, const wxDataViewItem &item, unsigned int col = 0 )
{
wxDataViewEvent event( event_type, m_ctrl->GetId() );
event.SetEventObject( m_ctrl );
event.SetModel( m_ctrl->GetModel() );
event.SetItem( item );
event.SetColumn( col );
m_ctrl->GetEventHandler()->ProcessEvent( event );
return true;
}
virtual bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item )
{ return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED, item ); }
virtual bool ItemDeleted( const wxDataViewItem &item )
{ return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED, item ); }
virtual bool ItemChanged( const wxDataViewItem &item )
{ return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED, item ); }
virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col )
{ return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED, item, col ); }
virtual bool Cleared()
{ return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED, wxDataViewItem(0) ); }
private:
wxDataViewCtrl *m_ctrl;
};
// --------------------------------------------------------- // ---------------------------------------------------------
// wxDataViewCtrlBase // wxDataViewCtrlBase
// --------------------------------------------------------- // ---------------------------------------------------------
@@ -574,7 +538,6 @@ wxDataViewCtrlBase::wxDataViewCtrlBase()
{ {
m_model = NULL; m_model = NULL;
m_cols.DeleteContents( true ); m_cols.DeleteContents( true );
m_eventNotifier = NULL;
m_expander_column = 0; m_expander_column = 0;
m_indent = 8; m_indent = 8;
} }
@@ -588,10 +551,6 @@ wxDataViewCtrlBase::~wxDataViewCtrlBase()
if (m_model) if (m_model)
{ {
if (m_eventNotifier)
m_model->RemoveNotifier( m_eventNotifier );
m_eventNotifier = NULL;
m_model->DecRef(); m_model->DecRef();
m_model = NULL; m_model = NULL;
} }
@@ -601,10 +560,6 @@ bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel *model )
{ {
if (m_model) if (m_model)
{ {
if (m_eventNotifier)
m_model->RemoveNotifier( m_eventNotifier );
m_eventNotifier = NULL;
m_model->DecRef(); // discard old model, if any m_model->DecRef(); // discard old model, if any
} }
@@ -613,8 +568,6 @@ bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel *model )
if (m_model) if (m_model)
{ {
m_model->IncRef(); m_model->IncRef();
m_eventNotifier = new wxDataViewEventModelNotifier( (wxDataViewCtrl*) this );
m_model->AddNotifier( m_eventNotifier );
} }
return true; return true;

View File

@@ -75,7 +75,9 @@ public:
bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ); bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item );
bool ItemDeleted( const wxDataViewItem &item ); bool ItemDeleted( const wxDataViewItem &item );
bool ItemChanged( const wxDataViewItem &item );
bool ValueChanged( const wxDataViewItem &item, unsigned int col );
bool Cleared();
void Resort(); void Resort();
protected: protected:
@@ -1096,6 +1098,8 @@ bool wxGtkDataViewModelNotifier::ItemChanged( const wxDataViewItem &item )
GTK_TREE_MODEL(m_wxgtk_model), path, &iter ); GTK_TREE_MODEL(m_wxgtk_model), path, &iter );
gtk_tree_path_free (path); gtk_tree_path_free (path);
m_owner->GtkGetInternal()->ItemChanged( item );
return true; return true;
} }
@@ -1129,14 +1133,22 @@ bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsig
// Redraw // Redraw
gtk_widget_queue_draw_area( GTK_WIDGET(widget), gtk_widget_queue_draw_area( GTK_WIDGET(widget),
cell_area.x - xdiff, ydiff + cell_area.y, cell_area.width, cell_area.height ); cell_area.x - xdiff, ydiff + cell_area.y, cell_area.width, cell_area.height );
m_owner->GtkGetInternal()->ValueChanged( item, model_col );
return true;
} }
} }
return true; return false;
} }
bool wxGtkDataViewModelNotifier::Cleared() bool wxGtkDataViewModelNotifier::Cleared()
{ {
// TODO: delete everything
m_owner->GtkGetInternal()->Cleared();
return false; return false;
} }
@@ -2240,6 +2252,10 @@ void wxDataViewCtrlInternal::InitTree()
void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node ) void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node )
{ {
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED, m_owner->GetId() );
event.SetEventObject( m_owner );
event.SetModel( m_owner->GetModel() );
if (node->GetChildCount() == 0) if (node->GetChildCount() == 0)
{ {
wxDataViewItem child = m_wx_model->GetFirstChild( node->GetItem() ); wxDataViewItem child = m_wx_model->GetFirstChild( node->GetItem() );
@@ -2249,6 +2265,10 @@ void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node )
node->AddNode( new wxGtkTreeModelNode( node, child, this ) ); node->AddNode( new wxGtkTreeModelNode( node, child, this ) );
else else
node->AddLeave( child.GetID() ); node->AddLeave( child.GetID() );
event.SetItem( child );
m_owner->GetEventHandler()->ProcessEvent( event );
child = m_wx_model->GetNextSibling( child ); child = m_wx_model->GetNextSibling( child );
} }
} }
@@ -2266,6 +2286,13 @@ bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDa
parent_node->AddNode( new wxGtkTreeModelNode( parent_node, item, this ) ); parent_node->AddNode( new wxGtkTreeModelNode( parent_node, item, this ) );
else else
parent_node->AddLeave( item.GetID() ); parent_node->AddLeave( item.GetID() );
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED, m_owner->GetId() );
event.SetEventObject( m_owner );
event.SetModel( m_owner->GetModel() );
event.SetItem( item );
m_owner->GetEventHandler()->ProcessEvent( event );
return true; return true;
} }
@@ -2273,6 +2300,46 @@ bool wxDataViewCtrlInternal::ItemDeleted( const wxDataViewItem &item )
{ {
wxGtkTreeModelNode *parent = FindParentNode( item ); wxGtkTreeModelNode *parent = FindParentNode( item );
parent->DeleteChild( item.GetID() ); parent->DeleteChild( item.GetID() );
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED, m_owner->GetId() );
event.SetEventObject( m_owner );
event.SetModel( m_owner->GetModel() );
event.SetItem( item );
m_owner->GetEventHandler()->ProcessEvent( event );
return true;
}
bool wxDataViewCtrlInternal::ItemChanged( const wxDataViewItem &item )
{
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED, m_owner->GetId() );
event.SetEventObject( m_owner );
event.SetModel( m_owner->GetModel() );
event.SetItem( item );
m_owner->GetEventHandler()->ProcessEvent( event );
return true;
}
bool wxDataViewCtrlInternal::ValueChanged( const wxDataViewItem &item, unsigned int col )
{
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED, m_owner->GetId() );
event.SetEventObject( m_owner );
event.SetModel( m_owner->GetModel() );
event.SetColumn( col );
event.SetItem( item );
m_owner->GetEventHandler()->ProcessEvent( event );
return true;
}
bool wxDataViewCtrlInternal::Cleared()
{
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED, m_owner->GetId() );
event.SetEventObject( m_owner );
event.SetModel( m_owner->GetModel() );
m_owner->GetEventHandler()->ProcessEvent( event );
return true; return true;
} }