Commit Graph

9941 Commits

Author SHA1 Message Date
ispyisail 43f41eb044 Merge pull request #1219 from ispyisail/feature/script-current-folio-undo
Make a script run one undo step, and let it find the folio on screen
2026-10-02 15:11:03 +13:00
ispyisail 3e5e41b63f Merge pull request #1218 from ispyisail/fix/1210-report-menu-both-arrows
Fix #1210: keep both coming and going arrows in the right-click menu
2026-10-02 15:10:39 +13:00
ispyisail ed54271c23 Merge pull request #1214 from ispyisail/feature/mcp-conductor-defaults
Add a qet_edit op for a folio's wire defaults (one number per potential)
2026-10-02 15:09:56 +13:00
ispyisail 1e7dce4bd5 Merge pull request #1211 from ispyisail/fix/arc-middle-handle-overlap
Fix the arc's middle handle covering a resize or skew handle
2026-10-02 15:09:27 +13:00
ispyisail 3d4f546dbc Keep both folio report arrows in the folio's context menu
Fixes #1210. The "Renvoi de folio" submenu offered the common coming and
going arrows only while the project had no folio report element yet.
Placing one copies it into the embedded collection, so from then on the
menu listed just that one and the other arrow could not be inserted until
the project was closed without saving.

The two common arrows are now always listed, after the project's own
report elements, each name once.

Checked in the GUI on a blank one-folio project: on master the submenu
drops from two entries to one after a coming arrow is placed and the
second pick places another coming arrow; with this change it keeps two
entries and the second pick places a going arrow (both in the saved file).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 10:34:03 +13:00
ispyisail b7ce89944e Scripting: qet.apiSignatures(), the calls a script can make
Read from the meta-object, so the list is the one the running build has:
for someone writing a script, and for an assistant that has to write one
without the source at hand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 09:04:06 +13:00
ispyisail 1c1f9db3eb Scripting: qet.currentFolio(), and one undo step per script run in the editor
A script started from the editor had no way to know which folio is on
screen, and each qet.* call was its own undo step, so a script that adds
twenty items needed twenty Ctrl+Z to take back.

qet.currentFolio() returns the folio shown in the editor; through --run,
which has no view, the first folio, or -1 when there is none.

