Moving out of state and into the respective impl. Fix bugs
This commit is contained in:
		
							parent
							
								
									7889c2358c
								
							
						
					
					
						commit
						001652a63a
					
				
							
								
								
									
										136
									
								
								src/app.rs
									
									
									
									
									
								
							
							
						
						
									
										136
									
								
								src/app.rs
									
									
									
									
									
								
							@ -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();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										18
									
								
								src/input.rs
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								src/input.rs
									
									
									
									
									
								
							@ -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()),
 | 
				
			||||||
 | 
				
			|||||||
@ -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}};
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user