handle filtered case when repositioning

This commit is contained in:
Damien Elmes 2021-09-13 14:57:41 +10:00
parent b877026248
commit 70a367137d
2 changed files with 21 additions and 8 deletions

View file

@ -115,4 +115,8 @@ impl Card {
self.original_due = 0; self.original_due = 0;
} }
pub(crate) fn is_filtered(&self) -> bool {
self.original_deck_id.0 > 0
}
} }

View file

@ -7,6 +7,7 @@ use rand::seq::SliceRandom;
use crate::{ use crate::{
card::{CardQueue, CardType}, card::{CardQueue, CardType},
config::SchedulerVersion,
deckconfig::NewCardInsertOrder, deckconfig::NewCardInsertOrder,
prelude::*, prelude::*,
search::{SearchNode, SortMode, StateKind}, search::{SearchNode, SortMode, StateKind},
@ -23,12 +24,19 @@ impl Card {
} }
/// If the card is new, change its position, and return true. /// If the card is new, change its position, and return true.
fn set_new_position(&mut self, position: u32) -> bool { fn set_new_position(&mut self, position: u32, v2: bool) -> bool {
if self.ctype != CardType::New { if v2 && self.ctype == CardType::New {
false if self.is_filtered() {
} else { self.original_due = position as i32;
} else {
self.due = position as i32;
}
true
} else if self.queue == CardQueue::New {
self.due = position as i32; self.due = position as i32;
true true
} else {
false
} }
} }
} }
@ -146,8 +154,9 @@ impl Collection {
shift: bool, shift: bool,
usn: Usn, usn: Usn,
) -> Result<usize> { ) -> Result<usize> {
let v2 = self.scheduler_version() != SchedulerVersion::V1;
if shift { if shift {
self.shift_existing_cards(starting_from, step * cids.len() as u32, usn)?; self.shift_existing_cards(starting_from, step * cids.len() as u32, usn, v2)?;
} }
self.storage.set_search_table_to_card_ids(cids, true)?; self.storage.set_search_table_to_card_ids(cids, true)?;
let cards = self.storage.all_searched_cards_in_search_order()?; let cards = self.storage.all_searched_cards_in_search_order()?;
@ -155,7 +164,7 @@ impl Collection {
let mut count = 0; let mut count = 0;
for mut card in cards { for mut card in cards {
let original = card.clone(); let original = card.clone();
if card.set_new_position(sorter.position(&card)) { if card.set_new_position(sorter.position(&card), v2) {
count += 1; count += 1;
self.update_card_inner(&mut card, original, usn)?; self.update_card_inner(&mut card, original, usn)?;
} }
@ -193,11 +202,11 @@ impl Collection {
self.sort_cards_inner(&cids, 1, 1, order.into(), false, usn) self.sort_cards_inner(&cids, 1, 1, order.into(), false, usn)
} }
fn shift_existing_cards(&mut self, start: u32, by: u32, usn: Usn) -> Result<()> { fn shift_existing_cards(&mut self, start: u32, by: u32, usn: Usn, v2: bool) -> Result<()> {
self.storage.search_cards_at_or_above_position(start)?; self.storage.search_cards_at_or_above_position(start)?;
for mut card in self.storage.all_searched_cards()? { for mut card in self.storage.all_searched_cards()? {
let original = card.clone(); let original = card.clone();
card.set_new_position(card.due as u32 + by); card.set_new_position(card.due as u32 + by, v2);
self.update_card_inner(&mut card, original, usn)?; self.update_card_inner(&mut card, original, usn)?;
} }
self.storage.clear_searched_cards_table()?; self.storage.clear_searched_cards_table()?;