From 41dcdc68569ef932328c7736e230436d7918db63 Mon Sep 17 00:00:00 2001 From: zhang_ji Date: Thu, 30 Jun 2016 16:52:30 +0800 Subject: [PATCH] [model] support single/multiple selection --- src/main.rs | 11 +++++++---- src/model.rs | 48 +++++++++++++++++++++++------------------------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/main.rs b/src/main.rs index dac3a96c..5d753ce3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,6 +42,7 @@ fn main() { let mut opts = Options::new(); opts.optopt("b", "bind", "comma seperated keybindings", "ctrl-j:accept,ctrl-k:kill-line"); opts.optflag("h", "help", "print this help menu"); + opts.optflag("m", "multi", "Enable Multiple Selection"); let options = match opts.parse(&args[1..]) { Ok(m) => { m } @@ -62,6 +63,7 @@ fn main() { let (tx_matched, rx_matched) = channel(); let eb_model = eb.clone(); let mut model = Model::new(eb_model, curse); + if options.opt_present("m") {model.multi_selection = true;} let eb_matcher = Arc::new(EventBox::new()); let eb_matcher_clone = eb_matcher.clone(); @@ -160,7 +162,8 @@ fn main() { Event::EvActAbort => { break 'outer; } Event::EvActAccept => { // break out of the loop and output the selected item. - if model.get_num_selected() <= 0 { model.act_toggle(Some(true)); } + //if model.get_num_selected() <= 0 { model.act_toggle(Some(true)); } + model.act_accept(); break 'outer; } Event::EvActBackwardChar => {model.act_backward_char();} @@ -185,17 +188,17 @@ fn main() { Event::EvActPageUp => {model.act_move_page(1);} Event::EvActPreviousHistory => {} Event::EvActSelectAll => {model.act_select_all();} - Event::EvActToggle => {model.act_toggle(None);} + Event::EvActToggle => {model.act_toggle();} Event::EvActToggleAll => {model.act_toggle_all();} Event::EvActToggleDown => { - model.act_toggle(None); + model.act_toggle(); model.act_move_line_cursor(-1); } Event::EvActToggleIn => {} Event::EvActToggleOut => {} Event::EvActToggleSort => {} Event::EvActToggleUp => { - model.act_toggle(None); + model.act_toggle(); model.act_move_line_cursor(1); } Event::EvActUnixLineDiscard => {model.act_line_discard();} diff --git a/src/model.rs b/src/model.rs index 3121d8a1..4cac0353 100644 --- a/src/model.rs +++ b/src/model.rs @@ -40,7 +40,9 @@ pub struct Model { pub items: Arc>>, // all items selected_indics: HashSet, pub matched_items: RefCell>, + processed_percentage: u64, + pub multi_selection: bool, item_cursor: usize, // the index of matched item currently highlighted. line_cursor: usize, // line No. @@ -51,7 +53,7 @@ pub struct Model { width: usize, height: usize, - tabstop: usize, + pub tabstop: usize, curses: Curses, } @@ -68,6 +70,7 @@ impl Model { selected_indics: HashSet::new(), matched_items: RefCell::new(OrderedVec::new()), processed_percentage: 100, + multi_selection: false, item_cursor: 0, line_cursor: 0, hscroll_offset: 0, @@ -234,6 +237,12 @@ impl Model { //============================================================================ // Actions + pub fn act_accept(&mut self) { + if self.multi_selection {return;} + let index = self.item_cursor; + self.selected_indics.insert(index); + } + pub fn act_add_char(&mut self, ch: char) { let changed = self.query.add_char(ch); if changed { @@ -312,6 +321,8 @@ impl Model { } pub fn act_select_all(&mut self) { + if !self.multi_selection {return;} + let mut matched_items = self.matched_items.borrow_mut(); for i in 0..matched_items.len() { self.selected_indics.insert(i); @@ -319,6 +330,8 @@ impl Model { } pub fn act_toggle_all(&mut self) { + if !self.multi_selection {return;} + let mut matched_items = self.matched_items.borrow_mut(); let selected = mem::replace(&mut self.selected_indics, HashSet::new()); for i in 0..matched_items.len() { @@ -328,35 +341,20 @@ impl Model { } } - pub fn act_toggle(&mut self, selected: Option) { + pub fn act_toggle(&mut self) { + if !self.multi_selection {return;} + let mut matched_items = self.matched_items.borrow_mut(); - let matched = matched_items.get(self.item_cursor); - if matched == None { - return; - } - - let index = matched.unwrap().index; - match selected { - Some(true) => { - let _ = self.selected_indics.insert(index); - } - Some(false) => { - let _ = self.selected_indics.remove(&index); - } - None => { - if self.selected_indics.contains(&index) { - let _ = self.selected_indics.remove(&index); - } else { - let _ = self.selected_indics.insert(index); - } + if let Some(matched) = matched_items.get(self.item_cursor) { + let item_index = matched.index; + if self.selected_indics.contains(&item_index) { + self.selected_indics.remove(&item_index); + } else { + self.selected_indics.insert(item_index); } } } - pub fn get_num_selected(&self) -> usize { - self.selected_indics.len() - } - pub fn act_move_line_cursor(&mut self, diff: i32) { let total_item = self.matched_items.borrow().len() as i32;