mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-24 09:46:59 -06:00
On macOS, native_menu::sync reads every row of the menus (each command's enabled and checked state, and each label) whenever state_hash changes, and the macOS backend updates the AppKit items whose label, enabled or checked state changed. The hash included the active document's revision, and Session::preview makes a new revision at each step of a drag, so the app read every row again at each step of a move, scale or shape drag. In a release build on an M2 Max, that took about 1.5 ms a step with one object selected, and 13.8 ms a step with 5,001 objects selected. While an interaction is open, state_hash leaves the revision out. Move, scale and shape drags, dialog previews and the font menu's preview are interactions. The menus are read when an interaction begins and again on the frame it ends: when a drag's button is released, when Escape cancels a drag, when a move is dragged onto a panel, when a dialog's preview is applied or canceled, when the font menu's preview ends, or when a control request such as ui.dialog.cancel ends it. They are still read on a click or a key press during an interaction. docs/development.md says when the menus are updated during an interaction.