Rework display of available cards in custom study

In v3, it's more informative to show the count of child decks separately,
since increasing the limit of the current deck does not increase the limits
of child decks. When we rework the decks list in the future, a tooltip
will hopefully provide an easier way for users to see where cards are
available, and where limits are being applied.

Closes #1868
This commit is contained in:
Damien Elmes 2022-05-20 17:13:46 +10:00
parent aed3988d48
commit 82196753ec
5 changed files with 52 additions and 8 deletions

View file

@ -24,8 +24,11 @@ custom-study-select = Select
custom-study-select-tags-to-exclude = Select tags to exclude: custom-study-select-tags-to-exclude = Select tags to exclude:
custom-study-selective-study = Selective Study custom-study-selective-study = Selective Study
custom-study-study-by-card-state-or-tag = Study by card state or tag custom-study-study-by-card-state-or-tag = Study by card state or tag
custom-study-available-new-cards = Available new cards: { $count } custom-study-available-new-cards-2 = Available new cards: { $countString }
custom-study-available-review-cards = Available review cards: { $count } custom-study-available-review-cards-2 = Available review cards: { $countString }
custom-study-available-child-count = ({ $count } in subdecks)
## DEPRECATED - you do not need to translate these. ## DEPRECATED - you do not need to translate these.
custom-study-available-new-cards = Available new cards: { $count }
custom-study-available-review-cards = Available review cards: { $count }

View file

@ -291,4 +291,7 @@ message CustomStudyDefaultsResponse {
uint32 extend_review = 3; uint32 extend_review = 3;
uint32 available_new = 4; uint32 available_new = 4;
uint32 available_review = 5; uint32 available_review = 5;
// in v3, counts for children are provided separately
uint32 available_new_in_children = 6;
uint32 available_review_in_children = 7;
} }

View file

@ -1,6 +1,8 @@
# Copyright: Ankitects Pty Ltd and contributors # Copyright: Ankitects Pty Ltd and contributors
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
from __future__ import annotations
from typing import Tuple from typing import Tuple
import aqt import aqt
@ -75,6 +77,12 @@ class CustomStudy(QDialog):
qconnect(f.radioPreview.clicked, lambda: self.onRadioChange(RADIO_PREVIEW)) qconnect(f.radioPreview.clicked, lambda: self.onRadioChange(RADIO_PREVIEW))
qconnect(f.radioCram.clicked, lambda: self.onRadioChange(RADIO_CRAM)) qconnect(f.radioCram.clicked, lambda: self.onRadioChange(RADIO_CRAM))
def count_with_children(self, parent: int, children: int) -> str:
if children:
return f"{parent} {tr.custom_study_available_child_count(children)}"
else:
return str(parent)
def onRadioChange(self, idx: int) -> None: def onRadioChange(self, idx: int) -> None:
form = self.form form = self.form
min_spinner_value = 1 min_spinner_value = 1
@ -86,15 +94,21 @@ class CustomStudy(QDialog):
ok = tr.custom_study_ok() ok = tr.custom_study_ok()
if idx == RADIO_NEW: if idx == RADIO_NEW:
title_text = tr.custom_study_available_new_cards( title_text = tr.custom_study_available_new_cards_2(
count=self.defaults.available_new count_string=self.count_with_children(
self.defaults.available_new,
self.defaults.available_new_in_children,
),
) )
text_before_spinner = tr.custom_study_increase_todays_new_card_limit_by() text_before_spinner = tr.custom_study_increase_todays_new_card_limit_by()
current_spinner_value = self.defaults.extend_new current_spinner_value = self.defaults.extend_new
min_spinner_value = -DYN_MAX_SIZE min_spinner_value = -DYN_MAX_SIZE
elif idx == RADIO_REV: elif idx == RADIO_REV:
title_text = tr.custom_study_available_review_cards( title_text = tr.custom_study_available_review_cards_2(
count=self.defaults.available_review count_string=self.count_with_children(
self.defaults.available_review,
self.defaults.available_review_in_children,
),
) )
text_before_spinner = tr.custom_study_increase_todays_review_limit_by() text_before_spinner = tr.custom_study_increase_todays_review_limit_by()
current_spinner_value = self.defaults.extend_review current_spinner_value = self.defaults.extend_review

View file

@ -1,5 +1,6 @@
# Copyright: Ankitects Pty Ltd and contributors # Copyright: Ankitects Pty Ltd and contributors
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
from __future__ import annotations from __future__ import annotations
import enum import enum

View file

@ -34,8 +34,29 @@ impl Collection {
.deck_tree(Some(TimestampSecs::now()))? .deck_tree(Some(TimestampSecs::now()))?
.get_deck(deck_id) .get_deck(deck_id)
.ok_or(AnkiError::NotFound)?; .ok_or(AnkiError::NotFound)?;
let available_new = subtree.sum(|node| node.new_uncapped); let v3 = self.get_config_bool(BoolKey::Sched2021);
let available_review = subtree.sum(|node| node.review_uncapped); let available_new_including_children = subtree.sum(|node| node.new_uncapped);
let available_review_including_children = subtree.sum(|node| node.review_uncapped);
let (
available_new,
available_new_in_children,
available_review,
available_review_in_children,
) = if v3 {
(
subtree.new_uncapped,
available_new_including_children - subtree.new_uncapped,
subtree.review_uncapped,
available_review_including_children - subtree.review_uncapped,
)
} else {
(
available_new_including_children,
0,
available_review_including_children,
0,
)
};
// tags // tags
let include_tags: HashSet<String> = self.get_config_default( let include_tags: HashSet<String> = self.get_config_default(
DeckConfigKey::CustomStudyIncludeTags DeckConfigKey::CustomStudyIncludeTags
@ -67,6 +88,8 @@ impl Collection {
extend_review, extend_review,
available_new, available_new,
available_review, available_review,
available_new_in_children,
available_review_in_children,
}) })
} }
} }