From 6198b4e421d87ac20b77424ef537d8b6e730f9e4 Mon Sep 17 00:00:00 2001 From: ath3 <45574139+ath3@users.noreply.github.com> Date: Wed, 3 Jul 2019 19:35:30 +0000 Subject: [PATCH] Customizable column ratios (#58) * Customizable column ratios * Allow ratios sum to be different from 99 * Moved the ratio logic to HBox, column ratios are not based on 0-99 anymore, improved parsing from config file --- src/config.rs | 19 +++++++++++++++++-- src/file_browser.rs | 3 ++- src/hbox.rs | 29 +++++++++++++++++++++++------ 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/config.rs b/src/config.rs index e969f1a..3c53a78 100644 --- a/src/config.rs +++ b/src/config.rs @@ -77,7 +77,8 @@ pub struct Config { pub icons: bool, pub media_autoplay: bool, pub media_mute: bool, - pub media_previewer: String + pub media_previewer: String, + pub ratios: Vec:: } @@ -97,7 +98,8 @@ impl Config { icons: false, media_autoplay: false, media_mute: false, - media_previewer: "hunter-media".to_string() + media_previewer: "hunter-media".to_string(), + ratios: vec![20,30,49] } } @@ -133,6 +135,19 @@ impl Config { Ok(("media_previewer", cmd)) => { let cmd = cmd.to_string(); config.select_cmd = cmd; + }, + Ok(("ratios", ratios)) => { + let ratios_str = ratios.to_string(); + if ratios_str.chars().all(|x| x.is_digit(10) || x.is_whitespace() + || x == ':' || x == ',' ) { + let ratios: Vec = ratios_str.split([',', ':'].as_ref()) + .map(|r| r.trim().parse::().unwrap()).collect(); + let ratios_sum: usize = ratios.iter().sum(); + if ratios.len() == 3 && ratios_sum > 0 && ratios.iter() + .filter(|&r| *r > u16::max_value() as usize).next() == None { + config.ratios = ratios; + } + } } _ => { HError::config_error::(line.to_string()).log(); } } diff --git a/src/file_browser.rs b/src/file_browser.rs index 019b77f..b77109b 100644 --- a/src/file_browser.rs +++ b/src/file_browser.rs @@ -234,6 +234,7 @@ impl Tabbable for TabView { }).log(); tab.preview_widget_mut().map(|w| w.config_loaded()).ok(); + tab.columns.set_ratios(self.core.config().ratios); } Ok(()) } @@ -255,7 +256,7 @@ impl FileBrowser { let mut core_p = core.clone(); let mut columns = HBox::new(core); - columns.set_ratios(vec![20,30,49]); + columns.set_ratios(core.config().ratios); let list_coords = columns.calculate_coordinates()?; core_l.coordinates = list_coords[0].clone(); diff --git a/src/hbox.rs b/src/hbox.rs index edc8e4e..8ad23c6 100644 --- a/src/hbox.rs +++ b/src/hbox.rs @@ -96,17 +96,34 @@ impl HBox where T: Widget + PartialEq { let box_ysize = box_coords.ysize(); let box_top = box_coords.top().y(); - let ratios = match &self.ratios { + let mut ratios = match &self.ratios { Some(ratios) => ratios.clone(), None => self.calculate_equal_ratios()? }; - let coords = ratios.iter().fold(Vec::::new(), |mut coords, ratio| { - let ratio = *ratio as u16; - let len = coords.len(); - let gap = if len == 0 { 0 } else { 1 }; + let mut ratios_sum: usize = ratios.iter().sum(); - let widget_xsize = box_xsize * ratio / 100; + ratios = ratios.iter().map(|&r| + (r as f64 * box_xsize as f64 / ratios_sum as f64).round() as usize).collect(); + + for r in &mut ratios { + if *r < 10 { *r = 10 } + } + + ratios_sum = ratios.iter().sum(); + + while ratios_sum + ratios.len() > box_xsize as usize { + let ratios_max = ratios.iter() + .position(|&r| r == *ratios.iter().max().unwrap()).unwrap(); + ratios[ratios_max] = ratios[ratios_max] - 1; + ratios_sum -= 1; + } + + let coords = ratios.iter().fold(Vec::::new(), |mut coords, ratio| { + let len = coords.len(); + let gap = if len == ratios.len() { 0 } else { 1 }; + + let widget_xsize = *ratio as u16; let widget_xpos = if len == 0 { box_coords.top().x() } else {