feat(app): the studyset screen with its topics, the tree's own screen
All checks were successful
CI / check (push) Successful in 5m28s
CI / deploy (push) Successful in 7s

A studyset's screen, as decided with the tree (2026-09-30/10-01):

- A breadcrumb from the library down to the studyset; its steps go up
  (replacing the location, so back leads further up), and steps that
  don't fit fold into a "…" listing them, nearest first.
- From expanded windows on, two columns: the description over the topics,
  the flashcards beside them, Study and Add material in the app bar. Below
  that, the topics are in a drawer, opened from a bar at the bottom that
  also holds Study and Add material and slides away while reading onwards;
  the back button stays where a drawer would have taken its place.
- The topics: "All topics" for the whole studyset, then the studysets
  inside it in their order, each with the study it invites, what it holds
  and its options (edit, delete), opening on top of this screen; a switch
  rearranges them by dragging; "New sub-studyset" creates one inside.
- Study covers the studyset with everything inside it ("Learn 12" while
  something is due). Add material offers flashcards for now.
- Options: Edit (the sheet, now with the description, edited in the whole
  window, and for a studyset inside another the colour of the one it is
  in, which a new one takes at first), Move to… (the tree and the top
  level, without the studyset itself and what is inside it), Archive or
  Unarchive with Undo, Delete with Undo, which closes the screen.
- The description cut short when long, the whole a tap away; the licence
  as the last line, linking to its text where that is known.

The list's bloc, scoped to a parent, lists its children, works out the
studyset's own progress, creates inside it, reorders and moves. The card
list leaves adding and studying to the screen. The inline editing of the
title and description, and its bloc, are gone.

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-01 12:59:20 +02:00
commit 31d87e8415
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -91,7 +91,7 @@ void main() {
testWidgets('says when a studyset has no cards yet', (tester) async {
await showList(tester);
expect(find.text('No cards yet.'), findsOneWidget);
expect(find.text('No flashcards yet'), findsOneWidget);
});
testWidgets('lists the cards in order, front and back', (tester) async {
@ -118,8 +118,13 @@ void main() {
testWidgets('a new card can be saved only with content', (tester) async {
await showList(tester);
await tester.tap(find.text('Add card'));
await tester.tap(find.text('Add material'));
await tester.pumpAndSettle();
await tester.tap(find.text('Create flashcards'));
// A menu item acts once the menu has closed, a frame later.
await tester.pump();
await tester.pump();
// Flushes the editor's timers.
await tester.pump(const Duration(seconds: 1));
expect(find.text('New card'), findsOneWidget);
@ -191,6 +196,6 @@ void main() {
await tester.pumpAndSettle();
expect(gateway.deletions, ['blank $id', 'delete $id']);
expect(find.text('No cards yet.'), findsOneWidget);
expect(find.text('No flashcards yet'), findsOneWidget);
});
}