Fix bug in moving and deleting a task. Remove some unwraps
This commit is contained in:
		
							parent
							
								
									dba1e8a640
								
							
						
					
					
						commit
						f5b39592a4
					
				
							
								
								
									
										47
									
								
								src/app.rs
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								src/app.rs
									
									
									
									
									
								
							@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					use anyhow::Error;
 | 
				
			||||||
// use indexmap::IndexMap;
 | 
					// use indexmap::IndexMap;
 | 
				
			||||||
// use int_enum::IntEnum;
 | 
					// use int_enum::IntEnum;
 | 
				
			||||||
use rusqlite::Connection;
 | 
					use rusqlite::Connection;
 | 
				
			||||||
@ -66,17 +67,17 @@ impl<'a> State<'a> {
 | 
				
			|||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// Panics if we can't get all the columns from the database
 | 
					    /// Panics if we can't get all the columns from the database
 | 
				
			||||||
    #[must_use]
 | 
					    #[must_use]
 | 
				
			||||||
    pub fn new(conn: Connection) -> Self {
 | 
					    pub fn new(conn: Connection) -> Result<Self, Error> {
 | 
				
			||||||
        let db_conn = db::DBConn::new(conn);
 | 
					        let db_conn = db::DBConn::new(conn);
 | 
				
			||||||
        let columns = db_conn.get_all_columns().unwrap();
 | 
					        let columns = db_conn.get_all_columns()?;
 | 
				
			||||||
        let selected_column = db_conn.get_selected_column();
 | 
					        let selected_column = db_conn.get_selected_column();
 | 
				
			||||||
        State {
 | 
					        Ok(State {
 | 
				
			||||||
            columns,
 | 
					            columns,
 | 
				
			||||||
            selected_column_idx: selected_column,
 | 
					            selected_column_idx: selected_column,
 | 
				
			||||||
            quit: false,
 | 
					            quit: false,
 | 
				
			||||||
            task_edit_state: None,
 | 
					            task_edit_state: None,
 | 
				
			||||||
            db_conn,
 | 
					            db_conn,
 | 
				
			||||||
        }
 | 
					        })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[must_use]
 | 
					    #[must_use]
 | 
				
			||||||
@ -181,11 +182,8 @@ impl<'a> State<'a> {
 | 
				
			|||||||
    pub fn move_task_down(&mut self) {
 | 
					    pub fn move_task_down(&mut self) {
 | 
				
			||||||
        self.move_task(true);
 | 
					        self.move_task(true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Returns the move task down of this [`State`].
 | 
					    /// Returns the move task down of this [`State`].
 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    /// # Panics
 | 
					 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    /// We have conditions to ensure this doesn't panic but we still unwrap()
 | 
					 | 
				
			||||||
    pub fn move_task(&mut self, is_down: bool) {
 | 
					    pub fn move_task(&mut self, is_down: bool) {
 | 
				
			||||||
        let other_task = if is_down {
 | 
					        let other_task = if is_down {
 | 
				
			||||||
            self.get_next_task()
 | 
					            self.get_next_task()
 | 
				
			||||||
@ -245,7 +243,8 @@ impl<'a> State<'a> {
 | 
				
			|||||||
        col.tasks.push(t);
 | 
					        col.tasks.push(t);
 | 
				
			||||||
        self.select_last_task();
 | 
					        self.select_last_task();
 | 
				
			||||||
        if let Some(task) = self.get_selected_task() {
 | 
					        if let Some(task) = self.get_selected_task() {
 | 
				
			||||||
            self.db_conn.move_task_to_column(task, self.get_selected_column());
 | 
					            let col = self.get_selected_column();
 | 
				
			||||||
 | 
					            self.db_conn.move_task_to_column(task, col);
 | 
				
			||||||
            self.db_conn.set_selected_column(self.selected_column_idx);
 | 
					            self.db_conn.set_selected_column(self.selected_column_idx);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -256,9 +255,11 @@ impl<'a> State<'a> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        self.select_last_task();
 | 
					        self.select_last_task();
 | 
				
			||||||
        let selected_task_idx = self.get_selected_column().selected_task_idx;
 | 
					        let selected_task_idx = self.get_selected_column().selected_task_idx;
 | 
				
			||||||
        self.db_conn.set_selected_task_for_column(selected_task_idx, col_id);
 | 
					        self.db_conn
 | 
				
			||||||
 | 
					            .set_selected_task_for_column(selected_task_idx, col_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.get_selected_column_mut().tasks.push(task);
 | 
					        self.get_selected_column_mut().tasks.push(task);
 | 
				
			||||||
 | 
					        self.select_last_task()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn edit_task(&mut self, title: String, description: String) {
 | 
					    pub fn edit_task(&mut self, title: String, description: String) {
 | 
				
			||||||
@ -270,23 +271,23 @@ impl<'a> State<'a> {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Returns the delete task of this [`State`].
 | 
					    /// Delete the currently selected task from the selected column
 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    /// # Panics
 | 
					 | 
				
			||||||
    ///
 | 
					 | 
				
			||||||
    /// We have conditions to ensure this doesn't panic but we still unwrap()
 | 
					 | 
				
			||||||
    pub fn delete_task(&mut self) {
 | 
					    pub fn delete_task(&mut self) {
 | 
				
			||||||
        let column = self.get_selected_column();
 | 
					        if let Some(task) = self.get_selected_task() {
 | 
				
			||||||
        if column.tasks.is_empty() {
 | 
					            let task_id = task.id;
 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        let task_id = self.get_selected_task().unwrap().id;
 | 
					 | 
				
			||||||
            let column = self.get_selected_column_mut();
 | 
					            let column = self.get_selected_column_mut();
 | 
				
			||||||
        let task_idx = column.selected_task_idx;
 | 
					            let mut task_idx = column.selected_task_idx;
 | 
				
			||||||
            let col_id = column.id;
 | 
					            let col_id = column.id;
 | 
				
			||||||
        column.tasks.remove(column.selected_task_idx);
 | 
					
 | 
				
			||||||
        self.select_next_task();
 | 
					            column.tasks.remove(task_idx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if column.selected_task_idx >= column.tasks.len() {
 | 
				
			||||||
 | 
					                self.select_previous_task();
 | 
				
			||||||
 | 
					                task_idx = task_idx.saturating_sub(1);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            self.db_conn.delete_task(task_id);
 | 
					            self.db_conn.delete_task(task_id);
 | 
				
			||||||
            self.db_conn.set_selected_task_for_column(task_idx, col_id);
 | 
					            self.db_conn.set_selected_task_for_column(task_idx, col_id);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -98,10 +98,6 @@ pub fn handle_main(state: &mut State<'_>, key: event::KeyEvent) {
 | 
				
			|||||||
/// # Errors
 | 
					/// # Errors
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// Crossterm `event::read()` might return an error
 | 
					/// Crossterm `event::read()` might return an error
 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// # Panics
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// Shouldn't really panic because there are checks to ensure we can unwrap safely
 | 
					 | 
				
			||||||
pub fn handle(state: &mut State<'_>) -> Result<(), std::io::Error> {
 | 
					pub fn handle(state: &mut State<'_>) -> Result<(), std::io::Error> {
 | 
				
			||||||
    if let Event::Key(key) = event::read()? {
 | 
					    if let Event::Key(key) = event::read()? {
 | 
				
			||||||
        if state.task_edit_state.is_some() {
 | 
					        if state.task_edit_state.is_some() {
 | 
				
			||||||
 | 
				
			|||||||
@ -40,7 +40,7 @@ fn main() -> anyhow::Result<(), Box<dyn Error>> {
 | 
				
			|||||||
        tx.commit()?;
 | 
					        tx.commit()?;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut state = State::new(conn);
 | 
					    let mut state = State::new(conn)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    enable_raw_mode()?;
 | 
					    enable_raw_mode()?;
 | 
				
			||||||
    let mut stdout = io::stdout();
 | 
					    let mut stdout = io::stdout();
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,7 @@ fn draw_tasks<B: Backend>(f: &mut Frame<'_, B>, area: Rect, state: &State<'_>) {
 | 
				
			|||||||
        .direction(Direction::Horizontal)
 | 
					        .direction(Direction::Horizontal)
 | 
				
			||||||
        .constraints(
 | 
					        .constraints(
 | 
				
			||||||
            vec![
 | 
					            vec![
 | 
				
			||||||
                Constraint::Percentage(100 / u16::try_from(state.columns.len()).unwrap());
 | 
					                Constraint::Percentage(100 / u16::try_from(state.columns.len()).unwrap_or(4));
 | 
				
			||||||
                state.columns.len()
 | 
					                state.columns.len()
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
            .as_ref(),
 | 
					            .as_ref(),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user