mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 22:12:21 -04:00
Add DeckLimitsDialog
This commit is contained in:
parent
0bda496218
commit
eb0e2a62d3
7 changed files with 255 additions and 44 deletions
|
@ -30,3 +30,4 @@ decks-study = Study
|
||||||
decks-study-deck = Study Deck
|
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-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-unmovable-cards = Show any excluded cards
|
||||||
|
decks-override-preset-limits = Override preset limits
|
||||||
|
|
51
qt/aqt/deck_limits.py
Normal file
51
qt/aqt/deck_limits.py
Normal 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()
|
|
@ -10,8 +10,9 @@ from typing import Any
|
||||||
import aqt
|
import aqt
|
||||||
import aqt.operations
|
import aqt.operations
|
||||||
from anki.collection import OpChanges
|
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 import AnkiQt, gui_hooks
|
||||||
|
from aqt.deck_limits import DeckLimitsDialog
|
||||||
from aqt.deckoptions import display_options_for_deck_id
|
from aqt.deckoptions import display_options_for_deck_id
|
||||||
from aqt.operations import QueryOp
|
from aqt.operations import QueryOp
|
||||||
from aqt.operations.deck import (
|
from aqt.operations.deck import (
|
||||||
|
@ -264,11 +265,15 @@ class DeckBrowser:
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
def _showOptions(self, did: str) -> None:
|
def _showOptions(self, did: str) -> None:
|
||||||
|
deck = self.mw.col.decks.get(did)
|
||||||
m = QMenu(self.mw)
|
m = QMenu(self.mw)
|
||||||
a = m.addAction(tr.actions_rename())
|
a = m.addAction(tr.actions_rename())
|
||||||
qconnect(a.triggered, lambda b, did=did: self._rename(DeckId(int(did))))
|
qconnect(a.triggered, lambda b, did=did: self._rename(DeckId(int(did))))
|
||||||
a = m.addAction(tr.actions_options())
|
a = m.addAction(tr.actions_options())
|
||||||
qconnect(a.triggered, lambda b, did=did: self._options(DeckId(int(did))))
|
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())
|
a = m.addAction(tr.actions_export())
|
||||||
qconnect(a.triggered, lambda b, did=did: self._export(DeckId(int(did))))
|
qconnect(a.triggered, lambda b, did=did: self._export(DeckId(int(did))))
|
||||||
a = m.addAction(tr.actions_delete())
|
a = m.addAction(tr.actions_delete())
|
||||||
|
@ -296,6 +301,9 @@ class DeckBrowser:
|
||||||
def _options(self, did: DeckId) -> None:
|
def _options(self, did: DeckId) -> None:
|
||||||
display_options_for_deck_id(did)
|
display_options_for_deck_id(did)
|
||||||
|
|
||||||
|
def _limits(self, deck: DeckDict) -> None:
|
||||||
|
DeckLimitsDialog(self.mw, deck)
|
||||||
|
|
||||||
def _collapse(self, did: DeckId) -> None:
|
def _collapse(self, did: DeckId) -> None:
|
||||||
node = self.mw.col.decks.find_deck_in_tree(self._dueTree, did)
|
node = self.mw.col.decks.find_deck_in_tree(self._dueTree, did)
|
||||||
if node:
|
if node:
|
||||||
|
|
|
@ -1,43 +1,46 @@
|
||||||
from . import about
|
from . import (
|
||||||
from . import addcards
|
about,
|
||||||
from . import addfield
|
addcards,
|
||||||
from . import addmodel
|
addfield,
|
||||||
from . import addonconf
|
addmodel,
|
||||||
from . import addons
|
addonconf,
|
||||||
from . import browser
|
addons,
|
||||||
from . import browserdisp
|
browser,
|
||||||
from . import browseropts
|
browserdisp,
|
||||||
from . import changemap
|
browseropts,
|
||||||
from . import changemodel
|
changemap,
|
||||||
from . import clayout_top
|
changemodel,
|
||||||
from . import customstudy
|
clayout_top,
|
||||||
from . import dconf
|
customstudy,
|
||||||
from . import debug
|
dconf,
|
||||||
from . import filtered_deck
|
debug,
|
||||||
from . import forget
|
deck_limits,
|
||||||
from . import editaddon
|
editaddon,
|
||||||
from . import editcurrent
|
editcurrent,
|
||||||
from . import edithtml
|
edithtml,
|
||||||
from . import emptycards
|
emptycards,
|
||||||
from . import exporting
|
exporting,
|
||||||
from . import fields
|
fields,
|
||||||
from . import fields_web
|
fields_web,
|
||||||
from . import finddupes
|
filtered_deck,
|
||||||
from . import findreplace
|
finddupes,
|
||||||
from . import getaddons
|
findreplace,
|
||||||
from . import importing
|
forget,
|
||||||
from . import main
|
getaddons,
|
||||||
from . import modelopts
|
importing,
|
||||||
from . import models
|
main,
|
||||||
from . import preferences
|
modelopts,
|
||||||
from . import preview
|
models,
|
||||||
from . import profiles
|
preferences,
|
||||||
from . import progress
|
preview,
|
||||||
from . import reposition
|
profiles,
|
||||||
from . import setgroup
|
progress,
|
||||||
from . import setlang
|
reposition,
|
||||||
from . import stats
|
setgroup,
|
||||||
from . import studydeck
|
setlang,
|
||||||
from . import synclog
|
stats,
|
||||||
from . import taglimit
|
studydeck,
|
||||||
from . import template
|
synclog,
|
||||||
|
taglimit,
|
||||||
|
template,
|
||||||
|
)
|
||||||
|
|
6
qt/aqt/forms/deck_limits.py
Normal file
6
qt/aqt/forms/deck_limits.py
Normal 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
141
qt/aqt/forms/deck_limits.ui
Normal 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>
|
1
qt/aqt/forms/deck_limits_qt6.py
Normal file
1
qt/aqt/forms/deck_limits_qt6.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
../../../.bazel/bin/qt/aqt/forms/deck_limits_qt6.py
|
Loading…
Reference in a new issue