X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Fwx%2Fscreens_panel.cc;h=6c5b28b8d0fdd048449ce2c0e3a0bdfc8994d3a3;hp=b7defe0e9be39e482d6163fe1f4f1972edb21330;hb=da13c2af9e8f19229061ca1939cbe8bd37c72eba;hpb=493ed4867d46e03a08905dd7a938a90c3262b58f diff --git a/src/wx/screens_panel.cc b/src/wx/screens_panel.cc index b7defe0e9..6c5b28b8d 100644 --- a/src/wx/screens_panel.cc +++ b/src/wx/screens_panel.cc @@ -102,6 +102,7 @@ ScreensPanel::ScreensPanel (wxWindow* parent) _search->Bind (wxEVT_TEXT, boost::bind (&ScreensPanel::search_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); _add_cinema->Bind (wxEVT_BUTTON, boost::bind (&ScreensPanel::add_cinema_clicked, this)); _edit_cinema->Bind (wxEVT_BUTTON, boost::bind (&ScreensPanel::edit_cinema_clicked, this)); @@ -176,23 +177,20 @@ ScreensPanel::convert_to_lower(string& s) bool -ScreensPanel::matches_search(shared_ptr cinema, string lower_case_search) +ScreensPanel::matches_search(shared_ptr cinema, string search) { - if (lower_case_search.empty()) { + if (search.empty()) { return true; } - auto name = cinema->name; - convert_to_lower(name); - return name.find(lower_case_search) != string::npos; + return _collator.find(search, cinema->name); } optional ScreensPanel::add_cinema (shared_ptr cinema, wxTreeListItem previous) { - auto search = wx_to_std (_search->GetValue ()); - convert_to_lower(search); + auto const search = wx_to_std(_search->GetValue()); if (!matches_search(cinema, search)) { return {}; } @@ -230,11 +228,10 @@ ScreensPanel::add_screen (shared_ptr cinema, shared_ptr screen) void ScreensPanel::add_cinema_clicked () { - auto dialog = new CinemaDialog (GetParent(), _("Add Cinema")); - ScopeGuard sg = [dialog]() { dialog->Destroy(); }; + CinemaDialog dialog(GetParent(), _("Add Cinema")); - if (dialog->ShowModal() == wxID_OK) { - auto cinema = make_shared(dialog->name(), dialog->emails(), dialog->notes(), dialog->utc_offset_hour(), dialog->utc_offset_minute()); + if (dialog.ShowModal() == wxID_OK) { + auto cinema = make_shared(dialog.name(), dialog.emails(), dialog.notes(), dialog.utc_offset_hour(), dialog.utc_offset_minute()); auto cinemas = sorted_cinemas(); @@ -249,8 +246,12 @@ ScreensPanel::add_cinema_clicked () wxTreeListItem previous = wxTLI_FIRST; bool found = false; + auto const search = wx_to_std(_search->GetValue()); for (auto existing_cinema: cinemas) { - if (_collator.compare(dialog->name(), existing_cinema->name) < 0) { + if (!matches_search(existing_cinema, search)) { + continue; + } + if (_collator.compare(dialog.name(), existing_cinema->name) < 0) { /* existing_cinema should be after the one we're inserting */ found = true; break; @@ -289,25 +290,29 @@ void ScreensPanel::edit_cinema_clicked () { auto cinema = cinema_for_operation (); - if (!cinema) { - return; + if (cinema) { + edit_cinema(cinema); } +} + - auto dialog = new CinemaDialog( +void +ScreensPanel::edit_cinema(shared_ptr cinema) +{ + CinemaDialog dialog( GetParent(), _("Edit cinema"), cinema->name, cinema->emails, cinema->notes, cinema->utc_offset_hour(), cinema->utc_offset_minute() ); - ScopeGuard sg = [dialog]() { dialog->Destroy(); }; - - if (dialog->ShowModal() == wxID_OK) { - cinema->name = dialog->name(); - cinema->emails = dialog->emails(); - cinema->notes = dialog->notes(); - cinema->set_utc_offset_hour(dialog->utc_offset_hour()); - cinema->set_utc_offset_minute(dialog->utc_offset_minute()); + + if (dialog.ShowModal() == wxID_OK) { + cinema->name = dialog.name(); + cinema->emails = dialog.emails(); + cinema->notes = dialog.notes(); + cinema->set_utc_offset_hour(dialog.utc_offset_hour()); + cinema->set_utc_offset_minute(dialog.utc_offset_minute()); notify_cinemas_changed(); auto item = cinema_to_item(cinema); DCPOMATIC_ASSERT(item); - _targets->SetItemText (*item, std_to_wx(dialog->name())); + _targets->SetItemText (*item, std_to_wx(dialog.name())); } } @@ -346,27 +351,26 @@ ScreensPanel::add_screen_clicked () return; } - auto dialog = new ScreenDialog(GetParent(), _("Add Screen")); - ScopeGuard sg = [dialog]() { dialog->Destroy(); }; + ScreenDialog dialog(GetParent(), _("Add Screen")); - if (dialog->ShowModal () != wxID_OK) { + if (dialog.ShowModal () != wxID_OK) { return; } for (auto screen: cinema->screens()) { - if (screen->name == dialog->name()) { + if (screen->name == dialog.name()) { error_dialog ( GetParent(), wxString::Format ( _("You cannot add a screen called '%s' as the cinema already has a screen with this name."), - std_to_wx(dialog->name()).data() + std_to_wx(dialog.name()).data() ) ); return; } } - auto screen = std::make_shared(dialog->name(), dialog->notes(), dialog->recipient(), dialog->recipient_file(), dialog->trusted_devices()); + auto screen = std::make_shared(dialog.name(), dialog.notes(), dialog.recipient(), dialog.recipient_file(), dialog.trusted_devices()); cinema->add_screen (screen); notify_cinemas_changed(); @@ -380,13 +384,16 @@ ScreensPanel::add_screen_clicked () void ScreensPanel::edit_screen_clicked () { - if (_selected_screens.size() != 1) { - return; + if (_selected_screens.size() == 1) { + edit_screen(_selected_screens[0]); } +} - auto edit_screen = _selected_screens[0]; - auto dialog = new ScreenDialog( +void +ScreensPanel::edit_screen(shared_ptr edit_screen) +{ + ScreenDialog dialog( GetParent(), _("Edit screen"), edit_screen->name, edit_screen->notes, @@ -394,36 +401,35 @@ ScreensPanel::edit_screen_clicked () edit_screen->recipient_file, edit_screen->trusted_devices ); - ScopeGuard sg = [dialog]() { dialog->Destroy(); }; - if (dialog->ShowModal() != wxID_OK) { + if (dialog.ShowModal() != wxID_OK) { return; } auto cinema = edit_screen->cinema; for (auto screen: cinema->screens()) { - if (screen != edit_screen && screen->name == dialog->name()) { + if (screen != edit_screen && screen->name == dialog.name()) { error_dialog ( GetParent(), wxString::Format ( _("You cannot change this screen's name to '%s' as the cinema already has a screen with this name."), - std_to_wx(dialog->name()).data() + std_to_wx(dialog.name()).data() ) ); return; } } - edit_screen->name = dialog->name(); - edit_screen->notes = dialog->notes(); - edit_screen->recipient = dialog->recipient(); - edit_screen->recipient_file = dialog->recipient_file(); - edit_screen->trusted_devices = dialog->trusted_devices(); + edit_screen->name = dialog.name(); + edit_screen->notes = dialog.notes(); + edit_screen->recipient = dialog.recipient(); + edit_screen->recipient_file = dialog.recipient_file(); + edit_screen->trusted_devices = dialog.trusted_devices(); notify_cinemas_changed(); auto item = screen_to_item(edit_screen); DCPOMATIC_ASSERT (item); - _targets->SetItemText (*item, std_to_wx(dialog->name())); + _targets->SetItemText(*item, std_to_wx(dialog.name())); } @@ -447,6 +453,10 @@ ScreensPanel::remove_screen_clicked () _targets->DeleteItem(*item); } + /* This is called by the signal on Linux, but not it seems on Windows, so we call it ourselves + * as well. + */ + selection_changed(); notify_cinemas_changed(); } @@ -695,3 +705,20 @@ ScreensPanel::config_changed(Config::Property property) clear_and_re_add(); } } + + +void +ScreensPanel::item_activated(wxTreeListEvent& ev) +{ + auto iter = _item_to_cinema.find(ev.GetItem()); + if (iter != _item_to_cinema.end()) { + edit_cinema(iter->second); + } else { + auto iter = _item_to_screen.find(ev.GetItem()); + if (iter != _item_to_screen.end()) { + edit_screen(iter->second); + } + } +} + +