summaryrefslogtreecommitdiff
path: root/src/wx/content_widget.h
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-11-14 13:40:35 +0000
committerCarl Hetherington <cth@carlh.net>2013-11-14 13:40:35 +0000
commitb1e4b53ed5b674bb3b65390eba4c04873a8b9ec7 (patch)
tree9f3171a9290f1b6421ad284d6286b8d3da22c37a /src/wx/content_widget.h
parentd99ca0a95e61b53105f765497bc465a7420e7a47 (diff)
Add ratio control to multi-select.
Diffstat (limited to 'src/wx/content_widget.h')
-rw-r--r--src/wx/content_widget.h68
1 files changed, 55 insertions, 13 deletions
diff --git a/src/wx/content_widget.h b/src/wx/content_widget.h
index 07abc7cbd..30501c1a9 100644
--- a/src/wx/content_widget.h
+++ b/src/wx/content_widget.h
@@ -50,7 +50,8 @@ public:
int property,
boost::function<U (S*)> model_getter,
boost::function<void (S*, U)> model_setter,
- boost::function<V (T*)> view_getter
+ boost::function<U (V)> view_to_model,
+ boost::function<V (U)> model_to_view
)
: _wrapped (wrapped)
, _sizer (0)
@@ -58,7 +59,8 @@ public:
, _property (property)
, _model_getter (model_getter)
, _model_setter (model_setter)
- , _view_getter (view_getter)
+ , _view_to_model (view_to_model)
+ , _model_to_view (model_to_view)
, _ignore_model_changes (false)
{
_button->SetToolTip (_("Click the button to set all selected content to the same value."));
@@ -66,12 +68,15 @@ public:
_button->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ContentWidget::button_clicked, this));
}
- T* wrapped () const {
+ /** @return the widget that we are wrapping */
+ T* wrapped () const
+ {
return _wrapped;
}
typedef std::vector<boost::shared_ptr<S> > List;
+ /** Set the content that this control is working on (i.e. the selected content) */
void set_content (List content)
{
for (typename std::list<boost::signals2::connection>::iterator i = _connections.begin(); i != _connections.end(); ++i) {
@@ -91,6 +96,7 @@ public:
}
}
+ /** Add this widget to a wxGridBagSizer */
void add (wxGridBagSizer* sizer, wxGBPosition position)
{
_sizer = sizer;
@@ -98,6 +104,7 @@ public:
_sizer->Add (_wrapped, _position);
}
+ /** Update the view from the model */
void update_from_model ()
{
if (_content.empty ()) {
@@ -113,7 +120,7 @@ public:
if (i == _content.end ()) {
set_single ();
- checked_set (_wrapped, v);
+ checked_set (_wrapped, _model_to_view (v));
} else {
set_multiple ();
}
@@ -121,11 +128,11 @@ public:
void view_changed ()
{
+ _ignore_model_changes = true;
for (size_t i = 0; i < _content.size(); ++i) {
- /* Only update our view on the last time round this loop */
- _ignore_model_changes = i < (_content.size() - 1);
- boost::bind (_model_setter, _content[i].get(), static_cast<U> (boost::bind (_view_getter, _wrapped)()))();
+ boost::bind (_model_setter, _content[i].get(), _view_to_model (wx_get (_wrapped))) ();
}
+ _ignore_model_changes = false;
}
private:
@@ -179,29 +186,64 @@ private:
int _property;
boost::function<U (S*)> _model_getter;
boost::function<void (S*, U)> _model_setter;
- boost::function<V (T*)> _view_getter;
+ boost::function<U (V)> _view_to_model;
+ boost::function<V (U)> _model_to_view;
std::list<boost::signals2::connection> _connections;
bool _ignore_model_changes;
};
+template <typename U, typename V>
+V caster (U x)
+{
+ return static_cast<V> (x);
+}
+
template <class S>
class ContentSpinCtrl : public ContentWidget<S, wxSpinCtrl, int, int>
{
public:
- ContentSpinCtrl (wxWindow* parent, wxSpinCtrl* wrapped, int property, boost::function<int (S*)> getter, boost::function<void (S*, int)> setter)
- : ContentWidget<S, wxSpinCtrl, int, int> (parent, wrapped, property, getter, setter, boost::mem_fn (&wxSpinCtrl::GetValue))
+ ContentSpinCtrl (
+ wxWindow* parent,
+ wxSpinCtrl* wrapped,
+ int property,
+ boost::function<int (S*)> getter,
+ boost::function<void (S*, int)> setter
+ )
+ : ContentWidget<S, wxSpinCtrl, int, int> (
+ parent,
+ wrapped,
+ property,
+ getter, setter,
+ &caster<int, int>,
+ &caster<int, int>
+ )
{
wrapped->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&ContentWidget<S, wxSpinCtrl, int, int>::view_changed, this));
}
-
};
template <class S, class U>
class ContentChoice : public ContentWidget<S, wxChoice, U, int>
{
public:
- ContentChoice (wxWindow* parent, wxChoice* wrapped, int property, boost::function<U (S*)> getter, boost::function<void (S*, U)> setter)
- : ContentWidget<S, wxChoice, U, int> (parent, wrapped, property, getter, setter, boost::mem_fn (&wxChoice::GetSelection))
+ ContentChoice (
+ wxWindow* parent,
+ wxChoice* wrapped,
+ int property,
+ boost::function<U (S*)> getter,
+ boost::function<void (S*, U)> setter,
+ boost::function<U (int)> view_to_model,
+ boost::function<int (U)> model_to_view
+ )
+ : ContentWidget<S, wxChoice, U, int> (
+ parent,
+ wrapped,
+ property,
+ getter,
+ setter,
+ view_to_model,
+ model_to_view
+ )
{
wrapped->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&ContentWidget<S, wxChoice, U, int>::view_changed, this));
}