mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-25 18:27:02 -06:00
Merge pull request #690 from storytold/fix/663-toolbar-labels
Part of #663: Show Tool Group Labels option; Cmd+, opens Settings on the Mac
This commit is contained in:
+1
-1
File diff suppressed because one or more lines are too long
@@ -275,6 +275,7 @@ pub const PREF_SPECS: &[PrefSpec] = &[
|
||||
])
|
||||
),
|
||||
p!("autoCollapseIconPanels", "User Interface", "", "Auto-Collapse Iconic Panels", bool),
|
||||
p!("toolGroupLabels", "User Interface", "", "Show Tool Group Labels", bool),
|
||||
p!("openDocumentsAsTabs", "User Interface", "", "Open Documents As Tabs", bool),
|
||||
p!("largeTabs", "User Interface", "", "Large Tabs", bool),
|
||||
p!("uiScaling", "User Interface", "UI Scaling", "Scale", num(0.75, 2.0, "×")),
|
||||
|
||||
@@ -491,6 +491,9 @@ pub struct Prefs {
|
||||
pub ui_brightness: String,
|
||||
pub canvas_color: String,
|
||||
pub auto_collapse_icon_panels: bool,
|
||||
/// User Interface › Show Tool Group Labels: the toolbar's group names (Select, Shapes, Draw…);
|
||||
/// off, a faint dash separates the groups instead (#663).
|
||||
pub tool_group_labels: bool,
|
||||
pub open_documents_as_tabs: bool,
|
||||
pub large_tabs: bool,
|
||||
pub ui_scaling: f64,
|
||||
@@ -706,6 +709,7 @@ impl Default for Prefs {
|
||||
ui_brightness: s("mediumDark"),
|
||||
canvas_color: s("matchUi"),
|
||||
auto_collapse_icon_panels: false,
|
||||
tool_group_labels: true,
|
||||
open_documents_as_tabs: true,
|
||||
large_tabs: false,
|
||||
ui_scaling: 1.0,
|
||||
|
||||
@@ -203,6 +203,7 @@
|
||||
Auto Size New Area Type Ajustar automáticamente el tamaño del nuevo texto de área
|
||||
Auto Spell Check Revisión ortográfica automática
|
||||
Auto-Collapse Iconic Panels Contraer automáticamente los paneles de iconos
|
||||
Show Tool Group Labels Mostrar etiquetas de grupos de herramientas
|
||||
Auto-Rotate (turn the paper to each artboard) Rotar automáticamente (girar el papel según cada mesa de trabajo)
|
||||
Automatic flatness Lisura automática
|
||||
Automatically Automáticamente
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -204,6 +204,7 @@
|
||||
Auto Size New Area Type Taille automatique du nouveau texte captif
|
||||
Auto Spell Check Vérification orthographique automatique
|
||||
Auto-Collapse Iconic Panels Réduire automatiquement les panneaux en icônes
|
||||
Show Tool Group Labels Afficher les libellés des groupes d'outils
|
||||
Auto-Rotate (turn the paper to each artboard) Rotation automatique (orienter le papier selon chaque plan de travail)
|
||||
Automatic flatness Planéité automatique
|
||||
Automatically Automatiquement
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -203,6 +203,7 @@
|
||||
Auto Size New Area Type Dimensionamento automatico del nuovo testo in area
|
||||
Auto Spell Check Controllo ortografico automatico
|
||||
Auto-Collapse Iconic Panels Comprimi automaticamente i pannelli a icona
|
||||
Show Tool Group Labels Mostra etichette dei gruppi di strumenti
|
||||
Auto-Rotate (turn the paper to each artboard) Rotazione automatica (orienta la carta in base a ogni tavola da disegno)
|
||||
Automatic flatness Planarità automatica
|
||||
Automatically Automaticamente
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -810,6 +810,7 @@
|
||||
Auto 自動
|
||||
Auto Size New Area Type 新規エリア内文字を自動サイズ調整
|
||||
Auto-Collapse Iconic Panels アイコンパネルを自動的に折りたたむ
|
||||
Show Tool Group Labels ツールグループのラベルを表示
|
||||
Auto-Rotate (turn the paper to each artboard) 自動回転 (アートボードごとに用紙を回転)
|
||||
Automatic flatness フラットネスを自動設定
|
||||
Automatically 自動
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -252,6 +252,7 @@
|
||||
Auto Size New Area Type Dimensionar Automaticamente Novo Texto de Área
|
||||
Auto Spell Check Verificação Ortográfica Automática
|
||||
Auto-Collapse Iconic Panels Recolher Automaticamente Painéis Icônicos
|
||||
Show Tool Group Labels Mostrar Rótulos dos Grupos de Ferramentas
|
||||
Auto-Rotate (turn the paper to each artboard) Girar Automaticamente (gire o papel para cada mesa de trabalho)
|
||||
Automatic Automático
|
||||
Automatic flatness Achatamento automático
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -201,6 +201,7 @@
|
||||
Auto Size New Area Type Автоматически подгонять размер нового текста в области
|
||||
Auto Spell Check Автоматическая проверка орфографии
|
||||
Auto-Collapse Iconic Panels Автоматически сворачивать значки панелей
|
||||
Show Tool Group Labels Показывать названия групп инструментов
|
||||
Auto-Rotate (turn the paper to each artboard) Автоповорот (поворачивать лист по каждой монтажной области)
|
||||
Automatic flatness Автоматическая плоскостность
|
||||
Automatically Автоматически
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -203,6 +203,7 @@
|
||||
Auto Size New Area Type 自动调整新区域文字大小
|
||||
Auto Spell Check 自动拼写检查
|
||||
Auto-Collapse Iconic Panels 自动折叠图标面板
|
||||
Show Tool Group Labels 显示工具组标签
|
||||
Auto-Rotate (turn the paper to each artboard) 自动旋转 (为每个画板转动纸张)
|
||||
Automatic flatness 自动平滑度
|
||||
Automatically 自动
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -214,6 +214,7 @@
|
||||
Auto Size New Area Type 自動調整新區域文字大小
|
||||
Auto Spell Check 自動拼字檢查
|
||||
Auto-Collapse Iconic Panels 自動收合圖示面板
|
||||
Show Tool Group Labels 顯示工具組標籤
|
||||
Auto-Rotate (turn the paper to each artboard) 自動旋轉 (將紙張轉向各工作區域)
|
||||
Automatic flatness 自動平滑度
|
||||
Automatically 自動
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -73,6 +73,7 @@ pub(crate) fn all_shortcuts() -> Vec<(KeyboardShortcut, &'static str, serde_json
|
||||
v.push((sc, "window.panel", json!({ "panel": panel })));
|
||||
}
|
||||
}
|
||||
settings_chord(&mut v, cfg!(target_os = "macos"));
|
||||
// Most specific (most modifiers) first so Cmd+Shift+Z isn't eaten by Cmd+Z.
|
||||
v.sort_by_key(|(sc, ..)| {
|
||||
std::cmp::Reverse(sc.modifiers.shift as u8 + sc.modifiers.alt as u8 + sc.modifiers.command as u8 + sc.modifiers.ctrl as u8)
|
||||
@@ -80,6 +81,14 @@ pub(crate) fn all_shortcuts() -> Vec<(KeyboardShortcut, &'static str, serde_json
|
||||
v
|
||||
}
|
||||
|
||||
/// On a Mac, Cmd+, opens Settings as in every Mac app (#663), beside Preferences' own shortcut,
|
||||
/// unless a command or a user's shortcut already took it.
|
||||
fn settings_chord(v: &mut Vec<(KeyboardShortcut, &'static str, serde_json::Value)>, mac: bool) {
|
||||
if let Some(sc) = parse("Cmd+,").filter(|sc| mac && !v.iter().any(|(s, ..)| s == sc)) {
|
||||
v.push((sc, "edit.preferences", json!({})));
|
||||
}
|
||||
}
|
||||
|
||||
/// Consume a press of `sc`. A `=` chord also takes [`Key::Plus`], which is how `+` arrives from
|
||||
/// the numpad and from layouts where it has its own key (Shift+`=` arrives as either; extra Shift
|
||||
/// is ignored).
|
||||
@@ -687,6 +696,24 @@ mod tests {
|
||||
assert_eq!(digit_of(Key::A), None);
|
||||
}
|
||||
|
||||
/// Cmd+, opens Settings on a Mac only, and never takes a chord a command already has.
|
||||
#[test]
|
||||
fn cmd_comma_opens_settings_on_a_mac() {
|
||||
let comma = parse("Cmd+,").unwrap();
|
||||
let mut v = vec![];
|
||||
super::settings_chord(&mut v, false);
|
||||
assert!(v.is_empty(), "not elsewhere");
|
||||
super::settings_chord(&mut v, true);
|
||||
assert_eq!(v.len(), 1);
|
||||
assert_eq!((v[0].0, v[0].1), (comma, "edit.preferences"));
|
||||
let mut taken = vec![(comma, "view.zoomIn", json!({}))];
|
||||
super::settings_chord(&mut taken, true);
|
||||
assert_eq!(taken.len(), 1, "a command that has it keeps it");
|
||||
if cfg!(target_os = "macos") {
|
||||
assert!(super::all_shortcuts().iter().any(|(sc, id, _)| *sc == comma && *id == "edit.preferences"));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parses() {
|
||||
let s = parse("Cmd+Shift+]").unwrap();
|
||||
|
||||
@@ -169,7 +169,11 @@ fn body(app: &mut VectorcraftApp, ui: &mut Ui, cols: usize, floating: Option<egu
|
||||
let mut raise: Option<&'static str> = None;
|
||||
let mut i = 0;
|
||||
while i < all.len() {
|
||||
if let Some(cat) = all[i].0 {
|
||||
if all[i].0.is_some() && !app.session.prefs.tool_group_labels {
|
||||
// User Interface › Show Tool Group Labels off: a faint dash between the groups.
|
||||
let (r, _) = ui.allocate_exact_size(vec2(ui.available_width(), 9.0), Sense::hover());
|
||||
ui.painter().line_segment([r.center() - vec2(6.0, 0.0), r.center() + vec2(6.0, 0.0)], egui::Stroke::new(1.0, t.divider));
|
||||
} else if let Some(cat) = all[i].0 {
|
||||
let (r, _) = ui.allocate_exact_size(vec2(ui.available_width(), 18.0), Sense::hover());
|
||||
// A long name is cut to its first four characters in the single column.
|
||||
let cat = tl!(cat);
|
||||
@@ -1205,6 +1209,35 @@ pub(crate) mod tests {
|
||||
assert!(r.min.x.is_finite() && r.min.y.is_finite() && r.left() >= 0.0, "on screen: {r:?}");
|
||||
}
|
||||
|
||||
/// User Interface › Show Tool Group Labels (#663): on, the toolbar names its groups; off, it
|
||||
/// shows none of the names, a faint dash between the groups instead.
|
||||
#[test]
|
||||
fn tool_group_labels_can_be_hidden() {
|
||||
fn texts(s: &egui::Shape, out: &mut Vec<String>) {
|
||||
match s {
|
||||
egui::Shape::Text(t) => out.push(t.galley.text().to_string()),
|
||||
egui::Shape::Vec(v) => v.iter().for_each(|s| texts(s, out)),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
let mut app = VectorcraftApp::new(Session::new(), Default::default());
|
||||
let ctx = egui::Context::default();
|
||||
crate::theme::install_fonts(&ctx);
|
||||
let draw = |app: &mut VectorcraftApp| {
|
||||
let raw = egui::RawInput { screen_rect: Some(egui::Rect::from_min_size(Pos2::ZERO, vec2(400.0, 1600.0))), ..Default::default() };
|
||||
let mut out = ctx.run_ui(raw, |ui| show(app, ui));
|
||||
out.textures_delta.clear();
|
||||
let mut shown = vec![];
|
||||
out.shapes.iter().for_each(|c| texts(&c.shape, &mut shown));
|
||||
shown
|
||||
};
|
||||
let with = draw(&mut app);
|
||||
assert!(with.iter().any(|t| t == "Shapes") && with.iter().any(|t| t == "Draw"), "{with:?}");
|
||||
app.run("prefs.set", json!({"key": "toolGroupLabels", "value": false})).unwrap();
|
||||
let without = draw(&mut app);
|
||||
assert!(!without.iter().any(|t| ["Select", "Shapes", "Draw", "Modify", "Type"].contains(&t.as_str())), "{without:?}");
|
||||
}
|
||||
|
||||
/// Hover `at` for two seconds, coming from elsewhere: the texts painted meanwhile.
|
||||
fn hovered_texts(app: &mut VectorcraftApp, ctx: &egui::Context, t0: f64, at: Pos2) -> Vec<String> {
|
||||
fn texts(s: &egui::Shape, out: &mut Vec<String>) {
|
||||
|
||||
Reference in New Issue
Block a user