1
0
mirror of https://github.com/bobwen-dev/hunter synced 2025-04-12 00:55:41 +02:00

async_widget2

This commit is contained in:
rabite 2019-02-14 11:57:52 +01:00
parent 205e9dc426
commit 2860b1b8b1
5 changed files with 56 additions and 26 deletions

View File

@ -196,8 +196,8 @@ where
let pos = self let pos = self
.content .content
.files .files
.par_iter() .iter()
.position_any(|item| item == file) .position(|item| item == file)
.unwrap_or(0); .unwrap_or(0);
self.set_selection(pos); self.set_selection(pos);
} }
@ -346,7 +346,7 @@ where
let offset = self.offset; let offset = self.offset;
self.content self.content
.files .files
.par_iter() .iter()
.skip(offset) .skip(offset)
.take(ysize) .take(ysize)
.map(|file| self.render_line(&file)) .map(|file| self.render_line(&file))
@ -378,7 +378,7 @@ impl Widget for ListView<Files> {
output += &self output += &self
.buffer .buffer
.par_iter() .iter()
//.skip(self.offset) //.skip(self.offset)
//.take(ysize as usize) //.take(ysize as usize)
.enumerate() .enumerate()

View File

@ -37,7 +37,7 @@ mod tabview;
mod async_widget; mod async_widget;
use window::Window; use window::Window;
use async_widget::AsyncPlug; ///use async_widget::AsyncPlug;
use widget::Widget; use widget::Widget;
fn main() { fn main() {

View File

@ -2,13 +2,13 @@ use std::io::Write;
use std::sync::Mutex; use std::sync::Mutex;
use std::sync::Arc; use std::sync::Arc;
use crate::coordinates::{Coordinates, Position, Size}; use crate::coordinates::{Coordinates};
use crate::files::{File, Files, Kind}; use crate::files::{File, Files, Kind};
use crate::listview::ListView; use crate::listview::ListView;
use crate::textview::TextView; use crate::textview::TextView;
use crate::widget::Widget; use crate::widget::Widget;
use crate::async_widget::AsyncPlug; //use crate::async_widget::AsyncPlug;
use crate::async_widget::AsyncPlug2;
lazy_static! { lazy_static! {
static ref PIDS: Arc<Mutex<Vec<u32>>> = { Arc::new(Mutex::new(vec![])) }; static ref PIDS: Arc<Mutex<Vec<u32>>> = { Arc::new(Mutex::new(vec![])) };
@ -30,36 +30,43 @@ fn is_current(file: &File) -> bool {
} }
} }
enum WillBe<T> {
Is(T),
Becoming,
Wont(Box<std::error::Error>)
}
#[derive(PartialEq)] #[derive(PartialEq)]
pub struct AsyncPreviewer { pub struct AsyncPreviewer {
pub file: Option<File>, pub file: Option<File>,
pub buffer: String, pub buffer: String,
pub coordinates: Coordinates, pub coordinates: Coordinates,
pub async_plug: AsyncPlug pub async_plug: AsyncPlug2<Box<dyn Widget + Send + 'static>>
} }
impl AsyncPreviewer { impl AsyncPreviewer {
pub fn new() -> AsyncPreviewer { pub fn new() -> AsyncPreviewer {
let textview = crate::textview::TextView { let closure = Box::new(|| {
Box::new(crate::textview::TextView {
lines: vec![], lines: vec![],
buffer: "".to_string(), buffer: "".to_string(),
coordinates: Coordinates::new(), coordinates: Coordinates::new()
}; }) as Box<dyn Widget + Send + 'static>
let textview = Box::new(textview); });
AsyncPreviewer { AsyncPreviewer {
file: None, file: None,
buffer: String::new(), buffer: String::new(),
coordinates: Coordinates::new(), coordinates: Coordinates::new(),
async_plug: AsyncPlug::new(textview) async_plug: AsyncPlug2::new_from_closure(closure),
} }
} }
pub fn set_file(&mut self, file: &File) { pub fn set_file(&mut self, file: &File) {
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(); //let pids = PIDS.clone();
kill_procs(); //kill_procs();
self.async_plug.replace_widget(Box::new(move || { self.async_plug.replace_widget(Box::new(move || {
kill_procs(); kill_procs();
@ -75,7 +82,7 @@ impl AsyncPreviewer {
file_list.refresh(); file_list.refresh();
//if !is_current(&file) { return } //if !is_current(&file) { return }
file_list.animate_slide_up(); file_list.animate_slide_up();
return Box::new(file_list) as Box<dyn Widget + Send>; return Box::new(file_list)
} }
Err(err) => { Err(err) => {
@ -85,7 +92,7 @@ impl AsyncPreviewer {
buffer: "".to_string(), buffer: "".to_string(),
coordinates: Coordinates::new(), coordinates: Coordinates::new(),
}; };
return Box::new(textview) as Box<dyn Widget + Send>; return Box::new(textview)
}, },
} }
_ => { _ => {
@ -99,7 +106,7 @@ impl AsyncPreviewer {
textview.refresh(); textview.refresh();
//if !is_current(&file) { return } //if !is_current(&file) { return }
textview.animate_slide_up(); textview.animate_slide_up();
return Box::new(textview); return Box::new(textview)
} else { } else {
let process = let process =
std::process::Command::new("scope.sh") std::process::Command::new("scope.sh")
@ -135,7 +142,7 @@ impl AsyncPreviewer {
textview.set_coordinates(&coordinates); textview.set_coordinates(&coordinates);
textview.refresh(); textview.refresh();
textview.animate_slide_up(); textview.animate_slide_up();
return Box::new(textview); return Box::new(textview)
} }
}, None => {} }, None => {}
} }
@ -149,7 +156,7 @@ impl AsyncPreviewer {
buffer: "".to_string(), buffer: "".to_string(),
coordinates: Coordinates::new(), coordinates: Coordinates::new(),
}; };
return Box::new(textview); return Box::new(textview)
} }
} }
}})) }}))
@ -184,3 +191,25 @@ impl Widget for AsyncPreviewer {
"".to_string() "".to_string()
} }
} }
impl<T> Widget for Box<T> where T: Widget + ?Sized {
fn get_coordinates(&self) -> &Coordinates {
(**self).get_coordinates()
}
fn set_coordinates(&mut self, coordinates: &Coordinates) {
if (**self).get_coordinates() == coordinates {
return;
}
(**self).set_coordinates(&coordinates);
(**self).refresh();
}
fn render_header(&self) -> String {
(**self).render_header()
}
fn refresh(&mut self) {
(**self).refresh()
}
fn get_drawlist(&self) -> String {
(**self).get_drawlist()
}
}

View File

@ -63,7 +63,7 @@ impl Widget for TextView {
self.buffer = self.get_clearlist() + self.buffer = self.get_clearlist() +
&self &self
.lines .lines
.par_iter() .iter()
.take(ysize as usize) .take(ysize as usize)
.enumerate() .enumerate()
.map(|(i, line)| { .map(|(i, line)| {

View File

@ -132,6 +132,7 @@ pub trait Widget {
let buffer = self.get_drawlist(); let buffer = self.get_drawlist();
write!(bufout, "{}{}", write!(bufout, "{}{}",
clear, buffer).unwrap(); clear, buffer).unwrap();
bufout.flush();
std::thread::sleep(pause); std::thread::sleep(pause);