From 001652a63aaff749cc5d5d878d11ec6c85556ae4 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Sat, 10 Dec 2022 23:04:55 +0400 Subject: [PATCH] Moving out of state and into the respective impl. Fix bugs --- src/app.rs | 136 ++++++++++++++++++++++++++++----------------------- src/input.rs | 18 ++++--- src/main.rs | 2 +- 3 files changed, 85 insertions(+), 71 deletions(-) diff --git a/src/app.rs b/src/app.rs index eedb647..8409264 100644 --- a/src/app.rs +++ b/src/app.rs @@ -14,6 +14,14 @@ pub struct Column { } impl Column { + pub fn new(name: &str) -> Self { + Column { + name: name.to_owned(), + tasks: vec![], + selected_task_idx: 0, + } + } + pub fn get_selected_task(&self) -> Option<&Task> { self.tasks.get(self.selected_task_idx) } @@ -21,6 +29,17 @@ impl Column { pub fn get_selected_task_mut(&mut self) -> Option<&mut Task> { self.tasks.get_mut(self.selected_task_idx) } + + pub fn select_previous_task(&mut self) { + let task_idx = &mut self.selected_task_idx; + *task_idx = task_idx.saturating_sub(1) + } + + pub fn select_next_task(&mut self) { + let task_idx = &mut self.selected_task_idx; + *task_idx = min(*task_idx + 1, self.tasks.len() - 1) + } + } // #[derive(Deserialize, Serialize, Debug, Clone, Copy)] @@ -90,6 +109,61 @@ impl Project { &mut self.columns[self.selected_column_idx] } + pub fn select_previous_column(&mut self) -> &Column { + self.selected_column_idx = self.selected_column_idx.saturating_sub(1); + &self.columns[self.selected_column_idx] + } + + pub fn select_next_column(&mut self) -> &Column { + self.selected_column_idx = min( + self.selected_column_idx + 1, + self.columns.len() - 1, + ); + &self.columns[self.selected_column_idx] + } + + pub fn move_task_previous_column(&mut self) { + let col_idx = self.selected_column_idx; + let column = self.get_selected_column_mut(); + if col_idx > 0 && column.tasks.len() > 0 { + let t = column.tasks.remove(column.selected_task_idx); + column.select_previous_task(); + self.select_previous_column(); + self.get_selected_column_mut().tasks.push(t); + self.save(); + } + } + + pub fn move_task_next_column(&mut self) { + let col_idx = self.selected_column_idx; + let cols_len = self.columns.len(); + let column = self.get_selected_column_mut(); + if col_idx < cols_len - 1 && column.tasks.len() > 0 { + let t = column.tasks.remove(column.selected_task_idx); + column.select_previous_task(); + self.select_next_column(); + self.get_selected_column_mut().tasks.push(t); + self.save(); + } + } + + pub fn move_task_up(&mut self) { + let column = self.get_selected_column_mut(); + if column.selected_task_idx > 0 { + column.tasks.swap(column.selected_task_idx, column.selected_task_idx - 1); + column.selected_task_idx = column.selected_task_idx - 1; + self.save(); + } + } + + pub fn move_task_down(&mut self) { + let column = self.get_selected_column_mut(); + if column.selected_task_idx < column.tasks.len() - 1 { + column.tasks.swap(column.selected_task_idx, column.selected_task_idx + 1); + column.selected_task_idx = column.selected_task_idx + 1; + self.save(); + } + } } impl Default for Project { @@ -119,66 +193,4 @@ impl AppState { } } - pub fn select_previous_task(&mut self) { - let task_idx = &mut self.project.get_selected_column_mut().selected_task_idx; - *task_idx = task_idx.saturating_sub(1) - } - - pub fn select_next_task(&mut self) { - let column = &mut self.project.get_selected_column_mut(); - let task_idx = &mut column.selected_task_idx; - *task_idx = min(*task_idx, column.tasks.len() - 1) - } - - pub fn select_previous_column(&mut self) -> &Column { - self.project.selected_column_idx = self.project.selected_column_idx.saturating_sub(1); - &self.project.columns[self.project.selected_column_idx] - } - - pub fn select_next_column(&mut self) -> &Column { - self.project.selected_column_idx = min( - self.project.selected_column_idx + 1, - self.project.columns.len() - 1, - ); - &self.project.columns[self.project.selected_column_idx] - } - - pub fn move_task_previous_column(&mut self) { - let col_idx = self.project.selected_column_idx; - let column = self.project.get_selected_column_mut(); - if col_idx > 0 && column.tasks.len() > 0 { - let t = column.tasks.remove(column.selected_task_idx); - column.tasks.push(t); - self.project.save(); - } - } - - pub fn move_task_next_column(&mut self) { - let col_idx = self.project.selected_column_idx; - let cols_len = self.project.columns.len(); - let column = self.project.get_selected_column_mut(); - if col_idx < cols_len - 1 && column.tasks.len() > 0 { - let t = column.tasks.remove(column.selected_task_idx); - column.tasks.push(t); - self.project.save(); - } - } - - pub fn move_task_up(&mut self) { - let column = self.project.get_selected_column_mut(); - if column.selected_task_idx > 0 { - column.tasks.swap(column.selected_task_idx, column.selected_task_idx - 1); - column.selected_task_idx = column.selected_task_idx - 1; - self.project.save(); - } - } - - pub fn move_task_down(&mut self) { - let column = self.project.get_selected_column_mut(); - if column.selected_task_idx < column.tasks.len() - 1 { - column.tasks.swap(column.selected_task_idx, column.selected_task_idx + 1); - column.selected_task_idx = column.selected_task_idx + 1; - self.project.save(); - } - } } diff --git a/src/input.rs b/src/input.rs index 16ae6e0..1bccc52 100644 --- a/src/input.rs +++ b/src/input.rs @@ -3,25 +3,27 @@ use crossterm::event::{Event, KeyCode}; use crate::app::{AppState}; pub fn handle_input(state: &mut AppState) -> Result<(), std::io::Error> { + let project = &mut state.project; + let column = project.get_selected_column_mut(); if let Event::Key(key) = event::read()? { match key.code { KeyCode::Char('q') => state.quit = true, KeyCode::Char('h') | - KeyCode::Left => { state.select_previous_column(); }, + KeyCode::Left => { project.select_previous_column(); }, KeyCode::Char('j') | - KeyCode::Down => state.select_next_task(), + KeyCode::Down => column.select_next_task(), KeyCode::Char('k') | - KeyCode::Up => state.select_previous_task(), + KeyCode::Up => column.select_previous_task(), KeyCode::Char('l') | - KeyCode::Right => { state.select_next_column(); }, + KeyCode::Right => { project.select_next_column(); }, KeyCode::Char('<') | - KeyCode::Char('H') => state.move_task_previous_column(), + KeyCode::Char('H') => project.move_task_previous_column(), KeyCode::Char('>') | - KeyCode::Char('L') => state.move_task_next_column(), + KeyCode::Char('L') => project.move_task_next_column(), KeyCode::Char('=') | - KeyCode::Char('J') => state.move_task_down(), + KeyCode::Char('J') => project.move_task_down(), KeyCode::Char('-') | - KeyCode::Char('K') => state.move_task_up(), + KeyCode::Char('K') => project.move_task_up(), KeyCode::Char('p') => { match state.popup_text { None => state.popup_text = Some("".to_string()), diff --git a/src/main.rs b/src/main.rs index 6b3d25d..4e416ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ #![allow(dead_code)] -use kanban_tui::{AppState, Project}; +use kanban_tui::*; use std::{io}; use crossterm::{event::*, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}};