X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Feditable_list.h;h=902d1ccbbf213e7c53288cd1066579de58222348;hb=ed0b5670e65647a9f0555ed66f81125678d193a7;hp=56c3a946379cedfa99ef19da832327eda7597291;hpb=3c29aa6531a4046a8db72dcac81189eb8893233c;p=dcpomatic.git diff --git a/src/wx/editable_list.h b/src/wx/editable_list.h index 56c3a9463..902d1ccbb 100644 --- a/src/wx/editable_list.h +++ b/src/wx/editable_list.h @@ -52,6 +52,22 @@ public: bool growable; }; + +namespace EditableListButton +{ + static int constexpr NEW = 0x1; + static int constexpr EDIT = 0x2; + static int constexpr REMOVE = 0x4; +}; + + +enum class EditableListTitle +{ + VISIBLE, + INVISIBLE +}; + + /** @param T type of things being edited. * @param S dialog to edit a thing. * @param get Function to get a std::vector of the things being edited. @@ -68,22 +84,21 @@ public: std::function ()> get, std::function)> set, std::function column, - bool can_edit = true, - bool title = true + EditableListTitle title, + int buttons ) : wxPanel (parent) , _get (get) , _set (set) , _columns (columns) , _column (column) - , _edit (0) , _default_width (200) { _sizer = new wxBoxSizer (wxHORIZONTAL); SetSizer (_sizer); long style = wxLC_REPORT | wxLC_SINGLE_SEL; - if (!title) { + if (title == EditableListTitle::INVISIBLE) { style |= wxLC_NO_HEADER; } @@ -96,9 +111,9 @@ public: /* With the GTK3 backend wxListCtrls are hard to pick out from the background of the * window, so put a border in to help. */ - wxPanel* border = new wxPanel (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxBORDER_THEME); + auto border = new wxPanel (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxBORDER_THEME); _list = new wxListCtrl (border, wxID_ANY, wxDefaultPosition, wxSize(total_width, 100), style); - wxBoxSizer* border_sizer = new wxBoxSizer (wxHORIZONTAL); + auto border_sizer = new wxBoxSizer (wxHORIZONTAL); border_sizer->Add (_list, 1, wxALL | wxEXPAND, 2); border->SetSizer (border_sizer); #else @@ -121,23 +136,31 @@ public: #endif { - wxSizer* s = new wxBoxSizer (wxVERTICAL); - _add = new Button (this, _("Add...")); - s->Add (_add, 1, wxEXPAND | wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); - if (can_edit) { + auto s = new wxBoxSizer (wxVERTICAL); + if (buttons & EditableListButton::NEW) { + _add = new Button (this, _("Add...")); + s->Add (_add, 1, wxEXPAND | wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); + } + if (buttons & EditableListButton::EDIT) { _edit = new Button (this, _("Edit...")); s->Add (_edit, 1, wxEXPAND | wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); } - _remove = new Button (this, _("Remove")); - s->Add (_remove, 1, wxEXPAND | wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); + if (buttons & EditableListButton::REMOVE) { + _remove = new Button (this, _("Remove")); + s->Add (_remove, 1, wxEXPAND | wxTOP | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); + } _sizer->Add (s, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP); } - _add->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::add_clicked, this)); + if (_add) { + _add->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&EditableList::add_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)); + if (_remove) { + _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)); @@ -155,9 +178,9 @@ public: { _list->DeleteAllItems (); - std::vector current = _get (); - for (typename std::vector::iterator i = current.begin (); i != current.end(); ++i) { - add_to_control (*i); + auto current = _get (); + for (auto const& i: current) { + add_to_control (i); } } @@ -165,10 +188,10 @@ public: { int item = _list->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item == -1) { - return boost::optional (); + return {}; } - std::vector all = _get (); + auto all = _get (); DCPOMATIC_ASSERT (item >= 0 && item < int (all.size ())); return all[item]; } @@ -200,7 +223,9 @@ private: if (_edit) { _edit->Enable (i >= 0); } - _remove->Enable (i >= 0); + if (_remove) { + _remove->Enable (i >= 0); + } SelectionChanged (); } @@ -210,10 +235,11 @@ private: S* dialog = new S (this); if (dialog->ShowModal() == wxID_OK) { - boost::optional const v = dialog->get (); + auto const v = dialog->get (); + static_assert(std::is_same::type, boost::optional>::value, "get() must return boost::optional"); if (v) { add_to_control (v.get ()); - std::vector all = _get (); + auto all = _get (); all.push_back (v.get ()); _set (all); } @@ -235,7 +261,8 @@ private: S* dialog = new S (this); dialog->set (all[item]); if (dialog->ShowModal() == wxID_OK) { - boost::optional const v = dialog->get (); + auto const v = dialog->get (); + static_assert(std::is_same::type, boost::optional>::value, "get() must return boost::optional"); if (!v) { return; } @@ -259,7 +286,7 @@ private: } _list->DeleteItem (i); - std::vector all = _get (); + auto all = _get (); all.erase (all.begin() + i); _set (all); @@ -299,9 +326,9 @@ private: std::vector _columns; std::function _column; - wxButton* _add; - wxButton* _edit; - wxButton* _remove; + wxButton* _add = nullptr; + wxButton* _edit = nullptr; + wxButton* _remove = nullptr; wxListCtrl* _list; wxBoxSizer* _sizer; int _default_width;