mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-09-28 04:54:13 +02:00
Add project-wide search & replace to the scripting API
qet.searchAndReplace(kind, field, pattern, replacement, useRegex, caseSensitive) finds and replaces a substring or regular expression within one text field across every folio, as a single undo step -- kind is element_info, conductor or text. Unlike a script loop over elementInfo()/setElementInfo() (or the conductor/text equivalents) doing the same thing one item at a time, each pushing its own undo entry, this wraps the whole run in one macro. This is deliberately NOT a wrapper around QET's own "Search and replace" panel (SearchAndReplaceWorker): that one is a batch overwrite-with-sentinel template built for picking items from an interactive tree, a poor fit for a script that can already say precisely which items it means. This does what the name plainly says instead -- an actual substring/regex replace within each item's current value. Found and fixed while writing the first conductor-kind test: a hub topology (several conductors sharing one terminal, e.g. a star wiring) made the conductor branch pick terminal1 unconditionally to address a Conductor object through setConductorProperty() -- for a hub member conductor, terminal1 is the shared, ambiguous hub terminal itself (findConductor() correctly refuses to address a conductor through a terminal carrying more than one), so every conductor touching that hub silently failed to update, returning a changed count of 0 with no error for a genuinely matching project. Fixed by preferring whichever of terminal1/terminal2 carries exactly that one conductor. Also caught during testing: an empty macro (a run that matches nothing) still gets pushed onto the undo stack by QUndoStack::endMacro() -- it is not silently discarded the way the earlier revision assumed -- leaving a confusing no-op "Rechercher et remplacer" undo entry. Fixed by counting matches in a dry run first and never touching the undo stack at all when that count is zero. textContent() is a new small getter alongside the existing setTextContent(), filling a gap this needed (reading an independent text's current content) that is independently useful too. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -433,6 +433,7 @@ class QetScriptApi : public QObject
|
||||
// -- independent text and drawing shapes --
|
||||
Q_INVOKABLE QStringList texts(int folioIndex) const;
|
||||
Q_INVOKABLE int addText(int folioIndex, const QString &text, double x, double y);
|
||||
Q_INVOKABLE QString textContent(int folioIndex, int textIndex) const;
|
||||
Q_INVOKABLE bool setTextContent(int folioIndex, int textIndex, const QString &text);
|
||||
Q_INVOKABLE bool setTextColor(int folioIndex, int textIndex, const QString &color);
|
||||
Q_INVOKABLE bool setTextRotation(int folioIndex, int textIndex, double angle);
|
||||
@@ -540,6 +541,12 @@ class QetScriptApi : public QObject
|
||||
Q_INVOKABLE bool canUndo() const;
|
||||
Q_INVOKABLE bool canRedo() const;
|
||||
|
||||
// -- project-wide text search & replace, one undo step for the
|
||||
// whole run, in the same spirit as the "Search and replace" panel --
|
||||
Q_INVOKABLE int searchAndReplace(const QString &kind, const QString &field,
|
||||
const QString &pattern, const QString &replacement,
|
||||
bool useRegex, bool caseSensitive);
|
||||
|
||||
// -- navigate and message --
|
||||
Q_INVOKABLE bool selectElement(const QString &elementUuid);
|
||||
Q_INVOKABLE void deselectAll(int folioIndex);
|
||||
|
||||
Reference in New Issue
Block a user