diff --git a/ftl/core/deck-config.ftl b/ftl/core/deck-config.ftl index d21b005eb..58b58cab2 100644 --- a/ftl/core/deck-config.ftl +++ b/ftl/core/deck-config.ftl @@ -122,8 +122,11 @@ deck-config-review-sort-order-tooltip = The default order prioritizes cards that have been waiting longest, so that if you have a backlog of reviews, the longest-waiting ones will appear first. If you have a large backlog that will take more than a few days to - clear, you may find the alternate sort orders preferable. + clear, or wish to see cards in subdeck order, you may find the alternate + sort orders preferable. deck-config-sort-order-due-date-then-random = Due date, then random +deck-config-sort-order-due-date-then-deck = Due date, then deck +deck-config-sort-order-deck-then-due-date = Deck, then due date deck-config-sort-order-ascending-intervals = Ascending intervals deck-config-sort-order-descending-intervals = Descending intervals diff --git a/rslib/backend.proto b/rslib/backend.proto index 0b8e33631..96444d3c7 100644 --- a/rslib/backend.proto +++ b/rslib/backend.proto @@ -329,9 +329,11 @@ message DeckConfig { NEW_CARD_SORT_ORDER_RANDOM = 3; } enum ReviewCardOrder { - REVIEW_CARD_ORDER_DAY_THEN_RANDOM = 0; - REVIEW_CARD_ORDER_INTERVALS_ASCENDING = 1; - REVIEW_CARD_ORDER_INTERVALS_DESCENDING = 2; + REVIEW_CARD_ORDER_DAY = 0; + REVIEW_CARD_ORDER_DAY_THEN_DECK = 1; + REVIEW_CARD_ORDER_DECK_THEN_DAY = 2; + REVIEW_CARD_ORDER_INTERVALS_ASCENDING = 3; + REVIEW_CARD_ORDER_INTERVALS_DESCENDING = 4; // REVIEW_CARD_ORDER_RELATIVE_OVERDUE = 3; } enum ReviewMix { diff --git a/rslib/src/deckconfig/mod.rs b/rslib/src/deckconfig/mod.rs index 46f40d97d..356881b6f 100644 --- a/rslib/src/deckconfig/mod.rs +++ b/rslib/src/deckconfig/mod.rs @@ -64,7 +64,7 @@ impl Default for DeckConfig { new_card_insert_order: NewCardInsertOrder::Due as i32, new_card_gather_priority: NewCardGatherPriority::Deck as i32, new_card_sort_order: NewCardSortOrder::TemplateThenDue as i32, - review_order: ReviewCardOrder::DayThenRandom as i32, + review_order: ReviewCardOrder::Day as i32, new_mix: ReviewMix::MixWithReviews as i32, interday_learning_mix: ReviewMix::MixWithReviews as i32, leech_action: LeechAction::TagOnly as i32, diff --git a/rslib/src/scheduler/queue/builder/sorting.rs b/rslib/src/scheduler/queue/builder/sorting.rs index 1f6c3697e..89dc678e5 100644 --- a/rslib/src/scheduler/queue/builder/sorting.rs +++ b/rslib/src/scheduler/queue/builder/sorting.rs @@ -32,7 +32,7 @@ impl QueueBuilder { self.day_learning.sort_unstable_by(day_then_hash); // other sorting is done in SQL - if self.sort_options.review_order == ReviewCardOrder::DayThenRandom { + if self.sort_options.review_order == ReviewCardOrder::Day { self.review.iter_mut().for_each(DueCard::hash_id_and_mtime); self.review.sort_unstable_by(day_then_hash); } diff --git a/rslib/src/storage/card/mod.rs b/rslib/src/storage/card/mod.rs index c16bbd409..45e87ec2a 100644 --- a/rslib/src/storage/card/mod.rs +++ b/rslib/src/storage/card/mod.rs @@ -200,12 +200,18 @@ impl super::SqliteStorage { F: FnMut(CardQueue, DueCard) -> bool, { let order_clause = match order { - ReviewCardOrder::DayThenRandom => "order by due", - ReviewCardOrder::IntervalsAscending => "order by ivl asc", - ReviewCardOrder::IntervalsDescending => "order by ivl desc", + ReviewCardOrder::Day => "due", + ReviewCardOrder::DayThenDeck => { + "due, (select rowid from active_decks ad where ad.id = did)" + } + ReviewCardOrder::DeckThenDay => { + "(select rowid from active_decks ad where ad.id = did), due" + } + ReviewCardOrder::IntervalsAscending => "ivl asc", + ReviewCardOrder::IntervalsDescending => "ivl desc", }; let mut stmt = self.db.prepare_cached(&format!( - "{} {}", + "{} order by {}", include_str!("due_cards.sql"), order_clause ))?; diff --git a/ts/deckoptions/DisplayOrder.svelte b/ts/deckoptions/DisplayOrder.svelte index d06e9a5ff..a93bf9ca1 100644 --- a/ts/deckoptions/DisplayOrder.svelte +++ b/ts/deckoptions/DisplayOrder.svelte @@ -25,6 +25,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html ]; const reviewOrderChoices = [ tr.deckConfigSortOrderDueDateThenRandom(), + tr.deckConfigSortOrderDueDateThenDeck(), + tr.deckConfigSortOrderDeckThenDueDate(), tr.deckConfigSortOrderAscendingIntervals(), tr.deckConfigSortOrderDescendingIntervals(), ];