From 76fda3f0e6796c3b5c4852de58f1895a2b4176c5 Mon Sep 17 00:00:00 2001 From: ispyisail Date: Sun, 2 Aug 2026 07:30:14 +1200 Subject: [PATCH 01/20] Reflect unsaved-changes state in the main window title On macOS in particular there's currently no way to tell from the window chrome alone whether the active project has unsaved changes. The main window's title is set once in the constructor to a static string and never updated afterward, and QET never sets Qt's windowModified property anywhere -- so the native "document modified" indicator (the dot in the close button on macOS; an asterisk in the title on platforms that render it as text) never appears. Add QETDiagramEditor::updateWindowModifiedState(), which sets the window title to "[*] - QElectroTech" (the "[*]" is Qt's own placeholder convention for this) and calls setWindowModified() with the active project's own modified flag. Call it from two places: - subWindowActivated(), the single existing choke point already used whenever the visible MDI tab changes, so switching projects immediately reflects the newly active one's own state. - A new per-project connection to QETProject::projectModified, added in addProject() alongside the existing undo-stack registration, filtered to only act when the modified project is the currently active one. With no project open, the title and modified flag both revert to the original static, unmodified state. Implements https://github.com/qelectrotech/qelectrotech-source-mirror/discussions/596 --- sources/qetdiagrameditor.cpp | 33 +++++++++++++++++++++++++++++++++ sources/qetdiagrameditor.h | 1 + 2 files changed, 34 insertions(+) diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 5b2ba6779..7f9a2d4c7 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -1283,6 +1283,12 @@ bool QETDiagramEditor::addProject(QETProject *project, bool update_panel) undo_group.addStack(project -> undoStack()); + connect(project, &QETProject::projectModified, this, [this](QETProject *modified_project, bool) { + if (modified_project == currentProject()) { + updateWindowModifiedState(); + } + }); + m_element_collection_widget->addProject(project); // met a jour le panel d'elements @@ -2553,6 +2559,7 @@ void QETDiagramEditor::subWindowActivated(QMdiSubWindow *subWindows) slot_updateWindowsMenu(); emit syncElementsPanel(); updateUsageTrackersActiveState(); + updateWindowModifiedState(); } /** @@ -2578,6 +2585,32 @@ void QETDiagramEditor::updateUsageTrackersActiveState() } } +/** + @brief QETDiagramEditor::updateWindowModifiedState + Reflect the currently active project's unsaved-changes state in the + main window's title and native "document modified" indicator (e.g. + the dot in the close button on macOS). Called whenever the active + project changes, or whenever the active project's own modified state + changes. + + The window title's "[*]" placeholder is Qt's own convention: combined + with setWindowModified(), it lets each platform render the modified + indicator its own way (or not at all, on platforms without one) + without QET having to draw anything itself. +*/ +void QETDiagramEditor::updateWindowModifiedState() +{ + if (QETProject *project = currentProject()) { + setWindowTitle(QString("%1[*] - %2").arg( + project->pathNameTitle(), + tr("QElectroTech", "window title"))); + setWindowModified(project->projectOptionsWereModified()); + } else { + setWindowTitle(tr("QElectroTech", "window title")); + setWindowModified(false); + } +} + /** @brief QETDiagramEditor::selectionChanged This slot is called when a diagram selection was changed. diff --git a/sources/qetdiagrameditor.h b/sources/qetdiagrameditor.h index 0114a186e..1d54899e8 100644 --- a/sources/qetdiagrameditor.h +++ b/sources/qetdiagrameditor.h @@ -98,6 +98,7 @@ class QETDiagramEditor : public QETMainWindow ProjectView *findProject(const QString &) const; QMdiSubWindow *subWindowForWidget(QWidget *) const; void updateUsageTrackersActiveState(); + void updateWindowModifiedState(); signals: void syncElementsPanel(); From 29ba7c96368120cd7ce511e5595a8417dead5735 Mon Sep 17 00:00:00 2001 From: ispyisail Date: Tue, 4 Aug 2026 10:32:25 +1200 Subject: [PATCH 02/20] Remember last-used shape/text style for new items this session Drawing tools on the diagram canvas always started new shapes and free text from a fixed hardcoded default (Qt's plain QPen()/QBrush(), and the static Preferences font) -- changing a shape's color or a text's font had zero effect on what the next new item of that type got, even within the same editing session. Add LastUsedStyle: a small in-memory, session-scoped static helper (no QSettings, no persistence across restarts -- this is a live "what did I just use" value, not a new app-wide default). Write side hooks capture the value right where the properties editors already apply a change (ShapeGraphicsItemPropertiesWidget::associatedUndo(), both the live-edit dock path and the modal editProperty() dialog path; and IndiTextPropertiesWidget::on_m_font_pb_clicked() right after the font dialog returns). Read side hooks apply the stored value, if any, to a newly created item: DiagramEventAddShape::mousePressEvent for shapes, IndependentTextItem's constructor for free text (falling back to the existing QETApp::indiTextsItemFont() Preferences default otherwise). Doesn't touch the element/symbol editor's own drawing tools (a separate subsystem) or add last-used text color (no color control exists in the text properties UI to originate it from yet). --- cmake/qet_compilation_vars.cmake | 2 + sources/diagramevent/diagrameventaddshape.cpp | 9 ++ sources/lastusedstyle.cpp | 106 ++++++++++++++++++ sources/lastusedstyle.h | 63 +++++++++++ .../qetgraphicsitem/independenttextitem.cpp | 6 +- sources/ui/inditextpropertieswidget.cpp | 2 + .../ui/shapegraphicsitempropertieswidget.cpp | 5 + 7 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 sources/lastusedstyle.cpp create mode 100644 sources/lastusedstyle.h diff --git a/cmake/qet_compilation_vars.cmake b/cmake/qet_compilation_vars.cmake index 57a012916..0a81ce8d2 100644 --- a/cmake/qet_compilation_vars.cmake +++ b/cmake/qet_compilation_vars.cmake @@ -205,6 +205,8 @@ set(QET_SRC_FILES ${QET_DIR}/sources/exportpropertieswidget.h ${QET_DIR}/sources/genericpanel.cpp ${QET_DIR}/sources/genericpanel.h + ${QET_DIR}/sources/lastusedstyle.cpp + ${QET_DIR}/sources/lastusedstyle.h ${QET_DIR}/sources/machine_info.cpp ${QET_DIR}/sources/machine_info.h ${QET_DIR}/sources/main.cpp diff --git a/sources/diagramevent/diagrameventaddshape.cpp b/sources/diagramevent/diagrameventaddshape.cpp index 8a5f0967c..0ab945266 100644 --- a/sources/diagramevent/diagrameventaddshape.cpp +++ b/sources/diagramevent/diagrameventaddshape.cpp @@ -18,6 +18,7 @@ #include "diagrameventaddshape.h" #include "../diagram.h" +#include "../lastusedstyle.h" #include "../undocommand/addgraphicsobjectcommand.h" /** @@ -77,6 +78,14 @@ void DiagramEventAddShape::mousePressEvent(QGraphicsSceneMouseEvent *event) if (!m_shape_item) { m_shape_item = new QetShapeItem(pos, pos, m_shape_type); + //Start from whatever pen/brush was last applied this + //session, rather than always the hardcoded default. + if (LastUsedStyle::hasShapePen()) { + m_shape_item->setPen(LastUsedStyle::shapePen()); + } + if (LastUsedStyle::hasShapeBrush()) { + m_shape_item->setBrush(LastUsedStyle::shapeBrush()); + } m_diagram->addItem (m_shape_item); event->setAccepted(true); return; diff --git a/sources/lastusedstyle.cpp b/sources/lastusedstyle.cpp new file mode 100644 index 000000000..0dad351a8 --- /dev/null +++ b/sources/lastusedstyle.cpp @@ -0,0 +1,106 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include "lastusedstyle.h" + +QPen LastUsedStyle::m_shape_pen; +bool LastUsedStyle::m_has_shape_pen = false; +QBrush LastUsedStyle::m_shape_brush; +bool LastUsedStyle::m_has_shape_brush = false; +QFont LastUsedStyle::m_text_font; +bool LastUsedStyle::m_has_text_font = false; + +/** + @return true if a shape pen was set this session +*/ +bool LastUsedStyle::hasShapePen() +{ + return m_has_shape_pen; +} + +/** + @return the last pen applied to a shape this session +*/ +QPen LastUsedStyle::shapePen() +{ + return m_shape_pen; +} + +/** + @brief LastUsedStyle::setShapePen + Record @a pen as the last-used shape pen for this session + @param pen +*/ +void LastUsedStyle::setShapePen(const QPen &pen) +{ + m_shape_pen = pen; + m_has_shape_pen = true; +} + +/** + @return true if a shape brush was set this session +*/ +bool LastUsedStyle::hasShapeBrush() +{ + return m_has_shape_brush; +} + +/** + @return the last brush applied to a shape this session +*/ +QBrush LastUsedStyle::shapeBrush() +{ + return m_shape_brush; +} + +/** + @brief LastUsedStyle::setShapeBrush + Record @a brush as the last-used shape brush for this session + @param brush +*/ +void LastUsedStyle::setShapeBrush(const QBrush &brush) +{ + m_shape_brush = brush; + m_has_shape_brush = true; +} + +/** + @return true if a text font was set this session +*/ +bool LastUsedStyle::hasTextFont() +{ + return m_has_text_font; +} + +/** + @return the last font applied to a free text item this session +*/ +QFont LastUsedStyle::textFont() +{ + return m_text_font; +} + +/** + @brief LastUsedStyle::setTextFont + Record @a font as the last-used free text font for this session + @param font +*/ +void LastUsedStyle::setTextFont(const QFont &font) +{ + m_text_font = font; + m_has_text_font = true; +} diff --git a/sources/lastusedstyle.h b/sources/lastusedstyle.h new file mode 100644 index 000000000..17c1f50b3 --- /dev/null +++ b/sources/lastusedstyle.h @@ -0,0 +1,63 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#ifndef LAST_USED_STYLE_H +#define LAST_USED_STYLE_H + +#include +#include +#include + +/** + @brief The LastUsedStyle class + Session-scoped "last used" style for new shapes and free text created + on the diagram canvas: whatever pen/brush/font was last applied through + the properties editors becomes the starting point for the next new + item of that type, the way most drawing tools behave. + + Deliberately in-memory only, not QSettings-backed: this is a live + "what did I just use" value for the current editing session, not an + app-wide default (that's already covered by the Preferences dialog's + font setting, read as the fallback when nothing has been set yet). +*/ +class LastUsedStyle +{ + public: + static bool hasShapePen(); + static QPen shapePen(); + static void setShapePen(const QPen &pen); + + static bool hasShapeBrush(); + static QBrush shapeBrush(); + static void setShapeBrush(const QBrush &brush); + + static bool hasTextFont(); + static QFont textFont(); + static void setTextFont(const QFont &font); + + private: + LastUsedStyle() = delete; + + static QPen m_shape_pen; + static bool m_has_shape_pen; + static QBrush m_shape_brush; + static bool m_has_shape_brush; + static QFont m_text_font; + static bool m_has_text_font; +}; + +#endif // LAST_USED_STYLE_H diff --git a/sources/qetgraphicsitem/independenttextitem.cpp b/sources/qetgraphicsitem/independenttextitem.cpp index ba92533b8..36c5eb5d8 100644 --- a/sources/qetgraphicsitem/independenttextitem.cpp +++ b/sources/qetgraphicsitem/independenttextitem.cpp @@ -19,6 +19,7 @@ #include "../diagram.h" #include "../diagramcommands.h" +#include "../lastusedstyle.h" #include "../qet.h" #include "../qetapp.h" #include "../utils/qetutils.h" @@ -33,7 +34,10 @@ IndependentTextItem::IndependentTextItem() : DiagramTextItem(nullptr) { - setFont(QETApp::indiTextsItemFont()); + //Start from the font last applied to a text item this session, + //falling back to the app-wide Preferences default otherwise. + setFont(LastUsedStyle::hasTextFont() ? LastUsedStyle::textFont() + : QETApp::indiTextsItemFont()); QSettings settings; setRotation(settings.value("diagrameditor/independent_text_rotation", 0).toInt()); } diff --git a/sources/ui/inditextpropertieswidget.cpp b/sources/ui/inditextpropertieswidget.cpp index 45884a1cb..0ebe9ba15 100644 --- a/sources/ui/inditextpropertieswidget.cpp +++ b/sources/ui/inditextpropertieswidget.cpp @@ -20,6 +20,7 @@ #include "../QPropertyUndoCommand/qpropertyundocommand.h" #include "../diagram.h" #include "../diagramcommands.h" +#include "../lastusedstyle.h" #include "../qetgraphicsitem/independenttextitem.h" #include "../ui_inditextpropertieswidget.h" @@ -455,6 +456,7 @@ void IndiTextPropertiesWidget::on_m_font_pb_clicked() m_font_is_selected = true; ui->m_font_pb->setText(font.family()); ui->m_size_sb->setValue(font.pointSize()); + LastUsedStyle::setTextFont(m_selected_font); apply(); } else { ui->m_font_pb->setText(tr("Police")); diff --git a/sources/ui/shapegraphicsitempropertieswidget.cpp b/sources/ui/shapegraphicsitempropertieswidget.cpp index 242f1dd2f..5d4580321 100644 --- a/sources/ui/shapegraphicsitempropertieswidget.cpp +++ b/sources/ui/shapegraphicsitempropertieswidget.cpp @@ -20,6 +20,7 @@ #include "../QPropertyUndoCommand/qpropertyundocommand.h" #include "../diagram.h" +#include "../lastusedstyle.h" #include "../qetgraphicsitem/qetshapeitem.h" #include "../ui_shapegraphicsitempropertieswidget.h" @@ -180,6 +181,7 @@ QUndoCommand* ShapeGraphicsItemPropertiesWidget::associatedUndo() const { undo = new QPropertyUndoCommand(m_shape, "pen", old_pen, new_pen); undo->setText(tr("Modifier le trait d'une forme")); + LastUsedStyle::setShapePen(new_pen); } QBrush old_brush = m_shape->brush(); @@ -196,6 +198,7 @@ QUndoCommand* ShapeGraphicsItemPropertiesWidget::associatedUndo() const undo = new QPropertyUndoCommand(m_shape, "brush", old_brush, new_brush); undo->setText(tr("Modifier le remplissage d'une forme")); } + LastUsedStyle::setShapeBrush(new_brush); } if (ui->m_close_polygon->isChecked() != m_shape->isClosed()) @@ -321,6 +324,7 @@ QUndoCommand* ShapeGraphicsItemPropertiesWidget::associatedUndo() const if (new_pen != old_pen) { new QPropertyUndoCommand(m_shape, "pen", old_pen, new_pen, undo); + LastUsedStyle::setShapePen(new_pen); } QBrush old_brush = m_shape->brush(); @@ -330,6 +334,7 @@ QUndoCommand* ShapeGraphicsItemPropertiesWidget::associatedUndo() const if (new_brush != old_brush) { new QPropertyUndoCommand(m_shape, "brush", old_brush, new_brush, undo); + LastUsedStyle::setShapeBrush(new_brush); } if (ui->m_close_polygon->isChecked() != m_shape->isClosed()) { From 32dd686144f2af7abcd49e80853ad1576176a0e5 Mon Sep 17 00:00:00 2001 From: ispyisail Date: Tue, 4 Aug 2026 18:51:22 +1200 Subject: [PATCH 03/20] Add "rotate group" to actually rotate a selection as a whole RotateSelectionCommand's existing "Pivoter" action (Space) only ever bumps each selected item's own rotation property -- QGraphicsItem's setRotation() spins an item around its own local origin and never touches pos(). Select three elements arranged in a row and rotate: each spins 90 degrees individually, but the row stays a row. That's "rotate each item," not "rotate the group." Add a rotate_as_group parameter to RotateSelectionCommand (default false, so the existing action and its one call site are unchanged). When set, it computes a shared pivot once -- the bounding-box center of the whole selection -- and queues a second, parallel "pos" QPropertyUndoCommand alongside the existing "rotation" one, rotating each item's position around that pivot by the same angle. Scoped the position change to Element/IndependentTextItem/ DiagramImageItem only: these are the only selectable types with scene-space pos(). ConductorTextItem, DynamicElementTextItem and ElementTextItemGroup are all parent-relative children (confirmed by reading their constructors), so when their owning Element is also selected and gets its own pos() rotated, they're carried along for free by Qt's normal parent/child transform propagation -- exactly what the existing "skip rotation if parent is also selected" guard already assumes for those three cases. Exposed as a new, separate action ("Pivoter le groupe", Shift+Space) next to the existing one rather than changing Space's behavior, since some workflows may rely on the current per-item rotation. --- sources/qetdiagrameditor.cpp | 12 ++++ sources/qetdiagrameditor.h | 1 + .../undocommand/rotateselectioncommand.cpp | 61 +++++++++++++++++-- sources/undocommand/rotateselectioncommand.h | 6 +- 4 files changed, 75 insertions(+), 5 deletions(-) diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 5b2ba6779..199e923a2 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -628,6 +628,7 @@ void QETDiagramEditor::setUpActions() //Selections Actions (related to a selected item) m_delete_selection = m_selection_actions_group.addAction( QET::Icons::EditDelete, tr("Supprimer") ); m_rotate_selection = m_selection_actions_group.addAction( QET::Icons::TransformRotate, tr("Pivoter") ); + m_rotate_group_selection = m_selection_actions_group.addAction( QET::Icons::TransformRotate, tr("Pivoter le groupe") ); m_rotate_texts = m_selection_actions_group.addAction( QET::Icons::ObjectRotateRight, tr("Orienter les textes") ); m_find_element = m_selection_actions_group.addAction( QET::Icons::ZoomDraw, tr("Retrouver dans le panel") ); m_edit_selection = m_selection_actions_group.addAction( QET::Icons::ElementEdit, tr("Éditer l'item sélectionné") ); @@ -635,16 +636,19 @@ void QETDiagramEditor::setUpActions() ShortcutManager::instance().registerAction(m_delete_selection, "diagrameditor.delete_selection", tr("Éditeur de schémas"), Qt::Key_Delete); ShortcutManager::instance().registerAction(m_rotate_selection, "diagrameditor.rotate_selection", tr("Éditeur de schémas"), Qt::Key_Space); + ShortcutManager::instance().registerAction(m_rotate_group_selection, "diagrameditor.rotate_group_selection", tr("Éditeur de schémas"), Qt::SHIFT | Qt::Key_Space); ShortcutManager::instance().registerAction(m_rotate_texts, "diagrameditor.rotate_texts", tr("Éditeur de schémas"), Qt::CTRL | Qt::Key_Space); ShortcutManager::instance().registerAction(m_edit_selection, "diagrameditor.edit_selection", tr("Éditeur de schémas"), Qt::CTRL | Qt::Key_E); m_delete_selection->setStatusTip( tr("Enlève les éléments sélectionnés du folio", "status bar tip")); m_rotate_selection->setStatusTip( tr("Pivote les éléments et textes sélectionnés", "status bar tip")); + m_rotate_group_selection->setStatusTip( tr("Pivote la sélection comme un groupe autour de son centre, au lieu de chaque élément sur place", "status bar tip")); m_rotate_texts ->setStatusTip( tr("Pivote les textes sélectionnés à un angle précis", "status bar tip")); m_find_element ->setStatusTip( tr("Retrouve l'élément sélectionné dans le panel", "status bar tip")); m_delete_selection ->setData("delete_selection"); m_rotate_selection ->setData("rotate_selection"); + m_rotate_group_selection->setData("rotate_group_selection"); m_rotate_texts ->setData("rotate_selected_text"); m_find_element ->setData("find_selected_element"); m_edit_selection ->setData("edit_selected_element"); @@ -1601,6 +1605,12 @@ void QETDiagramEditor::selectionGroupTriggered(QAction *action) if(c->isValid()) diagram->undoStack().push(c); } + else if (value == "rotate_group_selection") + { + RotateSelectionCommand *c = new RotateSelectionCommand(diagram, 90, nullptr, true); + if(c->isValid()) + diagram->undoStack().push(c); + } else if (value == "rotate_selected_text") diagram->undoStack().push(new RotateTextsCommand(diagram)); else if (value == "find_selected_element" && currentElement()) @@ -1735,6 +1745,7 @@ void QETDiagramEditor::slot_updateComplexActions() << m_copy << m_delete_selection << m_rotate_selection + << m_rotate_group_selection << m_edit_selection << m_group_selected_texts; for(QAction *action : action_list) @@ -1763,6 +1774,7 @@ void QETDiagramEditor::slot_updateComplexActions() m_copy -> setEnabled(copiable_items); m_delete_selection -> setEnabled(!ro && deletable_items); m_rotate_selection -> setEnabled(!ro && diagram_->canRotateSelection()); + m_rotate_group_selection -> setEnabled(!ro && diagram_->canRotateSelection()); //Action that need selected texts or texts group QList texts = DiagramContent(diagram_).selectedTexts(); diff --git a/sources/qetdiagrameditor.h b/sources/qetdiagrameditor.h index 0114a186e..ecc3b5164 100644 --- a/sources/qetdiagrameditor.h +++ b/sources/qetdiagrameditor.h @@ -216,6 +216,7 @@ class QETDiagramEditor : public QETMainWindow *m_edit_selection, ///< To edit selected item *m_delete_selection, ///< Delete selection *m_rotate_selection, ///< Rotate selected elements and text items by 90 degrees + *m_rotate_group_selection = nullptr, ///< Rotate the selection as a whole around its shared center, instead of each item in place *m_rotate_texts, ///< Direct selected text items to a specific angle *m_find_element, ///< Find the selected element in the panel *m_group_selected_texts = nullptr, diff --git a/sources/undocommand/rotateselectioncommand.cpp b/sources/undocommand/rotateselectioncommand.cpp index a3d3cc821..f893c5510 100644 --- a/sources/undocommand/rotateselectioncommand.cpp +++ b/sources/undocommand/rotateselectioncommand.cpp @@ -29,21 +29,37 @@ #include "../qetgraphicsitem/independenttextitem.h" #include +#include -RotateSelectionCommand::RotateSelectionCommand(Diagram *diagram, qreal angle, QUndoCommand *parent) : +RotateSelectionCommand::RotateSelectionCommand(Diagram *diagram, qreal angle, QUndoCommand *parent, bool rotate_as_group) : QUndoCommand(parent), m_diagram(diagram) { - setText(QObject::tr("Pivoter la selection")); - + setText(rotate_as_group ? QObject::tr("Pivoter le groupe") : QObject::tr("Pivoter la selection")); + if(!m_diagram->isReadOnly()) { + //Shared pivot for group rotation: the bounding-box center of + //everything selected, computed once up front from the + //selection as a whole (not just the items that end up being + //individually repositioned below). + QPointF pivot; + if (rotate_as_group) + { + QRectF bounding_rect; + for (QGraphicsItem *item : m_diagram->selectedItems()) + bounding_rect |= item->sceneBoundingRect(); + pivot = bounding_rect.center(); + } + for (QGraphicsItem *item : m_diagram->selectedItems()) { switch (item->type()) { case Element::Type: m_undo << new QPropertyUndoCommand(item->toGraphicsObject(), "rotation", QVariant(item->rotation()), QVariant(item->rotation()+angle), this); + if (rotate_as_group) + addGroupPositionUndo(item, pivot, angle); break; case ConductorTextItem::Type: { @@ -53,9 +69,19 @@ m_diagram(diagram) break; case IndependentTextItem::Type: m_undo << new QPropertyUndoCommand(item->toGraphicsObject(), "rotation", QVariant(item->rotation()), QVariant(item->rotation()+angle), this); + if (rotate_as_group) + addGroupPositionUndo(item, pivot, angle); break; case DynamicElementTextItem::Type: { + //No pos() undo here even in group mode: this item is + //only rotated in place when its parent Element isn't + //also selected (guard below), and its pos() is + //parent-local, not scene coordinates -- when the + //parent Element *is* selected and gets its own pos() + //rotated around the shared pivot above, this child + //text item is carried along for free by Qt's normal + //parent/child transform propagation. if(item->parentItem() && !item->parentItem()->isSelected()) m_undo << new QPropertyUndoCommand(item->toGraphicsObject(), "rotation", QVariant(item->rotation()), QVariant(item->rotation()+angle), this); } @@ -69,17 +95,44 @@ m_diagram(diagram) break; case DiagramImageItem::Type: m_undo << new QPropertyUndoCommand(item->toGraphicsObject(), "rotation", QVariant(item->rotation()), QVariant(item->rotation()+angle), this); + if (rotate_as_group) + addGroupPositionUndo(item, pivot, angle); break; default: break; } } - + for (QPropertyUndoCommand *undo : m_undo) undo->setAnimated(true, false); } } +/** + @brief RotateSelectionCommand::addGroupPositionUndo + Queue a "pos" QPropertyUndoCommand that rotates @a item's position + around @a pivot by @a angle degrees (Qt's clockwise-positive + convention, matching QGraphicsItem::setRotation() so a group + rotation turns the same direction as each item's own spin). + Only meaningful for items whose pos() is in scene coordinates + (Element, IndependentTextItem, DiagramImageItem) -- never call this + for a child item positioned relative to its own parent. + @param item : item to reposition, its own rotation undo already queued + @param pivot : shared pivot point, in scene coordinates + @param angle : rotation angle in degrees +*/ +void RotateSelectionCommand::addGroupPositionUndo(QGraphicsItem *item, const QPointF &pivot, qreal angle) +{ + const QPointF old_pos = item->pos(); + const qreal radians = qDegreesToRadians(angle); + const QPointF delta = old_pos - pivot; + const QPointF new_pos( + pivot.x() + delta.x() * qCos(radians) - delta.y() * qSin(radians), + pivot.y() + delta.x() * qSin(radians) + delta.y() * qCos(radians) + ); + m_undo << new QPropertyUndoCommand(item->toGraphicsObject(), "pos", QVariant(old_pos), QVariant(new_pos), this); +} + /** @brief RotateSelectionCommand::undo */ diff --git a/sources/undocommand/rotateselectioncommand.h b/sources/undocommand/rotateselectioncommand.h index abc75bcc9..df96fba96 100644 --- a/sources/undocommand/rotateselectioncommand.h +++ b/sources/undocommand/rotateselectioncommand.h @@ -21,10 +21,12 @@ #include #include #include +#include class Diagram; class ConductorTextItem; class QPropertyUndoCommand; +class QGraphicsItem; /** @brief The RotateSelectionCommand class @@ -33,13 +35,15 @@ class QPropertyUndoCommand; class RotateSelectionCommand : public QUndoCommand { public: - RotateSelectionCommand(Diagram *diagram, qreal angle=90, QUndoCommand *parent=nullptr); + RotateSelectionCommand(Diagram *diagram, qreal angle=90, QUndoCommand *parent=nullptr, bool rotate_as_group=false); void undo() override; void redo() override; bool isValid(); private: + void addGroupPositionUndo(QGraphicsItem *item, const QPointF &pivot, qreal angle); + Diagram *m_diagram =nullptr; QList> m_cond_text; From 979df376d14420e393e183bb95a2f8b0eb8c44fa Mon Sep 17 00:00:00 2001 From: Kellermorph Date: Thu, 6 Aug 2026 12:48:11 +0200 Subject: [PATCH 04/20] show terminalnames in export --- sources/diagram.cpp | 3 ++- sources/qetgraphicsitem/terminal.cpp | 26 ++++++++++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 9128eecac..ff3f44b4a 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -2397,9 +2397,10 @@ QPointF Diagram::snapToGrid(const QPointF &p) \~French true pour afficher les bornes, false sinon */ void Diagram::setDrawTerminals(bool dt) { + draw_terminals_ = dt; foreach(QGraphicsItem *qgi, items()) { if (Terminal *t = qgraphicsitem_cast(qgi)) { - t -> setVisible(dt); + t -> update(); } } } diff --git a/sources/qetgraphicsitem/terminal.cpp b/sources/qetgraphicsitem/terminal.cpp index ee041c632..00a9d65fc 100644 --- a/sources/qetgraphicsitem/terminal.cpp +++ b/sources/qetgraphicsitem/terminal.cpp @@ -199,19 +199,21 @@ void Terminal::paint( // dessin de la borne en rouge // draw the terminal in red - t.setColor(Qt::red); - painter -> setPen(t); - painter -> drawLine(c, e); + if (!diagram() || diagram()->drawTerminals()) { + t.setColor(Qt::red); + painter -> setPen(t); + painter -> drawLine(c, e); - // dessin du point d'amarrage au conducteur en bleu - // draw the docking point to the conductor in blue - t.setColor(m_hovered_color); - painter -> setPen(t); - painter -> setBrush(m_hovered_color); - if (m_hovered) { - painter -> setRenderHint(QPainter::Antialiasing, true); - painter -> drawEllipse(QRectF(c.x() - 2.5, c.y() - 2.5, 5.0, 5.0)); - } else painter -> drawPoint(c); + // dessin du point d'amarrage au conducteur en bleu + // draw the docking point to the conductor in blue + t.setColor(m_hovered_color); + painter -> setPen(t); + painter -> setBrush(m_hovered_color); + if (m_hovered) { + painter -> setRenderHint(QPainter::Antialiasing, true); + painter -> drawEllipse(QRectF(c.x() - 2.5, c.y() - 2.5, 5.0, 5.0)); + } else painter -> drawPoint(c); + } //Draw help line if needed, if (diagram() && m_draw_help_line) From b3a4a41ad953e10c88f8ebe1167b01571fa214da Mon Sep 17 00:00:00 2001 From: Kellermorph Date: Thu, 6 Aug 2026 21:37:40 +0200 Subject: [PATCH 05/20] new Checkbox --- sources/diagram.cpp | 17 +++++++++++++++++ sources/diagram.h | 16 ++++++++++++++-- sources/exportproperties.cpp | 5 +++++ sources/exportproperties.h | 1 + sources/exportpropertieswidget.cpp | 11 +++++++++-- sources/exportpropertieswidget.h | 1 + sources/print/projectprintwindow.cpp | 3 +++ sources/print/projectprintwindow.h | 1 + sources/print/projectprintwindow.ui | 10 ++++++++++ sources/qetgraphicsitem/terminal.cpp | 5 +++-- 10 files changed, 64 insertions(+), 6 deletions(-) diff --git a/sources/diagram.cpp b/sources/diagram.cpp index ff3f44b4a..d0e3127fb 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -67,6 +67,7 @@ Diagram::Diagram(QETProject *project) : m_project (project), use_border_ (true), draw_terminals_ (true), + draw_terminal_names_ (true), draw_colored_conductors_ (true), m_event_interface (nullptr), m_freeze_new_elements (false), @@ -2319,6 +2320,7 @@ ExportProperties Diagram::applyProperties( old_properties.draw_border = border_and_titleblock.borderIsDisplayed(); old_properties.draw_titleblock = border_and_titleblock.titleBlockIsDisplayed(); old_properties.draw_terminals = drawTerminals(); + old_properties.draw_terminal_names = drawTerminalNames(); old_properties.draw_colored_conductors = drawColoredConductors(); old_properties.exported_area = useBorder() ? QET::BorderArea : QET::ElementsArea; @@ -2327,6 +2329,7 @@ ExportProperties Diagram::applyProperties( // applique les nouvelles options de rendu setUseBorder (new_properties.exported_area == QET::BorderArea); setDrawTerminals (new_properties.draw_terminals); + setDrawTerminalNames (new_properties.draw_terminal_names); setDrawColoredConductors (new_properties.draw_colored_conductors); setDisplayGrid (new_properties.draw_grid); setDisplayGuides (new_properties.draw_guides); @@ -2405,6 +2408,20 @@ void Diagram::setDrawTerminals(bool dt) { } } +/** + @brief Diagram::setDrawTerminalNames + Defines whether or not to display the terminal names/labels + @param dt : true to display the terminal names, false otherwise +*/ +void Diagram::setDrawTerminalNames(bool dt) { + draw_terminal_names_ = dt; + foreach(QGraphicsItem *qgi, items()) { + if (Terminal *t = qgraphicsitem_cast(qgi)) { + t -> update(); + } + } +} + /** @brief Diagram::setDrawColoredConductors Defines whether or not to respect the colors of the conductors. diff --git a/sources/diagram.h b/sources/diagram.h index 7a884f6de..360888186 100644 --- a/sources/diagram.h +++ b/sources/diagram.h @@ -126,8 +126,9 @@ class Diagram : public QGraphicsScene bool use_border_; bool draw_guides_; QList m_guides_list; - bool draw_terminals_; - bool draw_colored_conductors_; + bool draw_terminals_; + bool draw_terminal_names_; + bool draw_colored_conductors_; QString m_conductors_autonum_name; DiagramEventInterface *m_event_interface; @@ -226,6 +227,8 @@ class Diagram : public QGraphicsScene bool drawTerminals() const; void setDrawTerminals(bool); + bool drawTerminalNames() const; + void setDrawTerminalNames(bool); bool drawColoredConductors() const; void setDrawColoredConductors(bool); @@ -426,6 +429,15 @@ inline bool Diagram::drawTerminals() const return(draw_terminals_); } +/** + @brief Diagram::drawTerminalNames + @return true if terminal names are rendered, false otherwise +*/ +inline bool Diagram::drawTerminalNames() const +{ + return(draw_terminal_names_); +} + /** @brief Diagram::drawColoredConductors @return true if conductors colors are rendered, false otherwise. diff --git a/sources/exportproperties.cpp b/sources/exportproperties.cpp index 941f894b5..e13a5fb76 100644 --- a/sources/exportproperties.cpp +++ b/sources/exportproperties.cpp @@ -34,6 +34,7 @@ ExportProperties::ExportProperties() : draw_border(true), draw_titleblock(true), draw_terminals(false), + draw_terminal_names(true), draw_bg_transparent(false), draw_colored_conductors(true), exported_area(QET::BorderArea) @@ -70,6 +71,8 @@ void ExportProperties::toSettings(QSettings &settings, draw_titleblock); settings.setValue(prefix % "drawterminals", draw_terminals); + settings.setValue(prefix % "drawterminalnames", + draw_terminal_names); settings.setValue(prefix % "drawbgtransparent", draw_bg_transparent); settings.setValue(prefix % "drawcoloredconductors", @@ -105,6 +108,8 @@ void ExportProperties::fromSettings(QSettings &settings, true ).toBool(); draw_terminals = settings.value(prefix % "drawterminals", false).toBool(); + draw_terminal_names = settings.value(prefix % "drawterminalnames", + true).toBool(); draw_bg_transparent = settings.value(prefix % "drawbgtransparent", false).toBool(); draw_colored_conductors = settings.value( diff --git a/sources/exportproperties.h b/sources/exportproperties.h index f104a9c41..af34f6868 100644 --- a/sources/exportproperties.h +++ b/sources/exportproperties.h @@ -47,6 +47,7 @@ class ExportProperties { bool draw_border; ///< Whether to render the border (along with rows/columns headers) bool draw_titleblock; ///< Whether to render the title block bool draw_terminals; ///< Whether to render terminals + bool draw_terminal_names; ///< Whether to render terminal names/labels bool draw_bg_transparent; ///< Whether to use transparency for SVG-Export bool draw_colored_conductors; ///< Whether to render conductors colors QET::DiagramArea exported_area; ///< Area of diagrams to be rendered diff --git a/sources/exportpropertieswidget.cpp b/sources/exportpropertieswidget.cpp index aaa0966d0..2afbcbc09 100644 --- a/sources/exportpropertieswidget.cpp +++ b/sources/exportpropertieswidget.cpp @@ -63,6 +63,7 @@ ExportProperties ExportPropertiesWidget::exportProperties() const export_properties.draw_border = draw_border -> isChecked(); export_properties.draw_titleblock = draw_titleblock -> isChecked(); export_properties.draw_terminals = draw_terminals -> isChecked(); + export_properties.draw_terminal_names = draw_terminal_names -> isChecked(); export_properties.draw_bg_transparent = draw_bg_transparent -> isChecked(); export_properties.draw_colored_conductors = draw_colored_conductors -> isChecked(); export_properties.exported_area = export_border -> isChecked() ? QET::BorderArea : QET::ElementsArea; @@ -85,6 +86,7 @@ void ExportPropertiesWidget::setExportProperties(const ExportProperties &export_ draw_border -> setChecked(export_properties.draw_border); draw_titleblock -> setChecked(export_properties.draw_titleblock); draw_terminals -> setChecked(export_properties.draw_terminals); + draw_terminal_names -> setChecked(export_properties.draw_terminal_names); draw_bg_transparent -> setChecked(export_properties.draw_bg_transparent); draw_colored_conductors -> setChecked(export_properties.draw_colored_conductors); @@ -206,13 +208,17 @@ void ExportPropertiesWidget::build() draw_terminals = new QCheckBox(tr("Dessiner les bornes"), groupbox_options); optionshlayout -> addWidget(draw_terminals, 2, 1); + // dessiner les noms des bornes + draw_terminal_names = new QCheckBox(tr("Dessiner les noms des bornes"), groupbox_options); + optionshlayout -> addWidget(draw_terminal_names, 3, 0); + // conserver les couleurs des conducteurs draw_colored_conductors = new QCheckBox(tr("Conserver les couleurs des conducteurs"), groupbox_options); - optionshlayout -> addWidget(draw_colored_conductors, 3, 0); + optionshlayout -> addWidget(draw_colored_conductors, 3, 1); // use transparent background for SVG-Export draw_bg_transparent = new QCheckBox(tr("SVG: fond transparent"), groupbox_options); - optionshlayout -> addWidget(draw_bg_transparent, 3, 1); + optionshlayout -> addWidget(draw_bg_transparent, 4, 0); vboxLayout -> addWidget(groupbox_options); @@ -239,6 +245,7 @@ void ExportPropertiesWidget::build() connect(draw_border, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); connect(draw_titleblock, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); connect(draw_terminals, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); + connect(draw_terminal_names, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); connect(draw_bg_transparent, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); connect(draw_colored_conductors, SIGNAL(stateChanged(int)), this, SIGNAL(optionChanged())); } diff --git a/sources/exportpropertieswidget.h b/sources/exportpropertieswidget.h index f6de4e1ae..ae0c97acd 100644 --- a/sources/exportpropertieswidget.h +++ b/sources/exportpropertieswidget.h @@ -62,6 +62,7 @@ class ExportPropertiesWidget : public QWidget { QCheckBox *draw_border; QCheckBox *draw_titleblock; QCheckBox *draw_terminals; + QCheckBox *draw_terminal_names; QCheckBox *draw_bg_transparent; QCheckBox *draw_colored_conductors; QRadioButton *export_border; diff --git a/sources/print/projectprintwindow.cpp b/sources/print/projectprintwindow.cpp index 92ff56336..b115ad5b7 100644 --- a/sources/print/projectprintwindow.cpp +++ b/sources/print/projectprintwindow.cpp @@ -161,6 +161,7 @@ ProjectPrintWindow::ProjectPrintWindow(QETProject *project, QPrinter *printer, Q ui->m_draw_border_cb->setChecked(exp.draw_border); ui->m_draw_titleblock_cb->setChecked(exp.draw_titleblock); ui->m_draw_terminal_cb->setChecked(exp.draw_terminals); + ui->m_draw_terminal_names_cb->setChecked(exp.draw_terminal_names); ui->m_keep_conductor_color_cb->setChecked(exp.draw_colored_conductors); ui->m_date_cb->blockSignals(true); @@ -523,6 +524,7 @@ ExportProperties ProjectPrintWindow::exportProperties() const exp.draw_border = ui->m_draw_border_cb->isChecked(); exp.draw_titleblock = ui->m_draw_titleblock_cb->isChecked(); exp.draw_terminals = ui->m_draw_terminal_cb->isChecked(); + exp.draw_terminal_names = ui->m_draw_terminal_names_cb->isChecked(); exp.draw_colored_conductors = ui->m_keep_conductor_color_cb->isChecked(); exp.draw_grid = false; exp.draw_guides = false; @@ -796,6 +798,7 @@ void ProjectPrintWindow::on_m_draw_border_cb_clicked() { m_preview->upd void ProjectPrintWindow::on_m_draw_titleblock_cb_clicked() { m_preview->updatePreview(); } void ProjectPrintWindow::on_m_keep_conductor_color_cb_clicked() { m_preview->updatePreview(); } void ProjectPrintWindow::on_m_draw_terminal_cb_clicked() { m_preview->updatePreview(); } +void ProjectPrintWindow::on_m_draw_terminal_names_cb_clicked() { m_preview->updatePreview(); } void ProjectPrintWindow::on_m_fit_in_page_cb_clicked() { m_preview->updatePreview(); } void ProjectPrintWindow::on_m_use_full_page_cb_clicked() { diff --git a/sources/print/projectprintwindow.h b/sources/print/projectprintwindow.h index 8585c2091..f290ff4c2 100644 --- a/sources/print/projectprintwindow.h +++ b/sources/print/projectprintwindow.h @@ -55,6 +55,7 @@ class ProjectPrintWindow : public QMainWindow void on_m_draw_titleblock_cb_clicked(); void on_m_keep_conductor_color_cb_clicked(); void on_m_draw_terminal_cb_clicked(); + void on_m_draw_terminal_names_cb_clicked(); void on_m_fit_in_page_cb_clicked(); void on_m_use_full_page_cb_clicked(); void on_m_zoom_out_action_triggered(); diff --git a/sources/print/projectprintwindow.ui b/sources/print/projectprintwindow.ui index 99e1ea68e..0f3f9b204 100644 --- a/sources/print/projectprintwindow.ui +++ b/sources/print/projectprintwindow.ui @@ -183,6 +183,16 @@ + + + + Dessiner les noms des bornes + + + true + + + diff --git a/sources/qetgraphicsitem/terminal.cpp b/sources/qetgraphicsitem/terminal.cpp index 00a9d65fc..b838eb1ce 100644 --- a/sources/qetgraphicsitem/terminal.cpp +++ b/sources/qetgraphicsitem/terminal.cpp @@ -275,9 +275,10 @@ void Terminal::paint( m_help_line_a -> setLine(line); } - // Draw label if show_name is enabled + // Draw label if show_name is enabled and terminal names are allowed const QString display_name = name(); - if (d->m_show_name && !display_name.isEmpty()) { + if (d->m_show_name && !display_name.isEmpty() + && (!diagram() || diagram()->drawTerminalNames())) { painter->setRenderHint(QPainter::Antialiasing, true); painter->setRenderHint(QPainter::TextAntialiasing, true); painter->setFont(d->m_label_font); From 3cf5cb945eead2a8634f222ad15fabb702ba34da Mon Sep 17 00:00:00 2001 From: ispyisail Date: Fri, 7 Aug 2026 12:18:17 +1200 Subject: [PATCH 06/20] Keep group rotation on the grid Rotating a selection around the raw bounding-box centre moved grid-aligned elements off the grid permanently. sceneBoundingRect() comes from font metrics and pen widths, so the centre is almost never a round number: with a pivot of (132.67, 101.11), an element sitting at x=100 landed at x=133.78, and no further rotation brought it back. Positions are written with QString::number() (%.6g), which hides the floating-point noise but keeps the offset, so the diagram ends up subtly misaligned with no way to repair it from the UI. Snap the pivot with Diagram::snapToGrid(), which also follows the user's configured X/Y grid rather than assuming the 10 px default. Also compute the rotated offset exactly for multiples of 90 degrees instead of going through qCos()/qSin(). The rotate actions only ever pass right angles, and qCos(90 deg) is 6.12e-17 rather than 0, so the trig path added error for no benefit -- four 90 degree steps did not return a point to where it started. A quadrant is an axis swap, which is exact; trig is kept as the fallback for any other angle. With both, four 90 degree rotations of a grid-aligned element return it exactly to its original position and every intermediate step stays on the grid. Reported by plc-user, who hit the same problem rotating graphical primitives in the Element Editor -- discussion #618. --- .../undocommand/rotateselectioncommand.cpp | 59 +++++++++++++++---- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/sources/undocommand/rotateselectioncommand.cpp b/sources/undocommand/rotateselectioncommand.cpp index f893c5510..341f01a2b 100644 --- a/sources/undocommand/rotateselectioncommand.cpp +++ b/sources/undocommand/rotateselectioncommand.cpp @@ -39,17 +39,32 @@ m_diagram(diagram) if(!m_diagram->isReadOnly()) { - //Shared pivot for group rotation: the bounding-box center of - //everything selected, computed once up front from the - //selection as a whole (not just the items that end up being - //individually repositioned below). + /* Shared pivot for group rotation: the bounding-box centre of + * the whole selection, computed once up front (not just from + * the items that end up being individually repositioned + * below), then snapped to the grid. + * + * The snap is not cosmetic. sceneBoundingRect() is derived + * from font metrics and pen widths, so the raw centre is + * almost never a round number, and rotating a grid-aligned + * element around a fractional pivot moves it off the grid for + * good -- an element at x=100 lands at x=133.78, and no + * further rotation brings it back. Positions are saved with + * QString::number() (%.6g), which hides the floating-point + * noise but preserves the offset, so the diagram is left + * subtly misaligned with no way to repair it from the UI. + * Reported by plc-user from the same problem in the Element + * Editor, discussion #618. + * + * snapToGrid() follows the user's configured X/Y grid rather + * than assuming the 10 px default. */ QPointF pivot; if (rotate_as_group) { QRectF bounding_rect; for (QGraphicsItem *item : m_diagram->selectedItems()) bounding_rect |= item->sceneBoundingRect(); - pivot = bounding_rect.center(); + pivot = Diagram::snapToGrid(bounding_rect.center()); } for (QGraphicsItem *item : m_diagram->selectedItems()) @@ -124,13 +139,35 @@ m_diagram(diagram) void RotateSelectionCommand::addGroupPositionUndo(QGraphicsItem *item, const QPointF &pivot, qreal angle) { const QPointF old_pos = item->pos(); - const qreal radians = qDegreesToRadians(angle); const QPointF delta = old_pos - pivot; - const QPointF new_pos( - pivot.x() + delta.x() * qCos(radians) - delta.y() * qSin(radians), - pivot.y() + delta.x() * qSin(radians) + delta.y() * qCos(radians) - ); - m_undo << new QPropertyUndoCommand(item->toGraphicsObject(), "pos", QVariant(old_pos), QVariant(new_pos), this); + + /* Exact arithmetic for the right angles instead of qCos()/qSin(). + * The rotate actions only ever pass multiples of 90 degrees, and + * at 90 qCos() returns 6.12e-17 rather than 0, so the generic trig + * path introduces error for no benefit: rotating a point through + * four 90 degree steps would not return it to where it started. + * A quadrant is just an axis swap, which is exact. */ + QPointF offset; + const int quadrant = qRound(angle / 90.0); + if (qFuzzyCompare(angle, quadrant * 90.0)) + { + switch (((quadrant % 4) + 4) % 4) + { + case 1: offset = QPointF(-delta.y(), delta.x()); break; + case 2: offset = QPointF(-delta.x(), -delta.y()); break; + case 3: offset = QPointF( delta.y(), -delta.x()); break; + default: offset = delta; break; + } + } + else + { + const qreal radians = qDegreesToRadians(angle); + offset = QPointF( + delta.x() * qCos(radians) - delta.y() * qSin(radians), + delta.x() * qSin(radians) + delta.y() * qCos(radians)); + } + + m_undo << new QPropertyUndoCommand(item->toGraphicsObject(), "pos", QVariant(old_pos), QVariant(pivot + offset), this); } /** From 43e4603c5576970f746f46311825f19cffc66e18 Mon Sep 17 00:00:00 2001 From: Andre Rummler Date: Fri, 7 Aug 2026 07:59:39 +0200 Subject: [PATCH 07/20] Fixing minimum width calculation for title block which could lead to division by zero and subsequent program crash if opening a template with only relative sized columns. --- sources/titleblocktemplate.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/sources/titleblocktemplate.cpp b/sources/titleblocktemplate.cpp index 782b3b532..63a3631a6 100644 --- a/sources/titleblocktemplate.cpp +++ b/sources/titleblocktemplate.cpp @@ -26,6 +26,7 @@ #include #include +#include /** @brief TitleBlockTemplate::TitleBlockTemplate Constructor @@ -973,14 +974,20 @@ int TitleBlockTemplate::minimumWidth() // => (1 - (sum(REL)/100))TOT >= sum(ABS) // => TOT >= sum(ABS) / (1 - (sum(REL)/100)) // => TOT >= sum(ABS) / ((100 - sum(REL))/100)) - return( - qRound( - columnTypeTotal(QET::Absolute) - / - ((100.0 - columnTypeTotal(QET::RelativeToTotalLength)) - / 100.0) - ) - ); + int abs_total = columnTypeTotal(QET::Absolute); + qreal denominator = (100.0 - columnTypeTotal(QET::RelativeToTotalLength)) / 100.0; + + if (denominator <= 0.0) { + // The relative-to-total-length columns alone already consume + // 100% (or more) of the available width, so the formula above + // would divide by zero (or go negative). If there are no + // absolute-width columns, there is no meaningful minimum width + // to enforce; if there are, the template is asking for more + // than 100% of its own width, which cannot be satisfied. + return abs_total > 0 ? std::numeric_limits::max() : 0; + } + + return(qRound(abs_total / denominator)); } /** From 99151b9c04b5ad730f34d3f6c998216da0cb3865 Mon Sep 17 00:00:00 2001 From: Andre Rummler Date: Fri, 7 Aug 2026 11:39:08 +0200 Subject: [PATCH 08/20] Report "no constraint" (still needs the translations; to be added in the next translation round I guess) from minimumWidth() for a title template instead of an arbitrary value. Following up on the earlier division-by-zero fix: return -1 from the bad denominator branch of minimumWidth(), matching the "no constraint" convention maximumWidth() already uses, instead of std::numeric_limits::max() or 0. Update TitleBlockTemplateView::updateDisplayedMinMaxWidth() to skip the "Longueur minimale" line when minimumWidth() reports -1, mirroring its existing handling of maximumWidth() == -1. --- sources/titleblock/templateview.cpp | 18 ++++++++++++++++-- sources/titleblocktemplate.cpp | 10 ++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/sources/titleblock/templateview.cpp b/sources/titleblock/templateview.cpp index 096f96c0f..b41881d82 100644 --- a/sources/titleblock/templateview.cpp +++ b/sources/titleblock/templateview.cpp @@ -999,20 +999,34 @@ void TitleBlockTemplateView::updateDisplayedMinMaxWidth() int max_width = tbtemplate_ -> maximumWidth(); QString min_max_width_sentence; - if (max_width != -1) { + if (min_width != -1 && max_width != -1) { min_max_width_sentence = QString( tr( "Longueur minimale : %1px\nLongueur maximale : %2px\n", "tooltip showing the minimum and/or maximum width of the edited template" ) ).arg(min_width).arg(max_width); - } else { + } else if (min_width != -1) { min_max_width_sentence = QString( tr( "Longueur minimale : %1px\n", "tooltip showing the minimum width of the edited template" ) ).arg(min_width); + } else if (max_width != -1) { + min_max_width_sentence = QString( + tr( + "Longueur maximale : %1px\n", + "tooltip showing the maximum width of the edited template" + ) + ).arg(max_width); + } else { + min_max_width_sentence = QString( + tr( + "Longueur non contrainte.\n", + "tooltip shown when the edited template has neither a minimum nor a maximum width constraint" + ) + ); } // the tooltip may also display the split label for readability purpose diff --git a/sources/titleblocktemplate.cpp b/sources/titleblocktemplate.cpp index 63a3631a6..1e9b45a41 100644 --- a/sources/titleblocktemplate.cpp +++ b/sources/titleblocktemplate.cpp @@ -26,7 +26,6 @@ #include #include -#include /** @brief TitleBlockTemplate::TitleBlockTemplate Constructor @@ -980,11 +979,10 @@ int TitleBlockTemplate::minimumWidth() if (denominator <= 0.0) { // The relative-to-total-length columns alone already consume // 100% (or more) of the available width, so the formula above - // would divide by zero (or go negative). If there are no - // absolute-width columns, there is no meaningful minimum width - // to enforce; if there are, the template is asking for more - // than 100% of its own width, which cannot be satisfied. - return abs_total > 0 ? std::numeric_limits::max() : 0; + // would divide by zero (or go negative). There is no finite + // minimum width this formula can determine. Report "no + // constraint", the same convention maximumWidth() uses. + return -1; } return(qRound(abs_total / denominator)); From 57d0b4b5a396fc1f3a173808ddfe68737cd7a178 Mon Sep 17 00:00:00 2001 From: Kellermorph Date: Fri, 7 Aug 2026 13:48:40 +0200 Subject: [PATCH 09/20] fix whitespace --- sources/diagram.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sources/diagram.h b/sources/diagram.h index 360888186..36b346463 100644 --- a/sources/diagram.h +++ b/sources/diagram.h @@ -126,9 +126,9 @@ class Diagram : public QGraphicsScene bool use_border_; bool draw_guides_; QList m_guides_list; - bool draw_terminals_; - bool draw_terminal_names_; - bool draw_colored_conductors_; + bool draw_terminals_; + bool draw_terminal_names_; + bool draw_colored_conductors_; QString m_conductors_autonum_name; DiagramEventInterface *m_event_interface; From 41e83bbc09f2aa4dcd2dd03871abbc732421c140 Mon Sep 17 00:00:00 2001 From: ispyisail Date: Sat, 8 Aug 2026 09:40:25 +1200 Subject: [PATCH 10/20] Keep group rotation on-grid when X and Y grid sizes differ Raised by plc-user in discussion #618: the diagram editor allows moving elements by as little as 1px, and asked that rotation not undershoot that. Checking the actual constraint (Settings -> DiagramEditor_xGrid_sb / _yGrid_sb, both independently configurable, minimum 1, maximum 30) turned up a real, verified gap this PR's existing fractional-pivot fix doesn't cover: an ASYMMETRIC grid (xGrid != yGrid). Swapping X/Y deltas for a 90-degree turn -- the exact-arithmetic path already in this file -- only stays on the configured grid if xGrid == yGrid. With an asymmetric grid, a delta that was a clean multiple of xGrid lands on the Y axis after the swap, where the grid unit is yGrid, and one is not generally a multiple of the other. Verified on a real build (not just derived): two elements at (100,210) and (150,420), both on-grid under xGrid=10/yGrid=7, selected and group-rotated 90 degrees via a temporary local CLI harness. before this change: (242,292) and (32,342) -- off-grid on both axes after this change: (240,294) and ( 30,343) -- exactly on-grid Confirmed the same drift is present without this change too (i.e. not something introduced elsewhere) and that xGrid==yGrid, the common case, is unaffected: snapping an already-on-grid point is a no-op. Fix: re-snap the final computed position to Diagram::snapToGrid(), not just the shared pivot, for the exact-90-degree path. Left the arbitrary-angle trig fallback alone -- it has no caller today (the diagram editor only ever passes multiples of 90) and "on-grid" doesn't have a clean meaning for an arbitrary angle regardless of grid shape. Does not attempt to fix a separate, pre-existing property surfaced while testing this: four consecutive 90-degree turns do not reliably return a selection to its exact starting position, even on a symmetric grid, because each RotateSelectionCommand recomputes the pivot fresh from the selection's current sceneBoundingRect(), and an item whose bounding box isn't rotationally symmetric reports a different box (and therefore a different centre) at 0 and 90 degrees. Verified this drift is identical with and without this change, so it is not a regression -- just a different, harder guarantee this change does not attempt. Co-Authored-By: Claude Opus 5 --- .../undocommand/rotateselectioncommand.cpp | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/sources/undocommand/rotateselectioncommand.cpp b/sources/undocommand/rotateselectioncommand.cpp index 341f01a2b..089d022ac 100644 --- a/sources/undocommand/rotateselectioncommand.cpp +++ b/sources/undocommand/rotateselectioncommand.cpp @@ -149,7 +149,8 @@ void RotateSelectionCommand::addGroupPositionUndo(QGraphicsItem *item, const QPo * A quadrant is just an axis swap, which is exact. */ QPointF offset; const int quadrant = qRound(angle / 90.0); - if (qFuzzyCompare(angle, quadrant * 90.0)) + bool exact_quadrant = qFuzzyCompare(angle, quadrant * 90.0); + if (exact_quadrant) { switch (((quadrant % 4) + 4) % 4) { @@ -167,7 +168,40 @@ void RotateSelectionCommand::addGroupPositionUndo(QGraphicsItem *item, const QPo delta.x() * qSin(radians) + delta.y() * qCos(radians)); } - m_undo << new QPropertyUndoCommand(item->toGraphicsObject(), "pos", QVariant(old_pos), QVariant(pivot + offset), this); + QPointF new_pos = pivot + offset; + if (exact_quadrant) + { + /* Swapping X/Y deltas for a 90/270 turn only stays on the + * user's configured grid if xGrid == yGrid. With an + * asymmetric grid (both independently configurable, 1-30 px, + * in Settings) a delta that was a clean multiple of xGrid + * lands on the Y axis after the swap, where the grid unit is + * yGrid -- and 10 is not a multiple of 7. Verified this + * drifts a grid-aligned point off-grid without this snap + * (e.g. xGrid=10/yGrid=7: (100,210) rotates to (225,295), + * x%10==5), and that adding it corrects exactly that case on + * a real build (same inputs land on x%10==0, y%7==0). + * + * For xGrid == yGrid, snapping an already-on-grid point is a + * no-op, so this leaves that case's arithmetic unchanged. + * It does NOT, on its own, guarantee that four consecutive + * 90-degree turns return a selection to its exact starting + * position even on a symmetric grid: each RotateSelectionCommand + * recomputes the pivot fresh from the selection's CURRENT + * sceneBoundingRect(), and an item whose bounding box isn't + * rotationally symmetric (e.g. a wide text label) reports a + * different box, and therefore a different box centre, at 0 + * and 90 degrees. That drift is pre-existing -- verified + * identical with and without this change -- and a separate + * problem from the one this fixes: staying on-grid after + * every individual turn is the property that matters day to + * day; bit-exact round-tripping through several consecutive + * rotations is a different, harder guarantee this change + * does not attempt. */ + new_pos = Diagram::snapToGrid(new_pos); + } + + m_undo << new QPropertyUndoCommand(item->toGraphicsObject(), "pos", QVariant(old_pos), QVariant(new_pos), this); } /** From 6d2995ad68658eab4559e52fa00055cd799ef7d1 Mon Sep 17 00:00:00 2001 From: Kellermorph Date: Sat, 8 Aug 2026 08:09:45 +0200 Subject: [PATCH 11/20] set to false --- sources/exportproperties.cpp | 4 ++-- sources/print/projectprintwindow.ui | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sources/exportproperties.cpp b/sources/exportproperties.cpp index e13a5fb76..7e85a4b2d 100644 --- a/sources/exportproperties.cpp +++ b/sources/exportproperties.cpp @@ -34,7 +34,7 @@ ExportProperties::ExportProperties() : draw_border(true), draw_titleblock(true), draw_terminals(false), - draw_terminal_names(true), + draw_terminal_names(false), draw_bg_transparent(false), draw_colored_conductors(true), exported_area(QET::BorderArea) @@ -109,7 +109,7 @@ void ExportProperties::fromSettings(QSettings &settings, draw_terminals = settings.value(prefix % "drawterminals", false).toBool(); draw_terminal_names = settings.value(prefix % "drawterminalnames", - true).toBool(); + false).toBool(); draw_bg_transparent = settings.value(prefix % "drawbgtransparent", false).toBool(); draw_colored_conductors = settings.value( diff --git a/sources/print/projectprintwindow.ui b/sources/print/projectprintwindow.ui index 0f3f9b204..2d1aec28c 100644 --- a/sources/print/projectprintwindow.ui +++ b/sources/print/projectprintwindow.ui @@ -184,14 +184,14 @@ - - - Dessiner les noms des bornes - - - true - - + + + Dessiner les noms des bornes + + + false + + From d2b2a2eadbb8699bc2541794ebd0da9d0802bac4 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Sat, 8 Aug 2026 10:23:06 +0200 Subject: [PATCH 12/20] Update translations files --- lang/qet_ar.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_ca.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_cs.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_da.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_de.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_el.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_en.qm | Bin 316402 -> 316680 bytes lang/qet_en.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_es.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_fr.qm | Bin 205059 -> 205213 bytes lang/qet_fr.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_hr.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_hu.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_it.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_ja.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_ko.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_mn.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_nb.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_nl_BE.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_nl_NL.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_pl.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_pt.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_pt_BR.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_ro.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_rs.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_ru.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_sk.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_sl.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_sr.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_sv.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_tr.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_uk.ts | 96 +++++++++++++++++++++++++--------------------- lang/qet_zh.ts | 96 +++++++++++++++++++++++++--------------------- 33 files changed, 1643 insertions(+), 1333 deletions(-) diff --git a/lang/qet_ar.ts b/lang/qet_ar.ts index 07c964f69..55647f91e 100644 --- a/lang/qet_ar.ts +++ b/lang/qet_ar.ts @@ -1321,7 +1321,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur تغيير العمق @@ -3572,94 +3572,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title تصدير في المجلد - + Dossier cible : المجلدالهدف: - + Parcourir استعراض - + Format : تنسيق : - + PNG (*.png) (PNG (*.png - + JPEG (*.jpg) (JPEG (*.jpg - + Bitmap (*.bmp) (Bitmap (*.bmp - + SVG (*.svg) (SVG (*.svg - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title خيارات العرض - + Exporter entièrement le folio تصدير الصفحة كاملة - + Exporter seulement les éléments تصدير العناصر فقط - + Dessiner la grille رسم الشبكة - + Dessiner le cadre رسم الإطار - + Dessiner le cartouche رسم إطار التعريف - + Dessiner les bornes رسم أطراف التوصيل - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs احتفظ بألوان الأسلاك الموصلة - + SVG: fond transparent @@ -6319,102 +6324,107 @@ Les variables suivantes sont incompatibles : رسم أطراف التوصيل - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page موائمة الصفحة مع الورقة - + Utiliser toute la feuille استعمل كلّ الورقة - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur مُلائمة العرض - + Ajuster la page مُلائمة الصفحة - + Zoom arrière تصغير - + Zoom avant تكبير - + Paysage مشهد أفقي - + Portrait مشهد عمودي - + Première page الصفحة الأولى - + Page précédente الصفحة السابقة - + Page suivante الصفحة التالية - + Dernière page الصفحة الأخيرة - + Afficher une seule page - + Afficher deux pages عرض صفحتين - + Afficher un aperçu de toutes les pages عرض لمحة عن كلّ الصفحات - + mise en page @@ -6441,22 +6451,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre صفحة بدون عنوان - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_ca.ts b/lang/qet_ca.ts index 2a5ad9c1a..dac86429f 100644 --- a/lang/qet_ca.ts +++ b/lang/qet_ca.ts @@ -1319,7 +1319,7 @@ Nota: Aquestes opcions NO permeten ni bloquegen les numeracions automàtiques, n Diagram - + Modifier la profondeur Canvia la profunditat @@ -3560,94 +3560,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Exporta a la carpeta - + Dossier cible : Carpeta de destinació: - + Parcourir Navega - + Format : Format : - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Opcions de renderització - + Exporter entièrement le folio Exporta el full complet - + Exporter seulement les éléments Exporta només els elements - + Dessiner la grille Dibuixa la graella - + Dessiner le cadre Dibuixa el quadre - + Dessiner le cartouche Dibuixa el caixetí - + Dessiner les bornes Dibuixa els borns - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Manté els colors dels conductors - + SVG: fond transparent SVG: fons transparent @@ -6331,102 +6336,107 @@ Les variables següents són incompatibles: Dibuixa els borns - + + Dessiner les noms des bornes + + + + Option d'impression Opció d'impressió - + Adapter le folio à la page Adapta el full a la pàgina - + Utiliser toute la feuille Empra tot el full - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Si aquesta opció està marcada, el full s'ampliarà o es reduirà per omplir tota l'àrea imprimible d'una i només una pàgina." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Si aquesta opció està marcada, els marges del full s'ignoraran i s'utilitzarà tota l'àrea del full per a la impressió. Pot ser que la impressora no ho admeti. - + toolBar Barra d'eines - + Ajuster la largeur Ajusta a l'amplada - + Ajuster la page Ajusta a la pàgina - + Zoom arrière Allunya - + Zoom avant Apropa - + Paysage Apaïsat - + Portrait Retrat - + Première page Primera pàgina - + Page précédente Pàgina anterior - + Page suivante Pàgina següent - + Dernière page Darrera pàgina - + Afficher une seule page Mostra només una pàgina - + Afficher deux pages Mostra dues pàgines - + Afficher un aperçu de toutes les pages Mostra una vista prèvia de totes les pàgines - + mise en page maquetació @@ -6453,22 +6463,22 @@ Les variables següents són incompatibles: Exporta com a pdf - + Mise en page (non disponible sous Windows pour l'export PDF) Configuració de pàgina (no disponible a Windows per a l'exportació a PDF) - + Folio sans titre Full sense títol - + Exporter sous : Exporta com a: - + Fichier (*.pdf) Fitxer (*.pdf) diff --git a/lang/qet_cs.ts b/lang/qet_cs.ts index e09e47ed7..7df212ecc 100644 --- a/lang/qet_cs.ts +++ b/lang/qet_cs.ts @@ -1319,7 +1319,7 @@ Poznámka: tyto volby automatické číslování ani NEPOVOLÍ ani nezakáží, Diagram - + Modifier la profondeur Změnit hloubku @@ -3558,94 +3558,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Vyvést do adresáře - + Dossier cible : Cílový adresář: - + Parcourir Procházet - + Format : Formát: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmapa (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Volby pro znázornění - + Exporter entièrement le folio Vyvést list úplně - + Exporter seulement les éléments Vyvést pouze prvky - + Dessiner la grille Kreslit mřížku - + Dessiner le cadre Kreslit okraj - + Dessiner le cartouche Kreslit záhlaví výkresu - + Dessiner les bornes Kreslit svorky - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Zachovat barvy vodičů - + SVG: fond transparent SVG: průhledné pozadí @@ -6324,102 +6329,107 @@ Následující proměnné jsou neslučitelné: Kreslit svorky - + + Dessiner les noms des bornes + + + + Option d'impression Volba tisku - + Adapter le folio à la page Přizpůsobit list straně - + Utiliser toute la feuille Použít celou stranu - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Pokud je zaškrtnuta tato volba, list bude zvětšen nebo zmenšen, aby zaplnil tisknutelnou plochu jedné a pouze jedné strany." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Je-li zaškrtnuta tato volba, nebude brán zřetel na okraje papíru a celý jeho povrch se využije při tisku. Tuto možnost vaše tiskárna nemusí podporovat. - + toolBar Pruh s nástroji - + Ajuster la largeur Přizpůsobit šířku - + Ajuster la page Přizpůsobit stranu - + Zoom arrière Oddálit - + Zoom avant Přiblížit - + Paysage Na šířku - + Portrait Na výšku - + Première page První strana - + Page précédente Předchozí strana - + Page suivante Další strana - + Dernière page Poslední strana - + Afficher une seule page Zobrazit jednu stranu - + Afficher deux pages Zobrazit dvě strany - + Afficher un aperçu de toutes les pages Zobrazit náhled na všechny strany - + mise en page Rozvržení strany @@ -6446,22 +6456,22 @@ Následující proměnné jsou neslučitelné: Vyvést do PDF - + Mise en page (non disponible sous Windows pour l'export PDF) Rozvržení (nedostupné v OS Windows pro vyvedení do PDF) - + Folio sans titre List bez názvu - + Exporter sous : Vyvést jako: - + Fichier (*.pdf) Soubor (*.pdf) diff --git a/lang/qet_da.ts b/lang/qet_da.ts index ea72c46d9..162a48493 100644 --- a/lang/qet_da.ts +++ b/lang/qet_da.ts @@ -1319,7 +1319,7 @@ Bemærk: Disse muligheder VIL IKKE tillade eller blokere autonummereringer, kun Diagram - + Modifier la profondeur Diagram @@ -3557,94 +3557,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Eksportere til mappe - + Dossier cible : Mål mappe: - + Parcourir Gennemse - + Format : Format: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Renderingsindstillinger - + Exporter entièrement le folio Eksportere alle ark - + Exporter seulement les éléments Eksportere kun symboler - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Behold leder farver - + SVG: fond transparent - + Dessiner la grille Tegn gitter - + Dessiner le cadre Tegn ramme - + Dessiner le cartouche Tegn titelblok - + Dessiner les bornes Tegn terminaler @@ -6322,102 +6327,107 @@ Følgende variabler er ikke kompatible: Tegn terminaler - + + Dessiner les noms des bornes + + + + Option d'impression Udskrivningsindstillinger - + Adapter le folio à la page Tilpas ark til side - + Utiliser toute la feuille Brug hele siden - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Hvis indstilling er markeret, forstørres eller formindskes ark for at fylde hele den udskrivbare side på én side. " - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Hvis indstilling er markeret, ignoreres arkets margener, og hele overfladen vil blive brugt til udskrivning. Dette understøttes muligvis ikke af printeren. - + toolBar værktøjsbjælke - + Ajuster la largeur Tilpas bredde - + Ajuster la page Tilpas side - + Zoom arrière Formindsk - + Zoom avant Forstør - + Paysage Landskab - + Portrait Portræt - + Première page Forside - + Page précédente Foregående side - + Page suivante Næste side - + Dernière page Seneste side - + Afficher une seule page Vis 1 side - + Afficher deux pages Vis 2 sider - + Afficher un aperçu de toutes les pages Vis eksempel for alle sider - + mise en page udseende @@ -6444,22 +6454,22 @@ Følgende variabler er ikke kompatible: Eksportere til PDF - + Mise en page (non disponible sous Windows pour l'export PDF) Udseende (ikke tilgængelig i Windows PDF eksport) - + Folio sans titre Ikke navngivet ark - + Exporter sous : Eksportere som: - + Fichier (*.pdf) Fil (*.pdf) diff --git a/lang/qet_de.ts b/lang/qet_de.ts index 488508aae..ecea09f1c 100644 --- a/lang/qet_de.ts +++ b/lang/qet_de.ts @@ -1322,7 +1322,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Diagram - + Modifier la profondeur Ebene der Auswahl bearbeiten @@ -3577,94 +3577,99 @@ Mit dem Import dieser Datei bestätigen Sie, dass: ExportPropertiesWidget - + Exporter dans le dossier dialog title in Ordner exportieren - + Dossier cible : Zielordner: - + Parcourir Durchsuchen - + Format : Format: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Renderoptionen - + Exporter entièrement le folio Ganze Folie exportieren - + Exporter seulement les éléments Nur Bauteile exportieren - + Dessiner la grille Raster zeichnen - + Dessiner le cadre Zeichnungsrahmen zeichnen - + Dessiner le cartouche Schriftfeld zeichnen - + Dessiner les bornes Anschlüsse zeichnen - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Leiterfarben erhalten - + SVG: fond transparent SVG: transparenter Hintergrund @@ -6346,102 +6351,107 @@ Folgende Variablen sind inkompatibel: Anschlüsse zeichnen - + + Dessiner les noms des bornes + + + + Option d'impression Druckoptionen - + Adapter le folio à la page Folie an Seitengröße anpassen - + Utiliser toute la feuille Gesamte Blattfläche verwenden - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Wenn diese Option aktiviert ist, wird das Folio vergrößert oder verkleinert, um den gesamten druckbaren Bereich einer einzigen Seite auszufüllen." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Wenn diese Option aktiviert ist, werden die Seitenränder ignoriert und das gesamte Blatt zum Drucken verwendet. Dies wird von Ihrem Drucker möglicherweise nicht unterstützt. - + toolBar Werkzeugleiste Druckoptionen - + Ajuster la largeur Auf Seitenbreite anpassen - + Ajuster la page Auf ganze Seite anpassen - + Zoom arrière Verkleinern - + Zoom avant Vergrößern - + Paysage Querformat - + Portrait Hochformat - + Première page Erste Seite - + Page précédente Vorherige Seite - + Page suivante Nächste Seite - + Dernière page Letzte Seite - + Afficher une seule page Einzelseite anzeigen - + Afficher deux pages Zwei Seiten anzeigen - + Afficher un aperçu de toutes les pages Alle Seiten anzeigen - + mise en page Seite einrichten @@ -6468,22 +6478,22 @@ Folgende Variablen sind inkompatibel: Als PDF speichern - + Mise en page (non disponible sous Windows pour l'export PDF) Layout (unter Windows für den PDF-Export nicht verfügbar) - + Folio sans titre Folie ohne Titel - + Exporter sous : Exportieren als: - + Fichier (*.pdf) Datei (*.pdf) diff --git a/lang/qet_el.ts b/lang/qet_el.ts index bb95de70b..ab92a00cf 100644 --- a/lang/qet_el.ts +++ b/lang/qet_el.ts @@ -1319,7 +1319,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur Μετατροπή του βάθους @@ -3557,94 +3557,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Εξαγωγή στον κατάλογο - + Dossier cible : Κατάλογος προορισμού: - + Parcourir Πλοήγηση - + Format : Μορφή: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Επιλογές αποτύπωσης - + Exporter entièrement le folio Εξαγωγή ολόκληρης της σελίδας - + Exporter seulement les éléments Εξαγωγή των στοιχείων μόνο - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Διατήρηση των χρωματισμών των αγωγών - + SVG: fond transparent - + Dessiner la grille Σχεδίαση του δικτυώματος - + Dessiner le cadre Σχεδίαση των ορίων - + Dessiner le cartouche Σχεδίαση της πινακίδας - + Dessiner les bornes Σχεδίαση των ακροδεκτών @@ -6320,102 +6325,107 @@ Les variables suivantes sont incompatibles : Σχεδίαση των ακροδεκτών - + + Dessiner les noms des bornes + + + + Option d'impression Επιλογές εκτύπωσης - + Adapter le folio à la page Προσαρμογή στη σελίδα - + Utiliser toute la feuille Χρήση ολόκληρης της σελίδας - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Αν αυτή η επιλογή είναι σημειωμένη, το φύλλο θα μεγαλόσει ή θα μικρύνει ώστε να χωρέσει σε μία και μόνο σελίδα. " - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Αν αυτή η επιλογή είναι σημειωμένη, τα περιθώρια της σελίδας θα αγνοηθούν και θα χρησιμοποιηθεί ολη η επιφάνεια για εκτύπωση. Θα πρέπει να υποστηρίζεται από τον εκτυπωτή. - + toolBar - + Ajuster la largeur Ταίριασμα στο πλάτος - + Ajuster la page Ταίριασμα στη σελίδα - + Zoom arrière Σμίκρυνση - + Zoom avant Μεγέθυνση - + Paysage Οριζόντια - + Portrait Κάθετα - + Première page Πρώτη σελίδα - + Page précédente Προηγούμενη σελίδα - + Page suivante Επόμενη σελίδα - + Dernière page Τελευταία σελίδα - + Afficher une seule page Προβολή μονής σελίδας - + Afficher deux pages Προβολή αντικριστών σελίδων - + Afficher un aperçu de toutes les pages Προβολή όλων των σελίδων - + mise en page Διαμόρφωση της σελίδας @@ -6442,22 +6452,22 @@ Les variables suivantes sont incompatibles : Εξαγωγή ως pdf - + Mise en page (non disponible sous Windows pour l'export PDF) Διάταξη (μη διαθέσιμο στα windows για εξαγωγή PDF) - + Folio sans titre Ανώνυμη σελίδα - + Exporter sous : Εξαγωγή ως: - + Fichier (*.pdf) Αρχείο (*.pdf) diff --git a/lang/qet_en.qm b/lang/qet_en.qm index 3c294cf4be6af322854730e315773e3108010aa0..6fa4ede8759f0154b733b80ba13d730b2838bf4f 100644 GIT binary patch delta 18436 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