A run from the editor is now one undo macro, named after the script. A
run that changed nothing leaves no empty entry behind. qet.undo() and
qet.redo() inside a grouped run say why they cannot work (QUndoStack
ignores them inside a macro) instead of failing silently. --run is
unchanged: one step per call, so scripts that call qet.undo() keep
working.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 08:47:27 +13:00
ispyisail 7df9052a47 qet-mcp: set a folio's conductor defaults (set_conductor_default)
The "one text per potential" switch (onetextperfolio) lives in a folio's
conductor defaults, which no scripting call or qet_edit op could reach, so
callers patched the saved .qet afterwards (#1178).

qet.setConductorDefault(folio, property, value) sets onetextperfolio or any
setConductorProperty name on a folio's defaults, or with folio -1 on the
project's defaults that new folios copy. A change to onetextperfolio
re-shows or hides the conductor texts at once, as the Folio properties
dialog does. Not on the undo stack, like both dialogs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 07:16:44 +13:00
ispyisail 4c0f51c476 Arc: show the middle handle only with the size handles, uncovering the one under it
The middle handle of a half arc sits exactly on the middle of the top
or bottom edge of the ellipse -- a resize handle in Size mode, a skew
handle in RotateSkew mode -- and, drawn last, it covered that handle
(arummler, discussion #1203). It is now shown in Size mode only, where
the resize handle under it is hidden instead: the middle handle already
changes that height, with the ends kept in place. RotateSkew mode shows
its skew handle again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 06:12:09 +13:00
Laurent Trinques b6495b51a6 Merge pull request #1208 from Kellermorph/strg-shift-v
Linux build and tests / Build and test (Qt 6, Debug) (push) Failing after 3m18s
Ctrl+Shift+V pastes at the origin point, Ctrl+V keeps pasting under the cursor
2026-10-01 18:24:03 +02:00
Laurent Trinques 1ca13ce62d Fix unreadable search field in the Search and Replace widget (dark theme)
The search field gets a light green or light red background to show
whether the text matches, but only QPalette::Base was set. With a dark
theme the text colour is light too, so the typed text was light on
light and could not be read.

Set QPalette::Text to black together with the light background.

Fixes #1209
2026-10-01 16:03:46 +02:00
Laurent Trinques c7d31c08e4 Merge pull request #1204 from ispyisail/fix/wire-panel-unedited-properties
Fix the wire properties panel switching wires to single-line
2026-10-01 15:46:53 +02:00
Kellermorph 87bd172c44 Ctrl+Shift+V pastes at the origin point, Ctrl+V keeps pasting under the cursor
Ctrl+V moves the pasted group under the pointer as before. The new
Ctrl+Shift+V ("Coller au point d'origine", diagrameditor.paste_origin)
leaves the group exactly where it was copied from and warps the OS
cursor to the group's grid-snapped origin, so the paste baseline and
the physical cursor agree and the group starts following the mouse from
its original place instead of jumping to the pointer.

The cursor warp is only trusted as the baseline when it verifiably
lands (QCursor::pos() agrees with the target): QCursor::setPos() needs
pointer focus and is a silent no-op on compositors without
wp_pointer_warp_v1. Otherwise m_baseline_captured stays false and
moveTo() re-baselines on the first real mouse move, so a refused warp
costs at most the first movement rather than flinging the group across
the folio. An origin outside the viewport is scrolled into view first,
since the compositor rejects warp targets outside the window.
2026-10-01 13:04:04 +02:00
Laurent Trinques 041ad33e02 Merge pull request #1207 from jp2images/svg-icons-trace
Linux build and tests / Build and test (Qt 6, Debug) (push) Failing after 3m6s
Convert the toolbar and menu icons to SVG (#1063)
2026-10-01 12:54:11 +02:00
Jeff Patterson 947b067185 Tested that every icon size uses art drawn for it and reads on light and dark 2026-10-01 05:39:52 -05:00
Jeff Patterson 194708c0da Loaded the traced icons by theme name and removed the PNGs they replace 2026-10-01 05:39:52 -05:00
Jeff Patterson 5057817b6e Generated the light and dark icon themes 2026-10-01 05:39:51 -05:00
Jeff Patterson dba532996c Traced QET's own icons as SVGs, with 16 and 22 px drawings, and credited them in ico/copyright 2026-10-01 05:39:51 -05:00
Jeff Patterson cd786af926 Added scripts that import KDE Breeze icons and build the icon themes with a drawing for each size 2026-10-01 05:39:51 -05:00
Laurent Trinques 8e5da3c10b Merge pull request #1202 from ispyisail/feature/arc-tool
Add an Arc tool, with a handle to pull a half arc in or out
2026-10-01 12:37:37 +02:00
ispyisail a8699f6f62 Fix the wire properties panel changing properties nobody edited
With "Show the properties of a selected conductor in the Selection
properties panel" switched on, editing a wire there could change things
the user never touched:

- Enter in a field (Function, Section...) is not used by the line edit,
  so it reaches the checkable "Multifilaire" group box around it, which
  takes it as a click. The wire was switched to single-line, gaining
  ground, neutral and phase symbols. The modal dialog never shows this
  because its OK button takes Enter first.
- Every edit wrote back the whole set of properties as the widget holds
  them, so a value the widget cannot show exactly was rewritten: a dash
  size of 1 became 2.

The panel now swallows Enter at its checkable group boxes, and writes
only the fields that differ from what it showed, through the new
ConductorProperties::applyChanges(). "Apply to all conductors of this
potential" uses the same rule, so the rest of the potential keeps its
own values too.

tst_conductorapplychanges checks each field on its own: change that one
field, and a wire whose every field differs takes it and keeps the rest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:10:15 +13:00
ispyisail ffa76a61c1 Add an Arc tool and a handle to pull a half arc in or out (#408)
The diagram toolbar gets an "Ajouter un arc" button next to the
ellipse. Click one end, then click the other end at the height the arc
should reach: the result is a half arc bulging up or down from the line
between the two clicks (Shift: a true half circle). It is not filled,
since a fill would close it into a half disc.

A selected half arc shows one more handle, in the middle of the curve.
Dragging it makes the arc deeper or flatter while both ends stay put;
dragging it across the line between the ends turns the arc over. The
handle is hidden whenever the arc is not a half arc on a horizontal or
vertical diameter, because only then is "keep the ends, move the
middle" one well-defined change.

Nothing new is stored: an arc stays an Ellipse with a start and end
angle, exactly as the existing arc handles of an ellipse save it, so
files read by older versions are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 22:49:35 +13:00
Laurent Trinques 7fdc314e41 Merge pull request #1200 from ispyisail/feature/wire-crossing-hops
Add optional hops where wires cross (#436)
2026-10-01 11:07:09 +02:00
ispyisail 79a8637251 Add optional hops where wires cross (#436)
Where two wires cross without being connected, a project can now draw a
small arc (a hop) on one of them, instead of the user inserting a jump
symbol and splitting the wire. It is a project setting, off by default:
Project properties > Général > "Croisements de conducteurs", with no
hops, hops on horizontal wires, or hops on vertical wires. Choosing the
orientation rather than following drawing order keeps a project
consistent.

Only the drawing changes: no element is added and no wire is split. A
wire that ends or bends on another one is a junction and never hops,
and a crossing too close to the end of a segment for the arc to fit is
drawn plainly. PDF, SVG and image export and printing show the hops,
since they paint through Conductor::paint(); DXF export, which writes
the segments itself, does not.

The setting is saved as <wire_crossings hop="..."/> under the project
root, next to <usage>, and only when hops are on, so a project that
never used them saves exactly as before.

The geometry is in wirehops.cpp, free of any graphics item, and tested
on its own. Conductor::paintedPath() feeds it the conductors of the
folio from a snapshot of their scene points, rebuilt only when a
conductor changes shape, moves, or enters or leaves a folio; each hop
path is cached the same way. Asking the scene for the conductors in a
rect instead strokes every candidate's shape, which made a 366-wire
folio render 0.6 s slower; with the snapshot the difference is within
measurement noise.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 21:18:12 +13:00
Laurent Trinques d777b8d44d Merge pull request #1199 from ispyisail/feature/terminal-strip-drag-drop
Add drag and drop of free terminals onto a terminal strip (#409)
2026-10-01 08:14:25 +02:00
Laurent Trinques 3f9ab22224 Merge pull request #1180 from Kellermorph/plc-place
Element editor: save the moved position of the PLC table
2026-10-01 08:13:11 +02:00
Laurent Trinques 75b95cd636 Merge pull request #1198 from ispyisail/fix/terminal-move-tooltip
Fix the terminal strip's move button giving the wrong reason (#409)
2026-10-01 08:01:00 +02:00
ispyisail 66ad129c20 Add drag and drop of free terminals onto a terminal strip (#409)
In the terminal strip manager, free terminals could only be moved into a
strip with the "move to" list and its button. Dragging one onto a strip,
which is what users try first (#409), did nothing.

Free terminals can now be dragged onto a strip in the tree on the left,
from either place they are listed:
- the free terminal table: every selected row is moved;
- the tree itself: the dragged free terminal is moved.

Dropping on a strip, or on a terminal already in that strip, moves them
with the same undo command as the button, so one undo puts them back.
The strip is then selected, showing the terminals just added. A drop
anywhere else is refused.

A drop is also refused while the free terminal table has edits that are
not applied yet: moving reloads that table and would lose them. The
button is disabled in the same case.

The drag carries the uuids of the terminal elements under its own mime
type, and the tree only moves terminals that are still free in the
project when the drop happens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 18:33:50 +13:00
Laurent Trinques 509d551964 Merge pull request #1197 from ispyisail/fix/wiring-list-cable-column
Linux build and tests / Build and test (Qt 6, Debug) (push) Failing after 2m49s
Add a Cable column to the wiring list export
2026-10-01 07:14:00 +02:00
Laurent Trinques 14c217da34 Merge pull request #1194 from ispyisail/fix/element-nonfinite-coordinates
Fix bugtracker #266: symbol with a nan coordinate breaks the editor
2026-10-01 07:12:27 +02:00
Laurent Trinques 2ea570c8f2 Merge pull request #1192 from ispyisail/fix/editor-resize-zero-undo
Fix bugtracker #266: undo of a resize to zero width does nothing
2026-10-01 07:11:49 +02:00
ispyisail 97239657c7 Fix the terminal strip's move button saying the wrong thing (#409)
The button that moves free terminals into a strip is disabled when there
is nothing it can do, but its tooltip always gave the same reason: apply
or cancel the pending edits. With no row selected, which is what the
screenshot on #409 shows, that sends the user looking for edits they
never made.

It also stayed enabled when the project had no terminal strip at all.
The "move to" list is then empty and a click did nothing.

The button is now disabled in all three cases and the tooltip names the
one that applies, the most basic first: no strip yet (create one with
the + button), edits pending, or nothing selected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 18:11:45 +13:00
Laurent Trinques 99422fe56c Merge pull request #1191 from ispyisail/fix/344-one-text-per-potential
Fix bugtracker #344: "one text per potential" now applies at once
2026-10-01 07:09:23 +02:00
ispyisail c43f550639 Add a Cable column to the wiring list export
Each wire already carries a cable name (Conductor properties -> Cable),
saved in the project, but no export showed it. The wiring list CSV
(Project menu, and --export-cables) now writes it as a last column, so
the list can be sorted or filtered by cable in a spreadsheet.

It goes last so existing columns keep their positions for anyone reading
the file by column number. When the two halves of a wire drawn through a
folio report are joined into one row, their cable names are merged the
same way as colour and section: written once if equal, both if not.

Asked for in issue #405.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 16:50:56 +13:00
ispyisail 75a7e642e0 Fix bugtracker #266: skip shapes with a nan coordinate in the element editor
A symbol with a "nan" or "inf" coordinate (bugtracker #266 had a line
with x1="nan" x2="nan") opened with that shape invisible and the view
off-centre. Moving the selection then snapped NaN through qRound() to
INT_MIN, and saving wrote width="-2147483630", breaking the symbol.

The folio already leaves such a shape out (ElementPictureFactory reads it
with QET::attributeIsAReal()). Do the same in the element editor, and
have --check-elements warn about it. Only geometry attributes are read,
so a text whose content is "inf" is not affected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 15:21:51 +13:00
ispyisail 5381d05d5d Fix bugtracker #266: undoing a resize to zero width did nothing
Resizing a selection in the element editor down to zero width or height
could not be undone: ScalePartsCommand scales back from the new rect, and
a flat rect cannot be scaled from, so undo silently left the shapes
collapsed and the flattening was saved. The same flat rect made
deltaForRoundScaling() divide 0 by 0 and fill the resize rect with NaN.

Never commit a resize rect with no width or height, and do not resize a
selection that is already flat.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 14:53:02 +13:00
ispyisail 0cf7975be3 Fix bugtracker #344: folio "one text per potential" applies at once
Ticking or unticking "Afficher un texte de potentiel par folio" in
Folio > Properties only assigned Diagram::defaultConductorProperties.
Nothing recalculated the conductor texts, so texts hidden by the option
stayed hidden after it was turned off (and duplicates stayed visible after
it was turned on) until each wire was edited or the project was reopened.
That made the option look broken, which is part of what #344 reports.

When the option changes, reset each conductor's text visibility from its
own properties, then run calculateTextItemPosition() on every conductor of
the folio so the option is applied again from scratch.

Checked in the GUI on examples/industrial.qet folio 4 (26 wires with text,
19 potentials), master vs this commit: unticking now shows the hidden
texts immediately, ticking hides the duplicates immediately; master's
drawing does not change in either direction.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 13:03:18 +13:00
ispyisail 7f799bb425 Merge pull request #1190 from ispyisail/feature/center-on-cursor
Add a Centre on cursor command to move around a zoomed-in folio
2026-10-01 10:57:21 +13:00
ispyisail 18fe429254 Merge pull request #1186 from neitri/master
Russian Translation
2026-10-01 10:48:20 +13:00
ispyisail ec49c7d1ad Russian translation: review fixes
- fill all three Russian plural forms for the PDF page count and the two
  font-recovery messages (lrelease dropped them, so French showed)
- restore the trailing and embedded newlines 12 translations had lost
- translate the remaining French AutoNumberingDockWidget tooltip
- wording: Повернуть %1, Сочетание клавиш / Горячие клавиши,
  Перетаскивание: наклон, горизонтали, Вспомогательное текстовое
  описание 1, со значением, ни при какой ширине

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 10:47:09 +13:00
ispyisail 0a1ea451ed Merge pull request #1188 from ispyisail/fix/1187-pasted-contact-label
Fix #1187: a contact pasted with its coil loses its label
2026-10-01 10:32:48 +13:00
ispyisail 8587c1785e Merge pull request #1189 from ispyisail/i18n/pt-br-forum-3205
Update the Brazilian Portuguese translation from forum topic 3205
2026-10-01 10:32:27 +13:00
ispyisail 2580163e33 Add a "Centre on cursor" view command
Scrolls the folio so the point under the mouse becomes the centre of the
view, keeping the current zoom. Requested on the forum (topic 3199) for
moving around a zoomed-in folio the way KiCad and EasyEDA allow;
"Zoom sur le contenu" (Ctrl+8) was the closest existing command, but it
also refits the zoom.

The command is in the Affichage menu and in the shortcut editor. It has
no default key: F4 and the single letters are already taken or would
clash with typing. It does nothing when the cursor is not over the view,
so choosing it from the menu is harmless. Near the folio border the view
cannot scroll past the edge, so the point ends up as close to the centre
as the scroll bars allow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 10:29:34 +13:00
ispyisail ce2b33cd34 Update pt_BR translation from forum topic 3205
wanderson_rds posted a corrected qet_pt_BR.qm on the forum
(https://qelectrotech.org/forum/viewtopic.php?id=3205). The .qm was
decompiled with lconvert and merged into the current qet_pt_BR.ts,
changing only the <translation> of each message, so line locations and
the lupdate layout are untouched.

- 266 strings that had no translation now have one (all plurals too).
- 29 existing translations replaced: "forme" was translated as "form"
  (formulário) instead of "shape" (forma); zero-width spaces removed
  from several "variáveis"; smaller wording and grammar fixes.
- "TextLabel" kept as master had it; vanished entries not touched.

lrelease: 2949 translations and 266 untranslated before,
3215 and 0 after.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 10:06:54 +13:00
ispyisail a3ba364c9d Keep the label of a contact pasted together with its coil (#1187)
A slave pasted with its master is relinked to the master's copy by
initLink() (#997), so the slave data wipe that follows is only needed
for a slave that comes out of it unlinked. Linked, it wiped the
contact's label text while the link stayed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 10:04:52 +13:00
ispyisail ee781f8dc3 Merge pull request #1183 from ispyisail/fix/headless-settings-dir
Linux build and tests / Build and test (Qt 6, Debug) (push) Failing after 3m54s
Fix the MCP server's elements_dir on Windows (QET_SETTINGS_DIR)
2026-10-01 09:12:03 +13:00
ispyisail 74664c0bcd Merge pull request #1184 from ispyisail/fix/wiring-list-folio-arrows
Fix the wiring list export dropping wires at folio reports
2026-10-01 09:11:33 +13:00
Mikhail aa893d610d Russian Translation 2026-10-01 00:57:19 +05:00
ispyisail 50b52d50c8 Merge pull request #1182 from ispyisail/fix/element-editor-space-rotates-selection
Fix #1177: Space rotated the selection, not the part being added
2026-10-01 08:43:15 +13:00
ispyisail d66ab752a8 Merge pull request #1181 from ispyisail/fix/windows-crash-report-location
Fix Windows crash reports not saying what crashed or where
2026-10-01 08:42:53 +13:00