X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fwx%2Feditable_list.h;h=681588215f539a28457caed75a4250218b2b7316;hb=ff40ecd114547a2fc07bc49403c993c3fa5d40cc;hp=ffaadc1823d16bf3855989e426b29ea4baf726c9;hpb=94b63f777e0a1625e557f7fd6f19aaf920b18332;p=dcpomatic.git diff --git a/src/wx/editable_list.h b/src/wx/editable_list.h index ffaadc182..681588215 100644 --- a/src/wx/editable_list.h +++ b/src/wx/editable_list.h @@ -1,22 +1,26 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-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 . */ +#ifndef DCPOMATIC_EDITABLE_LIST_H +#define DCPOMATIC_EDITABLE_LIST_H + #include "wx_util.h" #include #include @@ -36,22 +40,24 @@ public: boost::function ()> get, boost::function)> set, boost::function column, - int height = 100 + bool can_edit = true, + bool title = true ) : wxPanel (parent) , _get (get) , _set (set) , _columns (columns.size ()) , _column (column) + , _edit (0) { - wxBoxSizer* s = new wxBoxSizer (wxVERTICAL); - SetSizer (s); - - wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); - table->AddGrowableCol (0, 1); - s->Add (table, 1, wxEXPAND); + _sizer = new wxBoxSizer (wxHORIZONTAL); + SetSizer (_sizer); - _list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (columns.size() * 200, height), wxLC_REPORT | wxLC_SINGLE_SEL); + long style = wxLC_REPORT | wxLC_SINGLE_SEL; + if (title) { + style |= wxLC_NO_HEADER; + } + _list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (columns.size() * 200, 100), style); for (size_t i = 0; i < columns.size(); ++i) { wxListItem ip; @@ -61,21 +67,25 @@ public: _list->InsertColumn (i, ip); } - table->Add (_list, 1, wxEXPAND | wxALL); + _sizer->Add (_list, 1, wxEXPAND); { wxSizer* s = new wxBoxSizer (wxVERTICAL); _add = new wxButton (this, wxID_ANY, _("Add...")); s->Add (_add, 0, wxTOP | wxBOTTOM, 2); - _edit = new wxButton (this, wxID_ANY, _("Edit...")); - s->Add (_edit, 0, wxTOP | wxBOTTOM, 2); + if (can_edit) { + _edit = new wxButton (this, wxID_ANY, _("Edit...")); + s->Add (_edit, 0, wxTOP | wxBOTTOM, 2); + } _remove = new wxButton (this, wxID_ANY, _("Remove")); s->Add (_remove, 0, wxTOP | wxBOTTOM, 2); - table->Add (s, 0); + _sizer->Add (s, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP); } _add->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::add_clicked, this)); - _edit->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::edit_clicked, this)); + if (_edit) { + _edit->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::edit_clicked, this)); + } _remove->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::remove_clicked, this)); _list->Bind (wxEVT_COMMAND_LIST_ITEM_SELECTED, boost::bind (&EditableList::selection_changed, this)); @@ -96,6 +106,25 @@ public: } } + boost::optional selection () const + { + int item = _list->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + if (item == -1) { + return boost::optional (); + } + + std::vector all = _get (); + DCPOMATIC_ASSERT (item >= 0 && item < int (all.size ())); + return all[item]; + } + + void layout () + { + _sizer->Layout (); + } + + boost::signals2::signal SelectionChanged; + private: void add_to_control (T item) @@ -113,21 +142,26 @@ private: void selection_changed () { int const i = _list->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); - _edit->Enable (i >= 0); + if (_edit) { + _edit->Enable (i >= 0); + } _remove->Enable (i >= 0); + + SelectionChanged (); } void add_clicked () { - T new_item; S* dialog = new S (this); - dialog->set (new_item); if (dialog->ShowModal() == wxID_OK) { - add_to_control (dialog->get ()); - std::vector all = _get (); - all.push_back (dialog->get ()); - _set (all); + boost::optional const v = dialog->get (); + if (v) { + add_to_control (v.get ()); + std::vector all = _get (); + all.push_back (v.get ()); + _set (all); + } } dialog->Destroy (); @@ -146,7 +180,12 @@ private: S* dialog = new S (this); dialog->set (all[item]); if (dialog->ShowModal() == wxID_OK) { - all[item] = dialog->get (); + boost::optional const v = dialog->get (); + if (!v) { + return; + } + + all[item] = v.get (); } dialog->Destroy (); @@ -190,4 +229,7 @@ private: wxButton* _edit; wxButton* _remove; wxListCtrl* _list; + wxBoxSizer* _sizer; }; + +#endif