X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Feditable_list.h;h=bb749a4a44bc76a2de44cd5dc61b7b6b5351e734;hb=df89a39cfd34d0d70609daa214d3b618bb6223bd;hp=98e7d0bfd64509ba503db48cba2a8db9113bb6bf;hpb=0ae99c6e3a72e9c8eb620e0707ee3d6f356207dc;p=dcpomatic.git diff --git a/src/wx/editable_list.h b/src/wx/editable_list.h index 98e7d0bfd..bb749a4a4 100644 --- a/src/wx/editable_list.h +++ b/src/wx/editable_list.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012 Carl Hetherington + Copyright (C) 2012-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,8 +17,15 @@ */ +#include "wx_util.h" #include +#include +#include +#include +/** @param T type of things being edited. + * @param S dialog to edit a thing. + */ template class EditableList : public wxPanel { @@ -28,7 +35,8 @@ public: std::vector columns, boost::function ()> get, boost::function)> set, - boost::function column + boost::function column, + int height = 100 ) : wxPanel (parent) , _get (get) @@ -41,9 +49,9 @@ public: wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); table->AddGrowableCol (0, 1); - s->Add (table, 1, wxALL | wxEXPAND, 8); + s->Add (table, 1, wxEXPAND); - _list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (columns.size() * 200, 100), wxLC_REPORT | wxLC_SINGLE_SEL); + _list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (columns.size() * 200, height), wxLC_REPORT | wxLC_SINGLE_SEL); for (size_t i = 0; i < columns.size(); ++i) { wxListItem ip; @@ -59,6 +67,8 @@ public: wxSizer* s = new wxBoxSizer (wxVERTICAL); _add = new wxButton (this, wxID_ANY, _("Add...")); s->Add (_add, 0, wxTOP | wxBOTTOM, 2); + _copy = new wxButton (this, wxID_ANY, _("Copy...")); + s->Add (_copy, 0, wxTOP | wxBOTTOM, 2); _edit = new wxButton (this, wxID_ANY, _("Edit...")); s->Add (_edit, 0, wxTOP | wxBOTTOM, 2); _remove = new wxButton (this, wxID_ANY, _("Remove")); @@ -66,23 +76,30 @@ public: table->Add (s, 0); } - std::vector current = _get (); - for (typename std::vector::iterator i = current.begin (); i != current.end(); ++i) { - add_to_control (*i); - } - _add->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::add_clicked, this)); + _copy->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::copy_clicked, this)); _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)); _list->Bind (wxEVT_COMMAND_LIST_ITEM_DESELECTED, boost::bind (&EditableList::selection_changed, this)); _list->Bind (wxEVT_SIZE, boost::bind (&EditableList::resized, this, _1)); + + refresh (); selection_changed (); + } + + void refresh () + { + _list->DeleteAllItems (); + std::vector current = _get (); + for (typename std::vector::iterator i = current.begin (); i != current.end(); ++i) { + add_to_control (*i); + } } -private: +private: void add_to_control (T item) { @@ -111,14 +128,31 @@ private: dialog->ShowModal (); add_to_control (dialog->get ()); - + std::vector all = _get (); all.push_back (dialog->get ()); _set (all); - + dialog->Destroy (); } + void copy_clicked () + { + int item = _list->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + if (item == -1) { + return; + } + + std::vector all = _get (); + DCPOMATIC_ASSERT (item >= 0 && item < int (all.size ())); + + T copy (all[item]); + add_to_control (copy); + + all.push_back (copy); + _set (all); + } + void edit_clicked () { int item = _list->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); @@ -127,17 +161,19 @@ private: } std::vector all = _get (); - assert (item >= 0 && item < int (all.size ())); + DCPOMATIC_ASSERT (item >= 0 && item < int (all.size ())); S* dialog = new S (this); dialog->set (all[item]); dialog->ShowModal (); all[item] = dialog->get (); dialog->Destroy (); - + for (int i = 0; i < _columns; ++i) { _list->SetItem (item, i, std_to_wx (_column (all[item], i))); } + + _set (all); } void remove_clicked () @@ -146,7 +182,7 @@ private: if (i == -1) { return; } - + _list->DeleteItem (i); std::vector all = _get (); all.erase (all.begin() + i); @@ -170,6 +206,7 @@ private: boost::function _column; wxButton* _add; + wxButton* _copy; wxButton* _edit; wxButton* _remove; wxListCtrl* _list;