Commit Graph
6640 Commits
Author SHA1 Message Date
BFlat 6049ddbcd8 Merge pull request #4709 from storytold/feat/addon-parametric-shapes
Add-ons: Parametric Shape Tool — re-editable stars, polygons, rings, arrows, gears and more
2026-10-30 21:15:21 +07:00
bflatastic 27ed249b1f Add-ons: Parametric Shape Tool — re-editable stars, polygons, rings, arrows, gears and more
Path Precision Tools gains the Parametric Shape Tool: ten kinds of shape
(rectangle, ellipse, polygon, star, ring, arrow, cross, heart, gear,
speech bubble) that stay editable as numbers.

- Geometry in vectorcraft_pathops::addons::pathtools::shapes: each kind's
  outline, corner rounding limited to the middle of a side, a fingerprint
  of the outline, recovery of centre, size and rotation after a move,
  turn or scale, and recognition of plain rectangles, ellipses and
  regular polygons.
- The tool (parametricShape, All Tools drawer and Object › Plug-ins ›
  Path Precision Tools only, no shortcut): drag from the centre (Shift:
  45° steps), arrow keys change the count and values while dragging,
  handles edit a selected shape, double-click places one.
- Commands addon.pathtools.shape.create / .set / .convert, one undo step
  each; params checked (counts 3..1000, sizes up to 16384 pt).
- A shape keeps its numbers in one object-data entry (vc-pathtools-shape)
  that SVG export already leaves out; anchor edits make it a plain path.
- Parametric Shape panel, cursor stand-in, catalog rows in all 25
  languages, docs and tests.
