From c17b3e82bad7efb54c9c271c8f37232d780c0857 Mon Sep 17 00:00:00 2001 From: smallB007 Date: Tue, 1 Nov 2022 12:00:38 +0100 Subject: [PATCH] Selecting an item in a cursive_table_view and rendering it appropriately --- src/lib.rs | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 20edb91..399ac6a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,10 +13,13 @@ extern crate cursive_core as cursive; // STD Dependencies ----------------------------------------------------------- -use std::cmp::{self, Ordering}; use std::collections::HashMap; use std::hash::Hash; use std::rc::Rc; +use std::{ + cmp::{self, Ordering}, + collections::BTreeSet, +}; // External Dependencies ------------------------------------------------------ use cursive::{ @@ -127,6 +130,8 @@ pub struct TableView { items: Vec, rows_to_items: Vec, + selected_rows: BTreeSet, + on_sort: Option>, // TODO Pass drawing offsets into the handlers so a popup menu // can be created easily? @@ -197,7 +202,7 @@ where focus: 0, items: Vec::new(), rows_to_items: Vec::new(), - + selected_rows: BTreeSet::new(), on_sort: None, on_submit: None, on_select: None, @@ -826,7 +831,17 @@ where fn draw_content(&self, printer: &Printer) { for i in 0..self.rows_to_items.len() { let printer = printer.offset((0, i)); - let color = if i == self.focus && self.enabled { + let color = if self.selected_rows.contains(&i) && i != self.focus && self.enabled { + theme::ColorStyle::new( + theme::ColorType::Palette(theme::PaletteColor::TitleSecondary), + theme::ColorType::Palette(theme::PaletteColor::View), + ) + } else if self.selected_rows.contains(&i) && i == self.focus && self.enabled { + theme::ColorStyle::new( + theme::ColorType::Palette(theme::PaletteColor::TitleSecondary), + theme::ColorType::Palette(theme::PaletteColor::Highlight), + ) + } else if i == self.focus && self.enabled { if !self.column_select && self.enabled && printer.focused { theme::ColorStyle::highlight() } else { @@ -885,6 +900,14 @@ where fn on_inner_event(&mut self, event: Event) -> EventResult { let last_focus = self.focus; match event { + Event::Key(Key::Ins) => { + if self.selected_rows.contains(&last_focus) { + self.selected_rows.remove(&last_focus); + } else { + self.selected_rows.insert(last_focus); + } + self.focus_down(1); + } Event::Key(Key::Right) => { if self.column_select { if !self.column_next() {