mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-09 03:48:01 +00:00
Merge pull request #5355 from dotCooCoo/feat/help-bar-visibility
UI: show or hide the Help Bar independently
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
- Compound Shapes add-on (beyond Illustrator): a menu for Make, Release and Expand Compound Shape and a setting, off by default, that makes the Pathfinder panel's Shape Mode buttons create compound shapes on a click. Scores and estimates unchanged.
|
||||
|
||||
- Paint: new gradients use the document's color model for default stops, including Gradient tool creation. Scores and estimates unchanged.
|
||||
- UI: Window → Help Bar toggles the tool-help strip separately from the status bar and saves visibility with workspaces. Scores and estimates unchanged.
|
||||
|
||||
- PDF.R1: editable PDF import uses the shared reader, scans page content in windows, and rejects known incomplete input before returning a document.
|
||||
- PDF.W1: PDF export and print composition use the shared optional writer for configuration, metadata, font preparation and guarded finalization; drawing and output policy remain app-owned.
|
||||
|
||||
@@ -168,6 +168,11 @@ fn same_lasting(a: &serde_json::Value, b: &serde_json::Value) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
/// Fields that a read fills in from other fields when the file lacks them
|
||||
/// (`vectorcraft_ui_egui::layout_migration`): `help_bar` follows `status_bar`. A save writes them
|
||||
/// whenever the file lacks them, so the next read does not fill them in again from a changed field.
|
||||
const DERIVED: &[&str] = &["help_bar"];
|
||||
|
||||
/// `on_disk` with what changed from `base` to `mine` put over it: each top-level field of the UI
|
||||
/// state, and each engine preference (`engine_prefs`) on its own, so two windows that change
|
||||
/// different settings keep both. A field both changed takes this window's value (it saves last).
|
||||
@@ -219,6 +224,13 @@ fn merge_changes(base: &serde_json::Value, mine: &serde_json::Value, on_disk: se
|
||||
}
|
||||
}
|
||||
}
|
||||
for key in DERIVED {
|
||||
if !out.contains_key(*key)
|
||||
&& let Some(v) = mine.get(*key)
|
||||
{
|
||||
out.insert((*key).to_string(), v.clone());
|
||||
}
|
||||
}
|
||||
if use_mine {
|
||||
match mine.get("action_set") {
|
||||
Some(v) => {
|
||||
@@ -383,6 +395,20 @@ mod tests {
|
||||
assert!(!same_lasting(&base, &mine));
|
||||
}
|
||||
|
||||
/// A file from before the Help Bar setting: the read shows the Help Bar with the status bar.
|
||||
/// After the status bar is hidden and the Help Bar left showing, the save writes `help_bar`,
|
||||
/// so the next read does not hide it with the status bar. A value on disk is kept.
|
||||
#[test]
|
||||
fn a_help_bar_setting_the_file_lacks_is_saved() {
|
||||
let base = json!({"status_bar": true, "help_bar": true});
|
||||
let mine = json!({"status_bar": false, "help_bar": true});
|
||||
let on_disk = json!({"status_bar": true});
|
||||
assert_eq!(merge_changes(&base, &mine, on_disk), json!({"status_bar": false, "help_bar": true}));
|
||||
// Another window saved its own Help Bar setting: it stays.
|
||||
let on_disk = json!({"status_bar": true, "help_bar": false});
|
||||
assert_eq!(merge_changes(&base, &mine, on_disk), json!({"status_bar": false, "help_bar": false}));
|
||||
}
|
||||
|
||||
/// One window deleted the first Actions set and saved; this one made the second set current.
|
||||
/// The saved index follows that set to its place in the merged list.
|
||||
#[test]
|
||||
|
||||
@@ -539,8 +539,13 @@ impl VectorcraftApp {
|
||||
}
|
||||
if self.ui.status_bar && self.ui.screen_mode < 3 {
|
||||
chrome::status_bar(self, ui);
|
||||
}
|
||||
if self.ui.help_bar && self.ui.screen_mode < 3 {
|
||||
chrome::hint_bar(self, ui);
|
||||
} else if !(self.ui.control_bar && self.ui.control_bar_bottom && self.ui.screen_mode < 2) {
|
||||
}
|
||||
if (self.ui.screen_mode >= 3 || (!self.ui.status_bar && !self.ui.help_bar))
|
||||
&& !(self.ui.control_bar && self.ui.control_bar_bottom && self.ui.screen_mode < 2)
|
||||
{
|
||||
// Keeps the previous frame's value valid for menus drawn above, before the bars. A
|
||||
// Control bar docked at the bottom has set it to the bar's top.
|
||||
widgets::set_menu_floor(&ctx, ctx.content_rect().bottom());
|
||||
|
||||
@@ -4,7 +4,7 @@ use super::{Arc, ROTATE_VIEW_ANGLES, Sense, Stroke, Tokens, Ui, VectorcraftApp,
|
||||
/// Draw the status message, bounded readouts and artboard navigation controls.
|
||||
pub fn status_bar(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
let t = Tokens::get(ui.ctx());
|
||||
egui::Panel::bottom("status_bar")
|
||||
let panel = egui::Panel::bottom("status_bar")
|
||||
.exact_size(24.0)
|
||||
.frame(egui::Frame::NONE.fill(t.panel).inner_margin(egui::Margin::symmetric(8, 0)).stroke(Stroke::new(1.0, t.border)))
|
||||
.show(ui, |ui| {
|
||||
@@ -84,6 +84,7 @@ pub fn status_bar(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
status_readouts(app, ui, &t);
|
||||
});
|
||||
});
|
||||
widgets::set_menu_floor(ui.ctx(), panel.response.rect.top());
|
||||
}
|
||||
|
||||
/// The most recently measured status widths, scoped to this UI and display settings.
|
||||
|
||||
@@ -64,6 +64,68 @@ use crate::theme::Tokens;
|
||||
use serde_json::json;
|
||||
use vectorcraft_engine::Session;
|
||||
|
||||
#[test]
|
||||
fn help_bar_and_status_bar_render_independently() {
|
||||
for (help, status, screen_mode) in [(true, true, 0), (false, true, 0), (true, false, 0), (false, false, 0), (true, true, 3)] {
|
||||
let (mut app, ctx) = status_readout_app();
|
||||
app.ui.help_bar = help;
|
||||
app.ui.status_bar = status;
|
||||
app.ui.screen_mode = screen_mode;
|
||||
let screen = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(1200.0, 800.0));
|
||||
let mut parent = None;
|
||||
let mut output = ctx.run_ui(egui::RawInput { screen_rect: Some(screen), ..Default::default() }, |ui| {
|
||||
parent = Some(ui.scope_id());
|
||||
app.ui(ui);
|
||||
});
|
||||
output.textures_delta.clear();
|
||||
for _ in 0..2 {
|
||||
output = ctx.run_ui(egui::RawInput { screen_rect: Some(screen), ..Default::default() }, |ui| app.ui(ui));
|
||||
output.textures_delta.clear();
|
||||
}
|
||||
fn text(shape: &egui::Shape, out: &mut Vec<String>) {
|
||||
match shape {
|
||||
egui::Shape::Text(t) => out.push(t.galley.text().to_string()),
|
||||
egui::Shape::Vec(shapes) => shapes.iter().for_each(|s| text(s, out)),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
let mut shown = Vec::new();
|
||||
for shape in &output.shapes {
|
||||
text(&shape.shape, &mut shown);
|
||||
}
|
||||
assert_eq!(shown.iter().any(|t| t == "?"), help && screen_mode < 3, "{help}/{status}/{screen_mode}: {shown:?}");
|
||||
assert_eq!(shown.iter().any(|t| t.contains("Saved recovery data")), status && screen_mode < 3, "{help}/{status}/{screen_mode}: {shown:?}");
|
||||
let floor = ctx.data(|data| data.get_temp::<f32>(egui::Id::unique("menu_floor").with(ctx.viewport_id()))).unwrap();
|
||||
let expected = if screen_mode < 3 && (help || status) {
|
||||
let id = parent.unwrap().with(if help { "hint_bar" } else { "status_bar" });
|
||||
egui::containers::panel::PanelState::load(&ctx, id).unwrap().outer_rect.top()
|
||||
} else {
|
||||
screen.bottom()
|
||||
};
|
||||
assert!((floor - expected).abs() < 1.0, "menu floor {floor}, expected {expected}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore = "Renders the Help Bar visibility examples; set HELP_BAR_SCREENSHOTS to an output directory"]
|
||||
fn help_bar_visibility_screenshots() {
|
||||
let dir = std::path::PathBuf::from(std::env::var_os("HELP_BAR_SCREENSHOTS").expect("output directory"));
|
||||
for shown in [true, false] {
|
||||
let mut app = crate::VectorcraftApp::new(Session::new(), Default::default());
|
||||
app.run("file.new", json!({"width": 500, "height": 400})).unwrap();
|
||||
if !shown {
|
||||
crate::menus::run_ui_command(&mut app, "window.helpBar", &serde_json::Value::Null).unwrap().unwrap();
|
||||
}
|
||||
let mut h = egui_kittest::Harness::builder()
|
||||
.with_size(egui::vec2(1000.0, 700.0))
|
||||
.with_accessibility_check(false)
|
||||
.wgpu()
|
||||
.build_ui_state(|ui, app: &mut crate::VectorcraftApp| app.ui(ui), app);
|
||||
h.run_steps(6);
|
||||
h.render().unwrap().save(dir.join(if shown { "help-visible.png" } else { "help-hidden.png" })).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn hints_name_keys_as_the_menus_do() {
|
||||
let text = |tool: &str| super::hint_segments(tool).into_iter().map(|(s, _)| s).collect::<String>();
|
||||
@@ -1946,7 +2008,8 @@ fn menus_stop_above_a_control_bar_docked_at_the_bottom() {
|
||||
let ctx = egui::Context::default();
|
||||
let screen = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(800.0, 600.0));
|
||||
let floor = |app: &mut crate::VectorcraftApp, status: bool, bottom: bool, screen_mode: u8| {
|
||||
(app.ui.status_bar, app.ui.control_bar, app.ui.control_bar_bottom, app.ui.screen_mode) = (status, true, bottom, screen_mode);
|
||||
(app.ui.status_bar, app.ui.help_bar, app.ui.control_bar, app.ui.control_bar_bottom, app.ui.screen_mode) =
|
||||
(status, status, true, bottom, screen_mode);
|
||||
for _ in 0..3 {
|
||||
let mut out = ctx.run_ui(egui::RawInput { screen_rect: Some(screen), ..Default::default() }, |ui| {
|
||||
app.logic(ui.ctx());
|
||||
|
||||
@@ -6310,6 +6310,7 @@ breakText Glyphs Глифи
|
||||
Create Swatch Legend Създаване на легенда на образците
|
||||
Create Swatch Legend… Създаване на легенда на образците…
|
||||
HEX HEX
|
||||
Help Bar Лента за помощ
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Инструменти за текст
|
||||
Text Tweaker… Настройка на текста…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6359,6 +6359,7 @@ shape Open Otvoren
|
||||
Create Swatch Legend Kreiraj legendu uzoraka boja
|
||||
Create Swatch Legend… Kreiraj legendu uzoraka boja…
|
||||
HEX HEX
|
||||
Help Bar Traka pomoći
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Alati za tekst
|
||||
Text Tweaker… Podešavanje teksta…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6488,6 +6488,7 @@ breakText Glyphs Glifs
|
||||
Create Swatch Legend Crea una llegenda de mostres
|
||||
Create Swatch Legend… Crea una llegenda de mostres…
|
||||
HEX HEX
|
||||
Help Bar Barra d’ajuda
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Eines de text
|
||||
Text Tweaker… Ajustador de text…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6506,6 +6506,7 @@ breakText Glyphs Glyfy
|
||||
Create Swatch Legend Vytvořit legendu vzorníku
|
||||
Create Swatch Legend… Vytvořit legendu vzorníku…
|
||||
HEX HEX
|
||||
Help Bar Panel nápovědy
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Nástroje textu
|
||||
Text Tweaker… Ladění textu…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6324,6 +6324,7 @@ breakText Glyphs Glyffer
|
||||
Create Swatch Legend Opret farveprøveforklaring
|
||||
Create Swatch Legend… Opret farveprøveforklaring…
|
||||
HEX HEX
|
||||
Help Bar Hjælpelinje
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Tekstværktøjer
|
||||
Text Tweaker… Tekstjustering…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6092,6 +6092,7 @@ breakText Glyphs Glyphen
|
||||
Create Swatch Legend Farbfeldlegende erstellen
|
||||
Create Swatch Legend… Farbfeldlegende erstellen…
|
||||
HEX HEX
|
||||
Help Bar Hilfeleiste
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Textwerkzeuge
|
||||
Text Tweaker… Text-Tweaker…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6458,6 +6458,7 @@ breakText Glyphs Γλύφοι
|
||||
Create Swatch Legend Δημιουργία υπομνήματος δειγμάτων χρωμάτων
|
||||
Create Swatch Legend… Δημιουργία υπομνήματος δειγμάτων χρωμάτων…
|
||||
HEX HEX
|
||||
Help Bar Γραμμή βοήθειας
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Εργαλεία κειμένου
|
||||
Text Tweaker… Ρύθμιση κειμένου…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 168 and column 5.
|
@@ -6448,6 +6448,7 @@ breakText Glyphs Glifos
|
||||
Create Swatch Legend Crear leyenda de muestras
|
||||
Create Swatch Legend… Crear leyenda de muestras…
|
||||
HEX HEX
|
||||
Help Bar Barra de ayuda
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Herramientas de texto
|
||||
Text Tweaker… Ajustador de texto…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6536,6 +6536,7 @@ breakText Glyphs Merkit
|
||||
Create Swatch Legend Luo värimallien selite
|
||||
Create Swatch Legend… Luo värimallien selite…
|
||||
HEX HEX
|
||||
Help Bar Ohjepalkki
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Tekstityökalut
|
||||
Text Tweaker… Tekstin säätö…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6501,6 +6501,7 @@ breakText Glyphs Glyphes
|
||||
Create Swatch Legend Créer une légende des nuances
|
||||
Create Swatch Legend… Créer une légende des nuances…
|
||||
HEX HEX
|
||||
Help Bar Barre d’aide
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Outils de texte
|
||||
Text Tweaker… Ajusteur de texte…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -2053,6 +2053,7 @@ antiAlias Sharp शार्प
|
||||
Help सहायता
|
||||
Help › Search Commands… मदद › खोज कमांड…
|
||||
HEX HEX
|
||||
Help Bar मदद बार
|
||||
Hex by Column कॉलम द्वारा हेक्स
|
||||
Hex by Row पंक्ति द्वारा हेक्स
|
||||
Hexagon षट्भुज
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -6490,6 +6490,7 @@ breakText Glyphs Glifák
|
||||
Create Swatch Legend Színmintajelmagyarázat létrehozása
|
||||
Create Swatch Legend… Színmintajelmagyarázat létrehozása…
|
||||
HEX HEX
|
||||
Help Bar Súgósáv
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Szövegeszközök
|
||||
Text Tweaker… Szöveghangoló…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6324,6 +6324,7 @@ breakText Glyphs Glif
|
||||
Create Swatch Legend Buat Legenda Swatch
|
||||
Create Swatch Legend… Buat Legenda Swatch…
|
||||
HEX HEX
|
||||
Help Bar Bilah Bantuan
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Alat Teks
|
||||
Text Tweaker… Penyetel Teks…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2286 and column 5.
|
@@ -6126,6 +6126,7 @@ breakText Glyphs Glifi
|
||||
Create Swatch Legend Crea legenda campioni
|
||||
Create Swatch Legend… Crea legenda campioni…
|
||||
HEX HEX
|
||||
Help Bar Barra della guida
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Strumenti testo
|
||||
Text Tweaker… Regolatore testo…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6191,6 +6191,7 @@ breakText Glyphs 字形
|
||||
Create Swatch Legend スウォッチの凡例を作成
|
||||
Create Swatch Legend… スウォッチの凡例を作成…
|
||||
HEX HEX
|
||||
Help Bar ヘルプバー
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools テキストツール
|
||||
Text Tweaker… テキストの調整…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6504,6 +6504,7 @@ breakText Glyphs გლიფები
|
||||
Create Swatch Legend ფერის ნიმუშების ლეგენდის შექმნა
|
||||
Create Swatch Legend… ფერის ნიმუშების ლეგენდის შექმნა…
|
||||
HEX HEX
|
||||
Help Bar დახმარების ზოლი
|
||||
Check for Updates… განახლებების შემოწმება…
|
||||
VectorCraft Updates VectorCraft-ის განახლებები
|
||||
Preparing the image… გამოსახულების მომზადება…
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -6087,6 +6087,7 @@ breakText Glyphs 글리프
|
||||
Create Swatch Legend 견본 범례 만들기
|
||||
Create Swatch Legend… 견본 범례 만들기…
|
||||
HEX HEX
|
||||
Help Bar 도움말 표시줄
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools 텍스트 도구
|
||||
Text Tweaker… 텍스트 조정…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6375,6 +6375,7 @@ breakText Glyphs Glyphs
|
||||
Create Swatch Legend Stalenlegenda maken
|
||||
Create Swatch Legend… Stalenlegenda maken…
|
||||
HEX HEX
|
||||
Help Bar Helpbalk
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Teksthulpmiddelen
|
||||
Text Tweaker… Tekst bijstellen…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6361,6 +6361,7 @@ breakText Glyphs Glify
|
||||
Create Swatch Legend Utwórz legendę próbek
|
||||
Create Swatch Legend… Utwórz legendę próbek…
|
||||
HEX HEX
|
||||
Help Bar Pasek pomocy
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Narzędzia tekstu
|
||||
Text Tweaker… Strojenie tekstu…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6579,6 +6579,7 @@ swatch Yellow Green Verde-amarelado
|
||||
Create Swatch Legend Criar Legenda de Amostras
|
||||
Create Swatch Legend… Criar Legenda de Amostras…
|
||||
HEX HEX
|
||||
Help Bar Barra de ajuda
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Ferramentas de texto
|
||||
Text Tweaker… Ajustador de texto…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -6595,6 +6595,7 @@ breakText Glyphs Глифы
|
||||
digits Hindi Хинди
|
||||
font-script Japanese Японский
|
||||
shape Open Открытый
|
||||
Help Bar Панель подсказок
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Инструменты текста
|
||||
Text Tweaker… Настройка текста…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6562,6 +6562,7 @@ breakText Glyphs Glyfer
|
||||
# The strings the report listed as missing for sv.
|
||||
Font Size: Teckenstorlek:
|
||||
digits Hindi Hindi
|
||||
Help Bar Hjälpfält
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Textverktyg
|
||||
Text Tweaker… Textjustering…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -6463,6 +6463,7 @@ breakText Glyphs Glifler
|
||||
Create Swatch Legend Renk Örneği Açıklaması Oluştur
|
||||
Create Swatch Legend… Renk Örneği Açıklaması Oluştur…
|
||||
HEX HEX
|
||||
Help Bar Yardım Çubuğu
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Metin Araçları
|
||||
Text Tweaker… Metin Ayarlayıcı…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -6106,6 +6106,7 @@ breakText Glyphs Гліфи
|
||||
Create Swatch Legend Створити легенду зразків
|
||||
Create Swatch Legend… Створити легенду зразків…
|
||||
HEX HEX
|
||||
Help Bar Панель підказок
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Інструменти тексту
|
||||
Text Tweaker… Налаштування тексту…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 182 and column 5.
|
@@ -6107,6 +6107,7 @@ breakText Glyphs Glyph
|
||||
Create Swatch Legend Tạo chú giải mẫu màu
|
||||
Create Swatch Legend… Tạo chú giải mẫu màu…
|
||||
HEX HEX
|
||||
Help Bar Thanh trợ giúp
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools Công cụ văn bản
|
||||
Text Tweaker… Tinh chỉnh văn bản…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 204 and column 5.
|
@@ -6347,6 +6347,7 @@ breakText Glyphs 字形
|
||||
Create Swatch Legend 创建色板图例
|
||||
Create Swatch Legend… 创建色板图例…
|
||||
HEX HEX
|
||||
Help Bar 帮助栏
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools 文字工具
|
||||
Text Tweaker… 文字微调…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -6144,6 +6144,7 @@ breakText Glyphs 字符
|
||||
Create Swatch Legend 建立色票圖例
|
||||
Create Swatch Legend… 建立色票圖例…
|
||||
HEX HEX
|
||||
Help Bar 說明列
|
||||
# Type Tools add-on (Object › Plug-ins › Type Tools).
|
||||
Type Tools 文字工具
|
||||
Text Tweaker… 文字微調…
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -44,10 +44,12 @@ impl UiState {
|
||||
pub fn read_preferences(bytes: &[u8]) -> Option<ReadPreferences> {
|
||||
let mut saved: Value = serde_json::from_slice(bytes).ok()?;
|
||||
let fields = saved.as_object_mut()?;
|
||||
help_bar_visibility(fields, "status_bar", "help_bar");
|
||||
let mut intact = recover(fields, Keys::SNAKE);
|
||||
for key in ["custom_workspaces", "workspace_changes"] {
|
||||
if let Some(Value::Array(workspaces)) = fields.get_mut(key) {
|
||||
for workspace in workspaces.iter_mut().filter_map(Value::as_object_mut) {
|
||||
help_bar_visibility(workspace, "statusBar", "helpBar");
|
||||
intact &= recover(workspace, Keys::CAMEL);
|
||||
}
|
||||
}
|
||||
@@ -58,6 +60,15 @@ impl UiState {
|
||||
}
|
||||
}
|
||||
|
||||
/// Older layouts used status-bar visibility for both bottom bars. Preserve that choice until
|
||||
/// the layout has an independent Help Bar setting.
|
||||
fn help_bar_visibility(fields: &mut Map<String, Value>, status: &str, help: &str) {
|
||||
if !fields.contains_key(help) {
|
||||
let visible = fields.get(status).and_then(Value::as_bool).unwrap_or(true);
|
||||
fields.insert(help.into(), Value::Bool(visible));
|
||||
}
|
||||
}
|
||||
|
||||
/// The JSON keys of the docking fields: `UiState` is snake_case, [`Workspace`] camelCase.
|
||||
struct Keys {
|
||||
hidden: &'static str,
|
||||
|
||||
@@ -14,6 +14,26 @@ fn read(saved: &Value) -> ReadPreferences {
|
||||
UiState::read_preferences(&serde_json::to_vec(saved).unwrap()).unwrap()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn legacy_help_bar_visibility_follows_each_layouts_status_bar() {
|
||||
let prefs = read(&json!({
|
||||
"status_bar": false,
|
||||
"custom_workspaces": [{"name":"Hidden", "statusBar": false}, {"name":"Shown", "statusBar":true}],
|
||||
"workspace_changes": [{"name":"Changed", "statusBar":false}]
|
||||
}));
|
||||
assert!(!prefs.ui.help_bar);
|
||||
assert!(!prefs.ui.custom_workspaces[0].help_bar);
|
||||
assert!(prefs.ui.custom_workspaces[1].help_bar);
|
||||
assert!(!prefs.ui.workspace_changes[0].help_bar);
|
||||
assert!(read(&json!({})).ui.help_bar);
|
||||
for (status, help) in [(true, false), (false, true)] {
|
||||
let prefs = read(&json!({"status_bar":status, "help_bar":help,
|
||||
"custom_workspaces":[{"name":"Explicit", "statusBar":status, "helpBar":help}]}));
|
||||
assert_eq!(prefs.ui.help_bar, help);
|
||||
assert_eq!(prefs.ui.custom_workspaces[0].help_bar, help);
|
||||
}
|
||||
}
|
||||
|
||||
/// The dock of a layout in the current shape: the canvas beside a dock at the end edge.
|
||||
fn dock(layout: &Layout<String>) -> &[Column<String>] {
|
||||
assert!(docking::valid(layout), "{layout:?}");
|
||||
|
||||
@@ -449,6 +449,7 @@ fn run_ui_part5(app: &mut VectorcraftApp, id: &str, p: &Value) -> Option<Result<
|
||||
Ok(Value::Null)
|
||||
}
|
||||
"window.control" => flag(&mut app.ui.control_bar),
|
||||
"window.helpBar" => flag(&mut app.ui.help_bar),
|
||||
// The Control bar's panel menu and gripper: the edge of the window the bar docks to.
|
||||
"window.control.dock" => {
|
||||
let key = "edge";
|
||||
|
||||
@@ -59,6 +59,7 @@ pub fn checked(app: &VectorcraftApp, id: &str, p: &Value) -> Option<bool> {
|
||||
// a document no item is checked.
|
||||
"view.rotate" => app.view().zip(p.get("angle").and_then(Value::as_f64)).is_some_and(|(view, a)| (view.rotation - a).abs() < 1e-9),
|
||||
"window.control" => app.ui.control_bar,
|
||||
"window.helpBar" => app.ui.help_bar,
|
||||
"window.control.dock" => {
|
||||
p.get("edge").and_then(Value::as_str) == Some(crate::chrome::CONTROL_BAR_EDGES[usize::from(app.ui.control_bar_bottom)])
|
||||
}
|
||||
|
||||
@@ -1,6 +1,29 @@
|
||||
use super::*;
|
||||
use crate::theme;
|
||||
|
||||
#[test]
|
||||
fn help_bar_toggle_is_independent_and_saved_in_workspaces() {
|
||||
let mut app = VectorcraftApp::new(vectorcraft_engine::Session::new(), crate::Services::default());
|
||||
assert!(app.ui.help_bar);
|
||||
assert_eq!(checked(&app, "window.helpBar", &Value::Null), Some(true));
|
||||
assert_eq!(run_ui_command(&mut app, "window.helpBar", &Value::Null).unwrap().unwrap(), json!(false));
|
||||
assert!(app.ui.status_bar);
|
||||
assert_eq!(checked(&app, "window.helpBar", &Value::Null), Some(false));
|
||||
let saved = crate::workspaces::capture(&app.ui, "No help");
|
||||
let saved: crate::workspaces::Workspace = serde_json::from_value(serde_json::to_value(saved).unwrap()).unwrap();
|
||||
app.ui.help_bar = true;
|
||||
app.ui.status_bar = false;
|
||||
crate::workspaces::apply(&mut app.ui, &saved);
|
||||
assert!(!app.ui.help_bar && app.ui.status_bar);
|
||||
assert_eq!(run_ui_command(&mut app, "window.helpBar", &Value::Null).unwrap().unwrap(), json!(true));
|
||||
let legacy: crate::workspaces::Workspace = serde_json::from_value(json!({"name":"Old workspace"})).unwrap();
|
||||
assert!(legacy.help_bar);
|
||||
let restored: crate::state::UiState = serde_json::from_value(serde_json::to_value(&app.ui).unwrap()).unwrap();
|
||||
assert!(restored.help_bar);
|
||||
let (_, window) = menu_tree().into_iter().find(|(title, _)| *title == "Window").unwrap();
|
||||
assert!(window.iter().any(|item| matches!(item, Item::Cmd("Help Bar", "window.helpBar", _))));
|
||||
}
|
||||
|
||||
/// One headless frame of the in-window menu bar; returns its titles (left to right) as
|
||||
/// (rect, id of the title's popup).
|
||||
fn bar_frame(app: &mut VectorcraftApp, ctx: &egui::Context, events: Vec<egui::Event>) -> Vec<(egui::Rect, egui::Id)> {
|
||||
|
||||
@@ -623,6 +623,7 @@ pub fn menu_tree_named(english_names: bool) -> Vec<(&'static str, Vec<Item>)> {
|
||||
sub("Workspace", crate::workspaces::menu_items()),
|
||||
Sep,
|
||||
c("Control", "window.control"),
|
||||
c("Help Bar", "window.helpBar"),
|
||||
c("Contextual Task Bar", "window.taskBar"),
|
||||
c("Tools", "window.toolbar"),
|
||||
sub("Toolbars", crate::custom_toolbars::menu_items()),
|
||||
|
||||
@@ -453,6 +453,7 @@ pub const UI_COMMANDS: &[(&str, &str, &str, &str)] = &[
|
||||
),
|
||||
("view.rotateReset", "Reset Rotate View", "Cmd+Shift+1", "{}"),
|
||||
("window.control", "Control", "", "{}"),
|
||||
("window.helpBar", "Help Bar", "", "{} toggle the tool-help strip independently of the status bar; returns the new visibility"),
|
||||
(
|
||||
"window.control.dock",
|
||||
"Dock Control Bar",
|
||||
|
||||
@@ -472,6 +472,7 @@ pub struct UiState {
|
||||
#[serde(default)]
|
||||
pub tools_beside_canvas: bool,
|
||||
pub status_bar: bool,
|
||||
pub help_bar: bool,
|
||||
pub dock: bool,
|
||||
/// The bars that Tab (`window.dock`) hid, which the next Tab shows again; none when Tab has not
|
||||
/// hidden them since it last showed them, or a workspace was applied since.
|
||||
@@ -1008,6 +1009,7 @@ impl Default for UiState {
|
||||
toolbar_pos: None,
|
||||
tools_beside_canvas: false,
|
||||
status_bar: true,
|
||||
help_bar: true,
|
||||
dock: true,
|
||||
tab_hid: None,
|
||||
view: ViewFlags::default(),
|
||||
|
||||
@@ -35,6 +35,7 @@ pub struct Workspace {
|
||||
pub dock_collapsed: bool,
|
||||
pub open_panel: Option<String>,
|
||||
pub status_bar: bool,
|
||||
pub help_bar: bool,
|
||||
/// Tool groups torn off the toolbar into floating strips (built-in workspaces: none).
|
||||
pub floating_flyouts: Vec<FloatingFlyout>,
|
||||
/// Floating panel groups in workspaces saved before the canvas joined `docking`; read only
|
||||
@@ -192,6 +193,7 @@ pub fn capture(ui: &UiState, name: &str) -> Workspace {
|
||||
dock_collapsed: ui.dock_collapsed,
|
||||
open_panel: ui.open_panel.clone(),
|
||||
status_bar: ui.status_bar,
|
||||
help_bar: ui.help_bar,
|
||||
floating_flyouts: ui.floating_flyouts.clone(),
|
||||
floating_panels: Vec::new(),
|
||||
docking: ui.docking.clone(),
|
||||
@@ -221,6 +223,7 @@ pub fn apply(ui: &mut UiState, w: &Workspace) {
|
||||
ui.dock_collapsed = w.dock_collapsed;
|
||||
ui.open_panel = w.open_panel.clone();
|
||||
ui.status_bar = w.status_bar;
|
||||
ui.help_bar = w.help_bar;
|
||||
ui.floating_flyouts = w.floating_flyouts.clone();
|
||||
ui.docking_generation = ui.docking_generation.wrapping_add(1);
|
||||
ui.docking = w.docking.clone().filter(crate::panel_docking::valid);
|
||||
|
||||
@@ -16,6 +16,8 @@ Group Selection keeps an already selected component selected during a drag; a co
|
||||
|
||||
Creating a gradient from solid or empty paint uses the document's color model for its default stops, including drawing its vector with the Gradient tool. Explicit `keepModel: true` retains RGB defaults, and existing gradients keep their own colors. Scores and estimates are unchanged.
|
||||
|
||||
Window → Help Bar toggles the bottom tool-help strip independently of the status bar. Its visibility is saved with workspaces and UI preferences; Presentation Mode hides both bars. Scores and estimates are unchanged.
|
||||
|
||||
The closed font-family fields in Character, Properties and Control now accept the
|
||||
mouse wheel for selected text (#5253). Each effective notch applies one family and
|
||||
adds one undo step; the list follows saved font filters, ignores search text, and
|
||||
@@ -53,6 +55,7 @@ Artboard Options forwards the active Artboard tool's Scale Artwork with Artboard
|
||||
| 2026-11-05 | minor | G12: Hyphenation › Default Language sets the language of new type unless Document Setup chose one, stored as a tag; each run hyphenates in its own language, English only so far, so 2 Preferences options stay unused (#394) |
|
||||
| 2026-11-05 | minor | Compound Shapes add-on (beyond Illustrator): Object › Plug-ins › Compound Shapes lists Make, Release and Expand Compound Shape, and holds a setting, off by default, that makes the Pathfinder panel's Shape Mode buttons make a compound shape on a click and give the permanent result on Alt-click (the default is the reverse). Selected members of a compound shape always take the clicked mode. The setting is `window.pathfinder.compoundShapes`; no existing behavior changes while it is off. Scores and estimates unchanged. |
|
||||
| 2026-11-03 | minor | New gradients use CMYK default stops in CMYK documents, including Gradient tool creation. Scores and estimates unchanged. |
|
||||
| 2026-11-03 | minor | Help Bar has its own Window menu toggle and workspace visibility setting. Scores and estimates unchanged. |
|
||||
| 2026-11-02 | minor | Font-family fields step selected text with the mouse wheel (#5253); no scored gap or estimate reassessed. |
|
||||
| 2026-10-24 | minor | G12: General › Corner Radius is the Rounded Rectangle tool's radius, a change while the tool is active reaches it, and the radius ↑/↓ set while drawing (or a Tool Options value) becomes the preference, within 0–1296 pt (#394, `crates/engine/src/tests/constrain_tools.rs`); no entry closed, estimate unchanged. |
|
||||
| 2026-10-22 | minor | Reconcile upstream documentation after review F-3; preserve every dated revision and the original scaleArt runtime evidence without repeating completed jobs. |
|
||||
|
||||
+4
-1
@@ -16,6 +16,8 @@ Group Selection keeps an already selected component selected during a drag; a co
|
||||
|
||||
Creating a gradient from solid or empty paint uses the document's color model for its default stops, including drawing its vector with the Gradient tool. Explicit `keepModel: true` retains RGB defaults, and existing gradients keep their own colors. Scores and estimates are unchanged.
|
||||
|
||||
Window → Help Bar toggles the bottom tool-help strip independently of the status bar. Its visibility is saved with workspaces and UI preferences; Presentation Mode hides both bars. Scores and estimates are unchanged.
|
||||
|
||||
**Feature evidence last updated:** 2026-11-03.
|
||||
|
||||
M1 selection: Enclosing Lasso selects whole objects enclosed by a freehand loop. It is an add-on
|
||||
@@ -53,6 +55,7 @@ M7 type: Touch Type moves a right-to-left character along its line and up from i
|
||||
| 2026-11-04 | minor | New Document: the units chosen in Preset Details belong to the chosen preset; Recent and Saved cards keep the units their document or preset was made in, and the built-in tabs still follow the chosen units (#2078). Scores and estimates unchanged. |
|
||||
| 2026-11-03 | minor | M1: Enclosing Lasso provides whole-object enclosure selection as an add-on with no default shortcut or Basic toolbar slot; estimates unchanged. |
|
||||
| 2026-11-03 | minor | New gradients use CMYK default stops in CMYK documents, including Gradient tool creation. Scores and estimates unchanged. |
|
||||
| 2026-11-03 | minor | Help Bar has its own Window menu toggle and workspace visibility setting. Scores and estimates unchanged. |
|
||||
| 2026-10-30 | minor | M4: G9: `.ai`/EPS editing data: a blend takes the transparency (opacity, blend mode, knockout) in its state block after its record, so its steps knock each other out as the page draws them; a user's file comes in 0.6% from its page instead of 1.3%. Scores and estimates unchanged. |
|
||||
| 2026-10-30 | minor | M4: File formats: `.ai`/EPS editing-data fidelity from an audit of a user's files: All Caps and Small Caps (#4708); placed files at their box's corner, kept where they draw closer to the page (#4664, #4723, #4742); pages cropped to the art, with `UserUnit` (#4658, #4727); gradient mesh corners with handle weights of 0 and the state written after a mesh (#4738, #4744, #4748); type on a path spaced as the file lays it out (#4743); synthetic regressions in `crates/eps`; scores and estimates unchanged. |
|
||||
| 2026-11-03 | minor | M7: Find Font replacement sources Document, Recent and System are shipped (#5217); estimates unchanged. |
|
||||
@@ -148,7 +151,7 @@ native wording review, layout checks and a web Devanagari font remain. [Notes](l
|
||||
| M12 | Advanced color & art (CMYK/ICC, separations, Gradient Mesh, Live Paint, Image Trace, Graphs) | 🟡 Gradient Mesh, Live Paint, Image Trace (junction-returning pieces retain their positioned boundaries; a simpler contour walk with identical output; an edge's sub-pixel shift is the same from either side; notches read only their own piece; collapsed loops keep few segments; large images trace with a warning; Auto Color keeps rare distinct colours; quick presets trace at once and the Image Trace button opens the adjustment controls; Properties reopens them; tiny fitted contours retain islands and holes; Create Strokes: exact crop EDT, Guo–Hall thinning and maximal-disc graph simplification; 15 presets, the 14 documented ones each with an enhanced version; Ignore Color, Shapes, Auto Grouping and Gradients options; measured in `image-trace-quality.md`; closed outlines retain their interior after straightening; the Flat Logo mode places edges to a fraction of a pixel, restores sharp corners, snaps lines and circles, and refuses gradients; live trace result bounds and selection highlights exclude the retained bitmap except in source-image views), Recolor Artwork, colour management (ICC, soft proofing, separations preview), Graphs (all 9 tools, Graph Data/Type, group-selected series colours persist through regenerate/save/open) done; Graph Design and Marker designs, Transpose and Switch x/y, `\|` label line breaks, the pie options, drop shadows, the legend across the top, overlapping widths, First Row/Column in Front, filled lines, kept label formatting and the Graph Data worksheet done; graph Column designs pending | 6–10 |
|
||||
| M13 | Automation (Actions ✅ record/playback, persisted; variables, scripting, batch) | 🟡 MCP `add_text` exposes existing vertical point, area and path type; broader scripting and batch work remains | 18–27 |
|
||||
| M13 | Automation (Actions ✅ record/playback, persisted; variables, scripting, batch) | 🟡 | 18–27 |
|
||||
| M14 | 1.0 polish (preferences, shortcut editor, workspaces, accessibility, packaging for all OSes) (status messages and readouts use stable responsive allocations sized for localized labels and ordinary coordinates; sample widths cached by language/unit/DPI; regression-tested and contributor-confirmed 2026-10-19; estimates unchanged) | 🟡 Dock groups collapse to their tabs by a double-click on a tab (UI.8); Preferences › General › Constrain Angle acts for the arrow keys, Shift drags and new objects (#394, 2026-10-21); numeric-field pointer selection and focus regression-tested (#1326, in part; short movements still select all); RPM runtime capabilities and glibc floor checked (#1275; real-distro install/start-up pending), Eyedropper cursor with precise-setting checks (#1269), Preferences, shortcut editor (chords with Shift and a punctuation key fire as typed; other apps' text shortcut sets imported), workspaces (each keeps its layout changes until Reset <name>, UI.7), panels docked by dragging into any dock group (as tabs or a top/bottom split) or into the icon column, and closed from a dock tab's context menu (UI.6), a custom title bar on Windows/Linux with a Home button, content-sized dialogs, menus that scroll when longer than the window and macOS native menu dismissal done (M14.8), and native macOS save sheets with a Format menu (#866); titled PDF exports set `DisplayDocTitle` for viewers and accessibility checkers (#3646); accessibility and broader Windows/Linux packaging/QA pending | 18–28 |
|
||||
| M14 | 1.0 polish (preferences, shortcut editor, workspaces, accessibility, packaging for all OSes) (status messages and readouts use stable responsive allocations sized for localized labels and ordinary coordinates; sample widths cached by language/unit/DPI; regression-tested and contributor-confirmed 2026-10-19; estimates unchanged) | 🟡 Dock groups collapse to their tabs by a double-click on a tab (UI.8); Preferences › General › Constrain Angle acts for the arrow keys, Shift drags and new objects (#394, 2026-10-21); numeric-field pointer selection and focus regression-tested (#1326, in part; short movements still select all); RPM runtime capabilities and glibc floor checked (#1275; real-distro install/start-up pending), Eyedropper cursor with precise-setting checks (#1269), Preferences, shortcut editor (chords with Shift and a punctuation key fire as typed; other apps' text shortcut sets imported), workspaces (each keeps its layout changes until Reset <name>, UI.7), Window › Help Bar shown or hidden apart from the status bar and kept in saved workspaces, panels docked by dragging into any dock group (as tabs or a top/bottom split) or into the icon column, and closed from a dock tab's context menu (UI.6), a custom title bar on Windows/Linux with a Home button, content-sized dialogs, menus that scroll when longer than the window and macOS native menu dismissal done (M14.8), and native macOS save sheets with a Format menu (#866); titled PDF exports set `DisplayDocTitle` for viewers and accessibility checkers (#3646); accessibility and broader Windows/Linux packaging/QA pending | 18–28 |
|
||||
| — | Interaction fidelity pass (every tool's modifiers, Properties panel per context, isolation, nuance; width-point creation and adjoining adjustment regression-tested; dialog layout reviewed) | ⬜ (new ruler-guide Alt orientation implemented; existing-guide Escape cancellation regression-tested; broader pass remains) | 60–90 |
|
||||
| — | Hardening at scale (big-file corpus, fuzzing, cross-platform + browser QA) | 🟡 PngSuite integrity and bounded fetching verified (#1729); real-world corpus/manual QA remain | 50–80 |
|
||||
| M14 follow-up | Color Picker layout (#2008) | ✅ Compact controls, centered header, stacked actions, aligned fields and screen sampling; narrow windows scroll vertically | Included above |
|
||||
|
||||
@@ -22,6 +22,8 @@ Creating a gradient from solid or empty paint uses the document's color model fo
|
||||
|
||||
**Feature evidence last updated:** 2026-11-05.
|
||||
|
||||
Window → Help Bar toggles the bottom tool-help strip independently of the status bar. Its visibility is saved with workspaces and UI preferences; Presentation Mode hides both bars. Scores and estimates are unchanged.
|
||||
|
||||
The shared assessment status line and revision history are current upstream; this dated section records the submission's feature evidence and revisions without rescoring upstream or claiming a new combined build or runtime measurement.
|
||||
|
||||
- Current-main conflict reconciliation retains upstream and feature behavior; scores and estimates unchanged
|
||||
@@ -86,6 +88,7 @@ Artboard Options forwards the active Artboard tool's Scale Artwork with Artboard
|
||||
| 2026-11-03 | minor | New gradients use CMYK default stops in CMYK documents, including Gradient tool creation. Scores and estimates unchanged. |
|
||||
| 2026-11-03 | minor | Type Tools add-on: Text Tweaker (a VectorCraft addition, #4924): evidence added; scores unchanged. |
|
||||
| 2026-11-03 | minor | Transform previews valid typed values while numeric fields remain focused. Effect dialogs use the object, group, or layer targeted in Appearance. |
|
||||
| 2026-11-03 | minor | Help Bar has its own Window menu toggle and workspace visibility setting. Scores and estimates unchanged. |
|
||||
| 2026-11-02 | minor | Legacy `.ai` saves (version 7) write type with rotated characters as outlines that keep each character's rotation, with a warning unless `outlineText` is on (#5186); scores unchanged. |
|
||||
| 2026-11-03 | minor | Record shipped Find Font replacement sources: Document, Recent and System (#5217); scores and estimates unchanged. |
|
||||
| 2026-10-31 | minor | Object › Path › Smooth smooths a path along its length before refitting it, so Auto-Smooth takes a shaky line to one smooth curve instead of leaving its jags, and with anchor points direct-selected it smooths only that section; scores unchanged. |
|
||||
@@ -720,6 +723,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
|
||||
- Window › Toolbars › Manage Toolbars… and Manage Toolbars… in the All Tools drawer's menu open a dialog that lists the toolbars made with New Toolbar: a new name typed for the selected toolbar renames it, + copies it with its tools (with none selected, + makes a blank toolbar), and the trash can deletes it. Each change shows under Window › Toolbars and stays in the workspace (<https://helpx.adobe.com/illustrator/using/tools.html>; `window.toolbar.manage`, `window.toolbar.rename`, `window.toolbar.duplicate`, `window.toolbar.delete`; `manage_toolbars_renames_duplicates_and_deletes`).
|
||||
- Window › Toolbars › Keep Tools Beside the Canvas, a VectorCraft layout option that is off by default, docks the Tools panel between left-side panels and the canvas instead of at the window's left edge; the canvas's left edge then also docks a floating Tools panel, and workspaces keep the setting. Scores are unchanged (`window.toolsBesideCanvas`; `docked_tools_keep_the_window_edge_unless_kept_beside_the_canvas`, `tools_redock_at_the_targets_of_the_chosen_placement`).
|
||||
- Hindi (2026-11-06): Hindi (`hi`): 7,877-row machine-assisted catalog, zero/one singular plurals, desktop font fallback and optional Devanagari craft-fonts fallback; all 55 translation tests pass; native review and a web font remain; scores and estimates unchanged. [Terminology and limitations](localization-hi.md).
|
||||
- Window › Help Bar shows or hides the tool-help strip at the bottom of the window apart from the status bar (`window.helpBar`). Each setting is kept with the UI preferences and in saved workspaces, and Presentation Mode hides both bars. Layouts saved before the setting existed show the Help Bar where they show the status bar (`help_bar_toggle_is_independent_and_saved_in_workspaces`, `help_bar_and_status_bar_render_independently`, `legacy_help_bar_visibility_follows_each_layouts_status_bar`, `a_help_bar_setting_the_file_lacks_is_saved`).
|
||||
- Czech render-site labels: desktop/web file filters, diagnostics, suggested preset names and contributor tooltips/plurals now use catalog lookups; gradients have Czech adjective agreement and printer marks have a separate context (PDF/Print and Summary). Search, Home, toolbar/panel tooltips and Preferences already look up their labels. Every complete catalog has rows for these labels and for the Roman and Japanese printer mark styles. Evidence: `i18n::tests::czech_render_site_follow_up`, `i18n::tests::complete_catalogs_translate_render_site_labels`, `dialogs::tests_modal::printer_mark_labels_are_distinct_from_language_names`; see [localization-parity.md](localization-parity.md).
|
||||
- The History panel, Edit › Undo and Edit › Redo translate the names of the steps that apply or redefine a character or paragraph style and of the step that redefines a graphic style: each such step keeps its template (`Apply {name}`, `Redefine {name}`, `Redefine Graphic Style “{name}”`) and the style's name, every complete catalog has a row for each template, and the panel and the menu show the style's name as the document holds it, except the Normal styles' names, which they show in the interface language (`steps_named_after_a_style_list_the_template_around_the_name`, `undo_and_redo_name_a_style_step_around_the_style_name`).
|
||||
- Localised UI: menus (in-window and native), panels, dialogs, toolbar and Preferences read from per-language catalogs (`crates/ui-egui/src/i18n`, see `docs/development.md`); Traditional Chinese (Taiwan), Simplified Chinese (mainland), Japanese, Korean, Vietnamese, German, Spanish, French, Italian, Polish, Brazilian Portuguese, Russian, Ukrainian, Georgian and Catalan ship complete, and Czech covers every menu label (and more), with system-locale detection on macOS, Windows, Linux and the web (the browser's languages, or `?lang=`), a Language preference and, on macOS, a VectorCraft ▸ Language menu. Names are never translated (fonts and their styles, layers, artboards, saved presets, user libraries, custom workspaces, recent files, plug-ins).
|
||||
|
||||
@@ -17,6 +17,8 @@ Group Selection keeps an already selected component selected during a drag; a co
|
||||
|
||||
Creating a gradient from solid or empty paint uses the document's color model for its default stops, including drawing its vector with the Gradient tool. Explicit `keepModel: true` retains RGB defaults, and existing gradients keep their own colors. Scores and estimates are unchanged.
|
||||
|
||||
Window → Help Bar toggles the bottom tool-help strip independently of the status bar. Its visibility is saved with workspaces and UI preferences; Presentation Mode hides both bars. Scores and estimates are unchanged.
|
||||
|
||||
**Feature evidence last updated:** 2026-11-03.
|
||||
|
||||
Enclosing Lasso is an add-on under Object › Plug-ins with its own heading in All Tools. It has
|
||||
@@ -75,6 +77,7 @@ Artboard Options forwards the active Artboard tool's Scale Artwork with Artboard
|
||||
| 2026-11-03 | minor | Enclosing Lasso provides whole-object enclosure selection as an add-on with no default shortcut or Basic toolbar slot. Scores and estimates remain unchanged. |
|
||||
| 2026-11-03 | minor | Transform previews valid typed values while numeric fields remain focused. Effect dialogs use the object, group, or layer targeted in Appearance. |
|
||||
| 2026-11-03 | minor | New gradients use CMYK default stops in CMYK documents, including Gradient tool creation. Scores and estimates unchanged. |
|
||||
| 2026-11-03 | minor | Help Bar has its own Window menu toggle and workspace visibility setting. Scores and estimates unchanged. |
|
||||
| 2026-10-26 | minor | Pencil Fidelity goes down to 0.01 pt (dialog, tool and engine; Smooth keeps 0.05) on a logarithmic slider across the Tool Options row, with hundredths in the field and key steps that fit the range (#3328); scores and estimates unchanged (estimated) |
|
||||
| 2026-10-22 | minor | Reconcile upstream documentation after review F-3; preserve every dated revision and the original scaleArt runtime evidence without repeating completed jobs. |
|
||||
| 2026-10-22 | minor | Reconcile upstream documentation after review F-2; preserve every dated revision and the original scaleArt runtime evidence without repeating completed jobs. |
|
||||
@@ -407,6 +410,7 @@ next unit in the order a right-click on a ruler lists them, from Feet back to Po
|
||||
| SVG Interactivity, Retype, Comments, Version History panels | missing | the last two are cloud features (out of scope) |
|
||||
| Workspaces (save, reset, switch); each remembers the layout changes made in it across switches and restarts until Reset <name> | done | `UiState::workspace_changes` |
|
||||
| Opening a file: after 0.4 s a progress window with the file name, a moving bar (reading counts no steps), how many more files wait, Cancel (Esc: the file doesn't open) and Continue in Background; never over another dialog or progress window | done | #5930; `opening::show`, `file.cancelOpen`, `file.openInBackground`. Save, Place and Close still show only the status bar's spinner (Place and Save run off the UI thread; Close is immediate) |
|
||||
| Window › Help Bar shows or hides the tool-help strip apart from the status bar; kept with the preferences and in saved workspaces; Presentation Mode hides both bars | done | `window.helpBar`; `help_bar_toggle_is_independent_and_saved_in_workspaces`, `help_bar_and_status_bar_render_independently`, `legacy_help_bar_visibility_follows_each_layouts_status_bar` |
|
||||
| Background Export: a progress dialog with the file name, the artboard count and a bar (busy for one artboard and for formats made in one go), Cancel (Esc) and Continue in Background; it opens after 0.4 s and never over another dialog. A cancelled export writes no file | done | #2564; on the shared `vectorcraft_doc::cancel` token (#2546), so a cancelled render keeps no half-drawn pattern tile or effect raster. The bar moves between artboards, not within one. Save As, Export for Screens and Export Selection don't show it yet |
|
||||
| Swatch, graphic style and symbol library panels: each library opens in a panel of its own, several at once, that floats, groups, docks and closes like any panel; opening an open library brings its panel forward; Previous / Next Library change the library in place; the panel menu's Persistent reopens the panel at startup with its view and find field (a library loaded from a file is read again; when its file is missing the panel reopens showing the file's path with Locate Library…, and the status bar names the file) | done | #2603; panel ids `library:<kind>:<id>`, `ui.libraryPanel {panel, library?, view?, showFind?, persistent?}`, `ui.libraryPanel.locate {panel, path?}`; the library panels have no sort option, as before |
|
||||
| DXF export/import preserves intended curve closure | done | #1299; R13–2018 closed SPLINE bit set/read; an open curve ending at its start stays open; knots and control points unchanged; native CIRCLE/ARC export and CNC preset remain pending |
|
||||
|
||||
Reference in New Issue
Block a user