From ab2cc1340f05197f93ba65e3850da4468aee41aa Mon Sep 17 00:00:00 2001 From: afonsofrancof Date: Thu, 8 Aug 2024 22:12:34 +0100 Subject: [PATCH] Added FloatingText class. It shows text in a float --- src/list.rs | 6 ++-- src/preview_content.rs | 82 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/preview_content.rs diff --git a/src/list.rs b/src/list.rs index a60f89d1..c6897397 100644 --- a/src/list.rs +++ b/src/list.rs @@ -1,5 +1,5 @@ use crate::{ - float::Float, preview_content::PreviewContent, running_command::Command, state::AppState, + float::Float, preview_content::FloatingText, running_command::Command, state::AppState, }; use crossterm::event::{KeyCode, KeyEvent, KeyEventKind}; use ego_tree::{tree, NodeId}; @@ -33,7 +33,7 @@ pub struct CustomList { // This stores the filtered tree filtered_items: Vec, // This is the preview window for the commands - preview_float: Float, + preview_float: Float, } impl CustomList { @@ -416,7 +416,7 @@ impl CustomList { }; self.preview_float - .set_content(Some(PreviewContent::new(lines))); + .set_content(Some(FloatingText::new(lines))); } } } diff --git a/src/preview_content.rs b/src/preview_content.rs new file mode 100644 index 00000000..195ac24c --- /dev/null +++ b/src/preview_content.rs @@ -0,0 +1,82 @@ +use crate::float::FloatContent; +use crossterm::event::{KeyCode, KeyEvent}; +use ratatui::{ + layout::Rect, + style::{Style, Stylize}, + text::Line, + widgets::{Block, Borders, List}, + Frame, +}; + +pub struct FloatingText { + text: Vec, + scroll: usize, +} + +impl FloatingText { + pub fn new(text: Vec) -> Self { + Self { text, scroll: 0 } + } + + fn scroll_down(&mut self) { + if self.scroll + 1 < self.text.len() { + self.scroll += 1; + } + } + + fn scroll_up(&mut self) { + if self.scroll > 0 { + self.scroll -= 1; + } + } +} + +impl FloatContent for FloatingText { + fn draw(&mut self, frame: &mut Frame, area: Rect) { + // Define the Block with a border and background color + let block = Block::default() + .borders(Borders::ALL) + .style(Style::default()); + + // Draw the Block first + frame.render_widget(block.clone(), area); + + // Calculate the inner area to ensure text is not drawn over the border + let inner_area = block.inner(area); + + // Create the list of lines to be displayed + let lines: Vec = self + .text + .iter() + .skip(self.scroll) + .take(inner_area.height as usize) + .map(|line| Line::from(line.as_str())) + .collect(); + + // Create list widget + let list = List::new(lines) + .block(Block::default()) + .highlight_style(Style::default().reversed()); + + // Render the list inside the bordered area + frame.render_widget(list, inner_area); + } + + fn handle_key_event(&mut self, key: &KeyEvent) -> bool { + match key.code { + KeyCode::Down | KeyCode::Char('j') => { + self.scroll_down(); + true + } + KeyCode::Up | KeyCode::Char('k') => { + self.scroll_up(); + true + } + _ => false, + } + } + + fn is_finished(&self) -> bool { + true + } +}