2026-10-30 20:55:14 +07:00
BFlat b496226ab5 Merge pull request #4463 from danngreen/feat/library-drop-place
Libraries panel: art and colors dragged in are added where they are dropped
2026-10-30 20:52:36 +07:00
BFlat ce8e344735 Merge pull request #4691 from kler/swedish-ui-2026-10-30
i18n(sv): translate 32 new strings, use the agreed terms in 11
2026-10-30 20:52:20 +07:00
Dan Green 10838300f1 Libraries: an add that cannot be placed makes no "My Library"
With no library yet, library.add made and saved "My Library" before it
looked for the group or item to place the new one by, so a bad `group`,
`before` or `after` failed but left an empty library behind. The new
library is now kept only once the item is in it.
2026-10-30 20:20:17 +07:00
Dan Green 7688b41a40 Libraries panel: art and colours dragged in are added where they are dropped
Art dragged off the canvas and colours dragged in from elsewhere (swatches, another library's)
used to be added at the end of the ungrouped items, wherever they were dropped. They now land
as items dragged within the list do: on another item of their kind, just before or after it by
the pointer's half and in its group; on a group, into it; away from the items, ungrouped at the
end as before.

library.add takes group and before/after, placed as library.moveItem places an item (the
placement is shared). A library change that fails partway now leaves the library as it was.
2026-10-30 20:20:17 +07:00
Patrik LermonandClaude Opus 5.5 d38994c77d i18n(sv): translate 32 new strings, use the agreed terms in 11
Brings the Swedish catalog up to date with upstream main (a8ec515e1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 20:20:14 +07:00
BFlat 435fa962dd Merge pull request #4701 from ashokram-si/feat/gradient-presets-g13
Gradient panel: presets to apply, save and delete (G13)
2026-10-30 20:17:44 +07:00
BFlat 3b743f4543 Merge pull request #4561 from adambelis/fork/feat/control-bar-distribute
feat: show six Distribute Objects buttons in Control bar when 2+ objects selected (Illustrator parity)
2026-10-30 20:17:28 +07:00
BFlat 63caf3f047 Merge pull request #4702 from mockydevs/fix/pdf-large-mesh-shading
PDF import: large mesh shadings and mesh-painted strokes come in as gradient meshes
2026-10-30 20:17:14 +07:00
BFlat 865df773ed Merge pull request #4698 from mockydevs/fix/ai-empty-page-followups
.ai import: an empty page with skipped content isn't taken for empty; outlines asked for are given
2026-10-30 20:16:58 +07:00
BFlat 0e49b47167 Merge pull request #4697 from mockydevs/fix/ai-mesh-unread
.ai/EPS import: read gradient meshes in named colours, mixed colour spaces and large grids
2026-10-30 20:16:43 +07:00
bflatastic 051b5d8583 Docs: one area-table row each for Path operations and Colour again 2026-10-30 19:50:57 +07:00
ashokram-si 7a2fc777f4 Gradient panel: presets to apply, save and delete (G13)
People reuse the same gradients across documents and rebuilt them by
hand. The Gradient panel now has a Presets menu: the presets of the
app's built-in gradient libraries, grouped by library (theme), then
the saved ones. Choosing one gives the gradient behind the active
proxy (or a solid paint) the preset's type, stops, method and dither,
keeping its placement, as one undo step, through paint.editGradient.
The panel menu saves the current gradient as a preset (named in a
dialog) and deletes saved ones; Hide/Show Presets toggles the row.

Saved presets are kept with the preferences, next to the other user
preset lists (width profiles, flattener, perspective). Stops linked to
a document swatch keep their colour, unlinked, since a preset is used
in other documents. Built-in presets can't be deleted; names are
unique.

Commands: gradient.presets.list, .apply, .save and .delete. The menu's
rows are drawn only while in view, as its headings are.

Tests: engine tests for list, apply (fill and stroke, placement kept,
one undo step), save (unique names, unlinked swatch stops) and delete;
panel tests for applying from the menu and saving, deleting and
hiding presets from the panel menu, including scrolling the menu to
the saved presets. Docs: gaps G13, target-app and UI parity, ROADMAP.
2026-10-30 19:50:25 +07:00
Adam 55bfb7033e feat: show six Distribute Objects buttons in Control bar when 2+ objects selected (Illustrator parity)
Squashed from #4561 onto main.
2026-10-30 19:50:23 +07:00
bflatastic b127918be5 PDF import: a mesh-painted stroke's outline keeps dash and tolerance in reason 2026-10-30 19:45:52 +07:00
Don Omondi 75e8f69734 PDF import: large mesh shadings and mesh-painted strokes come in as gradient meshes
Patch and triangle mesh shadings of more than 4,096 patches, and strokes
painted with a mesh shading, came in as a flat grey. Illustrator writes
meshes of up to 14,355 patches, and writes a freeform gradient on a
stroke as a stroke painted with a type 7 shading.

- MAX_PATCHES is 16,384, as in the .ai editing-data reader.
- A stroke painted with a mesh shading is the meshes clipped to the area
  the stroke paints (stroke_outline: width, caps, joins, miter limit and
  dashes, built in the path's space and then transformed); draw_meshes
  always clips a stroke's meshes.
2026-10-30 19:44:50 +07:00
Don Omondi 4f5d270ae9 .ai import: an empty page with skipped content isn't empty; outlines asked for are given
Two follow-ups to the empty-page fallback:

- A page counts as empty only when nothing on it was skipped: its only
  notes are the page's own (art off the artboards, art past the page). A
  page whose only content couldn't be read, such as an image that can't
  be decoded, keeps its notes and goes through the usual check against
  the editing data, instead of being replaced by it unchecked.
- With textAs: outlines, the document read from the editing data alone
  has its type outlined. The usual path takes outlines from the page,
  but an empty page (or a text-only placeholder, #1387) has none to give.
2026-10-30 19:44:45 +07:00
Don Omondi c0ee9c1986 .ai/EPS import: read gradient meshes in named colours, mixed colour spaces and large grids
A mesh in the editing data that the reader couldn't read made the whole
file come in as its page or PDF part, without its layers. Three cases
were rejected that files write routinely:

- A mesh starts grey, and `/CS` is written only where the colour space
  changes, before the corner it applies to, even within a patch. Meshes
  with no `/CS`, or one that changed between corners, were unread.
- Named colours (`[c m y k /DeviceCMYK (name) /Process]` or `/Spot`) and
  `/NChannel` inks: each corner gives the tint, 1 being the full colour.
- Grids over 64 patches a side or 4,096 patches (files have 97 x 72).

Each corner now takes the colour space last set before it; named
colours paint at their tint and inks overprint at theirs; the limits
are 128 a side and 16,384 patches.
2026-10-30 19:44:41 +07:00
BFlat ed733b7d91 Merge pull request #4703 from storytold/feat/smart-pen-marquee
Smart Pen: an Alt-drag away from paths selects the points inside a marquee
2026-10-30 19:41:40 +07:00
bflatastic 884966c161 Smart Pen: an Alt-drag away from paths selects the points inside a marquee 2026-10-30 19:10:45 +07:00
BFlat 3dc3550c2f Merge pull request #4700 from storytold/fix/presentation-mode-artboard
Presentation Mode fits the active artboard and hides selections, guides, grids and artboard edges
2026-10-30 19:02:28 +07:00
BFlat e1f4e65030 Merge pull request #4699 from storytold/feat/addon-color-select
Add-ons: Color Effects — select by color kind (spot colors, color effects, RGB, CMYK and grayscale images)
2026-10-30 19:02:12 +07:00
bflatastic e214b3c981 Presentation Mode fits the active artboard and hides selections, guides, grids and artboard edges 2026-10-30 18:20:11 +07:00
bflatastic 992055204f Add-ons: Color Effects — select by color kind (spot colors, color effects, RGB, CMYK and grayscale images) 2026-10-30 18:20:06 +07:00
BFlat 3d62a009fd Merge pull request #4696 from storytold/fix/gradient-stop-popover-eyedropper
Gradient stop popover: an eyedropper samples the stop's colour from the art (#4681)
2026-10-30 18:08:52 +07:00
BFlat de68fc5ea3 Merge pull request #4695 from storytold/fix/screen-modes-full-screen
Full Screen and Presentation Mode fill the screen (#4365)
2026-10-30 18:08:35 +07:00
bflatastic 9ec7805e54 Gradient stop popover: an eyedropper samples the stop's colour from the art (#4681) 2026-10-30 17:49:06 +07:00
bflatastic 70512352bf Full Screen and Presentation Mode fill the screen (#4365) 2026-10-30 17:49:01 +07:00
BFlat fd81700273 Merge pull request #4694 from storytold/fix/hide-artboards
View › Hide Artboards hides their edges and shows the canvas as paper (#4038)
2026-10-30 17:37:09 +07:00
BFlat 8a9d2654a6 Merge pull request #4693 from storytold/fix/exif-orientation
Place: a photo's EXIF orientation turns it upright (#4284)
2026-10-30 17:36:51 +07:00
BFlat 7f54589fd6 Merge pull request #4692 from storytold/fix/task-bar-click-flash
Contextual Task Bar: stays up through a click on another object, hides only for a drag (#4681)
2026-10-30 17:36:35 +07:00
BFlat 8a28aaa28e Merge pull request #4690 from storytold/fix/draw-inside-indicator
Draw Inside marks the corners of the object it draws into (#4319)
2026-10-30 17:36:20 +07:00
BFlat 8954e31658 Merge pull request #4624 from wjrichards/fix/flatpak-wayland-clipboard
Linux clipboard: copy text through the core Wayland protocol
2026-10-30 17:36:02 +07:00
BFlat a8d2883b41 Merge pull request #4682 from Taha-Mahmoodi/fix/4638-color-halftone-radius-input
Fix #4638: clamp bounded effect length inputs on commit and reject invalid input visibly
2026-10-30 17:35:45 +07:00
BFlat 3e14933252 Merge pull request #4683 from jayzed80/fix/outline-stroke-huge-width
fix(pathops): a huge stroke width with round joins no longer panics Outline Stroke
2026-10-30 17:35:27 +07:00
bflatastic ad1bb39d62 View › Hide Artboards hides their edges and shows the canvas as paper (#4038)
Squashed from #4694 onto main.
2026-10-30 17:15:48 +07:00
bflatastic 0d891b9cb4 Docs: EXIF orientation on Place (#4284) 2026-10-30 17:15:39 +07:00
bflatastic f36dad59b3 Place: a photo's EXIF orientation turns it upright (#4284) 2026-10-30 17:15:38 +07:00
bflatastic 9646feb672 Contextual Task Bar: stays up through a click on another object, hides only for a drag (#4681)
Squashed from #4692 onto main.
2026-10-30 17:12:17 +07:00
bflatastic 89b673a826 Draw Inside marks the corners of the object it draws into (#4319) 2026-10-30 17:12:17 +07:00
wjrichardsandClaude Opus 5.5 9b3b662f5d Linux clipboard: the read worker holds the window as long as its clipboard
The worker's closure named loader.cb, and a closure moves only the fields it names, so
the worker's window clone was dropped when TextClipboard::new returned. A worker held
by an owner that never answers could then outlive the window. The closure now calls
Loader::load, which moves the whole Loader.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 17:12:17 +07:00
wjrichardsandClaude Opus 5.5 7a86f94282 Linux clipboard: a Wayland core-protocol read waits 2 s at most
smithay-clipboard's load() waits for the selection owner's data with no limit, and
Paste and the "is the clipboard still ours" check read on the UI thread, so an owner
that never sends its data froze the window. Reads now run on a worker thread with a
second clipboard on the window's connection and are waited for 2 s at most. While a
read that timed out is unanswered, later reads return at once instead of queueing
behind it, and its late answer is dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 17:12:17 +07:00
wjrichardsandClaude Opus 5.5 dd934dfd4e Linux clipboard: copy text through the core Wayland protocol
Where arboard can't open (GNOME has no data-control protocol, and the Flatpak on a
Wayland session has no X11), Copy and Paste use the compositor's core data-device
protocol on the window's own connection through smithay-clipboard, already in the
build through egui-winit: text only, a copy's text or its SVG markup. A bitmap-only
copy reports that this clipboard carries text only and leaves it as it was.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 17:12:17 +07:00
bflatastic 33d15bec56 Fields: only a plain Enter commits a field early, so Ctrl/Cmd+Enter in X or Y keeps editing 2026-10-30 17:12:16 +07:00
bflatastic a385b5cbf5 Fields: drop a leftover debug print from the invalid-input highlight 2026-10-30 16:55:57 +07:00
Taha-Mahmoodi 092cb2ab04 Tests: assert rendered field text displays 4 pt after sub-minimum commit and invalid input rejection 2026-10-30 16:55:55 +07:00
Taha-Mahmoodi 6ec5178708 Text: remove debug print in recessed_text and test invalid input in single dialog session 2026-10-30 16:55:55 +07:00
Taha-Mahmoodi 956412e978 Tests: assert rejection highlight and dialog retention on invalid Enter commit 2026-10-30 16:55:55 +07:00
Taha-Mahmoodi e2828bc064 Dialogs: keep dialog open on invalid Enter commit and prevent lock nesting in numeric widget 2026-10-30 16:55:55 +07:00