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
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]
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
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
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
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
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
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
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)
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 ]
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)