[WIP] 0.3.0 mtp update
This commit is contained in:
parent
7dc98ef29b
commit
e1dd86ec02
42 changed files with 2422 additions and 1429 deletions
|
|
@ -189,9 +189,7 @@ impl Screen for ConfirmDialog {
|
|||
let button_widths: Vec<u16> = self
|
||||
.buttons
|
||||
.iter()
|
||||
.map(|b| {
|
||||
crate::controls::button::button_minimum_width(&b.label)
|
||||
})
|
||||
.map(|b| crate::controls::button::button_minimum_width(&b.label))
|
||||
.collect();
|
||||
|
||||
let total_width: u16 = button_widths.iter().sum();
|
||||
|
|
@ -200,9 +198,7 @@ impl Screen for ConfirmDialog {
|
|||
let start_x = buttons_area.x + available.saturating_sub(total_width + spacing) / 2;
|
||||
|
||||
let mut x = start_x;
|
||||
for (i, (button_config, &width)) in
|
||||
self.buttons.iter().zip(&button_widths).enumerate()
|
||||
{
|
||||
for (i, (button_config, &width)) in self.buttons.iter().zip(&button_widths).enumerate() {
|
||||
let button_area = Rect {
|
||||
x,
|
||||
y: buttons_area.y,
|
||||
|
|
|
|||
|
|
@ -11,12 +11,17 @@ use ratatui::{
|
|||
widgets::Paragraph,
|
||||
};
|
||||
|
||||
fn connection_badge(state: &IpcConnectionState, theme: &ResolvedTheme) -> (&'static str, ratatui::style::Style) {
|
||||
fn connection_badge(
|
||||
state: &IpcConnectionState,
|
||||
theme: &ResolvedTheme,
|
||||
) -> (&'static str, ratatui::style::Style) {
|
||||
match state {
|
||||
IpcConnectionState::Connected => ("OK", theme.status.success),
|
||||
IpcConnectionState::Connecting => ("..", theme.status.warning),
|
||||
IpcConnectionState::Reconnecting { .. } => ("WARN", theme.status.warning),
|
||||
IpcConnectionState::Failed { .. } | IpcConnectionState::Incompatible { .. } => ("FAIL", theme.status.error),
|
||||
IpcConnectionState::Failed { .. } | IpcConnectionState::Incompatible { .. } => {
|
||||
("FAIL", theme.status.error)
|
||||
}
|
||||
IpcConnectionState::Disconnected => ("WARN", theme.status.warning),
|
||||
}
|
||||
}
|
||||
|
|
@ -52,7 +57,8 @@ pub fn render_header(
|
|||
format!(" v{}", daemon.version)
|
||||
};
|
||||
|
||||
let rows = Layout::vertical([Constraint::Percentage(50), Constraint::Percentage(50)]).split(area);
|
||||
let rows =
|
||||
Layout::vertical([Constraint::Percentage(50), Constraint::Percentage(50)]).split(area);
|
||||
let cells = Layout::horizontal([
|
||||
Constraint::Min(28),
|
||||
Constraint::Length(12),
|
||||
|
|
@ -94,10 +100,34 @@ pub fn render_header(
|
|||
hits.register(brand_area, AppAction::OpenMain);
|
||||
|
||||
for (index, (top, _bottom, label, intent, action)) in [
|
||||
(cells[1], cells2[1], "Overview", ButtonIntent::Primary, AppAction::OpenOverview),
|
||||
(cells[2], cells2[2], "Users", ButtonIntent::Neutral, AppAction::OpenUsers),
|
||||
(cells[3], cells2[3], "Settings", ButtonIntent::Neutral, AppAction::OpenSettings),
|
||||
(cells[4], cells2[4], "Quit", ButtonIntent::Destructive, AppAction::Quit),
|
||||
(
|
||||
cells[1],
|
||||
cells2[1],
|
||||
"Overview",
|
||||
ButtonIntent::Primary,
|
||||
AppAction::OpenOverview,
|
||||
),
|
||||
(
|
||||
cells[2],
|
||||
cells2[2],
|
||||
"Users",
|
||||
ButtonIntent::Neutral,
|
||||
AppAction::OpenUsers,
|
||||
),
|
||||
(
|
||||
cells[3],
|
||||
cells2[3],
|
||||
"Settings",
|
||||
ButtonIntent::Neutral,
|
||||
AppAction::OpenSettings,
|
||||
),
|
||||
(
|
||||
cells[4],
|
||||
cells2[4],
|
||||
"Quit",
|
||||
ButtonIntent::Destructive,
|
||||
AppAction::Quit,
|
||||
),
|
||||
]
|
||||
.into_iter()
|
||||
.enumerate()
|
||||
|
|
|
|||
|
|
@ -186,8 +186,7 @@ impl Screen for SettingsScreen {
|
|||
let inner = header_block.inner(area);
|
||||
frame.render_widget(header_block, area);
|
||||
|
||||
let sections = Layout::vertical([Constraint::Length(2), Constraint::Min(1)])
|
||||
.split(inner);
|
||||
let sections = Layout::vertical([Constraint::Length(2), Constraint::Min(1)]).split(inner);
|
||||
|
||||
frame.render_widget(
|
||||
Paragraph::new(format!(
|
||||
|
|
|
|||
|
|
@ -122,10 +122,7 @@ impl UsersScreen {
|
|||
if self.loading {
|
||||
const SPINNERS: &[u8] = b"|/-\\";
|
||||
let ch = SPINNERS[self.tick.fetch_add(1, Ordering::Relaxed) as usize % SPINNERS.len()];
|
||||
f.render_widget(
|
||||
Paragraph::new(format!("{ch} Loading users…")),
|
||||
inner,
|
||||
);
|
||||
f.render_widget(Paragraph::new(format!("{ch} Loading users…")), inner);
|
||||
return;
|
||||
}
|
||||
if visible_indices.is_empty() {
|
||||
|
|
@ -149,9 +146,20 @@ impl UsersScreen {
|
|||
let user = &self.users[*user_index];
|
||||
(
|
||||
*user_index,
|
||||
format!("{:>6} {} {}{}", user.user_id, user.username,
|
||||
match user.state { iota_ipc::LocalUserState::Managed => "managed", iota_ipc::LocalUserState::Released => "released" },
|
||||
if user.data_present { "" } else { ", data purged" }),
|
||||
format!(
|
||||
"{:>6} {} {}{}",
|
||||
user.user_id,
|
||||
user.username,
|
||||
match user.state {
|
||||
iota_ipc::LocalUserState::Managed => "managed",
|
||||
iota_ipc::LocalUserState::Released => "released",
|
||||
},
|
||||
if user.data_present {
|
||||
""
|
||||
} else {
|
||||
", data purged"
|
||||
}
|
||||
),
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
|
|
@ -533,11 +541,14 @@ impl Screen for UsersScreen {
|
|||
match result {
|
||||
Ok(()) => {
|
||||
self.pending_dialog = None;
|
||||
if let Some(user) = self.users.iter_mut().find(|user| user.user_id == user_id) {
|
||||
if let Some(user) =
|
||||
self.users.iter_mut().find(|user| user.user_id == user_id)
|
||||
{
|
||||
user.state = iota_ipc::LocalUserState::Released;
|
||||
user.credential_present = false;
|
||||
}
|
||||
self.message = Some(format!("Released user {user_id}; hosted data retained."));
|
||||
self.message =
|
||||
Some(format!("Released user {user_id}; hosted data retained."));
|
||||
}
|
||||
Err(error) => {
|
||||
self.dialog = self.pending_dialog.take();
|
||||
|
|
|
|||
|
|
@ -306,7 +306,10 @@ impl UI {
|
|||
}
|
||||
|
||||
pub async fn notifications(&self) -> Vec<Notification> {
|
||||
self.notifications.lock().map(|n| n.clone()).unwrap_or_default()
|
||||
self.notifications
|
||||
.lock()
|
||||
.map(|n| n.clone())
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
pub async fn set_screen(&self, screen: Box<dyn Screen>) {
|
||||
|
|
@ -611,7 +614,9 @@ impl UI {
|
|||
Ok(iota_ipc::ResponseResult::Error(error)) => {
|
||||
Err(format!("Cannot load users: {error}"))
|
||||
}
|
||||
Ok(_) => Err("Daemon returned an unexpected response while loading users.".into()),
|
||||
Ok(_) => {
|
||||
Err("Daemon returned an unexpected response while loading users.".into())
|
||||
}
|
||||
Err(error) => Err(format!("Cannot load users: {error}")),
|
||||
}
|
||||
};
|
||||
|
|
@ -705,7 +710,12 @@ impl UI {
|
|||
width: 40.min(rows[1].width),
|
||||
height: 3.min(rows[1].height),
|
||||
};
|
||||
render_notification_area(f, notification_area, ¬ifications, context.theme);
|
||||
render_notification_area(
|
||||
f,
|
||||
notification_area,
|
||||
¬ifications,
|
||||
context.theme,
|
||||
);
|
||||
}
|
||||
}
|
||||
})?;
|
||||
|
|
|
|||
Loading…
Reference in a new issue