better working signals

This commit is contained in:
leviathan
2026-02-08 01:26:21 -05:00
parent 284bf45198
commit 4029177fd6
10 changed files with 671 additions and 204 deletions
+84 -42
View File
@@ -82,13 +82,14 @@ pub fn draw_ui(frame: &mut Frame, app: &App) {
if matches!(
app.input_mode,
InputMode::FobMetaYear
InputMode::ExportFilename
| InputMode::FobMetaYear
| InputMode::FobMetaMake
| InputMode::FobMetaModel
| InputMode::FobMetaRegion
| InputMode::FobMetaNotes
) {
render_fob_metadata_form(frame, app);
render_export_form(frame, app);
}
}
@@ -146,6 +147,13 @@ fn render_help_bar(frame: &mut Frame, area: Rect, app: &App) {
InputMode::SettingsSelect => "Left/Right: Select | Tab: Cycle | Enter: Edit | Esc: Back",
InputMode::SettingsEdit => "Up/Down: Change Value | Enter: Apply | Esc: Cancel",
InputMode::StartupImport => "y: Import | n: Skip",
InputMode::ExportFilename => {
match app.export_format {
Some(crate::app::ExportFormat::Fob) => "Enter: Next Field | Esc: Cancel Export",
Some(crate::app::ExportFormat::Flipper) => "Enter: Save & Export | Esc: Cancel Export",
None => "Enter: Confirm | Esc: Cancel",
}
}
InputMode::FobMetaYear
| InputMode::FobMetaMake
| InputMode::FobMetaModel
@@ -204,10 +212,17 @@ fn render_startup_import_prompt(frame: &mut Frame, app: &App) {
frame.render_widget(paragraph, popup);
}
/// Render the .fob export metadata form overlay with signal summary
fn render_fob_metadata_form(frame: &mut Frame, app: &App) {
/// Render the export form overlay (filename + optional .fob metadata)
fn render_export_form(frame: &mut Frame, app: &App) {
use crate::app::ExportFormat;
let is_fob = app.export_format == Some(ExportFormat::Fob);
let ext = if is_fob { ".fob" } else { ".sub" };
let area = frame.area();
let popup = centered_rect(62, 19, area);
// Taller popup for .fob (filename + 5 metadata fields), shorter for .sub (filename only)
let popup_height = if is_fob { 21 } else { 11 };
let popup = centered_rect(62, popup_height, area);
frame.render_widget(Clear, popup);
@@ -226,14 +241,21 @@ fn render_fob_metadata_form(frame: &mut Frame, app: &App) {
.add_modifier(Modifier::RAPID_BLINK),
);
// Determine which field is active
let field_modes = [
InputMode::FobMetaYear,
InputMode::FobMetaMake,
InputMode::FobMetaModel,
InputMode::FobMetaRegion,
InputMode::FobMetaNotes,
];
// Build the ordered list of field modes for this export type
// Filename is always first; .fob adds metadata fields after
let field_modes: Vec<InputMode> = if is_fob {
vec![
InputMode::ExportFilename,
InputMode::FobMetaYear,
InputMode::FobMetaMake,
InputMode::FobMetaModel,
InputMode::FobMetaRegion,
InputMode::FobMetaNotes,
]
} else {
vec![InputMode::ExportFilename]
};
let current_idx = field_modes
.iter()
.position(|m| *m == app.input_mode)
@@ -292,39 +314,53 @@ fn render_fob_metadata_form(frame: &mut Frame, app: &App) {
idx: usize,
}
let fields = [
// Filename field (always present)
let filename_display = format!("{}{}", app.export_filename, ext);
let mut fields: Vec<FormField> = vec![
FormField {
label: " Year: ",
value: &app.fob_meta_year,
placeholder: "(e.g. 2024)",
label: " File: ",
value: &filename_display,
placeholder: "(enter filename)",
idx: 0,
},
FormField {
label: " Make: ",
value: &app.fob_meta_make,
placeholder: "(auto-detected from protocol)",
idx: 1,
},
FormField {
label: " Model: ",
value: &app.fob_meta_model,
placeholder: "(e.g. Sportage, F-150)",
idx: 2,
},
FormField {
label: " Region: ",
value: &app.fob_meta_region,
placeholder: "(e.g. NA, EU, APAC, MEA)",
idx: 3,
},
FormField {
label: " Notes: ",
value: &app.fob_meta_notes,
placeholder: "(optional — color, trim, VIN, etc.)",
idx: 4,
},
];
// .fob metadata fields
if is_fob {
fields.extend([
FormField {
label: " Year: ",
value: &app.fob_meta_year,
placeholder: "(e.g. 2024)",
idx: 1,
},
FormField {
label: " Make: ",
value: &app.fob_meta_make,
placeholder: "(auto-detected from protocol)",
idx: 2,
},
FormField {
label: " Model: ",
value: &app.fob_meta_model,
placeholder: "(e.g. Sportage, F-150)",
idx: 3,
},
FormField {
label: " Region: ",
value: &app.fob_meta_region,
placeholder: "(e.g. NA, EU, APAC, MEA)",
idx: 4,
},
FormField {
label: " Notes: ",
value: &app.fob_meta_notes,
placeholder: "(optional — color, trim, VIN, etc.)",
idx: 5,
},
]);
}
for field in &fields {
let label_s = style_for(field.idx);
let display_val = if field.value.is_empty() {
@@ -377,8 +413,14 @@ fn render_fob_metadata_form(frame: &mut Frame, app: &App) {
Span::styled(hint, dim_style),
]));
let title = if is_fob {
" Export .fob — Filename & Vehicle Details "
} else {
" Export .sub (Flipper Zero) "
};
let block = Block::default()
.title(" Export .fob — Vehicle Details ")
.title(title)
.borders(Borders::ALL)
.border_style(Style::default().fg(Color::Green));