+ auto group = dynamic_pointer_cast<DKDMGroup>(selected_dkdm());
+ auto dkdm = dynamic_pointer_cast<DKDM>(selected_dkdm());
+ _create->Enable (!_screens->screens().empty() && sel.GetCount() > 0 && dkdm);
+ _remove_dkdm->Enable (sel.GetCount() > 0 && (!group || group->name() != "root"));
+ _export_dkdm->Enable (sel.GetCount() > 0 && dkdm);
+ }
+
+ void dkdm_selection_changed()
+ {
+ _selected_dkdm = selected_dkdm();
+ setup_sensitivity();
+ }
+
+ void dkdm_expanded(wxTreeEvent& ev)
+ {
+ if (_ignore_expand) {
+ return;
+ }
+
+ auto iter = _dkdm_id.find(ev.GetItem());
+ if (iter != _dkdm_id.end()) {
+ _expanded_dkdm_groups.insert(iter->second);
+ }
+ }
+
+ void dkdm_collapsed(wxTreeEvent& ev)
+ {
+ auto iter = _dkdm_id.find(ev.GetItem());
+ if (iter != _dkdm_id.end()) {
+ _expanded_dkdm_groups.erase(iter->second);
+ }
+ }
+
+ void dkdm_begin_drag (wxTreeEvent& ev)
+ {
+ ev.Allow ();
+ }
+
+ void dkdm_end_drag (wxTreeEvent& ev)
+ {
+ auto from = _dkdm_id.find (_dkdm->GetSelection ());
+ auto to = _dkdm_id.find (ev.GetItem ());
+ if (from == _dkdm_id.end() || to == _dkdm_id.end() || from->first == to->first) {
+ return;
+ }
+
+ auto group = dynamic_pointer_cast<DKDMGroup> (to->second);
+ if (!group) {
+ group = to->second->parent();
+ }
+
+ DCPOMATIC_ASSERT (group);
+ DCPOMATIC_ASSERT (from->second->parent ());
+
+ from->second->parent()->remove (from->second);
+ add_dkdm(from->second, group, dynamic_pointer_cast<DKDM>(to->second));
+
+ update_dkdm_view();