mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 22:12:21 -04:00
deck rename with perform_op()
This commit is contained in:
parent
6a11c0398c
commit
0123a382ec
5 changed files with 38 additions and 30 deletions
|
@ -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
|
||||||
#############################################################
|
#############################################################
|
||||||
|
|
|
@ -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
|
||||||
|
)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
if new_name == deck["name"]:
|
||||||
|
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
|
lambda other: other.item_type == SidebarItemType.DECK
|
||||||
and other.id == item.id
|
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())
|
||||||
|
|
|
@ -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)?;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue