feat(app): the library's options move, import into and set how a studyset is studied

A studyset's options in the library now offer, as on its own screen,
Edit, Move to…, Study options, Import from Anki, Archive and Delete.
Moving goes through the same sheet and says where the studyset went;
importing reads an Anki deck into it as Add material does.

Study options say how a studyset is studied, on every device: how many
new cards it starts a day (by default as the person's study settings
say), how many reviews it brings a day (no limit by default; cards in
their learning steps come anyway), and whether reviews or new cards
come first, or the new ones spread evenly among the reviews. They live
in the studyset's payload, schema 3; a studyset without them is still
written in schema 2, so that older apps, which skip a payload in a
newer schema whole, keep seeing every studyset nobody gave options.
Editing a studyset keeps its options, and Reset to defaults takes them
away.

The study queue takes each studyset's limits for its own cards and the
order of the studyset studied; a card's schedule now knows when it was
last reviewed, to count the reviews of the day. Sessions, the round's
end and the library's badges all count the same way, the badges now
with the person's own number of new cards a day too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-07 02:18:42 +02:00
commit d42afb078a
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -2587,9 +2587,63 @@ abstract class AppLocalizations {
/// No description provided for @studySettingsNewPerDayHint.
///
/// In en, this message translates to:
/// **'How many never-studied cards each studyset starts a day. Due reviews are never limited.'**
/// **'How many never-studied cards each studyset starts a day, unless its own study options say otherwise.'**
String get studySettingsNewPerDayHint;
/// No description provided for @studyOptionsTitle.
///
/// In en, this message translates to:
/// **'Study options'**
String get studyOptionsTitle;
/// No description provided for @studyOptionsDescription.
///
/// In en, this message translates to:
/// **'How many cards this studyset brings a day, and which come first, on every device. The studysets inside it keep their own.'**
String get studyOptionsDescription;
/// No description provided for @studyOptionsReviewsPerDay.
///
/// In en, this message translates to:
/// **'Reviews per day'**
String get studyOptionsReviewsPerDay;
/// No description provided for @studyOptionsReviewsPerDayHint.
///
/// In en, this message translates to:
/// **'Cards in their learning steps come anyway.'**
String get studyOptionsReviewsPerDayHint;
/// No description provided for @studyOptionsOrder.
///
/// In en, this message translates to:
/// **'Order'**
String get studyOptionsOrder;
/// No description provided for @studyOptionsReviewsFirst.
///
/// In en, this message translates to:
/// **'Reviews first'**
String get studyOptionsReviewsFirst;
/// No description provided for @studyOptionsMixed.
///
/// In en, this message translates to:
/// **'Mixed'**
String get studyOptionsMixed;
/// No description provided for @studyOptionsNewFirst.
///
/// In en, this message translates to:
/// **'New first'**
String get studyOptionsNewFirst;
/// No description provided for @studyOptionsReset.
///
/// In en, this message translates to:
/// **'Reset to defaults'**
String get studyOptionsReset;
/// No description provided for @studySettingsUnlimited.
///
/// In en, this message translates to: