Exemple #1
0
    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)
Exemple #2
0
        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)
Exemple #3
0
        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)
Exemple #4
0
        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)
Exemple #5
0
        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)
Exemple #6
0
    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)
Exemple #7
0
        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)
Exemple #8
0
        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)
Exemple #9
0
        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)
Exemple #10
0
        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)
Exemple #11
0
        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)