X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_widget.h;h=34755e4b5a7e1707b710f45487bc9cdf4934dfd3;hb=8eaf36467713e7ba9a1a2272a44aa1581e31c1b0;hp=49dceef8ef9e4ae556ffa19f1528e4a0002aec9f;hpb=65b331d32c383f3a9049f29bf03ab3fe3193b31a;p=dcpomatic.git diff --git a/src/wx/content_widget.h b/src/wx/content_widget.h index 49dceef8e..34755e4b5 100644 --- a/src/wx/content_widget.h +++ b/src/wx/content_widget.h @@ -1,19 +1,20 @@ /* Copyright (C) 2013-2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ @@ -29,7 +30,6 @@ #include #include #include -#include #include /** @class ContentWidget @@ -42,24 +42,29 @@ * @param V Data type of state as used by the view. */ template -class ContentWidget : public boost::noncopyable +class ContentWidget { public: /** @param parent Parent window. * @param wrapped Control widget that we are wrapping. * @param property ContentProperty that the widget is handling. + * @param part Part of Content that the property is in (e.g. &Content::video) * @param model_getter Function on the Content to get the value. * @param model_setter Function on the Content to set the value. + * @param view_changed Function called when the view has changed; useful for linking controls. + * @param view_to_model Function to convert a view value to a model value. + * @param model_to_view Function to convert a model value to a view value. */ ContentWidget ( wxWindow* parent, T* wrapped, int property, - boost::function (Content*)> part, - boost::function model_getter, - boost::function model_setter, - boost::function view_to_model, - boost::function model_to_view + std::function (Content*)> part, + std::function model_getter, + std::function model_setter, + std::function view_changed, + std::function view_to_model, + std::function model_to_view ) : _wrapped (wrapped) , _sizer (0) @@ -68,6 +73,7 @@ public: , _part (part) , _model_getter (model_getter) , _model_setter (model_setter) + , _view_changed (view_changed) , _view_to_model (view_to_model) , _model_to_view (model_to_view) , _ignore_model_changes (false) @@ -77,13 +83,16 @@ public: _button->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&ContentWidget::button_clicked, this)); } + ContentWidget (ContentWidget const&) = delete; + ContentWidget& operator= (ContentWidget const&) = delete; + /** @return the widget that we are wrapping */ T* wrapped () const { return _wrapped; } - typedef std::vector > List; + typedef std::vector > List; /** Set the content that this control is working on (i.e. the selected content) */ void set_content (List content) @@ -101,17 +110,21 @@ public: update_from_model (); for (typename List::iterator i = _content.begin(); i != _content.end(); ++i) { - _connections.push_back ((*i)->Changed.connect (boost::bind (&ContentWidget::model_changed, this, _2))); +#if BOOST_VERSION >= 106100 + _connections.push_back ((*i)->Change.connect (boost::bind (&ContentWidget::model_changed, this, boost::placeholders::_1, boost::placeholders::_3))); +#else + _connections.push_back ((*i)->Change.connect (boost::bind (&ContentWidget::model_changed, this, _1, _3))); +#endif } } /** Add this widget to a wxGridBagSizer */ - void add (wxGridBagSizer* sizer, wxGBPosition position, wxGBSpan span = wxDefaultSpan) + void add (wxGridBagSizer* sizer, wxGBPosition position, wxGBSpan span = wxDefaultSpan, int flag = 0) { _sizer = sizer; _position = position; _span = span; - _sizer->Add (_wrapped, _position, _span); + _sizer->Add (_wrapped, _position, _span, flag); } /** Update the view from the model */ @@ -142,14 +155,22 @@ public: for (size_t i = 0; i < _content.size(); ++i) { boost::bind (_model_setter, _part (_content[i].get()).get(), _view_to_model (wx_get (_wrapped))) (); } + if (_view_changed) { + _view_changed (); + } _ignore_model_changes = false; } + void show (bool s) + { + _wrapped->Show (s); + } + private: void set_single () { - if (_wrapped->IsShown ()) { + if (_wrapped->IsShown() || !_sizer) { return; } @@ -162,7 +183,7 @@ private: void set_multiple () { - if (_button->IsShown ()) { + if (_button->IsShown() || !_sizer) { return; } @@ -176,14 +197,14 @@ private: void button_clicked () { U const v = boost::bind (_model_getter, _part(_content.front().get()).get())(); - for (typename List::iterator i = _content.begin (); i != _content.end(); ++i) { - boost::bind (_model_setter, _part(i->get()).get(), v) (); + for (auto const& i: _content) { + boost::bind (_model_setter, _part(i.get()).get(), v)(); } } - void model_changed (int property) + void model_changed (ChangeType type, int property) { - if (property == _property && !_ignore_model_changes) { + if (type == ChangeType::DONE && property == _property && !_ignore_model_changes) { update_from_model (); } } @@ -195,11 +216,12 @@ private: wxButton* _button; List _content; int _property; - boost::function (Content *)> _part; - boost::function _model_getter; - boost::function _model_setter; - boost::function _view_to_model; - boost::function _model_to_view; + std::function (Content *)> _part; + std::function _model_getter; + std::function _model_setter; + std::function _view_changed; + std::function _view_to_model; + std::function _model_to_view; std::list _connections; bool _ignore_model_changes; }; @@ -218,9 +240,10 @@ public: wxWindow* parent, wxSpinCtrl* wrapped, int property, - boost::function (Content *)> part, - boost::function getter, - boost::function setter + std::function (Content *)> part, + std::function getter, + std::function setter, + std::function view_changed = std::function() ) : ContentWidget ( parent, @@ -228,6 +251,7 @@ public: property, part, getter, setter, + view_changed, &caster, &caster ) @@ -244,9 +268,10 @@ public: wxWindow* parent, wxSpinCtrlDouble* wrapped, int property, - boost::function (Content *)> part, - boost::function getter, - boost::function setter + std::function (Content *)> part, + std::function getter, + std::function setter, + std::function view_changed = std::function() ) : ContentWidget ( parent, @@ -254,6 +279,7 @@ public: property, part, getter, setter, + view_changed, &caster, &caster ) @@ -270,11 +296,12 @@ public: wxWindow* parent, wxChoice* wrapped, int property, - boost::function (Content *)> part, - boost::function getter, - boost::function setter, - boost::function view_to_model, - boost::function model_to_view + std::function (Content *)> part, + std::function getter, + std::function setter, + std::function view_to_model, + std::function model_to_view, + std::function view_changed = std::function() ) : ContentWidget ( parent, @@ -283,6 +310,7 @@ public: part, getter, setter, + view_changed, view_to_model, model_to_view )