mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-24 09:46:59 -06:00
Merge pull request #2479 from dotCooCoo/fix/character-reset-panel-all-attributes
Character: Reset Panel resets every attribute the panel shows except the font and size
This commit is contained in:
@@ -734,14 +734,28 @@ pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
app.status(format!("{} font families available", r["families"]));
|
||||
}
|
||||
if menu_item(ui, tl!("Reset Panel"), has, false) {
|
||||
style(app, json!({"tracking": 0, "leading": "auto"}));
|
||||
format(
|
||||
app,
|
||||
json!({"kerning": "auto", "baselineShift": 0, "hScale": 100, "vScale": 100, "rotation": 0, "underline": false, "strikethrough": false, "allCaps": false}),
|
||||
);
|
||||
reset_panel(app);
|
||||
}
|
||||
}
|
||||
|
||||
/// Reset Panel: the characters the panel acts on ([`char_cmd`]) take tracking 0, Auto leading and
|
||||
/// kerning, no baseline shift, 100% scales, no rotation, no underline or strikethrough, All Caps
|
||||
/// and Small Caps off, the normal position (neither superscript nor subscript), Roman Baseline
|
||||
/// character alignment, Proportional Metrics off and the Default digits, whether or not Show
|
||||
/// East Asian Options and Show Indic Options are on.
|
||||
fn reset_panel(app: &mut VectorcraftApp) {
|
||||
let d = CharStyle::default();
|
||||
style(app, json!({"tracking": 0, "leading": "auto"}));
|
||||
format(
|
||||
app,
|
||||
json!({
|
||||
"kerning": "auto", "baselineShift": 0, "hScale": 100, "vScale": 100, "rotation": 0, "underline": false, "strikethrough": false,
|
||||
"allCaps": false, "smallCaps": d.small_caps.is_some(), "position": d.position.id(), "charAlign": d.char_align,
|
||||
"proportionalMetrics": d.proportional_metrics, "digits": d.digits
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
@@ -1006,4 +1020,65 @@ mod tests {
|
||||
app.session.prefs.show_indic_options = true;
|
||||
assert!(shown(&mut app));
|
||||
}
|
||||
|
||||
/// Reset Panel sets every character attribute the panel shows, except the font family, style
|
||||
/// and size, back to its default (Small Caps, the position, Character Alignment, Proportional
|
||||
/// Metrics and Digits included), in the selected type and in the text the Type tool has
|
||||
/// selected while it edits.
|
||||
#[test]
|
||||
fn reset_panel_resets_every_attribute_but_the_font() {
|
||||
let mut app = VectorcraftApp::new(Session::new(), Default::default());
|
||||
app.run("file.new", json!({"width": 300, "height": 200})).unwrap();
|
||||
let id = app.run("text.create", json!({"x": 20, "y": 50, "text": "One 12"})).unwrap()["id"].as_u64().unwrap();
|
||||
let runs = |app: &VectorcraftApp| match &app.session.active().unwrap().doc.node(NodeId(id)).unwrap().kind {
|
||||
NodeKind::Text(t) => t.runs.iter().map(|r| (r.text.clone(), r.style.clone())).collect::<Vec<_>>(),
|
||||
_ => panic!("text"),
|
||||
};
|
||||
let differs = |s: &CharStyle, d: &CharStyle| {
|
||||
[
|
||||
s.tracking != d.tracking,
|
||||
s.leading != d.leading,
|
||||
s.kerning != d.kerning,
|
||||
s.baseline_shift != d.baseline_shift,
|
||||
s.h_scale != d.h_scale,
|
||||
s.v_scale != d.v_scale,
|
||||
s.rotation != d.rotation,
|
||||
s.underline != d.underline,
|
||||
s.strikethrough != d.strikethrough,
|
||||
s.all_caps != d.all_caps,
|
||||
s.small_caps != d.small_caps,
|
||||
s.position != d.position,
|
||||
s.char_align != d.char_align,
|
||||
s.proportional_metrics != d.proportional_metrics,
|
||||
s.digits != d.digits,
|
||||
]
|
||||
};
|
||||
let custom = |app: &mut VectorcraftApp| {
|
||||
app.run(
|
||||
"text.setRangeStyle",
|
||||
json!({
|
||||
"id": id, "tracking": 50, "leading": 30, "kerning": 20, "baselineShift": 3, "hScale": 120, "vScale": 90, "rotation": 15,
|
||||
"underline": true, "strikethrough": true, "allCaps": true, "smallCaps": true, "position": "superscript",
|
||||
"charAlign": "emBoxCenter", "proportionalMetrics": true, "digits": "hindi"
|
||||
}),
|
||||
)
|
||||
.unwrap();
|
||||
};
|
||||
let plain = runs(&app)[0].1.clone();
|
||||
assert_eq!(differs(&plain, &CharStyle::default()), [false; 15]);
|
||||
custom(&mut app);
|
||||
let styled = runs(&app)[0].1.clone();
|
||||
assert_eq!(differs(&styled, &CharStyle::default()), [true; 15]);
|
||||
app.run("select.set", json!({"ids": [id]})).unwrap();
|
||||
reset_panel(&mut app);
|
||||
assert_eq!(runs(&app), [("One 12".to_string(), plain.clone())]);
|
||||
// While the Type tool edits text, Reset Panel resets only its selection.
|
||||
custom(&mut app);
|
||||
app.select_tool("type");
|
||||
app.session.apply_actions(vec![vectorcraft_tools::Action::Notify("text.editNew".into())]).unwrap();
|
||||
app.session.set_tool_option("select", &json!({"start": 4, "end": 6}));
|
||||
assert!(text_editing(&app).is_some());
|
||||
reset_panel(&mut app);
|
||||
assert_eq!(runs(&app), [("One ".to_string(), styled), ("12".to_string(), plain)]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user