move methods from Widget trait to WidgetCore

This commit is contained in:
rabite 2019-05-23 19:49:01 +02:00
parent 6d43ce621d
commit cdaacd1ca6
11 changed files with 171 additions and 172 deletions

View File

@ -102,7 +102,7 @@ impl BMPopup {
err @ Err(HError::WidgetResizedError) => err?,
err @ Err(_) => err?,
}
self.clear()?;
self.get_core()?.clear()?;
let bookmark = self.bookmark_path.take();
Ok(bookmark?)
@ -112,9 +112,9 @@ impl BMPopup {
self.add_mode = true;
self.bookmark_path = Some(path.to_string());
self.refresh()?;
self.clear()?;
self.get_core()?.clear()?;
self.popup()?;
self.clear()?;
self.get_core()?.clear()?;
Ok(())
}

View File

@ -197,7 +197,7 @@ impl Tabbable for TabView<FileBrowser> {
}
fn on_config_loaded(&mut self) -> HResult<()> {
let show_hidden = self.config().show_hidden();
let show_hidden = self.core.config().show_hidden();
for tab in self.widgets.iter_mut() {
tab.left_async_widget_mut().map(|async_w| {
@ -366,7 +366,7 @@ impl FileBrowser {
let status =
format!("{}Stop right there, cowboy! Check your permisions!",
term::color_red());
self.show_status(&status).log();
self.core.show_status(&status).log();
return Ok(());
}
err @ Err(_) => err.log()
@ -414,17 +414,17 @@ impl FileBrowser {
.status();
self.core.screen.activate().log();
self.clear().log();
self.core.clear().log();
self.core.get_sender().send(Events::InputEnabled(true))?;
match status {
Ok(status) =>
self.show_status(&format!("\"{}\" exited with {}",
"rifle", status)).log(),
self.core.show_status(&format!("\"{}\" exited with {}",
"rifle", status)).log(),
Err(err) =>
self.show_status(&format!("Can't run this \"{}\": {}",
"rifle", err)).log()
self.core.show_status(&format!("Can't run this \"{}\": {}",
"rifle", err)).log()
}
}
Ok(())
@ -648,7 +648,7 @@ impl FileBrowser {
pub fn set_title(&self) -> HResult<()> {
let path = self.cwd.short_string();
self.screen()?.set_title(&path)?;
self.core.screen()?.set_title(&path)?;
Ok(())
}
@ -880,7 +880,7 @@ impl FileBrowser {
}
pub fn turbo_cd(&mut self) -> HResult<()> {
let dir = self.minibuffer("cd")?;
let dir = self.core.minibuffer("cd")?;
let path = std::path::PathBuf::from(&dir);
let dir = File::new_from_path(&path.canonicalize()?, None)?;
@ -910,7 +910,7 @@ impl FileBrowser {
.output();
self.core.screen.activate().log();
self.clear().log();
self.core.clear().log();
self.core.get_sender().send(Events::InputEnabled(true))?;
match cmd_result {
@ -954,7 +954,7 @@ impl FileBrowser {
} else {
let msg = format!("Can't access path: {}!",
path.to_string_lossy());
self.show_status(&msg).log();
self.core.show_status(&msg).log();
}
} else {
let mut last_file = None;
@ -962,7 +962,7 @@ impl FileBrowser {
if !file_path.exists() {
let msg = format!("Can't find: {}",
file_path .to_string_lossy());
self.show_status(&msg).log();
self.core.show_status(&msg).log();
continue;
}
@ -988,10 +988,10 @@ impl FileBrowser {
}).log();
}
} else {
self.show_status("External program failed!").log();
self.core.show_status("External program failed!").log();
}
}
Err(_) => self.show_status("Can't run external program!").log()
Err(_) => self.core.show_status("Can't run external program!").log()
}
Ok(())
@ -1018,7 +1018,7 @@ impl FileBrowser {
.output();
self.core.screen.activate().log();
self.clear().log();
self.core.clear().log();
self.core.get_sender().send(Events::InputEnabled(true))?;
match cmd_result {
@ -1043,15 +1043,15 @@ impl FileBrowser {
else {
let msg = format!("Can't access path: {}!",
path.to_string_lossy());
self.show_status(&msg).log();
self.core.show_status(&msg).log();
}
} else {
self.show_status("External program failed!").log();
self.core.show_status("External program failed!").log();
}
}
}
Err(_) => self.show_status("Can't run external program!").log()
Err(_) => self.core.show_status("Can't run external program!").log()
}
Ok(())
@ -1066,7 +1066,7 @@ impl FileBrowser {
let selected_file = self.selected_file().ok();
let selected_files = self.selected_files().ok();
let cmd = self.minibuffer("exec")?.trim_start().to_string() + " ";
let cmd = self.core.minibuffer("exec")?.trim_start().to_string() + " ";
let cwd_files = selected_files.map(|selected_files| {
if selected_files.len() == 0 {
@ -1111,10 +1111,10 @@ impl FileBrowser {
match status {
Ok(status) =>
self.show_status(&format!("\"{}\" exited with {}",
self.core.show_status(&format!("\"{}\" exited with {}",
shell, status)).log(),
Err(err) =>
self.show_status(&format!("Can't run this \"{}\": {}",
self.core.show_status(&format!("Can't run this \"{}\": {}",
shell, err)).log()
}

View File

@ -72,7 +72,7 @@ impl<T> HBox<T> where T: Widget + PartialEq {
}
pub fn toggle_zoom(&mut self) -> HResult<()> {
self.clear().log();
self.core.clear().log();
self.zoom_active = !self.zoom_active;
self.resize_children()
}

View File

@ -29,7 +29,7 @@ impl Listable for ListView<Files> {
}
fn on_new(&mut self) -> HResult<()> {
let show_hidden = self.config().show_hidden();
let show_hidden = self.core.config().show_hidden();
self.content.show_hidden = show_hidden;
Ok(())
}
@ -226,7 +226,7 @@ impl ListView<Files>
pub fn goto_grand_parent(&mut self) -> HResult<()> {
match self.grand_parent() {
Some(grand_parent) => self.goto_path(&grand_parent),
None => { self.show_status("Can't go further!") },
None => { self.core.show_status("Can't go further!") },
}
}
@ -245,7 +245,7 @@ impl ListView<Files>
self.refresh()
}
Err(err) => {
self.show_status(&format!("Can't open this path: {}", err))
self.core.show_status(&format!("Can't open this path: {}", err))
}
}
}
@ -266,7 +266,7 @@ impl ListView<Files>
self.content.sort();
self.select_file(&file);
self.refresh().log();
self.show_status(&format!("Sorting by: {}", self.content.sort)).log();
self.core.show_status(&format!("Sorting by: {}", self.content.sort)).log();
}
fn reverse_sort(&mut self) {
@ -275,7 +275,8 @@ impl ListView<Files>
self.content.sort();
self.select_file(&file);
self.refresh().log();
self.show_status(&format!("Reversed sorting by: {}", self.content.sort)).log();
self.core.show_status(&format!("Reversed sorting by: {}",
self.content.sort)).log();
}
fn select_next_mtime(&mut self) {
@ -346,8 +347,8 @@ impl ListView<Files>
self.content.sort();
self.select_file(&file);
self.refresh().log();
self.show_status(&format!("Direcories first: {}",
self.content.dirs_first)).log();
self.core.show_status(&format!("Direcories first: {}",
self.content.dirs_first)).log();
}
fn multi_select_file(&mut self) {
@ -383,7 +384,7 @@ impl ListView<Files>
let selected_file = self.clone_selected_file();
loop {
let input = self.minibuffer_continuous("search");
let input = self.core.minibuffer_continuous("search");
match input {
Ok(input) => {
@ -414,7 +415,7 @@ impl ListView<Files>
fn search_next(&mut self) -> HResult<()> {
if self.searching.is_none() {
self.show_status("No search pattern set!").log();
self.core.show_status("No search pattern set!").log();
}
let prev_search = self.searching.clone()?;
let selection = self.get_selection();
@ -435,14 +436,14 @@ impl ListView<Files>
let file = file.clone();
self.select_file(&file);
} else {
self.show_status("Reached last search result!").log();
self.core.show_status("Reached last search result!").log();
}
Ok(())
}
fn search_prev(&mut self) -> HResult<()> {
if self.searching.is_none() {
self.show_status("No search pattern set!").log();
self.core.show_status("No search pattern set!").log();
}
let prev_search = self.searching.clone()?;
@ -464,13 +465,13 @@ impl ListView<Files>
}).cloned();
self.reverse_sort();
self.clear_status().log();
self.core.clear_status().log();
if let Some(file) = file {
let file = file.clone();
self.select_file(&file);
} else {
self.show_status("Reached last search result!").log();
self.core.show_status("Reached last search result!").log();
}
Ok(())
@ -480,7 +481,7 @@ impl ListView<Files>
let selected_file = self.selected_file().clone();
loop {
let filter = self.minibuffer_continuous("filter");
let filter = self.core.minibuffer_continuous("filter");
match filter {
Err(HError::MiniBufferInputUpdated(input)) => {
@ -502,7 +503,7 @@ impl ListView<Files>
}
let msgstr = filter.clone().unwrap_or(String::from(""));
self.show_status(&format!("Filtering with: \"{}\"", msgstr)).log();
self.core.show_status(&format!("Filtering with: \"{}\"", msgstr)).log();
break;
}
@ -511,7 +512,7 @@ impl ListView<Files>
}
fn render_line(&self, file: &File) -> String {
let icon = if self.config().icons {
let icon = if self.core.config().icons {
file.icon()
} else { "" };

View File

@ -198,7 +198,7 @@ impl MediaView {
let mute = self.mute();
let position = self.position.clone();
let duration = self.duration.clone();
let clear = self.get_clearlist()?;
let clear = self.get_core()?.get_clearlist()?;
std::thread::spawn(move || -> HResult<()> {
// Sleep a bit to avoid overloading the system when scrolling
@ -460,6 +460,6 @@ impl Drop for MediaView {
self.stale.set_stale().ok();
self.kill().log();
self.clear().log();
self.core.clear().log();
}
}

View File

@ -167,7 +167,7 @@ impl MiniBuffer {
self.clear();
}
self.screen()?.cursor_hide().log();
self.core.screen()?.cursor_hide().log();
match self.popup() {
Err(HError::MiniBufferCancelledInput) => self.input_cancelled()?,
@ -335,7 +335,7 @@ impl MiniBuffer {
}
pub fn input_cancelled(&self) -> HResult<()> {
self.show_status("Input cancelled").log();
self.core.show_status("Input cancelled").log();
return HError::minibuffer_cancel()
}
@ -344,7 +344,7 @@ impl MiniBuffer {
}
pub fn input_empty(&self) -> HResult<()> {
self.show_status("Empty!").log();
self.core.show_status("Empty!").log();
return HError::minibuffer_empty()
}
}
@ -502,7 +502,7 @@ impl Widget for MiniBuffer {
": ".len() +
self.position;
let mut screen = self.screen()?;
let mut screen = self.core.screen()?;
let ysize = screen.ysize()?;
screen.goto_xy(cursor_pos, ysize).log();

View File

@ -166,14 +166,14 @@ impl<T: Widget + Send + 'static> Widget for AsyncWidget<T> {
}
fn get_drawlist(&self) -> HResult<String> {
if self.widget().is_err() {
let clear = self.get_clearlist()?;
let clear = self.core.get_clearlist()?;
let (xpos, ypos) = self.get_coordinates()?.u16position();
let pos = crate::term::goto_xy(xpos, ypos);
return Ok(clear + &pos + "...")
}
if self.is_stale()? {
return self.get_clearlist()
return self.core.get_clearlist()
}
self.widget()?.get_drawlist()
@ -517,7 +517,7 @@ impl Widget for Previewer {
}
fn config_loaded(&mut self) -> HResult<()> {
let show_hidden = self.config().show_hidden();
let show_hidden = self.core.config().show_hidden();
if let PreviewWidget::FileList(filelist) = self.widget.widget_mut()? {
filelist.content.show_hidden = show_hidden;
filelist.content.dirty_meta.set_dirty();

View File

@ -212,7 +212,7 @@ impl ListView<Vec<Process>> {
.to_string_lossy()
.to_string();
self.show_status(&format!("Running: {}", &short_cmd)).log();
self.core.show_status(&format!("Running: {}", &short_cmd)).log();
let shell_args = cmd_args.concat();
let shell_args = vec![OsString::from("-c"), shell_args.clone()];
@ -232,7 +232,7 @@ impl ListView<Vec<Process>> {
.to_string());
let args = cmd.args.unwrap_or(vec![]);
self.show_status(&format!("Running: {}", &short_cmd)).log();
self.core.show_status(&format!("Running: {}", &short_cmd)).log();
let handle = std::process::Command::new(real_cmd)
.args(args)
@ -411,7 +411,7 @@ impl ProcView {
pub fn remove_proc(&mut self) -> HResult<()> {
if self.get_listview_mut().content.len() == 0 { return Ok(()) }
self.get_listview_mut().remove_proc()?;
self.get_textview().clear().log();
self.get_textview().get_core()?.clear().log();
self.get_textview().widget_mut()?.set_text("").log();
self.viewing = None;
Ok(())
@ -563,7 +563,7 @@ impl Widget for ProcView {
match key {
Key::Char('w') => {
self.animator.set_stale().log();
self.clear().log();
self.get_core()?.clear().log();
return Err(HError::PopupFinnished) }
Key::Char('d') => { self.remove_proc()? }
Key::Char('K') => { self.get_listview_mut().kill_proc()? }

View File

@ -36,7 +36,7 @@ pub trait Tabbable {
pub struct TabView<T> where T: Widget, TabView<T>: Tabbable {
pub widgets: Vec<T>,
pub active: usize,
core: WidgetCore
pub core: WidgetCore
}
impl<T> TabView<T> where T: Widget, TabView<T>: Tabbable {

View File

@ -152,7 +152,7 @@ impl Widget for TextView {
let (xsize, ysize) = self.get_coordinates()?.size().size();
let (xpos, ypos) = self.get_coordinates()?.position().position();
let output = self.get_clearlist()? +
let output = self.core.get_clearlist()? +
&self
.lines
.iter()

View File

@ -102,6 +102,100 @@ impl WidgetCore {
pub fn get_sender(&self) -> Sender<Events> {
self.event_sender.lock().unwrap().clone()
}
pub fn draw_status(&self) -> HResult<()> {
let xsize = term::xsize_u();
let status = match self.status_bar_content.lock()?.as_ref() {
Some(status) => status.to_string(),
None => "".to_string(),
};
let sized_status = term::sized_string_u(&status, xsize);
self.write_to_screen(
&format!(
"{}{}{}",
term::move_bottom(),
term::status_bg(),
sized_status
)).log();
Ok(())
}
pub fn show_status(&self, status: &str) -> HResult<()> {
HError::log::<()>(status.to_string()).log();
{
let mut status_content = self.status_bar_content.lock()?;
*status_content = Some(status.to_string());
}
self.draw_status()?;
Ok(())
}
pub fn clear_status(&self) -> HResult<()> {
if self.status_bar_content.lock()?.take().is_some() {
self.draw_status().log();
}
Ok(())
}
pub fn minibuffer(&self, query: &str) -> HResult<String> {
let answer = self.minibuffer
.lock()?
.as_mut()?
.query(query, false);
let mut screen = self.screen()?;
screen.cursor_hide().log();
answer
}
pub fn minibuffer_continuous(&self, query: &str) -> HResult<String> {
let answer = self.minibuffer
.lock()?
.as_mut()?
.query(query, true);
let mut screen = self.screen()?;
screen.cursor_hide().log();
answer
}
pub fn screen(&self) -> HResult<Screen> {
Ok(self.screen.clone())
}
pub fn clear(&self) -> HResult<()> {
let clearlist = self.get_clearlist()?;
self.write_to_screen(&clearlist)
}
pub fn get_clearlist(&self) -> HResult<String> {
let (xpos, ypos) = self.coordinates.u16position();
let (xsize, ysize) = self.coordinates.u16size();
let endpos = ypos + ysize;
Ok((ypos..endpos)
.map(|line| {
format!(
"{}{}{:xsize$}",
crate::term::reset(),
crate::term::goto_xy(xpos, line),
" ",
xsize = xsize as usize
)
})
.collect())
}
pub fn write_to_screen(&self, s: &str) -> HResult<()> {
let mut screen = self.screen()?;
screen.write_str(s)
}
pub fn config(&self) -> Config {
self.config.read().unwrap().get()
.map(|config| config.clone())
.unwrap_or(Config::new())
}
}
impl Dirtyable for WidgetCore {
@ -149,7 +243,7 @@ pub trait Widget {
fn on_event(&mut self, event: Event) -> HResult<()> {
self.clear_status().log();
self.get_core()?.clear_status().log();
match event {
Event::Key(key) => self.on_key(key),
Event::Mouse(button) => self.on_mouse(button),
@ -179,7 +273,8 @@ pub trait Widget {
}
fn bad(&mut self, event: Event) -> HResult<()> {
self.show_status(&format!("Stop it!! {:?} does nothing!", event)).log();
self.get_core()?.show_status(&format!("Stop it!! {:?} does nothing!",
event)).log();
if let Event::Key(key) = event {
HError::undefined_key(key)
} else { Ok(()) }
@ -210,23 +305,7 @@ pub trait Widget {
xsize = xsize as usize))
}
fn get_clearlist(&self) -> HResult<String> {
let (xpos, ypos) = self.get_coordinates()?.u16position();
let (xsize, ysize) = self.get_coordinates()?.u16size();
let endpos = ypos + ysize;
Ok((ypos..endpos)
.map(|line| {
format!(
"{}{}{:xsize$}",
crate::term::reset(),
crate::term::goto_xy(xpos, line),
" ",
xsize = xsize as usize
)
})
.collect())
}
fn get_redraw_empty_list(&self, lines: usize) -> HResult<String> {
let (xpos, ypos) = self.get_coordinates()?.u16position();
@ -247,7 +326,7 @@ pub trait Widget {
fn popup(&mut self) -> HResult<()> {
let result = self.run_widget();
self.clear().log();
self.get_core()?.clear().log();
self.get_core()?.get_sender().send(Events::ExclusiveEvent(None))?;
result
}
@ -263,7 +342,7 @@ pub trait Widget {
.send(Events::ExclusiveEvent(Some(Mutex::new(Some(tx_event)))))?;
self.get_core()?.get_sender().send(Events::RequestInput)?;
self.clear()?;
self.get_core()?.clear()?;
self.refresh().log();
self.draw()?;
@ -286,10 +365,10 @@ pub trait Widget {
self.draw().log();
}
Events::Status(status) => {
self.show_status(&status).log();
self.get_core()?.show_status(&status).log();
}
Events::TerminalResized => {
self.screen()?.clear().log();
self.get_core()?.screen()?.clear().log();
match self.resize() {
err @ Err(HError::TerminalResizedError) => err?,
_ => {}
@ -310,30 +389,16 @@ pub trait Widget {
Ok(())
}
fn clear(&self) -> HResult<()> {
let clearlist = self.get_clearlist()?;
self.write_to_screen(&clearlist)
}
fn config(&self) -> Config {
self.get_core()
.unwrap()
.config.read().unwrap().get()
.map(|config| config.clone())
.unwrap_or(Config::new())
}
fn animate_slide_up(&mut self, animator: Option<&Stale>) -> HResult<()> {
if !self.config().animate() { return Ok(()); }
self.config();
if !self.get_core()?.config().animate() { return Ok(()); }
let coords = self.get_coordinates()?.clone();
let xpos = coords.position().x();
let ypos = coords.position().y();
let xsize = coords.xsize();
let ysize = coords.ysize();
let clear = self.get_clearlist()?;
let clear = self.get_core()?.get_clearlist()?;
let pause = std::time::Duration::from_millis(5);
if let Some(ref animator) = animator {
@ -342,7 +407,7 @@ pub trait Widget {
}
}
self.write_to_screen(&clear).log();
self.get_core()?.write_to_screen(&clear).log();
for i in (0..10).rev() {
if let Some(ref animator) = animator {
@ -360,7 +425,7 @@ pub trait Widget {
let buffer = self.get_drawlist()?;
if !animator.as_ref()?.is_stale()? {
self.write_to_screen(&buffer).log();
self.get_core()?.write_to_screen(&buffer).log();
}
std::thread::sleep(pause);
@ -374,8 +439,8 @@ pub trait Widget {
self.get_drawlist().unwrap_or("".to_string()) +
&self.get_header_drawlist().unwrap_or("".to_string()) +
&self.get_footer_drawlist().unwrap_or("".to_string());
self.write_to_screen(&output).log();
self.screen()?.flush().ok();
self.get_core()?.write_to_screen(&output).log();
self.get_core()?.screen()?.flush().ok();
Ok(())
}
@ -383,7 +448,7 @@ pub trait Widget {
let (tx_internal_event, rx_internal_event) = channel();
let rx_global_event = self.get_core()?.event_receiver.lock()?.take()?;
dispatch_events(tx_internal_event, rx_global_event, self.screen()?);
dispatch_events(tx_internal_event, rx_global_event, self.get_core()?.screen()?);
for event in rx_internal_event.iter() {
match event {
@ -395,10 +460,10 @@ pub trait Widget {
self.get_core()?.get_sender().send(Events::RequestInput)?;
}
Events::Status(status) => {
self.show_status(&status).log();
self.get_core()?.show_status(&status).log();
}
Events::TerminalResized => {
self.screen()?.clear().log();
self.get_core()?.screen()?.clear().log();
}
Events::ConfigLoaded => {
self.get_core_mut()?.config.write()?.pull_async()?;
@ -407,8 +472,8 @@ pub trait Widget {
_ => {}
}
self.resize().log();
if self.screen()?.is_resized()? {
self.screen()?.take_size().ok();
if self.get_core()?.screen()?.is_resized()? {
self.get_core()?.screen()?.take_size().ok();
}
self.refresh().ok();
self.draw().ok();
@ -416,76 +481,9 @@ pub trait Widget {
Ok(())
}
fn draw_status(&self) -> HResult<()> {
let xsize = term::xsize_u();
let status = match self.get_core()?.status_bar_content.lock()?.as_ref() {
Some(status) => status.to_string(),
None => "".to_string(),
};
let sized_status = term::sized_string_u(&status, xsize);
self.write_to_screen(
&format!(
"{}{}{}",
term::move_bottom(),
term::status_bg(),
sized_status
)).log();
Ok(())
}
fn show_status(&self, status: &str) -> HResult<()> {
HError::log::<()>(status.to_string()).log();
{
let mut status_content = self.get_core()?.status_bar_content.lock()?;
*status_content = Some(status.to_string());
}
self.draw_status()?;
Ok(())
}
fn clear_status(&self) -> HResult<()> {
if self.get_core()?.status_bar_content.lock()?.take().is_some() {
self.draw_status().log();
}
Ok(())
}
fn minibuffer(&self, query: &str) -> HResult<String> {
let answer = self.get_core()?
.minibuffer
.lock()?
.as_mut()?
.query(query, false);
let mut screen = self.screen()?;
screen.cursor_hide().log();
answer
}
fn minibuffer_continuous(&self, query: &str) -> HResult<String> {
let answer = self.get_core()?
.minibuffer
.lock()?
.as_mut()?
.query(query, true);
let mut screen = self.screen()?;
screen.cursor_hide().log();
answer
}
fn screen(&self) -> HResult<Screen> {
Ok(self.get_core()?.screen.clone())
}
fn write_to_screen(&self, s: &str) -> HResult<()> {
let mut screen = self.screen()?;
screen.write_str(s)
}
fn resize(&mut self) -> HResult<()> {
if let Ok(true) = self.screen()?.is_resized() {
let (xsize, ysize) = self.screen()?.get_size()?;
if let Ok(true) = self.get_core()?.screen()?.is_resized() {
let (xsize, ysize) = self.get_core()?.screen()?.get_size()?;
let mut coords = self.get_core()?.coordinates.clone();
coords.set_size_u(xsize, ysize-2);
self.set_coordinates(&coords)?;