summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-01-17 03:01:08 +0100
committerCarl Hetherington <cth@carlh.net>2025-01-22 14:34:25 +0100
commitdfa19a07e75326a9a80938345786c7785ad78948 (patch)
tree2cb2a48cbb50055bade40f438e55b77335b54efc
parent43ac051e22cd59c5bfbd3a0f68d5bd7416bdb006 (diff)
Add update() to allow re-filling from a new database.
-rw-r--r--src/wx/screens_panel.cc51
-rw-r--r--src/wx/screens_panel.h5
2 files changed, 39 insertions, 17 deletions
diff --git a/src/wx/screens_panel.cc b/src/wx/screens_panel.cc
index d1b9280d7..7f1d58de4 100644
--- a/src/wx/screens_panel.cc
+++ b/src/wx/screens_panel.cc
@@ -74,6 +74,7 @@ ScreensPanel::ScreensPanel (wxWindow* parent)
targets->Add (_targets, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_GAP);
+ _cinema_list.reset(new CinemaList());
add_cinemas ();
auto side_buttons = new wxBoxSizer (wxVERTICAL);
@@ -137,6 +138,24 @@ ScreensPanel::~ScreensPanel ()
void
+ScreensPanel::update()
+{
+ _targets->DeleteAllItems();
+ _selected_cinemas.clear();
+ _selected_screens.clear();
+ _checked_screens.clear();
+
+ _item_to_cinema.clear();
+ _item_to_screen.clear();
+ _cinema_to_item.clear();
+ _screen_to_item.clear();
+
+ _cinema_list.reset(new CinemaList());
+ add_cinemas ();
+}
+
+
+void
ScreensPanel::check_all ()
{
for (auto cinema = _targets->GetFirstChild(_targets->GetRootItem()); cinema.IsOk(); cinema = _targets->GetNextSibling(cinema)) {
@@ -251,9 +270,9 @@ ScreensPanel::add_cinema_clicked ()
if (dialog.ShowModal() == wxID_OK) {
auto cinema = Cinema(dialog.name(), dialog.emails(), dialog.notes(), dialog.utc_offset());
- auto existing_cinemas = _cinema_list.cinemas();
+ auto existing_cinemas = _cinema_list->cinemas();
- auto const cinema_id = _cinema_list.add_cinema(cinema);
+ auto const cinema_id = _cinema_list->add_cinema(cinema);
wxTreeListItem previous = wxTLI_FIRST;
bool found = false;
@@ -310,7 +329,7 @@ ScreensPanel::edit_cinema_clicked ()
void
ScreensPanel::edit_cinema(CinemaID cinema_id)
{
- auto cinema = _cinema_list.cinema(cinema_id);
+ auto cinema = _cinema_list->cinema(cinema_id);
DCPOMATIC_ASSERT(cinema);
CinemaDialog dialog(GetParent(), _("Edit cinema"), cinema->name, cinema->emails, cinema->notes, cinema->utc_offset);
@@ -320,7 +339,7 @@ ScreensPanel::edit_cinema(CinemaID cinema_id)
cinema->name = dialog.name();
cinema->notes = dialog.notes();
cinema->utc_offset = dialog.utc_offset();
- _cinema_list.update_cinema(cinema_id, *cinema);
+ _cinema_list->update_cinema(cinema_id, *cinema);
auto item = cinema_to_item(cinema_id);
DCPOMATIC_ASSERT(item);
_targets->SetItemText (*item, std_to_wx(dialog.name()));
@@ -332,7 +351,7 @@ void
ScreensPanel::remove_cinema_clicked ()
{
if (_selected_cinemas.size() == 1) {
- auto cinema = _cinema_list.cinema(_selected_cinemas[0]);
+ auto cinema = _cinema_list->cinema(_selected_cinemas[0]);
if (!confirm_dialog(this, wxString::Format(_("Are you sure you want to remove the cinema '%s'?"), std_to_wx(cinema->name)))) {
return;
}
@@ -345,10 +364,10 @@ ScreensPanel::remove_cinema_clicked ()
auto cinemas_to_remove = _selected_cinemas;
for (auto const& cinema_id: cinemas_to_remove) {
- for (auto screen: _cinema_list.screens(cinema_id)) {
+ for (auto screen: _cinema_list->screens(cinema_id)) {
_checked_screens.erase({cinema_id, screen.first});
}
- _cinema_list.remove_cinema(cinema_id);
+ _cinema_list->remove_cinema(cinema_id);
auto item = cinema_to_item(cinema_id);
DCPOMATIC_ASSERT(item);
_targets->DeleteItem(*item);
@@ -373,7 +392,7 @@ ScreensPanel::add_screen_clicked ()
return;
}
- for (auto screen: _cinema_list.screens(*cinema_id)) {
+ for (auto screen: _cinema_list->screens(*cinema_id)) {
if (screen.second.name == dialog.name()) {
error_dialog (
GetParent(),
@@ -387,7 +406,7 @@ ScreensPanel::add_screen_clicked ()
}
auto const screen = Screen(dialog.name(), dialog.notes(), dialog.recipient(), dialog.recipient_file(), dialog.trusted_devices());
- auto const screen_id = _cinema_list.add_screen(*cinema_id, screen);
+ auto const screen_id = _cinema_list->add_screen(*cinema_id, screen);
auto const id = add_screen(*cinema_id, screen_id, screen);
if (id) {
@@ -408,7 +427,7 @@ ScreensPanel::edit_screen_clicked ()
void
ScreensPanel::edit_screen(CinemaID cinema_id, ScreenID screen_id)
{
- auto screen = _cinema_list.screen(screen_id);
+ auto screen = _cinema_list->screen(screen_id);
DCPOMATIC_ASSERT(screen);
ScreenDialog dialog(
@@ -424,7 +443,7 @@ ScreensPanel::edit_screen(CinemaID cinema_id, ScreenID screen_id)
return;
}
- for (auto screen: _cinema_list.screens(cinema_id)) {
+ for (auto screen: _cinema_list->screens(cinema_id)) {
if (screen.first != screen_id && screen.second.name == dialog.name()) {
error_dialog (
GetParent(),
@@ -442,7 +461,7 @@ ScreensPanel::edit_screen(CinemaID cinema_id, ScreenID screen_id)
screen->set_recipient(dialog.recipient());
screen->recipient_file = dialog.recipient_file();
screen->trusted_devices = dialog.trusted_devices();
- _cinema_list.update_screen(cinema_id, screen_id, *screen);
+ _cinema_list->update_screen(cinema_id, screen_id, *screen);
auto item = screen_to_item(screen_id);
DCPOMATIC_ASSERT (item);
@@ -454,7 +473,7 @@ void
ScreensPanel::remove_screen_clicked ()
{
if (_selected_screens.size() == 1) {
- auto screen = _cinema_list.screen(_selected_screens[0].second);
+ auto screen = _cinema_list->screen(_selected_screens[0].second);
DCPOMATIC_ASSERT(screen);
if (!confirm_dialog(this, wxString::Format(_("Are you sure you want to remove the screen '%s'?"), std_to_wx(screen->name)))) {
return;
@@ -467,7 +486,7 @@ ScreensPanel::remove_screen_clicked ()
for (auto screen_id: _selected_screens) {
_checked_screens.erase(screen_id);
- _cinema_list.remove_screen(screen_id.second);
+ _cinema_list->remove_screen(screen_id.second);
auto item = screen_to_item(screen_id.second);
DCPOMATIC_ASSERT(item);
_targets->DeleteItem(*item);
@@ -526,13 +545,13 @@ ScreensPanel::add_cinemas ()
{
auto previous = wxTLI_LAST;
- for (auto const& cinema: _cinema_list.cinemas()) {
+ for (auto const& cinema: _cinema_list->cinemas()) {
if (auto next = add_cinema(cinema.first, cinema.second, wxTLI_LAST)) {
previous = *next;
}
}
- _cinema_list.screens([this](CinemaID cinema_id, ScreenID screen_id, Screen const& screen) {
+ _cinema_list->screens([this](CinemaID cinema_id, ScreenID screen_id, Screen const& screen) {
add_screen(cinema_id, screen_id, screen);
}, false);
}
diff --git a/src/wx/screens_panel.h b/src/wx/screens_panel.h
index 90dc4aec6..07f72f9a8 100644
--- a/src/wx/screens_panel.h
+++ b/src/wx/screens_panel.h
@@ -49,6 +49,9 @@ public:
explicit ScreensPanel (wxWindow* parent);
~ScreensPanel ();
+ /** Clear and re-fill the panel from the currently-configured database */
+ void update();
+
std::set<std::pair<CinemaID, ScreenID>> screens() const;
void setup_sensitivity ();
@@ -118,7 +121,7 @@ private:
bool _ignore_selection_change = false;
bool _ignore_check_change = false;
- CinemaList _cinema_list;
+ std::unique_ptr<CinemaList> _cinema_list;
Collator _collator;
};