class AnimationsPartsList(PartsList): def __init__(self, parent, editable_grp, operation_stack_cb): PartsList.__init__(self, parent, editable_grp, operation_stack_cb) self._remove_confirmation = None self._edit_grp.animation.callback_add("animation.changed", self._animation_changed_cb) self._edit_grp.animation.callback_add("animation.unselected", self._animation_changed_cb) self._blocked_parts = [] def _animation_changed_cb(self, emissor, data): # Nasty hack self._parts_update_cb(None, self._edit_grp.parts) def _parts_update_cb(self, emissor, data): if not self._edit_grp.animation.name: self.clear() self._edit_grp.animation.event_emit("parts.blocked.changed", []) return parts = data self.clear() self._blocked_parts = [] self._edit_grp.part.name = None for p in parts[::-1]: chk = elementary.Check(self._parent) chk.state_set(self._edit_grp.animation.parts.get(p)) if not chk.state: self._blocked_parts.append(p) chk.callback_changed_add(self._check_changed_cb, p) chk.show() self.add_full(p, end=chk) self.go() self._edit_grp.animation.event_emit("parts.blocked.changed", self._blocked_parts) def _part_added_cb(self, emissor, data): if not self._edit_grp.animation.name: PartsList._part_added_cb(self, emissor, data) return chk = elementary.Check(self._parent) chk.state_set(False) self._blocked_parts.append(data) self._edit_grp.animation.event_emit("parts.blocked.changed", self._blocked_parts) chk.callback_changed_add(self._check_changed_cb, data) chk.show() self.add_full(data, end=chk) self.go() def _check_changed_cb(self, obj, part): if obj.state: self._part_add(part, self._edit_grp.animation.name) op = Operation("part (%s) addition into animation (%s)" % \ (part, self._edit_grp.animation.name)) op.redo_callback_add(self._part_add, part, self._edit_grp.animation.name) op.undo_callback_add(self._part_remove, part, self._edit_grp.animation.name) self._operation_stack_cb(op) else: # FIXME: Take the confirmation out of this function self._notification = ErrorNotify( self, elementary.ELM_NOTIFY_ORIENT_CENTER) self._notification.title = "Part Removal" lb = elementary.Label(self._notification) lb.text_set("Are you sure you want to remove<br>" "this part from the animation?") lb.show() self._notification.pack_end(lb) self._notification.action_add("Remove", self._confirm_remove_cb, data=part) self._notification.action_add("Cancel", self._cancel_remove_cb, data=obj) self._notification.show() def _context_recall(self, **kargs): if "animation" in kargs: self._edit_grp.animation.name = kargs["animation"] if "time" in kargs: self._edit_grp.animation.state = kargs["time"] if "part" in kargs: self._edit_grp.part.name = kargs["part"] if "state" in kargs: self._edit_grp.part.state.name = kargs["state"] def _part_add(self, part, anim_name, saved_states=None): def frame_readd(part_name, saved_states): part = self._edit_grp.part_get(part_name) self._edit_grp.part.name = part_name for t, state in saved_states: if not part.state_exist(state.name): prog = self._edit_grp.program_get(state.name) prog.target_add(part_name) part.state_add(state.name, 0.0) st = part.state_get(state.name) state.apply_to(st) if self._edit_grp.animation.program: statename = self._edit_grp.animation.program.name part.state_selected_set(statename) self._context_recall(animation=anim_name) self._edit_grp.animation.part_add(part) if saved_states: frame_readd(part, saved_states) self._parts_update_cb(None, self._edit_grp.parts) def _part_remove(self, part, anim_name): self._context_recall(animation=anim_name) self._edit_grp.animation.part_remove(part) self._parts_update_cb(None, self._edit_grp.parts) def _confirm_remove_cb(self, btn, part): saved_states = [] p = self._edit_grp.part_get(part) for t in self._edit_grp.animation.timestops: prog = "@%s@%.2f" % (self._edit_grp.animation.name, t) st_obj = p.state_get(prog) if not st_obj: continue st_class = objects_data.state_class_from_part_type_get(p) state_save = st_class(st_obj) saved_states.append([t, state_save]) self._part_remove(part, self._edit_grp.animation.name) self._notification_delete() op = Operation("part (%s) deletion from animation (%s)" % \ (part, self._edit_grp.animation.name)) op.redo_callback_add(self._part_remove, part, self._edit_grp.animation.name) op.undo_callback_add(self._part_add, part, self._edit_grp.animation.name, saved_states) self._operation_stack_cb(op) def _cancel_remove_cb(self, btn, chk): self._notification_delete() chk.state = True def _notification_delete(self): self._notification.delete() self._notification = None def _selected_cb(self, list_, list_item): if not self._edit_grp.animation.name: return part_name = list_item.label_get() if self._edit_grp.animation.parts.get(part_name): CList._selected_cb(self, list_, list_item) self._edit_grp.part.name = part_name else: self._edit_grp.part.name = None CList._unselected_cb(self, list_, list_item)