Add support for getting Modes by name
Should support app implementations for multiple binaries
This commit is contained in:
parent
81aa7a8984
commit
828a2736be
7 changed files with 39 additions and 17 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -1,6 +1,6 @@
|
||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 4
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "addr2line"
|
name = "addr2line"
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ use serde::{Deserialize, Serialize};
|
||||||
use strum::Display;
|
use strum::Display;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
app::Mode,
|
|
||||||
components::popup::Type,
|
components::popup::Type,
|
||||||
system::{
|
system::{
|
||||||
disk::{Disk, PartitionTableType},
|
disk::{Disk, PartitionTableType},
|
||||||
|
|
@ -40,7 +39,7 @@ pub enum Action {
|
||||||
DisplayPopup(Type, String),
|
DisplayPopup(Type, String),
|
||||||
NextScreen,
|
NextScreen,
|
||||||
PrevScreen,
|
PrevScreen,
|
||||||
SetMode(Mode),
|
SetMode(String),
|
||||||
// TUI
|
// TUI
|
||||||
ClearScreen,
|
ClearScreen,
|
||||||
Error(String),
|
Error(String),
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
use std::{
|
use std::{
|
||||||
env,
|
env,
|
||||||
iter::zip,
|
iter::zip,
|
||||||
|
str::FromStr,
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -27,6 +28,7 @@ use ratatui::{
|
||||||
prelude::Rect,
|
prelude::Rect,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use strum::{Display, EnumString};
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tracing::{debug, info};
|
use tracing::{debug, info};
|
||||||
|
|
||||||
|
|
@ -71,7 +73,9 @@ pub struct App {
|
||||||
tasks: Tasks,
|
tasks: Tasks,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
#[derive(
|
||||||
|
Default, Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, EnumString, Display,
|
||||||
|
)]
|
||||||
pub enum Mode {
|
pub enum Mode {
|
||||||
#[default]
|
#[default]
|
||||||
ScanDisks,
|
ScanDisks,
|
||||||
|
|
@ -87,6 +91,13 @@ pub enum Mode {
|
||||||
Failed,
|
Failed,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mode {
|
||||||
|
pub fn get_mode(mode_str: &str) -> Self {
|
||||||
|
let error_msg = format!("Failed to get app Mode: '{}'", mode_str);
|
||||||
|
Self::from_str(mode_str).expect(&error_msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
pub fn new(tick_rate: f64, frame_rate: f64) -> Result<Self> {
|
pub fn new(tick_rate: f64, frame_rate: f64) -> Result<Self> {
|
||||||
let (action_tx, action_rx) = mpsc::unbounded_channel();
|
let (action_tx, action_rx) = mpsc::unbounded_channel();
|
||||||
|
|
@ -373,10 +384,12 @@ impl App {
|
||||||
Action::Error(ref msg) => {
|
Action::Error(ref msg) => {
|
||||||
self.action_tx
|
self.action_tx
|
||||||
.send(Action::DisplayPopup(popup::Type::Error, msg.clone()))?;
|
.send(Action::DisplayPopup(popup::Type::Error, msg.clone()))?;
|
||||||
self.action_tx.send(Action::SetMode(Mode::Failed))?;
|
self.action_tx
|
||||||
|
.send(Action::SetMode(String::from("Failed")))?;
|
||||||
}
|
}
|
||||||
Action::InstallDriver => {
|
Action::InstallDriver => {
|
||||||
self.action_tx.send(Action::SetMode(Mode::InstallDrivers))?;
|
self.action_tx
|
||||||
|
.send(Action::SetMode(String::from("InstallDrivers")))?;
|
||||||
}
|
}
|
||||||
Action::SelectDriver(ref driver) => {
|
Action::SelectDriver(ref driver) => {
|
||||||
self.driver = Some(driver.clone());
|
self.driver = Some(driver.clone());
|
||||||
|
|
@ -394,15 +407,17 @@ impl App {
|
||||||
(Mode::SelectTableType, Mode::SelectTableType) => Mode::SelectDisks,
|
(Mode::SelectTableType, Mode::SelectTableType) => Mode::SelectDisks,
|
||||||
(_, _) => self.prev_mode,
|
(_, _) => self.prev_mode,
|
||||||
};
|
};
|
||||||
self.action_tx.send(Action::SetMode(new_mode))?;
|
self.action_tx.send(Action::SetMode(new_mode.to_string()))?;
|
||||||
}
|
}
|
||||||
Action::NextScreen => {
|
Action::NextScreen => {
|
||||||
if let Some(mode) = self.next_mode() {
|
if let Some(mode) = self.next_mode() {
|
||||||
self.action_tx.send(Action::DismissPopup)?;
|
self.action_tx.send(Action::DismissPopup)?;
|
||||||
self.action_tx.send(Action::SetMode(mode))?;
|
self.action_tx.send(Action::SetMode(mode.to_string()))?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Action::ScanDisks => self.action_tx.send(Action::SetMode(Mode::ScanDisks))?,
|
Action::ScanDisks => self
|
||||||
|
.action_tx
|
||||||
|
.send(Action::SetMode(String::from("ScanDisks")))?,
|
||||||
Action::Select(one, two) => {
|
Action::Select(one, two) => {
|
||||||
match self.cur_mode {
|
match self.cur_mode {
|
||||||
Mode::SelectDisks => {
|
Mode::SelectDisks => {
|
||||||
|
|
@ -418,7 +433,9 @@ impl App {
|
||||||
self.selections[0] = one;
|
self.selections[0] = one;
|
||||||
self.selections[1] = two;
|
self.selections[1] = two;
|
||||||
}
|
}
|
||||||
Action::SetMode(new_mode) => self.set_mode(new_mode)?,
|
Action::SetMode(ref new_mode_string) => {
|
||||||
|
self.set_mode(Mode::get_mode(&new_mode_string))?
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
for component in &mut self.components {
|
for component in &mut self.components {
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ use ratatui::{
|
||||||
prelude::*,
|
prelude::*,
|
||||||
widgets::{Block, Borders, Paragraph},
|
widgets::{Block, Borders, Paragraph},
|
||||||
};
|
};
|
||||||
|
use std::str::FromStr;
|
||||||
use tokio::sync::mpsc::UnboundedSender;
|
use tokio::sync::mpsc::UnboundedSender;
|
||||||
|
|
||||||
use super::Component;
|
use super::Component;
|
||||||
|
|
@ -52,6 +53,7 @@ impl Component for Footer {
|
||||||
|
|
||||||
fn update(&mut self, action: Action) -> Result<Option<Action>> {
|
fn update(&mut self, action: Action) -> Result<Option<Action>> {
|
||||||
if let Action::SetMode(new_mode) = action {
|
if let Action::SetMode(new_mode) = action {
|
||||||
|
let new_mode = Mode::from_str(&new_mode)?;
|
||||||
self.text = match new_mode {
|
self.text = match new_mode {
|
||||||
Mode::ScanDisks | Mode::PreClone | Mode::Clone | Mode::PostClone => {
|
Mode::ScanDisks | Mode::PreClone | Mode::Clone | Mode::PostClone => {
|
||||||
String::from("(q) to quit")
|
String::from("(q) to quit")
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ use ratatui::{
|
||||||
prelude::*,
|
prelude::*,
|
||||||
widgets::{Block, Borders, HighlightSpacing, List, ListItem, Padding, Paragraph},
|
widgets::{Block, Borders, HighlightSpacing, List, ListItem, Padding, Paragraph},
|
||||||
};
|
};
|
||||||
|
use std::str::FromStr;
|
||||||
use tokio::sync::mpsc::UnboundedSender;
|
use tokio::sync::mpsc::UnboundedSender;
|
||||||
use tracing::info;
|
use tracing::info;
|
||||||
|
|
||||||
|
|
@ -173,8 +174,8 @@ impl Component for Left {
|
||||||
}
|
}
|
||||||
Action::SetMode(new_mode) => {
|
Action::SetMode(new_mode) => {
|
||||||
let prev_mode = self.mode;
|
let prev_mode = self.mode;
|
||||||
self.mode = new_mode;
|
self.mode = Mode::from_str(&new_mode)?;
|
||||||
match (prev_mode, new_mode) {
|
match (prev_mode, Mode::from_str(&new_mode)?) {
|
||||||
(_, Mode::ScanDisks) => {
|
(_, Mode::ScanDisks) => {
|
||||||
self.list_disks.clear_items();
|
self.list_disks.clear_items();
|
||||||
self.title_text = String::new();
|
self.title_text = String::new();
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ use ratatui::{
|
||||||
widgets::{Block, Borders, Clear, Paragraph, Wrap},
|
widgets::{Block, Borders, Clear, Paragraph, Wrap},
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::str::FromStr;
|
||||||
use strum::Display;
|
use strum::Display;
|
||||||
use tokio::sync::mpsc::UnboundedSender;
|
use tokio::sync::mpsc::UnboundedSender;
|
||||||
|
|
||||||
|
|
@ -69,11 +70,12 @@ impl Component for Popup {
|
||||||
self.popup_type = new_type;
|
self.popup_type = new_type;
|
||||||
self.popup_text = new_text;
|
self.popup_text = new_text;
|
||||||
}
|
}
|
||||||
Action::SetMode(mode) => {
|
Action::SetMode(mode_string) => {
|
||||||
if mode == Mode::ScanDisks {
|
let new_mode = Mode::get_mode(&mode_string);
|
||||||
|
if new_mode == Mode::ScanDisks {
|
||||||
self.popup_text = String::from("Scanning Disks...");
|
self.popup_text = String::from("Scanning Disks...");
|
||||||
}
|
}
|
||||||
self.mode = mode;
|
self.mode = new_mode;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ use ratatui::{
|
||||||
prelude::*,
|
prelude::*,
|
||||||
widgets::{Block, Borders, Padding, Paragraph, Wrap},
|
widgets::{Block, Borders, Padding, Paragraph, Wrap},
|
||||||
};
|
};
|
||||||
|
use std::str::FromStr;
|
||||||
use tokio::sync::mpsc::UnboundedSender;
|
use tokio::sync::mpsc::UnboundedSender;
|
||||||
use tracing::info;
|
use tracing::info;
|
||||||
|
|
||||||
|
|
@ -94,9 +95,9 @@ impl Component for Right {
|
||||||
self.selections[1] = two;
|
self.selections[1] = two;
|
||||||
}
|
}
|
||||||
Action::SelectTableType(table_type) => self.table_type = Some(table_type),
|
Action::SelectTableType(table_type) => self.table_type = Some(table_type),
|
||||||
Action::SetMode(new_mode) => {
|
Action::SetMode(new_mode_string) => {
|
||||||
self.prev_mode = self.cur_mode;
|
self.prev_mode = self.cur_mode;
|
||||||
self.cur_mode = new_mode;
|
self.cur_mode = Mode::from_str(&new_mode_string)?;
|
||||||
match self.cur_mode {
|
match self.cur_mode {
|
||||||
Mode::SelectDisks => {
|
Mode::SelectDisks => {
|
||||||
self.selections[0] = None;
|
self.selections[0] = None;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue