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.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "addr2line"
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@ use serde::{Deserialize, Serialize};
|
|||
use strum::Display;
|
||||
|
||||
use crate::{
|
||||
app::Mode,
|
||||
components::popup::Type,
|
||||
system::{
|
||||
disk::{Disk, PartitionTableType},
|
||||
|
|
@ -40,7 +39,7 @@ pub enum Action {
|
|||
DisplayPopup(Type, String),
|
||||
NextScreen,
|
||||
PrevScreen,
|
||||
SetMode(Mode),
|
||||
SetMode(String),
|
||||
// TUI
|
||||
ClearScreen,
|
||||
Error(String),
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
use std::{
|
||||
env,
|
||||
iter::zip,
|
||||
str::FromStr,
|
||||
sync::{Arc, Mutex},
|
||||
};
|
||||
|
||||
|
|
@ -27,6 +28,7 @@ use ratatui::{
|
|||
prelude::Rect,
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use strum::{Display, EnumString};
|
||||
use tokio::sync::mpsc;
|
||||
use tracing::{debug, info};
|
||||
|
||||
|
|
@ -71,7 +73,9 @@ pub struct App {
|
|||
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 {
|
||||
#[default]
|
||||
ScanDisks,
|
||||
|
|
@ -87,6 +91,13 @@ pub enum Mode {
|
|||
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 {
|
||||
pub fn new(tick_rate: f64, frame_rate: f64) -> Result<Self> {
|
||||
let (action_tx, action_rx) = mpsc::unbounded_channel();
|
||||
|
|
@ -373,10 +384,12 @@ impl App {
|
|||
Action::Error(ref msg) => {
|
||||
self.action_tx
|
||||
.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 => {
|
||||
self.action_tx.send(Action::SetMode(Mode::InstallDrivers))?;
|
||||
self.action_tx
|
||||
.send(Action::SetMode(String::from("InstallDrivers")))?;
|
||||
}
|
||||
Action::SelectDriver(ref driver) => {
|
||||
self.driver = Some(driver.clone());
|
||||
|
|
@ -394,15 +407,17 @@ impl App {
|
|||
(Mode::SelectTableType, Mode::SelectTableType) => Mode::SelectDisks,
|
||||
(_, _) => self.prev_mode,
|
||||
};
|
||||
self.action_tx.send(Action::SetMode(new_mode))?;
|
||||
self.action_tx.send(Action::SetMode(new_mode.to_string()))?;
|
||||
}
|
||||
Action::NextScreen => {
|
||||
if let Some(mode) = self.next_mode() {
|
||||
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) => {
|
||||
match self.cur_mode {
|
||||
Mode::SelectDisks => {
|
||||
|
|
@ -418,7 +433,9 @@ impl App {
|
|||
self.selections[0] = one;
|
||||
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 {
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ use ratatui::{
|
|||
prelude::*,
|
||||
widgets::{Block, Borders, Paragraph},
|
||||
};
|
||||
use std::str::FromStr;
|
||||
use tokio::sync::mpsc::UnboundedSender;
|
||||
|
||||
use super::Component;
|
||||
|
|
@ -52,6 +53,7 @@ impl Component for Footer {
|
|||
|
||||
fn update(&mut self, action: Action) -> Result<Option<Action>> {
|
||||
if let Action::SetMode(new_mode) = action {
|
||||
let new_mode = Mode::from_str(&new_mode)?;
|
||||
self.text = match new_mode {
|
||||
Mode::ScanDisks | Mode::PreClone | Mode::Clone | Mode::PostClone => {
|
||||
String::from("(q) to quit")
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ use ratatui::{
|
|||
prelude::*,
|
||||
widgets::{Block, Borders, HighlightSpacing, List, ListItem, Padding, Paragraph},
|
||||
};
|
||||
use std::str::FromStr;
|
||||
use tokio::sync::mpsc::UnboundedSender;
|
||||
use tracing::info;
|
||||
|
||||
|
|
@ -173,8 +174,8 @@ impl Component for Left {
|
|||
}
|
||||
Action::SetMode(new_mode) => {
|
||||
let prev_mode = self.mode;
|
||||
self.mode = new_mode;
|
||||
match (prev_mode, new_mode) {
|
||||
self.mode = Mode::from_str(&new_mode)?;
|
||||
match (prev_mode, Mode::from_str(&new_mode)?) {
|
||||
(_, Mode::ScanDisks) => {
|
||||
self.list_disks.clear_items();
|
||||
self.title_text = String::new();
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ use ratatui::{
|
|||
widgets::{Block, Borders, Clear, Paragraph, Wrap},
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::str::FromStr;
|
||||
use strum::Display;
|
||||
use tokio::sync::mpsc::UnboundedSender;
|
||||
|
||||
|
|
@ -69,11 +70,12 @@ impl Component for Popup {
|
|||
self.popup_type = new_type;
|
||||
self.popup_text = new_text;
|
||||
}
|
||||
Action::SetMode(mode) => {
|
||||
if mode == Mode::ScanDisks {
|
||||
Action::SetMode(mode_string) => {
|
||||
let new_mode = Mode::get_mode(&mode_string);
|
||||
if new_mode == Mode::ScanDisks {
|
||||
self.popup_text = String::from("Scanning Disks...");
|
||||
}
|
||||
self.mode = mode;
|
||||
self.mode = new_mode;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ use ratatui::{
|
|||
prelude::*,
|
||||
widgets::{Block, Borders, Padding, Paragraph, Wrap},
|
||||
};
|
||||
use std::str::FromStr;
|
||||
use tokio::sync::mpsc::UnboundedSender;
|
||||
use tracing::info;
|
||||
|
||||
|
|
@ -94,9 +95,9 @@ impl Component for Right {
|
|||
self.selections[1] = two;
|
||||
}
|
||||
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.cur_mode = new_mode;
|
||||
self.cur_mode = Mode::from_str(&new_mode_string)?;
|
||||
match self.cur_mode {
|
||||
Mode::SelectDisks => {
|
||||
self.selections[0] = None;
|
||||
|
|
|
|||
Loading…
Reference in a new issue