summaryrefslogtreecommitdiffstats
path: root/src/commands/cursor_move.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands/cursor_move.rs')
-rw-r--r--src/commands/cursor_move.rs232
1 files changed, 135 insertions, 97 deletions
diff --git a/src/commands/cursor_move.rs b/src/commands/cursor_move.rs
index c59fde6..4bc16c7 100644
--- a/src/commands/cursor_move.rs
+++ b/src/commands/cursor_move.rs
@@ -1,78 +1,119 @@
use crate::commands::{JoshutoCommand, JoshutoRunnable};
use crate::context::JoshutoContext;
-use crate::preview;
+use crate::window::JoshutoView;
+
+pub mod CursorMove {
+ use crate::context::JoshutoContext;
+ use crate::preview;
+ use crate::window::JoshutoView;
+
+ pub fn cursor_move(mut new_index: usize, context: &mut JoshutoContext, view: &JoshutoView) {
+ let curr_tab = &mut context.tabs[context.curr_tab_index];
+
+ if let Some(curr_list) = curr_tab.curr_list.as_mut() {
+ match curr_list.index {
+ None => {}
+ Some(index) => {
+ let dir_len = curr_list.contents.len();
+ if new_index >= dir_len {
+ new_index = dir_len - 1;
+ if index == dir_len - 1 {
+ return;
+ }
+ }
+ curr_list.index = Some(new_index);
+ }
+ }
+ }
+ curr_tab.refresh_curr(&view.mid_win, context.config_t.scroll_offset);
+ curr_tab.refresh_file_status(&view.bot_win);
+ curr_tab.refresh_path_status(
+ &view.top_win,
+ &context.username,
+ &context.hostname,
+ context.config_t.tilde_in_titlebar,
+ );
+ preview::preview_file(curr_tab, &view, &context.config_t);
+ ncurses::doupdate();
+ }
+}
#[derive(Clone, Debug)]
-pub struct CursorMove {
- movement: i32,
+pub struct CursorMoveInc {
+ movement: usize,
}
-impl CursorMove {
- pub fn new(movement: i32) -> Self {
- CursorMove { movement }
+impl CursorMoveInc {
+ pub fn new(movement: usize) -> Self {
+ CursorMoveInc { movement }
}
pub const fn command() -> &'static str {
- "cursor_move"
+ "cursor_move_increment"
}
+}
- pub fn cursor_move(new_index: i32, context: &mut JoshutoContext) {
- {
- let curr_tab = &mut context.tabs[context.curr_tab_index];
-
- if let Some(ref mut curr_list) = curr_tab.curr_list {
- let curr_index = curr_list.index;
- let dir_len = curr_list.contents.len() as i32;
+impl JoshutoCommand for CursorMoveInc {}
- let mut new_index = new_index;
- if new_index <= 0 {
- new_index = 0;
- if curr_index <= 0 {
- return;
- }
- } else if new_index >= dir_len {
- new_index = dir_len - 1;
- if curr_index == dir_len - 1 {
- return;
- }
- }
+impl std::fmt::Display for CursorMoveInc {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+ write!(f, "{} {}", Self::command(), self.movement)
+ }
+}
- curr_list.index = new_index;
+impl JoshutoRunnable for CursorMoveInc {
+ fn execute(&self, context: &mut JoshutoContext, view: &JoshutoView) {
+ let mut movement: Option<usize> = None;
+ {
+ let curr_tab = context.curr_tab_mut();
+ if let Some(curr_list) = curr_tab.curr_list.as_ref() {
+ movement = curr_list.index.map(|x| x + self.movement);
}
- curr_tab.refresh_curr(&context.views.mid_win, context.config_t.scroll_offset);
- curr_tab.refresh_file_status(&context.views.bot_win);
- curr_tab.refresh_path_status(
- &context.views.top_win,
- &context.username,
- &context.hostname,
- context.config_t.tilde_in_titlebar,
- );
- preview::preview_file(curr_tab, &context.views, &context.config_t);
}
- ncurses::doupdate();
+ if let Some(s) = movement {
+ CursorMove::cursor_move(s, context, view);
+ }
+ }
+}
+
+#[derive(Clone, Debug)]
+pub struct CursorMoveDec {
+ movement: usize,
+}
+
+impl CursorMoveDec {
+ pub fn new(movement: usize) -> Self {
+ CursorMoveDec { movement }
+ }
+ pub const fn command() -> &'static str {
+ "cursor_move_increment"
}
}
-impl JoshutoCommand for CursorMove {}
+impl JoshutoCommand for CursorMoveDec {}
-impl std::fmt::Display for CursorMove {
+impl std::fmt::Display for CursorMoveDec {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{} {}", Self::command(), self.movement)
}
}
-impl JoshutoRunnable for CursorMove {
- fn execute(&self, context: &mut JoshutoContext) {
- let mut movement: Option<i32> = None;
-
+impl JoshutoRunnable for CursorMoveDec {
+ fn execute(&self, context: &mut JoshutoContext, view: &JoshutoView) {
+ let mut movement: Option<usize> = None;
{
- let curr_tab = &mut context.tabs[context.curr_tab_index];
+ let curr_tab = context.curr_tab_mut();
if let Some(curr_list) = curr_tab.curr_list.as_ref() {
- let curr_index = curr_list.index;
- movement = Some(curr_index + self.movement);
+ movement = curr_list.index.map(|x| {
+ if x > self.movement {
+ x - self.movement
+ } else {
+ 0
+ }
+ });
}
}
if let Some(s) = movement {
- CursorMove::cursor_move(s, context);
+ CursorMove::cursor_move(s, context, view);
}
}
}
@@ -98,23 +139,21 @@ impl std::fmt::Display for CursorMovePageUp {
}
impl JoshutoRunnable for CursorMovePageUp {
- fn execute(&self, context: &mut JoshutoContext) {
- let mut movement: Option<i32> = None;
-
- {
- let curr_tab = &mut context.tabs[context.curr_tab_index];
+ fn execute(&self, context: &mut JoshutoContext, view: &JoshutoView) {
+ let movement: Option<usize> = {
+ let curr_tab = context.curr_tab_mut();
if let Some(curr_list) = curr_tab.curr_list.as_ref() {
- let curr_index = curr_list.index;
- if curr_index <= 0 {
- return;
- }
-
- let half_page = context.views.mid_win.cols / 2;
- movement = Some(curr_index - half_page);
+ let half_page = view.mid_win.cols as usize / 2;
+ curr_list
+ .index
+ .map(|x| if x > half_page { x - half_page } else { 0 })
+ } else {
+ None
}
- }
+ };
+
if let Some(s) = movement {
- CursorMove::cursor_move(s, context);
+ CursorMove::cursor_move(s, context, view);
}
}
}
@@ -140,24 +179,26 @@ impl std::fmt::Display for CursorMovePageDown {
}
impl JoshutoRunnable for CursorMovePageDown {
- fn execute(&self, context: &mut JoshutoContext) {
- let mut movement: Option<i32> = None;
-
- {
+ fn execute(&self, context: &mut JoshutoContext, view: &JoshutoView) {
+ let movement: Option<usize> = {
let curr_tab = &mut context.tabs[context.curr_tab_index];
if let Some(curr_list) = curr_tab.curr_list.as_ref() {
- let curr_index = curr_list.index;
let dir_len = curr_list.contents.len();
- if curr_index >= dir_len as i32 - 1 {
- return;
- }
-
- let half_page = context.views.mid_win.cols / 2;
- movement = Some(curr_index + half_page);
+ let half_page = view.mid_win.cols as usize / 2;
+ curr_list.index.map(|x| {
+ if x + half_page > dir_len - 1 {
+ dir_len - 1
+ } else {
+ x + half_page
+ }
+ })
+ } else {
+ None
}
- }
+ };
+
if let Some(s) = movement {
- CursorMove::cursor_move(s, context);
+ CursorMove::cursor_move(s, context, view);
}
}
}
@@ -183,21 +224,22 @@ impl std::fmt::Display for CursorMoveHome {
}
impl JoshutoRunnable for CursorMoveHome {
- fn execute(&self, context: &mut JoshutoContext) {
- let mut movement: Option<i32> = None;
-
- {
- let curr_tab = &mut context.tabs[context.curr_tab_index];
+ fn execute(&self, context: &mut JoshutoContext, view: &JoshutoView) {
+ let movement: Option<usize> = {
+ let curr_tab = context.curr_tab_mut();
if let Some(curr_list) = curr_tab.curr_list.as_ref() {
- let curr_index = curr_list.index;
- if curr_index <= 0 {
- return;
+ if curr_list.contents.len() == 0 {
+ None
+ } else {
+ Some(0)
}
- movement = Some(0);
+ } else {
+ None
}
- }
+ };
+
if let Some(s) = movement {
- CursorMove::cursor_move(s, context);
+ CursorMove::cursor_move(s, context, view);
}
}
}
@@ -223,23 +265,19 @@ impl std::fmt::Display for CursorMoveEnd {
}
impl JoshutoRunnable for CursorMoveEnd {
- fn execute(&self, context: &mut JoshutoContext) {
- let mut movement: Option<i32> = None;
-
- {
- let curr_tab = &mut context.tabs[context.curr_tab_index];
+ fn execute(&self, context: &mut JoshutoContext, view: &JoshutoView) {
+ let movement: Option<usize> = {
+ let curr_tab = context.curr_tab_mut();
if let Some(curr_list) = curr_tab.curr_list.as_ref() {
- let curr_index = curr_list.index;
let dir_len = curr_list.contents.len();
- if curr_index >= dir_len as i32 - 1 {
- return;
- }
- movement = Some(dir_len as i32 - 1);
+ Some(dir_len - 1)
+ } else {
+ None
}
- }
+ };
if let Some(s) = movement {
- CursorMove::cursor_move(s, context);
+ CursorMove::cursor_move(s, context, view);
}
}
}