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

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

View File

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

View File

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

View File

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

View File

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

View File

@ -167,7 +167,7 @@ impl MiniBuffer {
self.clear(); self.clear();
} }
self.screen()?.cursor_hide().log(); self.core.screen()?.cursor_hide().log();
match self.popup() { match self.popup() {
Err(HError::MiniBufferCancelledInput) => self.input_cancelled()?, Err(HError::MiniBufferCancelledInput) => self.input_cancelled()?,
@ -335,7 +335,7 @@ impl MiniBuffer {
} }
pub fn input_cancelled(&self) -> HResult<()> { pub fn input_cancelled(&self) -> HResult<()> {
self.show_status("Input cancelled").log(); self.core.show_status("Input cancelled").log();
return HError::minibuffer_cancel() return HError::minibuffer_cancel()
} }
@ -344,7 +344,7 @@ impl MiniBuffer {
} }
pub fn input_empty(&self) -> HResult<()> { pub fn input_empty(&self) -> HResult<()> {
self.show_status("Empty!").log(); self.core.show_status("Empty!").log();
return HError::minibuffer_empty() return HError::minibuffer_empty()
} }
} }
@ -502,7 +502,7 @@ impl Widget for MiniBuffer {
": ".len() + ": ".len() +
self.position; self.position;
let mut screen = self.screen()?; let mut screen = self.core.screen()?;
let ysize = screen.ysize()?; let ysize = screen.ysize()?;
screen.goto_xy(cursor_pos, ysize).log(); 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> { fn get_drawlist(&self) -> HResult<String> {
if self.widget().is_err() { if self.widget().is_err() {
let clear = self.get_clearlist()?; let clear = self.core.get_clearlist()?;
let (xpos, ypos) = self.get_coordinates()?.u16position(); let (xpos, ypos) = self.get_coordinates()?.u16position();
let pos = crate::term::goto_xy(xpos, ypos); let pos = crate::term::goto_xy(xpos, ypos);
return Ok(clear + &pos + "...") return Ok(clear + &pos + "...")
} }
if self.is_stale()? { if self.is_stale()? {
return self.get_clearlist() return self.core.get_clearlist()
} }
self.widget()?.get_drawlist() self.widget()?.get_drawlist()
@ -517,7 +517,7 @@ impl Widget for Previewer {
} }
fn config_loaded(&mut self) -> HResult<()> { 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()? { if let PreviewWidget::FileList(filelist) = self.widget.widget_mut()? {
filelist.content.show_hidden = show_hidden; filelist.content.show_hidden = show_hidden;
filelist.content.dirty_meta.set_dirty(); filelist.content.dirty_meta.set_dirty();

View File

@ -212,7 +212,7 @@ impl ListView<Vec<Process>> {
.to_string_lossy() .to_string_lossy()
.to_string(); .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 = cmd_args.concat();
let shell_args = vec![OsString::from("-c"), shell_args.clone()]; let shell_args = vec![OsString::from("-c"), shell_args.clone()];
@ -232,7 +232,7 @@ impl ListView<Vec<Process>> {
.to_string()); .to_string());
let args = cmd.args.unwrap_or(vec![]); 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) let handle = std::process::Command::new(real_cmd)
.args(args) .args(args)
@ -411,7 +411,7 @@ impl ProcView {
pub fn remove_proc(&mut self) -> HResult<()> { pub fn remove_proc(&mut self) -> HResult<()> {
if self.get_listview_mut().content.len() == 0 { return Ok(()) } if self.get_listview_mut().content.len() == 0 { return Ok(()) }
self.get_listview_mut().remove_proc()?; 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.get_textview().widget_mut()?.set_text("").log();
self.viewing = None; self.viewing = None;
Ok(()) Ok(())
@ -563,7 +563,7 @@ impl Widget for ProcView {
match key { match key {
Key::Char('w') => { Key::Char('w') => {
self.animator.set_stale().log(); self.animator.set_stale().log();
self.clear().log(); self.get_core()?.clear().log();
return Err(HError::PopupFinnished) } return Err(HError::PopupFinnished) }
Key::Char('d') => { self.remove_proc()? } Key::Char('d') => { self.remove_proc()? }
Key::Char('K') => { self.get_listview_mut().kill_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 struct TabView<T> where T: Widget, TabView<T>: Tabbable {
pub widgets: Vec<T>, pub widgets: Vec<T>,
pub active: usize, pub active: usize,
core: WidgetCore pub core: WidgetCore
} }
impl<T> TabView<T> where T: Widget, TabView<T>: Tabbable { 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 (xsize, ysize) = self.get_coordinates()?.size().size();
let (xpos, ypos) = self.get_coordinates()?.position().position(); let (xpos, ypos) = self.get_coordinates()?.position().position();
let output = self.get_clearlist()? + let output = self.core.get_clearlist()? +
&self &self
.lines .lines
.iter() .iter()

View File

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