summaryrefslogtreecommitdiffstats
path: root/src/util/input.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/input.rs')
-rw-r--r--src/util/input.rs148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/util/input.rs b/src/util/input.rs
new file mode 100644
index 0000000..af9e326
--- /dev/null
+++ b/src/util/input.rs
@@ -0,0 +1,148 @@
+use signal_hook::consts::signal;
+use termion::event::{MouseButton, MouseEvent};
+use tui::layout::{Constraint, Direction, Layout};
+
+use crate::commands::{cursor_move, parent_cursor_move, JoshutoRunnable, KeyCommand};
+use crate::context::JoshutoContext;
+use crate::history::DirectoryHistory;
+use crate::io::{FileOp, IOWorkerProgress};
+use crate::ui;
+use crate::util::event::JoshutoEvent;
+use crate::util::format;
+
+pub fn process_mouse(
+ event: MouseEvent,
+ context: &mut JoshutoContext,
+ backend: &mut ui::TuiBackend,
+) {
+ let f_size = backend.terminal.as_ref().unwrap().size().unwrap();
+
+ let constraints: &[Constraint; 3] = &context.config_ref().default_layout;
+ let layout_rect = Layout::default()
+ .direction(Direction::Horizontal)
+ .vertical_margin(1)
+ .constraints(constraints.as_ref())
+ .split(f_size);
+
+ match event {
+ MouseEvent::Press(MouseButton::WheelUp, x, _) => {
+ if x < layout_rect[1].x {
+ let command = KeyCommand::ParentCursorMoveUp(1);
+ if let Err(e) = command.execute(context, backend) {
+ context.push_msg(e.to_string());
+ }
+ } else if x < layout_rect[2].x {
+ let command = KeyCommand::CursorMoveUp(1);
+ if let Err(e) = command.execute(context, backend) {
+ context.push_msg(e.to_string());
+ }
+ } else {
+ // TODO: scroll in child list
+ let command = KeyCommand::CursorMoveUp(1);
+ if let Err(e) = command.execute(context, backend) {
+ context.push_msg(e.to_string());
+ }
+ }
+ }
+ MouseEvent::Press(MouseButton::WheelDown, x, _) => {
+ if x < layout_rect[1].x {
+ let command = KeyCommand::ParentCursorMoveDown(1);
+ if let Err(e) = command.execute(context, backend) {
+ context.push_msg(e.to_string());
+ }
+ } else if x < layout_rect[2].x {
+ let command = KeyCommand::CursorMoveDown(1);
+ if let Err(e) = command.execute(context, backend) {
+ context.push_msg(e.to_string());
+ }
+ } else {
+ // TODO: scroll in child list
+ let command = KeyCommand::CursorMoveDown(1);
+ if let Err(e) = command.execute(context, backend) {
+ context.push_msg(e.to_string());
+ }
+ }
+ }
+ MouseEvent::Press(MouseButton::Left, x, y)
+ if y > layout_rect[1].y && y <= layout_rect[1].y + layout_rect[1].height =>
+ {
+ if x < layout_rect[1].x {
+ if let Some(dirlist) = context.tab_context_ref().curr_tab_ref().curr_list_ref() {
+ if let Some(curr_index) = dirlist.index {
+ let skip_dist = curr_index / layout_rect[1].height as usize
+ * layout_rect[1].height as usize;
+
+ let new_index = skip_dist + (y - layout_rect[1].y - 1) as usize;
+ if let Err(e) = parent_cursor_move::parent_cursor_move(new_index, context) {
+ context.push_msg(e.to_string());
+ }
+ }
+ }
+ } else if x < layout_rect[2].x {
+ if let Some(dirlist) = context.tab_context_ref().curr_tab_ref().curr_list_ref() {
+ if let Some(curr_index) = dirlist.index {
+ let skip_dist = curr_index / layout_rect[1].height as usize
+ * layout_rect[1].height as usize;
+
+ let new_index = skip_dist + (y - layout_rect[1].y - 1) as usize;
+ if let Err(e) = cursor_move::cursor_move(new_index, context) {
+ context.push_msg(e.to_string());
+ }
+ }
+ }
+ } else {
+ }
+ }
+ MouseEvent::Press(MouseButton::Left, x, y)
+ if y > layout_rect[1].y && y <= layout_rect[1].y + layout_rect[1].height => {}
+ _ => {}
+ }
+ context.flush_event();
+}
+
+pub fn process_noninteractive(event: JoshutoEvent, context: &mut JoshutoContext) {
+ match event {
+ JoshutoEvent::IOWorkerProgress(res) => process_worker_progress(context, res),
+ JoshutoEvent::IOWorkerResult(res) => process_finished_worker(context, res),
+ JoshutoEvent::Signal(signal::SIGWINCH) => {}
+ _ => {}
+ }
+}
+
+pub fn process_worker_progress(context: &mut JoshutoContext, res: IOWorkerProgress) {
+ context.set_worker_progress(res);
+ context.update_worker_msg();
+}
+
+pub fn process_finished_worker(
+ context: &mut JoshutoContext,
+ res: std::io::Result<IOWorkerProgress>,
+) {
+ let observer = context.remove_job().unwrap();
+ let options = context.config_ref().sort_option.clone();
+ for tab in context.tab_context_mut().iter_mut() {
+ let _ = tab.history_mut().reload(observer.dest_path(), &options);
+ let _ = tab.history_mut().reload(observer.src_path(), &options);
+ }
+ observer.join();
+ match res {
+ Ok(progress) => {
+ let op = match progress.kind() {
+ FileOp::Copy => "copied",
+ FileOp::Cut => "moved",
+ };
+ let size_str = format::file_size_to_string(progress.processed());
+ let msg = format!(
+ "successfully {} {} items ({})",
+ op,
+ progress.len(),
+ size_str
+ );
+ context.push_msg(msg);
+ }
+ Err(e) => {
+ let msg = format!("{}", e);
+ context.push_msg(msg);
+ }
+ }
+}