+void
+ScreensPanel::checkbox_changed (wxTreeListEvent& ev)
+{
+ if (_cinemas.find(ev.GetItem()) != _cinemas.end()) {
+ /* 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);
+ }
+ } else {
+ /* Screen: set cinema to checked/unchecked/3state */
+ auto parent = _targets->GetItemParent(ev.GetItem());
+ DCPOMATIC_ASSERT (parent.IsOk());
+ int checked = 0;
+ int unchecked = 0;
+ for (auto child = _targets->GetFirstChild(parent); child.IsOk(); child = _targets->GetNextSibling(child)) {
+ if (_targets->GetCheckedState(child) == wxCHK_CHECKED) {
+ ++checked;
+ } else {
+ ++unchecked;
+ }
+ }
+ if (checked == 0) {
+ _targets->CheckItem(parent, wxCHK_UNCHECKED);
+ } else if (unchecked == 0) {
+ _targets->CheckItem(parent, wxCHK_CHECKED);
+ } else {
+ _targets->CheckItem(parent, wxCHK_UNDETERMINED);
+ }
+ }
+
+ ScreensChanged ();
+}
+
+
+
+wxIMPLEMENT_DYNAMIC_CLASS (TreeListCtrl, wxTreeListCtrl);