diff --git a/src/app/control/actions.rs b/src/app/control/actions.rs index dab7a6c47..671a08b77 100644 --- a/src/app/control/actions.rs +++ b/src/app/control/actions.rs @@ -987,30 +987,38 @@ impl OpenCADStudio { use crate::ui::window::field_dialog::{self as fd, FieldDialogMsg as F}; let value = string(req, "value")?; let (key, v) = value.split_once('=').unwrap_or((value, "")); - let index = || v.parse::().map_err(|_| failure("invalid_value", "index expected")); + // The dialog indexes its lists with these, so one out of range + // would panic while it draws. + let index = |len: usize| { + v.parse::() + .ok() + .filter(|i| *i < len) + .ok_or_else(|| failure("invalid_value", "index out of range")) + }; + let named_len = self.field_dialog.as_ref().map_or(0, |d| d.named_names.len()); let known = |list: &[&'static str]| { list.iter().copied().find(|n| n.eq_ignore_ascii_case(v)).ok_or_else(|| failure("invalid_value", "unknown name")) }; Message::FieldDialog(match key { - "category" => F::Category(index()?), + "category" => F::Category(index(fd::CATEGORIES.len())?), "name" => F::Name(known(&fd::fields_of(0))?), "date" => F::DateFormat(v.into()), - "case" => F::TextCase(index()?), + "case" => F::TextCase(index(fd::TEXT_CASES.len())?), "file" => F::FileParts(v.parse::().map_err(|_| failure("invalid_value", "1|2|3"))?), "ext" => F::FileExtension(v == "1"), - "size" => F::SizeUnit(index()?), + "size" => F::SizeUnit(index(fd::SIZE_UNITS.len())?), "sysvar" => F::SysVar(v.into()), "diesel" => F::Diesel(v.into()), - "named_type" => F::NamedType(index()?), - "named" => F::Named(index()?), + "named_type" => F::NamedType(index(fd::NAMED_TYPES.len())?), + "named" => F::Named(index(named_len)?), "prop" => F::ObjectProp(known(&["Area", "Center", "Circumference", "Diameter", "EndPoint", "Length", "Radius", "StartPoint"])?), "select_object" => F::SelectObject, "formula" => F::Formula(v.into()), - "formula_format" => F::FormulaFormat(index()?), - "precision" => F::FormulaPrecision(index()?), + "formula_format" => F::FormulaFormat(index(codec::fields::FORMULA_FORMATS.len())?), + "precision" => F::FormulaPrecision(index(fd::FORMULA_PRECISIONS.len())?), "link_text" => F::HyperlinkText(v.into()), "link_url" => F::HyperlinkUrl(v.into()), - "plot_scale" => F::PlotScale(index()?), + "plot_scale" => F::PlotScale(index(codec::fields::PLOT_SCALE_FORMATS.len())?), _ => return Err(failure("invalid_value", "Unknown field dialog key")), }) } diff --git a/src/io/mod.rs b/src/io/mod.rs index a412dc859..85cfe2906 100644 --- a/src/io/mod.rs +++ b/src/io/mod.rs @@ -765,7 +765,7 @@ pub fn load_bytes(name: &str, bytes: Vec) -> Result { .map_err(|e| e.to_string())?; fix_viewport_status_flags(&mut doc); fix_current_style_names(&mut doc); - crate::entities::field::local_header_dates(&mut doc); + crate::entities::field::local_header_dates(&mut doc); Ok(doc) } "dxf" => { @@ -777,7 +777,7 @@ pub fn load_bytes(name: &str, bytes: Vec) -> Result { fix_dxf_layout_plot_settings(&mut doc); fix_viewport_status_flags(&mut doc); fix_current_style_names(&mut doc); - crate::entities::field::local_header_dates(&mut doc); + crate::entities::field::local_header_dates(&mut doc); Ok(doc) } _ => Err(format!("Unsupported file format: .{ext}")), diff --git a/src/ui/window/field_dialog.rs b/src/ui/window/field_dialog.rs index 8862378db..0d76b6816 100644 --- a/src/ui/window/field_dialog.rs +++ b/src/ui/window/field_dialog.rs @@ -519,7 +519,7 @@ fn format_panel<'a>(state: &'a FieldDialogState) -> Element<'a, Message> { .font(iced::Font::MONOSPACE) .style(field_style) .on_input(|v| msg(FieldDialogMsg::HyperlinkUrl(v))), - button(text("…").size(12)) + button(text("...").size(12)) .on_press(msg(FieldDialogMsg::BrowseHyperlink)) .style(button_style(false)) .padding([5, 10]),