From: Carl Hetherington Date: Thu, 28 Apr 2022 20:16:31 +0000 (+0200) Subject: Use explicit parameters to the EditableList constructor, and allow X-Git-Tag: v2.16.10~9 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=5c48efdde34ee11f135ea8b369d85d50d1410445 Use explicit parameters to the EditableList constructor, and allow arbitrary new/edit/remove button combinations to be used. --- diff --git a/src/tools/dcpomatic_combiner.cc b/src/tools/dcpomatic_combiner.cc index 4532b0429..5a6457d46 100644 --- a/src/tools/dcpomatic_combiner.cc +++ b/src/tools/dcpomatic_combiner.cc @@ -100,8 +100,8 @@ public: boost::bind(&DOMFrame::inputs, this), boost::bind(&DOMFrame::set_inputs, this, _1), &display_string, - false, - true + true, + EditableListButton::NEW | EditableListButton::REMOVE ); auto output = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); diff --git a/src/wx/editable_list.h b/src/wx/editable_list.h index 28e54a44c..bd8909048 100644 --- a/src/wx/editable_list.h +++ b/src/wx/editable_list.h @@ -52,6 +52,15 @@ public: bool growable; }; + +namespace EditableListButton +{ + static int constexpr NEW = 0x1; + static int constexpr EDIT = 0x2; + static int constexpr REMOVE = 0x4; +}; + + /** @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,15 +77,14 @@ public: std::function ()> get, std::function)> set, std::function column, - bool can_edit = true, - bool title = true + bool title, + int buttons ) : wxPanel (parent) , _get (get) , _set (set) , _columns (columns) , _column (column) - , _edit (0) , _default_width (200) { _sizer = new wxBoxSizer (wxHORIZONTAL); @@ -121,23 +129,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)); @@ -200,7 +216,9 @@ private: if (_edit) { _edit->Enable (i >= 0); } - _remove->Enable (i >= 0); + if (_remove) { + _remove->Enable (i >= 0); + } SelectionChanged (); } @@ -301,9 +319,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; diff --git a/src/wx/full_config_dialog.cc b/src/wx/full_config_dialog.cc index e39a10f09..b14c642c8 100644 --- a/src/wx/full_config_dialog.cc +++ b/src/wx/full_config_dialog.cc @@ -573,7 +573,9 @@ private: columns, boost::bind (&Config::servers, Config::instance()), boost::bind (&Config::set_servers, Config::instance(), _1), - boost::bind (&EncodingServersPage::server_column, this, _1) + boost::bind (&EncodingServersPage::server_column, this, _1), + false, + EditableListButton::NEW | EditableListButton::EDIT | EditableListButton::REMOVE ); _panel->GetSizer()->Add (_servers_list, 1, wxEXPAND | wxALL, _border); @@ -929,7 +931,10 @@ private: bind (&Config::set_kdm_cc, Config::instance(), _1), [] (string s, int) { return s; - }); + }, + true, + EditableListButton::NEW | EditableListButton::EDIT | EditableListButton::REMOVE + ); table->Add (_cc, 1, wxEXPAND | wxALL); add_label_to_sizer (table, _panel, _("BCC address"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); @@ -1063,7 +1068,10 @@ private: bind (&Config::set_notification_cc, Config::instance(), _1), [] (string s, int) { return s; - }); + }, + true, + EditableListButton::NEW | EditableListButton::EDIT | EditableListButton::REMOVE + ); table->Add (_cc, 1, wxEXPAND | wxALL); add_label_to_sizer (table, _panel, _("BCC address"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); diff --git a/src/wx/recipient_dialog.cc b/src/wx/recipient_dialog.cc index f6e0b2cfc..66b7f0e19 100644 --- a/src/wx/recipient_dialog.cc +++ b/src/wx/recipient_dialog.cc @@ -90,7 +90,8 @@ RecipientDialog::RecipientDialog ( vector columns; columns.push_back (EditableListColumn(_("Address"))); _email_list = new EditableList ( - this, columns, bind(&RecipientDialog::get_emails, this), bind(&RecipientDialog::set_emails, this, _1), bind(&column, _1) + this, columns, bind(&RecipientDialog::get_emails, this), bind(&RecipientDialog::set_emails, this, _1), bind(&column, _1), + EditableListButton::NEW | EditableListButton::EDIT | EditableListButton::REMOVE, true ); _sizer->Add (_email_list, wxGBPosition (r, 0), wxGBSpan (1, 2), wxEXPAND); diff --git a/src/wx/screen_dialog.cc b/src/wx/screen_dialog.cc index ba456b643..58ea8a328 100644 --- a/src/wx/screen_dialog.cc +++ b/src/wx/screen_dialog.cc @@ -178,6 +178,7 @@ ScreenDialog::ScreenDialog ( [] (TrustedDevice const& d, int) { return d.thumbprint(); }, + EditableListButton::NEW | EditableListButton::EDIT | EditableListButton::REMOVE, false );