split deck description into separate screen linked from overview
This commit is contained in:
parent
1ddfd73da6
commit
f6a59ebdfa
@ -233,9 +233,6 @@ class DeckConf(QDialog):
|
|||||||
f.showTimer.setChecked(c.get("timer", 0))
|
f.showTimer.setChecked(c.get("timer", 0))
|
||||||
f.autoplaySounds.setChecked(c["autoplay"])
|
f.autoplaySounds.setChecked(c["autoplay"])
|
||||||
f.replayQuestion.setChecked(c.get("replayq", True))
|
f.replayQuestion.setChecked(c.get("replayq", True))
|
||||||
# description
|
|
||||||
f.enable_markdown.setChecked(self.deck.get("md", False))
|
|
||||||
f.desc.setPlainText(self.deck["desc"])
|
|
||||||
gui_hooks.deck_conf_did_load_config(self, self.deck, self.conf)
|
gui_hooks.deck_conf_did_load_config(self, self.deck, self.conf)
|
||||||
|
|
||||||
def onRestore(self) -> None:
|
def onRestore(self) -> None:
|
||||||
@ -318,9 +315,6 @@ class DeckConf(QDialog):
|
|||||||
c["timer"] = f.showTimer.isChecked() and 1 or 0
|
c["timer"] = f.showTimer.isChecked() and 1 or 0
|
||||||
c["autoplay"] = f.autoplaySounds.isChecked()
|
c["autoplay"] = f.autoplaySounds.isChecked()
|
||||||
c["replayq"] = f.replayQuestion.isChecked()
|
c["replayq"] = f.replayQuestion.isChecked()
|
||||||
# description
|
|
||||||
self.deck["md"] = f.enable_markdown.isChecked()
|
|
||||||
self.deck["desc"] = f.desc.toPlainText()
|
|
||||||
gui_hooks.deck_conf_will_save_config(self, self.deck, self.conf)
|
gui_hooks.deck_conf_will_save_config(self, self.deck, self.conf)
|
||||||
self.mw.col.decks.save(self.deck)
|
self.mw.col.decks.save(self.deck)
|
||||||
self.mw.col.decks.save(self.conf)
|
self.mw.col.decks.save(self.conf)
|
||||||
|
76
qt/aqt/deckdescription.py
Normal file
76
qt/aqt/deckdescription.py
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import aqt
|
||||||
|
from anki.decks import Deck
|
||||||
|
from aqt.operations.deck import update_deck
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import addCloseShortcut, disable_help_button, restoreGeom, saveGeom, tr
|
||||||
|
|
||||||
|
|
||||||
|
class DeckDescriptionDialog(QDialog):
|
||||||
|
|
||||||
|
TITLE = "deckDescription"
|
||||||
|
silentlyClose = True
|
||||||
|
|
||||||
|
def __init__(self, mw: aqt.main.AnkiQt) -> None:
|
||||||
|
QDialog.__init__(self, mw, Qt.Window)
|
||||||
|
self.mw = mw
|
||||||
|
|
||||||
|
# set on success
|
||||||
|
self.deck: Deck
|
||||||
|
|
||||||
|
mw.query_op(mw.col.decks.get_current, success=self._setup_and_show)
|
||||||
|
|
||||||
|
def _setup_and_show(self, deck: Deck) -> None:
|
||||||
|
if deck.WhichOneof("kind") != "normal":
|
||||||
|
return
|
||||||
|
|
||||||
|
self.deck = deck
|
||||||
|
self._setup_ui()
|
||||||
|
self.show()
|
||||||
|
|
||||||
|
def _setup_ui(self) -> None:
|
||||||
|
self.setWindowTitle(tr.scheduling_description())
|
||||||
|
self.setWindowModality(Qt.ApplicationModal)
|
||||||
|
self.mw.garbage_collect_on_dialog_finish(self)
|
||||||
|
self.setMinimumWidth(400)
|
||||||
|
disable_help_button(self)
|
||||||
|
restoreGeom(self, self.TITLE)
|
||||||
|
addCloseShortcut(self)
|
||||||
|
|
||||||
|
box = QVBoxLayout()
|
||||||
|
|
||||||
|
label = QLabel(tr.scheduling_description_to_show_on_overview_screen())
|
||||||
|
box.addWidget(label)
|
||||||
|
|
||||||
|
self.enable_markdown = QCheckBox(tr.deck_config_description_markdown())
|
||||||
|
self.enable_markdown.setToolTip(tr.deck_config_description_markdown_hint())
|
||||||
|
self.enable_markdown.setChecked(self.deck.normal.markdown_description)
|
||||||
|
box.addWidget(self.enable_markdown)
|
||||||
|
|
||||||
|
self.description = QPlainTextEdit()
|
||||||
|
self.description.setPlainText(self.deck.normal.description)
|
||||||
|
box.addWidget(self.description)
|
||||||
|
|
||||||
|
button_box = QDialogButtonBox()
|
||||||
|
ok = button_box.addButton(QDialogButtonBox.Ok)
|
||||||
|
qconnect(ok.clicked, self.save_and_accept)
|
||||||
|
box.addWidget(button_box)
|
||||||
|
|
||||||
|
self.setLayout(box)
|
||||||
|
self.show()
|
||||||
|
|
||||||
|
def save_and_accept(self) -> None:
|
||||||
|
self.deck.normal.description = self.description.toPlainText()
|
||||||
|
self.deck.normal.markdown_description = self.enable_markdown.isChecked()
|
||||||
|
|
||||||
|
update_deck(parent=self, deck=self.deck).success(
|
||||||
|
lambda _: self.accept()
|
||||||
|
).run_in_background()
|
||||||
|
|
||||||
|
def accept(self) -> None:
|
||||||
|
saveGeom(self, self.TITLE)
|
||||||
|
QDialog.accept(self)
|
@ -643,48 +643,6 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab_4">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>scheduling_description</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>12</number>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>12</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>12</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>12</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>12</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_22">
|
|
||||||
<property name="text">
|
|
||||||
<string>scheduling_description_to_show_on_overview_screen</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="enable_markdown">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>deck_config_description_markdown_hint</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>deck_config_description_markdown</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QTextEdit" name="desc"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@ -725,7 +683,6 @@
|
|||||||
<tabstop>showTimer</tabstop>
|
<tabstop>showTimer</tabstop>
|
||||||
<tabstop>autoplaySounds</tabstop>
|
<tabstop>autoplaySounds</tabstop>
|
||||||
<tabstop>replayQuestion</tabstop>
|
<tabstop>replayQuestion</tabstop>
|
||||||
<tabstop>desc</tabstop>
|
|
||||||
</tabstops>
|
</tabstops>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="icons.qrc"/>
|
<include location="icons.qrc"/>
|
||||||
|
@ -6,7 +6,7 @@ from __future__ import annotations
|
|||||||
from typing import Optional, Sequence
|
from typing import Optional, Sequence
|
||||||
|
|
||||||
from anki.collection import OpChanges, OpChangesWithCount, OpChangesWithId
|
from anki.collection import OpChanges, OpChangesWithCount, OpChangesWithId
|
||||||
from anki.decks import DeckCollapseScope, DeckId, UpdateDeckConfigs
|
from anki.decks import Deck, DeckCollapseScope, DeckId, UpdateDeckConfigs
|
||||||
from aqt import QWidget
|
from aqt import QWidget
|
||||||
from aqt.operations import CollectionOp
|
from aqt.operations import CollectionOp
|
||||||
from aqt.utils import getOnlyText, tooltip, tr
|
from aqt.utils import getOnlyText, tooltip, tr
|
||||||
@ -86,3 +86,7 @@ def update_deck_configs(
|
|||||||
*, parent: QWidget, input: UpdateDeckConfigs
|
*, parent: QWidget, input: UpdateDeckConfigs
|
||||||
) -> CollectionOp[OpChanges]:
|
) -> CollectionOp[OpChanges]:
|
||||||
return CollectionOp(parent, lambda col: col.decks.update_deck_configs(input))
|
return CollectionOp(parent, lambda col: col.decks.update_deck_configs(input))
|
||||||
|
|
||||||
|
|
||||||
|
def update_deck(*, parent: QWidget, deck: Deck) -> CollectionOp[OpChanges]:
|
||||||
|
return CollectionOp(parent, lambda col: col.update_deck(deck))
|
||||||
|
@ -8,6 +8,7 @@ from typing import Any, Callable, Dict, List, Optional, Tuple
|
|||||||
import aqt
|
import aqt
|
||||||
from anki.collection import OpChanges
|
from anki.collection import OpChanges
|
||||||
from aqt import gui_hooks
|
from aqt import gui_hooks
|
||||||
|
from aqt.deckdescription import DeckDescriptionDialog
|
||||||
from aqt.operations.scheduling import empty_filtered_deck, rebuild_filtered_deck
|
from aqt.operations.scheduling import empty_filtered_deck, rebuild_filtered_deck
|
||||||
from aqt.sound import av_player
|
from aqt.sound import av_player
|
||||||
from aqt.toolbar import BottomBar
|
from aqt.toolbar import BottomBar
|
||||||
@ -102,6 +103,8 @@ class Overview:
|
|||||||
self.onStudyMore()
|
self.onStudyMore()
|
||||||
elif url == "unbury":
|
elif url == "unbury":
|
||||||
self.onUnbury()
|
self.onUnbury()
|
||||||
|
elif url == "description":
|
||||||
|
self.edit_description()
|
||||||
elif url.lower().startswith("http"):
|
elif url.lower().startswith("http"):
|
||||||
openLink(url)
|
openLink(url)
|
||||||
return False
|
return False
|
||||||
@ -242,6 +245,9 @@ class Overview:
|
|||||||
</center>
|
</center>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def edit_description(self) -> None:
|
||||||
|
DeckDescriptionDialog(self.mw)
|
||||||
|
|
||||||
# Bottom area
|
# Bottom area
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
@ -257,6 +263,7 @@ class Overview:
|
|||||||
# links.append(["F", "cram", _("Filter/Cram")])
|
# links.append(["F", "cram", _("Filter/Cram")])
|
||||||
if self.mw.col.sched.haveBuried():
|
if self.mw.col.sched.haveBuried():
|
||||||
links.append(["U", "unbury", tr.studying_unbury()])
|
links.append(["U", "unbury", tr.studying_unbury()])
|
||||||
|
links.append(["", "description", tr.scheduling_description()])
|
||||||
buf = ""
|
buf = ""
|
||||||
for b in links:
|
for b in links:
|
||||||
if b[0]:
|
if b[0]:
|
||||||
|
Loading…
Reference in New Issue
Block a user