This class can be used to have multiple buttons in a property editor. More...
#include <editors.h>
Public Member Functions | |
void | Add (const wxString &label, int id=-2) |
void | FinalizePosition (const wxPoint &pos) |
const wxWindow * | GetButton (unsigned int i) const |
wxWindow * | GetButton (unsigned int i) |
int | GetButtonId (unsigned int i) const |
Utility function to be used in event handlers. | |
int | GetCount () const |
Returns number of buttons. | |
wxSize | GetPrimarySize () const |
wxPGMultiButton (wxPropertyGrid *pg, const wxSize &sz) |
This class can be used to have multiple buttons in a property editor.
You will need to create a new property editor class, override CreateControls, and have it return wxPGMultiButton instance in wxPGWindowList::SetSecondary(). For instance, here we add three buttons to a textctrl editor:
#include <wx/propgrid/editors.h> class wxMultiButtonTextCtrlEditor : public wxPGTextCtrlEditor { WX_PG_DECLARE_EDITOR_CLASS(wxMultiButtonTextCtrlEditor) public: wxMultiButtonTextCtrlEditor() {} virtual ~wxMultiButtonTextCtrlEditor() {} wxPG_DECLARE_CREATECONTROLS virtual bool OnEvent( wxPropertyGrid* propGrid, wxPGProperty* property, wxWindow* ctrl, wxEvent& event ) const; }; WX_PG_IMPLEMENT_EDITOR_CLASS(MultiButtonTextCtrlEditor, wxMultiButtonTextCtrlEditor, wxPGTextCtrlEditor) wxPGWindowList wxMultiButtonTextCtrlEditor::CreateControls( wxPropertyGrid* propGrid, wxPGProperty* property, const wxPoint& pos, const wxSize& sz ) const { // Create and populate buttons-subwindow wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz ); // Add two regular buttons buttons->Add( wxT("...") ); buttons->Add( wxT("A") ); // Add a bitmap button buttons->Add( wxArtProvider::GetBitmap(wxART_FOLDER) ); // Create the 'primary' editor control (textctrl in this case) wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls ( propGrid, property, pos, buttons->GetPrimarySize() ); // Finally, move buttons-subwindow to correct position and make sure // returned wxPGWindowList contains our custom button list. buttons->FinalizePosition(pos); wndList.SetSecondary( buttons ); return wndList; } bool wxMultiButtonTextCtrlEditor::OnEvent( wxPropertyGrid* propGrid, wxPGProperty* property, wxWindow* ctrl, wxEvent& event ) const { if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED ) { wxPGMultiButton* buttons = (wxPGMultiButton*) propGrid->GetEditorControlSecondary(); if ( event.GetId() == buttons->GetButtonId(0) ) { // Do something when first button is pressed, // Return true if value in editor changed by this // action. ... } if ( event.GetId() == buttons->GetButtonId(1) ) { // Do something when second button is pressed ... } if ( event.GetId() == buttons->GetButtonId(2) ) { // Do something when third button is pressed ... } } return wxPGTextCtrlEditor::OnEvent(propGrid, property, ctrl, event); }
Further to use this editor, code like this can be used:
// Register editor class - needs only to be called once wxPGRegisterEditorClass( MultiButtonTextCtrlEditor ); // Insert the property that will have multiple buttons propGrid->Append( new wxLongStringProperty(wxT("MultipleButtons"), wxPG_LABEL) ); // Change property to use editor created in the previous code segment propGrid->SetPropertyEditor( wxT("MultipleButtons"), wxPG_EDITOR(MultiButtonTextCtrlEditor) );