X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Fwx%2Feditable_list.h;h=3ee4359bf8022cfb10c55373745f92bde92836f5;hp=8226c9cac813e5eefb2eca1a88370e417d3ad0ac;hb=0a3f387f5d39da2ca38ec90a9593c1b598040dd7;hpb=7d50d28d283570b0648450a2dc9448c988c39f46 diff --git a/src/wx/editable_list.h b/src/wx/editable_list.h index 8226c9cac..3ee4359bf 100644 --- a/src/wx/editable_list.h +++ b/src/wx/editable_list.h @@ -22,15 +22,36 @@ #define DCPOMATIC_EDITABLE_LIST_H #include "wx_util.h" +#include "dcpomatic_button.h" #include #include #include #include -bool always_valid (); +class EditableListColumn +{ +public: + EditableListColumn (std::string name_) + : name (name_) + , growable (false) + {} + + EditableListColumn (std::string name_, boost::optional width_, bool growable_) + : name (name_) + , width (width_) + , growable (growable_) + {} + + std::string name; + boost::optional width; + bool growable; +}; /** @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. + * @param set Function set the things from a a std::vector. + * @param column Function to get the display string for a given column in a given item. */ template class EditableList : public wxPanel @@ -38,10 +59,9 @@ class EditableList : public wxPanel public: EditableList ( wxWindow* parent, - std::vector columns, + std::vector columns, boost::function ()> get, boost::function)> set, - boost::function valid, boost::function column, bool can_edit = true, bool title = true @@ -49,10 +69,10 @@ public: : wxPanel (parent) , _get (get) , _set (set) - , _valid (valid) - , _columns (columns.size ()) + , _columns (columns) , _column (column) , _edit (0) + , _default_width (200) { _sizer = new wxBoxSizer (wxHORIZONTAL); SetSizer (_sizer); @@ -61,27 +81,34 @@ public: if (title) { style |= wxLC_NO_HEADER; } - _list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (columns.size() * 200, 100), style); - for (size_t i = 0; i < columns.size(); ++i) { + int total_width = 0; + BOOST_FOREACH (EditableListColumn i, _columns) { + total_width += i.width.get_value_or (_default_width); + } + + _list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize(total_width, 100), style); + + int j = 0; + BOOST_FOREACH (EditableListColumn i, _columns) { wxListItem ip; - ip.SetId (i); - ip.SetText (std_to_wx (columns[i])); - ip.SetWidth (200); - _list->InsertColumn (i, ip); + ip.SetId (j); + ip.SetText (std_to_wx(i.name)); + _list->InsertColumn (j, ip); + ++j; } _sizer->Add (_list, 1, wxEXPAND); { wxSizer* s = new wxBoxSizer (wxVERTICAL); - _add = new wxButton (this, wxID_ANY, _("Add...")); + _add = new Button (this, _("Add...")); s->Add (_add, 0, wxTOP | wxBOTTOM, 2); if (can_edit) { - _edit = new wxButton (this, wxID_ANY, _("Edit...")); + _edit = new Button (this, _("Edit...")); s->Add (_edit, 0, wxTOP | wxBOTTOM, 2); } - _remove = new wxButton (this, wxID_ANY, _("Remove")); + _remove = new Button (this, _("Remove")); s->Add (_remove, 0, wxTOP | wxBOTTOM, 2); _sizer->Add (s, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP); } @@ -138,7 +165,7 @@ private: list_item.SetId (n); _list->InsertItem (list_item); - for (int i = 0; i < _columns; ++i) { + for (size_t i = 0; i < _columns.size(); ++i) { _list->SetItem (n, i, std_to_wx (_column (item, i))); } } @@ -159,11 +186,11 @@ private: S* dialog = new S (this); if (dialog->ShowModal() == wxID_OK) { - T const v = dialog->get (); - if (_valid (v)) { - add_to_control (v); + boost::optional const v = dialog->get (); + if (v) { + add_to_control (v.get ()); std::vector all = _get (); - all.push_back (v); + all.push_back (v.get ()); _set (all); } } @@ -184,16 +211,16 @@ private: S* dialog = new S (this); dialog->set (all[item]); if (dialog->ShowModal() == wxID_OK) { - T const v = dialog->get (); - if (!_valid (v)) { + boost::optional const v = dialog->get (); + if (!v) { return; } - all[item] = v; + all[item] = v.get (); } dialog->Destroy (); - for (int i = 0; i < _columns; ++i) { + for (size_t i = 0; i < _columns.size(); ++i) { _list->SetItem (item, i, std_to_wx (_column (all[item], i))); } @@ -217,17 +244,35 @@ private: void resized (wxSizeEvent& ev) { - int const w = GetSize().GetWidth() / _columns; - for (int i = 0; i < _columns; ++i) { - _list->SetColumnWidth (i, w); + int const w = _list->GetSize().GetWidth() - 2; + + int fixed_width = 0; + int growable = 0; + int j = 0; + BOOST_FOREACH (EditableListColumn i, _columns) { + fixed_width += i.width.get_value_or (_default_width); + if (!i.growable) { + _list->SetColumnWidth (j, i.width.get_value_or(_default_width)); + } else { + ++growable; + } + ++j; } + + j = 0; + BOOST_FOREACH (EditableListColumn i, _columns) { + if (i.growable) { + _list->SetColumnWidth (j, i.width.get_value_or(_default_width) + (w - fixed_width) / growable); + } + ++j; + } + ev.Skip (); } boost::function ()> _get; boost::function )> _set; - boost::function _valid; - int _columns; + std::vector _columns; boost::function _column; wxButton* _add; @@ -235,6 +280,7 @@ private: wxButton* _remove; wxListCtrl* _list; wxBoxSizer* _sizer; + int _default_width; }; #endif