Use explicit parameters to the EditableList constructor, and allow
authorCarl Hetherington <cth@carlh.net>
Thu, 28 Apr 2022 20:16:31 +0000 (22:16 +0200)
committerCarl Hetherington <cth@carlh.net>
Fri, 29 Apr 2022 21:37:48 +0000 (23:37 +0200)
arbitrary new/edit/remove button combinations to be used.

src/tools/dcpomatic_combiner.cc
src/wx/editable_list.h
src/wx/full_config_dialog.cc
src/wx/recipient_dialog.cc
src/wx/screen_dialog.cc

index 4532b04299981c35297d97d5b3bee0dbc1ef83eb..5a6457d465baea48fe0e5b5048e7316bc865ca0f 100644 (file)
@@ -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);
index 28e54a44c1aa54baa092231b640941792bf078a1..bd89090485a2fcfb8250c2ea0331f4fff70772e1 100644 (file)
@@ -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<std::vector<T> ()> get,
                std::function<void (std::vector<T>)> set,
                std::function<std::string (T, int)> 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<EditableListColumn> _columns;
        std::function<std::string (T, int)> _column;
 
-       wxButton* _add;
-       wxButton* _edit;
-       wxButton* _remove;
+       wxButton* _add = nullptr;
+       wxButton* _edit = nullptr;
+       wxButton* _remove = nullptr;
        wxListCtrl* _list;
        wxBoxSizer* _sizer;
        int _default_width;
index e39a10f09632516a15952bd0653954b6fee07adc..b14c642c8a93757689b6d8e957b8342ae9fde734 100644 (file)
@@ -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);
index f6e0b2cfc60928d28c09cb6e483c4ee6852b6fed..66b7f0e19bd24110c1e3bc65092f9ff64bbfb09f 100644 (file)
@@ -90,7 +90,8 @@ RecipientDialog::RecipientDialog (
        vector<EditableListColumn> columns;
        columns.push_back (EditableListColumn(_("Address")));
        _email_list = new EditableList<string, EmailDialog> (
-               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);
index ba456b643c2585b68a13cdaadb5567ef451f86c0..58ea8a3285119a184a2d9441a30a081c25bd44d6 100644 (file)
@@ -178,6 +178,7 @@ ScreenDialog::ScreenDialog (
                [] (TrustedDevice const& d, int) {
                        return d.thumbprint();
                },
+               EditableListButton::NEW | EditableListButton::EDIT | EditableListButton::REMOVE,
                false
                );