From fe0f6c752040cfb9a726d71f8736764d8b3ca64d Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 2 Aug 2022 00:42:52 +0200 Subject: [PATCH] Edit editor contents externally --- src/ui/util.rs | 8 ++++++-- src/ui/widgets/editor.rs | 22 +++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/ui/util.rs b/src/ui/util.rs index 7d6a1f6..7507ed3 100644 --- a/src/ui/util.rs +++ b/src/ui/util.rs @@ -3,11 +3,15 @@ use std::sync::Arc; use parking_lot::FairMutex; use toss::terminal::Terminal; -pub fn prompt(terminal: &mut Terminal, crossterm_lock: &Arc>) -> Option { +pub fn prompt( + terminal: &mut Terminal, + crossterm_lock: &Arc>, + initial_text: &str, +) -> Option { let content = { let _guard = crossterm_lock.lock(); terminal.suspend().expect("could not suspend"); - let content = edit::edit(""); + let content = edit::edit(initial_text); terminal.unsuspend().expect("could not unsuspend"); content }; diff --git a/src/ui/widgets/editor.rs b/src/ui/widgets/editor.rs index a707547..8a756b5 100644 --- a/src/ui/widgets/editor.rs +++ b/src/ui/widgets/editor.rs @@ -2,11 +2,14 @@ use std::iter; use std::sync::Arc; use async_trait::async_trait; -use parking_lot::Mutex; +use parking_lot::{FairMutex, Mutex}; use toss::frame::{Frame, Pos, Size}; use toss::styled::Styled; +use toss::terminal::Terminal; use unicode_segmentation::UnicodeSegmentation; +use crate::ui::util; + use super::Widget; /////////// @@ -66,6 +69,12 @@ impl InnerEditorState { panic!("cursor index out of bounds"); } + fn set_text(&mut self, text: String) { + self.text = text; + self.idx = self.idx.min(self.text.len()); + self.move_cursor_to_grapheme_boundary(); + } + /// Insert a character at the current cursor position and move the cursor /// accordingly. fn insert_char(&mut self, ch: char) { @@ -201,6 +210,10 @@ impl EditorState { self.0.lock().text.clone() } + pub fn set_text(&self, text: String) { + self.0.lock().set_text(text); + } + pub fn insert_char(&self, ch: char) { self.0.lock().insert_char(ch); } @@ -222,6 +235,13 @@ impl EditorState { pub fn move_cursor_right(&self) { self.0.lock().move_cursor_right(); } + + pub fn edit_externally(&self, terminal: &mut Terminal, crossterm_lock: &Arc>) { + let mut guard = self.0.lock(); + if let Some(text) = util::prompt(terminal, crossterm_lock, &guard.text) { + guard.set_text(text); + } + } } ////////////