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:
parent
b211ca07a9
commit
f93bda1800
1 changed files with 161 additions and 96 deletions
|
|
@ -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(),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue