1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#pragma once
#include "ComponentEditor.h"
#include <wx/panel.h>
#include <wx/sizer.h>
#include <stdexcept>
#include <functional>
namespace objectives
{
namespace ce
{
/**
* greebo: Common base class for all component editor implementations.
* This base class implements the required getWidget() method, returning a panel.
*/
class ComponentEditorBase :
public ComponentEditor
{
protected:
wxPanel* _panel;
bool _active; // whether writeToComponent is active
// Constructors may only be used by subclasses
ComponentEditorBase() :
_panel(nullptr),
_active(false)
{}
ComponentEditorBase(wxWindow* parent) :
_panel(new wxPanel(parent, wxID_ANY)),
_active(false)
{
_panel->SetSizer(new wxBoxSizer(wxVERTICAL));
}
public:
virtual ~ComponentEditorBase()
{
// When destroyed, remove the panel from its parent
delete _panel;
_panel = nullptr;
}
virtual wxWindow* getWidget() override
{
if (_panel == nullptr)
{
throw std::runtime_error("Cannot pack a ComponentEditor created by its default constructor!");
}
return _panel;
}
virtual void setActive(bool active) override
{
_active = active;
}
protected:
// Shortcut used by subclasses to acquire a bind to to the onChange() method
std::function<void()> getChangeCallback()
{
return std::bind(&ComponentEditorBase::onChange, this);
}
// When anything changes, just trigger the writeToComponent callback,
// the Component will be updated and in turn fires its changed signal.
void onChange()
{
if (_active)
{
this->writeToComponent();
}
}
};
}
}
|