+
+
+void
+ScreensPanel::checkbox_changed (wxTreeListEvent& ev)
+{
+ auto cinema_iter = cinema_by_tree_list_item(ev.GetItem());
+ if (cinema_iter != _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 ();
+}
+
+
+ScreensPanel::Cinemas::iterator
+ScreensPanel::cinema_by_tree_list_item (wxTreeListItem item)
+{
+ return std::find_if(
+ _cinemas.begin(), _cinemas.end(),
+ [item](pair<wxTreeListItem, shared_ptr<Cinema>> const& s) { return s.first == item; }
+ );
+}
+
+
+ScreensPanel::Screens::const_iterator
+ScreensPanel::screen_by_tree_list_item (wxTreeListItem item) const
+{
+ return std::find_if(
+ _screens.begin(), _screens.end(),
+ [item](pair<wxTreeListItem, shared_ptr<Screen>> const& s) { return s.first == item; }
+ );
+}
+