mirror of https://github.com/bobwen-dev/hunter
move methods from Widget trait to WidgetCore
This commit is contained in:
parent
6d43ce621d
commit
cdaacd1ca6
|
@ -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(())
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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 { "" };
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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()? }
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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()
|
||||
|
|
230
src/widget.rs
230
src/widget.rs
|
@ -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)?;
|
||||
|
|
Loading…
Reference in New Issue