diff options
| author | Carl Hetherington <cth@carlh.net> | 2023-10-18 00:44:30 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2023-10-18 01:06:19 +0200 |
| commit | 48329a8d7ed941b6706b3473608b00ede7f59dac (patch) | |
| tree | 2693106bf4ae25dae590b071f01c9af24137f9d1 | |
| parent | b46a2eb2ea4311ae5bdd13a2b0f209b493f81b12 (diff) | |
Add button to show only checked screens in the KDM creator (#2624).
| -rw-r--r-- | src/wx/screens_panel.cc | 51 | ||||
| -rw-r--r-- | src/wx/screens_panel.h | 6 |
2 files changed, 50 insertions, 7 deletions
diff --git a/src/wx/screens_panel.cc b/src/wx/screens_panel.cc index 99f0d8ef0..721f4f4cc 100644 --- a/src/wx/screens_panel.cc +++ b/src/wx/screens_panel.cc @@ -19,6 +19,7 @@ */ +#include "check_box.h" #include "cinema_dialog.h" #include "dcpomatic_button.h" #include "screen_dialog.h" @@ -50,14 +51,21 @@ using namespace dcpomatic; ScreensPanel::ScreensPanel (wxWindow* parent) : wxPanel (parent, wxID_ANY) { - auto sizer = new wxBoxSizer (wxVERTICAL); + _overall_sizer = new wxBoxSizer(wxVERTICAL); + + auto search_sizer = new wxBoxSizer(wxHORIZONTAL); _search = new wxSearchCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(200, search_ctrl_height())); #ifndef __WXGTK3__ /* The cancel button seems to be strangely broken in GTK3; clicking on it twice sometimes works */ _search->ShowCancelButton (true); #endif - sizer->Add (_search, 0, wxBOTTOM, DCPOMATIC_SIZER_GAP); + search_sizer->Add(_search, 0, wxBOTTOM, DCPOMATIC_SIZER_GAP); + + _show_only_checked = new CheckBox(this, _("Show only checked")); + search_sizer->Add(_show_only_checked, 1, wxEXPAND | wxLEFT | wxBOTTOM, DCPOMATIC_SIZER_GAP); + + _overall_sizer->Add(search_sizer); auto targets = new wxBoxSizer (wxHORIZONTAL); _targets = new wxTreeListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTL_MULTIPLE | wxTL_3STATE | wxTL_NO_HEADER); @@ -97,9 +105,10 @@ ScreensPanel::ScreensPanel (wxWindow* parent) targets->Add (side_buttons, 0, 0); - sizer->Add (targets, 1, wxEXPAND); + _overall_sizer->Add (targets, 1, wxEXPAND); - _search->Bind (wxEVT_TEXT, boost::bind (&ScreensPanel::search_changed, this)); + _search->Bind (wxEVT_TEXT, boost::bind (&ScreensPanel::display_filter_changed, this)); + _show_only_checked->Bind(wxEVT_CHECKBOX, boost::bind(&ScreensPanel::display_filter_changed, this)); _targets->Bind (wxEVT_TREELIST_SELECTION_CHANGED, &ScreensPanel::selection_changed_shim, this); _targets->Bind (wxEVT_TREELIST_ITEM_CHECKED, &ScreensPanel::checkbox_changed, this); _targets->Bind (wxEVT_TREELIST_ITEM_ACTIVATED, &ScreensPanel::item_activated, this); @@ -115,7 +124,7 @@ ScreensPanel::ScreensPanel (wxWindow* parent) _check_all->Bind (wxEVT_BUTTON, boost::bind(&ScreensPanel::check_all, this)); _uncheck_all->Bind (wxEVT_BUTTON, boost::bind(&ScreensPanel::uncheck_all, this)); - SetSizer (sizer); + SetSizer(_overall_sizer); _config_connection = Config::instance()->Changed.connect(boost::bind(&ScreensPanel::config_changed, this, _1)); } @@ -166,6 +175,8 @@ ScreensPanel::setup_sensitivity () _add_screen->Enable (sc || ss); _edit_screen->Enable (ss); _remove_screen->Enable (_selected_screens.size() >= 1); + + _show_only_checked->Enable(!_checked_screens.empty()); } @@ -195,6 +206,16 @@ ScreensPanel::add_cinema (shared_ptr<Cinema> cinema, wxTreeListItem previous) return {}; } + if (_show_only_checked->get()) { + auto screens = cinema->screens(); + auto iter = std::find_if(screens.begin(), screens.end(), [this](shared_ptr<dcpomatic::Screen> screen) { + return _checked_screens.find(screen) != _checked_screens.end(); + }); + if (iter == screens.end()) { + return {}; + } + } + auto id = _targets->InsertItem(_targets->GetRootItem(), previous, std_to_wx(cinema->name)); _item_to_cinema[id] = cinema; @@ -345,6 +366,7 @@ ScreensPanel::remove_cinema_clicked () } selection_changed (); + setup_show_only_checked(); } @@ -464,6 +486,7 @@ ScreensPanel::remove_screen_clicked () */ selection_changed(); notify_cinemas_changed(); + setup_show_only_checked(); } @@ -545,8 +568,9 @@ ScreensPanel::clear_and_re_add() } +/** Search and/or "show only checked" changed */ void -ScreensPanel::search_changed () +ScreensPanel::display_filter_changed() { clear_and_re_add(); @@ -589,6 +613,8 @@ ScreensPanel::set_screen_checked (wxTreeListItem item, bool checked) } else { _checked_screens.erase(screen); } + + setup_show_only_checked(); } @@ -728,3 +754,16 @@ ScreensPanel::item_activated(wxTreeListEvent& ev) } +void +ScreensPanel::setup_show_only_checked() +{ + if (_checked_screens.empty()) { + _show_only_checked->set_text(_("Show only checked")); + } else { + _show_only_checked->set_text(wxString::Format(_("Show only %d checked"), static_cast<int>(_checked_screens.size()))); + } + + _overall_sizer->Layout(); + setup_sensitivity(); +} + diff --git a/src/wx/screens_panel.h b/src/wx/screens_panel.h index 65dfbdddb..80a7b3843 100644 --- a/src/wx/screens_panel.h +++ b/src/wx/screens_panel.h @@ -39,6 +39,7 @@ namespace dcpomatic { class Cinema; +class CheckBox; class ScreensPanel : public wxPanel @@ -66,7 +67,7 @@ private: void remove_screen_clicked (); void selection_changed_shim (wxTreeListEvent &); void selection_changed (); - void search_changed (); + void display_filter_changed(); void checkbox_changed (wxTreeListEvent& ev); void item_activated(wxTreeListEvent& ev); std::shared_ptr<Cinema> cinema_for_operation () const; @@ -80,13 +81,16 @@ private: void convert_to_lower(std::string& s); bool matches_search(std::shared_ptr<const Cinema> cinema, std::string search); std::list<std::shared_ptr<Cinema>> sorted_cinemas() const; + void setup_show_only_checked(); std::shared_ptr<Cinema> item_to_cinema (wxTreeListItem item) const; std::shared_ptr<dcpomatic::Screen> item_to_screen (wxTreeListItem item) const; boost::optional<wxTreeListItem> cinema_to_item (std::shared_ptr<Cinema> cinema) const; boost::optional<wxTreeListItem> screen_to_item (std::shared_ptr<dcpomatic::Screen> screen) const; + wxBoxSizer* _overall_sizer; wxSearchCtrl* _search; + CheckBox* _show_only_checked; wxTreeListCtrl* _targets; wxButton* _add_cinema; wxButton* _edit_cinema; |
