From 9dfe5b320d5916657680c838dafb2da89292205d Mon Sep 17 00:00:00 2001 From: tenkai Date: Sat, 6 Apr 2024 02:34:12 -0700 Subject: [PATCH] got select and copy working! --- sazid-term/src/application.rs | 2 +- sazid-term/src/commands.rs | 90 ++++++++++++++++++++++++++++---- sazid-term/src/compositor.rs | 2 +- sazid-term/src/keymap/minimal.rs | 3 +- sazid-term/src/movement.rs | 2 +- sazid-term/src/ui/session.rs | 12 +---- 6 files changed, 88 insertions(+), 23 deletions(-) diff --git a/sazid-term/src/application.rs b/sazid-term/src/application.rs index e38df64..00497fe 100644 --- a/sazid-term/src/application.rs +++ b/sazid-term/src/application.rs @@ -267,8 +267,8 @@ impl Application { ); // session must be pushed after input in order for input not to overwrite style changes made in session - compositor.push(Box::new(markdown_session)); compositor.push(Box::new(input)); + compositor.push(Box::new(markdown_session)); #[cfg(windows)] let signals = futures_util::stream::empty(); diff --git a/sazid-term/src/commands.rs b/sazid-term/src/commands.rs index 6514c28..79c93a4 100644 --- a/sazid-term/src/commands.rs +++ b/sazid-term/src/commands.rs @@ -625,6 +625,8 @@ fn quit(cx: &mut Context) { fn toggle_layer_order(cx: &mut Context) { cx.callback.push(Box::new( move |compositor: &mut Compositor, cx: &mut compositor::Context| { + cx.focus.toggle(); + return; match compositor.pop() { Some(component_a) => match compositor.pop() { Some(component_b) => { @@ -635,8 +637,8 @@ fn toggle_layer_order(cx: &mut Context) { ); cx.focus.toggle(); - compositor.push(component_a); - compositor.push(component_b); + // compositor.push(component_a); + // compositor.push(component_b); compositor.need_full_redraw(); }, None => { @@ -648,7 +650,7 @@ fn toggle_layer_order(cx: &mut Context) { None => { log::info!("toggle_layer_order: no last component found"); }, - } + }; }, )) } @@ -4254,18 +4256,88 @@ fn commit_undo_checkpoint(cx: &mut Context) { // Yank / Paste fn yank(cx: &mut Context) { - yank_impl(cx.editor, cx.register.unwrap_or('"')); - exit_select_mode(cx); + log::info!("yank to clipboard"); + let ctx_reg = cx.register.unwrap_or('"'); + match cx.focus { + ContextFocus::SessionView => cx.callback.push(Box::new( + move |compositor: &mut Compositor, cx: &mut compositor::Context| { + let session = + compositor.find::>().unwrap(); + yank_session_impl(session, cx.editor, ctx_reg); + // exit_select_mode(cx); + }, + )), + ContextFocus::EditorView => { + yank_impl(cx.editor, cx.register.unwrap_or('"')); + exit_select_mode(cx); + }, + } } fn yank_to_clipboard(cx: &mut Context) { - yank_impl(cx.editor, '+'); - exit_select_mode(cx); + log::info!("yank to clipboard"); + match cx.focus { + ContextFocus::SessionView => cx.callback.push(Box::new( + move |compositor: &mut Compositor, cx: &mut compositor::Context| { + let session = + compositor.find::>().unwrap(); + yank_session_impl(session, cx.editor, '+'); + // exit_select_mode(cx); + }, + )), + ContextFocus::EditorView => { + yank_impl(cx.editor, '+'); + exit_select_mode(cx); + }, + } } fn yank_to_primary_clipboard(cx: &mut Context) { - yank_impl(cx.editor, '*'); - exit_select_mode(cx); + match cx.focus { + ContextFocus::SessionView => cx.callback.push(Box::new( + move |compositor: &mut Compositor, cx: &mut compositor::Context| { + let session = + compositor.find::>().unwrap(); + yank_session_impl(session, cx.editor, '*'); + // exit_select_mode(cx); + }, + )), + ContextFocus::EditorView => { + yank_impl(cx.editor, '*'); + exit_select_mode(cx); + }, + } +} + +fn yank_session_impl( + session: &mut ui::SessionView, + editor: &mut Editor, + register: char, +) { + let text = session.get_messages_plaintext(); + let range = session.selection.primary(); + let (head, anchor) = if range.head < range.anchor { + (range.head, range.anchor) + } else { + (range.anchor, range.head) + }; + let values: Vec = + text.slice(head..anchor).lines().map(String::from).collect(); + match editor.registers.write(register, values.clone()) { + Ok(_) => { + log::info!( + "session -yanked selection to register {}\n{:?}", + register, + values + ); + editor.set_status(format!("yanked selection to register {register}",)) + }, + Err(err) => editor.set_error(err.to_string()), + } + + if editor.mode == Mode::Select { + editor.mode = Mode::Normal; + } } fn yank_impl(editor: &mut Editor, register: char) { diff --git a/sazid-term/src/compositor.rs b/sazid-term/src/compositor.rs index 61c89c6..cce1b5a 100644 --- a/sazid-term/src/compositor.rs +++ b/sazid-term/src/compositor.rs @@ -203,7 +203,7 @@ impl Compositor { cx: &mut Context, ) { // reversed layer rendering so that the editor draws popup menus over the session view - for layer in &mut self.layers.iter_mut().rev() { + for layer in &mut self.layers.iter_mut() { layer.render(area, surface, cx); } } diff --git a/sazid-term/src/keymap/minimal.rs b/sazid-term/src/keymap/minimal.rs index 068004d..fcaabb8 100644 --- a/sazid-term/src/keymap/minimal.rs +++ b/sazid-term/src/keymap/minimal.rs @@ -227,6 +227,7 @@ pub fn minimal() -> HashMap { "s" => save_session, "l" => load_session_picker, "t" => toggle_layer_order, + // "F" => file_picker_in_current_directory, // "b" => buffer_picker, // "j" => jumplist_picker, @@ -279,7 +280,7 @@ pub fn minimal() -> HashMap { "C-v" | "v" => vsplit_new, }, }, - // "y" => yank_to_clipboard, + "y" => yank_to_clipboard, // "Y" => yank_main_selection_to_clipboard, // "p" => paste_clipboard_after, // "P" => paste_clipboard_before, diff --git a/sazid-term/src/movement.rs b/sazid-term/src/movement.rs index 5566682..fa2b666 100644 --- a/sazid-term/src/movement.rs +++ b/sazid-term/src/movement.rs @@ -108,7 +108,7 @@ pub fn session_move_horizontally( Direction::Forward => pos + count, Direction::Backward => pos.saturating_sub(count), } - .clamp(original_row_start, original_row_end); + .clamp(0, all_messages_text.len_chars() - 1); log::warn!("move_horizontally original_pos: {}, new_pos: {}", pos, new_pos); // Compute the final new range. diff --git a/sazid-term/src/ui/session.rs b/sazid-term/src/ui/session.rs index 35e4244..b07f235 100644 --- a/sazid-term/src/ui/session.rs +++ b/sazid-term/src/ui/session.rs @@ -793,19 +793,11 @@ impl SessionView { .with_block(Block::default()) .with_char_index(message.start_idx); - let debug_msg_ct = message.start_idx.to_string(); - let index_cell = MessageCell::new(MessageType::Text(debug_msg_ct)) + let msg_idx = msg_idx.to_string(); + let index_cell = MessageCell::new(MessageType::Text(msg_idx)) .centered() .with_block(Block::default().borders(Borders::RIGHT)); - // log::info!( - // "message length: chars: {} lines: {} idx: {} start_idx: {}", - // message.plain_text.len_chars(), - // message.plain_text.len_lines(), - // msg_idx, - // start_idx - // ); - // Row::new(vec![index_cell, message_cell]) .height(message.plain_text.len_lines() as u16) })