Moving out of state and into the respective impl. Fix bugs

This commit is contained in:
Joseph Ferano 2022-12-10 23:04:55 +04:00
parent 7889c2358c
commit 001652a63a
3 changed files with 85 additions and 71 deletions

View File

@ -14,6 +14,14 @@ pub struct Column {
} }
impl 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> { pub fn get_selected_task(&self) -> Option<&Task> {
self.tasks.get(self.selected_task_idx) self.tasks.get(self.selected_task_idx)
} }
@ -21,6 +29,17 @@ impl Column {
pub fn get_selected_task_mut(&mut self) -> Option<&mut Task> { pub fn get_selected_task_mut(&mut self) -> Option<&mut Task> {
self.tasks.get_mut(self.selected_task_idx) 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)] // #[derive(Deserialize, Serialize, Debug, Clone, Copy)]
@ -90,6 +109,61 @@ impl Project {
&mut self.columns[self.selected_column_idx] &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 { 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();
}
}
} }

View File

@ -3,25 +3,27 @@ use crossterm::event::{Event, KeyCode};
use crate::app::{AppState}; use crate::app::{AppState};
pub fn handle_input(state: &mut AppState) -> Result<(), std::io::Error> { 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()? { if let Event::Key(key) = event::read()? {
match key.code { match key.code {
KeyCode::Char('q') => state.quit = true, KeyCode::Char('q') => state.quit = true,
KeyCode::Char('h') | KeyCode::Char('h') |
KeyCode::Left => { state.select_previous_column(); }, KeyCode::Left => { project.select_previous_column(); },
KeyCode::Char('j') | KeyCode::Char('j') |
KeyCode::Down => state.select_next_task(), KeyCode::Down => column.select_next_task(),
KeyCode::Char('k') | KeyCode::Char('k') |
KeyCode::Up => state.select_previous_task(), KeyCode::Up => column.select_previous_task(),
KeyCode::Char('l') | KeyCode::Char('l') |
KeyCode::Right => { state.select_next_column(); }, KeyCode::Right => { project.select_next_column(); },
KeyCode::Char('<') | KeyCode::Char('<') |
KeyCode::Char('H') => state.move_task_previous_column(), KeyCode::Char('H') => project.move_task_previous_column(),
KeyCode::Char('>') | KeyCode::Char('>') |
KeyCode::Char('L') => state.move_task_next_column(), KeyCode::Char('L') => project.move_task_next_column(),
KeyCode::Char('=') | KeyCode::Char('=') |
KeyCode::Char('J') => state.move_task_down(), KeyCode::Char('J') => project.move_task_down(),
KeyCode::Char('-') | KeyCode::Char('-') |
KeyCode::Char('K') => state.move_task_up(), KeyCode::Char('K') => project.move_task_up(),
KeyCode::Char('p') => { KeyCode::Char('p') => {
match state.popup_text { match state.popup_text {
None => state.popup_text = Some("".to_string()), None => state.popup_text = Some("".to_string()),

View File

@ -1,5 +1,5 @@
#![allow(dead_code)] #![allow(dead_code)]
use kanban_tui::{AppState, Project}; use kanban_tui::*;
use std::{io}; use std::{io};
use crossterm::{event::*, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}}; use crossterm::{event::*, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}};