mirror of
https://github.com/ankitects/anki.git
synced 2025-09-19 06:22:22 -04:00

- Introduced a new transact() method that wraps the return value in a separate struct that describes the changes that were made. - Changes are now gathered from the undo log, so we don't need to guess at what was changed - eg if update_note() is called with identical note contents, no changes are returned. Card changes will only be set if cards were actually generated by the update_note() call, and tag will only be set if a new tag was added. - mw.perform_op() has been updated to expect the op to return the changes, or a structure with the changes in it, and it will use them to fire the change hook, instead of fetching the changes from undo_status(), so there is no risk of race conditions. - the various calls to mw.perform_op() have been split into separate files like card_ops.py. Aside from making the code cleaner, this works around a rather annoying issue with mypy. Because we run it with no_strict_optional, mypy is happy to accept an operation that returns None, despite the type signature saying it requires changes to be returned. Turning no_strict_optional on for the whole codebase is not practical at the moment, but we can enable it for individual files. Still todo: - The cursor keeps moving back to the start of a field when typing - we need to ignore the refresh hook when we are the initiator. - The busy cursor icon should probably be delayed a few hundreds ms. - Still need to think about a nicer way of handling saveNow() - op_made_changes(), op_affects_study_queue() might be better embedded as properties in the object instead
46 lines
1.3 KiB
Rust
46 lines
1.3 KiB
Rust
// Copyright: Ankitects Pty Ltd and contributors
|
|
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|
|
|
use pb::op_changes::Kind;
|
|
|
|
use crate::{backend_proto as pb, ops::OpChanges, prelude::*, undo::UndoStatus};
|
|
|
|
impl From<Op> for Kind {
|
|
fn from(o: Op) -> Self {
|
|
match o {
|
|
Op::SetFlag => Kind::SetCardFlag,
|
|
Op::UpdateTag => Kind::UpdateNoteTags,
|
|
Op::UpdateNote => Kind::UpdateNote,
|
|
_ => Kind::Other,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<OpChanges> for pb::OpChanges {
|
|
fn from(c: OpChanges) -> Self {
|
|
pb::OpChanges {
|
|
kind: Kind::from(c.op) as i32,
|
|
card: c.changes.card,
|
|
note: c.changes.note,
|
|
deck: c.changes.deck,
|
|
tag: c.changes.tag,
|
|
notetype: c.changes.notetype,
|
|
preference: c.changes.preference,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl UndoStatus {
|
|
pub(crate) fn into_protobuf(self, i18n: &I18n) -> pb::UndoStatus {
|
|
pb::UndoStatus {
|
|
undo: self.undo.map(|op| op.describe(i18n)).unwrap_or_default(),
|
|
redo: self.redo.map(|op| op.describe(i18n)).unwrap_or_default(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<OpOutput<()>> for pb::OpChanges {
|
|
fn from(o: OpOutput<()>) -> Self {
|
|
o.changes.into()
|
|
}
|
|
}
|