Add DeckLimitsDialog

This commit is contained in:
RumovZ 2022-07-08 23:16:17 +02:00
parent 0bda496218
commit eb0e2a62d3
7 changed files with 255 additions and 44 deletions

View file

@ -30,3 +30,4 @@ decks-study = Study
decks-study-deck = Study Deck
decks-filtered-deck-search-empty = No cards matched the provided search. Some cards may have been excluded because they are in a different filtered deck, or suspended.
decks-unmovable-cards = Show any excluded cards
decks-override-preset-limits = Override preset limits

51
qt/aqt/deck_limits.py Normal file
View file

@ -0,0 +1,51 @@
# 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.forms
import aqt.main
from anki.decks import DeckDict
from aqt.operations.deck import update_deck_dict
from aqt.qt import *
from aqt.utils import disable_help_button
class DeckLimitsDialog(QDialog):
def __init__(self, mw: aqt.main.AnkiQt, deck: DeckDict):
super().__init__(parent=mw)
self.mw = mw
self.col = mw.col
self.deck = deck
self.frm = aqt.forms.deck_limits.Ui_Dialog()
self.frm.setupUi(self)
disable_help_button(self)
self._setup()
self.open()
def _setup(self) -> None:
review_limit = self.deck["reviewLimit"]
new_limit = self.deck["newLimit"]
self.frm.review_limit.setValue(review_limit or 0)
self.frm.new_limit.setValue(new_limit or 0)
enabled = None not in (review_limit, new_limit)
self.frm.enable_override.setChecked(enabled)
self.frm.review_limit.setEnabled(enabled)
self.frm.new_limit.setEnabled(enabled)
qconnect(self.frm.enable_override.toggled, self._on_override_toggled)
def _on_override_toggled(self) -> None:
enabled = self.frm.enable_override.isChecked()
self.frm.review_limit.setEnabled(enabled)
self.frm.new_limit.setEnabled(enabled)
def accept(self) -> None:
if self.frm.enable_override.isChecked():
self.deck["reviewLimit"] = self.frm.review_limit.value()
self.deck["newLimit"] = self.frm.new_limit.value()
else:
self.deck["reviewLimit"] = self.deck["newLimit"] = None
update_deck_dict(parent=self.mw, deck=self.deck).run_in_background()
super().accept()

View file

@ -10,8 +10,9 @@ from typing import Any
import aqt
import aqt.operations
from anki.collection import OpChanges
from anki.decks import DeckCollapseScope, DeckId, DeckTreeNode
from anki.decks import DeckCollapseScope, DeckDict, DeckId, DeckTreeNode
from aqt import AnkiQt, gui_hooks
from aqt.deck_limits import DeckLimitsDialog
from aqt.deckoptions import display_options_for_deck_id
from aqt.operations import QueryOp
from aqt.operations.deck import (
@ -264,11 +265,15 @@ class DeckBrowser:
##########################################################################
def _showOptions(self, did: str) -> None:
deck = self.mw.col.decks.get(did)
m = QMenu(self.mw)
a = m.addAction(tr.actions_rename())
qconnect(a.triggered, lambda b, did=did: self._rename(DeckId(int(did))))
a = m.addAction(tr.actions_options())
qconnect(a.triggered, lambda b, did=did: self._options(DeckId(int(did))))
if not deck["dyn"]:
a = m.addAction(tr.deck_config_daily_limits())
qconnect(a.triggered, lambda _: self._limits(deck))
a = m.addAction(tr.actions_export())
qconnect(a.triggered, lambda b, did=did: self._export(DeckId(int(did))))
a = m.addAction(tr.actions_delete())
@ -296,6 +301,9 @@ class DeckBrowser:
def _options(self, did: DeckId) -> None:
display_options_for_deck_id(did)
def _limits(self, deck: DeckDict) -> None:
DeckLimitsDialog(self.mw, deck)
def _collapse(self, did: DeckId) -> None:
node = self.mw.col.decks.find_deck_in_tree(self._dueTree, did)
if node:

View file

@ -1,43 +1,46 @@
from . import about
from . import addcards
from . import addfield
from . import addmodel
from . import addonconf
from . import addons
from . import browser
from . import browserdisp
from . import browseropts
from . import changemap
from . import changemodel
from . import clayout_top
from . import customstudy
from . import dconf
from . import debug
from . import filtered_deck
from . import forget
from . import editaddon
from . import editcurrent
from . import edithtml
from . import emptycards
from . import exporting
from . import fields
from . import fields_web
from . import finddupes
from . import findreplace
from . import getaddons
from . import importing
from . import main
from . import modelopts
from . import models
from . import preferences
from . import preview
from . import profiles
from . import progress
from . import reposition
from . import setgroup
from . import setlang
from . import stats
from . import studydeck
from . import synclog
from . import taglimit
from . import template
from . import (
about,
addcards,
addfield,
addmodel,
addonconf,
addons,
browser,
browserdisp,
browseropts,
changemap,
changemodel,
clayout_top,
customstudy,
dconf,
debug,
deck_limits,
editaddon,
editcurrent,
edithtml,
emptycards,
exporting,
fields,
fields_web,
filtered_deck,
finddupes,
findreplace,
forget,
getaddons,
importing,
main,
modelopts,
models,
preferences,
preview,
profiles,
progress,
reposition,
setgroup,
setlang,
stats,
studydeck,
synclog,
taglimit,
template,
)

View file

@ -0,0 +1,6 @@
from aqt.qt import qtmajor
if qtmajor > 5:
from .deck_limits_qt6 import *
else:
from .deck_limits_qt5 import * # type: ignore

141
qt/aqt/forms/deck_limits.ui Normal file
View file

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>273</width>
<height>134</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">Anki</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="enable_override">
<property name="text">
<string>decks_override_preset_limits</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>scheduling_maximum_reviewsday</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="review_limit">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>scheduling_new_cardsday</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="new_limit">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frame">
<bool>true</bool>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>Dialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>Dialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View file

@ -0,0 +1 @@
../../../.bazel/bin/qt/aqt/forms/deck_limits_qt6.py