mirror of https://github.com/bobwen-dev/hunter
speed optimization
This commit is contained in:
parent
56d9c35215
commit
205e9dc426
|
@ -115,12 +115,8 @@ impl FileBrowser {
|
||||||
pub fn update_preview(&mut self) {
|
pub fn update_preview(&mut self) {
|
||||||
if self.columns.get_main_widget().content.len() == 0 { return }
|
if self.columns.get_main_widget().content.len() == 0 { return }
|
||||||
let file = self.columns.get_main_widget().selected_file().clone();
|
let file = self.columns.get_main_widget().selected_file().clone();
|
||||||
//let preview = &mut self.columns.preview;
|
let preview = &mut self.columns.preview;
|
||||||
let coords = self.columns.preview.get_coordinates();
|
|
||||||
let mut preview = crate::preview::AsyncPreviewer::new();
|
|
||||||
preview.set_coordinates(&coords);
|
|
||||||
preview.set_file(&file);
|
preview.set_file(&file);
|
||||||
self.columns.preview = preview;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fix_selection(&mut self) {
|
pub fn fix_selection(&mut self) {
|
||||||
|
|
|
@ -19,6 +19,7 @@ where
|
||||||
T: Send,
|
T: Send,
|
||||||
{
|
{
|
||||||
pub content: T,
|
pub content: T,
|
||||||
|
lines: usize,
|
||||||
selection: usize,
|
selection: usize,
|
||||||
offset: usize,
|
offset: usize,
|
||||||
buffer: Vec<String>,
|
buffer: Vec<String>,
|
||||||
|
@ -29,11 +30,12 @@ where
|
||||||
impl<T> ListView<T>
|
impl<T> ListView<T>
|
||||||
where
|
where
|
||||||
ListView<T>: Widget,
|
ListView<T>: Widget,
|
||||||
T: Send,
|
T: Send
|
||||||
{
|
{
|
||||||
pub fn new(content: T) -> ListView<T> {
|
pub fn new(content: T) -> ListView<T> {
|
||||||
let view = ListView::<T> {
|
let view = ListView::<T> {
|
||||||
content: content,
|
content: content,
|
||||||
|
lines: 0,
|
||||||
selection: 0,
|
selection: 0,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
buffer: Vec::new(),
|
buffer: Vec::new(),
|
||||||
|
@ -59,7 +61,7 @@ where
|
||||||
self.seeking = false;
|
self.seeking = false;
|
||||||
}
|
}
|
||||||
fn move_down(&mut self) {
|
fn move_down(&mut self) {
|
||||||
let lines = self.buffer.len();
|
let lines = self.lines;
|
||||||
let y_size = self.coordinates.ysize() as usize;
|
let y_size = self.coordinates.ysize() as usize;
|
||||||
|
|
||||||
if self.selection == lines - 1 {
|
if self.selection == lines - 1 {
|
||||||
|
@ -340,9 +342,13 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render(&self) -> Vec<String> {
|
fn render(&self) -> Vec<String> {
|
||||||
|
let ysize = self.get_coordinates().ysize() as usize;
|
||||||
|
let offset = self.offset;
|
||||||
self.content
|
self.content
|
||||||
.files
|
.files
|
||||||
.par_iter()
|
.par_iter()
|
||||||
|
.skip(offset)
|
||||||
|
.take(ysize)
|
||||||
.map(|file| self.render_line(&file))
|
.map(|file| self.render_line(&file))
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
@ -360,6 +366,7 @@ impl Widget for ListView<Files> {
|
||||||
self.refresh();
|
self.refresh();
|
||||||
}
|
}
|
||||||
fn refresh(&mut self) {
|
fn refresh(&mut self) {
|
||||||
|
self.lines = self.content.len();
|
||||||
self.buffer = self.render();
|
self.buffer = self.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -372,8 +379,8 @@ impl Widget for ListView<Files> {
|
||||||
output += &self
|
output += &self
|
||||||
.buffer
|
.buffer
|
||||||
.par_iter()
|
.par_iter()
|
||||||
.skip(self.offset)
|
//.skip(self.offset)
|
||||||
.take(ysize as usize)
|
//.take(ysize as usize)
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, item)| {
|
.map(|(i, item)| {
|
||||||
let mut output = term::normal_color();
|
let mut output = term::normal_color();
|
||||||
|
@ -405,8 +412,8 @@ impl Widget for ListView<Files> {
|
||||||
self.move_up();
|
self.move_up();
|
||||||
self.refresh();
|
self.refresh();
|
||||||
}
|
}
|
||||||
Key::Char('P') => for _ in 0..10 { self.move_up() }
|
Key::Char('P') => { for _ in 0..10 { self.move_up() } self.refresh(); }
|
||||||
Key::Char('N') => for _ in 0..10 { self.move_down() }
|
Key::Char('N') => { for _ in 0..10 { self.move_down() } self.refresh(); }
|
||||||
Key::Down | Key::Char('n') => {
|
Key::Down | Key::Char('n') => {
|
||||||
self.move_down();
|
self.move_down();
|
||||||
self.refresh();
|
self.refresh();
|
||||||
|
|
201
src/preview.rs
201
src/preview.rs
|
@ -24,8 +24,10 @@ fn kill_procs() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_current(file: &File) -> bool {
|
fn is_current(file: &File) -> bool {
|
||||||
true
|
match CURFILE.lock().unwrap().as_ref() {
|
||||||
//CURFILE.lock().unwrap().as_ref().unwrap() == file
|
Some(curfile) => curfile == file,
|
||||||
|
None => true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
|
@ -56,6 +58,8 @@ impl AsyncPreviewer {
|
||||||
let coordinates = self.coordinates.clone();
|
let coordinates = self.coordinates.clone();
|
||||||
let file = file.clone();
|
let file = file.clone();
|
||||||
let redraw = crate::term::reset() + &self.get_redraw_empty_list(0);
|
let redraw = crate::term::reset() + &self.get_redraw_empty_list(0);
|
||||||
|
let pids = PIDS.clone();
|
||||||
|
kill_procs();
|
||||||
|
|
||||||
self.async_plug.replace_widget(Box::new(move || {
|
self.async_plug.replace_widget(Box::new(move || {
|
||||||
kill_procs();
|
kill_procs();
|
||||||
|
@ -86,7 +90,10 @@ impl AsyncPreviewer {
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if file.get_mime() == Some("text".to_string()) {
|
if file.get_mime() == Some("text".to_string()) {
|
||||||
let mut textview = TextView::new_from_file(&file);
|
let lines = coordinates.ysize() as usize;
|
||||||
|
let mut textview
|
||||||
|
= TextView::new_from_file_limit_lines(&file,
|
||||||
|
lines);
|
||||||
//if !is_current(&file) { return }
|
//if !is_current(&file) { return }
|
||||||
textview.set_coordinates(&coordinates);
|
textview.set_coordinates(&coordinates);
|
||||||
textview.refresh();
|
textview.refresh();
|
||||||
|
@ -106,173 +113,49 @@ impl AsyncPreviewer {
|
||||||
.stderr(std::process::Stdio::null())
|
.stderr(std::process::Stdio::null())
|
||||||
.spawn().unwrap();
|
.spawn().unwrap();
|
||||||
|
|
||||||
// let pid = process.id();
|
let pid = process.id();
|
||||||
// PIDS.lock().unwrap().push(pid);
|
PIDS.lock().unwrap().push(pid);
|
||||||
|
|
||||||
//if !is_current(&file) { return }
|
//if !is_current(&file) { return }
|
||||||
|
|
||||||
let output = process.wait_with_output();
|
let output = process.wait_with_output();
|
||||||
//if output.is_err() { return }
|
match output {
|
||||||
let output = output.unwrap();
|
Ok(output) => {
|
||||||
|
let status = output.status.code();
|
||||||
let status = output.status.code();
|
match status {
|
||||||
//if status.is_none() { return }
|
Some(status) => {
|
||||||
let status = status.unwrap();
|
if status == 0 || status == 5 && is_current(&file) {
|
||||||
|
let output = std::str::from_utf8(&output.stdout)
|
||||||
if status == 0 || status == 5 && is_current(&file) {
|
.unwrap()
|
||||||
let output = std::str::from_utf8(&output.stdout)
|
.to_string();
|
||||||
.unwrap()
|
let mut textview = TextView {
|
||||||
.to_string();
|
lines: output.lines().map(|s| s.to_string()).collect(),
|
||||||
let mut textview = TextView {
|
buffer: String::new(),
|
||||||
lines: output.lines().map(|s| s.to_string()).collect(),
|
coordinates: Coordinates::new() };
|
||||||
buffer: String::new(),
|
textview.set_coordinates(&coordinates);
|
||||||
coordinates: Coordinates::new() };
|
textview.refresh();
|
||||||
textview.set_coordinates(&coordinates);
|
textview.animate_slide_up();
|
||||||
textview.refresh();
|
return Box::new(textview);
|
||||||
textview.animate_slide_up();
|
}
|
||||||
return Box::new(textview);
|
}, None => {}
|
||||||
|
}
|
||||||
|
}, Err(_) => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
write!(bufout, "{}", redraw).unwrap();
|
||||||
|
//std::io::stdout().flush().unwrap();
|
||||||
write!(bufout, "{}", redraw).unwrap();
|
let textview = crate::textview::TextView {
|
||||||
//std::io::stdout().flush().unwrap();
|
lines: vec![],
|
||||||
let textview = crate::textview::TextView {
|
buffer: "".to_string(),
|
||||||
lines: vec![],
|
coordinates: Coordinates::new(),
|
||||||
buffer: "".to_string(),
|
};
|
||||||
coordinates: Coordinates::new(),
|
return Box::new(textview);
|
||||||
};
|
|
||||||
return Box::new(textview);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
|
||||||
pub struct Previewer {
|
|
||||||
pub file: Option<File>,
|
|
||||||
pub buffer: String,
|
|
||||||
pub coordinates: Coordinates,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Previewer {
|
|
||||||
pub fn new() -> Previewer {
|
|
||||||
Previewer {
|
|
||||||
file: None,
|
|
||||||
buffer: String::new(),
|
|
||||||
coordinates: Coordinates::new(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pub fn set_file(&mut self, file: &File) {
|
|
||||||
let coordinates = self.coordinates.clone();
|
|
||||||
let file = file.clone();
|
|
||||||
let redraw = crate::term::reset() + &self.get_redraw_empty_list(0);
|
|
||||||
|
|
||||||
*CURFILE.lock().unwrap() = Some(file.clone());
|
|
||||||
|
|
||||||
std::thread::spawn(move || {
|
|
||||||
kill_procs();
|
|
||||||
match &file.kind {
|
|
||||||
Kind::Directory => match Files::new_from_path(&file.path) {
|
|
||||||
Ok(files) => {
|
|
||||||
if !is_current(&file) { return }
|
|
||||||
let len = files.len();
|
|
||||||
if len == 0 { return };
|
|
||||||
let mut file_list = ListView::new(files);
|
|
||||||
file_list.set_coordinates(&coordinates);
|
|
||||||
file_list.refresh();
|
|
||||||
if !is_current(&file) { return }
|
|
||||||
file_list.animate_slide_up();
|
|
||||||
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
crate::window::show_status(&format!("Can't preview because: {}", err));
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
_ => {
|
|
||||||
if file.get_mime() == Some("text".to_string()) {
|
|
||||||
let mut textview = TextView::new_from_file(&file);
|
|
||||||
if !is_current(&file) { return }
|
|
||||||
textview.set_coordinates(&coordinates);
|
|
||||||
textview.refresh();
|
|
||||||
if !is_current(&file) { return }
|
|
||||||
textview.animate_slide_up();
|
|
||||||
} else {
|
|
||||||
let process =
|
|
||||||
std::process::Command::new("scope.sh")
|
|
||||||
.arg(&file.name)
|
|
||||||
.arg("10".to_string())
|
|
||||||
.arg("10".to_string())
|
|
||||||
.arg("".to_string())
|
|
||||||
.arg("false".to_string())
|
|
||||||
.stdin(std::process::Stdio::null())
|
|
||||||
.stdout(std::process::Stdio::piped())
|
|
||||||
.stderr(std::process::Stdio::null())
|
|
||||||
.spawn().unwrap();
|
|
||||||
|
|
||||||
let pid = process.id();
|
|
||||||
PIDS.lock().unwrap().push(pid);
|
|
||||||
|
|
||||||
if !is_current(&file) { return }
|
|
||||||
|
|
||||||
let output = process.wait_with_output();
|
|
||||||
if output.is_err() { return }
|
|
||||||
let output = output.unwrap();
|
|
||||||
|
|
||||||
let status = output.status.code();
|
|
||||||
if status.is_none() { return }
|
|
||||||
let status = status.unwrap();
|
|
||||||
|
|
||||||
if status == 0 || status == 5 && is_current(&file) {
|
|
||||||
let output = std::str::from_utf8(&output.stdout)
|
|
||||||
.unwrap()
|
|
||||||
.to_string();
|
|
||||||
let mut textview = TextView {
|
|
||||||
lines: output.lines().map(|s| s.to_string()).collect(),
|
|
||||||
buffer: String::new(),
|
|
||||||
coordinates: Coordinates::new() };
|
|
||||||
textview.set_coordinates(&coordinates);
|
|
||||||
textview.refresh();
|
|
||||||
textview.animate_slide_up();
|
|
||||||
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
write!(std::io::stdout(), "{}", redraw).unwrap();
|
|
||||||
}
|
|
||||||
PIDS.lock().unwrap().remove_item(&pid);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}}))
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Widget for Previewer {
|
|
||||||
fn get_coordinates(&self) -> &Coordinates {
|
|
||||||
&self.coordinates
|
|
||||||
}
|
|
||||||
fn set_coordinates(&mut self, coordinates: &Coordinates) {
|
|
||||||
if self.coordinates == *coordinates {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
self.coordinates = coordinates.clone();
|
|
||||||
self.refresh();
|
|
||||||
}
|
|
||||||
fn render_header(&self) -> String {
|
|
||||||
"".to_string()
|
|
||||||
}
|
|
||||||
fn refresh(&mut self) {
|
|
||||||
let file = self.file.clone();
|
|
||||||
if let Some(file) = file {
|
|
||||||
self.set_file(&file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fn get_drawlist(&self) -> String {
|
|
||||||
self.buffer.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
impl Widget for AsyncPreviewer {
|
impl Widget for AsyncPreviewer {
|
||||||
|
|
|
@ -28,6 +28,21 @@ impl TextView {
|
||||||
coordinates: Coordinates::new(),
|
coordinates: Coordinates::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn new_from_file_limit_lines(file: &File, num: usize) -> TextView {
|
||||||
|
let file = std::fs::File::open(&file.path).unwrap();
|
||||||
|
let file = std::io::BufReader::new(file);
|
||||||
|
let lines = file.lines()
|
||||||
|
.take(num)
|
||||||
|
.map(|line|
|
||||||
|
line.unwrap()
|
||||||
|
.replace("\t", " ")).collect();
|
||||||
|
|
||||||
|
TextView {
|
||||||
|
lines: lines,
|
||||||
|
buffer: String::new(),
|
||||||
|
coordinates: Coordinates::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Widget for TextView {
|
impl Widget for TextView {
|
||||||
|
|
Loading…
Reference in New Issue