Commit Graph
1396 Commits
Author SHA1 Message Date
aiongg b6f60f25b1 vendor: re-sync hayro reader trees from pdfcraft ec0a965
Bring vendor/hayro, hayro-interpret, hayro-syntax and hayro-jbig2 to
storytold/pdfcraft ec0a965074f376a5bf610435948e4e5184bf3299 (main,
2026-10-19), from 7437bde. The local patches (per-document decode
limits, incomplete-content diagnostics, Hayro 0.8 resource scopes,
nesting cap, iterative page tree, TJ fill order, transfer rounding,
safety repairs) are carried by a three-way merge without conflicts.

The re-sync includes transparency group /I and /K reading (pdfcraft
#2027), patches 28, 29 and 31-34, and the reader fixes listed in
vendor/README.craft-reader.md. SOURCE.json manifests, NOTICE and the
craft-pdf README name the new source revision.
2026-10-20 02:30:13 +00:00
aiongg 3600104e76 docking: rustfmt the new tests 2026-10-20 01:00:56 +00:00
aiongg 95c81fa6de docking: say that the drag bar's menu opens on a right click
A left click on the drag bar focuses it and opens nothing, as designed;
the Hit::DragBar docs said otherwise.
2026-10-20 01:00:30 +00:00
aiongg a76d196b80 docking: dividers and resize grips keep focus after a pointer drag
Arrow keys resize the handle right after a drag. Focus that came from
the pointer draws no highlight until a key is pressed, and hovering
still focuses nothing.
2026-10-20 01:00:22 +00:00
aiongg 877f676e19 docking: menu item labels in title case
Float Panel, Close Panel and Move Group To match the other menu items.
Control names that only screen readers announce stay in sentence case.
2026-10-20 00:59:33 +00:00
aiongg 38e2b27a30 docking: window.panel.dock with an edge zone and no anchor docks at that edge
A left, right, top or bottom zone without anchor or side maps to
Placement::Edge, anchored on any docked panel that does not move. A
hidden panel is shown and moved in one step, all or nothing.
2026-10-20 00:59:02 +00:00
aiongg 89849272a0 docking: public widget ids and floating window layers
DockArea::hit_id gives the egui id of the control a Hit names, and
DockArea::floating_layer the layer of a floating window, so apps and
their tests stop rebuilding internal ids. The divider between stacked
groups has one id in docks and floating windows.
2026-10-20 00:58:10 +00:00
aiongg 30cebdc0f2 docking: content that fills its body floats at floating_size or 320
A panel body that reaches the bottom of its rect has no height of its
own, so a floated panel or group falls back to floating_size, else 320
points, instead of the whole frame height. A body in a window fitted to
its recorded height keeps that height. Panels leaving a frame fit their
content like panels leaving a dock.
2026-10-20 00:57:14 +00:00
aiongg b94df6c8b6 docking: wheel selects tabs and middle click closes a tab
Both are on in the Frame profile and off by default in the Dock profile;
DockStyle::wheel_selects_tabs and middle_click_closes_tabs set them. A
middle click closes only a closable panel.
2026-10-20 00:55:43 +00:00
aiongg d3079230da docking: group_header_width gets the tab strip width
A header that draws its own tabs, such as a timeline's open sequences,
sizes them to the room the strip has.
2026-10-20 00:54:23 +00:00
aiongg 488db9e3df Merge branch 'craft-keymap' into keymap-ui 2026-10-20 00:49:07 +00:00
aiongg 3ef24a785b keymap: egui::platform gives the browser's operating system on the web 2026-10-20 00:49:05 +00:00
aiongg baaf3061b0 keymap: run the pseudo-locale dialog test once per direction, each at one width 2026-10-19 21:40:29 +00:00
aiongg d0c8d3d0c7 Merge branch 'craft-keymap' into keymap-ui
# Conflicts:
#	crates/keymap/README.md
#	crates/keymap/src/lib.rs
2026-10-19 21:40:28 +00:00
aiongg c519b7a856 keymap: split crowded_chords_stay_fast into a small cap test and an ignored worst-case timing test 2026-10-19 21:37:38 +00:00
aiongg 0b34fdb152 keymap: split the hostile import test into a fast cap test and an ignored worst-case timing test 2026-10-19 21:35:24 +00:00
aiongg 86fb06a081 keymap: report Changed after Import when the save prompt changed the set 2026-10-19 20:58:45 +00:00
aiongg 4a721df085 keymap: state that chord reservations are opt-in through with_reserved 2026-10-19 20:47:23 +00:00
aiongg 13be52fbaa docking: focus only follows the user's input 2026-10-19 14:06:37 +00:00
aiongg a014337eb2 docking: a floated group takes its content height 2026-10-19 14:06:37 +00:00
aiongg e1b7733a1d docking: tabs keep their names and the rest go to the overflow menu 2026-10-19 14:02:05 +00:00
aiongg bfda13d2af docking: a tab dragged to an edge without a dock makes one
A tab that shares its group moves alone into the new dock with Action::MovePanel, as
window.panel.dock does (P6).
2026-10-19 13:32:15 +00:00
aiongg 4325b9ccc1 docking: move_targets skips the panel's own group
Moving a panel to a tab of its own group only reorders it, so a panel whose only other tabs are
in its group gets no "Move Panel to Group" menu.
2026-10-19 13:30:02 +00:00
aiongg b64cc4eac6 docking: window.panel.minimize toggles an accordion entry both ways
Without minimized the command read only dock and floating groups, so a closed accordion entry
stayed closed.
2026-10-19 13:30:02 +00:00
aiongg 5d5d11f854 docking: window.panel.dock to a side without a dock moves one panel of a shared group
Action::MovePanel moves one panel to a Target; NewDock and Float give it a group of its own.
DockCommand::Dock with a side that has no dock used to fail with InvalidPlacement for a panel
that shares its group.
2026-10-19 13:30:02 +00:00
aiongg c715d3f25f docking: hosts seed a FloatSpace with panel sizes 2026-10-19 13:22:34 +00:00
aiongg 53f16925cf keymap: put overrides_list on the craft-settings example in the crate docs 2026-10-19 13:15:36 +00:00
aiongg 2baaf87ecf keymap: Don't Save before Import reloads the stored set 2026-10-19 13:14:15 +00:00
aiongg 093238b065 keymap: rename refuses a name another set holds in a different case 2026-10-19 13:14:15 +00:00
aiongg 3e344373ef keymap: put overrides_list on the craft-settings example in the crate docs 2026-10-19 13:14:15 +00:00
aiongg 6261d9d39a docking: DockCommand takes the float space 2026-10-19 13:11:07 +00:00
aiongg 3aded979b5 docking: report flyout changes with DockEvent::FlyoutChanged 2026-10-19 13:07:52 +00:00
aiongg f46828ea48 docking: float commands without a rect at the drag size inside the dock area 2026-10-19 13:07:03 +00:00
aiongg d91e5f6aea docking: paint panel icons in code with DockContent::paint_icon 2026-10-19 13:04:52 +00:00
aiongg f4f9e5b206 docking: one drop preview painter for docking and panes
chrome::drop_preview draws the accent outline, filled or not, for every
docking destination and drag ghost and for the pane host's drop preview.
2026-10-19 12:26:31 +00:00
aiongg 6820f98109 panes: reserve the exact pane size, clip the body and name each title bar
A docked pane draws its body in a child ui clipped to the pane, so a body
wider than the pane no longer shifts a right or bottom pane's reserved
rect into the document. PaneLabels::move_pane takes {title}, so each
title bar's accessible name includes its pane ("Move Styles pane").
Pane title bars mirror with .rtl(true).
2026-10-19 12:25:49 +00:00
aiongg 8a0df8c12f docking: fixes from DesignCraft trial step 2
- Permissions::accepts_splits; PROTECTED takes no side splits, so a
  group dropped on a protected canvas floats.
- A press of any pointer button in a panel body, stripless panels
  included, reports the panel in DockOutput::focused.
- Right to left, tab strips, their header and drag bar, insertion slots
  (DropTarget::right_to_left), accordion headers and chrome::TitleBar
  (ChromeStyle::right_to_left) mirror. TitleBar truncates galley titles
  like tab labels.
- DockStyle::close_menu_items and close_button hide the built-in close
  controls without changing Permissions::closable.
- Menu labels say what moves: Move Panel to Group (move_panel_to_label)
  and Move Group to (move_group_to_label).
- The column bar's button has its own accessibility labels
  (collapse_column_label, expand_column_label).
- Placement::for_zone maps zones onto what the anchor's container takes;
  DockCommand uses it and takes right_to_left.
- Layout::apply, apply_with_permissions and apply_all return the closed
  panels.
- Placement::Group takes an optional preferred height.
2026-10-19 12:24:38 +00:00
aiongg 9c909dba7f docking: merge iconic columns, DockCommand, hit rects, the test driver and the guide
Adds the auto-collapse label to the keyed label hook and returns closed panels from DockCommand::apply through Workspace::apply_all.
2026-10-19 12:12:40 +00:00
aiongg b98ef89921 docking: rewrite the docking guide for the current API
docs/ui-docking.md covers the Dock and Frame profiles, the model and
actions, Workspace, the renderer and DockContent, gestures, DockCommand,
DockStyle::localized, hit rects and the DockDriver test driver, and links
the task-pane guide.

Also: ui.dock open, close and activate map in one place, the command tests
build as a cfg(test) module, the hit-kind table gets a type alias, the
testing example uses public API, and rustfmt.
2026-10-19 12:07:14 +00:00
aiongg d67d96e9bb keymap: shortcuts dialog right-to-left layout, long-label truncation, pseudo-locale test and README 2026-10-19 12:03:23 +00:00
aiongg 94eacba872 keymap: on-screen keyboard pane, fixed-row labels and read-only mode
The keyboard pane (Options::keyboard) draws a US ANSI layout under the
table and detail pane, coloured by who holds each key with the toggled
and held modifiers, lists the clicked key's shortcuts and assigns key and
modifiers to the selected command. Fixed rows always report a label, with
"Now used by" when a command took their key. A read-only dialog has no
set row, keeps Summarize in the footer and closes with shortcuts.close.
2026-10-19 12:03:23 +00:00
aiongg d2b9f91838 keymap: shortcuts dialog sets, import review and summary
Set row with picker, New Set (based on current shortcuts or a set),
Rename, Delete, Save, Revert Set, Export, Import and Summarize; actions
that do not fit go into a More menu. The foreign import review lists
what will change, suggestions to pick, unmatched, unreadable,
approximated and matched-without-change entries, then the report of
skipped, taken and failed changes with Copy Report. ui::summary writes
the shortcut summary as HTML and plain text.
2026-10-19 12:03:23 +00:00
aiongg 39f343c47b keymap: draw the shortcuts dialog: table, detail pane, conflict bar and footer
- view.rs: header with Show (dropdown or tabs), Filter and Search with search
  by key; table and detail pane in a resizable split, the detail pane below
  the table under 720 pt; virtual rows with chips, + and the restore button;
  detail pane with current shortcuts, New Shortcut, typed entry, Context,
  Assign, Use Default and Clear; prompts, conflict bar, messages, clash,
  shadow and problem lines; Undo, Redo, Reset All, Cancel and OK.
- Escape, Enter, Undo and Redo keys when idle; table keys (arrows, Home,
  End, Enter records, Delete removes); focus locks while recording.
- Accessibility labels for every control, row selection, and on_widget
  automation ids.
- style.rs: DialogStyle and the icon-button and divider styles.
- show() sizes the window to the screen; closing it is Cancel.
- tests/ui_dialog.rs: recording, conflicts, search, areas, display, labels,
  table keys, small windows, RTL. tests/ui_snapshot.rs (feature snapshot)
  writes PNGs when CRAFT_KEYMAP_SNAPSHOT_DIR is set.
2026-10-19 12:03:23 +00:00
aiongg b9bd4119cc keymap: shortcuts dialog model behind the ui feature
DialogState with every dialog action as a call on EditSession, Recorder,
editor::holders and Profiles; the table rows (areas from paths, kind and
scope, filters, search by label, translation or chord, grouping, sorting,
a row cache); key capture while recording, including clipboard events,
which removes the events it takes; the Text trait, I18nText and the list
of strings the dialog looks up. Drawing comes separately.
2026-10-19 12:03:23 +00:00
aiongg 70c84ec76c keymap: named shortcut sets with JSON export and import, and the shortcut editor model
Profiles keeps the user's sets beside the app's built-in ones: switch, duplicate,
rename, delete, export one set as JSON and import it back, and import another
application's set through an import plan as a new set. The editor model holds an
edit session with undo and cancel, conflict queries for steal or keep, a chord
recorder with double press, and search.
2026-10-19 12:03:23 +00:00
aiongg 362eb59fd2 keymap: keep an earlier entry's chord when the later entry finds the overrides full 2026-10-19 11:59:53 +00:00
aiongg 0d350d8e11 docking: DockCommand for the shared command ids and the ui.dock operations
DockCommand<P> deserializes a control command's params, with its id under
"command", and maps it to layout actions applied all or none. It covers the
window.panel.* and window.workspace.* ids, the raw {action} form, and the
ui.dock {operation, …} shape of LightCraft, PDFCraft, CADCraft and
SoundCraft (open, close, activate, float, moveFloating, move, setStackOpen,
resizeStack, resizeSplit), so their parsers can go without a protocol change.
Named workspaces and Reset stay with the application.

tests/docking_workflows.rs loads every v1 fixture, docks groups by their bars
into a new dock, a bottom band and a seam, collapses and expands the column,
floats it by command, drags it back, and checks the layout reads back as
written.
2026-10-19 11:59:33 +00:00
aiongg 0c140eb65b docking: iconic columns with flyouts, hit rects and a test driver
An iconic column draws one icon per panel, a grip above each group and a
separator between groups (M3). Widened past `DockStyle::iconic_label_width`
it shows panel names (M4). Clicking an icon opens its group as a flyout on
the canvas side; another icon switches, the same icon closes, and with
Auto-Collapse Iconic Panels (default on) Escape or a press outside closes
it (M5). Dragging a flyout's strip floats its group (M6), an icon drags its
panel (S7) and the grip its group (S8). A drop into an iconic column makes
a new icon group, previewed by the column outline and an insertion line
(P9). `raise_panel` on an iconic panel opens its flyout (U3), and the
column menu has the Auto-Collapse toggle as `DockEvent::ToggleAutoCollapse`.

Iconic widths move to `DockStyle` (`icon_size`, `iconic_width`,
`iconic_max_width`). `DockArea::hit_rects` names every gesture source the
area drew last frame, and `docking::testing::DockDriver` (feature
`testing`) drives an area with real egui input for application tests.

Behaviour follows vectorcraft crates/ui-egui/src/dock.rs (icon column,
flyout placement, names when widened) and photocraft dock.rs
(auto-collapse).
2026-10-19 05:40:26 +00:00
aiongg c94ab4d313 docking: merge craft_ui::panes, the task-pane host for document apps 2026-10-19 05:38:27 +00:00
aiongg 3893c590b0 docking: group float size, elided tab labels, filled ghost, drag bar grip, tab focus and double-click fixes
A floated group or column keeps its width and takes the tallest member's floating size, else the docked height capped at 320 pt. Tab labels from pre-laid-out galleys are cut with an ellipsis and drawn left-aligned inside the tab, active tabs included. The group drag ghost has a translucent fill, a 2 pt outline and the members' labels. The drag bar draws a grip mark at rest. A click that expands a minimized group does not start a double-click that minimizes it again. A tab focused by the pointer shows no focus outline; keyboard focus still does.

Found in the DesignCraft trial
2026-10-19 05:38:00 +00:00