X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Feditable_list.h;h=731434186001cb5d220b08d58b0d6dcc27350202;hb=162901a5cb0b5be55e2d64ecbf98ed92265dc234;hp=32cc326b69b4fbc2949642690c1920dec8e00ae6;hpb=74a8d26a8907c6e00e29f054178a3425f44e38ed;p=dcpomatic.git diff --git a/src/wx/editable_list.h b/src/wx/editable_list.h index 32cc326b6..731434186 100644 --- a/src/wx/editable_list.h +++ b/src/wx/editable_list.h @@ -26,9 +26,9 @@ public: EditableList ( wxWindow* parent, std::vector columns, - boost::function > ()> get, - boost::function >)> set, - boost::function, int)> column + boost::function ()> get, + boost::function)> set, + boost::function column ) : wxPanel (parent) , _get (get) @@ -66,8 +66,8 @@ public: table->Add (s, 0); } - std::vector > current = _get (); - for (typename std::vector >::iterator i = current.begin (); i != current.end(); ++i) { + std::vector current = _get (); + for (typename std::vector::iterator i = current.begin (); i != current.end(); ++i) { add_to_control (*i); } @@ -77,10 +77,14 @@ public: _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)); selection_changed (); + } - void add_to_control (boost::shared_ptr item) +private: + + void add_to_control (T item) { wxListItem list_item; int const n = _list->GetItemCount (); @@ -101,15 +105,18 @@ public: void add_clicked () { - boost::shared_ptr new_item (new T); - S* dialog = new S (this, new_item); + T new_item; + S* dialog = new S (this); + dialog->set (new_item); dialog->ShowModal (); - dialog->Destroy (); - add_to_control (new_item); - std::vector > all = _get (); - all.push_back (new_item); + add_to_control (dialog->get ()); + + std::vector all = _get (); + all.push_back (dialog->get ()); _set (all); + + dialog->Destroy (); } void edit_clicked () @@ -119,35 +126,50 @@ public: return; } - std::vector > all = _get (); + std::vector all = _get (); assert (item >= 0 && item < int (all.size ())); - S* dialog = new S (this, all[item]); + 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 () { int i = _list->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); - if (i >= 0) { - _list->DeleteItem (i); + if (i == -1) { + return; } - std::vector > all = _get (); + _list->DeleteItem (i); + std::vector all = _get (); all.erase (all.begin() + i); _set (all); + + selection_changed (); } -private: - boost::function > ()> _get; - boost::function >)> _set; + void resized (wxSizeEvent& ev) + { + int const w = GetSize().GetWidth() / _columns; + for (int i = 0; i < _columns; ++i) { + _list->SetColumnWidth (i, w); + } + ev.Skip (); + } + + boost::function ()> _get; + boost::function )> _set; int _columns; - boost::function, int)> _column; + boost::function _column; wxButton* _add; wxButton* _edit;