Fixed wxPGMultiButton (event handling, FinalizePosition() -> Finalize(), no longer using PG specific class macros in its sample), other editors.h interface fixes
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55915 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -417,7 +417,7 @@ public:
|
|||||||
if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
|
if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
|
||||||
{ \
|
{ \
|
||||||
wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \
|
wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \
|
||||||
wxPGConstruct##EDITOR##EditorClass(), wxS(#EDITOR) ); \
|
wxPGConstruct##EDITOR##EditorClass() ); \
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use this in RegisterDefaultEditors.
|
// Use this in RegisterDefaultEditors.
|
||||||
@@ -425,7 +425,7 @@ public:
|
|||||||
if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
|
if ( wxPGEditor_##EDITOR == (wxPGEditor*) NULL ) \
|
||||||
{ \
|
{ \
|
||||||
wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \
|
wxPGEditor_##EDITOR = wxPropertyGrid::RegisterEditorClass( \
|
||||||
wxPGConstruct##EDITOR##EditorClass(), wxS(#EDITOR), true ); \
|
wxPGConstruct##EDITOR##EditorClass(), true ); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define wxPG_INIT_REQUIRED_EDITOR(T) \
|
#define wxPG_INIT_REQUIRED_EDITOR(T) \
|
||||||
@@ -493,113 +493,7 @@ private:
|
|||||||
This class can be used to have multiple buttons in a property editor.
|
This class can be used to have multiple buttons in a property editor.
|
||||||
You will need to create a new property editor class, override
|
You will need to create a new property editor class, override
|
||||||
CreateControls, and have it return wxPGMultiButton instance in
|
CreateControls, and have it return wxPGMultiButton instance in
|
||||||
wxPGWindowList::SetSecondary(). For instance, here we add three buttons to
|
wxPGWindowList::SetSecondary().
|
||||||
a textctrl editor:
|
|
||||||
|
|
||||||
@code
|
|
||||||
|
|
||||||
#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( "..." );
|
|
||||||
buttons->Add( "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 ( event.GetId() == buttons->GetButtonId(1) )
|
|
||||||
{
|
|
||||||
// Do something when first button is pressed
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ( event.GetId() == buttons->GetButtonId(2) )
|
|
||||||
{
|
|
||||||
// Do something when second button is pressed
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return wxPGTextCtrlEditor::OnEvent(propGrid, property, ctrl, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
Further to use this editor, code like this can be used:
|
|
||||||
|
|
||||||
@code
|
|
||||||
|
|
||||||
// Register editor class - needs only to be called once
|
|
||||||
wxPGRegisterEditorClass( MultiButtonTextCtrlEditor );
|
|
||||||
|
|
||||||
// Insert the property that will have multiple buttons
|
|
||||||
propGrid->Append( new wxLongStringProperty("MultipleButtons",
|
|
||||||
wxPG_LABEL) );
|
|
||||||
|
|
||||||
// Change property to use editor created in the previous code segment
|
|
||||||
propGrid->SetPropertyEditor( "MultipleButtons",
|
|
||||||
wxPG_EDITOR(MultiButtonTextCtrlEditor) );
|
|
||||||
|
|
||||||
@endcode
|
|
||||||
|
|
||||||
@library{wxpropgrid}
|
|
||||||
@category{propgrid}
|
|
||||||
*/
|
*/
|
||||||
class WXDLLIMPEXP_PROPGRID wxPGMultiButton : public wxWindow
|
class WXDLLIMPEXP_PROPGRID wxPGMultiButton : public wxWindow
|
||||||
{
|
{
|
||||||
@@ -628,10 +522,7 @@ public:
|
|||||||
return wxSize(m_fullEditorSize.x - m_buttonsWidth, m_fullEditorSize.y);
|
return wxSize(m_fullEditorSize.x - m_buttonsWidth, m_fullEditorSize.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinalizePosition( const wxPoint& pos )
|
void Finalize( wxPropertyGrid* propGrid, const wxPoint& pos );
|
||||||
{
|
|
||||||
Move( pos.x + m_fullEditorSize.x - m_buttonsWidth, pos.y );
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef DOXYGEN
|
#ifndef DOXYGEN
|
||||||
protected:
|
protected:
|
||||||
|
@@ -883,7 +883,6 @@ public:
|
|||||||
Pointer to the editor class instance that should be used.
|
Pointer to the editor class instance that should be used.
|
||||||
*/
|
*/
|
||||||
static wxPGEditor* RegisterEditorClass( wxPGEditor* editor,
|
static wxPGEditor* RegisterEditorClass( wxPGEditor* editor,
|
||||||
const wxString& name,
|
|
||||||
bool noDefCheck = false );
|
bool noDefCheck = false );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -8,20 +8,22 @@
|
|||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
/** @class wxPGEditor
|
/**
|
||||||
|
@class wxPGEditor
|
||||||
|
|
||||||
Base class for custom wxPropertyGrid editors.
|
Base class for custom wxPropertyGrid editors.
|
||||||
|
|
||||||
@remarks
|
@remarks
|
||||||
- Names of builtin property editors are: TextCtrl, Choice,
|
- Names of built-in property editors are: TextCtrl, Choice,
|
||||||
ComboBox, CheckBox, TextCtrlAndButton, and ChoiceAndButton. Additional editors
|
ComboBox, CheckBox, TextCtrlAndButton, and ChoiceAndButton. Additional
|
||||||
include SpinCtrl and DatePickerCtrl, but using them requires calling
|
editors include SpinCtrl and DatePickerCtrl, but using them requires
|
||||||
wxPropertyGrid::RegisterAdditionalEditors() prior use.
|
calling wxPropertyGrid::RegisterAdditionalEditors() prior use.
|
||||||
|
|
||||||
- Pointer to builtin editor is available as wxPGEditor_EditorName
|
- Pointer to built-in editor is available as wxPGEditor_EditorName
|
||||||
(eg. wxPGEditor_TextCtrl).
|
(eg. wxPGEditor_TextCtrl).
|
||||||
|
|
||||||
- To add new editor you need to register it first using static function
|
- Before you start using new editor you just created, you need to register
|
||||||
|
it using static function
|
||||||
wxPropertyGrid::RegisterEditorClass(), with code like this:
|
wxPropertyGrid::RegisterEditorClass(), with code like this:
|
||||||
@code
|
@code
|
||||||
wxPGEditor* editorPointer = wxPropertyGrid::RegisterEditorClass(new MyEditorClass(), "MyEditor");
|
wxPGEditor* editorPointer = wxPropertyGrid::RegisterEditorClass(new MyEditorClass(), "MyEditor");
|
||||||
@@ -47,20 +49,26 @@ public:
|
|||||||
/** Destructor. */
|
/** Destructor. */
|
||||||
virtual ~wxPGEditor();
|
virtual ~wxPGEditor();
|
||||||
|
|
||||||
/** Returns pointer to the name of the editor. For example, wxPG_EDITOR(TextCtrl)
|
/**
|
||||||
has name "TextCtrl". This method is autogenerated for custom editors.
|
Returns pointer to the name of the editor. For example,
|
||||||
|
wxPGEditor_TextCtrl has name "TextCtrl".
|
||||||
*/
|
*/
|
||||||
virtual wxString GetName() const = 0;
|
virtual wxString GetName() const = 0;
|
||||||
|
|
||||||
/** Instantiates editor controls.
|
/**
|
||||||
|
Instantiates editor controls.
|
||||||
|
|
||||||
@param propgrid
|
@param propgrid
|
||||||
wxPropertyGrid to which the property belongs (use as parent for control).
|
wxPropertyGrid to which the property belongs (use as parent for control).
|
||||||
|
|
||||||
@param property
|
@param property
|
||||||
Property for which this method is called.
|
Property for which this method is called.
|
||||||
|
|
||||||
@param pos
|
@param pos
|
||||||
Position, inside wxPropertyGrid, to create control(s) to.
|
Position, inside wxPropertyGrid, to create control(s) to.
|
||||||
|
|
||||||
@param size
|
@param size
|
||||||
Initial size for control(s).
|
Initial size for control(s).
|
||||||
|
|
||||||
@remarks
|
@remarks
|
||||||
- Primary control shall use id wxPG_SUBID1, and secondary (button) control
|
- Primary control shall use id wxPG_SUBID1, and secondary (button) control
|
||||||
@@ -76,98 +84,113 @@ public:
|
|||||||
OnCustomEditorEvent will then forward events, first to
|
OnCustomEditorEvent will then forward events, first to
|
||||||
wxPGEditor::OnEvent() and then to wxPGProperty::OnEvent().
|
wxPGEditor::OnEvent() and then to wxPGProperty::OnEvent().
|
||||||
*/
|
*/
|
||||||
virtual wxPGWindowList CreateControls( wxPropertyGrid* propgrid, wxPGProperty* property,
|
virtual wxPGWindowList CreateControls( wxPropertyGrid* propgrid,
|
||||||
const wxPoint& pos, const wxSize& size ) const = 0;
|
wxPGProperty* property,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& size ) const = 0;
|
||||||
|
|
||||||
/** Loads value from property to the control. */
|
/** Loads value from property to the control. */
|
||||||
virtual void UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const = 0;
|
virtual void UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const = 0;
|
||||||
|
|
||||||
/** Draws value for given property.
|
/**
|
||||||
|
Draws value for given property.
|
||||||
*/
|
*/
|
||||||
virtual void DrawValue( wxDC& dc, const wxRect& rect, wxPGProperty* property, const wxString& text ) const;
|
virtual void DrawValue( wxDC& dc, const wxRect& rect,
|
||||||
|
wxPGProperty* property, const wxString& text ) const;
|
||||||
|
|
||||||
/** Handles events. Returns true if value in control was modified
|
/**
|
||||||
(see wxPGProperty::OnEvent for more information).
|
Handles events. Returns @true if value in control was modified
|
||||||
|
(see wxPGProperty::OnEvent() for more information).
|
||||||
*/
|
*/
|
||||||
virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property,
|
virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property,
|
||||||
wxWindow* wnd_primary, wxEvent& event ) const = 0;
|
wxWindow* wnd_primary, wxEvent& event ) const = 0;
|
||||||
|
|
||||||
/** Returns value from control, via parameter 'variant'.
|
/**
|
||||||
Usually ends up calling property's StringToValue or IntToValue.
|
Returns value from control, via parameter 'variant'.
|
||||||
Returns true if value was different.
|
Usually ends up calling property's StringToValue() or IntToValue().
|
||||||
|
Returns @true if value was different.
|
||||||
*/
|
*/
|
||||||
virtual bool GetValueFromControl( wxVariant& variant, wxPGProperty* property, wxWindow* ctrl ) const;
|
virtual bool GetValueFromControl( wxVariant& variant, wxPGProperty* property,
|
||||||
|
wxWindow* ctrl ) const;
|
||||||
|
|
||||||
/** Sets value in control to unspecified. */
|
/** Sets value in control to unspecified. */
|
||||||
virtual void SetValueToUnspecified( wxPGProperty* property, wxWindow* ctrl ) const = 0;
|
virtual void SetValueToUnspecified( wxPGProperty* property,
|
||||||
|
wxWindow* ctrl ) const = 0;
|
||||||
|
|
||||||
/** Sets control's value specifically from string. */
|
/** Sets control's value specifically from string. */
|
||||||
virtual void SetControlStringValue( wxPGProperty* property, wxWindow* ctrl, const wxString& txt ) const;
|
virtual void SetControlStringValue( wxPGProperty* property,
|
||||||
|
wxWindow* ctrl, const wxString& txt ) const;
|
||||||
|
|
||||||
/** Sets control's value specifically from int (applies to choice etc.). */
|
/** Sets control's value specifically from int (applies to choice etc.). */
|
||||||
virtual void SetControlIntValue( wxPGProperty* property, wxWindow* ctrl, int value ) const;
|
virtual void SetControlIntValue( wxPGProperty* property,
|
||||||
|
wxWindow* ctrl, int value ) const;
|
||||||
|
|
||||||
/** Inserts item to existing control. Index -1 means appending.
|
/**
|
||||||
|
Inserts item to existing control. Index -1 means end of list.
|
||||||
Default implementation does nothing. Returns index of item added.
|
Default implementation does nothing. Returns index of item added.
|
||||||
*/
|
*/
|
||||||
virtual int InsertItem( wxWindow* ctrl, const wxString& label, int index ) const;
|
virtual int InsertItem( wxWindow* ctrl, const wxString& label,
|
||||||
|
int index ) const;
|
||||||
|
|
||||||
/** Deletes item from existing control.
|
/**
|
||||||
|
Deletes item from existing control.
|
||||||
Default implementation does nothing.
|
Default implementation does nothing.
|
||||||
*/
|
*/
|
||||||
virtual void DeleteItem( wxWindow* ctrl, int index ) const;
|
virtual void DeleteItem( wxWindow* ctrl, int index ) const;
|
||||||
|
|
||||||
/** Extra processing when control gains focus. For example, wxTextCtrl
|
/**
|
||||||
|
Extra processing when control gains focus. For example, wxTextCtrl
|
||||||
based controls should select all text.
|
based controls should select all text.
|
||||||
*/
|
*/
|
||||||
virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ) const;
|
virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ) const;
|
||||||
|
|
||||||
/** Returns true if control itself can contain the custom image. Default is
|
/**
|
||||||
to return false.
|
Returns @true if control itself can contain the custom image. Default
|
||||||
|
implementation returns @false.
|
||||||
*/
|
*/
|
||||||
virtual bool CanContainCustomImage() const;
|
virtual bool CanContainCustomImage() const;
|
||||||
|
|
||||||
//
|
|
||||||
// This member is public so scripting language bindings
|
|
||||||
// wrapper code can access it freely.
|
|
||||||
void* m_clientData;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
/** @class wxPGMultiButton
|
/**
|
||||||
|
@class wxPGMultiButton
|
||||||
|
|
||||||
This class can be used to have multiple buttons in a property editor.
|
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,
|
You will need to create a new property editor class, override CreateControls,
|
||||||
and have it return wxPGMultiButton instance in wxPGWindowList::SetSecondary().
|
and have it return wxPGMultiButton instance in wxPGWindowList::SetSecondary().
|
||||||
For instance, here we add three buttons to a textctrl editor:
|
|
||||||
|
For instance, here we add three buttons to a TextCtrl editor:
|
||||||
|
|
||||||
@code
|
@code
|
||||||
|
|
||||||
#include <wx/propgrid/editors.h>
|
#include <wx/propgrid/editors.h>
|
||||||
|
|
||||||
class wxMultiButtonTextCtrlEditor : public wxPGTextCtrlEditor
|
class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor
|
||||||
{
|
{
|
||||||
WX_PG_DECLARE_EDITOR_CLASS(wxMultiButtonTextCtrlEditor)
|
DECLARE_DYNAMIC_CLASS(wxSampleMultiButtonEditor)
|
||||||
public:
|
public:
|
||||||
wxMultiButtonTextCtrlEditor() {}
|
wxSampleMultiButtonEditor() {}
|
||||||
virtual ~wxMultiButtonTextCtrlEditor() {}
|
virtual ~wxSampleMultiButtonEditor() {}
|
||||||
|
|
||||||
wxPG_DECLARE_CREATECONTROLS
|
virtual wxString GetName() const { return "SampleMultiButtonEditor"; }
|
||||||
|
|
||||||
|
virtual wxPGWindowList CreateControls( wxPropertyGrid* propGrid,
|
||||||
|
wxPGProperty* property,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& sz ) const;
|
||||||
virtual bool OnEvent( wxPropertyGrid* propGrid,
|
virtual bool OnEvent( wxPropertyGrid* propGrid,
|
||||||
wxPGProperty* property,
|
wxPGProperty* property,
|
||||||
wxWindow* ctrl,
|
wxWindow* ctrl,
|
||||||
wxEvent& event ) const;
|
wxEvent& event ) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
WX_PG_IMPLEMENT_EDITOR_CLASS(MultiButtonTextCtrlEditor, wxMultiButtonTextCtrlEditor,
|
IMPLEMENT_DYNAMIC_CLASS(wxSampleMultiButtonEditor, wxPGTextCtrlEditor)
|
||||||
wxPGTextCtrlEditor)
|
|
||||||
|
|
||||||
wxPGWindowList wxMultiButtonTextCtrlEditor::CreateControls( wxPropertyGrid* propGrid,
|
wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid,
|
||||||
wxPGProperty* property,
|
wxPGProperty* property,
|
||||||
const wxPoint& pos,
|
const wxPoint& pos,
|
||||||
const wxSize& sz ) const
|
const wxSize& sz ) const
|
||||||
{
|
{
|
||||||
// Create and populate buttons-subwindow
|
// Create and populate buttons-subwindow
|
||||||
wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
|
wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
|
||||||
@@ -180,20 +203,21 @@ public:
|
|||||||
|
|
||||||
// Create the 'primary' editor control (textctrl in this case)
|
// Create the 'primary' editor control (textctrl in this case)
|
||||||
wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls
|
wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls
|
||||||
( propGrid, property, pos, buttons->GetPrimarySize() );
|
( propGrid, property, pos,
|
||||||
|
buttons->GetPrimarySize() );
|
||||||
|
|
||||||
// Finally, move buttons-subwindow to correct position and make sure
|
// Finally, move buttons-subwindow to correct position and make sure
|
||||||
// returned wxPGWindowList contains our custom button list.
|
// returned wxPGWindowList contains our custom button list.
|
||||||
buttons->FinalizePosition(pos);
|
buttons->Finalize(propGrid, pos);
|
||||||
|
|
||||||
wndList.SetSecondary( buttons );
|
wndList.SetSecondary( buttons );
|
||||||
return wndList;
|
return wndList;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxMultiButtonTextCtrlEditor::OnEvent( wxPropertyGrid* propGrid,
|
bool wxSampleMultiButtonEditor::OnEvent( wxPropertyGrid* propGrid,
|
||||||
wxPGProperty* property,
|
wxPGProperty* property,
|
||||||
wxWindow* ctrl,
|
wxWindow* ctrl,
|
||||||
wxEvent& event ) const
|
wxEvent& event ) const
|
||||||
{
|
{
|
||||||
if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
|
if ( event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED )
|
||||||
{
|
{
|
||||||
@@ -206,12 +230,12 @@ public:
|
|||||||
}
|
}
|
||||||
if ( event.GetId() == buttons->GetButtonId(1) )
|
if ( event.GetId() == buttons->GetButtonId(1) )
|
||||||
{
|
{
|
||||||
// Do something when first button is pressed
|
// Do something when second button is pressed
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if ( event.GetId() == buttons->GetButtonId(2) )
|
if ( event.GetId() == buttons->GetButtonId(2) )
|
||||||
{
|
{
|
||||||
// Do something when second button is pressed
|
// Do something when third button is pressed
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -225,13 +249,14 @@ public:
|
|||||||
@code
|
@code
|
||||||
|
|
||||||
// Register editor class - needs only to be called once
|
// Register editor class - needs only to be called once
|
||||||
wxPGRegisterEditorClass( MultiButtonTextCtrlEditor );
|
wxPGEditor* multiButtonEditor = new wxSampleMultiButtonEditor();
|
||||||
|
wxPropertyGrid::RegisterEditorClass( multiButtonEditor );
|
||||||
|
|
||||||
// Insert the property that will have multiple buttons
|
// Insert the property that will have multiple buttons
|
||||||
propGrid->Append( new wxLongStringProperty("MultipleButtons", wxPG_LABEL) );
|
propGrid->Append( new wxLongStringProperty("MultipleButtons", wxPG_LABEL) );
|
||||||
|
|
||||||
// Change property to use editor created in the previous code segment
|
// Change property to use editor created in the previous code segment
|
||||||
propGrid->SetPropertyEditor( "MultipleButtons", wxPG_EDITOR(MultiButtonTextCtrlEditor) );
|
propGrid->SetPropertyEditor( "MultipleButtons", multiButtonEditor );
|
||||||
|
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
@@ -242,35 +267,59 @@ class WXDLLIMPEXP_PROPGRID wxPGMultiButton : public wxWindow
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
Constructor.
|
||||||
|
*/
|
||||||
wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz );
|
wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz );
|
||||||
|
|
||||||
|
/**
|
||||||
|
Destructor.
|
||||||
|
*/
|
||||||
virtual ~wxPGMultiButton() { }
|
virtual ~wxPGMultiButton() { }
|
||||||
|
|
||||||
wxWindow* GetButton( unsigned int i ) { return (wxWindow*) m_buttons[i]; }
|
/**
|
||||||
const wxWindow* GetButton( unsigned int i ) const { return (const wxWindow*) m_buttons[i]; }
|
Adds new button, with given label.
|
||||||
|
|
||||||
/** Utility function to be used in event handlers.
|
|
||||||
*/
|
*/
|
||||||
int GetButtonId( unsigned int i ) const { return GetButton(i)->GetId(); }
|
|
||||||
|
|
||||||
/** Returns number of buttons.
|
|
||||||
*/
|
|
||||||
int GetCount() const { return m_buttons.Count(); }
|
|
||||||
|
|
||||||
void Add( const wxString& label, int id = -2 );
|
void Add( const wxString& label, int id = -2 );
|
||||||
|
|
||||||
|
/**
|
||||||
|
Adds new bitmap button.
|
||||||
|
*/
|
||||||
void Add( const wxBitmap& bitmap, int id = -2 );
|
void Add( const wxBitmap& bitmap, int id = -2 );
|
||||||
|
|
||||||
wxSize GetPrimarySize() const
|
/**
|
||||||
{
|
Call this in CreateControls() of your custom editor class
|
||||||
return wxSize(m_fullEditorSize.x - m_buttonsWidth, m_fullEditorSize.y);
|
after all buttons have been added.
|
||||||
}
|
|
||||||
|
|
||||||
void FinalizePosition( const wxPoint& pos )
|
@param propGrid
|
||||||
{
|
wxPropertyGrid given in CreateControls().
|
||||||
Move( pos.x + m_fullEditorSize.x - m_buttonsWidth, pos.y );
|
|
||||||
}
|
@param pos
|
||||||
|
wxPoint given in CreateControls().
|
||||||
|
*/
|
||||||
|
void Finalize( wxPropertyGrid* propGrid, const wxPoint& pos );
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns pointer to one of the buttons.
|
||||||
|
*/
|
||||||
|
wxWindow* GetButton( unsigned int i );
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns Id of one of the buttons. This is utility function to be
|
||||||
|
used in event handlers.
|
||||||
|
*/
|
||||||
|
int GetButtonId( unsigned int i ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns number of buttons.
|
||||||
|
*/
|
||||||
|
int GetCount();
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns size of primary editor control, as appropriately
|
||||||
|
reduced by number of buttons present.
|
||||||
|
*/
|
||||||
|
wxSize GetPrimarySize() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
#endif // _WX_PROPGRID_EDITORS_H_
|
|
||||||
|
@@ -80,22 +80,24 @@
|
|||||||
|
|
||||||
class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor
|
class wxSampleMultiButtonEditor : public wxPGTextCtrlEditor
|
||||||
{
|
{
|
||||||
WX_PG_DECLARE_EDITOR_CLASS(wxSampleMultiButtonEditor)
|
DECLARE_DYNAMIC_CLASS(wxSampleMultiButtonEditor)
|
||||||
public:
|
public:
|
||||||
wxSampleMultiButtonEditor() {}
|
wxSampleMultiButtonEditor() {}
|
||||||
virtual ~wxSampleMultiButtonEditor() {}
|
virtual ~wxSampleMultiButtonEditor() {}
|
||||||
|
|
||||||
wxPG_DECLARE_CREATECONTROLS
|
virtual wxString GetName() const { return "SampleMultiButtonEditor"; }
|
||||||
|
|
||||||
|
virtual wxPGWindowList CreateControls( wxPropertyGrid* propGrid,
|
||||||
|
wxPGProperty* property,
|
||||||
|
const wxPoint& pos,
|
||||||
|
const wxSize& sz ) const;
|
||||||
virtual bool OnEvent( wxPropertyGrid* propGrid,
|
virtual bool OnEvent( wxPropertyGrid* propGrid,
|
||||||
wxPGProperty* property,
|
wxPGProperty* property,
|
||||||
wxWindow* ctrl,
|
wxWindow* ctrl,
|
||||||
wxEvent& event ) const;
|
wxEvent& event ) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
WX_PG_IMPLEMENT_EDITOR_CLASS(SampleMultiButtonEditor,wxSampleMultiButtonEditor,
|
IMPLEMENT_DYNAMIC_CLASS(wxSampleMultiButtonEditor, wxPGTextCtrlEditor)
|
||||||
wxPGTextCtrlEditor)
|
|
||||||
|
|
||||||
|
|
||||||
wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid,
|
wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGrid,
|
||||||
wxPGProperty* property,
|
wxPGProperty* property,
|
||||||
@@ -105,19 +107,20 @@ wxPGWindowList wxSampleMultiButtonEditor::CreateControls( wxPropertyGrid* propGr
|
|||||||
// Create and populate buttons-subwindow
|
// Create and populate buttons-subwindow
|
||||||
wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
|
wxPGMultiButton* buttons = new wxPGMultiButton( propGrid, sz );
|
||||||
|
|
||||||
|
// Add two regular buttons
|
||||||
buttons->Add( "..." );
|
buttons->Add( "..." );
|
||||||
buttons->Add( "A" );
|
buttons->Add( "A" );
|
||||||
#if wxUSE_BMPBUTTON
|
// Add a bitmap button
|
||||||
buttons->Add( wxArtProvider::GetBitmap(wxART_FOLDER) );
|
buttons->Add( wxArtProvider::GetBitmap(wxART_FOLDER) );
|
||||||
#endif
|
|
||||||
|
|
||||||
// Create the 'primary' editor control (textctrl in this case)
|
// Create the 'primary' editor control (textctrl in this case)
|
||||||
wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls
|
wxPGWindowList wndList = wxPGTextCtrlEditor::CreateControls
|
||||||
( propGrid, property, pos, buttons->GetPrimarySize() );
|
( propGrid, property, pos,
|
||||||
|
buttons->GetPrimarySize() );
|
||||||
|
|
||||||
// Finally, move buttons-subwindow to correct position and make sure
|
// Finally, move buttons-subwindow to correct position and make sure
|
||||||
// returned wxPGWindowList contains our custom button list.
|
// returned wxPGWindowList contains our custom button list.
|
||||||
buttons->FinalizePosition(pos);
|
buttons->Finalize(propGrid, pos);
|
||||||
|
|
||||||
wndList.SetSecondary( buttons );
|
wndList.SetSecondary( buttons );
|
||||||
return wndList;
|
return wndList;
|
||||||
@@ -132,14 +135,22 @@ bool wxSampleMultiButtonEditor::OnEvent( wxPropertyGrid* propGrid,
|
|||||||
{
|
{
|
||||||
wxPGMultiButton* buttons = (wxPGMultiButton*) propGrid->GetEditorControlSecondary();
|
wxPGMultiButton* buttons = (wxPGMultiButton*) propGrid->GetEditorControlSecondary();
|
||||||
|
|
||||||
|
if ( event.GetId() == buttons->GetButtonId(0) )
|
||||||
|
{
|
||||||
|
// Do something when first button is pressed
|
||||||
|
wxLogDebug("First button pressed");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if ( event.GetId() == buttons->GetButtonId(1) )
|
if ( event.GetId() == buttons->GetButtonId(1) )
|
||||||
{
|
{
|
||||||
wxMessageBox(wxT("Second button was pressed"));
|
// Do something when second button is pressed
|
||||||
|
wxLogDebug("Second button pressed");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if ( event.GetId() == buttons->GetButtonId(2) )
|
if ( event.GetId() == buttons->GetButtonId(2) )
|
||||||
{
|
{
|
||||||
wxMessageBox(wxT("Third button was pressed"));
|
// Do something when third button is pressed
|
||||||
|
wxLogDebug("Third button pressed");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1655,9 +1666,10 @@ void FormMain::PopulateWithExamples ()
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Test wxSampleMultiButtonEditor
|
// Test wxSampleMultiButtonEditor
|
||||||
wxPGRegisterEditorClass( SampleMultiButtonEditor );
|
wxPGEditor* pSampleMultiButtonEditor = new wxSampleMultiButtonEditor();
|
||||||
|
wxPropertyGrid::RegisterEditorClass(pSampleMultiButtonEditor);
|
||||||
pg->Append( new wxLongStringProperty(wxT("MultipleButtons"), wxPG_LABEL) );
|
pg->Append( new wxLongStringProperty(wxT("MultipleButtons"), wxPG_LABEL) );
|
||||||
pg->SetPropertyEditor(wxT("MultipleButtons"), wxPG_EDITOR(SampleMultiButtonEditor) );
|
pg->SetPropertyEditor(wxT("MultipleButtons"), pSampleMultiButtonEditor );
|
||||||
|
|
||||||
// Test SingleChoiceProperty
|
// Test SingleChoiceProperty
|
||||||
pg->Append( new SingleChoiceProperty(wxT("SingleChoiceProperty")) );
|
pg->Append( new SingleChoiceProperty(wxT("SingleChoiceProperty")) );
|
||||||
|
@@ -2136,6 +2136,19 @@ wxPGMultiButton::wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz )
|
|||||||
SetBackgroundColour(pg->GetCellBackgroundColour());
|
SetBackgroundColour(pg->GetCellBackgroundColour());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxPGMultiButton::Finalize( wxPropertyGrid* propGrid, const wxPoint& pos )
|
||||||
|
{
|
||||||
|
Move( pos.x + m_fullEditorSize.x - m_buttonsWidth, pos.y );
|
||||||
|
|
||||||
|
// Connect event handling
|
||||||
|
for ( int i=0; i<GetCount(); i++ )
|
||||||
|
{
|
||||||
|
wxWindowID id = GetButtonId(i);
|
||||||
|
propGrid->Connect(id, wxEVT_COMMAND_BUTTON_CLICKED,
|
||||||
|
wxCommandEventHandler(wxPropertyGrid::OnCustomEditorEvent));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int wxPGMultiButton::GenId( int id ) const
|
int wxPGMultiButton::GenId( int id ) const
|
||||||
{
|
{
|
||||||
if ( id < -1 )
|
if ( id < -1 )
|
||||||
|
@@ -5528,18 +5528,18 @@ void wxPropertyGrid::OnCaptureChange( wxMouseCaptureChangedEvent& WXUNUSED(event
|
|||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
// noDefCheck = true prevents infinite recursion.
|
// noDefCheck = true prevents infinite recursion.
|
||||||
wxPGEditor* wxPropertyGrid::RegisterEditorClass( wxPGEditor* editorclass,
|
wxPGEditor* wxPropertyGrid::RegisterEditorClass( wxPGEditor* editorClass,
|
||||||
const wxString& name,
|
|
||||||
bool noDefCheck )
|
bool noDefCheck )
|
||||||
{
|
{
|
||||||
wxASSERT( editorclass );
|
wxASSERT( editorClass );
|
||||||
|
|
||||||
if ( !noDefCheck && wxPGGlobalVars->m_mapEditorClasses.empty() )
|
if ( !noDefCheck && wxPGGlobalVars->m_mapEditorClasses.empty() )
|
||||||
RegisterDefaultEditors();
|
RegisterDefaultEditors();
|
||||||
|
|
||||||
wxPGGlobalVars->m_mapEditorClasses[name] = (void*)editorclass;
|
wxString name = editorClass->GetName();
|
||||||
|
wxPGGlobalVars->m_mapEditorClasses[name] = (void*)editorClass;
|
||||||
|
|
||||||
return editorclass;
|
return editorClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Registers all default editor classes
|
// Registers all default editor classes
|
||||||
|
Reference in New Issue
Block a user