From 48329a8d7ed941b6706b3473608b00ede7f59dac Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 18 Oct 2023 00:44:30 +0200 Subject: Add button to show only checked screens in the KDM creator (#2624). --- src/wx/screens_panel.cc | 51 +++++++++++++++++++++++++++++++++++++++++++------ src/wx/screens_panel.h | 6 +++++- 2 files changed, 50 insertions(+), 7 deletions(-) (limited to 'src') 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, wxTreeListItem previous) return {}; } + if (_show_only_checked->get()) { + auto screens = cinema->screens(); + auto iter = std::find_if(screens.begin(), screens.end(), [this](shared_ptr 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(_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_for_operation () const; @@ -80,13 +81,16 @@ private: void convert_to_lower(std::string& s); bool matches_search(std::shared_ptr cinema, std::string search); std::list> sorted_cinemas() const; + void setup_show_only_checked(); std::shared_ptr item_to_cinema (wxTreeListItem item) const; std::shared_ptr item_to_screen (wxTreeListItem item) const; boost::optional cinema_to_item (std::shared_ptr cinema) const; boost::optional screen_to_item (std::shared_ptr screen) const; + wxBoxSizer* _overall_sizer; wxSearchCtrl* _search; + CheckBox* _show_only_checked; wxTreeListCtrl* _targets; wxButton* _add_cinema; wxButton* _edit_cinema; -- cgit v1.2.3