Refactoring. Save on quit.
This commit is contained in:
parent
001652a63a
commit
d3a9679910
253
src/app.rs
253
src/app.rs
@ -13,35 +13,6 @@ pub struct Column {
|
|||||||
pub tasks: Vec<Task>,
|
pub tasks: Vec<Task>,
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
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)]
|
// #[derive(Deserialize, Serialize, Debug, Clone, Copy)]
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
pub struct Task {
|
pub struct Task {
|
||||||
@ -74,98 +45,6 @@ pub enum KanbanError {
|
|||||||
Io(#[from] std::io::Error),
|
Io(#[from] std::io::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Project {
|
|
||||||
pub fn new(name: &str) -> Self {
|
|
||||||
Project {
|
|
||||||
name: name.to_owned(),
|
|
||||||
columns: vec![],
|
|
||||||
selected_column_idx: 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn load_from_json(json: &str) -> Result<Self, KanbanError> {
|
|
||||||
serde_json::from_str(json).map_err(|_| KanbanError::BadJson)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn load() -> Result<Self, KanbanError> {
|
|
||||||
let json = std::fs::read_to_string("kanban-tui.json")?;
|
|
||||||
Self::load_from_json(&json)
|
|
||||||
}
|
|
||||||
|
|
||||||
// pub fn add_task(&mut self, status: Column, task: Task) {
|
|
||||||
// self.tasks_per_column.entry(status).or_default().push(task);
|
|
||||||
// }
|
|
||||||
|
|
||||||
pub fn save(&self) {
|
|
||||||
let _json = serde_json::to_string_pretty(&self).unwrap();
|
|
||||||
// std::fs::write("kanban-tui.json", json).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_selected_column(&self) -> &Column {
|
|
||||||
&self.columns[self.selected_column_idx]
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_selected_column_mut(&mut self) -> &mut Column {
|
|
||||||
&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 {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Project {
|
Project {
|
||||||
@ -194,3 +73,135 @@ impl AppState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn select_last_task(&mut self) {
|
||||||
|
self.selected_task_idx = self.tasks.len() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Project {
|
||||||
|
pub fn new(name: &str) -> Self {
|
||||||
|
Project {
|
||||||
|
name: name.to_owned(),
|
||||||
|
columns: vec![],
|
||||||
|
selected_column_idx: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn load_from_json(json: &str) -> Result<Self, KanbanError> {
|
||||||
|
serde_json::from_str(json).map_err(|_| KanbanError::BadJson)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn load() -> Result<Self, KanbanError> {
|
||||||
|
let json = std::fs::read_to_string("kanban-tui.json")?;
|
||||||
|
Self::load_from_json(&json)
|
||||||
|
}
|
||||||
|
|
||||||
|
// pub fn add_task(&mut self, status: Column, task: Task) {
|
||||||
|
// self.tasks_per_column.entry(status).or_default().push(task);
|
||||||
|
// }
|
||||||
|
|
||||||
|
pub fn save(&self) {
|
||||||
|
let json = serde_json::to_string_pretty(&self).unwrap();
|
||||||
|
std::fs::write("kanban-tui.json", json).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_selected_column(&self) -> &Column {
|
||||||
|
&self.columns[self.selected_column_idx]
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_selected_column_mut(&mut self) -> &mut Column {
|
||||||
|
&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]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn move_task_to_column(&mut self, move_next: bool) {
|
||||||
|
let col_idx = self.selected_column_idx;
|
||||||
|
let cols_len = self.columns.len();
|
||||||
|
let column = self.get_selected_column_mut();
|
||||||
|
let cond = if move_next {
|
||||||
|
col_idx < cols_len - 1
|
||||||
|
} else {
|
||||||
|
col_idx > 0
|
||||||
|
};
|
||||||
|
if cond && column.tasks.len() > 0 {
|
||||||
|
let t = column.tasks.remove(column.selected_task_idx);
|
||||||
|
column.select_previous_task();
|
||||||
|
if move_next {
|
||||||
|
self.select_next_column();
|
||||||
|
} else {
|
||||||
|
self.select_previous_column();
|
||||||
|
}
|
||||||
|
let col = self.get_selected_column_mut();
|
||||||
|
col.tasks.push(t);
|
||||||
|
col.select_last_task();
|
||||||
|
self.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn move_task_previous_column(&mut self) {
|
||||||
|
self.move_task_to_column(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn move_task_next_column(&mut self) {
|
||||||
|
self.move_task_to_column(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -20,6 +20,8 @@ fn main() -> anyhow::Result<()> {
|
|||||||
kanban_tui::handle_input(&mut state)?;
|
kanban_tui::handle_input(&mut state)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state.project.save();
|
||||||
|
|
||||||
// restore terminal
|
// restore terminal
|
||||||
disable_raw_mode()?;
|
disable_raw_mode()?;
|
||||||
crossterm::execute!(
|
crossterm::execute!(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user