summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCanop <cano.petrole@gmail.com>2019-03-20 20:22:05 +0100
committerCanop <cano.petrole@gmail.com>2019-03-20 20:22:05 +0100
commit240387854765acb753e29fd055b82710aae8c302 (patch)
treea6686fc470f58e302e238bf61ff72a88f82ab57a
parente960c8dcaa0247386ec9c97f258962291d0bd673 (diff)
TreeView is now a struct instead of a trait implemented by Screen
This is cleaner and can be used in more ways
-rw-r--r--src/browser_states.rs3
-rw-r--r--src/file_sizes.rs2
-rw-r--r--src/tree_views.rs74
-rw-r--r--website/docs/community.md2
4 files changed, 45 insertions, 36 deletions
diff --git a/src/browser_states.rs b/src/browser_states.rs
index 28c5b0e..ede4981 100644
--- a/src/browser_states.rs
+++ b/src/browser_states.rs
@@ -259,7 +259,8 @@ impl AppState for BrowserState {
}
fn display(&mut self, screen: &mut Screen, _con: &AppContext) -> io::Result<()> {
- screen.write_tree(&self.displayed_tree())
+ let mut tree_view = TreeView::from_screen(screen);
+ tree_view.write_tree(&self.displayed_tree())
}
fn write_status(&self, screen: &mut Screen, cmd: &Command, con: &AppContext) -> io::Result<()> {
diff --git a/src/file_sizes.rs b/src/file_sizes.rs
index 5d9a07d..1faf079 100644
--- a/src/file_sizes.rs
+++ b/src/file_sizes.rs
@@ -9,7 +9,7 @@ use std::fs;
use std::ops::AddAssign;
use std::os::unix::fs::MetadataExt;
use std::path::{Path, PathBuf};
-use std::sync::{Mutex};
+use std::sync::Mutex;
use std::time::Instant;
use std::thread;
use crossbeam::channel::unbounded;
diff --git a/src/tree_views.rs b/src/tree_views.rs
index ee7583f..fffed1f 100644
--- a/src/tree_views.rs
+++ b/src/tree_views.rs
@@ -8,17 +8,25 @@ use crate::file_sizes::Size;
use crate::flat_tree::{LineType, Tree, TreeLine};
use crate::patterns::Pattern;
use crate::screens::{Screen, ScreenArea};
+use crate::skin::Skin;
-pub trait TreeView {
- fn write_tree(&mut self, tree: &Tree) -> io::Result<()>;
- fn write_line_size(&mut self, line: &TreeLine, total_size: Size) -> io::Result<()>;
- fn write_mode(&mut self, mode: u32) -> io::Result<()>;
- fn write_line_name(&mut self, line: &TreeLine, idx: usize, pattern: &Pattern)
- -> io::Result<()>;
+pub struct TreeView<'a> {
+ w: u16,
+ h: u16,
+ out: &'a mut Write,
+ skin: &'a Skin,
}
-impl TreeView for Screen {
- fn write_tree(&mut self, tree: &Tree) -> io::Result<()> {
+impl TreeView<'_> {
+ pub fn from_screen(screen: &mut Screen) -> TreeView<'_> {
+ TreeView {
+ w: screen.w,
+ h: screen.h,
+ out: &mut screen.stdout,
+ skin: &screen.skin,
+ }
+ }
+ pub fn write_tree(&mut self, tree: &Tree) -> io::Result<()> {
lazy_static! {
static ref USERS_CACHE_MUTEX: Mutex<UsersCache> = Mutex::new(UsersCache::new());
}
@@ -48,7 +56,7 @@ impl TreeView for Screen {
};
let scrollbar = area.scrollbar();
for y in 1..self.h - 1 {
- write!(self.stdout, "{}", termion::cursor::Goto(1, y),)?;
+ write!(self.out, "{}", termion::cursor::Goto(1, y),)?;
let mut line_index = (y - 1) as usize;
if line_index > 0 {
line_index += tree.scroll as usize;
@@ -56,10 +64,10 @@ impl TreeView for Screen {
if line_index < tree.lines.len() {
let line = &tree.lines[line_index];
//self.apply_skin_entry(&self.skin.tree)?;
- write!(self.stdout, "{}", self.skin.tree.fgbg())?;
+ write!(self.out, "{}", self.skin.tree.fgbg())?;
for depth in 0..line.depth {
write!(
- self.stdout,
+ self.out,
"{}",
if line.left_branchs[depth as usize] {
if tree.has_branch(line_index + 1, depth as usize) {
@@ -84,7 +92,7 @@ impl TreeView for Screen {
self.write_mode(line.mode)?;
if let Some(user) = users_cache.get_user_by_uid(line.uid) {
write!(
- self.stdout,
+ self.out,
" {:w$}",
user.name().to_string_lossy(),
w = max_user_name_len,
@@ -92,7 +100,7 @@ impl TreeView for Screen {
}
if let Some(group) = users_cache.get_group_by_gid(line.uid) {
write!(
- self.stdout,
+ self.out,
" {:w$} ",
group.name().to_string_lossy(),
w = max_group_name_len,
@@ -100,7 +108,7 @@ impl TreeView for Screen {
}
} else {
write!(
- self.stdout,
+ self.out,
"{}──────────────{}",
self.skin.tree.fg, self.skin.reset.fg,
)?;
@@ -108,29 +116,29 @@ impl TreeView for Screen {
}
let selected = line_index == tree.selection;
if selected {
- write!(self.stdout, "{}", self.skin.selected_line.bg)?;
+ write!(self.out, "{}", self.skin.selected_line.bg)?;
}
self.write_line_name(line, line_index, &tree.options.pattern)?;
}
write!(
- self.stdout,
+ self.out,
"{}{}",
termion::clear::UntilNewline,
style::Reset,
)?;
if let Some((sctop, scbottom)) = scrollbar {
if sctop <= y && y <= scbottom {
- write!(self.stdout, "{}▐", termion::cursor::Goto(self.w, y),)?;
+ write!(self.out, "{}▐", termion::cursor::Goto(self.w, y),)?;
}
}
}
- self.stdout.flush()?;
+ self.out.flush()?;
Ok(())
}
fn write_mode(&mut self, mode: u32) -> io::Result<()> {
write!(
- self.stdout,
+ self.out,
"{} {}{}{}{}{}{}{}{}{}",
self.skin.permissions.fg,
if (mode & (1 << 8)) != 0 { 'r' } else { '-' },
@@ -150,21 +158,21 @@ impl TreeView for Screen {
let dr: usize = s.discrete_ratio(total_size, 8) as usize;
let s: Vec<char> = s.to_string().chars().collect();
write!(
- self.stdout,
+ self.out,
"{}{}",
self.skin.size_text.fg, self.skin.size_bar_full.bg,
)?;
for i in 0..dr {
- write!(self.stdout, "{}", if i < s.len() { s[i] } else { ' ' })?;
+ write!(self.out, "{}", if i < s.len() { s[i] } else { ' ' })?;
}
- write!(self.stdout, "{}", self.skin.size_bar_void.bg)?;
+ write!(self.out, "{}", self.skin.size_bar_void.bg)?;
for i in dr..8 {
- write!(self.stdout, "{}", if i < s.len() { s[i] } else { ' ' })?;
+ write!(self.out, "{}", if i < s.len() { s[i] } else { ' ' })?;
}
- write!(self.stdout, "{}{} ", self.skin.reset.fg, self.skin.reset.bg,)
+ write!(self.out, "{}{} ", self.skin.reset.fg, self.skin.reset.bg,)
} else {
write!(
- self.stdout,
+ self.out,
"{}────────{} ",
self.skin.tree.fg, self.skin.reset.fg,
)
@@ -182,7 +190,7 @@ impl TreeView for Screen {
LineType::Dir => {
if idx == 0 {
write!(
- self.stdout,
+ self.out,
"{}{}{}",
style::Bold,
&self.skin.directory.fg,
@@ -190,7 +198,7 @@ impl TreeView for Screen {
)?;
} else {
write!(
- self.stdout,
+ self.out,
"{}{}{}",
style::Bold,
&self.skin.directory.fg,
@@ -202,14 +210,14 @@ impl TreeView for Screen {
),
)?;
if line.unlisted > 0 {
- write!(self.stdout, " …",)?;
+ write!(self.out, " …",)?;
}
}
}
LineType::File => {
if line.is_exe() {
write!(
- self.stdout,
+ self.out,
"{}{}",
&self.skin.exe.fg,
decorated_name(
@@ -221,7 +229,7 @@ impl TreeView for Screen {
)?;
} else {
write!(
- self.stdout,
+ self.out,
"{}{}",
&self.skin.file.fg,
decorated_name(
@@ -235,7 +243,7 @@ impl TreeView for Screen {
}
LineType::SymLinkToFile(target) => {
write!(
- self.stdout,
+ self.out,
"{}{} {}->{} {}",
&self.skin.link.fg,
decorated_name(
@@ -255,7 +263,7 @@ impl TreeView for Screen {
}
LineType::SymLinkToDir(target) => {
write!(
- self.stdout,
+ self.out,
"{}{} {}->{}{} {}",
&self.skin.link.fg,
decorated_name(
@@ -276,7 +284,7 @@ impl TreeView for Screen {
}
LineType::Pruning => {
write!(
- self.stdout,
+ self.out,
//"{}{}… {} unlisted", still not sure whether I want this '…'
"{}{}{} unlisted",
self.skin.unlisted.fg,
diff --git a/website/docs/community.md b/website/docs/community.md
index f4a66f8..616e0f0 100644
--- a/website/docs/community.md
+++ b/website/docs/community.md
@@ -21,7 +21,7 @@ Before posting a new issue, check your problem hasn't already been raised and in
## Contribute
-**Broot** is written in [rust](https://www.rust-lang.org/). The current focus is linux but mac should be supported in the future and maybe windows too.
+**Broot** is written in [rust](https://www.rust-lang.org/). The current focus is linux+mac but windows should be supported in the future.
Before starting working on a Pull Request, please join the Miaou room to coordinate the developement. There are frequently several feature branchs waiting to be merged and adding some wild ones may make the process painful.