Allow editing of a screen's cinema / adding a new screen when
authorCarl Hetherington <cth@carlh.net>
Fri, 11 Mar 2022 20:00:32 +0000 (21:00 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 11 Mar 2022 20:00:32 +0000 (21:00 +0100)
a screen is selected (#2210).

src/wx/screens_panel.cc
src/wx/screens_panel.h

index c5aea4223e5c62f4c381d16f1f7a1df28785c468..c034903129a0bf48217532459926efb213782e7c 100644 (file)
@@ -109,10 +109,10 @@ ScreensPanel::setup_sensitivity ()
        bool const sc = _selected_cinemas.size() == 1;
        bool const ss = _selected_screens.size() == 1;
 
-       _edit_cinema->Enable (sc);
+       _edit_cinema->Enable (sc || ss);
        _remove_cinema->Enable (_selected_cinemas.size() >= 1);
 
-       _add_screen->Enable (sc);
+       _add_screen->Enable (sc || ss);
        _edit_screen->Enable (ss);
        _remove_screen->Enable (_selected_screens.size() >= 1);
 }
@@ -181,26 +181,38 @@ ScreensPanel::add_cinema_clicked ()
 }
 
 
+optional<pair<wxTreeListItem, shared_ptr<Cinema>>>
+ScreensPanel::cinema_for_operation () const
+{
+       if (_selected_cinemas.size() == 1) {
+               return make_pair(_selected_cinemas.begin()->first, _selected_cinemas.begin()->second);
+       } else if (_selected_screens.size() == 1) {
+               return make_pair(_targets->GetItemParent(_selected_screens.begin()->first), _selected_screens.begin()->second->cinema);
+       }
+
+       return {};
+}
+
+
 void
 ScreensPanel::edit_cinema_clicked ()
 {
-       if (_selected_cinemas.size() != 1) {
+       auto cinema = cinema_for_operation ();
+       if (!cinema) {
                return;
        }
 
-       auto c = *_selected_cinemas.begin();
-
        auto d = new CinemaDialog (
-               GetParent(), _("Edit cinema"), c.second->name, c.second->emails, c.second->notes, c.second->utc_offset_hour(), c.second->utc_offset_minute()
+               GetParent(), _("Edit cinema"), cinema->second->name, cinema->second->emails, cinema->second->notes, cinema->second->utc_offset_hour(), cinema->second->utc_offset_minute()
                );
 
        if (d->ShowModal() == wxID_OK) {
-               c.second->name = d->name ();
-               c.second->emails = d->emails ();
-               c.second->notes = d->notes ();
-               c.second->set_utc_offset_hour (d->utc_offset_hour ());
-               c.second->set_utc_offset_minute (d->utc_offset_minute ());
-               _targets->SetItemText (c.first, std_to_wx (d->name()));
+               cinema->second->name = d->name ();
+               cinema->second->emails = d->emails ();
+               cinema->second->notes = d->notes ();
+               cinema->second->set_utc_offset_hour (d->utc_offset_hour ());
+               cinema->second->set_utc_offset_minute (d->utc_offset_minute ());
+               _targets->SetItemText (cinema->first, std_to_wx(d->name()));
                Config::instance()->changed (Config::CINEMAS);
        }
 
@@ -233,19 +245,18 @@ ScreensPanel::remove_cinema_clicked ()
 void
 ScreensPanel::add_screen_clicked ()
 {
-       if (_selected_cinemas.size() != 1) {
+       auto cinema = cinema_for_operation ();
+       if (!cinema) {
                return;
        }
 
-       auto c = _selected_cinemas.begin()->second;
-
        auto d = new ScreenDialog (GetParent(), _("Add Screen"));
        if (d->ShowModal () != wxID_OK) {
                d->Destroy ();
                return;
        }
 
-       for (auto i: c->screens ()) {
+       for (auto i: cinema->second->screens()) {
                if (i->name == d->name()) {
                        error_dialog (
                                GetParent(),
@@ -258,9 +269,9 @@ ScreensPanel::add_screen_clicked ()
                }
        }
 
-       auto s = std::make_shared<Screen>(d->name(), d->notes(), d->recipient(), d->recipient_file(), d->trusted_devices());
-       c->add_screen (s);
-       auto id = add_screen (c, s);
+       auto screen = std::make_shared<Screen>(d->name(), d->notes(), d->recipient(), d->recipient_file(), d->trusted_devices());
+       cinema->second->add_screen (screen);
+       auto id = add_screen (cinema->second, screen);
        if (id) {
                _targets->Expand (id.get ());
        }
index bea9c2995672526ec59a2ca0edc17cea4a404b3a..4885a84541eb42703f7b25f0b0601dca6a584a60 100644 (file)
@@ -80,6 +80,7 @@ private:
        void selection_changed ();
        void search_changed ();
        void checkbox_changed (wxTreeListEvent& ev);
+       boost::optional<std::pair<wxTreeListItem, std::shared_ptr<Cinema>>> cinema_for_operation () const;
 
        wxSearchCtrl* _search;
        TreeListCtrl* _targets;