+ auto screen = item_to_screen(item);
+ DCPOMATIC_ASSERT(screen);
+ if (checked) {
+ _checked_screens.insert(screen);
+ } else {
+ _checked_screens.erase(screen);
+ }
+}
+
+
+void
+ScreensPanel::setup_cinema_checked_state (wxTreeListItem screen)
+{
+ auto cinema = _targets->GetItemParent(screen);
+ DCPOMATIC_ASSERT (cinema.IsOk());
+ int checked = 0;
+ int unchecked = 0;
+ for (auto child = _targets->GetFirstChild(cinema); child.IsOk(); child = _targets->GetNextSibling(child)) {
+ if (_targets->GetCheckedState(child) == wxCHK_CHECKED) {
+ ++checked;
+ } else {
+ ++unchecked;
+ }
+ }
+ if (checked == 0) {
+ _targets->CheckItem(cinema, wxCHK_UNCHECKED);
+ } else if (unchecked == 0) {
+ _targets->CheckItem(cinema, wxCHK_CHECKED);
+ } else {
+ _targets->CheckItem(cinema, wxCHK_UNDETERMINED);
+ }
+}
+
+
+void
+ScreensPanel::checkbox_changed (wxTreeListEvent& ev)
+{
+ if (_ignore_check_change) {
+ return;
+ }
+
+ if (item_to_cinema(ev.GetItem())) {
+ /* Cinema: check/uncheck all children */
+ auto const checked = _targets->GetCheckedState(ev.GetItem());
+ for (auto child = _targets->GetFirstChild(ev.GetItem()); child.IsOk(); child = _targets->GetNextSibling(child)) {
+ _targets->CheckItem(child, checked);
+ set_screen_checked(child, checked);
+ }
+ } else {
+ set_screen_checked(ev.GetItem(), _targets->GetCheckedState(ev.GetItem()));
+ setup_cinema_checked_state(ev.GetItem());
+ }
+