diff --git a/cmake/define_definitions.cmake b/cmake/define_definitions.cmake
index cb9ad9b54..e0a157e16 100644
--- a/cmake/define_definitions.cmake
+++ b/cmake/define_definitions.cmake
@@ -64,7 +64,8 @@ message("GIT_COMMIT_SHA :" ${GIT_COMMIT_SHA})
if(BUILD_WITH_KF6 AND BUILD_KF6)
message("KF6_GIT_TAG :" ${KF6_GIT_TAG})
-else()
+endif()
+if(NOT BUILD_WITH_KF6)
add_definitions(-DBUILD_WITHOUT_KF6)
endif()
message("QET_COMPONENTS :" ${QET_COMPONENTS})
diff --git a/cmake/fetch_kdeaddons.cmake b/cmake/fetch_kdeaddons.cmake
index 4e731ea46..fc8bd76e4 100644
--- a/cmake/fetch_kdeaddons.cmake
+++ b/cmake/fetch_kdeaddons.cmake
@@ -42,31 +42,19 @@ if(BUILD_WITH_KF6)
FetchContent_MakeAvailable(kcoreaddons)
get_target_property(kca_version KF6::CoreAddons VERSION)
- FetchContent_Declare(
- kwidgetsaddons
- GIT_REPOSITORY https://invent.kde.org/frameworks/kwidgetsaddons.git
- GIT_TAG ${KF6_GIT_TAG})
- FetchContent_MakeAvailable(kwidgetsaddons)
- get_target_property(kwa_version KF6::WidgetsAddons VERSION)
else()
find_package(KF6CoreAddons REQUIRED)
set(kca_version ${KF6CoreAddons_VERSION})
- find_package(KF6WidgetsAddons REQUIRED)
- set(kwa_version ${KF6WidgetsAddons_VERSION})
endif()
- get_target_property(kca_type KF6::WidgetsAddons TYPE)
get_target_property(kwa_type KF6::CoreAddons TYPE)
message(NOTICE "ecm version : " ${ECM_VERSION})
message(NOTICE "kcoreaddons library : " ${kca_type})
message(NOTICE "kcoreaddons version : " ${kca_version})
- message(NOTICE "kwidgetsaddons library : " ${kwa_type})
- message(NOTICE "kwidgetsaddons version : " ${kwa_version})
endblock()
set(KF6_PRIVATE_LIBRARIES
- KF6::WidgetsAddons
KF6::CoreAddons
)
endif()
diff --git a/cmake/qet_compilation_vars.cmake b/cmake/qet_compilation_vars.cmake
index dffed9ff4..1783dce0e 100644
--- a/cmake/qet_compilation_vars.cmake
+++ b/cmake/qet_compilation_vars.cmake
@@ -111,6 +111,12 @@ set(QET_SRC_FILES
${QET_DIR}/sources/borderproperties.h
${QET_DIR}/sources/bordertitleblock.cpp
${QET_DIR}/sources/bordertitleblock.h
+ ${QET_DIR}/sources/colorbutton.cpp
+ ${QET_DIR}/sources/colorbutton.h
+ ${QET_DIR}/sources/colorcombobox.cpp
+ ${QET_DIR}/sources/colorcombobox.h
+ ${QET_DIR}/sources/colorcomboboxdelegate.cpp
+ ${QET_DIR}/sources/colorcomboboxdelegate.h
${QET_DIR}/sources/conductorautonumerotation.cpp
${QET_DIR}/sources/conductorautonumerotation.h
${QET_DIR}/sources/conductornumexport.cpp
diff --git a/elements b/elements
index bfb09dd02..48eb7dced 160000
--- a/elements
+++ b/elements
@@ -1 +1 @@
-Subproject commit bfb09dd0215f03bf3010a0be78a1ea9818251545
+Subproject commit 48eb7dcedff5413da3acf18f764b7b43be009382
diff --git a/misc/org.qelectrotech.qelectrotech.desktop b/misc/org.qelectrotech.qelectrotech.desktop
index f26836a57..8713bec64 100644
--- a/misc/org.qelectrotech.qelectrotech.desktop
+++ b/misc/org.qelectrotech.qelectrotech.desktop
@@ -26,6 +26,7 @@ Comment[nl]=Bewerken bedradingsdiagrammen.
Comment[be]=Bewerken elektrisch schema.
Comment[da]=Rediger elektriske diagrammer.
Comment[ja]=電気回路図の編集。
+Comment[sk]=Úprava elektrických schém.
GenericName=Electrical diagram editor
GenericName[de]=Schaltplaneditor
GenericName[fr]=Éditeur de schémas électriques
@@ -42,3 +43,4 @@ GenericName[nl]=Elektrische schema editor
GenericName[be]=Elektrische schema editor
GenericName[da]=Elektrisk diagram redigering
GenericName[ja]=電気回路図エディタ
+GenericName[sk]=Editor elektrických schém
diff --git a/sources/TerminalStrip/ui/terminalstripeditor.ui b/sources/TerminalStrip/ui/terminalstripeditor.ui
index 29f6854e3..d02079f23 100644
--- a/sources/TerminalStrip/ui/terminalstripeditor.ui
+++ b/sources/TerminalStrip/ui/terminalstripeditor.ui
@@ -69,7 +69,7 @@
-
-
+
-
@@ -323,9 +323,9 @@
- KColorCombo
+ ColorComboBox
QComboBox
-
+
diff --git a/sources/autoNum/assignvariables.cpp b/sources/autoNum/assignvariables.cpp
index 8fdec27d8..d5e76d5c5 100644
--- a/sources/autoNum/assignvariables.cpp
+++ b/sources/autoNum/assignvariables.cpp
@@ -20,6 +20,7 @@
#include "../diagram.h"
#include "../diagramposition.h"
#include "../qetapp.h"
+#include "../qetgraphicsitem/conductor.h"
#include "../qetgraphicsitem/element.h"
#include "../qetxml.h"
@@ -189,12 +190,14 @@ namespace autonum
QString AssignVariables::formulaToLabel(QString formula,
sequentialNumbers &seqStruct,
Diagram *diagram,
- const Element *elmt)
+ const Element *elmt,
+ const Conductor *cndr)
{
AssignVariables av(std::move(formula),
seqStruct,
diagram,
- elmt);
+ elmt,
+ cndr);
seqStruct = av.m_seq_struct;
return av.m_assigned_label;
}
@@ -301,13 +304,14 @@ namespace autonum
AssignVariables::AssignVariables(const QString& formula,
const sequentialNumbers& seqStruct,
Diagram *diagram,
- const Element *elmt):
+ const Element *elmt,
+ const Conductor *cndr):
m_diagram(diagram),
m_arg_formula(formula),
m_assigned_label(formula),
m_seq_struct(seqStruct),
- m_element(elmt)
-
+ m_element(elmt),
+ m_conductor(cndr)
{
if (m_diagram)
{
@@ -349,6 +353,14 @@ namespace autonum
m_assigned_label.replace("%prefix", m_element->getPrefix());
}
+ if (m_conductor)
+ {
+ m_assigned_label.replace("%wf", cndr->properties().m_function);
+ m_assigned_label.replace("%wv", cndr->properties().m_tension_protocol);
+ m_assigned_label.replace("%wc", cndr->properties().m_wire_color);
+ m_assigned_label.replace("%ws", cndr->properties().m_wire_section);
+ }
+
assignTitleBlockVar();
assignProjectVar();
assignSequence();
diff --git a/sources/autoNum/assignvariables.h b/sources/autoNum/assignvariables.h
index e60b987ab..c5eacd6f2 100644
--- a/sources/autoNum/assignvariables.h
+++ b/sources/autoNum/assignvariables.h
@@ -24,6 +24,7 @@
#include
#include
+class Conductor;
class Diagram;
class Element;
class ElementsLocation;
@@ -61,12 +62,12 @@ namespace autonum
class AssignVariables
{
public:
- static QString formulaToLabel (QString formula, sequentialNumbers &seqStruct, Diagram *diagram, const Element *elmt = nullptr);
+ static QString formulaToLabel (QString formula, sequentialNumbers &seqStruct, Diagram *diagram, const Element *elmt = nullptr, const Conductor *cndr = nullptr);
static QString replaceVariable (const QString &formula, const DiagramContext &dc);
static QString genericXref (const Element *element);
private:
- AssignVariables(const QString& formula, const sequentialNumbers& seqStruct , Diagram *diagram, const Element *elmt = nullptr);
+ AssignVariables(const QString& formula, const sequentialNumbers& seqStruct , Diagram *diagram, const Element *elmt = nullptr, const Conductor *cndr = nullptr);
void assignTitleBlockVar();
void assignProjectVar();
void assignSequence();
@@ -76,6 +77,7 @@ namespace autonum
QString m_assigned_label;
sequentialNumbers m_seq_struct;
const Element *m_element = nullptr;
+ const Conductor *m_conductor = nullptr;
};
void setSequentialToList(QStringList &list, NumerotationContext &nc, const QString& type);
diff --git a/sources/colorbutton.cpp b/sources/colorbutton.cpp
new file mode 100644
index 000000000..8ceacc272
--- /dev/null
+++ b/sources/colorbutton.cpp
@@ -0,0 +1,90 @@
+/*
+ Copyright 2006-2025 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 "colorbutton.h"
+
+#include
+#include
+
+/**
+ @brief ColorButton::ColorButton
+ Simple constructor
+ @param parent QObject parent of the ColorButton
+*/
+ColorButton::ColorButton(QWidget *parent) : QPushButton(parent)
+{
+ connect(this, &QPushButton::clicked, this, &ColorButton::clicked);
+}
+
+/**
+ @brief Getter for current color
+ @return The current selected color
+*/
+const QColor ColorButton::color()
+{
+ return m_color;
+}
+
+/**
+ @brief Setter for current color
+*/
+void ColorButton::setColor(const QColor &color)
+{
+ m_color = color;
+ update();
+}
+
+/**
+ @brief ColorButton::clicked
+ Opens a color selection dialog and lets the user select a color.
+ @param checked Not used
+*/
+void ColorButton::clicked(bool checked)
+{
+ // Open color selection dialog
+ auto new_color = QColorDialog::getColor(m_color, this, tr("Select color"), QColorDialog::DontUseNativeDialog);
+
+ // Validate user input
+ if (new_color.isValid()) {
+ m_color = new_color;
+ emit changed(new_color);
+ update();
+ }
+}
+
+/**
+ @brief ColorButton::paintEvent
+ Paints a filled rectangle with the current selected color on the button surface.
+ @param e Paint event context
+*/
+void ColorButton::paintEvent(QPaintEvent *e) {
+ QPushButton::paintEvent(e);
+
+ // Padding for the color indicator
+ const int padding_x = 5;
+ const int padding_y = 5;
+
+ QPainter painter(this);
+
+ // Get dimensions of the button paint surface
+ auto r_width = painter.device()->width();
+ auto r_height = painter.device()->height();
+
+ // Paint a rectangle with a margin of 5
+ auto color_indicator = QRect(padding_x, padding_y, r_width - padding_x * 2, r_height - padding_y * 2);
+ painter.fillRect(color_indicator, m_color);
+}
diff --git a/sources/colorbutton.h b/sources/colorbutton.h
new file mode 100644
index 000000000..d70969cbf
--- /dev/null
+++ b/sources/colorbutton.h
@@ -0,0 +1,53 @@
+/*
+ Copyright 2006-2025 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 COLORBUTTON_H
+#define COLORBUTTON_H
+
+#include
+#include
+#include
+#include
+
+/**
+ @brief The ColorButton class
+*/
+class ColorButton : public QPushButton
+{
+ Q_OBJECT
+
+ public:
+ ColorButton(QWidget * = nullptr);
+
+ const QColor color();
+ void setColor(const QColor &);
+
+ public slots:
+ void clicked(bool = false);
+
+ protected:
+ void paintEvent(QPaintEvent *) override;
+
+ signals:
+ void changed(const QColor &);
+
+ private:
+ /// @brief Current selected color
+ QColor m_color = Qt::black;
+};
+
+#endif
diff --git a/sources/colorcombobox.cpp b/sources/colorcombobox.cpp
new file mode 100644
index 000000000..c556598cd
--- /dev/null
+++ b/sources/colorcombobox.cpp
@@ -0,0 +1,98 @@
+/*
+ Copyright 2006-2025 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 "colorcombobox.h"
+
+#include "colorcomboboxdelegate.h"
+
+#include
+#include
+#include
+#include
+
+
+/**
+ @brief ColorComboBox::ColorComboBox
+ Simple constructor
+ @param parent QObject parent of the ColorComboBox
+*/
+ColorComboBox::ColorComboBox(QWidget *parent) : QComboBox(parent)
+{
+ connect(this, &QComboBox::activated, this, &ColorComboBox::colorSelected);
+ setItemDelegate(new ColorComboBoxDelegate());
+}
+
+/**
+ @brief ColorComboBox::setColors
+ Sets the colors of the combo box. An item at the top will be added to allow selection
+ of a custom color.
+ @param colors Vector of colors to add to the combo box
+*/
+void ColorComboBox::setColors(const QVector &colors)
+{
+ addItem(tr("[Custom color...]"), QColor(Qt::black));
+ for(auto &color : colors) {
+ addItem(color.name(), color);
+ }
+}
+
+/**
+ @brief ColorComboBox::colorSelected
+ Opens a color selection dialog and lets the user select a color.
+ @param checked Not used
+*/
+void ColorComboBox::colorSelected(int index)
+{
+ if (index == 0) {
+ // Open color selection dialog if custom color is selected
+ auto new_color = QColorDialog::getColor(itemData(index).value(), this, tr("Select color"), QColorDialog::DontUseNativeDialog);
+
+ // Validate and emit user input color
+ if (new_color.isValid()) {
+ setItemData(index, new_color);
+ emit activated(new_color);
+ }
+ } else {
+ // Emit color from selected combo box row
+ emit activated(itemData(index).value());
+ }
+}
+
+/**
+ @brief ColorComboBox::paintEvent
+ Paints a filled rectangle with the current selected color on the combo box surface.
+ @param e Paint event context
+*/
+void ColorComboBox::paintEvent(QPaintEvent *e) {
+ // Padding for the color indicator
+ const int padding_x = 5;
+ const int padding_y = 5;
+
+ // Create painter and draw a vanilla combobox
+ QStylePainter painter(this);
+ QStyleOptionComboBox opt;
+ initStyleOption(&opt);
+ painter.drawComplexControl(QStyle::CC_ComboBox, opt);
+
+ // Get dimensions of the combo box paint surface
+ auto r_width = painter.device()->width();
+ auto r_height = painter.device()->height();
+
+ // Paint a rectangle with a margin
+ auto color_indicator = QRect(padding_x, padding_y, r_width - padding_x * 2, r_height - padding_y * 2);
+ painter.fillRect(color_indicator, itemData(currentIndex()).value());
+}
diff --git a/sources/colorcombobox.h b/sources/colorcombobox.h
new file mode 100644
index 000000000..c13a2ecc1
--- /dev/null
+++ b/sources/colorcombobox.h
@@ -0,0 +1,49 @@
+/*
+ Copyright 2006-2025 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 COLORCOMBOBOX_H
+#define COLORCOMBOBOX_H
+
+#include
+#include
+#include
+#include
+#include
+
+/**
+ @brief The ColorComboBox class
+*/
+class ColorComboBox : public QComboBox
+{
+ Q_OBJECT
+
+ public:
+ ColorComboBox(QWidget * = nullptr);
+
+ void setColors(const QVector &);
+
+ public slots:
+ void colorSelected(int);
+
+ protected:
+ void paintEvent(QPaintEvent *) override;
+
+ signals:
+ void activated(const QColor &);
+};
+
+#endif
diff --git a/sources/colorcomboboxdelegate.cpp b/sources/colorcomboboxdelegate.cpp
new file mode 100644
index 000000000..45ad81257
--- /dev/null
+++ b/sources/colorcomboboxdelegate.cpp
@@ -0,0 +1,62 @@
+/*
+ Copyright 2006-2025 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 "colorcomboboxdelegate.h"
+
+#include
+#include
+#include
+#include
+
+/**
+ @brief ColorComboBoxDelegate::paint
+ Paints a filled rectangle on the drop down item with the items color.
+ @param painter Painter context
+ @param option Style options
+ @param index Index of the item to paint
+
+ */
+void ColorComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+ // Padding for the color indicator
+ const int padding_x = 5;
+ const int padding_y = 2;
+
+ painter->save();
+
+ if (index.row() > 0)
+ {
+ auto rect = option.rect;
+
+ // Draw mouseover background
+ if (option.state & QStyle::State_MouseOver)
+ {
+ auto pal = option.widget->palette();
+ painter->fillRect(rect, pal.color(QPalette::Highlight));
+ }
+
+ // Draw color indicator rectangle
+ auto color = qvariant_cast(index.data());
+ rect.adjust(padding_x, padding_y, -padding_x, -padding_y);
+ painter->fillRect(rect, color);
+ } else {
+ // Draw a normal drop down item for custom color
+ QStyledItemDelegate::paint(painter, option, index);
+ }
+
+ painter->restore();
+}
diff --git a/sources/colorcomboboxdelegate.h b/sources/colorcomboboxdelegate.h
new file mode 100644
index 000000000..1580060d3
--- /dev/null
+++ b/sources/colorcomboboxdelegate.h
@@ -0,0 +1,35 @@
+/*
+ Copyright 2006-2025 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 COLORCOMBOBOXDELEGATE_H
+#define COLORCOMBOBOXDELEGATE_H
+
+#include
+
+/**
+ @brief The ColorComboBoxDelegate class
+ Handles drawing of items in the drop down list of ColorComboBox.
+*/
+class ColorComboBoxDelegate : public QStyledItemDelegate
+{
+ Q_OBJECT
+
+ public:
+ void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override;
+};
+
+#endif
diff --git a/sources/diagramevent/diagrameventaddelement.cpp b/sources/diagramevent/diagrameventaddelement.cpp
index c6c8bdb4d..2ac8f038e 100644
--- a/sources/diagramevent/diagrameventaddelement.cpp
+++ b/sources/diagramevent/diagrameventaddelement.cpp
@@ -248,9 +248,9 @@ void DiagramEventAddElement::addElement()
QUndoCommand *undo_object = new QUndoCommand(tr("Ajouter %1").arg(element->name()));
new AddGraphicsObjectCommand(element, m_diagram, m_element -> pos(), undo_object);
- //When we search for free aligned terminal we
- //temporally remove m_element to avoid any interaction with the function Element::AlignedFreeTerminals
- //this is useful when an element who have two (or more) terminals opposite,
+ //When we search for free aligned terminal we temporally remove m_element to
+ //avoid any interaction with the function Element::AlignedFreeTerminals
+ //This is useful when an element has two (or more) terminals on opposite sides,
//because m_element is exactly at the same pos of the new element
//added to the scene so new conductor are created between terminal of the new element
//and the opposite terminal of m_element.
diff --git a/sources/editor/editorcommands.cpp b/sources/editor/editorcommands.cpp
index 1a013eefa..221143c44 100644
--- a/sources/editor/editorcommands.cpp
+++ b/sources/editor/editorcommands.cpp
@@ -541,19 +541,19 @@ void RotateElementsCommand::undo()
}
else if (item->type() == PartLine::Type) {
PartLine* line = qgraphicsitem_cast(item);
- line->setRotation(-90);
+ line->setRotation(line->rotation()-90);
}
else if (item->type() == PartPolygon::Type) {
PartPolygon* poly = qgraphicsitem_cast(item);
- poly->setRotation(-90);
+ poly->setRotation(poly->rotation()-90);
}
else if (item->type() == PartText::Type) {
PartText* text = qgraphicsitem_cast(item);
- text->setRotation(-90);
+ text->setRotation(text->rotation()-90);
}
else if (item->type() == PartDynamicTextField::Type) {
PartDynamicTextField* dyntext = qgraphicsitem_cast(item);
- dyntext->setRotation(-90);
+ dyntext->setRotation(dyntext->rotation()-90);
}
else {
item->setRotation(item->rotation()-90);
@@ -586,19 +586,19 @@ void RotateElementsCommand::redo()
}
else if (item->type() == PartLine::Type) {
PartLine* line = qgraphicsitem_cast(item);
- line->setRotation(+90);
+ line->setRotation(line->rotation()+90);
}
else if (item->type() == PartPolygon::Type) {
PartPolygon* poly = qgraphicsitem_cast(item);
- poly->setRotation(+90);
+ poly->setRotation(poly->rotation()+90);
}
else if (item->type() == PartText::Type) {
PartText* text = qgraphicsitem_cast(item);
- text->setRotation(+90);
+ text->setRotation(text->rotation()+90);
}
else if (item->type() == PartDynamicTextField::Type) {
PartDynamicTextField* dyntext = qgraphicsitem_cast(item);
- dyntext->setRotation(+90);
+ dyntext->setRotation(dyntext->rotation()+90);
}
else {
item->setRotation(item->rotation()+90);
@@ -622,22 +622,22 @@ void RotateFineElementsCommand::undo()
{
if (item->type() == PartLine::Type) {
PartLine* line = qgraphicsitem_cast(item);
- line->setRotation(-5);
+ line->setRotation(line->rotation()-5);
}
else if (item->type() == PartPolygon::Type) {
PartPolygon* poly = qgraphicsitem_cast(item);
- poly->setRotation(-5);
+ poly->setRotation(poly->rotation()-5);
}
else if (item->type() == PartText::Type) {
PartText* text = qgraphicsitem_cast(item);
- text->setRotation(-5);
+ text->setRotation(text->rotation()-5);
}
else if (item->type() == PartDynamicTextField::Type) {
PartDynamicTextField* dyntext = qgraphicsitem_cast(item);
- dyntext->setRotation(-5);
+ dyntext->setRotation(dyntext->rotation()-5);
}
else {
- //item->setRotation(-5);
+ //item->setRotation(item->rotation()-5);
}
}
}
@@ -651,22 +651,22 @@ void RotateFineElementsCommand::redo()
{
if (item->type() == PartLine::Type) {
PartLine* line = qgraphicsitem_cast(item);
- line->setRotation(+5);
+ line->setRotation(line->rotation()+5);
}
else if (item->type() == PartPolygon::Type) {
PartPolygon* poly = qgraphicsitem_cast(item);
- poly->setRotation(+5);
+ poly->setRotation(poly->rotation()+5);
}
else if (item->type() == PartText::Type) {
PartText* text = qgraphicsitem_cast(item);
- text->setRotation(+5);
+ text->setRotation(text->rotation()+5);
}
else if (item->type() == PartDynamicTextField::Type) {
PartDynamicTextField* dyntext = qgraphicsitem_cast(item);
- dyntext->setRotation(+5);
+ dyntext->setRotation(dyntext->rotation()+5);
}
else {
- //item->setRotation(+5);
+ //item->setRotation(item->rotation()+5);
}
}
}
diff --git a/sources/editor/graphicspart/partarc.cpp b/sources/editor/graphicspart/partarc.cpp
index 822903757..ad340da67 100644
--- a/sources/editor/graphicspart/partarc.cpp
+++ b/sources/editor/graphicspart/partarc.cpp
@@ -172,8 +172,10 @@ QPainterPath PartArc::shadowShape() const
void PartArc::setRotation(qreal angle) {
+ qreal diffAngle = qRound((angle - rotation()) * 100.0) / 100.0;
+ m_rot = QET::correctAngle(angle, true);
// idea taken from QET_ElementScaler:
-if (angle > 0) {
+ if (diffAngle > 0) {
m_start_angle += 270.0 * 16;
while (m_start_angle < 0) { m_start_angle += (360*16); }
while (m_start_angle >= (360*16)) { m_start_angle -= (360*16); }
diff --git a/sources/editor/graphicspart/partdynamictextfield.cpp b/sources/editor/graphicspart/partdynamictextfield.cpp
index 1dd22c4d9..04f8a6332 100644
--- a/sources/editor/graphicspart/partdynamictextfield.cpp
+++ b/sources/editor/graphicspart/partdynamictextfield.cpp
@@ -67,8 +67,9 @@ QString PartDynamicTextField::xmlName() const
@param angle
*/
void PartDynamicTextField::setRotation(qreal angle) {
- QGraphicsObject::setRotation(QET::correctAngle(rotation()+angle, true));
- setPos(QTransform().rotate(angle).map(pos()));
+ qreal diffAngle = qRound((angle - rotation()) * 100.0) / 100.0;
+ QGraphicsObject::setRotation(QET::correctAngle(angle, true));
+ setPos(QTransform().rotate(diffAngle).map(pos()));
}
void PartDynamicTextField::mirror() {
diff --git a/sources/editor/graphicspart/partellipse.cpp b/sources/editor/graphicspart/partellipse.cpp
index ae05841f3..fb9907a95 100644
--- a/sources/editor/graphicspart/partellipse.cpp
+++ b/sources/editor/graphicspart/partellipse.cpp
@@ -238,8 +238,10 @@ bool PartEllipse::sceneEventFilter(QGraphicsItem *watched, QEvent *event)
void PartEllipse::setRotation(qreal angle) {
+ qreal diffAngle = qRound((angle - rotation()) * 100.0) / 100.0;
+ m_rot = QET::correctAngle(angle, true);
// idea taken from QET_ElementScaler:
- if (angle > 0) {
+ if (diffAngle > 0) {
qreal width = m_rect.height();
qreal height = m_rect.width();
qreal x = (m_rect.y() + m_rect.height()) * (-1);
diff --git a/sources/editor/graphicspart/partline.cpp b/sources/editor/graphicspart/partline.cpp
index 94c7f8437..3856af0dc 100644
--- a/sources/editor/graphicspart/partline.cpp
+++ b/sources/editor/graphicspart/partline.cpp
@@ -579,9 +579,10 @@ void PartLine::setSecondEndLength(const qreal &l)
}
void PartLine::setRotation(qreal angle) {
- m_rot += angle;
- m_line.setP1(QTransform().rotate(angle).map(m_line.p1()));
- m_line.setP2(QTransform().rotate(angle).map(m_line.p2()));
+ qreal diffAngle = qRound((angle - rotation()) * 100.0) / 100.0;
+ m_rot = QET::correctAngle(angle, true);
+ m_line.setP1(QTransform().rotate(diffAngle).map(m_line.p1()));
+ m_line.setP2(QTransform().rotate(diffAngle).map(m_line.p2()));
prepareGeometryChange();
setLine(m_line);
adjustHandlerPos();
diff --git a/sources/editor/graphicspart/partpolygon.cpp b/sources/editor/graphicspart/partpolygon.cpp
index 9a3e019f9..30c5a2a0b 100644
--- a/sources/editor/graphicspart/partpolygon.cpp
+++ b/sources/editor/graphicspart/partpolygon.cpp
@@ -297,8 +297,9 @@ void PartPolygon::resetAllHandlerColor()
void PartPolygon::setRotation(qreal angle) {
- QTransform rotation = QTransform().rotate(angle);
- m_rot += angle;
+ qreal diffAngle = qRound((angle - rotation()) * 100.0) / 100.0;
+ m_rot = QET::correctAngle(angle, true);
+ QTransform rotation = QTransform().rotate(diffAngle);
setPolygon(rotation.map(m_polygon));
prepareGeometryChange();
adjustHandlerPos();
diff --git a/sources/editor/graphicspart/partrectangle.cpp b/sources/editor/graphicspart/partrectangle.cpp
index 96c6910ca..7d4d27f2a 100644
--- a/sources/editor/graphicspart/partrectangle.cpp
+++ b/sources/editor/graphicspart/partrectangle.cpp
@@ -168,12 +168,14 @@ void PartRectangle::setYRadius(qreal Y)
}
void PartRectangle::setRotation(qreal angle) {
+ qreal diffAngle = qRound((angle - rotation()) * 100.0) / 100.0;
+ m_rot = QET::correctAngle(angle, true);
// for whatever reason: with "rect" we need to use scene-positions...
auto pos = mapToScene(m_rect.x(),m_rect.y());
qreal width = m_rect.height();
qreal height = m_rect.width();
qreal x; qreal y;
- if (angle > 0) {
+ if (diffAngle > 0) {
x = (pos.y() + m_rect.height()) * (-1);
y = pos.x();
} else {
diff --git a/sources/editor/graphicspart/partterminal.cpp b/sources/editor/graphicspart/partterminal.cpp
index 2c99e7c88..8e1a67e00 100644
--- a/sources/editor/graphicspart/partterminal.cpp
+++ b/sources/editor/graphicspart/partterminal.cpp
@@ -42,8 +42,9 @@ PartTerminal::~PartTerminal()
}
/**
+ Import terminal properties from an XML element
Importe les proprietes d'une borne depuis un element XML
- @param xml_elmt Element XML a lire
+ @param xml_elmt Element XML a lire / XML element to read
*/
void PartTerminal::fromXml(const QDomElement &xml_elmt) {
d -> fromXml(xml_elmt);
@@ -166,8 +167,9 @@ void PartTerminal::setRotation(qreal angle) {
else if (180 <= angle_mod && angle_mod < 270) new_ori = Qet::South;
else new_ori = Qet::West;
+ qreal diffAngle = qRound((angle - rotation()) * 100.0) / 100.0;
double tmp, y, x;
- if (angle > 0) {
+ if (diffAngle > 0) {
tmp = d->m_pos.y();
y = d->m_pos.x();
x = (-1) * tmp;
diff --git a/sources/editor/graphicspart/parttext.cpp b/sources/editor/graphicspart/parttext.cpp
index ec5a0eb5f..790258935 100644
--- a/sources/editor/graphicspart/parttext.cpp
+++ b/sources/editor/graphicspart/parttext.cpp
@@ -68,8 +68,9 @@ PartText::~PartText()
@param angle
*/
void PartText::setRotation(qreal angle) {
- QGraphicsObject::setRotation(QET::correctAngle(rotation()+angle, true));
- setPos(QTransform().rotate(angle).map(pos()));
+ qreal diffAngle = qRound((angle - rotation()) * 100.0) / 100.0;
+ QGraphicsObject::setRotation(QET::correctAngle(angle, true));
+ setPos(QTransform().rotate(diffAngle).map(pos()));
}
void PartText::mirror() {
diff --git a/sources/editor/ui/dynamictextfieldeditor.cpp b/sources/editor/ui/dynamictextfieldeditor.cpp
index afb841bb9..034611d93 100644
--- a/sources/editor/ui/dynamictextfieldeditor.cpp
+++ b/sources/editor/ui/dynamictextfieldeditor.cpp
@@ -140,10 +140,7 @@ void DynamicTextFieldEditor::updateForm()
ui -> m_user_text_le -> setText(m_text_field.data() -> text());
ui -> m_size_sb -> setValue(m_text_field.data() -> font().pointSize());
ui->m_keep_visual_rotation_cb->setChecked(m_text_field.data()->keepVisualRotation());
-#ifdef BUILD_WITHOUT_KF6
-#else
m_color_kpb -> setColor(m_text_field.data() -> color());
-#endif
ui -> m_width_sb -> setValue(m_text_field.data() -> textWidth());
ui -> m_font_pb -> setText(m_text_field -> font().family());
@@ -169,16 +166,13 @@ void DynamicTextFieldEditor::updateForm()
void DynamicTextFieldEditor::setupWidget()
{
-#ifdef BUILD_WITHOUT_KF6
-#else
- m_color_kpb = new KColorButton(this);
+ m_color_kpb = new ColorButton(this);
m_color_kpb->setObjectName(QString::fromUtf8("m_color_kpb"));
- connect(m_color_kpb, &KColorButton::changed,
+ connect(m_color_kpb, &ColorButton::changed,
this, &DynamicTextFieldEditor::on_m_color_kpb_changed);
ui->m_main_grid_layout->addWidget(m_color_kpb, 6, 1, 1, 2);
-#endif
}
void DynamicTextFieldEditor::setUpConnections()
diff --git a/sources/editor/ui/dynamictextfieldeditor.h b/sources/editor/ui/dynamictextfieldeditor.h
index 29644c4ae..a39d4abae 100644
--- a/sources/editor/ui/dynamictextfieldeditor.h
+++ b/sources/editor/ui/dynamictextfieldeditor.h
@@ -21,10 +21,7 @@
#include "../elementitemeditor.h"
#include "../graphicspart/partdynamictextfield.h"
-#ifdef BUILD_WITHOUT_KF6
-#else
-# include
-#endif
+#include "../../colorbutton.h"
namespace Ui {
class DynamicTextFieldEditor;
@@ -77,10 +74,7 @@ class DynamicTextFieldEditor : public ElementItemEditor {
QList m_parts;
QList m_connection_list;
- #ifdef BUILD_WITHOUT_KF6
- #else
- KColorButton* m_color_kpb = nullptr;
- #endif
+ ColorButton* m_color_kpb = nullptr;
};
#endif // DYNAMICTEXTFIELDEDITOR_H
diff --git a/sources/editor/ui/texteditor.cpp b/sources/editor/ui/texteditor.cpp
index 8689d741f..5e99eaaee 100644
--- a/sources/editor/ui/texteditor.cpp
+++ b/sources/editor/ui/texteditor.cpp
@@ -62,10 +62,7 @@ void TextEditor::updateForm()
m_rotation_sb -> setValue(m_text -> rotation());
m_size_sb -> setValue(m_text -> font().pointSize());
m_font_pb -> setText(m_text -> font().family());
-#ifdef BUILD_WITHOUT_KF6
-#else
m_color_pb -> setColor(m_text -> defaultTextColor());
-#endif
setUpEditConnection();
}
@@ -344,19 +341,16 @@ void TextEditor::setUpWidget(QWidget *parent)
m_line_edit->setPlaceholderText(tr("Entrer votre texte ici"));
gridLayout->addWidget(m_line_edit, 0, 0, 1, 6);
-#ifdef BUILD_WITHOUT_KF6
-#else
- m_color_pb = new KColorButton(parent);
+ m_color_pb = new ColorButton(parent);
m_color_pb->setObjectName(QString::fromUtf8("m_color_pb"));
connect(
m_color_pb,
- &KColorButton::changed,
+ &ColorButton::changed,
this,
&TextEditor::on_m_color_pb_changed);
gridLayout->addWidget(m_color_pb, 2, 5, 1, 1);
-#endif
QLabel *label_5 = new QLabel(parent);
label_5->setObjectName(QString::fromUtf8("label_5"));
diff --git a/sources/editor/ui/texteditor.h b/sources/editor/ui/texteditor.h
index de6bc8b74..ea74154b7 100644
--- a/sources/editor/ui/texteditor.h
+++ b/sources/editor/ui/texteditor.h
@@ -25,10 +25,7 @@
#include
#include
#include
-#ifdef BUILD_WITHOUT_KF6
-#else
-#include
-#endif
+#include "../../colorbutton.h"
class PartText;
class TextEditor : public ElementItemEditor {
@@ -65,10 +62,7 @@ class TextEditor : public ElementItemEditor {
QSpinBox *m_size_sb;
QLineEdit *m_line_edit;
QPushButton *m_font_pb;
-#ifdef BUILD_WITHOUT_KF6
-#else
- KColorButton *m_color_pb;
-#endif
+ ColorButton *m_color_pb;
};
#endif // TEXTEDITOR_H
diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp
index af19847d9..445b972bd 100644
--- a/sources/qetgraphicsitem/conductor.cpp
+++ b/sources/qetgraphicsitem/conductor.cpp
@@ -1505,7 +1505,7 @@ void Conductor::refreshText()
{
if (diagram())
{
- QString text = autonum::AssignVariables::formulaToLabel(m_properties.m_formula, m_autoNum_seq, diagram());
+ QString text = autonum::AssignVariables::formulaToLabel(m_properties.m_formula, m_autoNum_seq, diagram(), nullptr, this);
m_properties.text = text;
m_text_item->setPlainText(text);
}
@@ -1590,7 +1590,7 @@ void Conductor::setProperties(const ConductorProperties &property)
{
if (diagram())
{
- QString text = autonum::AssignVariables::formulaToLabel(m_properties.m_formula, m_autoNum_seq, diagram());
+ QString text = autonum::AssignVariables::formulaToLabel(m_properties.m_formula, m_autoNum_seq, diagram(), nullptr, this);
m_properties.text = text;
}
else if (m_properties.text.isEmpty())
diff --git a/sources/qetgraphicsitem/dynamicelementtextitem.cpp b/sources/qetgraphicsitem/dynamicelementtextitem.cpp
index 2e85b67b5..41a2474bd 100644
--- a/sources/qetgraphicsitem/dynamicelementtextitem.cpp
+++ b/sources/qetgraphicsitem/dynamicelementtextitem.cpp
@@ -545,8 +545,16 @@ void DynamicElementTextItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
if(m_slave_Xref_item)
m_slave_Xref_item->setDefaultTextColor(Qt::black);
}
-
- DiagramTextItem::mousePressEvent(event);
+
+ // Shift or no parent initiates movement of dynamic text, otherwise movement of parent element
+ if((event->modifiers() & Qt::ShiftModifier) || !m_parent_element)
+ {
+ m_move_parent = false;
+ DiagramTextItem::mousePressEvent(event);
+ } else {
+ m_move_parent = true;
+ parentElement()->mousePressEvent(event);
+ }
}
/**
@@ -557,26 +565,33 @@ void DynamicElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if((event->buttons() & Qt::LeftButton) && (flags() & ItemIsMovable))
{
- if(diagram() && m_first_move)
- diagram()->elementTextsMover().beginMovement(diagram(), this);
-
- if(m_first_move)
+ if(m_move_parent)
{
- m_initial_position = pos();
- if(parentElement())
- parentElement()->setHighlighted(true);
+ parentElement()->mouseMoveEvent(event);
+ } else {
+ if(diagram() && m_first_move)
+ diagram()->elementTextsMover().beginMovement(diagram(), this);
+
+ if(m_first_move)
+ {
+ m_initial_position = pos();
+ if(parentElement())
+ parentElement()->setHighlighted(true);
+ }
+
+ QPointF current_parent_pos;
+ QPointF button_down_parent_pos;
+ current_parent_pos = mapToParent(mapFromScene(event->scenePos()));
+ button_down_parent_pos = mapToParent(mapFromScene(event->buttonDownScenePos(Qt::LeftButton)));
+
+ int diffx = qRound(current_parent_pos.x() - button_down_parent_pos.x());
+ int diffy = qRound(current_parent_pos.y() - button_down_parent_pos.y());
+ QPointF new_pos = m_initial_position + QPointF(diffx, diffy);
+ setPos(new_pos);
+
+ if(diagram())
+ diagram()->elementTextsMover().continueMovement(event);
}
-
- QPointF current_parent_pos;
- QPointF button_down_parent_pos;
- current_parent_pos = mapToParent(mapFromScene(event->scenePos()));
- button_down_parent_pos = mapToParent(mapFromScene(event->buttonDownScenePos(Qt::LeftButton)));
-
- QPointF new_pos = m_initial_position + current_parent_pos - button_down_parent_pos;
- event->modifiers() == Qt::ControlModifier ? setPos(new_pos) : setPos(Diagram::snapToGrid(new_pos));
-
- if(diagram())
- diagram()->elementTextsMover().continueMovement(event);
} else {
event->ignore();
}
@@ -591,14 +606,19 @@ void DynamicElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
*/
void DynamicElementTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
- if (m_parent_element)
- m_parent_element->setHighlighted(false);
+ if(m_move_parent)
+ {
+ parentElement()->mouseReleaseEvent(event);
+ } else {
+ if (m_parent_element)
+ m_parent_element->setHighlighted(false);
- if(m_parent_element && m_parent_element->diagram())
- m_parent_element.data()->diagram()->elementTextsMover().endMovement();
-
- if(!(event->modifiers() & Qt::ControlModifier))
- QGraphicsTextItem::mouseReleaseEvent(event);
+ if(m_parent_element && m_parent_element->diagram())
+ m_parent_element.data()->diagram()->elementTextsMover().endMovement();
+
+ if(!(event->modifiers() & Qt::ControlModifier))
+ QGraphicsTextItem::mouseReleaseEvent(event);
+ }
}
/**
diff --git a/sources/qetgraphicsitem/dynamicelementtextitem.h b/sources/qetgraphicsitem/dynamicelementtextitem.h
index 776d84377..98f50ce89 100644
--- a/sources/qetgraphicsitem/dynamicelementtextitem.h
+++ b/sources/qetgraphicsitem/dynamicelementtextitem.h
@@ -170,6 +170,7 @@ class DynamicElementTextItem : public DiagramTextItem
QPointF m_initial_position;
bool m_keep_visual_rotation = true;
qreal m_visual_rotation_ref = 0;
+ bool m_move_parent = true;
};
#endif // DYNAMICELEMENTTEXTITEM_H
diff --git a/sources/qetgraphicsitem/element.h b/sources/qetgraphicsitem/element.h
index 22bd1f30a..4a0e9c55d 100644
--- a/sources/qetgraphicsitem/element.h
+++ b/sources/qetgraphicsitem/element.h
@@ -42,6 +42,7 @@ class ElementTextItemGroup;
class Element : public QetGraphicsItem
{
friend class DiagramEventAddElement;
+ friend class DynamicElementTextItem;
Q_OBJECT
public:
diff --git a/sources/qetgraphicsitem/terminal.cpp b/sources/qetgraphicsitem/terminal.cpp
index b0028a0dc..205f6b33d 100644
--- a/sources/qetgraphicsitem/terminal.cpp
+++ b/sources/qetgraphicsitem/terminal.cpp
@@ -695,11 +695,15 @@ bool Terminal::valideXml(QDomElement &terminal)
/**
@brief Terminal::fromXml
+ Enables you to find out whether an XML element represents this terminal.
+ Warning, the XML element is not checked
Permet de savoir si un element XML represente cette borne. Attention,
l'element XML n'est pas verifie
- @param terminal Le QDomElement a analyser
+ @param terminal Le QDomElement a analyser / QDomElement to check
@return true si la borne "se reconnait"
(memes coordonnes, meme orientation), false sinon
+ true, if the terminal ‘recognises’ itself (same coordinates,
+ same orientation), false otherwise
*/
bool Terminal::fromXml(QDomElement &terminal)
{
diff --git a/sources/ui/conductorpropertieswidget.ui b/sources/ui/conductorpropertieswidget.ui
index 48ea44ac8..60e4408bf 100644
--- a/sources/ui/conductorpropertieswidget.ui
+++ b/sources/ui/conductorpropertieswidget.ui
@@ -94,7 +94,7 @@
-
-
+
-
@@ -458,7 +458,7 @@
-
-
+
-
@@ -530,7 +530,7 @@
-
-
+
@@ -576,9 +576,9 @@
- KColorButton
+ ColorButton
QPushButton
-
+
diff --git a/sources/ui/shapegraphicsitempropertieswidget.cpp b/sources/ui/shapegraphicsitempropertieswidget.cpp
index fa2171eac..a91d3e487 100644
--- a/sources/ui/shapegraphicsitempropertieswidget.cpp
+++ b/sources/ui/shapegraphicsitempropertieswidget.cpp
@@ -478,13 +478,13 @@ void ShapeGraphicsItemPropertiesWidget::setUpEditConnection()
m_edit_connection << connect (ui->m_size_dsb, QOverload::of(&QDoubleSpinBox::valueChanged),
this, &ShapeGraphicsItemPropertiesWidget::apply);
- m_edit_connection << connect (ui->m_color_kpb, &KColorButton::changed,
+ m_edit_connection << connect (ui->m_color_kpb, &ColorButton::changed,
this, &ShapeGraphicsItemPropertiesWidget::apply);
m_edit_connection << connect (ui->m_brush_style_cb, QOverload::of(&QComboBox::activated),
this, &ShapeGraphicsItemPropertiesWidget::apply);
- m_edit_connection << connect (ui->m_brush_color_kpb, &KColorButton::changed,
+ m_edit_connection << connect (ui->m_brush_color_kpb, &ColorButton::changed,
this, &ShapeGraphicsItemPropertiesWidget::apply);
m_edit_connection << connect (ui->m_close_polygon, &QCheckBox::clicked,
diff --git a/sources/ui/shapegraphicsitempropertieswidget.ui b/sources/ui/shapegraphicsitempropertieswidget.ui
index 01e9ae4a3..b0d620423 100644
--- a/sources/ui/shapegraphicsitempropertieswidget.ui
+++ b/sources/ui/shapegraphicsitempropertieswidget.ui
@@ -42,7 +42,7 @@
-
-
+
-
@@ -215,7 +215,7 @@
-
-
+
@@ -251,9 +251,9 @@
- KColorButton
+ ColorButton
QPushButton
-
+