def _add_or_remove_measure(self, track, index): if index < len(track.measure_clip_ids): has_clip = track.measure_clip_ids[index] is not None else: has_clip = False if has_clip: # Remove the existing clip old_clip_id = track.measure_clip_ids[index] def do(): track.measure_clip_ids[index] = None self._project.update_track_length() self._layout_widgets() def undo(): self._project.ensure_track_length(index + 1) track.measure_clip_ids[index] = old_clip_id self._project.update_track_length() self._layout_widgets() do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do self._history_manager.add_entry(entry) else: # Add the selected clip new_clip_id = self._get_selected_clip_id_func() if new_clip_id is None: return # Make sure there's enough space for this clip new_clip = self._project.get_clip_by_id(new_clip_id) for i in range(new_clip.measure_count): measure_index = index + i if measure_index < len( track.measure_clip_ids ) and track.measure_clip_ids[measure_index] is not None: # No space - # $TODO indicate this somehow? return def do(): self._project.ensure_track_length(index + 1) track.measure_clip_ids[index] = new_clip_id self._project.update_track_length() self._layout_widgets() def undo(): track.measure_clip_ids[index] = None self._project.update_track_length() self._layout_widgets() do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do self._history_manager.add_entry(entry)
def on_accept(new_clip): new_clip.id = self._project.generate_clip_id() new_clip.category = category def do(): self._project.clips.append(new_clip) category.clip_ids.append(new_clip.id) self._layout_widgets() def undo(): self._project.clips.remove(new_clip) category.clip_ids.remove(new_clip.id) if self._selected_clip_id == new_clip.id: self._selected_clip_id = None self._layout_widgets() def destroy(was_undone): if was_undone: engine.delete_clip(new_clip.engine_clip) do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do entry.destroy_func = destroy self._history_manager.add_entry(entry)
def on_accept(name, color, gain): if name == category.name and color == category.color and gain == category.gain: return # Nothing changed old_name = category.name old_color = category.color old_gain = category.gain def do(): category.name = name category.color = color category.gain = gain self._layout_widgets() self._update_tracks_func() def undo(): category.name = old_name category.color = old_color category.gain = old_gain self._layout_widgets() self._update_tracks_func() do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do self._history_manager.add_entry(entry)
def on_delete(): old_clips = self._project.clips.copy() category_index = self._project.clip_categories.index(category) track_usages = set() for track in self._project.tracks: for i, clip_id in enumerate(track.measure_clip_ids): if clip_id in category.clip_ids: track_usages.add((clip_id, track, i)) def do(): clip_ids_to_delete = set(category.clip_ids) self._project.clips = [ x for x in self._project.clips if x.id not in clip_ids_to_delete ] self._project.clip_categories.remove(category) for clip_id, track, index in track_usages: track.measure_clip_ids[index] = None self._project.update_track_length() if self._selected_clip_id in clip_ids_to_delete: self._selected_clip_id = None self._layout_widgets() self._update_tracks_func() def undo(): self._project.clips = old_clips self._project.clip_categories.insert(category_index, category) if len(track_usages) > 0: max_index = max(i for c, t, i in track_usages) self._project.ensure_track_length(max_index + 1) for clip_id, track, index in track_usages: track.measure_clip_ids[index] = clip_id self._project.update_track_length() self._layout_widgets() self._update_tracks_func() def destroy(was_undone): if not was_undone: clip_ids = set(category.clip_ids) deleted_clips = [x for x in old_clips if x.id in clip_ids] for clip in deleted_clips: engine.delete_clip(clip.engine_clip) do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do entry.destroy_func = destroy self._history_manager.add_entry(entry)
def on_delete(): clip_index = self._project.clips.index(clip) category = next(x for x in self._project.clip_categories if clip.id in x.clip_ids) category_index = category.clip_ids.index(clip.id) track_usages = set() for track in self._project.tracks: for i, clip_id in enumerate(track.measure_clip_ids): if clip_id == clip.id: track_usages.add((track, i)) def do(): self._project.clips.remove(clip) category.clip_ids.remove(clip.id) for track, index in track_usages: track.measure_clip_ids[index] = None self._project.update_track_length() if self._selected_clip_id == clip.id: self._selected_clip_id = None self._layout_widgets() self._update_tracks_func() def undo(): self._project.clips.insert(clip_index, clip) category.clip_ids.insert(category_index, clip.id) if len(track_usages) > 0: max_index = max(i for t, i in track_usages) self._project.ensure_track_length(max_index + 1) for track, index in track_usages: track.measure_clip_ids[index] = clip.id self._project.update_track_length() self._layout_widgets() self._update_tracks_func() def destroy(was_undone): if not was_undone: engine.delete_clip(clip.engine_clip) do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do entry.destroy_func = destroy self._history_manager.add_entry(entry)
def _solo_changed(self, track): soloed = self._track_widgets[track].soloed.checked old_soloed = track.soloed def do(): track.soloed = soloed self._track_widgets[track].soloed.set_checked(track.soloed) def undo(): track.soloed = old_soloed self._track_widgets[track].soloed.set_checked(track.soloed) do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do self._history_manager.add_entry(entry)
def on_delete(): track_index = self._project.tracks.index(track) def do(): self._project.tracks.remove(track) self._project.update_track_length() self._layout_widgets() def undo(): self._project.tracks.insert(track_index, track) self._project.update_track_length() self._layout_widgets() do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do self._history_manager.add_entry(entry)
def on_accept(name, gain): new_track = project.Track() new_track.name = name new_track.gain = gain def do(): self._project.tracks.append(new_track) self._layout_widgets() def undo(): self._project.tracks.remove(new_track) self._project.update_track_length() self._layout_widgets() do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do self._history_manager.add_entry(entry)
def on_accept(name, color, gain): new_category = project.ClipCategory() new_category.name = name new_category.color = color new_category.gain = gain def do(): self._project.clip_categories.append(new_category) self._layout_widgets() def undo(): self._project.clip_categories.remove(new_category) self._layout_widgets() do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do self._history_manager.add_entry(entry)
def on_accept(name, gain): if name == track.name and gain == track.gain: return # Nothing changed old_name = track.name old_gain = track.gain def do(): track.name = name track.gain = gain self._layout_widgets() def undo(): track.name = old_name track.gain = old_gain self._layout_widgets() do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do self._history_manager.add_entry(entry)
def on_accept(edited_clip): assert clip.measure_count == edited_clip.measure_count # Should not change when editing if (edited_clip.name == clip.name and edited_clip.sample_count == clip.sample_count and edited_clip.start_sample_index == clip.start_sample_index and edited_clip.end_sample_index == clip.end_sample_index and edited_clip.has_intro == clip.has_intro and edited_clip.has_outro == clip.has_outro and edited_clip.gain == clip.gain and edited_clip.engine_clip == clip.engine_clip): return # Nothing changed old_name = clip.name old_sample_count = clip.sample_count old_start_sample_index = clip.start_sample_index old_end_sample_index = clip.end_sample_index old_has_intro = clip.has_intro old_has_outro = clip.has_outro old_gain = clip.gain old_engine_clip = clip.engine_clip did_engine_clip_change = (edited_clip.engine_clip != clip.engine_clip) def do(): clip.name = edited_clip.name clip.sample_count = edited_clip.sample_count clip.start_sample_index = edited_clip.start_sample_index clip.end_sample_index = edited_clip.end_sample_index clip.has_intro = edited_clip.has_intro clip.has_outro = edited_clip.has_outro clip.gain = edited_clip.gain clip.engine_clip = edited_clip.engine_clip self._layout_widgets() self._update_tracks_func() def undo(): clip.name = old_name clip.sample_count = old_sample_count clip.start_sample_index = old_start_sample_index clip.end_sample_index = old_end_sample_index clip.has_intro = old_has_intro clip.has_outro = old_has_outro clip.gain = old_gain clip.engine_clip = old_engine_clip self._layout_widgets() self._update_tracks_func() def destroy(was_undone): if did_engine_clip_change: if was_undone: # We undid the edit, so delete the re-recorded engine clip engine.delete_clip(edited_clip.engine_clip) else: # We're holding the last reference to the original engine clip, so delete it engine.delete_clip(old_engine_clip) do() entry = history_manager.Entry() entry.undo_func = undo entry.redo_func = do entry.destroy_func = destroy self._history_manager.add_entry(entry)