mirror of
https://github.com/storytold/deckcraft.git
synced 2026-10-27 20:16:50 -06:00
Merge PR #675 from NikitkaRa: View: Zoom dialog applies a percent or Fit
# Conflicts: # crates/ui-egui/src/dialogs.rs
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** minor (Create New Theme Fonts; breadth and ready percentages unchanged; previous: hours to ~95% per audience) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (progress log: Alt Text decorative checkbox; breadth stays 79%; previous: minor, hours to ~95%) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (progress log: Hyperlink dialog follows the selection; breadth stays 79%; previous: minor, hours to ~95%) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (progress log: Zoom dialog; breadth stays 79%; previous: minor, hours to ~95%) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
|
||||
DeckCraft aims at full PowerPoint parity, and to be better: faster, open (a documented zip+JSON
|
||||
format plus PPTX), scriptable by agents (CLI, JSON control channel, MCP), and available everywhere
|
||||
@@ -187,6 +188,7 @@ app's JSON control channel (`deckcraft --control PORT`).
|
||||
| 2026-10-14 | Alt Text: Mark as decorative opens checked when the selection already is, so OK no longer clears it |
|
||||
| 2026-10-14 | Insert Hyperlink: address, email, slide and ScreenTip open from the selection, so OK no longer replaces them with `https://` and an empty tip |
|
||||
| 2026-10-14 | Insert › Date and Time: the ribbon and Insert menu open a format list (datetime1–datetime13) with a language and Update automatically. OK inserts one field, or the shown text when Update is off. 28 dialogs; 226 commands. English has every format; en-GB, French, Japanese and Swedish list the numeric date and 24-hour time |
|
||||
| 2026-10-14 | View: the Zoom dialog takes a percent or Fit and applies it on OK. View ▸ Zoom opens it; the arrow still lists the presets |
|
||||
| 2026-10-13 | Slide transitions like PowerPoint: every transition and option measured frame by frame against PowerPoint's video export and retuned (curves, directions, soft edges, 3-D perspective, contents moving over backgrounds); PowerPoint's own XML elements and defaults read and written (diagonal Wipe, Zoom, Shape In/Out, Glitter Hexagons, Shred In/Out, Page Curl Single); `deckcraft-cli render-transition` renders frames headless |
|
||||
| 2026-10-13 | Wild text cases measured against PowerPoint (102 synthetic slides): bidi by run language, East Asian vertical text upright, mongolianVert/wordArtVert/wordArtVertRtl, underline styles and strikethrough at the font's metrics, centre/right/decimal tabs, East Asian, Thai, Hindi, Arabic and Hebrew numbering, small caps, all-caps "ß", transparent text, soft hyphens, kinsoku, rtlCol and just/dist anchoring, emoji presentation, fallback faces that no longer move the baseline |
|
||||
| 2026-10-13 | Render matches PowerPoint more closely on wild shape, picture and table cases: even-odd custom paths, dashes and caps, arrowheads, radial and path gradients, tile rects, rotWithShape, gradient lines, shadows cast by what is drawn (group and perspective too), group fill, picture borders, tiles, reflection, recolour (biLevel, alphaInv, brightness/contrast), table borders and grid default, 20+ preset shapes by their ECMA formulas, default miter joins, and approximate 3-D bevels, cameras and face lighting |
|
||||
@@ -239,6 +241,7 @@ app's JSON control channel (`deckcraft --control PORT`).
|
||||
| 2026-10-14 | trivial | Progress log: Alt Text decorative checkbox |
|
||||
| 2026-10-14 | trivial | Progress log: Hyperlink dialog follows the selection |
|
||||
| 2026-10-14 | trivial | Progress log: Insert › Date and Time dialog (28 dialogs, 226 commands; breadth and readiness unchanged) |
|
||||
| 2026-10-14 | trivial | Progress log: Zoom dialog |
|
||||
| 2026-10-13 | trivial | Progress log: wild text cases |
|
||||
| 2026-10-13 | trivial | Progress log: slide show for interactive decks |
|
||||
| 2026-10-12 | trivial | Progress log: File tab (Backstage, #76) |
|
||||
|
||||
@@ -867,6 +867,67 @@ fn hyperlink_command(mode: &str, url: &str, email: &str, slide: usize, tip: &str
|
||||
}
|
||||
}
|
||||
|
||||
/// Preset percents in the Zoom dialog, largest first.
|
||||
const ZOOM_PRESETS: &[u32] = &[400, 200, 150, 100, 75, 66, 50, 33];
|
||||
|
||||
/// A typed zoom percent as a scale in `0.1..=4` (10%–400%). `None` when it is not a finite number.
|
||||
pub fn parse_zoom_percent(text: &str) -> Option<f32> {
|
||||
let t = text.trim().trim_end_matches('%').trim();
|
||||
if t.is_empty() {
|
||||
return None;
|
||||
}
|
||||
let v = t.parse::<f64>().ok().filter(|n| n.is_finite())?;
|
||||
Some(((v / 100.0) as f32).clamp(0.1, 4.0))
|
||||
}
|
||||
|
||||
/// Zoom dialog: a percent or Fit. Nothing changes until OK.
|
||||
fn zoom_dialog(app: &mut SlideApp, ui: &mut Ui, d: &mut Dialog) -> bool {
|
||||
if !d.fields.contains_key("mode") {
|
||||
let shown = app.ui.zoom.unwrap_or(app.canvas_scale);
|
||||
let pct = if shown.is_finite() { (shown * 100.0).round().clamp(10.0, 400.0) } else { 100.0 };
|
||||
d.fields.insert("mode".into(), if app.ui.zoom.is_none() { "fit".into() } else { "percent".into() });
|
||||
d.fields.insert("percent".into(), format!("{pct:.0}"));
|
||||
}
|
||||
let mut mode = d.get("mode", "percent");
|
||||
let mut percent = d.get("percent", "100");
|
||||
ui.label("Zoom to");
|
||||
if ui.radio(mode == "fit", "Fit").clicked() {
|
||||
mode = "fit".into();
|
||||
}
|
||||
for pct in ZOOM_PRESETS {
|
||||
let on = mode == "percent" && percent == pct.to_string();
|
||||
if ui.radio(on, format!("{pct}%")).clicked() {
|
||||
mode = "percent".into();
|
||||
percent = pct.to_string();
|
||||
}
|
||||
}
|
||||
ui.horizontal(|ui| {
|
||||
ui.label("Percent:");
|
||||
let edit = ui.add(egui::TextEdit::singleline(&mut percent).desired_width(72.0));
|
||||
if edit.changed() {
|
||||
mode = "percent".into();
|
||||
}
|
||||
ui.label("%");
|
||||
});
|
||||
d.fields.insert("mode".into(), mode.clone());
|
||||
d.fields.insert("percent".into(), percent.clone());
|
||||
let (ok, cancel) = buttons(ui, "OK");
|
||||
if ok {
|
||||
if mode == "fit" {
|
||||
app.ui.zoom = None;
|
||||
return true;
|
||||
}
|
||||
match parse_zoom_percent(&percent) {
|
||||
Some(scale) => app.ui.zoom = Some(scale),
|
||||
None => {
|
||||
app.set_status("Enter a zoom percent");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
ok || cancel
|
||||
}
|
||||
|
||||
/// Returns true when the dialog should close.
|
||||
fn body(app: &mut SlideApp, ui: &mut Ui, d: &mut Dialog) -> bool {
|
||||
let run = |app: &mut SlideApp, id: &str, p: Value| {
|
||||
@@ -1086,18 +1147,7 @@ fn body(app: &mut SlideApp, ui: &mut Ui, d: &mut Dialog) -> bool {
|
||||
});
|
||||
done
|
||||
}
|
||||
"zoom" => {
|
||||
for pct in [400, 200, 150, 100, 75, 66, 50, 33] {
|
||||
if ui.radio(false, format!("{pct}%")).clicked() {
|
||||
let _ = app.run("view.zoom", json!({"percent": pct}));
|
||||
}
|
||||
}
|
||||
if ui.button("Fit").clicked() {
|
||||
app.ui.zoom = None;
|
||||
}
|
||||
let (ok, cancel) = buttons(ui, "OK");
|
||||
ok || cancel
|
||||
}
|
||||
"zoom" => zoom_dialog(app, ui, d),
|
||||
"comment" => {
|
||||
let mut v = d.get("text", "");
|
||||
ui.add(egui::TextEdit::multiline(&mut v).hint_text("Start a conversation").desired_rows(4).desired_width(320.0));
|
||||
@@ -2398,3 +2448,25 @@ mod tests {
|
||||
assert_eq!(seed, HyperlinkSeed::blank(), "a caret at the end of the word inserts a new link");
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod zoom_tests {
|
||||
use super::parse_zoom_percent;
|
||||
|
||||
fn near(v: f32, want: f32) -> bool {
|
||||
(v - want).abs() < 1.0e-4
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn zoom_percent_accepts_a_number_and_clamps() {
|
||||
assert!(parse_zoom_percent("150").is_some_and(|v| near(v, 1.5)));
|
||||
assert!(parse_zoom_percent("150%").is_some_and(|v| near(v, 1.5)));
|
||||
assert!(parse_zoom_percent(" 100 ").is_some_and(|v| near(v, 1.0)));
|
||||
assert!(parse_zoom_percent("1").is_some_and(|v| near(v, 0.1)));
|
||||
assert!(parse_zoom_percent("900").is_some_and(|v| near(v, 4.0)));
|
||||
assert!(parse_zoom_percent("").is_none());
|
||||
assert!(parse_zoom_percent("fit").is_none());
|
||||
assert!(parse_zoom_percent("nan").is_none());
|
||||
assert!(parse_zoom_percent("inf").is_none());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,7 +172,8 @@ pub const UI_COMMANDS: &[(&str, &str, Option<&str>, &str)] = &[
|
||||
("view.guides", "Guides", Some("Alt+F9"), "{on?: bool}"),
|
||||
("view.zoomIn", "Zoom In", Some("Cmd+="), "{}"),
|
||||
("view.zoomOut", "Zoom Out", Some("Cmd+-"), "{}"),
|
||||
("view.zoom", "Zoom…", None, "{percent}"),
|
||||
("view.zoom", "Set Zoom", None, "{percent}"),
|
||||
("view.zoomDialog", "Zoom…", None, "{}"),
|
||||
("view.fit", "Fit to Window", None, "{}"),
|
||||
("view.pane", "Task Pane", None, "{pane: format|animation|selection|comments|designer|background|smartart|null}"),
|
||||
("view.tab", "Ribbon Tab", None, "{tab}"),
|
||||
@@ -541,6 +542,7 @@ impl SlideApp {
|
||||
let pct = p.get("percent").and_then(Value::as_f64).ok_or("missing `percent`")?;
|
||||
self.ui.zoom = Some((pct as f32 / 100.0).clamp(0.1, 4.0));
|
||||
}
|
||||
"view.zoomDialog" => self.dialog = Some(dialogs::Dialog::new("zoom")),
|
||||
"view.fit" => self.ui.zoom = None,
|
||||
"view.pane" => {
|
||||
let pane = p.get("pane").and_then(Value::as_str).map(String::from);
|
||||
|
||||
@@ -211,6 +211,7 @@ pub fn menu_tree() -> Vec<(&'static str, Vec<(&'static str, &'static str)>)> {
|
||||
("Gridlines", "view.gridlines"),
|
||||
("Guides", "view.guides"),
|
||||
("-", ""),
|
||||
("Zoom…", "view.zoomDialog"),
|
||||
("Zoom In", "view.zoomIn"),
|
||||
("Zoom Out", "view.zoomOut"),
|
||||
("Fit to Window", "view.fit"),
|
||||
|
||||
@@ -2116,14 +2116,24 @@ fn view(app: &mut SlideApp, ui: &mut Ui) {
|
||||
}
|
||||
});
|
||||
group(ui, |ui| {
|
||||
let r = big_button(ui, Icon::ZoomGlass, "Zoom", true);
|
||||
egui::Popup::menu(&r).show(|ui| {
|
||||
for pct in [400, 200, 150, 100, 75, 66, 50, 33] {
|
||||
if ui.button(format!("{pct}%")).clicked() {
|
||||
let _ = app.run("view.zoom", json!({"percent": pct}));
|
||||
let (main, arrow) = big_button_ex(ui, Icon::ZoomGlass, "Zoom", true, true, false);
|
||||
if main.on_hover_text("Zoom").clicked() {
|
||||
let _ = app.run("view.zoomDialog", json!({}));
|
||||
}
|
||||
if let Some(a) = arrow {
|
||||
egui::Popup::menu(&a).show(|ui| {
|
||||
for pct in [400, 200, 150, 100, 75, 66, 50, 33] {
|
||||
if ui.button(format!("{pct}%")).clicked() {
|
||||
let _ = app.run("view.zoom", json!({"percent": pct}));
|
||||
ui.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
if ui.button("Fit").clicked() {
|
||||
let _ = app.run("view.fit", json!({}));
|
||||
ui.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
if big_button(ui, Icon::FitToWindow, "Fit to\nWindow", true).clicked() {
|
||||
app.ui.zoom = None;
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ pub fn status_bar(app: &mut SlideApp, ui: &mut Ui) {
|
||||
let pct = (app.ui.zoom.unwrap_or(app.canvas_scale) * 100.0).round();
|
||||
let lbl = right.add(egui::Label::new(egui::RichText::new(format!("{pct}%")).size(12.0).color(t.text_dim)).sense(Sense::click()));
|
||||
if lbl.clicked() {
|
||||
app.dialog = Some(crate::dialogs::Dialog::new("zoom"));
|
||||
let _ = app.run("view.zoomDialog", json!({}));
|
||||
}
|
||||
if small_icon(&mut right, Icon::ZoomIn, "Zoom In", false).clicked() {
|
||||
let _ = app.run("view.zoomIn", json!({}));
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (chart trendlines round-trip; the real-deck corpus stays open; previous: minor, core-workflow alpha gate added; stage stays alpha) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (Review previous/next comment; previous: minor, core-workflow alpha gate) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-14 · **Change:** minor (six original starter decks; the large template gallery stays after beta; previous: minor, core-workflow alpha gate added; stage stays alpha) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (Zoom dialog; previous: minor, core-workflow alpha gate) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
|
||||
Forward-looking: where DeckCraft is going and in what order. The one-page summary is
|
||||
[ROADMAP.md](../ROADMAP.md); every shortfall is in [gaps.md](gaps.md); numbers are in
|
||||
@@ -146,5 +147,6 @@ plan above.
|
||||
| 2026-10-14 | trivial | Chart trendlines round-trip in an owned corpus slice; the real-deck corpus (item 2) stays open |
|
||||
| 2026-10-14 | trivial | Review workflow: previous and next comment across the deck |
|
||||
| 2026-10-14 | minor | After beta: six original starter decks exist; a larger template gallery remains |
|
||||
| 2026-10-14 | trivial | View: Zoom dialog (percent or Fit) |
|
||||
| 2026-10-10 | minor | Added the alpha gate (six core workflows): all pass, two with partial depth; stage stays alpha |
|
||||
| 2026-10-10 | major | Created: current focus, ranked beta plan with hours, milestones M0–M14 with status, the old alpha checklist as history |
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (automation 228 commands; breadth stays 79%, ready ~55%; previous: trivial, automation 227 commands) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** minor (Create New Theme Colors noted under what works today; percentages unchanged; previous: hours to ~95% per audience) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** minor (Create New Theme Fonts noted under what works today; percentages unchanged; previous: hours to ~95% per audience) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (Zoom dialog; breadth stays 79%; previous: minor, hours to ~95%) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
|
||||
The authoritative answer to "how close is DeckCraft to PowerPoint, and how much work is left?".
|
||||
[ROADMAP.md](../ROADMAP.md) summarizes it; [gaps.md](gaps.md) itemizes every shortfall;
|
||||
@@ -250,6 +251,9 @@ Carried from the 2026-10-07 ROADMAP status and updated with what has landed sinc
|
||||
- **Views:** Normal, Outline, Slide Sorter, Notes Page, Reading View, Slide Master; zoom;
|
||||
grayscale.
|
||||
- **Review:** comments with replies and resolve, previous and next across the deck, accessibility checker, a basic spelling list.
|
||||
- **Views:** Normal, Outline, Slide Sorter, Notes Page, Reading View, Slide Master; zoom
|
||||
(dialog: percent or Fit); grayscale.
|
||||
- **Review:** comments with replies and resolve, accessibility checker, a basic spelling list.
|
||||
- **Media:** MP3, AAC/M4A, ALAC, WAV, AIFF, CAF, FLAC, Ogg Vorbis and Opus audio; H.264, HEVC,
|
||||
VP9 and AV1 video in MP4/MOV/WebM/MKV with pure-Rust decoders; poster frames, trim, fades,
|
||||
volume, loop, play across slides.
|
||||
@@ -306,6 +310,7 @@ scored done (16 open issues).
|
||||
| 2026-10-14 | minor | What works today: Create New Theme Colors. The d556ff9 snapshot (226 commands, 27 dialogs) and the breadth / ready percentages are unchanged |
|
||||
| 2026-10-14 | minor | What works today: Create New Theme Fonts. The d556ff9 snapshot (226 commands, 27 dialogs) and the breadth / ready percentages are unchanged |
|
||||
| 2026-10-14 | trivial | Insert › Date and Time noted under what works today. The d556ff9 snapshot (226 commands, 27 dialogs) and the readiness percentages are unchanged |
|
||||
| 2026-10-14 | trivial | Zoom dialog takes a percent or Fit. Breadth stays 79%; the zoom checklist row stays D |
|
||||
| 2026-10-10 | minor | Added the readiness-by-audience table: each number gets its own hours to ~95% (full 340–600, mainstream 150–250, essentials 50–90). The full number stays an additive weighted sum; no change to the percentages |
|
||||
| 2026-10-10 | minor | Added the mainstream practitioner (~53%) and essentials user (~62%) numbers with written weights, discounts and user evidence. Features dimension recomputed from written area weights (66% judgement → 62.4% weighted mean), which moves ready for real work from ~56% to ~55%; stage unchanged |
|
||||
| 2026-10-10 | minor | Stage checked against the core-workflow gate (all six pass); stays alpha |
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (Alt Text dialog's decorative checkbox follows the selection; previous: File tab / Backstage, #76) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (Hyperlink dialog follows the selection; previous: File tab / Backstage, #76) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** minor (Insert › Date and Time dialog; previous: File tab / Backstage, #76) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** trivial (Zoom dialog: percent or Fit, applies on OK; previous: File tab / Backstage, #76) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
|
||||
> **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-14 · **Change:** minor (File › New starter decks; previous: minor, text editing keys observed in PowerPoint for Windows, #268) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
> **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** minor (Slide Sorter sections: add, rename, collapse, drag a whole section; previous: text editing keys, #268) · **Target:** Microsoft PowerPoint for Mac 16.113 (Microsoft 365)
|
||||
@@ -93,6 +94,7 @@ menu colours taken from the theme tokens (menu `chrome`, page `card`).
|
||||
| Dialogs | ~60 (Font, Paragraph, Bullets and Numbering, Find, Replace, Replace Fonts, Hyperlink, Action Settings, Header and Footer, Slide Size, Set Up Show, Custom Shows, Print, Page Setup, Insert Object, Symbol, Equation, Chart data sheet, SmartArt chooser, Preferences…) | 27 (`crates/ui-egui/src/dialogs.rs`): Table, Slide Size, Header and Footer, Hyperlink, Set Up Show, Zoom, Comment, Alt Text (decorative follows the selection), Outline, Rename (section, shape, layout), Paragraph, About, Preferences, Export, Symbol, Equation (placeholder), Spelling, Accessibility, Language, Custom Shows, Chart Data, Trim Media, SmartArt chooser, Quit, Notes Pages |
|
||||
| Dialogs | ~60 (Font, Paragraph, Bullets and Numbering, Find, Replace, Replace Fonts, Hyperlink, Action Settings, Header and Footer, Slide Size, Set Up Show, Custom Shows, Print, Page Setup, Insert Object, Symbol, Equation, Chart data sheet, SmartArt chooser, Preferences…) | 27 (`crates/ui-egui/src/dialogs.rs`): Table, Slide Size, Header and Footer, Hyperlink (address, slide and ScreenTip follow the selection), Set Up Show, Zoom, Comment, Alt Text, Outline, Rename (section, shape, layout), Paragraph, About, Preferences, Export, Symbol, Equation (placeholder), Spelling, Accessibility, Language, Custom Shows, Chart Data, Trim Media, SmartArt chooser, Quit, Notes Pages |
|
||||
| Dialogs | ~60 (Font, Paragraph, Bullets and Numbering, Find, Replace, Replace Fonts, Hyperlink, Action Settings, Header and Footer, Slide Size, Set Up Show, Custom Shows, Print, Page Setup, Insert Object, Symbol, Equation, Chart data sheet, SmartArt chooser, Preferences…) | 28 (`crates/ui-egui/src/dialogs.rs`): Table, Slide Size, Header and Footer, Date and Time, Hyperlink, Set Up Show, Zoom, Comment, Alt Text, Outline, Rename (section, shape, layout), Paragraph, About, Preferences, Export, Symbol, Equation (placeholder), Spelling, Accessibility, Language, Custom Shows, Chart Data, Trim Media, SmartArt chooser, Quit, Notes Pages |
|
||||
| Dialogs | ~60 (Font, Paragraph, Bullets and Numbering, Find, Replace, Replace Fonts, Hyperlink, Action Settings, Header and Footer, Slide Size, Set Up Show, Custom Shows, Print, Page Setup, Insert Object, Symbol, Equation, Chart data sheet, SmartArt chooser, Preferences…) | 27 (`crates/ui-egui/src/dialogs.rs`): Table, Slide Size, Header and Footer, Hyperlink, Set Up Show, Zoom (percent or Fit, applies on OK), Comment, Alt Text, Outline, Rename (section, shape, layout), Paragraph, About, Preferences, Export, Symbol, Equation (placeholder), Spelling, Accessibility, Language, Custom Shows, Chart Data, Trim Media, SmartArt chooser, Quit, Notes Pages |
|
||||
|
||||
## Direct manipulation
|
||||
|
||||
@@ -199,6 +201,7 @@ on the slide as shapes. No pixel comparison against PowerPoint screenshots has b
|
||||
| 2026-10-14 | trivial | Alt Text dialog: Mark as decorative follows the selection |
|
||||
| 2026-10-14 | trivial | Hyperlink dialog: address, email, slide and ScreenTip follow the selection |
|
||||
| 2026-10-14 | minor | Insert › Date and Time: format list, language, Update automatically. 28 dialogs. Languages are the ones the date field can compute (English, plus numeric dates for en-GB, fr-FR, ja-JP, sv-SE) |
|
||||
| 2026-10-14 | trivial | Zoom dialog: percent or Fit, applied on OK. View ▸ Zoom opens it; the arrow keeps the presets |
|
||||
| 2026-10-12 | minor | File tab (Backstage) observed in PowerPoint for Windows and matched (#76); the start screen is File › Home |
|
||||
| 2026-10-12 | minor | Off-slide objects drawn and editable around the slide in Normal view (#270) |
|
||||
| 2026-10-12 | minor | Selection Pane matched to PowerPoint (#133): drag and drop, arrows, groups, eye, Lock |
|
||||
|
||||
Reference in New Issue
Block a user