deck rename with perform_op()

This commit is contained in:
Damien Elmes 2021-03-22 20:38:51 +10:00
parent 6a11c0398c
commit 0123a382ec
5 changed files with 38 additions and 30 deletions

View file

@ -11,7 +11,7 @@ from typing import Any, Dict, Iterable, List, Optional, Sequence, Tuple, Union
import anki # pylint: disable=unused-import import anki # pylint: disable=unused-import
import anki._backend.backend_pb2 as _pb import anki._backend.backend_pb2 as _pb
from anki.collection import OpChangesWithCount from anki.collection import OpChanges, OpChangesWithCount
from anki.consts import * from anki.consts import *
from anki.errors import NotFoundError from anki.errors import NotFoundError
from anki.utils import from_json_bytes, ids2str, intTime, legacy_func, to_json_bytes from anki.utils import from_json_bytes, ids2str, intTime, legacy_func, to_json_bytes
@ -260,13 +260,13 @@ class DeckManager:
deck=to_json_bytes(g), preserve_usn_and_mtime=preserve_usn deck=to_json_bytes(g), preserve_usn_and_mtime=preserve_usn
) )
def rename(self, deck: Union[Deck, int], new_name: str) -> None: def rename(self, deck: Union[Deck, DeckID], new_name: str) -> OpChanges:
"Rename deck prefix to NAME if not exists. Updates children." "Rename deck prefix to NAME if not exists. Updates children."
if isinstance(deck, int): if isinstance(deck, int):
deck_id = deck deck_id = deck
else: else:
deck_id = deck["id"] deck_id = deck["id"]
self.col._backend.rename_deck(deck_id=deck_id, new_name=new_name) return self.col._backend.rename_deck(deck_id=deck_id, new_name=new_name)
# Drag/drop # Drag/drop
############################################################# #############################################################

View file

@ -3,7 +3,7 @@
from __future__ import annotations from __future__ import annotations
from typing import Sequence from typing import Callable, Sequence
from anki.decks import DeckID from anki.decks import DeckID
from anki.lang import TR from anki.lang import TR
@ -34,3 +34,15 @@ def reparent_decks(
tr(TR.BROWSING_REPARENTED_DECKS, count=out.count), parent=parent tr(TR.BROWSING_REPARENTED_DECKS, count=out.count), parent=parent
), ),
) )
def rename_deck(
*,
mw: AnkiQt,
deck_id: DeckID,
new_name: str,
after_rename: Callable[[], None] = None,
) -> None:
mw.perform_op(
lambda: mw.col.decks.rename(deck_id, new_name), after_hooks=after_rename
)

View file

@ -13,7 +13,7 @@ from anki.decks import DeckTreeNode
from anki.errors import DeckIsFilteredError from anki.errors import DeckIsFilteredError
from anki.utils import intTime from anki.utils import intTime
from aqt import AnkiQt, gui_hooks from aqt import AnkiQt, gui_hooks
from aqt.deck_ops import remove_decks, reparent_decks from aqt.deck_ops import remove_decks, rename_deck, reparent_decks
from aqt.qt import * from aqt.qt import *
from aqt.sound import av_player from aqt.sound import av_player
from aqt.toolbar import BottomBar from aqt.toolbar import BottomBar
@ -276,19 +276,12 @@ class DeckBrowser:
def _rename(self, did: int) -> None: def _rename(self, did: int) -> None:
deck = self.mw.col.decks.get(did) deck = self.mw.col.decks.get(did)
oldName = deck["name"] current_name = deck["name"]
newName = getOnlyText(tr(TR.DECKS_NEW_DECK_NAME), default=oldName) new_name = getOnlyText(tr(TR.DECKS_NEW_DECK_NAME), default=current_name)
newName = newName.replace('"', "") if not new_name or new_name == current_name:
if not newName or newName == oldName:
return return
try:
self.mw.col.decks.rename(deck, newName) rename_deck(mw=self.mw, deck_id=did, new_name=new_name)
gui_hooks.sidebar_should_refresh_decks()
except DeckIsFilteredError as err:
showWarning(str(err))
return
self.mw.update_undo_actions()
self.show()
def _options(self, did: str) -> None: def _options(self, did: str) -> None:
# select the deck first, because the dyn deck conf assumes the deck # select the deck first, because the dyn deck conf assumes the deck

View file

@ -9,13 +9,13 @@ from typing import Dict, Iterable, List, Optional, Tuple, cast
import aqt import aqt
from anki.collection import Config, OpChanges, SearchJoiner, SearchNode from anki.collection import Config, OpChanges, SearchJoiner, SearchNode
from anki.decks import DeckTreeNode from anki.decks import DeckTreeNode
from anki.errors import DeckIsFilteredError, InvalidInput from anki.errors import InvalidInput
from anki.notes import Note from anki.notes import Note
from anki.tags import TagTreeNode from anki.tags import TagTreeNode
from anki.types import assert_exhaustive from anki.types import assert_exhaustive
from aqt import colors, gui_hooks from aqt import colors, gui_hooks
from aqt.clayout import CardLayout from aqt.clayout import CardLayout
from aqt.deck_ops import remove_decks, reparent_decks from aqt.deck_ops import remove_decks, rename_deck, reparent_decks
from aqt.models import Models from aqt.models import Models
from aqt.qt import * from aqt.qt import *
from aqt.tag_ops import remove_tags_for_all_notes, rename_tag, reparent_tags from aqt.tag_ops import remove_tags_for_all_notes, rename_tag, reparent_tags
@ -26,7 +26,6 @@ from aqt.utils import (
askUser, askUser,
getOnlyText, getOnlyText,
show_invalid_search_error, show_invalid_search_error,
showWarning,
tr, tr,
) )
@ -1154,18 +1153,21 @@ class SidebarTreeView(QTreeView):
def rename_deck(self, item: SidebarItem, new_name: str) -> None: def rename_deck(self, item: SidebarItem, new_name: str) -> None:
deck = self.mw.col.decks.get(item.id) deck = self.mw.col.decks.get(item.id)
new_name = item.name_prefix + new_name if not new_name:
try:
self.mw.col.decks.rename(deck, new_name)
except DeckIsFilteredError as err:
showWarning(str(err))
return return
self.refresh( new_name = item.name_prefix + new_name
lambda other: other.item_type == SidebarItemType.DECK if new_name == deck["name"]:
and other.id == item.id return
rename_deck(
mw=self.mw,
deck_id=item.id,
new_name=new_name,
after_rename=lambda: self.refresh(
lambda other: other.item_type == SidebarItemType.DECK
and other.id == item.id
),
) )
self.mw.deckBrowser.refresh()
self.mw.update_undo_actions()
def delete_decks(self, _item: SidebarItem) -> None: def delete_decks(self, _item: SidebarItem) -> None:
remove_decks(mw=self.mw, parent=self.browser, deck_ids=self._selected_decks()) remove_decks(mw=self.mw, parent=self.browser, deck_ids=self._selected_decks())

View file

@ -268,6 +268,7 @@ impl Collection {
let timing = updater.timing; let timing = updater.timing;
let mut card = updater.into_card(); let mut card = updater.into_card();
self.update_card_inner(&mut card, original, usn)?; self.update_card_inner(&mut card, original, usn)?;
println!("fixme: add_leech calls update_note_tags() which creates a transaction");
if answer.new_state.leeched() { if answer.new_state.leeched() {
self.add_leech_tag(card.note_id)?; self.add_leech_tag(card.note_id)?;
} }