FSa#bo-%m8Xt(c@rU8eNK^g8c%9GUdq8ZQ zb$;jW0oUfH&Myl?Z>t=g-(4(;-}Mqny%$T|Ge+X=9=Zj39PfuMbO9ZL0g`v>0xzM@ z59_ZB>VfLF<3`=$IEw1kQMdSs5e`&6-QuUQSO!GsmSfBWmA8rT4<=ckL>g)zR#7?EUteS?0Knch_wZH~Q@1-!(iEk!b~zY^!0 zi{yfxbkS3=4;<1|7jw57&)!70a|w@zzf!mJ7TUq31YPXFI&s%s;^GX6ms{y#bHi}w z+aTTUlo$B4g^_O06eQnA7sr&iCJ^AQJMa)=WWWkt!WcVX?LBnKYp^%r-BWkOF9#R9 zhUt#_TLO7ft~(J|g@$uaqW>g`m&$Y}aC<1dr_h}|v<4Se!gOhK@X4UHRF`(424Lf5 z-5F(nU>h@ZXIkNTLOgVNOVLnw&e7#<48jNgr$_7Z?LGp%IZT)DiFcIsM|bnq9Uy57 zbhk2(U@3k{cV~JjCixM%qSS1l&zI{SgucL4whM*_qfPbu%XF3f@lnhX*L9T%s8Cjw z>ME=8Q6LKwUDfJ_sJ~lC%snZRc^uSLCA$KdK3Vs*>LF@oJKeXtsPX6+-M4#nOx1lW zLXs%mx8gc})cveLEs%Rq_m4b6(TQw|_v6%2SCbwN^?*CAtHn2HnXfN!tCxhY9&={( b7;;H_=9&koy0flVSBn4GnO Diagram - + Modifier la profondeur Change the depth @@ -3570,94 +3570,99 @@ By importing this file, you confirm that: ExportPropertiesWidget - + Exporter dans le dossier dialog title Export in the directory - + Dossier cible : Target directory: - + Parcourir Browse - + Format : Format: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Rendering options - + Exporter entièrement le folio Export fully folio - + Exporter seulement les éléments Export elements only - + + Dessiner les noms des bornes + Draw the names of the terminals + + + Conserver les couleurs des conducteurs Keep conductors colors - + SVG: fond transparent SVG-background transparent - + Dessiner la grille Draw the grid - + Dessiner le cadre Draw the border - + Dessiner le cartouche Draw the title block - + Dessiner les bornes Draw terminals @@ -6330,102 +6335,107 @@ The following variables are incompatible: Draw terminals - + + Dessiner les noms des bornes + Draw the names of the terminals + + + Option d'impression Printing option - + Adapter le folio à la page Fit folio to page - + Utiliser toute la feuille Use the whole page - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." If this option is checked, the folio will be enlarged or shrunk to fill the entire printable surface of one and only one page. " - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. If this option is checked, the margins of the sheet will be ignored and its entire surface will be used for printing. This may not be supported by your printer. - + toolBar toolBar - + Ajuster la largeur Fit to width - + Ajuster la page Fit to page - + Zoom arrière Zoom Out - + Zoom avant Zoom In - + Paysage Landscape - + Portrait Portrait - + Première page First page - + Page précédente Previous page - + Page suivante Next page - + Dernière page Last page - + Afficher une seule page Show single page - + Afficher deux pages Display facing pages - + Afficher un aperçu de toutes les pages Display all pages - + mise en page Page layout @@ -6452,22 +6462,22 @@ The following variables are incompatible: Export in pdf - + Mise en page (non disponible sous Windows pour l'export PDF) Layout (not available on Windows for PDF export) - + Folio sans titre Untitled folio - + Exporter sous : Export as : - + Fichier (*.pdf) File (*.pdf) diff --git a/lang/qet_es.ts b/lang/qet_es.ts index 21c8f069a..45302da0e 100644 --- a/lang/qet_es.ts +++ b/lang/qet_es.ts @@ -1320,7 +1320,7 @@ Nota: Estas opciones NO permiten o bloquean las Numeraciones automáticas, solo Diagram - + Modifier la profondeur Editar la profundidad @@ -3566,94 +3566,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Exporta en la carpeta - + Dossier cible : Carpeta de destino: - + Parcourir Navegar - + Format : Formato: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Opciones de representación - + Exporter entièrement le folio Exporta el folio completo - + Exporter seulement les éléments Exporta solamente los elementos - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Conserva los colores de los conductores - + SVG: fond transparent SVG: fondo transparente - + Dessiner la grille Dibuja la rejilla - + Dessiner le cadre Dibuja el marco - + Dessiner le cartouche Dibuja el rótulo - + Dessiner les bornes Dibuja los conectores @@ -6334,102 +6339,107 @@ Las siguientes variables son incompatibles; Dibujar los conectores - + + Dessiner les noms des bornes + + + + Option d'impression Opciones de impresión - + Adapter le folio à la page Ajustar el folio a la página - + Utiliser toute la feuille Utilizar toda la hoja - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Si se marca esta opción, el folio se ampliará o reducirá para llenar toda el área imprimible en una sóla página." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Si se marca esta opción, se ignorarán los márgenes de la hoja y se utilizará toda su superficie para la impresión. Es posible que su impresora no admita esto opción. - + toolBar Barra de herramientas - + Ajuster la largeur Ajustar ancho de página - + Ajuster la page Ajustar el alto de la página - + Zoom arrière Reducir zoom - + Zoom avant Ampliar zoom - + Paysage Horizontal - + Portrait Vertical - + Première page Primera página - + Page précédente Página anterior - + Page suivante Página siguiente - + Dernière page Última página - + Afficher une seule page Mostrar una sóla página - + Afficher deux pages Mostrar dos páginas - + Afficher un aperçu de toutes les pages Mostrar vista preliminar de todas las páginas - + mise en page Disposición en la página @@ -6456,22 +6466,22 @@ Las siguientes variables son incompatibles; Exportar a PDF - + Mise en page (non disponible sous Windows pour l'export PDF) Disposición en la página (no disponible la exportación PDF en Windows) - + Folio sans titre Folio sin título - + Exporter sous : Exportar cómo : - + Fichier (*.pdf) Archivo (*.PDF) diff --git a/lang/qet_fr.qm b/lang/qet_fr.qm index f2cf5588023cc544ac15ada18414abe3b0fb2843..edeb276dde2e25f3a1f67d9bf3ebdb735ad60cf8 100644 GIT binary patch delta 18168 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 delta 18110 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 jhYwgzy Diagram - + Modifier la profondeur @@ -3545,94 +3545,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title - + Dossier cible : - + Parcourir - + Format : - + PNG (*.png) - + JPEG (*.jpg) - + Bitmap (*.bmp) - + SVG (*.svg) - + DXF (*.dxf) - + Options de rendu groupbox title - + Exporter entièrement le folio - + Exporter seulement les éléments - + Dessiner la grille - + Dessiner le cadre - + Dessiner le cartouche - + Dessiner les bornes - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs - + SVG: fond transparent SVG: fond transparent @@ -6289,102 +6294,107 @@ Les variables suivantes sont incompatibles : - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page - + Utiliser toute la feuille - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur - + Ajuster la page - + Zoom arrière - + Zoom avant - + Paysage - + Portrait - + Première page - + Page précédente - + Page suivante - + Dernière page - + Afficher une seule page - + Afficher deux pages - + Afficher un aperçu de toutes les pages - + mise en page @@ -6411,22 +6421,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_hr.ts b/lang/qet_hr.ts index 35a5d159f..f40a6cd31 100644 --- a/lang/qet_hr.ts +++ b/lang/qet_hr.ts @@ -1312,7 +1312,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur @@ -3542,94 +3542,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Izvezi direktorij - + Dossier cible : Odredišni direktorij: - + Parcourir Pretraži - + Format : Format: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) - + Options de rendu groupbox title Opcije renderiranja - + Exporter entièrement le folio - + Exporter seulement les éléments - + Dessiner la grille Nacrtaj mrežu - + Dessiner le cadre Nacrtaj obrub - + Dessiner le cartouche Nacrtaj umetak - + Dessiner les bornes Nacrtaj priključak - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Zadrži boju vodiča - + SVG: fond transparent @@ -6275,102 +6280,107 @@ Les variables suivantes sont incompatibles : Nacrtaj priključak - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page - + Utiliser toute la feuille Koristi cijelu stranicu - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur Prilagodi širini - + Ajuster la page Prilagodi stranici - + Zoom arrière Smanji - + Zoom avant Povećaj - + Paysage Pejzaž - + Portrait Portret - + Première page Prva stranica - + Page précédente Prethodan stranica - + Page suivante Slijedeća stranica - + Dernière page Posljednja stranica - + Afficher une seule page - + Afficher deux pages Prikaži naslovnu stranicu - + Afficher un aperçu de toutes les pages Prikaži sve stranice - + mise en page @@ -6397,22 +6407,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_hu.ts b/lang/qet_hu.ts index 788424f2b..ae60de7f0 100644 --- a/lang/qet_hu.ts +++ b/lang/qet_hu.ts @@ -1328,7 +1328,7 @@ Megjegyzés: ezek a lehetőségek NEM engedélyezik, vagy blokkolják az Automat Diagram - + Modifier la profondeur Rétegelrendezés módosítása @@ -3564,94 +3564,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Exportálás a könyvtárba - + Dossier cible : Cél könyvtár: - + Parcourir Böngészés - + Format : Formátum : - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitkép (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Feldolgozás lehetőségei - + Exporter entièrement le folio Összes tervlap exportálása - + Exporter seulement les éléments Csak az elemek exportálása - + Dessiner la grille Pontrács rajzolása - + Dessiner le cadre Keret rajzolása - + Dessiner le cartouche Tervjel rajzolása - + Dessiner les bornes Sorkapcsok rajzolása - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Vezetékek színének megtartása - + SVG: fond transparent @@ -6326,102 +6331,107 @@ Az összeférhetetlen változók a következők: Sorkapcsok rajzolása - + + Dessiner les noms des bornes + + + + Option d'impression Nyomtatási lehetőségek - + Adapter le folio à la page A tervlap igazítása a lap méretéhez - + Utiliser toute la feuille Az egész oldal használata - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Ha ez az opció ki van választva, a tervlap nagyíított vagy zsugorított lesz, hogy az egész nyomtatható felületet kitöltse egyetlen egy lapon." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Ha ez az opció ki van választva, akkor a lap margója figyelmen kívül lesz hagyva és az egész nyotatható felület lesz használva. Ezt nem támogatja minden nyomtató. - + toolBar Eszköztár - + Ajuster la largeur Igazítás a szélességhez - + Ajuster la page Igazítás a lap méretéhez - + Zoom arrière Kicsinyítés - + Zoom avant Nagyítás - + Paysage Fekvő helyzetben - + Portrait Álló helyzetben - + Première page Első lap - + Page précédente Előző lap - + Page suivante Következő lap - + Dernière page Utolsó lap - + Afficher une seule page Egy lap mutatása - + Afficher deux pages Szemközti oldalak megjelenítése - + Afficher un aperçu de toutes les pages Az összes oldal megjelenítése - + mise en page Oldal elrendezés @@ -6448,22 +6458,22 @@ Az összeférhetetlen változók a következők: Exportálás PDF-be - + Mise en page (non disponible sous Windows pour l'export PDF) Elrendezés (PDF-fájlok exportálásához nem érhető el Windows-ban) - + Folio sans titre Cím nélküli tervlap - + Exporter sous : Exportálás : - + Fichier (*.pdf) Fájl (*.pdf) diff --git a/lang/qet_it.ts b/lang/qet_it.ts index 367343664..6f3769c06 100644 --- a/lang/qet_it.ts +++ b/lang/qet_it.ts @@ -1319,7 +1319,7 @@ Nota: queste opzioni non consentono attivare o disattivare la numerazione automa Diagram - + Modifier la profondeur Modificare la profondità @@ -3552,94 +3552,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Dessiner les bornes Disegna i terminali - + Exporter entièrement le folio Esporta l'intera pagina - + Exporter seulement les éléments Esporta solo gli elementi - + Dossier cible : Directory di destinazione: - + Options de rendu groupbox title Opzioni di rendering - + Dessiner le cartouche Disegna il cartiglio - + Dessiner la grille Disegna la griglia - + Format : Formato: - + Dessiner le cadre Disegna la cornice - + Parcourir Sfoglia - + Exporter dans le dossier dialog title Esportare nella directory - + Bitmap (*.bmp) Bitmap (*.bmp) - + DXF (*.dxf) DXF (*.dxf) - + + Dessiner les noms des bornes + + + + SVG: fond transparent - + PNG (*.png) PNG (*.png) - + SVG (*.svg) SVG (*.svg) - + JPEG (*.jpg) JPEG (*.jpg) - + Conserver les couleurs des conducteurs Mantenere i colori dei conduttori @@ -6261,17 +6266,17 @@ Funzione : %1 Disegna terminali - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Se questa opzione è selezionata, la pagina verrà ingrandito o ridotto per riempire l'intera superficie stampabile di una e una sola pagina. " - + Première page Prima pagina - + Exporter sous : Espota con nome : @@ -6281,17 +6286,17 @@ Funzione : %1 Esporta in pdf - + Afficher deux pages Visualizza le pagine affiancate - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Se questa opzione è selezionata, i margini del foglio verranno ignorati e l'intera superficie verrà utilizzata per la stampa. Questo potrebbe non essere supportato dalla tua stampante. - + Afficher un aperçu de toutes les pages Visualizza tutte le pagine @@ -6306,7 +6311,7 @@ Funzione : %1 Pagina da stampare : - + Adapter le folio à la page Adatta lo schema alla pagina @@ -6321,7 +6326,7 @@ Funzione : %1 Stampa - + Dernière page Ultima pagina @@ -6331,22 +6336,22 @@ Funzione : %1 In data di : - + Folio sans titre Pagina senza titolo - + Utiliser toute la feuille Usa l'intera pagina - + Paysage Paesaggio - + Portrait Ritratto @@ -6361,12 +6366,17 @@ Funzione : %1 Disegna il bordo - + + Dessiner les noms des bornes + + + + Option d'impression Opzioni di stampa - + Zoom arrière Zoom Out @@ -6376,17 +6386,17 @@ Funzione : %1 Deseleziona tutto - + Ajuster la largeur Adatta alla larghezza - + Page précédente Pagina precedente - + toolBar toolBar @@ -6408,22 +6418,22 @@ Funzione : %1 progetto - + Mise en page (non disponible sous Windows pour l'export PDF) Layout (non disponibile su Windows per esportazione PDF) - + Fichier (*.pdf) - + mise en page Layout di pagina - + Page suivante Pagina seguente @@ -6433,12 +6443,12 @@ Funzione : %1 Mantieni i colori dei conduttori - + Ajuster la page Adatta alla pagina - + Zoom avant Zoom avanti @@ -6453,7 +6463,7 @@ Funzione : %1 Tutte le date - + Afficher une seule page Mostra pagina singola diff --git a/lang/qet_ja.ts b/lang/qet_ja.ts index 181be75f1..689b4cfad 100644 --- a/lang/qet_ja.ts +++ b/lang/qet_ja.ts @@ -1319,7 +1319,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur 重なりの変更 @@ -3556,94 +3556,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title フォルダにエクスポート - + Dossier cible : 出力フォルダ : - + Parcourir 参照 - + Format : 形式 : - + PNG (*.png) - + JPEG (*.jpg) - + Bitmap (*.bmp) ビットマップ (*.bmp) - + SVG (*.svg) - + DXF (*.dxf) - + Options de rendu groupbox title 描画オプション - + Exporter entièrement le folio フォリオ全体をエクスポート - + Exporter seulement les éléments 要素だけをエクスポート - + Dessiner la grille グリッドを描く - + Dessiner le cadre 図枠を描く - + Dessiner le cartouche 表題欄を描く - + Dessiner les bornes 端子を描く - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs 導体の色を保持 - + SVG: fond transparent @@ -6318,102 +6323,107 @@ Les variables suivantes sont incompatibles : 端子を描く - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page フォリオをページに合わせる - + Utiliser toute la feuille ページの全体を利用 - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur 幅に合わせる - + Ajuster la page ページに合わせる - + Zoom arrière ズームアウト - + Zoom avant ズームイン - + Paysage - + Portrait - + Première page 最初のページ - + Page précédente 前のページ - + Page suivante 次のページ - + Dernière page 最後のページ - + Afficher une seule page - + Afficher deux pages 見開きページ表示 - + Afficher un aperçu de toutes les pages 全てのページを表示 - + mise en page @@ -6440,22 +6450,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre 無題のフォリオ - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_ko.ts b/lang/qet_ko.ts index f51b5db39..771a12f79 100644 --- a/lang/qet_ko.ts +++ b/lang/qet_ko.ts @@ -1317,7 +1317,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur 앞뒤 순서 변경 @@ -3549,94 +3549,99 @@ Tout les éléments et les dossier contenus dans ce dossier seront supprimés. ExportPropertiesWidget - + Exporter dans le dossier dialog title 폴더로 내보내기 - + Dossier cible : 대상 폴더 : - + Parcourir 찾아보기 - + Format : 형식 : - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title 렌더링 옵션 - + Exporter entièrement le folio 시트 전체 내보내기 - + Exporter seulement les éléments 요소만 내보내기 - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs 도선 색상 유지 - + SVG: fond transparent SVG: 배경 투명 - + Dessiner la grille 격자 표시 - + Dessiner le cadre 테두리 그리기 - + Dessiner le cartouche 표제란 그리기 - + Dessiner les bornes 단자 그리기 @@ -6281,102 +6286,107 @@ Les variables suivantes sont incompatibles : 단자 그리기 - + + Dessiner les noms des bornes + + + + Option d'impression 인쇄 옵션 - + Adapter le folio à la page 폴리오를 페이지에 맞춤 - + Utiliser toute la feuille 용지 전체 사용 - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." 이 옵션을 선택하면, 폴리오가 확대/축소되어 1페이지의 인쇄 가능 영역 전체를 채웁니다." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. 이 옵션을 선택하면 용지 여백이 무시되고 전체 영역이 인쇄에 사용됩니다. 프린터에 따라 지원되지 않을 수 있습니다. - + toolBar 도구 모음 - + Ajuster la largeur 너비에 맞춤 - + Ajuster la page 페이지에 맞춤 - + Zoom arrière 축소 - + Zoom avant 확대 - + Paysage 가로 - + Portrait 세로 - + Première page 첫 페이지 - + Page précédente 이전 페이지 - + Page suivante 다음 페이지 - + Dernière page 마지막 페이지 - + Afficher une seule page 한 페이지 보기 - + Afficher deux pages 양면(두 페이지) 보기 - + Afficher un aperçu de toutes les pages 전체 페이지 미리보기 - + mise en page 페이지 레이아웃 @@ -6403,22 +6413,22 @@ Les variables suivantes sont incompatibles : PDF로 내보내기 - + Mise en page (non disponible sous Windows pour l'export PDF) 페이지 설정(Windows에서는 PDF 내보내기에 사용 불가) - + Folio sans titre 제목 없는 폴리오 - + Exporter sous : 다른 이름으로 내보내기: - + Fichier (*.pdf) 파일 (*.pdf) diff --git a/lang/qet_mn.ts b/lang/qet_mn.ts index 678675b18..7e54725fe 100644 --- a/lang/qet_mn.ts +++ b/lang/qet_mn.ts @@ -1319,7 +1319,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur Гүнийг өөрчлөх @@ -3556,94 +3556,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Лавлахаас гаргаж авах - + Dossier cible : Хяналтын лавлах: - + Parcourir Задлах - + Format : - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Бүтээх сонголтууд - + Exporter entièrement le folio Хуудсыг бүтнээр гаргаж авах - + Exporter seulement les éléments Зөвхөн элементүүдийг гаргаж авах - + Dessiner la grille Хэрээс зурах - + Dessiner le cadre Хүрээ зурах - + Dessiner le cartouche Гарчигны блок зурах - + Dessiner les bornes Холболтууд зурах - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Дамжуулагчдын өнгийг хэвээр үлдээх - + SVG: fond transparent @@ -6290,102 +6295,107 @@ Les variables suivantes sont incompatibles : Холболтууд зурах - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page Хуудсанд тохируулах - + Utiliser toute la feuille Хуудсыг бүхэлд нь ашиглах - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur Өргөнд нь тааруулсан - + Ajuster la page Хуудсанд тохирсон - + Zoom arrière Холдуулах - + Zoom avant - + Paysage Хэвтээ - + Portrait Зураг - + Première page Нэгдүгээр хуудас - + Page précédente Өмнөх хуудас - + Page suivante Дараагийн хуудас - + Dernière page Сүүлийн хуудас - + Afficher une seule page Нэг хуудсыг харуулах - + Afficher deux pages Нүүрний хуудаснуудыг харуулах - + Afficher un aperçu de toutes les pages Бүх хуудсыг харуулах - + mise en page @@ -6412,22 +6422,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_nb.ts b/lang/qet_nb.ts index ecde01dea..59659df58 100644 --- a/lang/qet_nb.ts +++ b/lang/qet_nb.ts @@ -1320,7 +1320,7 @@ Anmerkning: Disse opsjonene endrer IKKE den automatiske nummereringen, bare dens Diagram - + Modifier la profondeur Endre nivå av utvalget @@ -3555,94 +3555,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Eksporter i perm - + Dossier cible : Målperm - + Parcourir Søk - + Format : Format - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXG (*.dxf) - + Options de rendu groupbox title Render-opsjonene - + Exporter entièrement le folio Eksporter hele side - + Exporter seulement les éléments Eksporter bare komponentene - + Dessiner la grille Tegne raster - + Dessiner le cadre Tegne ramme - + Dessiner le cartouche Tegne tegningsmal - + Dessiner les bornes Tegne tilkoblingspunkter - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Behold lederfargene - + SVG: fond transparent @@ -6309,102 +6314,107 @@ Disse variablene kan IKKE brukes: Tegne tilkoblingspunkter - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page Tilpasser siden til arkenes størrelse - + Utiliser toute la feuille Bruk hele arket - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur Endre utskriftsstørrelse - + Ajuster la page Tilpass sidestørrelsen - + Zoom arrière Forminsk - + Zoom avant Forstørr - + Paysage Landskap - + Portrait Portrett - + Première page Første side - + Page précédente Forrige side - + Page suivante Neste side - + Dernière page Siste side - + Afficher une seule page - + Afficher deux pages Vis to sider - + Afficher un aperçu de toutes les pages Vis alle sider - + mise en page @@ -6431,22 +6441,22 @@ Disse variablene kan IKKE brukes: - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre Side uten tittel - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_nl_BE.ts b/lang/qet_nl_BE.ts index 95d1edafb..67df1d660 100644 --- a/lang/qet_nl_BE.ts +++ b/lang/qet_nl_BE.ts @@ -1320,7 +1320,7 @@ Let op: Deze opties blokkeren NIET de Automatisch nummering, maar passen alleen Diagram - + Modifier la profondeur Diepte aanpassen @@ -3558,94 +3558,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Exporteer in map - + Dossier cible : Doel map: - + Parcourir Bladeren - + Format : Formaat: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Weergave opties - + Exporter entièrement le folio Exporteer alle schema bladzijden - + Exporter seulement les éléments Exporteer enkel de elementen - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Behoud de kleuren van de geleiders - + SVG: fond transparent SVG: transparante achtergrond - + Dessiner la grille Teken hulppunten - + Dessiner le cadre Teken rand - + Dessiner le cartouche Teken titelblok - + Dessiner les bornes Teken de klemmen @@ -6328,102 +6333,107 @@ De volgende items zijn niet compatibel : Teken de klemmen - + + Dessiner les noms des bornes + + + + Option d'impression Afdruk opties - + Adapter le folio à la page Aanpassenschema bladzijde aan papier formaat - + Utiliser toute la feuille Gebruik de volledige bladzijde - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Als deze optie is aangevinkt, wordt het folio vergroot of verkleind om het volledige afdrukbare oppervlak van één en slechts één pagina te vullen. " - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Als deze optie is aangevinkt, worden de marges van het vel genegeerd en wordt het volledige oppervlak gebruikt voor afdrukken. Dit wordt mogelijk niet ondersteund door uw printer. - + toolBar Werkbalk - + Ajuster la largeur Pas de breedte aan - + Ajuster la page Pas de pagina aan - + Zoom arrière Uitzoomen - + Zoom avant Inzo0men - + Paysage Landschap - + Portrait Portret - + Première page Eerste pagina - + Page précédente Vorige pagina - + Page suivante Volgende pagina - + Dernière page Laatste pagina - + Afficher une seule page Toon 1 bladzijde - + Afficher deux pages Toon twee pagina's - + Afficher un aperçu de toutes les pages Toon afdrukvoorbeeld van alle pagina's - + mise en page Bladzijde indeling @@ -6450,22 +6460,22 @@ De volgende items zijn niet compatibel : Exporteer in pdf - + Mise en page (non disponible sous Windows pour l'export PDF) Lay-out (niet beschikbaar in Windows voor PDF-export) - + Folio sans titre Schema/bladzijde zonder titel - + Exporter sous : Exporteren naar: - + Fichier (*.pdf) *.pdf bestand diff --git a/lang/qet_nl_NL.ts b/lang/qet_nl_NL.ts index 0549d5397..7391ad7fa 100644 --- a/lang/qet_nl_NL.ts +++ b/lang/qet_nl_NL.ts @@ -1312,7 +1312,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur @@ -3538,94 +3538,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title - + Dossier cible : - + Parcourir - + Format : - + PNG (*.png) - + JPEG (*.jpg) - + Bitmap (*.bmp) - + SVG (*.svg) - + DXF (*.dxf) - + Options de rendu groupbox title - + Exporter entièrement le folio - + Exporter seulement les éléments - + Dessiner la grille - + Dessiner le cadre - + Dessiner le cartouche - + Dessiner les bornes - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs - + SVG: fond transparent @@ -6270,102 +6275,107 @@ Les variables suivantes sont incompatibles : - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page - + Utiliser toute la feuille - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur - + Ajuster la page - + Zoom arrière - + Zoom avant - + Paysage - + Portrait - + Première page - + Page précédente - + Page suivante - + Dernière page - + Afficher une seule page - + Afficher deux pages - + Afficher un aperçu de toutes les pages - + mise en page @@ -6392,22 +6402,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_pl.ts b/lang/qet_pl.ts index 7c1bddf7f..6e9b3e818 100644 --- a/lang/qet_pl.ts +++ b/lang/qet_pl.ts @@ -1322,7 +1322,7 @@ Uwaga: te opcje nie pozwalają na zablokowanie automatycznej numeracji tylko ust Diagram - + Modifier la profondeur Zmiana głębokości @@ -3569,94 +3569,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Eksport do katalogu - + Dossier cible : Katalog docelowy: - + Parcourir Przeglądaj - + Format : Format: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmapa (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Opcje renderowania - + Exporter entièrement le folio Eksport kompletnego arkusza - + Exporter seulement les éléments Eksport elementów - + Dessiner la grille Rysuj siatkę - + Dessiner le cadre Rysuj obramowanie - + Dessiner le cartouche Rysuj tabliczkę rysunkową - + Dessiner les bornes Rysuj terminale - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Zachowaj kolory przewodów - + SVG: fond transparent SVG: przeźroczysty @@ -6349,102 +6354,107 @@ Poniższe zmienne są zgodne: Rysuj terminale - + + Dessiner les noms des bornes + + + + Option d'impression Opcje drukowania - + Adapter le folio à la page Dostosuj arkusz do strony - + Utiliser toute la feuille Wykorzystaj całą stroną - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Jeżeli ta opcja jest zaznaczona, arkusz zostanie powiększony lub pomniejszony aby wypełniś cały obszar drukowania na stronie." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Jeżeli ta opcja jest zaznaczona, marginesy arkusza zostaną zignorowane, a cała jego powierzchnia zostanie wykorzystana do drukowania. Może to nie być obsługiwane przez Twoją drukarkę. - + toolBar Pasek narzędzi - + Ajuster la largeur Dostosuj do szerokości - + Ajuster la page Dostosuj do arkusza - + Zoom arrière Pomniejsz - + Zoom avant Powiększ - + Paysage Poziomo - + Portrait Pionowo - + Première page Pierwsza strona - + Page précédente Poprzedna strona - + Page suivante Następna strona - + Dernière page Ostatnia strona - + Afficher une seule page Podgląd pojedynczej strony - + Afficher deux pages Podgląd dwóch stron - + Afficher un aperçu de toutes les pages Podgląd wszystkich stron - + mise en page układ strony @@ -6471,22 +6481,22 @@ Poniższe zmienne są zgodne: Eksportuj do pdf - + Mise en page (non disponible sous Windows pour l'export PDF) Układ strony (niedostępne w systemie Windows dla eksportu do formatu PDF) - + Folio sans titre Arkusz bez tytułu - + Exporter sous : Eksportuj jako: - + Fichier (*.pdf) Plik (*.pdf) diff --git a/lang/qet_pt.ts b/lang/qet_pt.ts index e9c0b5e0b..3b5ee4527 100644 --- a/lang/qet_pt.ts +++ b/lang/qet_pt.ts @@ -1323,7 +1323,7 @@ form Diagram - + Modifier la profondeur @@ -3574,94 +3574,99 @@ form ExportPropertiesWidget - + Exporter dans le dossier dialog title Exportar na directoria - + Dossier cible : Directoria de destino: - + Parcourir Procurar - + Format : Formato: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) - + Options de rendu groupbox title Opções de renderização - + Exporter entièrement le folio - + Exporter seulement les éléments - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Manter as cores dos condutores - + SVG: fond transparent - + Dessiner la grille Desenhar a grelha - + Dessiner le cadre Desenhar a borda - + Dessiner le cartouche Desenhar a moldura - + Dessiner les bornes Desenhar terminais @@ -6348,102 +6353,107 @@ form Desenhar terminais - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page - + Utiliser toute la feuille Utilizar página inteira - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur Ajustar à largura - + Ajuster la page Ajustar à página - + Zoom arrière - + Zoom avant - + Paysage Paisagem - + Portrait Retrato - + Première page Primeira página - + Page précédente Página anterior - + Page suivante Página seguinte - + Dernière page Última página - + Afficher une seule page - + Afficher deux pages Mostrar duas páginas - + Afficher un aperçu de toutes les pages Mostrar todas as páginas - + mise en page @@ -6470,22 +6480,22 @@ form - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_pt_BR.ts b/lang/qet_pt_BR.ts index 6289c6352..fe5a8992a 100644 --- a/lang/qet_pt_BR.ts +++ b/lang/qet_pt_BR.ts @@ -1320,7 +1320,7 @@ Nota: Estas opções NÃO permitem ou bloqueiam a autonumeração, apenas a sua Diagram - + Modifier la profondeur Modificar a profundidade @@ -3558,94 +3558,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Exportar para a pasta - + Dossier cible : Pasta de destino: - + Parcourir Procurar - + Format : Formato: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Opções de renderização - + Exporter entièrement le folio Exportar a página completa - + Exporter seulement les éléments Exportar somente os elementos - + Dessiner la grille Desenhar a grade - + Dessiner le cadre Desenhar a borda - + Dessiner le cartouche Desenhar a legenda - + Dessiner les bornes Desenhar os terminais - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Manter as cores dos condutores - + SVG: fond transparent SVG: Fundo transparente @@ -6323,102 +6328,107 @@ As seguintes variáveis ​​são incompatíveis: Desenhar os terminais - + + Dessiner les noms des bornes + + + + Option d'impression Opções de impressão - + Adapter le folio à la page Ajustar ao tamanho da folha - + Utiliser toute la feuille Utilizar página inteira - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Se esta opção estiver marcada, a página será ampliada ou reduzida para preencher toda a superfície de impressão em apenas uma página. " - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Se esta opção estiver marcada, as margens da folha serão ignoradas e toda a sua superfície será usada para impressão. Isso pode não ser compatível com a sua impressora. - + toolBar Barra de ferramenta - + Ajuster la largeur Ajustar à largura - + Ajuster la page Ajustar à página - + Zoom arrière Diminuir Zoom - + Zoom avant Aumentar Zoom - + Paysage Paisagem - + Portrait Retrato - + Première page Primeira página - + Page précédente Página anterior - + Page suivante Página seguinte - + Dernière page Última página - + Afficher une seule page Mostrar página única - + Afficher deux pages Exibir duas páginas - + Afficher un aperçu de toutes les pages Exibir uma visualização geral de todas as páginas - + mise en page layout @@ -6445,22 +6455,22 @@ As seguintes variáveis ​​são incompatíveis: Exportar em pdf - + Mise en page (non disponible sous Windows pour l'export PDF) Layout (não disponível no Windows para exportação em PDF) - + Folio sans titre Página sem título - + Exporter sous : Exportar como: - + Fichier (*.pdf) Arquivo (*.pdf) diff --git a/lang/qet_ro.ts b/lang/qet_ro.ts index 86e10fd8a..0a33ece2b 100644 --- a/lang/qet_ro.ts +++ b/lang/qet_ro.ts @@ -1314,7 +1314,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur @@ -3543,94 +3543,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Exportă în dosar - + Dossier cible : Dosar țintă : - + Parcourir Navighează - + Format : Format : - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Opțiuni de randare - + Exporter entièrement le folio - + Exporter seulement les éléments - + Dessiner la grille Desenează grila - + Dessiner le cadre Desenează cadrul - + Dessiner le cartouche Desenează cartușul - + Dessiner les bornes Desenează bornele - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Păstrează culorile conductorilor - + SVG: fond transparent @@ -6276,102 +6281,107 @@ Les variables suivantes sont incompatibles : Desenează bornele - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page - + Utiliser toute la feuille Utilizează toată pagina - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur Potrivește lățimea - + Ajuster la page Potrivește pagina - + Zoom arrière Scade zoom - + Zoom avant Mărește zoom - + Paysage Peisaj - + Portrait Portret - + Première page Prima pagină - + Page précédente Pagina anterioară - + Page suivante Pagina următoare - + Dernière page Ultima pagină - + Afficher une seule page - + Afficher deux pages Afișează două pagini - + Afficher un aperçu de toutes les pages Afișează o previzualizare cu toate paginile - + mise en page @@ -6398,22 +6408,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_rs.ts b/lang/qet_rs.ts index 5cf404b27..21ed54a01 100644 --- a/lang/qet_rs.ts +++ b/lang/qet_rs.ts @@ -1312,7 +1312,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur @@ -3540,94 +3540,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title - + Dossier cible : - + Parcourir - + Format : - + PNG (*.png) - + JPEG (*.jpg) - + Bitmap (*.bmp) - + SVG (*.svg) - + DXF (*.dxf) - + Options de rendu groupbox title - + Exporter entièrement le folio - + Exporter seulement les éléments - + Dessiner la grille - + Dessiner le cadre - + Dessiner le cartouche - + Dessiner les bornes - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs - + SVG: fond transparent @@ -6273,102 +6278,107 @@ Les variables suivantes sont incompatibles : - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page - + Utiliser toute la feuille - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur - + Ajuster la page - + Zoom arrière - + Zoom avant - + Paysage - + Portrait - + Première page - + Page précédente - + Page suivante - + Dernière page - + Afficher une seule page - + Afficher deux pages - + Afficher un aperçu de toutes les pages - + mise en page @@ -6395,22 +6405,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_ru.ts b/lang/qet_ru.ts index 3205383eb..fae0efce6 100644 --- a/lang/qet_ru.ts +++ b/lang/qet_ru.ts @@ -1328,7 +1328,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur Изменить глубину @@ -3572,94 +3572,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Экспорт в папку - + Dossier cible : Папка назначения: - + Parcourir Просмотр - + Format : Формат: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Параметры отрисовки - + Exporter entièrement le folio Экспортировать лист полностью - + Exporter seulement les éléments Экспортировать только элементы - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Сохранять цвет проводников - + SVG: fond transparent - + Dessiner la grille Рисовать сетку - + Dessiner le cadre Рисовать рамку - + Dessiner le cartouche Рисовать основную надпись - + Dessiner les bornes Рисовать выводы @@ -6344,102 +6349,107 @@ Les variables suivantes sont incompatibles : Рисовать выводы - + + Dessiner les noms des bornes + + + + Option d'impression Опции печати - + Adapter le folio à la page Вписать лист в страницу - + Utiliser toute la feuille Использовать всю страницу - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Если этот параметр отмечен, лист будет увеличиваться или уменьшаться, чтобы заполнить всю область страницы. - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Если этот флажок установлен, поля страницы игнорируются и вся её поверхность будет использоваться для печати. Это может не поддерживаться вашим принтером. - + toolBar панель_инструментов - + Ajuster la largeur Подогнать по ширине - + Ajuster la page Вписать в страницу - + Zoom arrière Уменьшить - + Zoom avant Увеличить - + Paysage Альбомная - + Portrait Книжная - + Première page Первая страница - + Page précédente Предыдущая страница - + Page suivante Следующая страница - + Dernière page Последняя страница - + Afficher une seule page Показать одну страницу - + Afficher deux pages Показать две страницы - + Afficher un aperçu de toutes les pages Показать все страницы - + mise en page Макет @@ -6467,22 +6477,22 @@ Les variables suivantes sont incompatibles : Экспорт в PDF - + Mise en page (non disponible sous Windows pour l'export PDF) Макет (недоступно в Windows для экспорта в PDF) - + Folio sans titre Лист без имени - + Exporter sous : Экспорт в: - + Fichier (*.pdf) Файл (*.pdf) diff --git a/lang/qet_sk.ts b/lang/qet_sk.ts index 283ac9007..ac4511bcc 100644 --- a/lang/qet_sk.ts +++ b/lang/qet_sk.ts @@ -1312,7 +1312,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur @@ -3540,94 +3540,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title - + Dossier cible : - + Parcourir - + Format : - + PNG (*.png) - + JPEG (*.jpg) - + Bitmap (*.bmp) - + SVG (*.svg) - + DXF (*.dxf) - + Options de rendu groupbox title - + Exporter entièrement le folio - + Exporter seulement les éléments - + Dessiner la grille - + Dessiner le cadre - + Dessiner le cartouche - + Dessiner les bornes - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs - + SVG: fond transparent @@ -6273,102 +6278,107 @@ Les variables suivantes sont incompatibles : - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page - + Utiliser toute la feuille - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur - + Ajuster la page - + Zoom arrière - + Zoom avant - + Paysage - + Portrait - + Première page - + Page précédente - + Page suivante - + Dernière page - + Afficher une seule page - + Afficher deux pages - + Afficher un aperçu de toutes les pages - + mise en page @@ -6395,22 +6405,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_sl.ts b/lang/qet_sl.ts index 2779776a1..bb6f58bf4 100644 --- a/lang/qet_sl.ts +++ b/lang/qet_sl.ts @@ -1312,7 +1312,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur @@ -3542,94 +3542,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title - + Dossier cible : - + Parcourir - + Format : - + PNG (*.png) - + JPEG (*.jpg) - + Bitmap (*.bmp) - + SVG (*.svg) - + DXF (*.dxf) - + Options de rendu groupbox title - + Exporter entièrement le folio - + Exporter seulement les éléments - + Dessiner la grille - + Dessiner le cadre - + Dessiner le cartouche - + Dessiner les bornes - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs - + SVG: fond transparent @@ -6276,102 +6281,107 @@ Les variables suivantes sont incompatibles : - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page - + Utiliser toute la feuille - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur - + Ajuster la page - + Zoom arrière - + Zoom avant - + Paysage - + Portrait - + Première page - + Page précédente - + Page suivante - + Dernière page - + Afficher une seule page - + Afficher deux pages - + Afficher un aperçu de toutes les pages - + mise en page @@ -6398,22 +6408,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_sr.ts b/lang/qet_sr.ts index faa06449b..626f902ac 100644 --- a/lang/qet_sr.ts +++ b/lang/qet_sr.ts @@ -1312,7 +1312,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur @@ -3540,94 +3540,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title - + Dossier cible : - + Parcourir - + Format : - + PNG (*.png) - + JPEG (*.jpg) - + Bitmap (*.bmp) - + SVG (*.svg) - + DXF (*.dxf) - + Options de rendu groupbox title - + Exporter entièrement le folio - + Exporter seulement les éléments - + Dessiner la grille - + Dessiner le cadre - + Dessiner le cartouche - + Dessiner les bornes - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs - + SVG: fond transparent @@ -6273,102 +6278,107 @@ Les variables suivantes sont incompatibles : - + + Dessiner les noms des bornes + + + + Option d'impression - + Adapter le folio à la page - + Utiliser toute la feuille - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. - + toolBar - + Ajuster la largeur - + Ajuster la page - + Zoom arrière - + Zoom avant - + Paysage - + Portrait - + Première page - + Page précédente - + Page suivante - + Dernière page - + Afficher une seule page - + Afficher deux pages - + Afficher un aperçu de toutes les pages - + mise en page @@ -6395,22 +6405,22 @@ Les variables suivantes sont incompatibles : - + Mise en page (non disponible sous Windows pour l'export PDF) - + Folio sans titre - + Exporter sous : - + Fichier (*.pdf) diff --git a/lang/qet_sv.ts b/lang/qet_sv.ts index 8532d3d78..5964fbc0c 100644 --- a/lang/qet_sv.ts +++ b/lang/qet_sv.ts @@ -1319,7 +1319,7 @@ Notera: Dessa alternativ TILLÅTER ELLER BLOCKERAR INTE auto-numreringen, endast Diagram - + Modifier la profondeur Ändra djup @@ -3557,94 +3557,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Exportera till mapp - + Dossier cible : Målmapp: - + Parcourir Bläddra - + Format : Format: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Alternativ för rendering - + Exporter entièrement le folio Exportera kompletta blad - + Exporter seulement les éléments Exportera endast symboler - + Dessiner la grille Rita rutnät - + Dessiner le cadre Rita ram - + Dessiner le cartouche Rita titelblock - + Dessiner les bornes Rita anslutningar - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Behåll färger på förbindningar - + SVG: fond transparent SVG: transparent bakgrund @@ -6323,102 +6328,107 @@ Följande variabler är inkompatibla: Rita anslutningar - + + Dessiner les noms des bornes + + + + Option d'impression Utskriftsalternativ - + Adapter le folio à la page Anpassa blad till sida - + Utiliser toute la feuille Använd hela sidan - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Om detta alternativ är markerat kommer bladen att förstoras eller förminskas så att dom fyller hela det utskrivbara området på sidan. - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Om det här alternativet är markerat ignoreras sidans marginaler och hela ytan används för utskrift. Detta kanske inte stöds av din skrivare. - + toolBar toolBar - + Ajuster la largeur Anpassa bredden - + Ajuster la page Anpassa till sida - + Zoom arrière Zooma ut - + Zoom avant Zooma in - + Paysage Landskap - + Portrait Porträtt - + Première page Första sida - + Page précédente Föregående sida - + Page suivante Nästa sida - + Dernière page Sista sida - + Afficher une seule page Visa en sida - + Afficher deux pages Visa två sidor - + Afficher un aperçu de toutes les pages Visa alla sidor - + mise en page Sidlayout @@ -6445,22 +6455,22 @@ Följande variabler är inkompatibla: Exportera som pdf - + Mise en page (non disponible sous Windows pour l'export PDF) Sidlayout (ej tillgänglig i Windows för PDF-export) - + Folio sans titre Namnlöst blad - + Exporter sous : Exportera som: - + Fichier (*.pdf) Fil (*.pdf) diff --git a/lang/qet_tr.ts b/lang/qet_tr.ts index 17055dbe3..24d93b088 100644 --- a/lang/qet_tr.ts +++ b/lang/qet_tr.ts @@ -1323,7 +1323,7 @@ Not: Bu durum "Otomatik Numaralandırma"'ya engel koymaz veya izi Diagram - + Modifier la profondeur I am not sure about this. It should be checked. Derinliği değiştirin @@ -3575,94 +3575,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Klasöre aktar - + Dossier cible : Hedef klasör: - + Parcourir Gezinti - + Format : - + PNG (*.png) - + JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) - + DXF (*.dxf) - + Options de rendu groupbox title Render seçenekleri - + Exporter entièrement le folio Tüm sayfayı dışa aktar - + Exporter seulement les éléments Yalnızca öğeleri dışa aktar - + Dessiner la grille Izgarayı çiz - + Dessiner le cadre Çerçeveyi çiz - + Dessiner le cartouche Anteti çiz - + Dessiner les bornes Terminalleri çiz - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs İletkenlerin renklerini koru - + SVG: fond transparent SVG: şeffaf arka plan @@ -6351,102 +6356,107 @@ Aşağıdaki değişkenler uyumsuz : Terminalleri çiz - + + Dessiner les noms des bornes + + + + Option d'impression Yazdırma seçeneği - + Adapter le folio à la page Sayfaya sığdırın - + Utiliser toute la feuille Tüm sayfayı kullan - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Bu seçenek işaretlenirse, sayfa yalnızca bir sayfanın yazdırılabilir alanını dolduracak şekilde büyütülür veya küçültülür." - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Bu seçenek işaretlenirse, sayfanın kenar boşlukları yok sayılır ve tüm yüzeyi yazdırma için kullanılır. Bu, yazıcınız tarafından desteklenmeyebilir. - + toolBar toolBar - + Ajuster la largeur Genişliği Ayarla - + Ajuster la page Sayfayı Ayarla - + Zoom arrière Uzaklaştır - + Zoom avant Yakınlaştır - + Paysage Sayfa boyunca - + Portrait Portre - + Première page İlk sayfa - + Page précédente Önceki sayfa - + Page suivante Sonraki sayfa - + Dernière page Son sayfa - + Afficher une seule page Tek sayfa göster - + Afficher deux pages İki sayfa göster - + Afficher un aperçu de toutes les pages Tüm sayfaları önizle - + mise en page sayfa düzeni @@ -6473,22 +6483,22 @@ Aşağıdaki değişkenler uyumsuz : PDF olarak export et - + Mise en page (non disponible sous Windows pour l'export PDF) Sayfa düzeni (Windows'ta PDF export için kullanılamaz) - + Folio sans titre Başlıksız sayfa - + Exporter sous : Şu şekilde export et : - + Fichier (*.pdf) Dosya (*.pdf) diff --git a/lang/qet_uk.ts b/lang/qet_uk.ts index 11e7090a8..6a93d408d 100644 --- a/lang/qet_uk.ts +++ b/lang/qet_uk.ts @@ -1319,7 +1319,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur Змінити глибину @@ -3560,94 +3560,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title Експорт в папки - + Dossier cible : Папка призначення: - + Parcourir Переглянути - + Format : Вормат: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title Параметри візуалізації - + Exporter entièrement le folio Експортувати аркуш повністю - + Exporter seulement les éléments Експортувати тільки елементи - + Dessiner la grille Показувати сітку - + Dessiner le cadre Показувати рамку - + Dessiner le cartouche Показувати штамп - + Dessiner les bornes Показувати виводи - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs Зберегти колір провідників - + SVG: fond transparent @@ -6325,102 +6330,107 @@ Les variables suivantes sont incompatibles : Малювати виводи - + + Dessiner les noms des bornes + + + + Option d'impression Опції друку - + Adapter le folio à la page Вписати аркуш в сторінку - + Utiliser toute la feuille Використати всю сторінку - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." Якщо цей параметр відмічений, аркуш аркуш буде збільшуватися чи зменшуватися, щоб заповнити всю область сторінки. - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. Якщо цей параметр відмічений, поля сторінки ігноруються і вся її поверхня буде використана для друку. Це може не підтримуватись вашим принтером. - + toolBar панель_інструментів - + Ajuster la largeur Підігнати по ширині - + Ajuster la page Вписать в сторінку - + Zoom arrière Зеншити - + Zoom avant Збільшити - + Paysage Альбомна - + Portrait Книжна - + Première page Перша сторінка - + Page précédente Попередня сторінка - + Page suivante Наступна сторінка - + Dernière page Остання сторінка - + Afficher une seule page Показати одну сторінку - + Afficher deux pages Показати дві сторінки - + Afficher un aperçu de toutes les pages Показати всі сторінки - + mise en page Макет @@ -6448,22 +6458,22 @@ Les variables suivantes sont incompatibles : Експорт в PDF - + Mise en page (non disponible sous Windows pour l'export PDF) Макет (недоступно в Windows для експорту в PDF) - + Folio sans titre Аркуш без імені - + Exporter sous : Експорт в: - + Fichier (*.pdf) Файл (*.pdf) diff --git a/lang/qet_zh.ts b/lang/qet_zh.ts index 511ef370e..6d9787883 100644 --- a/lang/qet_zh.ts +++ b/lang/qet_zh.ts @@ -1319,7 +1319,7 @@ Note: These options DO NOT allow or block Auto Numberings, only their Update Pol Diagram - + Modifier la profondeur 修改图层 @@ -3558,94 +3558,99 @@ En important ce fichier, vous confirmez que : ExportPropertiesWidget - + Exporter dans le dossier dialog title 导出到文件夹 - + Dossier cible : 目标文件夹: - + Parcourir 浏览 - + Format : 格式: - + PNG (*.png) PNG (*.png) - + JPEG (*.jpg) JPEG (*.jpg) - + Bitmap (*.bmp) Bitmap (*.bmp) - + SVG (*.svg) SVG (*.svg) - + DXF (*.dxf) DXF (*.dxf) - + Options de rendu groupbox title 渲染选项 - + Exporter entièrement le folio 导出整个图页 - + Exporter seulement les éléments 仅导出元件 - + Dessiner la grille 绘制网格 - + Dessiner le cadre 绘制边框 - + Dessiner le cartouche 绘制标题栏 - + Dessiner les bornes 绘制端子 - + + Dessiner les noms des bornes + + + + Conserver les couleurs des conducteurs 保留导线颜色 - + SVG: fond transparent SVG:透明背景 @@ -6325,102 +6330,107 @@ Les variables suivantes sont incompatibles : 绘制端子 - + + Dessiner les noms des bornes + + + + Option d'impression 打印选项 - + Adapter le folio à la page 使图页适合画面 - + Utiliser toute la feuille 使用整张纸 - + Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page." 如果选择此项,图页将被缩放以填充整个可打印区域。” - + Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante. 如果选择此项,纸张的页边距将被忽略,其整个表面将用于打印。 您的打印机可能不支持此功能。 - + toolBar 工具栏 - + Ajuster la largeur 适应宽度 - + Ajuster la page 适应页面 - + Zoom arrière 缩小 - + Zoom avant 放大 - + Paysage 横向 - + Portrait 纵向 - + Première page 首页 - + Page précédente 上一页 - + Page suivante 下一页 - + Dernière page 末页 - + Afficher une seule page 显示单页 - + Afficher deux pages 显示双页 - + Afficher un aperçu de toutes les pages 预览所有图页 - + mise en page 布局 @@ -6447,22 +6457,22 @@ Les variables suivantes sont incompatibles : 导出为 PDF - + Mise en page (non disponible sous Windows pour l'export PDF) 布局(在 Windows 上不适用于 PDF 导出) - + Folio sans titre 未命名图页 - + Exporter sous : 导出为: - + Fichier (*.pdf) 文件(*.pdf) From bab5bf58f8ca9a5b1b1c64007fa77d20a45264d4 Mon Sep 17 00:00:00 2001 From: ispyisail Date: Sat, 8 Aug 2026 21:53:20 +1200 Subject: [PATCH 13/20] Fix invisible element icons on dark themes in Open/Save Element and New Element Wizard dialogs Bugtracker #335: element library icons are black and nearly invisible under a dark desktop theme (reported on KDE Plasma / Fedora 43). The main elements panel (ElementsCollectionWidget) already forces a fixed light palette on its tree views via ElementsTreeView, added in a8e2a7acf and completed in bb61dde81 -- element icons are rendered with colors read from each .elmt file (almost always black linework, matching printed-schematic convention) onto a transparent background, so any view showing them needs to stay light regardless of the OS theme. ElementsTreeView's own class doc already says "This class must be used when the tree view have an ElementsCollectionModel as model" -- but two other dialogs showing the exact same model were still using a plain QTreeView and missed that fix: the Open/Save Element/Category/Template dialog (ElementDialog) and the New Element Wizard's parent-category picker (NewElementWizard). Same underlying ElementsCollectionModel, same black-on-transparent icons, same invisibility on a dark theme. Fix: use ElementsTreeView in both, matching the main panel and the class's own documented contract. No other behavior changes -- ElementsTreeView only additionally overrides startDrag() to use a nicer drag pixmap, which is inert unless drag-out is enabled. Verified with a full Release build (504/504, no new warnings) and a standalone Qt program that shows the real ElementDialog under a forced dark QPalette (simulating a dark OS theme, since neither this build environment nor QET itself forces the palette one way or the other): screenshots down through nested collection categories (Electric > IEC 60617 > Conductors and connecting devices) confirm the tree view keeps a white background against the dark dialog chrome around it. --- sources/elementdialog.cpp | 3 ++- sources/newelementwizard.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/sources/elementdialog.cpp b/sources/elementdialog.cpp index 2cc2e6c34..503aefc6b 100644 --- a/sources/elementdialog.cpp +++ b/sources/elementdialog.cpp @@ -19,6 +19,7 @@ #include "ElementsCollection/elementcollectionitem.h" #include "ElementsCollection/elementscollectionmodel.h" +#include "ElementsCollection/elementstreeview.h" #include "qetapp.h" #include "qetmessagebox.h" #include "qfilenameedit.h" @@ -88,7 +89,7 @@ void ElementDialog::setUpWidget() layout->addWidget(new QLabel(label_)); - m_tree_view = new QTreeView(this); + m_tree_view = new ElementsTreeView(this); m_model = new ElementsCollectionModel(m_tree_view); diff --git a/sources/newelementwizard.cpp b/sources/newelementwizard.cpp index 834ac98a6..afa30fa9e 100644 --- a/sources/newelementwizard.cpp +++ b/sources/newelementwizard.cpp @@ -19,6 +19,7 @@ #include "ElementsCollection/elementcollectionitem.h" #include "ElementsCollection/elementscollectionmodel.h" +#include "ElementsCollection/elementstreeview.h" #include "NameList/ui/namelistwidget.h" #include "editor/ui/qetelementeditor.h" #include "qetmessagebox.h" @@ -85,7 +86,7 @@ QWizardPage *NewElementWizard::buildStep1() page -> setSubTitle(tr("Sélectionnez une catégorie dans laquelle enregistrer le nouvel élément.", "wizard page subtitle")); QVBoxLayout *layout = new QVBoxLayout(); - m_tree_view = new QTreeView(this); + m_tree_view = new ElementsTreeView(this); m_model = new ElementsCollectionModel(m_tree_view); m_model->hideElement(); From 4a95efbfe6915655d7bc0ff3727cf29959e5311c Mon Sep 17 00:00:00 2001 From: Andre Rummler Date: Sat, 8 Aug 2026 12:31:45 +0200 Subject: [PATCH 14/20] TitleBlockTemplate::minimumWidth() divided by (100.0 - sum(RelativeToTotalLength)) without guarding against a zero or negative denominator. When a template's relative-to-total-length columns summed to exactly 100% (e.g. the shipped A4_1.titleblock), this produced qRound(NaN), which fatally aborted under Qt6's stricter qCheckedFPConversionToInteger assertion -- reached via double-clicking a title block template to edit it. Introduce TitleBlockTemplate::classifyWidthConstraint(), shared by minimumWidth() and maximumWidth(), returning std::optional WidthConstraintCase> to distinguish three non-finite outcomes: Unconstrained (RTT columns == 100%, no absolute columns -- an ordinary, valid template), RelativeWidthExceeds100Percent (RTT alone exceeds 100%), and AbsoluteColumnsExceedRemainingWidth (RTT == 100% with at least one absolute column also present) -- the latter two meaning the template's columns cannot be laid out at any width. maximumWidth() previously only checked "are all columns absolute", which incorrectly reported "no upper bound" for the two unsatisfiable cases above; it now shares the same classification, so both functions agree. Update TitleBlockTemplateView::updateDisplayedMinMaxWidth() to show distinct, accurate tooltip text for all four cases instead of printing the old std::numeric_limits::max() sentinel or a misleading "no constraint" message for an unsatisfiable template. Manually verified all four cases: a normal template (finite width), A4_1.titleblock (Unconstrained), an over-100% RTT template (RelativeWidthExceeds100Percent), and RTT==100% with an absolute column present (AbsoluteColumnsExceedRemainingWidth). Translations still partially missing. --- sources/titleblock/templateview.cpp | 69 ++++++++------ sources/titleblocktemplate.cpp | 135 ++++++++++++++++++++++------ sources/titleblocktemplate.h | 81 ++++++++++++++++- 3 files changed, 230 insertions(+), 55 deletions(-) diff --git a/sources/titleblock/templateview.cpp b/sources/titleblock/templateview.cpp index b41881d82..a9ccc33b4 100644 --- a/sources/titleblock/templateview.cpp +++ b/sources/titleblock/templateview.cpp @@ -999,34 +999,47 @@ void TitleBlockTemplateView::updateDisplayedMinMaxWidth() int max_width = tbtemplate_ -> maximumWidth(); QString min_max_width_sentence; - if (min_width != -1 && max_width != -1) { - min_max_width_sentence = QString( - tr( - "Longueur minimale : %1px\nLongueur maximale : %2px\n", - "tooltip showing the minimum and/or maximum width of the edited template" - ) - ).arg(min_width).arg(max_width); - } else if (min_width != -1) { - min_max_width_sentence = QString( - tr( - "Longueur minimale : %1px\n", - "tooltip showing the minimum width of the edited template" - ) - ).arg(min_width); - } else if (max_width != -1) { - min_max_width_sentence = QString( - tr( - "Longueur maximale : %1px\n", - "tooltip showing the maximum width of the edited template" - ) - ).arg(max_width); - } else { - min_max_width_sentence = QString( - tr( - "Longueur non contrainte.\n", - "tooltip shown when the edited template has neither a minimum nor a maximum width constraint" - ) - ); + + switch (static_cast(min_width)) { + case TitleBlockTemplate::WidthConstraintCase::RelativeWidthExceeds100Percent: + // minimumWidth() and maximumWidth() both check infeasibility + // first, identically, so max_width reports the same case + // here -- no need to check it separately. + min_max_width_sentence = tr( + "Attention : la somme des largeurs relatives dépasse 100%% de la largeur totale, ce modèle de cartouche ne peut être satisfait par aucune largeur.\n", + "tooltip warning shown when a template's relative-to-total-length columns alone already exceed 100%% of the total width" + ); + break; + case TitleBlockTemplate::WidthConstraintCase::AbsoluteColumnsExceedRemainingWidth: + min_max_width_sentence = tr( + "Attention : les colonnes de largeur fixe ne peuvent pas tenir dans la largeur restante, ce modèle de cartouche ne peut être satisfait par aucune largeur.\n", + "tooltip warning shown when a template's relative-to-total-length columns already consume all available width, leaving no room for its fixed-width columns" + ); + break; + default: + if (min_width != static_cast(TitleBlockTemplate::WidthConstraintCase::Unconstrained)) { + min_max_width_sentence += QString( + tr( + "Longueur minimale : %1px\n", + "tooltip showing the minimum width of the edited template" + ) + ).arg(min_width); + } + if (max_width != static_cast(TitleBlockTemplate::WidthConstraintCase::Unconstrained)) { + min_max_width_sentence += QString( + tr( + "Longueur maximale : %1px\n", + "tooltip showing the maximum width of the edited template" + ) + ).arg(max_width); + } + if (min_max_width_sentence.isEmpty()) { + min_max_width_sentence = tr( + "Longueur non contrainte.\n", + "tooltip shown when the edited template has neither a minimum nor a maximum width constraint" + ); + } + break; } // the tooltip may also display the split label for readability purpose diff --git a/sources/titleblocktemplate.cpp b/sources/titleblocktemplate.cpp index 1e9b45a41..4379605c1 100644 --- a/sources/titleblocktemplate.cpp +++ b/sources/titleblocktemplate.cpp @@ -960,47 +960,130 @@ int TitleBlockTemplate::columnTypeTotal(QET::TitleBlockColumnLength type) { } /** - @return the minimum width for this template + @brief TitleBlockTemplate::classifyWidthConstraint + Classifies this template's absolute-width (ABS) and + relative-to-total-length (RTT) columns, independently of whether a + minimum or a maximum width is being computed. + + The classification is derived from the same inequality + minimumWidth() solves for a minimum width: + @code + TOT >= ((sum(RTT)/100)*TOT) + sum(ABS) + @endcode + Regardless of TOT, the RTT term above scales linearly with TOT. If + sum(RTT) alone already accounts for 100% or more of TOT, no choice + of TOT -- however large -- can make room for it (and for any ABS + columns on top of it): making the template wider grows the RTT + columns' pixel footprint by the same proportion, so the shortfall + never resolves. This function exists so both minimumWidth() and + maximumWidth() report that consistently, instead of maximumWidth() + incorrectly treating a misconfigured template as "no upper bound". + + @param[out] abs_total set to columnTypeTotal(QET::Absolute). + @param[out] remaining_width_fraction set to the fraction of the + total template width left over once the RTT columns have taken + their share: (100.0 - sum(RTT)) / 100.0. Zero means the RTT + columns claim the entire width, leaving nothing for ABS columns; + negative means they claim more than the entire width, which is + unsatisfiable regardless of any ABS columns. Only meaningful when + this function returns std::nullopt. + @return WidthConstraintCase::RelativeWidthExceeds100Percent if + sum(RTT) exceeds 100% (unsatisfiable at any width, with or without + ABS columns), WidthConstraintCase::AbsoluteColumnsExceedRemainingWidth + if sum(RTT) equals exactly 100% and at least one ABS column is also + present (unsatisfiable at any width, since the RTT columns leave no + room for it), WidthConstraintCase::Unconstrained if sum(RTT) equals + exactly 100% with no ABS columns (every term vanishes, any width + holds -- an ordinary, valid template), or std::nullopt if this + template's columns admit a genuine finite width. +*/ +std::optional TitleBlockTemplate::classifyWidthConstraint(int &abs_total, qreal &remaining_width_fraction) +{ + abs_total = columnTypeTotal(QET::Absolute); + remaining_width_fraction = (100.0 - columnTypeTotal(QET::RelativeToTotalLength)) / 100.0; + + if (remaining_width_fraction < 0.0) { + return WidthConstraintCase::RelativeWidthExceeds100Percent; + } + if (remaining_width_fraction == 0.0) { + return abs_total == 0 + ? WidthConstraintCase::Unconstrained + : WidthConstraintCase::AbsoluteColumnsExceedRemainingWidth; + } + return std::nullopt; // a finite width exists: remaining_width_fraction > 0 +} + +/** + @brief TitleBlockTemplate::minimumWidth + @return the minimum width, in pixels, required for this template's + absolute-width (ABS) and relative-to-total-length (RTT) columns to + all fit. + + Derivation: writing TOT for the (variable) total template width, + the minimum size enforced by the ABS and RTT columns is: + @code + TOT >= ((sum(RTT)/100)*TOT) + sum(ABS) + => (1 - (sum(RTT)/100))*TOT >= sum(ABS) + => TOT >= sum(ABS) / (1 - (sum(RTT)/100)) + => TOT >= sum(ABS) / ((100 - sum(RTT))/100) + @endcode + relative-to-remaining-length (RTR) columns do not constrain the + minimum width, since by definition they only ever claim a share of + whatever space is left over after the ABS and RTT columns are laid + out. + + If no finite minimum width applies, returns one of + WidthConstraintCase::Unconstrained, + WidthConstraintCase::RelativeWidthExceeds100Percent, or + WidthConstraintCase::AbsoluteColumnsExceedRemainingWidth (cast to + int) instead -- see classifyWidthConstraint() and that enum's + documentation for when each case applies. */ int TitleBlockTemplate::minimumWidth() { - // Abbreviations: ABS: absolute, RTT: relative to total, RTR: - // relative to remaining, - // TOT: total diagram/TBT width (variable). - - // Minimum size may be enforced by ABS and RTT widths: - // TOT >= ((sum(REL)/100)*TOT)+sum(ABS) - // => (1 - (sum(REL)/100))TOT >= sum(ABS) - // => TOT >= sum(ABS) / (1 - (sum(REL)/100)) - // => TOT >= sum(ABS) / ((100 - sum(REL))/100)) - int abs_total = columnTypeTotal(QET::Absolute); - qreal denominator = (100.0 - columnTypeTotal(QET::RelativeToTotalLength)) / 100.0; - - if (denominator <= 0.0) { - // The relative-to-total-length columns alone already consume - // 100% (or more) of the available width, so the formula above - // would divide by zero (or go negative). There is no finite - // minimum width this formula can determine. Report "no - // constraint", the same convention maximumWidth() uses. - return -1; + int abs_total; + qreal remaining_width_fraction; + if (auto width_case = classifyWidthConstraint(abs_total, remaining_width_fraction)) { + return static_cast(*width_case); } - - return(qRound(abs_total / denominator)); + return qRound(abs_total / remaining_width_fraction); } /** @brief TitleBlockTemplate::maximumWidth - @return the maximum width for this template, - or -1 if it does not have any. + @return the maximum width, in pixels, this template may be + rendered at. + + If this template is composed entirely of absolute-width (ABS) + columns, the maximum is fixed: the template cannot extend beyond + their sum, since nothing in it scales with the template's total + width. Otherwise, at least one column scales with the total width + (relative-to-total-length or relative-to-remaining-length), so + there is ordinarily no upper bound: returns + WidthConstraintCase::Unconstrained (cast to int) -- the common case + for most templates. + + The exception is when this template's columns cannot be satisfied + by any width at all (see classifyWidthConstraint()) -- in that case + there is no width, however large, that works, and this returns + WidthConstraintCase::RelativeWidthExceeds100Percent or + WidthConstraintCase::AbsoluteColumnsExceedRemainingWidth (cast to + int) instead of Unconstrained, matching minimumWidth()'s handling + of the same cases. */ int TitleBlockTemplate::maximumWidth() { + int abs_total; + qreal remaining_width_fraction; + if (auto width_case = classifyWidthConstraint(abs_total, remaining_width_fraction)) { + return static_cast(*width_case); + } if (columnTypeCount(QET::Absolute) == columns_width_.count()) { // The template is composed of absolute widths only, // therefore it may not extend beyond their sum. - return(columnTypeTotal(QET::Absolute)); + return abs_total; // already computed by classifyWidthConstraint() } - return(-1); + return static_cast(WidthConstraintCase::Unconstrained); } /** diff --git a/sources/titleblocktemplate.h b/sources/titleblocktemplate.h index e8d5cb3a4..a7f6c9686 100644 --- a/sources/titleblocktemplate.h +++ b/sources/titleblocktemplate.h @@ -24,6 +24,7 @@ #include #include +#include /** @brief The TitleBlockTemplate class @@ -36,9 +37,73 @@ */ class TitleBlockTemplate : public QObject { Q_OBJECT + + public: + /** + @brief The TitleBlockTemplate::WidthConstraintCase enum Distinguishes + the possible outcomes of minimumWidth() or maximumWidth() for a + template's column layout: either a genuine finite pixel width, or one + of the cases below where no single finite width applies -- some of which are + perfectly ordinary (Unconstrained), and some of which indicate the + template's columns cannot be laid out at any width. + + Both functions return one of the non-Bounded* cases below, + cast to int, in place of a genuine width whenever no finite + width applies. (*minimumWidth()/maximumWidth() never return + a literal "Bounded" value -- when a finite width exists, + they return that width directly. Bounded only appears as a + concept in classifyWidthConstraint()'s std::nullopt return.) + The int-based encoding exists because this project + currently targets C++17. + + @todo Once this project's minimum supported C++ standard + reaches C++23, migrate minimumWidth() and maximumWidth() to + return std::expected instead of + encoding these cases as negative int sentinels. That removes + the possibility of a caller silently misinterpreting a + sentinel as a real pixel width -- something the current + int-based encoding cannot prevent at compile time. + */ + enum class WidthConstraintCase : int { + /** + There is no finite width constraint in this direction: + any width is valid. This is a perfectly ordinary case, + not a problem with the template -- for minimumWidth(), + it happens when the relative-to-total-length (RTT) + columns account for exactly 100% of the total width and + there are no absolute-width (ABS) columns competing for + space -- every term in the minimum-width inequality + vanishes (0 >= 0), which holds for any width. For + maximumWidth(), it happens whenever at least one column + scales with the total width, so nothing caps how wide + the template may grow -- the common case for most + templates. + */ + Unconstrained = -1, + + /** + The RTT columns alone already exceed 100% of the total + width (sum(RTT) > 100), independently of whether any ABS + columns exist. The minimum-width inequality then only + holds for a non-positive width, which cannot represent a + real template: this indicates a genuinely misconfigured + template that cannot be laid out at any width. + */ + RelativeWidthExceeds100Percent = -2, + + /** + The RTT columns account for exactly 100% of the total + width, but at least one ABS column also needs a nonzero, + fixed amount of space on top of that. The minimum-width + inequality reduces to "0 >= (a positive number)", which + never holds: this also indicates a genuinely + misconfigured template that cannot be laid out at any + width. + */ + AbsoluteColumnsExceedRemainingWidth = -3 + }; // constructors, destructor - public: TitleBlockTemplate(QObject * = nullptr); ~TitleBlockTemplate() override; private: @@ -146,6 +211,20 @@ class TitleBlockTemplate : public QObject { bool checkCell(const QDomElement &, TitleBlockCell ** = nullptr); void flushCells(); void initCells(); + /** + @brief TitleBlockTemplate::classifyWidthConstraint Classifies this template's absolute-width (ABS) and + relative-to-total-length (RTT) columns, independently of whether a minimum or a maximum width is being computed -- see + minimumWidth() for the derivation this is based on. + @param[out] abs_total set to columnTypeTotal(QET::Absolute). + @param[out] remaining_width_fraction set to the fraction of the total template width left over once the RTT columns have taken + their share: (100.0 - sum(RTT)) / 100.0. Zero means the RTT columns claim the entire width, leaving nothing for ABS + columns; negative means they claim more than the entire width, which is unsatisfiable regardless of any ABS columns. Only + meaningful when this function returns std::nullopt. + @return WidthConstraintCase::RelativeWidthExceeds100Percent, WidthConstraintCase::AbsoluteColumnsExceedRemainingWidth, or + WidthConstraintCase::Unconstrained if no finite width exists for this template's columns, or std::nullopt if a finite width + does exist (computable as qRound(abs_total / remaining_width_fraction)). + */ + std::optional classifyWidthConstraint(int &abs_total, qreal &remaining_width_fraction); int lengthRange(int, int, const QList &) const; QString finalTextForCell( const TitleBlockCell &, From 5ba08284f5ccbbb5535e67c4da5d79e43d3cb7ae Mon Sep 17 00:00:00 2001 From: ispyisail Date: Sat, 8 Aug 2026 23:02:07 +1200 Subject: [PATCH 15/20] Fix "use current date" preset being lost unless the Folio tab is active on save Bugtracker #308: the "current date" preset for a project's default title block doesn't persist. A later comment on the report pinpointed it exactly: the setting falls back to "No date" unless the folio tab remains active when saving settings, and the same happens in Project Properties. TitleBlockPropertiesWidget::properties() (and its near-duplicate sibling propertiesAutoNum(), copy-pasted with the same bug) reads the date radio buttons like this: else if (ui->m_current_date_rb->isVisible() && ui->m_current_date_rb->isChecked()) { prop.useDate = TitleBlockProperties::CurrentDate; ... Both the New Project settings page and Project Properties embed this widget as one page of a QTabWidget (NewDiagramPage, in configpage/configpages.cpp). QWidget::isVisible() depends on the whole ancestor chain being visible, not just the widget's own state -- switch to any other tab before clicking OK/Apply and this radio button's isVisible() goes false even though it's still checked underneath, silently falling through all three branches. The function returns a default-constructed TitleBlockProperties for the date fields (useDate = UseDateValue, date = QDate(), i.e. "no date"), matching exactly what was reported. Fix: use isHidden() instead, which reflects only this widget's own explicit state and mirrors the read side's own check in setProperties()/initDialog() just above it in the same file -- that side already uses isHidden(), not isVisible(), for the identical "is the current-date option even offered here" question. Verified directly: a standalone Qt program constructing the real NewDiagramPage, checking "current date", switching the tab widget away from Folio to Conducteur (reproducing the report's exact trigger), then calling applyConf() and reading back the QSettings value. Against the original code this saves date="null"; with the fix, date="now" -- the same scenario, same tab switch, only the one line differs. Also confirmed a full Release build (504/504, CMake/ Ninja, Qt 5.15.18) with no new warnings. --- sources/ui/titleblockpropertieswidget.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/sources/ui/titleblockpropertieswidget.cpp b/sources/ui/titleblockpropertieswidget.cpp index edce4217f..d561a3c57 100644 --- a/sources/ui/titleblockpropertieswidget.cpp +++ b/sources/ui/titleblockpropertieswidget.cpp @@ -194,7 +194,16 @@ TitleBlockProperties TitleBlockPropertiesWidget::properties() const prop.useDate = TitleBlockProperties::UseDateValue; prop.date = ui->m_date_edit->date(); } - else if (ui->m_current_date_rb->isVisible() && ui->m_current_date_rb->isChecked()) { + else if (!ui->m_current_date_rb->isHidden() && ui->m_current_date_rb->isChecked()) { + /* isVisible() (unlike isHidden()) also depends on the whole + * ancestor chain being visible, not just this widget's own + * state -- inside a QTabWidget page (both the New Project and + * Project Properties dialogs embed this widget in one), it's + * false whenever this isn't the active tab, silently dropping + * "current date" back to the useDate/date default (no date) + * even though the radio button is still checked underneath. + * isHidden() mirrors the read side's own check in initDialog(), + * and isn't affected by an ancestor tab switch. */ prop.useDate = TitleBlockProperties::CurrentDate; prop.date = QDate::currentDate(); } @@ -237,7 +246,16 @@ TitleBlockProperties TitleBlockPropertiesWidget::propertiesAutoNum( prop.useDate = TitleBlockProperties::UseDateValue; prop.date = ui->m_date_edit->date(); } - else if (ui->m_current_date_rb->isVisible() && ui->m_current_date_rb->isChecked()) { + else if (!ui->m_current_date_rb->isHidden() && ui->m_current_date_rb->isChecked()) { + /* isVisible() (unlike isHidden()) also depends on the whole + * ancestor chain being visible, not just this widget's own + * state -- inside a QTabWidget page (both the New Project and + * Project Properties dialogs embed this widget in one), it's + * false whenever this isn't the active tab, silently dropping + * "current date" back to the useDate/date default (no date) + * even though the radio button is still checked underneath. + * isHidden() mirrors the read side's own check in initDialog(), + * and isn't affected by an ancestor tab switch. */ prop.useDate = TitleBlockProperties::CurrentDate; prop.date = QDate::currentDate(); } From cd7388985ee727e9352146f7786770aed4af5f60 Mon Sep 17 00:00:00 2001 From: ispyisail Date: Sat, 8 Aug 2026 23:10:54 +1200 Subject: [PATCH 16/20] Edit increment and preview the next number in the auto-numbering dock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug #331: "Il serait intéressant de pouvoir directement dans la fenêtre 'Sélection numérotation auto' modifier la valeur d'incrément et visualiser la prochaine numérotation qui sera appliquée. Ceci sans être obligé d'ouvrir la page de configuration." The dock (AutoNumberingDockWidget) already let you see and edit a rule's *current* value inline (added in 52c8ef6b4/031710b5f/ee4ba82d2). The increment itself, and any preview of where the numbering is headed, was reachable only through Configurer -> the full project-properties dialog. Two new widgets per row (conductor/element/folio): - An increment spin box, read from and written to the same NumerotationContext field NumPartEditorW's increase_spinBox already edits in the full dialog -- same data, second place to reach it. - A read-only next-value field, computed via NumerotationContextCommands::next() -- the identical engine the "Suivant" button in the full dialog already uses to step a whole context. Reusing it rather than reimplementing the arithmetic means wrap-and-carry between parts comes out identical to what actually happens when the number is next consumed, and zero-padding matches real rendering (NumerotationContext::formatValue(), mirroring autonum::setSequentialToList()'s padding rule by hand since that function is local to assignvariables.cpp). NumerotationContext gains replaceIncrease(index, increase), a sibling to the existing replaceValue() that touches only the increment field. Every refresh call site in the file (13 of them) previously refreshed just the value field; they now go through a new refreshRow(category), which refreshes value + increment + next-value-preview together via a small per-row widget bundle (rowFor()). This also let resetAutoNum()'s three-way switch collapse to one line, and refreshValueFields()'s three near-identical blocks collapse to a loop -- both existing before this change, not new here. Verified live under Xvfb: created an element numbering rule "K" (Chiffre 1, value 1, increment 1) via the full dialog, confirmed the dock showed Valeur=1/Incrément=1/Suivant=2. Changed the dock's own Incrément to 3 -- Suivant updated live to 4, no dialog needed. Changed Valeur to 10 -- Suivant became 13. Reopened the full configuration dialog and confirmed it read back the same value_field=10/increase_spinBox=3, i.e. the round trip through replaceIncrease()/storeContext() does not disturb type, initial value, modulus or format. Builds clean, CMake/Ninja Release, Qt 5.15, 820/820, no new warnings. Fixes: https://qelectrotech.org/bugtracker/view.php?id=331 Co-Authored-By: Claude Opus 5 --- sources/autoNum/numerotationcontext.cpp | 45 +++++ sources/autoNum/numerotationcontext.h | 5 + .../autoNum/ui/autonumberingdockwidget.cpp | 191 +++++++++++++++--- sources/autoNum/ui/autonumberingdockwidget.h | 34 ++++ sources/autoNum/ui/autonumberingdockwidget.ui | 153 ++++++++++++++ 5 files changed, 403 insertions(+), 25 deletions(-) diff --git a/sources/autoNum/numerotationcontext.cpp b/sources/autoNum/numerotationcontext.cpp index a8f3b11f4..3355a1bb4 100644 --- a/sources/autoNum/numerotationcontext.cpp +++ b/sources/autoNum/numerotationcontext.cpp @@ -220,6 +220,24 @@ void NumerotationContext::replaceValue(int index, QString content) { content_[index] = type + "|" + value + "|" + increase + "|" + initvalue + "|" + modulus + "|" + format; } +/** + @brief NumerotationContext::replaceIncrease + Change how much this part advances per step, leaving its current value, + initial value, modulus and format untouched. Sibling to replaceValue(), + which deliberately never touches this field. + @param index of NC item + @param increase new increase for that item +*/ +void NumerotationContext::replaceIncrease(int index, int increase) { + QStringList strl = content_[index].split("|"); + QString type = strl.at(0); + QString value = strl.at(1); + QString initvalue = strl.at(3); + QString modulus = strl.size() > 4 ? strl.at(4) : QStringLiteral("0"); + QString format = strl.size() > 5 ? strl.at(5) : QString(); + content_[index] = type + "|" + value + "|" + QString::number(increase) + "|" + initvalue + "|" + modulus + "|" + format; +} + /** @brief NumerotationContext::formatOf @param item : a context item as returned by itemAt() @@ -230,3 +248,30 @@ QString NumerotationContext::formatOf(const QStringList &item) { return item.size() > 5 ? item.at(5) : QString(); } + +/** + @brief NumerotationContext::formatValue + @param item : a context item as returned by itemAt() + @return the part's value, zero-padded exactly as + autonum::setSequentialToList() pads it when composing a real label: an + explicit format mask wins, then "ten"/"hundred" parts get their + implicit 2/3-digit width, "alpha" is used as-is, everything else is a + plain number. Kept in step with that function by hand since the two + cannot share code without exposing an assignvariables.cpp-local helper. +*/ +QString NumerotationContext::formatValue(const QStringList &item) +{ + const QString &type = item.at(0); + const QString &value = item.at(1); + if (type == QLatin1String("alpha")) + return value; + + const QString mask = formatOf(item); + if (!mask.isEmpty()) + return QString("%1").arg(value.toInt(), mask.length(), 10, QChar('0')); + if (type == QLatin1String("ten") || type == QLatin1String("tenfolio")) + return QString("%1").arg(value.toInt(), 2, 10, QChar('0')); + if (type == QLatin1String("hundred") || type == QLatin1String("hundredfolio")) + return QString("%1").arg(value.toInt(), 3, 10, QChar('0')); + return QString::number(value.toInt()); +} diff --git a/sources/autoNum/numerotationcontext.h b/sources/autoNum/numerotationcontext.h index f53c42751..b1575e468 100644 --- a/sources/autoNum/numerotationcontext.h +++ b/sources/autoNum/numerotationcontext.h @@ -54,6 +54,11 @@ class NumerotationContext QDomElement toXml(QDomDocument &, const QString&); void fromXml(QDomElement &); void replaceValue(int, QString); + void replaceIncrease(int, int); + /// Zero-pad a part's value the same way the real numbering engine + /// does (autonum::setSequentialToList in assignvariables.cpp), so a + /// UI preview of a part's value matches what actually gets rendered. + static QString formatValue(const QStringList &item); private: QStringList content_; diff --git a/sources/autoNum/ui/autonumberingdockwidget.cpp b/sources/autoNum/ui/autonumberingdockwidget.cpp index 664a00e90..080126d6c 100644 --- a/sources/autoNum/ui/autonumberingdockwidget.cpp +++ b/sources/autoNum/ui/autonumberingdockwidget.cpp @@ -24,10 +24,13 @@ #include "../../titleblockproperties.h" #include "../../ui/projectpropertiesdialog.h" #include "../numerotationcontext.h" +#include "../numerotationcontextcommands.h" #include "ui_autonumberingdockwidget.h" #include #include +#include +#include /** @brief AutoNumberingDockWidget::AutoNumberingDockWidget @@ -64,6 +67,29 @@ void AutoNumberingDockWidget::clear() ui->m_conductor_value_le->clear(); ui->m_element_value_le->clear(); ui->m_folio_value_le->clear(); + ui->m_conductor_next_le->clear(); + ui->m_element_next_le->clear(); + ui->m_folio_next_le->clear(); +} + +/** + @brief AutoNumberingDockWidget::rowFor + @return the combo/value/increase/next widgets that make up category's row. +*/ +AutoNumberingDockWidget::Row AutoNumberingDockWidget::rowFor(AutoNumCategory category) const +{ + switch (category) { + case AutoNumCategory::Conductor: + return {ui->m_conductor_cb, ui->m_conductor_value_le, + ui->m_conductor_increase_sb, ui->m_conductor_next_le}; + case AutoNumCategory::Element: + return {ui->m_element_cb, ui->m_element_value_le, + ui->m_element_increase_sb, ui->m_element_next_le}; + case AutoNumCategory::Folio: + return {ui->m_folio_cb, ui->m_folio_value_le, + ui->m_folio_increase_sb, ui->m_folio_next_le}; + } + return {nullptr, nullptr, nullptr, nullptr}; } void AutoNumberingDockWidget::projectClosed() @@ -201,9 +227,9 @@ void AutoNumberingDockWidget::setContext() //The combo boxes have just been repopulated, so the value fields next //to them are showing whatever the previous project left there. - refreshValueField(ui->m_conductor_cb, ui->m_conductor_value_le, AutoNumCategory::Conductor); - refreshValueField(ui->m_element_cb, ui->m_element_value_le, AutoNumCategory::Element); - refreshValueField(ui->m_folio_cb, ui->m_folio_value_le, AutoNumCategory::Folio); + refreshRow(AutoNumCategory::Conductor); + refreshRow(AutoNumCategory::Element); + refreshRow(AutoNumCategory::Folio); this->setActive(); } @@ -279,7 +305,7 @@ void AutoNumberingDockWidget::on_m_conductor_cb_activated(int) m_project->setCurrentConductorAutoNum(current_autonum); m_project_view->currentDiagram()->diagram()->setConductorsAutonumName(current_autonum); m_project_view->currentDiagram()->diagram()->loadCndFolioSeq(); - refreshValueField(ui->m_conductor_cb, ui->m_conductor_value_le, AutoNumCategory::Conductor); + refreshRow(AutoNumCategory::Conductor); } /** @@ -308,7 +334,7 @@ void AutoNumberingDockWidget::on_m_element_cb_activated(int) { m_project->setCurrrentElementAutonum(ui->m_element_cb->currentText()); m_project_view->currentDiagram()->diagram()->loadElmtFolioSeq(); - refreshValueField(ui->m_element_cb, ui->m_element_value_le, AutoNumCategory::Element); + refreshRow(AutoNumCategory::Element); } /** @@ -346,7 +372,7 @@ void AutoNumberingDockWidget::on_m_folio_cb_activated(int) { m_project->setDefaultTitleBlockProperties(ip); } emit(folioAutoNumChanged(current_autonum)); - refreshValueField(ui->m_folio_cb, ui->m_folio_value_le, AutoNumCategory::Folio); + refreshRow(AutoNumCategory::Folio); } void AutoNumberingDockWidget::on_m_configure_pb_clicked() @@ -389,6 +415,21 @@ void AutoNumberingDockWidget::on_m_folio_value_le_editingFinished() applyValueField(ui->m_folio_cb, ui->m_folio_value_le, AutoNumCategory::Folio); } +void AutoNumberingDockWidget::on_m_conductor_increase_sb_valueChanged(int) +{ + applyIncreaseField(ui->m_conductor_cb, ui->m_conductor_increase_sb, AutoNumCategory::Conductor); +} + +void AutoNumberingDockWidget::on_m_element_increase_sb_valueChanged(int) +{ + applyIncreaseField(ui->m_element_cb, ui->m_element_increase_sb, AutoNumCategory::Element); +} + +void AutoNumberingDockWidget::on_m_folio_increase_sb_valueChanged(int) +{ + applyIncreaseField(ui->m_folio_cb, ui->m_folio_increase_sb, AutoNumCategory::Folio); +} + /** @brief AutoNumberingDockWidget::contextFor @return the numerotation context named by combo_box, for category @@ -455,17 +496,21 @@ int AutoNumberingDockWidget::counterIndex(const NumerotationContext &context) */ void AutoNumberingDockWidget::refreshValueFields() { - //Leave alone a field the user is typing in: numbering an element - //refreshes all three, and overwriting a half-typed value under the - //cursor is worse than showing it a moment out of date. Only this - //automatic path skips; an explicit refresh after a reset or an edit - //still writes, so the field always ends up canonical. - if (!ui->m_conductor_value_le->hasFocus()) - refreshValueField(ui->m_conductor_cb, ui->m_conductor_value_le, AutoNumCategory::Conductor); - if (!ui->m_element_value_le->hasFocus()) - refreshValueField(ui->m_element_cb, ui->m_element_value_le, AutoNumCategory::Element); - if (!ui->m_folio_value_le->hasFocus()) - refreshValueField(ui->m_folio_cb, ui->m_folio_value_le, AutoNumCategory::Folio); + //Leave alone a row the user is typing in: numbering an element + //refreshes all three rows, and overwriting a half-typed value or + //increment under the cursor is worse than showing it a moment out + //of date. Only this automatic path skips; an explicit refresh after + //a reset or an edit still writes, so the row always ends up + //canonical. The next-value preview has no such guard: it is + //read-only, so there is nothing a refresh could clobber. + for (AutoNumCategory category : {AutoNumCategory::Conductor, + AutoNumCategory::Element, + AutoNumCategory::Folio}) + { + const Row row = rowFor(category); + if (!row.value->hasFocus() && !row.increase->hasFocus()) + refreshRow(category); + } } /** @@ -507,13 +552,114 @@ void AutoNumberingDockWidget::applyValueField(QComboBox *combo_box, QLineEdit *l const QString typed = line_edit->text(); if (typed.isEmpty() || typed == context.itemAt(index).at(1)) { - refreshValueField(combo_box, line_edit, category); + refreshRow(category); return; } context.replaceValue(index, typed); storeContext(combo_box, category, context); - refreshValueField(combo_box, line_edit, category); + refreshRow(category); +} + +/** + @brief AutoNumberingDockWidget::refreshIncreaseField + Show the counter's current step size (bug #331: previously only + reachable from the full configuration dialog, via "Configurer"). +*/ +void AutoNumberingDockWidget::refreshIncreaseField(QComboBox *combo_box, QSpinBox *increase_sb, AutoNumCategory category) +{ + //QSpinBox::setValue() emits valueChanged() even when called + //programmatically. Without blocking it, this refresh would + //immediately re-trigger on_..._increase_sb_valueChanged() -> + //applyIncreaseField() -> storeContext() -> the project's + //autoNumContextUpdated signal -> refreshValueFields() -> back here. + const QSignalBlocker blocker(increase_sb); + if (!m_project || combo_box->currentText().isEmpty()) + { + increase_sb->setEnabled(false); + increase_sb->setValue(increase_sb->minimum()); + return; + } + + const NumerotationContext context = contextFor(combo_box, category); + const int index = counterIndex(context); + increase_sb->setEnabled(index >= 0); + increase_sb->setValue(index >= 0 ? context.itemAt(index).at(2).toInt() + : increase_sb->minimum()); +} + +/** + @brief AutoNumberingDockWidget::applyIncreaseField + Write the spin box's step size to the counter it displays (bug #331). +*/ +void AutoNumberingDockWidget::applyIncreaseField(QComboBox *combo_box, QSpinBox *increase_sb, AutoNumCategory category) +{ + if (!m_project || combo_box->currentText().isEmpty()) + return; + + NumerotationContext context = contextFor(combo_box, category); + const int index = counterIndex(context); + if (index < 0) + return; + + if (increase_sb->value() == context.itemAt(index).at(2).toInt()) + return; + + context.replaceIncrease(index, increase_sb->value()); + storeContext(combo_box, category, context); + refreshRow(category); +} + +/** + @brief AutoNumberingDockWidget::refreshNextField + Show what this counter will read after one more step (bug #331: "visualiser + la prochaine numérotation qui sera appliquée"). Advances a copy of the + whole context through NumerotationContextCommands -- the same engine the + Suivant button in the full configuration dialog uses to step a context -- + so wrap-and-carry into this part from a following part, or out of it into + a preceding one, comes out identical to what will actually happen when the + number is next consumed. +*/ +void AutoNumberingDockWidget::refreshNextField(QComboBox *combo_box, QLineEdit *next_edit, AutoNumCategory category) +{ + if (!m_project || combo_box->currentText().isEmpty()) + { + next_edit->clear(); + next_edit->setEnabled(false); + return; + } + + const NumerotationContext context = contextFor(combo_box, category); + const int index = counterIndex(context); + if (index < 0) + { + next_edit->clear(); + next_edit->setEnabled(false); + return; + } + + Diagram *diagram = (m_project_view && m_project_view->currentDiagram()) + ? m_project_view->currentDiagram()->diagram() + : nullptr; + NumerotationContextCommands ncc(context, diagram); + const NumerotationContext next_context = ncc.next(); + + next_edit->setEnabled(true); + next_edit->setText(NumerotationContext::formatValue(next_context.itemAt(index))); +} + +/** + @brief AutoNumberingDockWidget::refreshRow + Refresh a category's value, increment and next-value preview together -- + every call site that used to refresh just the value field needs the + other two kept in step with it as well. +*/ +void AutoNumberingDockWidget::refreshRow(AutoNumCategory category) +{ + const Row row = rowFor(category); + refreshValueField(row.combo, row.value, category); + refreshIncreaseField(row.combo, row.increase, category); + refreshNextField(row.combo, row.next, category); } /** @@ -557,10 +703,5 @@ void AutoNumberingDockWidget::resetAutoNum(QComboBox *combo_box, AutoNumCategory } storeContext(combo_box, category, context); - - switch (category) { - case AutoNumCategory::Conductor: refreshValueField(combo_box, ui->m_conductor_value_le, category); break; - case AutoNumCategory::Element: refreshValueField(combo_box, ui->m_element_value_le, category); break; - case AutoNumCategory::Folio: refreshValueField(combo_box, ui->m_folio_value_le, category); break; - } + refreshRow(category); } diff --git a/sources/autoNum/ui/autonumberingdockwidget.h b/sources/autoNum/ui/autonumberingdockwidget.h index cdfb9f08e..5e86610e1 100644 --- a/sources/autoNum/ui/autonumberingdockwidget.h +++ b/sources/autoNum/ui/autonumberingdockwidget.h @@ -25,6 +25,7 @@ class QComboBox; class QLineEdit; +class QSpinBox; namespace Ui { class AutoNumberingDockWidget; @@ -66,12 +67,28 @@ class AutoNumberingDockWidget : public QDockWidget void on_m_element_value_le_editingFinished(); void on_m_folio_value_le_editingFinished(); + void on_m_conductor_increase_sb_valueChanged(int); + void on_m_element_increase_sb_valueChanged(int); + void on_m_folio_increase_sb_valueChanged(int); + signals: void folioAutoNumChanged(QString); private: enum class AutoNumCategory { Conductor, Element, Folio }; + /// The four widgets that make up one category's row, bundled so + /// refreshRow() can be called with just a category instead of + /// four pointers that must always be passed in matching sets. + struct Row + { + QComboBox *combo; + QLineEdit *value; + QSpinBox *increase; + QLineEdit *next; + }; + Row rowFor(AutoNumCategory category) const; + /** @brief resetAutoNum Reset the numerotation context currently selected in combo_box @@ -93,6 +110,23 @@ class AutoNumberingDockWidget : public QDockWidget void refreshValueField(QComboBox *combo_box, QLineEdit *line_edit, AutoNumCategory category); void applyValueField(QComboBox *combo_box, QLineEdit *line_edit, AutoNumCategory category); + /// Refresh/apply the increment spin box the same way. + void refreshIncreaseField(QComboBox *combo_box, QSpinBox *increase_sb, AutoNumCategory category); + void applyIncreaseField(QComboBox *combo_box, QSpinBox *increase_sb, AutoNumCategory category); + + /// Show what the counter will read after one more step, using + /// the same NumerotationContextCommands engine the Suivant + /// button in the full configuration dialog already advances + /// the whole context with -- so the preview can never disagree + /// with what actually happens when the number is next consumed. + void refreshNextField(QComboBox *combo_box, QLineEdit *next_edit, AutoNumCategory category); + + /// Refresh a whole row -- value, increment and next-value + /// preview -- in one call. Every refresh call site needs the + /// increment and preview kept in step with the value now, so + /// this replaces refreshValueField() at each of them. + void refreshRow(AutoNumCategory category); + Ui::AutoNumberingDockWidget *ui; QETProject* m_project = nullptr; ProjectView* m_project_view = nullptr; diff --git a/sources/autoNum/ui/autonumberingdockwidget.ui b/sources/autoNum/ui/autonumberingdockwidget.ui index 578a475b1..4fcd61901 100644 --- a/sources/autoNum/ui/autonumberingdockwidget.ui +++ b/sources/autoNum/ui/autonumberingdockwidget.ui @@ -15,6 +15,36 @@ + + + + Valeur + + + Qt::AlignCenter + + + + + + + Incrément + + + Qt::AlignCenter + + + + + + + Suivant + + + Qt::AlignCenter + + + @@ -61,6 +91,47 @@ + + + + + 55 + 16777215 + + + + Incrément : valeur ajoutée au compteur à chaque nouvelle numérotation + + + Qt::AlignCenter + + + true + + + 0 + + + + + + + + 70 + 16777215 + + + + Prochaine valeur qui sera appliquée avec cet incrément + + + true + + + Qt::AlignCenter + + + @@ -108,6 +179,47 @@ + + + + + 55 + 16777215 + + + + Incrément : valeur ajoutée au compteur à chaque nouvelle numérotation + + + Qt::AlignCenter + + + true + + + 0 + + + + + + + + 70 + 16777215 + + + + Prochaine valeur qui sera appliquée avec cet incrément + + + true + + + Qt::AlignCenter + + + @@ -144,6 +256,47 @@ + + + + + 55 + 16777215 + + + + Incrément : valeur ajoutée au compteur à chaque nouvelle numérotation + + + Qt::AlignCenter + + + true + + + 0 + + + + + + + + 70 + 16777215 + + + + Prochaine valeur qui sera appliquée avec cet incrément + + + true + + + Qt::AlignCenter + + + From bfee5b1cdbc582459d9922c3f2d618cb4cbcd3cf Mon Sep 17 00:00:00 2001 From: Andre Rummler Date: Sat, 8 Aug 2026 15:16:48 +0200 Subject: [PATCH 17/20] Merge branch 'master' into master-fix-slot --- .../autoNum/ui/autonumberingdockwidget.cpp | 13 +++++++- sources/diagramview.cpp | 2 +- sources/exportdialog.cpp | 19 ++++++++---- sources/qetapp.cpp | 7 +++-- sources/qetdiagrameditor.cpp | 4 +++ sources/qetproject.h | 1 - sources/titleblock/templatelogomanager.cpp | 4 +++ sources/ui/configpage/projectconfigpages.cpp | 30 +++++++++++++++++-- 8 files changed, 67 insertions(+), 13 deletions(-) diff --git a/sources/autoNum/ui/autonumberingdockwidget.cpp b/sources/autoNum/ui/autonumberingdockwidget.cpp index 080126d6c..8bab40e7a 100644 --- a/sources/autoNum/ui/autonumberingdockwidget.cpp +++ b/sources/autoNum/ui/autonumberingdockwidget.cpp @@ -26,6 +26,7 @@ #include "../numerotationcontext.h" #include "../numerotationcontextcommands.h" #include "ui_autonumberingdockwidget.h" +#include "../../undocommand/changetitleblockcommand.h" #include #include @@ -371,7 +372,17 @@ void AutoNumberingDockWidget::on_m_folio_cb_activated(int) { ip.folio = "%id/%total"; m_project->setDefaultTitleBlockProperties(ip); } - emit(folioAutoNumChanged(current_autonum)); + + if (m_project_view && m_project_view->currentDiagram()) { + Diagram *diagram = m_project_view->currentDiagram()->diagram(); + TitleBlockProperties old_properties = diagram->border_and_titleblock.exportTitleBlock(); + TitleBlockProperties new_properties = old_properties; + new_properties.auto_page_num = ip.auto_page_num; + new_properties.folio = ip.folio; + if (new_properties != old_properties) + diagram->undoStack().push(new ChangeTitleBlockCommand(diagram, old_properties, new_properties)); + } + emit(folioAutoNumChanged(current_autonum)); refreshRow(AutoNumCategory::Folio); } diff --git a/sources/diagramview.cpp b/sources/diagramview.cpp index 3d82ca7f4..427ad0634 100644 --- a/sources/diagramview.cpp +++ b/sources/diagramview.cpp @@ -100,7 +100,7 @@ DiagramView::DiagramView(Diagram *diagram, QWidget *parent) : connect(m_diagram, SIGNAL(showDiagram(Diagram*)), this, SIGNAL(showDiagram(Diagram*))); connect(m_diagram, SIGNAL(sceneRectChanged(QRectF)), this, SLOT(adjustSceneRect())); - connect(&(m_diagram -> border_and_titleblock), SIGNAL(diagramTitleChanged(const QString &)), this, SLOT(updateWindowTitle())); + connect(&(m_diagram -> border_and_titleblock), &BorderTitleBlock::informationChanged, this, &DiagramView::updateWindowTitle); connect(diagram, SIGNAL(findElementRequired(ElementsLocation)), this, SIGNAL(findElementRequired(ElementsLocation))); QShortcut *edit_conductor_color_shortcut = new QShortcut(QKeySequence(Qt::Key_F2), this); diff --git a/sources/exportdialog.cpp b/sources/exportdialog.cpp index 3298ad44c..6e48170e5 100644 --- a/sources/exportdialog.cpp +++ b/sources/exportdialog.cpp @@ -140,12 +140,21 @@ QWidget *ExportDialog::initDiagramsListPart() reset_mapper_ = new QSignalMapper(this); clipboard_mapper_ = new QSignalMapper(this); - connect(preview_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_previewDiagram(int))); - connect(width_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_correctHeight(int))); - connect(height_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_correctWidth(int))); - connect(ratio_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_keepRatioChanged(int))); - connect(reset_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_resetSize(int))); +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) // TODO Qt6 only: remove, mappedInt() always available + connect(preview_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_previewDiagram(int))); + connect(width_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_correctHeight(int))); + connect(height_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_correctWidth(int))); + connect(ratio_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_keepRatioChanged(int))); + connect(reset_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_resetSize(int))); connect(clipboard_mapper_, SIGNAL(mapped(int)), this, SLOT(slot_exportToClipBoard(int))); +#else + connect(preview_mapper_, &QSignalMapper::mappedInt, this, &ExportDialog::slot_previewDiagram); + connect(width_mapper_, &QSignalMapper::mappedInt, this, &ExportDialog::slot_correctHeight); + connect(height_mapper_, &QSignalMapper::mappedInt, this, &ExportDialog::slot_correctWidth); + connect(ratio_mapper_, &QSignalMapper::mappedInt, this, &ExportDialog::slot_keepRatioChanged); + connect(reset_mapper_, &QSignalMapper::mappedInt, this, &ExportDialog::slot_resetSize); + connect(clipboard_mapper_, &QSignalMapper::mappedInt, this, &ExportDialog::slot_exportToClipBoard); +#endif diagrams_list_layout_ = new QGridLayout(); diff --git a/sources/qetapp.cpp b/sources/qetapp.cpp index 852eac383..456676705 100644 --- a/sources/qetapp.cpp +++ b/sources/qetapp.cpp @@ -124,8 +124,11 @@ QETApp::QETApp() : initSplashScreen(); initSystemTray(); - connect(&signal_map, SIGNAL(mapped(QWidget *)), - this, SLOT(invertMainWindowVisibility(QWidget *))); +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) // TODO Qt6 only: remove, mappedObject() always available + connect(&signal_map, SIGNAL(mapped(QWidget *)), this, SLOT(invertMainWindowVisibility(QWidget *))); +#else + connect(&signal_map, &QSignalMapper::mappedObject, this, [this](QObject *object) { invertMainWindowVisibility(qobject_cast(object)); }); +#endif qApp->setQuitOnLastWindowClosed(false); connect(qApp, &QApplication::lastWindowClosed, this, &QETApp::checkRemainingWindows); diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 7ee1ca909..c2c15c12e 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -107,7 +107,11 @@ QETDiagramEditor::QETDiagramEditor(const QStringList &files, QWidget *parent) : m_workspace.setTabsClosable(true); //Set the signal mapper +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) // TODO Qt6 only: remove, mappedObject() always available connect(&windowMapper, SIGNAL(mapped(QWidget *)), this, SLOT(activateWidget(QWidget *))); +#else + connect(&windowMapper, &QSignalMapper::mappedObject, this, [this](QObject *object) { activateWidget(qobject_cast(object)); }); +#endif setWindowTitle(tr("QElectroTech", "window title")); setWindowIcon(QET::Icons::QETLogo); diff --git a/sources/qetproject.h b/sources/qetproject.h index b08e2b5b4..3817abad9 100644 --- a/sources/qetproject.h +++ b/sources/qetproject.h @@ -244,7 +244,6 @@ class QETProject : public QObject /// rebuild their rule lists; this one just says "re-read me". void autoNumContextUpdated(); void folioAutoNumRemoved(); - void folioAutoNumChanged(QString); void defaultTitleBlockPropertiesChanged(); void conductorAutoNumChanged(); diff --git a/sources/titleblock/templatelogomanager.cpp b/sources/titleblock/templatelogomanager.cpp index 9cd08befb..45a756791 100644 --- a/sources/titleblock/templatelogomanager.cpp +++ b/sources/titleblock/templatelogomanager.cpp @@ -217,7 +217,11 @@ QString TitleBlockTemplateLogoManager::confirmLogoName(const QString &initial_na connect(replace_button, SIGNAL(clicked()), signal_mapper, SLOT(map())); connect(rename_button, SIGNAL(clicked()), signal_mapper, SLOT(map())); connect(cancel_button, SIGNAL(clicked()), signal_mapper, SLOT(map())); +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) // TODO Qt6 only: remove, mappedInt() always available connect(signal_mapper, SIGNAL(mapped(int)), rename_dialog, SLOT(done(int))); +#else + connect(signal_mapper, &QSignalMapper::mappedInt, rename_dialog, &QDialog::done); +#endif } rd_label -> setText( QString(tr( diff --git a/sources/ui/configpage/projectconfigpages.cpp b/sources/ui/configpage/projectconfigpages.cpp index e4fcb69ef..2f8ea06e4 100644 --- a/sources/ui/configpage/projectconfigpages.cpp +++ b/sources/ui/configpage/projectconfigpages.cpp @@ -396,17 +396,29 @@ void ProjectAutoNumConfigPage::buildConnections() //Conductor Tab connect(m_saw_conductor, &SelectAutonumW::applyPressed, this, &ProjectAutoNumConfigPage::saveContextConductor); connect(m_saw_conductor, &SelectAutonumW::removeClicked, this, &ProjectAutoNumConfigPage::removeContextConductor); - connect(m_saw_conductor->contextComboBox(), SIGNAL(currentIndexChanged(QString)), this, SLOT(updateContextConductor(QString))); +#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // TODO Qt6 only: remove, textActivated() always available + connect(m_saw_conductor->contextComboBox(), SIGNAL(activated(QString)), this, SLOT(updateContextConductor(QString))); +#else + connect(m_saw_conductor->contextComboBox(), &QComboBox::textActivated, this, &ProjectAutoNumConfigPage::updateContextConductor); +#endif //Element Tab connect(m_saw_element, &SelectAutonumW::applyPressed, this, &ProjectAutoNumConfigPage::saveContextElement); connect(m_saw_element, &SelectAutonumW::removeClicked, this, &ProjectAutoNumConfigPage::removeContextElement); - connect(m_saw_element->contextComboBox(), SIGNAL(currentIndexChanged(QString)), this, SLOT(updateContextElement(QString))); +#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // TODO Qt6 only: remove, textActivated() always available + connect(m_saw_element->contextComboBox(), SIGNAL(activated(QString)), this, SLOT(updateContextElement(QString))); +#else + connect(m_saw_element->contextComboBox(), &QComboBox::textActivated, this, &ProjectAutoNumConfigPage::updateContextElement); +#endif //Folio Tab connect(m_saw_folio, &SelectAutonumW::applyPressed, this, &ProjectAutoNumConfigPage::saveContextFolio); connect(m_saw_folio, &SelectAutonumW::removeClicked, this, &ProjectAutoNumConfigPage::removeContextFolio); - connect(m_saw_folio->contextComboBox(), SIGNAL(currentIndexChanged(QString)), this, SLOT(updateContextFolio(QString))); +#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // TODO Qt6 only: remove, textActivated() always available + connect(m_saw_folio->contextComboBox(), SIGNAL(activated(QString)), this, SLOT(updateContextFolio(QString))); +#else + connect(m_saw_folio->contextComboBox(), &QComboBox::textActivated, this, &ProjectAutoNumConfigPage::updateContextFolio); +#endif // Auto Folio Numbering connect (m_faw, SIGNAL (applyPressed()), this, SLOT (applyAutoNum())); @@ -491,6 +503,10 @@ void ProjectAutoNumConfigPage::removeContextElement() return; m_project->removeElementAutoNum (m_saw_element->contextComboBox()->currentText()); m_saw_element->contextComboBox()->removeItem (m_saw_element->contextComboBox()->currentIndex()); + // removeItem() removes the current selection programmatically but + // textActivated() does not react to (by design, see buildConnections()). + // Refresh the displayed pattern explicitly so it matches the new selection. + updateContextElement(m_saw_element->contextComboBox()->currentText()); } /** @@ -678,6 +694,10 @@ void ProjectAutoNumConfigPage::removeContextConductor() if ( m_saw_conductor->contextComboBox()-> currentText() == tr("Nom de la nouvelle numérotation") ) return; m_project -> removeConductorAutoNum (m_saw_conductor->contextComboBox()-> currentText() ); m_saw_conductor->contextComboBox()-> removeItem (m_saw_conductor->contextComboBox()-> currentIndex() ); + // removeItem() removes the current selection programmatically but + // textActivated() does not react to (by design, see buildConnections()). + // Refresh the displayed pattern explicitly so it matches the new selection. + updateContextConductor(m_saw_conductor->contextComboBox()->currentText()); project()->conductorAutoNumRemoved(); } @@ -691,6 +711,10 @@ void ProjectAutoNumConfigPage::removeContextFolio() if ( m_saw_folio->contextComboBox() -> currentText() == tr("Nom de la nouvelle numérotation") ) return; m_project -> removeFolioAutoNum (m_saw_folio->contextComboBox() -> currentText() ); m_saw_folio->contextComboBox() -> removeItem (m_saw_folio->contextComboBox() -> currentIndex() ); + // removeItem() removes the current selection programmatically but + // textActivated() does not react to (by design, see buildConnections()). + // Refresh the displayed pattern explicitly so it matches the new selection. + updateContextFolio(m_saw_folio->contextComboBox()->currentText()); project()->folioAutoNumRemoved(); } From ad200e28c72d6ba8789cdcbb80dc17cf2b69776c Mon Sep 17 00:00:00 2001 From: Kellermorph Date: Sat, 8 Aug 2026 20:15:07 +0200 Subject: [PATCH 18/20] Update German translation --- lang/qet_de.qm | Bin 341902 -> 359203 bytes lang/qet_de.ts | 289 +++++++++++++++++++++++++------------------------ 2 files changed, 145 insertions(+), 144 deletions(-) diff --git a/lang/qet_de.qm b/lang/qet_de.qm index e37d5a2016baa5d0a4362984d7d48c9361d62697..ee110f2a3ed556b526d709bc2310c192e2061a9d 100644 GIT binary patch delta 33741 zcmXV&2Uyfv6NV=_C)wR>cCmn6Kooli>>aQ-R8%ZjQS1t0*Huxm7pfgp5L5)cV!?`v zV(-|mV!_@(z1aOflK(!>ectS{yGhQOGxN>Ni7P+aZ~M<-b$MG~!haQsx-A1;NeIi+ z$Wvc{HHfyf25W&+z`7({z=odxI}b(3vuU$Ymb!EEl56 znIx|It@HOjqAIw^Ek>fM9wh#8!T>cTsq_(|dRC&*dx+YH5;Nf9L4M&DQRjH#GoFJf z#KPKP;KE6)jPv#CN|byPv~4Ex!XJ8VCbsShk?%kv|1~;O>S~lq)CB#B8sLP!@fiAQ zM7`(X|93hMUf0MM#DVGfTqmM_O-NW6uQU3OM!oQHUsrX}}K-}3>4E?CnL|rffL1`p3-lmZ!wjv7dLsWbyQOH1Iwr)f- z>JbfE2I4mdWr3K^!3@L&Ec79oS;(1Wqc2}bEIWk+zhI&w%Sa6VgCD*@;^Ju-;%JTh ztAY6PeI&SV)5upHAs&8)IP)YPokUd0j(Ac6G5b=)Q|Ayb+lKfxZ{n43ml$PnXCLCX zSHQl1>TFa}XPd@0{a|2go&LXcj(w+d-v8g8xYa>GA)+ z_ritY#KP>#Iv0=Exw^K_EjIm%gzdQU!VjiB*Li%8&MTF4J{q9&Qwfc1cXyrpuxRi- zc3Qsx_TiNN`ak``d5C^OKC_7SK9A6EgvT||U)y#D=?5pKX_PEpIvsFf_h5{b-HE@# z(D(WdW)i=S6TfD}n^q&K#x0VpR+2m(4JBdpYmzboh&ol#*>{l6 z^wS!J#=$xd-O>5*iAEM=)){Bhnb%0?uSXhrq8&-6o7ix|wj^a1o_GRDmm-N{`AJt3 zh(8S=c~&e5J3o;DcgSW9Aw#3XBuqR+hE`?3*JQvQv3YICaMYQEqi@N83uU1t$Z#fw z#4aOrZW*fctwM%N_}sB_WUS&qY{hvp6}OEimd;46D-o3mAgga(V!!WE@uzVlsI$nS zax~2M9hHo`L)_%lD!4P*-m

