mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 14:32:22 -04:00
Copy card debug info (#3801)
* Added: Copy card debug info button * Fix: Button margins * Added: More info * Deleted useless info * Added: Revlog rows * Added: cardRow * Replaced button with shortcut * Fix: Copying new cards info error * ./check * Added: Rollover * Format outputted json * neatened imports * make linter happy * revert button changes * Value Error -> Assert * preserve normal copy functionality
This commit is contained in:
parent
055a8818bc
commit
4459e06f74
1 changed files with 57 additions and 0 deletions
|
@ -3,8 +3,11 @@
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
|
|
||||||
|
from google.protobuf.json_format import MessageToDict
|
||||||
|
|
||||||
import aqt
|
import aqt
|
||||||
from anki.cards import Card, CardId
|
from anki.cards import Card, CardId
|
||||||
from anki.errors import NotFoundError
|
from anki.errors import NotFoundError
|
||||||
|
@ -17,6 +20,7 @@ from aqt.utils import (
|
||||||
restoreGeom,
|
restoreGeom,
|
||||||
saveGeom,
|
saveGeom,
|
||||||
setWindowIcon,
|
setWindowIcon,
|
||||||
|
tooltip,
|
||||||
tr,
|
tr,
|
||||||
)
|
)
|
||||||
from aqt.webview import AnkiWebView, AnkiWebViewKind
|
from aqt.webview import AnkiWebView, AnkiWebViewKind
|
||||||
|
@ -64,8 +68,61 @@ class CardInfoDialog(QDialog):
|
||||||
buttons.setContentsMargins(10, 0, 10, 10)
|
buttons.setContentsMargins(10, 0, 10, 10)
|
||||||
layout.addWidget(buttons)
|
layout.addWidget(buttons)
|
||||||
qconnect(buttons.rejected, self.reject)
|
qconnect(buttons.rejected, self.reject)
|
||||||
|
|
||||||
|
self.copy_debug_info = QShortcut( # type: ignore
|
||||||
|
"ctrl+c", self, activated=lambda: self.copy_card_info(card_id)
|
||||||
|
)
|
||||||
|
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
def copy_card_info(self, card_id: CardId | None) -> None:
|
||||||
|
if self.web and self.web.selectedText():
|
||||||
|
self.web.onCopy()
|
||||||
|
return
|
||||||
|
if card_id is None:
|
||||||
|
return
|
||||||
|
assert aqt.mw.col.db, tr.errors_inconsistent_db_state()
|
||||||
|
|
||||||
|
proto_info = aqt.mw.col.card_stats_data(card_id)
|
||||||
|
info = MessageToDict(proto_info)
|
||||||
|
|
||||||
|
card = aqt.mw.col.get_card(card_id)
|
||||||
|
|
||||||
|
revlog = aqt.mw.col.db.execute(
|
||||||
|
f"SELECT * FROM revlog WHERE cid == {card_id} ORDER BY id DESC"
|
||||||
|
)
|
||||||
|
deck = aqt.mw.col.decks.get(card.did) or dict()
|
||||||
|
config = aqt.mw.col.decks.get_config(deck.get("conf", -1)) or dict()
|
||||||
|
|
||||||
|
info["deck"] = deck
|
||||||
|
info["config"] = config
|
||||||
|
|
||||||
|
info["config"].pop("name", None)
|
||||||
|
info["deck"].pop("name", None)
|
||||||
|
info["deck"].pop("desc", None)
|
||||||
|
info["deck"].pop("usn", None)
|
||||||
|
info.pop("usn", None)
|
||||||
|
info.pop("cardType", None)
|
||||||
|
info.pop("notetype", None)
|
||||||
|
info.pop("preset", None)
|
||||||
|
|
||||||
|
info["cardRow"] = aqt.mw.col.db.execute(
|
||||||
|
f"SELECT * FROM cards WHERE id == {card_id} ORDER BY id DESC"
|
||||||
|
)[0]
|
||||||
|
|
||||||
|
new_revlog = [
|
||||||
|
{"row": revlog, "info": card_info_review}
|
||||||
|
for revlog, card_info_review in zip(revlog, info.get("revlog", []))
|
||||||
|
]
|
||||||
|
info["revlog"] = new_revlog
|
||||||
|
info["rollover"] = aqt.mw.col.get_config("rollover")
|
||||||
|
|
||||||
|
clipboard = QApplication.clipboard()
|
||||||
|
assert clipboard is not None
|
||||||
|
clipboard.setText(json.dumps(info, indent=2))
|
||||||
|
|
||||||
|
tooltip(tr.about_copied_to_clipboard())
|
||||||
|
|
||||||
def update_card(self, card_id: CardId | None) -> None:
|
def update_card(self, card_id: CardId | None) -> None:
|
||||||
try:
|
try:
|
||||||
self.mw.col.get_card(card_id)
|
self.mw.col.get_card(card_id)
|
||||||
|
|
Loading…
Reference in a new issue