+ auto group = dynamic_pointer_cast<DKDMGroup>(selected_dkdm());
+ auto dkdm = dynamic_pointer_cast<DKDM>(selected_dkdm());
+ _create->Enable(!_screens->screens().empty() && _timing->valid() && sel.GetCount() > 0 && dkdm && _output->method_selected());
+ _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();
+ if (_selected_dkdm) {
+ auto dkdm = std::dynamic_pointer_cast<DKDM>(_selected_dkdm);
+ if (dkdm) {
+ try {
+ dcp::DecryptedKDM decrypted(dkdm->dkdm(), Config::instance()->decryption_chain()->key().get());
+ if (decrypted.annotation_text()) {
+ _output->set_annotation_text(*decrypted.annotation_text());
+ }
+ } catch (...) {}
+ }
+ }
+ 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);
+ }