Exemple #1
0
 async def run(self) -> None:
     with self.api.undo.capture(), self.api.gui.throttle_updates():
         indexes = await self.args.target.get_indexes()
         for idx, count in make_ranges(indexes):
             events = self.api.subs.events[idx:idx + count]
             events = sorted(events, key=lambda event: event.start)
             self.api.subs.events[idx:idx + count] = events
Exemple #2
0
    async def run(self) -> None:
        with self.api.undo.capture():
            indexes = await self.args.target.get_indexes()
            if not indexes:
                raise CommandUnavailable("nothing to delete")

            for start_idx, count in make_ranges(indexes, reverse=True):
                del self.api.subs.events[start_idx:start_idx + count]
Exemple #3
0
 def _move_below(self, indexes: list[int]) -> Iterable[AssEvent]:
     if indexes[-1] + 1 == len(self.api.subs.events):
         raise CommandUnavailable("cannot move further down")
     for idx, count in make_ranges(indexes, reverse=True):
         chunk = [copy(s) for s in self.api.subs.events[idx:idx + count]]
         self.api.subs.events[idx + count + 1:idx + count + 1] = chunk
         del self.api.subs.events[idx:idx + count]
         yield from chunk
Exemple #4
0
 def _move_above(self, indexes: list[int]) -> Iterable[AssEvent]:
     if indexes[0] == 0:
         raise CommandUnavailable("cannot move further up")
     for idx, count in make_ranges(indexes):
         chunk = [copy(s) for s in self.api.subs.events[idx:idx + count]]
         self.api.subs.events[idx - 1:idx - 1] = chunk
         del self.api.subs.events[idx + count:idx + count + count]
         yield from chunk
Exemple #5
0
 def _move_above(self, indexes: T.List[int]) -> T.Iterable[AssEvent]:
     if indexes[0] == 0:
         raise CommandUnavailable("cannot move further up")
     for idx, count in make_ranges(indexes):
         chunk = [copy(s) for s in self.api.subs.events[idx:idx + count]]
         self.api.subs.events.insert(idx - 1, *chunk)
         self.api.subs.events.remove(idx + count, count)
         yield from chunk
Exemple #6
0
def test_make_ranges(
    indexes: Iterable[int],
    reverse: bool,
    expected_ranges: list[tuple[int, int]],
) -> None:
    """Test whether make_ranges function produces correct ranges.

    :param indexes: input flat array of numbers
    :param reverse: whether to construct ranges in reverse order
    :param expected_ranges: list of expected tuples (idx, count)
    """
    actual_ranges = list(make_ranges(indexes, reverse=reverse))
    assert actual_ranges == expected_ranges
Exemple #7
0
    def _move_to(self, indexes: list[int],
                 base_idx: int) -> Iterable[AssEvent]:
        sub_copies: list[AssEvent] = []

        for idx, count in make_ranges(indexes, reverse=True):
            chunk = [copy(s) for s in self.api.subs.events[idx:idx + count]]
            chunk.reverse()
            sub_copies += chunk
            del self.api.subs.events[idx:idx + count]

        sub_copies.reverse()
        self.api.subs.events[base_idx:base_idx] = sub_copies
        return sub_copies
Exemple #8
0
    def _move_to(self, indexes: T.List[int],
                 base_idx: int) -> T.Iterable[AssEvent]:
        sub_copies: T.List[AssEvent] = []

        for idx, count in make_ranges(indexes, reverse=True):
            chunk = [copy(s) for s in self.api.subs.events[idx:idx + count]]
            chunk.reverse()
            sub_copies += chunk
            self.api.subs.events.remove(idx, count)

        sub_copies.reverse()
        self.api.subs.events.insert(base_idx, *sub_copies)
        return sub_copies
Exemple #9
0
    async def run(self) -> None:
        with self.api.undo.capture():
            indexes = await self.args.target.get_indexes()
            if not indexes:
                raise CommandUnavailable("nothing to delete")

            new_selection = set(self.api.subs.selected_events) - set(
                self.api.subs.events[idx] for idx in indexes)

            self.api.subs.selected_indexes = [
                sub.index for sub in new_selection if sub.index is not None
            ]
            for start_idx, count in make_ranges(indexes, reverse=True):
                self.api.subs.events.remove(start_idx, count)
Exemple #10
0
 async def run(self) -> None:
     attr_name = {
         SortStyle.START: "start",
         SortStyle.END: "end",
         SortStyle.ACTOR: "actor",
         SortStyle.STYLE: "style_name",
         SortStyle.LAYER: "layer",
     }[self.args.style]
     with self.api.undo.capture(), self.api.gui.throttle_updates():
         indexes = await self.args.target.get_indexes()
         for idx, count in make_ranges(indexes):
             events = self.api.subs.events[idx : idx + count]
             events = sorted(
                 events, key=lambda event: getattr(event, attr_name)
             )
             self.api.subs.events[idx : idx + count] = [
                 copy(event) for event in events
             ]
Exemple #11
0
 def _proxy_items_removed(
         self, event: ObservableSequenceItemRemovalEvent) -> None:
     for idx, count in make_ranges(item.index for item in event.items):
         self.rowsRemoved.emit(QModelIndex(), idx, idx + count - 1)