CSo>q80AgO+?YDd#0MrR)FA_rt5Qem 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 Réinitialiser à la valeur de départ - + Auf den Ausgangswert zurücksetzen Valeur actuelle du compteur. Saisir une nouvelle valeur et valider pour la modifier. - + Aktueller Zählerstand. Geben Sie einen neuen Wert ein und bestätigen Sie, um ihn zu ändern. @@ -548,7 +548,7 @@ Autonumérotation - Automatische Nummerierung: + Automatische Nummerierung @@ -1283,12 +1283,12 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Lettres minuscules, chiffres, tiret et underscore uniquement - + Nur Kleinbuchstaben, Ziffern, Bindestriche und Unterstriche Supprimer cette propriété - + Diese Eigenschaft löschen @@ -1296,27 +1296,27 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Enregistrer... - + Speichern... Enregistrer le rapport de diagnostic - + Diagnosebericht speichern Fichiers texte (*.txt);;Tous les fichiers (*) - + Textdateien (*.txt);;Alle Dateien (*) Erreur - Fehler + Fehler Impossible d'écrire dans le fichier « %1 ». - + Die Datei „%1“ kann nicht beschrieben werden. @@ -2011,7 +2011,7 @@ Bemerkung: diese Optionen verhindern NICHT das automatische Nummerieren. Numéroter automatiquement un élément undo caption - + Ein Element automatisch nummerieren @@ -2199,7 +2199,7 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El Ajouter une propriété personnalisée - + Benutzerdefinierte Eigenschaft hinzufügen @@ -2383,7 +2383,7 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El Esclave PLC - + SPS-Slave @@ -2427,7 +2427,7 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El Module PLC - + SPS-Modul @@ -2477,138 +2477,138 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El Configuration PLC - + SPS-Konfiguration + - + + - - + - Adresse - + Adresse Commentaire - Kommentar + Kommentar Réf. croisée - + Querverweis Nb. - + Anzahl T1 - + T1 Police des en-têtes - + Schriftart der Überschriften Configurer la police des en-têtes de colonnes - + Schriftart für Spaltenüberschriften festlegen Police du texte - + Schriftart des Textes Configurer la police du texte dans les cellules - + Schriftart des Textes in den Zellen festlegen Afficher les en-têtes sur la feuille - + Kopfzeilen auf dem Blatt anzeigen Afficher ou masquer les en-têtes de colonnes du tableau PLC sur la feuille - + Spaltenüberschriften der SPS-Tabelle auf dem Blatt anzeigen oder ausblenden Saut %1 après: - + Sprung %1 danach: Aucun - + Keine H. ligne: - + Zeilenhöhe: mm - + mm Réf. - + Querverweis Nom personnalisé de la colonne (vide = par défaut) - + Benutzerdefinierter Spaltenname (leer = Standard) Visible - + Sichtbar Coller depuis le presse-papiers - + Aus der Zwischenablage einfügen Police des en-têtes: %1 %2pt - + Schriftgröße der Überschriften: %1 %2pt Police du texte: %1 %2pt - + Schriftgröße: %1 %2pt Police des en-têtes de colonnes - + Schriftart der Spaltenüberschriften Police du texte des cellules - + Schriftart des Zelltextes @@ -2838,7 +2838,7 @@ Der angezeigte Name des Elements lässt sich separat in den Eigenschaften des El Automates (MAE/SPS) - + Steuerungen (MAE/SPS) @@ -3351,12 +3351,12 @@ Mit dem Import dieser Datei bestätigen Sie, dass: Insérer un folio au-dessus - + Eine Seite oben einfügen Insérer un folio en dessous - + Eine Seite darunter einfügen @@ -3413,7 +3413,7 @@ Mit dem Import dieser Datei bestätigen Sie, dass: Panneau des éléments - + Elementübersicht @@ -3661,7 +3661,7 @@ Mit dem Import dieser Datei bestätigen Sie, dass: Dessiner les noms des bornes - + Die Klemmenbezeichnungen einzeichnen @@ -5018,12 +5018,12 @@ Veuillez utiliser l'éditeur avancé pour cela. Atteindre un élément window title - + Zu einem Element navigieren Nom, label ou information de l'élément… - + Name, Bezeichnung oder Informationen zum Element… @@ -5206,17 +5206,17 @@ Veuillez utiliser l'éditeur avancé pour cela. (déjà utilisé) - + (bereits verwendet) Sélectionner un IO PLC - + Ein SPS-E/A-Modul auswählen IO disponible: - + Verfügbare E/A: @@ -5385,32 +5385,32 @@ Veuillez utiliser l'éditeur avancé pour cela. Type - Typ + Typ Adresse - + Adresse Fonction - Funktion + Funktion Commentaire - Kommentar + Kommentar Réf. croisée - + Querverweis Coller depuis le presse-papiers - + Aus der Zwischenablage einfügen @@ -5654,12 +5654,12 @@ Veuillez utiliser l'éditeur avancé pour cela. Mettre à 0 pour un chiffre qui n'avance que par le report d'un chiffre cyclique suivant (ex: le "0" de "0.7") - + Auf 0 setzen, wenn es sich um eine Zahl handelt, die sich nur durch den Übertrag einer nachfolgenden zyklischen Ziffer erhöht (z. B. die „0“ in „0,7“) Valeur à laquelle ce chiffre revient à 0 en incrémentant le chiffre précédent (0 = pas de cycle) - + Wert, bei dem diese Ziffer durch Inkrementieren der vorherigen Ziffer auf 0 zurückgesetzt wird (0 = kein Zyklus) @@ -5669,12 +5669,12 @@ Veuillez utiliser l'éditeur avancé pour cela. Format d'affichage : une suite de zéros donne le nombre minimum de chiffres (00 = 07, 000 = 007). Vide = largeur naturelle du type. - + Anzeigeformat: Eine Folge von Nullen gibt die Mindestanzahl an Ziffern an (00 = 07, 000 = 007). Leer = natürliche Breite des Typs. 0 - + 0 @@ -5710,7 +5710,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Cyclique (modulo) - + Zyklisch (Modul) @@ -5719,7 +5719,7 @@ Veuillez utiliser l'éditeur avancé pour cela. Alphabétique - + Alphabetisch @@ -5903,72 +5903,72 @@ Veuillez utiliser l'éditeur avancé pour cela. Cet élément est déjà lié - Das Bauteil ist bereits gebunden + Das Bauteil ist bereits gebunden Délier - Trennen + Trennen Voir cet élément - Bauteil zeigen + Bauteil zeigen Recherche - Suchen + Suchen Label - + BMK Type - Typ + Typ Adresse - + Adresse Fonction - Funktion + Funktion Commentaire - Kommentar + Kommentar Anschlüsse - + Anschlüsse Remarque : les éléments maîtres ayant atteint leur nombre maximal d'esclaves sont masqués. - Hinweis: Master-Elemente, die ihre maximale Anzahl an Slaves erreicht haben, werden ausgeblendet. + Hinweis: Master-Elemente, die ihre maximale Anzahl an Slaves erreicht haben, werden ausgeblendet. Automate (PLC) - + SPS (PLC) Lié à: %1 - + Verwandt mit: %1 Connecter - + Verbinden @@ -6266,26 +6266,26 @@ Folgende Variablen sind inkompatibel: Temps passé sur ce projet : label when configuring - + Zeitaufwand für dieses Projekt: Suivre le temps passé sur ce projet (uniquement enregistré localement dans ce fichier) checkbox label - + Die für dieses Projekt aufgewendete Zeit erfassen (wird ausschließlich lokal in dieser Datei gespeichert) Réinitialiser button label - + Zurücksetzen %1 h %2 min hours and minutes of time spent on a project - + %1 Std. %2 Min. @@ -6353,7 +6353,7 @@ Folgende Variablen sind inkompatibel: Dessiner les noms des bornes - + Die Bezeichnungen der Klemmen einzeichnen @@ -6539,7 +6539,7 @@ Voulez-vous enregistrer les modifications ? Êtes-vous sûr de vouloir supprimer ce folio du projet ? message box content - + Sind Sie sicher, dass Sie dieses Folio aus dem Projekt löschen möchten? @@ -6835,23 +6835,24 @@ Voulez-vous enregistrer les modifications ? Rapport de plantage - + Absturzbericht QElectroTech ne s'est pas fermé correctement lors de sa dernière exécution. Voici les derniers messages enregistrés avant l'arrêt -- vous pouvez les enregistrer pour les joindre à un rapport de bug. - + QElectroTech wurde bei der letzten Ausführung nicht ordnungsgemäß beendet. +Hier sind die letzten Meldungen, die vor dem Beenden aufgezeichnet wurden – Sie können sie speichern, um sie einem Fehlerbericht beizufügen. Rapport de diagnostic - + Diagnosebericht Ceci contient les derniers messages de journalisation de cette session. Vérifiez le contenu avant de le joindre à un rapport de bug public. - + Hier finden Sie die neuesten Protokolleinträge dieser Sitzung. Überprüfen Sie den Inhalt, bevor Sie ihn einem öffentlichen Fehlerbericht beifügen. @@ -7484,7 +7485,7 @@ Verfügbare Optionen: Éditeur de schémas - + Schema-Editor @@ -7501,13 +7502,13 @@ Verfügbare Optionen: Coupure automatique de conducteur(s) Tool tip of auto break conductor - + Automatische Unterbrechung der Leitung(en) Couper automatiquement les conducteurs existants lors du placement d'un élément Status tip of auto break conductor - + Vorhandene Leiter beim Platzieren eines Elements automatisch abschneiden @@ -7615,13 +7616,13 @@ Verfügbare Optionen: Atteindre un élément - + Zu einem Element navigieren Recherche et sélectionne rapidement un élément du folio status bar tip - + Ein Element im Folio schnell suchen und auswählen @@ -7698,8 +7699,8 @@ Verfügbare Optionen: %n description(s) de police écrite(s) dans un format étranger ou corrompu ont été restaurée(s). Elles seront réécrites dans un format stable au prochain enregistrement du projet. message box content - - + + %n Beschreibungen von Schriftarten, die in einem fremden oder beschädigten Format vorlagen, wurden wiederhergestellt. Sie werden beim nächsten Speichern des Projekts in ein stabiles Format umgeschrieben. @@ -7707,8 +7708,8 @@ Verfügbare Optionen: %n description(s) de police n'ont pas pu être lue(s) ; la police par défaut sera utilisée pour ces textes. message box content - - + + %n Schriftartbeschreibung(en) konnten nicht gelesen werden; für diese Texte wird die Standardschriftart verwendet. @@ -7716,7 +7717,7 @@ Verfügbare Optionen: Polices du projet message box title - + Schriftarten des Projekts @@ -7913,7 +7914,7 @@ Entfernen Sie die Überbrückung und/oder löschen Sie die Ebenen der betroffene Supprimer %1 folios - + %1 Seiten löschen @@ -7924,7 +7925,7 @@ Entfernen Sie die Überbrückung und/oder löschen Sie die Ebenen der betroffene Déplacer les folios - + Folios verschieben @@ -8023,7 +8024,7 @@ Entfernen Sie die Überbrückung und/oder löschen Sie die Ebenen der betroffene Exporter en SVG - + Als SVG exportieren @@ -8524,34 +8525,34 @@ veuillez patienter durant l'import... Éditeur d'élément - + Element-Editor X: %1 Y: %2 - + X: %1 Y: %2 Exporter en SVG dialog title - + Als SVG exportieren Image SVG (*.svg) filetypes allowed when exporting an element to SVG - + SVG-Bild (*.svg) Échec de l'export - + Export fehlgeschlagen Impossible d'écrire dans le fichier « %1 ». - + Die Datei „%1“ kann nicht beschrieben werden. @@ -8701,7 +8702,7 @@ Die erforderlichen Bedingungen wurden nicht erfüllt Général - Allgemein + Allgemein @@ -8741,13 +8742,13 @@ Die erforderlichen Bedingungen wurden nicht erfüllt Enregistrer un rapport de diagnostic... - + Diagnosebericht speichern... Génère un rapport avec les derniers messages de journalisation, pour l'inclure dans un rapport de bug status bar tip - + Erstellt einen Bericht mit den neuesten Protokollmeldungen, um ihn in einen Fehlerbericht aufzunehmen @@ -9070,7 +9071,7 @@ Was möchten Sie tun? Éditeur de cartouche - + Kartuschen-Editor @@ -9603,7 +9604,7 @@ Was möchten Sie tun? Profondeur - + Tiefe @@ -9872,7 +9873,7 @@ Was möchten Sie tun? Numéroter automatiquement un conducteur undo caption - + Eine Leitung automatisch nummerieren @@ -10214,12 +10215,12 @@ Möchten Sie sie ersetzen? Table PLC - + SPS-Tabelle Table PLC (vide) - + SPS-Tabelle (leer) @@ -10227,7 +10228,7 @@ Möchten Sie sie ersetzen? Type - Typ + Typ @@ -10235,7 +10236,7 @@ Möchten Sie sie ersetzen? Adresse - + Adresse @@ -10252,7 +10253,7 @@ Möchten Sie sie ersetzen? Réf. croisée - + Querverweis @@ -10447,27 +10448,27 @@ Möchten Sie sie ersetzen? Type PLC - + SPS-Typ Adresse PLC - + SPS-Adresse Fonction PLC - + SPS-Funktion Commentaire PLC - + SPS-Kommentar Réf. croisée PLC - + PLC-Querverweis @@ -10775,32 +10776,32 @@ Möchten Sie sie ersetzen? Entrée digitale - + Digitaler Eingang Sortie digitale - + Digitaler Ausgang Entrée analogique - + Analoger Eingang Sortie analogique - + Analoger Ausgang Entrée universelle - + Universeller Eingang Sortie universelle - + Universeller Ausgang @@ -10926,25 +10927,25 @@ Bitte laden Sie diese über den Link herunter und entpacken Sie sie in den Insta table PLC element part name - + SPS-Tabelle Ajouter un folio undo command text - Neue Folie hinzufügen + Neue Folie hinzufügen Déplacer un folio undo command text - + Ein Folio verschieben Supprimer un folio undo command text - + Ein Folio löschen @@ -12152,43 +12153,43 @@ Andere Felder werden nicht verwendet. Filtrer les raccourcis… - + Verknüpfungen filtern… Catégorie - + Kategorie Action - + Aktion Raccourci - + Abkürzung Tout réinitialiser - + Alles zurücksetzen Réinitialiser ce raccourci - + Diese Verknüpfung zurücksetzen Ce raccourci est aussi utilisé par : %1 - + Diese Verknüpfung wird auch verwendet von: %1 Raccourcis configuration page title - + Tastenkombinationen @@ -15034,17 +15035,17 @@ Andere Felder werden nicht verwendet. Alignement - Ausrichtung + Ausrichtung Point d'ancrage du texte et alignement des lignes entre elles - + Bezugspunkt des Textes und Ausrichtung der Zeilen zueinander Modifier l'alignement d'un champ texte - Ausrichtung eines Textfelds ändern + Ausrichtung eines Textfelds ändern @@ -16012,7 +16013,7 @@ Maximale Länge: %2px Automate (PLC) - + SPS (PLC) @@ -16167,7 +16168,7 @@ Maximale Länge: %2px Éditeur de texte - + Texteditor From 76ff69e91224cbfd93f41c42c8e0f582c4500811 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Sun, 9 Aug 2026 11:19:48 +0200 Subject: [PATCH 19/20] ci(windows-build): switch cron to monthly, bump artifact retention Weekly cron replaced with a monthly run (1st of each month, 02:00 UTC) to reduce unnecessary CI load. retention-days raised from 14 to 40 across all six artifact uploads (Qt5 + Qt6 tracks) to cover the new monthly interval with a safety margin -- 14 days was shorter than the gap between two cron runs, so the latest build's artifacts could expire before the next one replaced them. --- .github/workflows/windows-build.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 97fbc6034..dd5cdfb45 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -2,7 +2,7 @@ name: Windows Build on: schedule: - - cron: '0 2 * * 1' # Every Monday at 2:00 UTC + - cron: '0 2 1 * *' # workflow_dispatch: # Manual trigger available at any time concurrency: @@ -343,21 +343,21 @@ jobs: with: name: qelectrotech-${{ steps.qet_version.outputs.base_version }}+git${{ steps.qet_version.outputs.head }}-x86-win64-readytouse path: dist/${{ steps.zip_portable.outputs.zip_name }} - retention-days: 14 + retention-days: 40 - name: Upload NSIS installer uses: actions/upload-artifact@v7 with: name: qelectrotech-windows-installer path: dist/Installer_*.exe - retention-days: 14 + retention-days: 40 - name: Upload portable (nom fixe pour le workflow MSI) uses: actions/upload-artifact@v7 with: name: qelectrotech-windows-portable path: nsis_root/files/ - retention-days: 14 + retention-days: 40 # ============================================================================= # Job 2: Qt6 build (EXPERIMENTAL track) @@ -687,21 +687,21 @@ jobs: with: name: qelectrotech-${{ steps.qet_version.outputs.base_version }}+git${{ steps.qet_version.outputs.head }}-x86-win64-readytouse path: dist/${{ steps.zip_portable.outputs.zip_name }} - retention-days: 14 + retention-days: 40 - name: Upload NSIS installer uses: actions/upload-artifact@v7 with: name: qelectrotech-windows-installer-qt6 path: dist/Installer_*.exe - retention-days: 14 + retention-days: 40 - name: Upload portable (nom fixe pour le workflow MSI) uses: actions/upload-artifact@v7 with: name: qelectrotech-windows-portable-qt6 path: nsis_root/files/ - retention-days: 14 + retention-days: 40 # --------------------------------------------------------------------------- # Job 3 : Publie les assets nightly (exe + zip, Qt5 et Qt6) sur la release From 09983efe054c77d1c2639edd10cfbb4ad6e862f7 Mon Sep 17 00:00:00 2001 From: Laurent Trinques Date: Sun, 9 Aug 2026 11:23:13 +0200 Subject: [PATCH 20/20] ci(windows-msi): switch cron to monthly, bump artifact retention --- .github/workflows/windows-msi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/windows-msi.yml b/.github/workflows/windows-msi.yml index ee31653be..3020a179c 100644 --- a/.github/workflows/windows-msi.yml +++ b/.github/workflows/windows-msi.yml @@ -311,7 +311,7 @@ jobs: with: name: qelectrotech-windows-msi-${{ matrix.flavor }} path: dist\*.msi - retention-days: 14 + retention-days: 40 if-no-files-found: error - name: Delete old nightly .msi asset for this flavor