feat(dimstyle): use named dropdowns for enum style settings (#94)

The dimension style editor exposed every enum setting (DIMTAD, DIMJUST,
DIMLUNIT, DIMTMOVE, DIMATFIT, DIMTFILL, DIMFRAC, DIMAUNIT, DIMAZIN,
DIMALTU, DIMTOLJ, DIMARCSYM, and the zero-suppression family) as a raw
integer text box, forcing the user to type codes like "1". Replace them
with named pick_list dropdowns via an enum_field helper that maps the
stored code to a label and back. Numeric fields (sizes, colours,
decimals) and obsolete flags (DIMUNIT/DIMFIT) keep their text inputs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hakan Seven 2026-06-14 09:28:36 +03:00
commit f93bda1800

View file

@ -239,6 +239,57 @@ pub fn view_window<'a>(
.into() .into()
}; };
// Enum dropdown: maps the stored integer code to a named option and back,
// so the user picks "Above" rather than typing "1".
let enum_field = move |label: &'static str,
fld: DsField,
val: &'a str,
opts: &'static [(&'static str, &'static str)]|
-> Element<'a, Message> {
let labels: Vec<String> = opts.iter().map(|(_, l)| (*l).to_string()).collect();
let cur = opts
.iter()
.find(|(c, _)| *c == val.trim())
.map(|(_, l)| (*l).to_string())
.unwrap_or_else(|| val.to_string());
row![
lbl(label),
pick_list(labels, Some(cur), move |chosen| {
let code = opts
.iter()
.find(|(_, l)| *l == chosen.as_str())
.map(|(c, _)| (*c).to_string())
.unwrap_or(chosen);
Message::DsEdit(fld.clone(), code)
})
.text_size(11)
.width(150),
]
.spacing(8)
.align_y(iced::Center)
.into()
};
// Zero-suppression codes shared by DIMZIN / DIMALTZ / DIMALTTZ / DIMTZIN.
const OPT_ZIN: &[(&str, &str)] = &[
("0", "Suppress none"),
("1", "Suppress 0 ft & 0 in"),
("2", "Keep 0 ft, drop 0 in"),
("3", "Drop 0 ft, keep 0 in"),
("4", "Suppress leading"),
("8", "Suppress trailing"),
("12", "Suppress leading & trailing"),
];
// Linear unit formats shared by DIMLUNIT / DIMALTU.
const OPT_LUNIT: &[(&str, &str)] = &[
("1", "Scientific"),
("2", "Decimal"),
("3", "Engineering"),
("4", "Architectural"),
("5", "Fractional"),
("6", "Windows desktop"),
];
// Block / linetype Handle dropdown: pick a block-record (arrowheads) or a // Block / linetype Handle dropdown: pick a block-record (arrowheads) or a
// linetype by name from the available records. // linetype by name from the available records.
let hrow = move |label: &'static str, let hrow = move |label: &'static str,
@ -402,12 +453,12 @@ pub fn view_window<'a>(
vals.dimsah, vals.dimsah,
DsField::Dimsah DsField::Dimsah
), ),
row![ enum_field(
lbl("Arc length symbol (DIMARCSYM)"), "Arc length symbol (DIMARCSYM)",
mk_field(DsField::Dimarcsym, vals.dimarcsym) DsField::Dimarcsym,
] vals.dimarcsym,
.spacing(8) &[("0", "Before text"), ("1", "Above text"), ("2", "None")],
.align_y(iced::Center), ),
row![ row![
lbl("Jog angle ° (DIMJOGANG)"), lbl("Jog angle ° (DIMJOGANG)"),
mk_field(DsField::Dimjogang, vals.dimjogang) mk_field(DsField::Dimjogang, vals.dimjogang)
@ -431,12 +482,18 @@ pub fn view_window<'a>(
] ]
.spacing(8) .spacing(8)
.align_y(iced::Center), .align_y(iced::Center),
row![ enum_field(
lbl("Vertical pos (DIMTAD)"), "Vertical pos (DIMTAD)",
mk_field(DsField::Dimtad, vals.dimtad) DsField::Dimtad,
] vals.dimtad,
.spacing(8) &[
.align_y(iced::Center), ("0", "Centered"),
("1", "Above"),
("2", "Outside"),
("3", "JIS"),
("4", "Below"),
],
),
chk("Horizontal inside (DIMTIH)", vals.dimtih, DsField::Dimtih), chk("Horizontal inside (DIMTIH)", vals.dimtih, DsField::Dimtih),
chk("Horizontal outside (DIMTOH)", vals.dimtoh, DsField::Dimtoh), chk("Horizontal outside (DIMTOH)", vals.dimtoh, DsField::Dimtoh),
row![ row![
@ -445,24 +502,34 @@ pub fn view_window<'a>(
] ]
.spacing(8) .spacing(8)
.align_y(iced::Center), .align_y(iced::Center),
row![ enum_field(
lbl("Horizontal just (DIMJUST)"), "Horizontal just (DIMJUST)",
mk_field(DsField::Dimjust, vals.dimjust) DsField::Dimjust,
] vals.dimjust,
.spacing(8) &[
.align_y(iced::Center), ("0", "Centered"),
("1", "At first ext"),
("2", "At second ext"),
("3", "Over first ext"),
("4", "Over second ext"),
],
),
row![ row![
lbl("Vertical pos (DIMTVP)"), lbl("Vertical pos (DIMTVP)"),
mk_field(DsField::Dimtvp, vals.dimtvp) mk_field(DsField::Dimtvp, vals.dimtvp)
] ]
.spacing(8) .spacing(8)
.align_y(iced::Center), .align_y(iced::Center),
row![ enum_field(
lbl("Text fill mode (DIMTFILL)"), "Text fill mode (DIMTFILL)",
mk_field(DsField::Dimtfill, vals.dimtfill) DsField::Dimtfill,
] vals.dimtfill,
.spacing(8) &[
.align_y(iced::Center), ("0", "None"),
("1", "Drawing background"),
("2", "Color"),
],
),
row![ row![
lbl("Fill color ACI (DIMTFILLCLR)"), lbl("Fill color ACI (DIMTFILLCLR)"),
mk_field(DsField::Dimtfillclr, vals.dimtfillclr) mk_field(DsField::Dimtfillclr, vals.dimtfillclr)
@ -493,12 +560,7 @@ pub fn view_window<'a>(
.spacing(8) .spacing(8)
.align_y(iced::Center), .align_y(iced::Center),
text("Units").size(11).color(ACCENT), text("Units").size(11).color(ACCENT),
row![ enum_field("Format (DIMLUNIT)", DsField::Dimlunit, vals.dimlunit, OPT_LUNIT),
lbl("Format (DIMLUNIT)"),
mk_field(DsField::Dimlunit, vals.dimlunit)
]
.spacing(8)
.align_y(iced::Center),
row![ row![
lbl("Decimals (DIMDEC)"), lbl("Decimals (DIMDEC)"),
mk_field(DsField::Dimdec, vals.dimdec) mk_field(DsField::Dimdec, vals.dimdec)
@ -523,24 +585,28 @@ pub fn view_window<'a>(
] ]
.spacing(8) .spacing(8)
.align_y(iced::Center), .align_y(iced::Center),
row![ enum_field("Zero suppress (DIMZIN)", DsField::Dimzin, vals.dimzin, OPT_ZIN),
lbl("Zero suppress (DIMZIN)"), enum_field(
mk_field(DsField::Dimzin, vals.dimzin) "Fraction format (DIMFRAC)",
] DsField::Dimfrac,
.spacing(8) vals.dimfrac,
.align_y(iced::Center), &[
row![ ("0", "Horizontal"),
lbl("Fraction format (DIMFRAC)"), ("1", "Diagonal"),
mk_field(DsField::Dimfrac, vals.dimfrac) ("2", "Not stacked"),
] ],
.spacing(8) ),
.align_y(iced::Center), enum_field(
row![ "Angular unit (DIMAUNIT)",
lbl("Angular unit (DIMAUNIT)"), DsField::Dimaunit,
mk_field(DsField::Dimaunit, vals.dimaunit) vals.dimaunit,
] &[
.spacing(8) ("0", "Decimal degrees"),
.align_y(iced::Center), ("1", "Deg/min/sec"),
("2", "Gradians"),
("3", "Radians"),
],
),
row![ row![
lbl("Angular decimals (DIMADEC)"), lbl("Angular decimals (DIMADEC)"),
mk_field(DsField::Dimadec, vals.dimadec) mk_field(DsField::Dimadec, vals.dimadec)
@ -553,25 +619,39 @@ pub fn view_window<'a>(
] ]
.spacing(8) .spacing(8)
.align_y(iced::Center), .align_y(iced::Center),
row![ enum_field(
lbl("Angular zero supp (DIMAZIN)"), "Angular zero supp (DIMAZIN)",
mk_field(DsField::Dimazin, vals.dimazin) DsField::Dimazin,
] vals.dimazin,
.spacing(8) &[
.align_y(iced::Center), ("0", "None"),
("1", "Leading"),
("2", "Trailing"),
("3", "Leading & trailing"),
],
),
text("Fit").size(11).color(ACCENT), text("Fit").size(11).color(ACCENT),
row![ enum_field(
lbl("Fit (DIMATFIT)"), "Fit (DIMATFIT)",
mk_field(DsField::Dimatfit, vals.dimatfit) DsField::Dimatfit,
] vals.dimatfit,
.spacing(8) &[
.align_y(iced::Center), ("0", "Move text & arrows out"),
row![ ("1", "Arrows out first"),
lbl("Text movement (DIMTMOVE)"), ("2", "Text out first"),
mk_field(DsField::Dimtmove, vals.dimtmove) ("3", "Best fit"),
] ],
.spacing(8) ),
.align_y(iced::Center), enum_field(
"Text movement (DIMTMOVE)",
DsField::Dimtmove,
vals.dimtmove,
&[
("0", "Keep with dim line"),
("1", "Add leader"),
("2", "Move freely"),
],
),
row![ row![
lbl("Fit (legacy DIMFIT)"), lbl("Fit (legacy DIMFIT)"),
mk_field(DsField::Dimfit, vals.dimfit) mk_field(DsField::Dimfit, vals.dimfit)
@ -612,12 +692,7 @@ pub fn view_window<'a>(
] ]
.spacing(8) .spacing(8)
.align_y(iced::Center), .align_y(iced::Center),
row![ enum_field("Unit format (DIMALTU)", DsField::Dimaltu, vals.dimaltu, OPT_LUNIT),
lbl("Unit format (DIMALTU)"),
mk_field(DsField::Dimaltu, vals.dimaltu)
]
.spacing(8)
.align_y(iced::Center),
row![ row![
lbl("Tol decimals (DIMALTTD)"), lbl("Tol decimals (DIMALTTD)"),
mk_field(DsField::Dimalttd, vals.dimalttd) mk_field(DsField::Dimalttd, vals.dimalttd)
@ -636,18 +711,13 @@ pub fn view_window<'a>(
] ]
.spacing(8) .spacing(8)
.align_y(iced::Center), .align_y(iced::Center),
row![ enum_field("Zero suppress (DIMALTZ)", DsField::Dimaltz, vals.dimaltz, OPT_ZIN),
lbl("Zero suppress (DIMALTZ)"), enum_field(
mk_field(DsField::Dimaltz, vals.dimaltz) "Tol zero supp (DIMALTTZ)",
] DsField::Dimalttz,
.spacing(8) vals.dimalttz,
.align_y(iced::Center), OPT_ZIN,
row![ ),
lbl("Tol zero supp (DIMALTTZ)"),
mk_field(DsField::Dimalttz, vals.dimalttz)
]
.spacing(8)
.align_y(iced::Center),
] ]
.spacing(7) .spacing(7)
.into(), .into(),
@ -679,18 +749,13 @@ pub fn view_window<'a>(
] ]
.spacing(8) .spacing(8)
.align_y(iced::Center), .align_y(iced::Center),
row![ enum_field(
lbl("Tol. vert just (DIMTOLJ)"), "Tol. vert just (DIMTOLJ)",
mk_field(DsField::Dimtolj, vals.dimtolj) DsField::Dimtolj,
] vals.dimtolj,
.spacing(8) &[("0", "Bottom"), ("1", "Middle"), ("2", "Top")],
.align_y(iced::Center), ),
row![ enum_field("Tol. zero supp (DIMTZIN)", DsField::Dimtzin, vals.dimtzin, OPT_ZIN),
lbl("Tol. zero supp (DIMTZIN)"),
mk_field(DsField::Dimtzin, vals.dimtzin)
]
.spacing(8)
.align_y(iced::Center),
] ]
.spacing(7) .spacing(7)
.into(), .into(),