mirror of
https://github.com/helix-editor/helix.git
synced 2024-11-22 09:26:19 +04:00
Don't apply transactions to Views in undo/redo
View::apply should only be called by EditorView after
42e37a571e
. This change removes the
duplicate calls within undo/redo which could cause a panic.
This commit is contained in:
parent
94eb3de776
commit
fd00f3a70e
@ -3302,7 +3302,7 @@ fn undo(cx: &mut Context) {
|
|||||||
let count = cx.count();
|
let count = cx.count();
|
||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
for _ in 0..count {
|
for _ in 0..count {
|
||||||
if !doc.undo(view) {
|
if !doc.undo(view.id) {
|
||||||
cx.editor.set_status("Already at oldest change");
|
cx.editor.set_status("Already at oldest change");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3313,7 +3313,7 @@ fn redo(cx: &mut Context) {
|
|||||||
let count = cx.count();
|
let count = cx.count();
|
||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
for _ in 0..count {
|
for _ in 0..count {
|
||||||
if !doc.redo(view) {
|
if !doc.redo(view.id) {
|
||||||
cx.editor.set_status("Already at newest change");
|
cx.editor.set_status("Already at newest change");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3325,7 +3325,7 @@ fn earlier(cx: &mut Context) {
|
|||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
for _ in 0..count {
|
for _ in 0..count {
|
||||||
// rather than doing in batch we do this so get error halfway
|
// rather than doing in batch we do this so get error halfway
|
||||||
if !doc.earlier(view, UndoKind::Steps(1)) {
|
if !doc.earlier(view.id, UndoKind::Steps(1)) {
|
||||||
cx.editor.set_status("Already at oldest change");
|
cx.editor.set_status("Already at oldest change");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3337,7 +3337,7 @@ fn later(cx: &mut Context) {
|
|||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
for _ in 0..count {
|
for _ in 0..count {
|
||||||
// rather than doing in batch we do this so get error halfway
|
// rather than doing in batch we do this so get error halfway
|
||||||
if !doc.later(view, UndoKind::Steps(1)) {
|
if !doc.later(view.id, UndoKind::Steps(1)) {
|
||||||
cx.editor.set_status("Already at newest change");
|
cx.editor.set_status("Already at newest change");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -481,7 +481,7 @@ fn earlier(
|
|||||||
let uk = args.join(" ").parse::<UndoKind>().map_err(|s| anyhow!(s))?;
|
let uk = args.join(" ").parse::<UndoKind>().map_err(|s| anyhow!(s))?;
|
||||||
|
|
||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
let success = doc.earlier(view, uk);
|
let success = doc.earlier(view.id, uk);
|
||||||
if !success {
|
if !success {
|
||||||
cx.editor.set_status("Already at oldest change");
|
cx.editor.set_status("Already at oldest change");
|
||||||
}
|
}
|
||||||
@ -500,7 +500,7 @@ fn later(
|
|||||||
|
|
||||||
let uk = args.join(" ").parse::<UndoKind>().map_err(|s| anyhow!(s))?;
|
let uk = args.join(" ").parse::<UndoKind>().map_err(|s| anyhow!(s))?;
|
||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
let success = doc.later(view, uk);
|
let success = doc.later(view.id, uk);
|
||||||
if !success {
|
if !success {
|
||||||
cx.editor.set_status("Already at newest change");
|
cx.editor.set_status("Already at newest change");
|
||||||
}
|
}
|
||||||
|
@ -857,11 +857,11 @@ pub fn apply(&mut self, transaction: &Transaction, view_id: ViewId) -> bool {
|
|||||||
success
|
success
|
||||||
}
|
}
|
||||||
|
|
||||||
fn undo_redo_impl(&mut self, view: &mut View, undo: bool) -> bool {
|
fn undo_redo_impl(&mut self, view_id: ViewId, undo: bool) -> bool {
|
||||||
let mut history = self.history.take();
|
let mut history = self.history.take();
|
||||||
let txn = if undo { history.undo() } else { history.redo() };
|
let txn = if undo { history.undo() } else { history.redo() };
|
||||||
let success = if let Some(txn) = txn {
|
let success = if let Some(txn) = txn {
|
||||||
self.apply_impl(txn, view.id) && view.apply(txn, self)
|
self.apply_impl(txn, view_id)
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
};
|
};
|
||||||
@ -875,13 +875,13 @@ fn undo_redo_impl(&mut self, view: &mut View, undo: bool) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Undo the last modification to the [`Document`]. Returns whether the undo was successful.
|
/// Undo the last modification to the [`Document`]. Returns whether the undo was successful.
|
||||||
pub fn undo(&mut self, view: &mut View) -> bool {
|
pub fn undo(&mut self, view_id: ViewId) -> bool {
|
||||||
self.undo_redo_impl(view, true)
|
self.undo_redo_impl(view_id, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Redo the last modification to the [`Document`]. Returns whether the redo was successful.
|
/// Redo the last modification to the [`Document`]. Returns whether the redo was successful.
|
||||||
pub fn redo(&mut self, view: &mut View) -> bool {
|
pub fn redo(&mut self, view_id: ViewId) -> bool {
|
||||||
self.undo_redo_impl(view, false)
|
self.undo_redo_impl(view_id, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn savepoint(&mut self) {
|
pub fn savepoint(&mut self) {
|
||||||
@ -894,7 +894,7 @@ pub fn restore(&mut self, view: &mut View) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn earlier_later_impl(&mut self, view: &mut View, uk: UndoKind, earlier: bool) -> bool {
|
fn earlier_later_impl(&mut self, view_id: ViewId, uk: UndoKind, earlier: bool) -> bool {
|
||||||
let txns = if earlier {
|
let txns = if earlier {
|
||||||
self.history.get_mut().earlier(uk)
|
self.history.get_mut().earlier(uk)
|
||||||
} else {
|
} else {
|
||||||
@ -902,7 +902,7 @@ fn earlier_later_impl(&mut self, view: &mut View, uk: UndoKind, earlier: bool) -
|
|||||||
};
|
};
|
||||||
let mut success = false;
|
let mut success = false;
|
||||||
for txn in txns {
|
for txn in txns {
|
||||||
if self.apply_impl(&txn, view.id) && view.apply(&txn, self) {
|
if self.apply_impl(&txn, view_id) {
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -914,13 +914,13 @@ fn earlier_later_impl(&mut self, view: &mut View, uk: UndoKind, earlier: bool) -
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Undo modifications to the [`Document`] according to `uk`.
|
/// Undo modifications to the [`Document`] according to `uk`.
|
||||||
pub fn earlier(&mut self, view: &mut View, uk: UndoKind) -> bool {
|
pub fn earlier(&mut self, view_id: ViewId, uk: UndoKind) -> bool {
|
||||||
self.earlier_later_impl(view, uk, true)
|
self.earlier_later_impl(view_id, uk, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Redo modifications to the [`Document`] according to `uk`.
|
/// Redo modifications to the [`Document`] according to `uk`.
|
||||||
pub fn later(&mut self, view: &mut View, uk: UndoKind) -> bool {
|
pub fn later(&mut self, view_id: ViewId, uk: UndoKind) -> bool {
|
||||||
self.earlier_later_impl(view, uk, false)
|
self.earlier_later_impl(view_id, uk, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Commit pending changes to history
|
/// Commit pending changes to history
|
||||||
|
Loading…
Reference in New Issue
Block a user