Merge branch 'feature/wires-per-terminal' into feature/wires-per-terminal-chains

# Conflicts:
#	sources/wiringrules.cpp
This commit is contained in:
ispyisail
2026-10-04 01:43:37 +13:00
8 changed files with 60 additions and 42 deletions
@@ -118,7 +118,6 @@ GeneralConfigurationPage::GeneralConfigurationPage(QWidget *parent) :
ui->m_wiring_rules_cb->setChecked(WiringRules::masterEnabled());
{
//The rules every project follows unless it sets its own (#1158)
ui->m_wiring_rules_warning_layout->addWidget(WiringRulesWarning::create(this));
const WiringRules::Settings rules = WiringRules::applicationSettings();
ui->m_wiring_max_wires_sb->setValue(rules.max_wires);
ui->m_wiring_one_wire_per_report_cb->setChecked(rules.one_wire_per_report);
@@ -353,10 +352,14 @@ void GeneralConfigurationPage::applyConf()
settings.setValue("diagrameditor/conductor_properties_panel", ui->m_conductor_properties_panel->isChecked());
WiringRules::setMasterEnabled(ui->m_wiring_rules_cb->isChecked());
{
WiringRules::Settings rules = WiringRules::applicationSettings();
const WiringRules::Settings before = WiringRules::applicationSettings();
WiringRules::Settings rules = before;
rules.max_wires = ui->m_wiring_max_wires_sb->value();
rules.one_wire_per_report = ui->m_wiring_one_wire_per_report_cb->isChecked();
WiringRules::setApplicationSettings(rules);
if (WiringRules::masterEnabled() && WiringRules::turnsRuleOn(before, rules)) {
WiringRulesWarning::show(this);
}
}
settings.setValue("diagrameditor/autosave-interval", ui->m_autosave_sb->value());
@@ -83,13 +83,6 @@
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="m_wiring_rules_warning_layout">
<property name="leftMargin">
<number>20</number>
</property>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="m_wiring_max_wires_layout">
<property name="leftMargin">
+5 -1
View File
@@ -186,8 +186,13 @@ void ProjectMainConfigPage::applyProjectConf()
wiring_rules.one_wire_per_report = one_wire_per_report_cb_ -> isChecked();
}
if (m_project -> projectWiringRules() != wiring_rules) {
const WiringRules::Settings before = m_project -> wiringRules();
m_project -> setWiringRules(wiring_rules);
modified_project = true;
if (WiringRules::masterEnabled()
&& WiringRules::turnsRuleOn(before, m_project -> wiringRules())) {
WiringRulesWarning::show(this);
}
}
if (modified_project) {
@@ -307,7 +312,6 @@ void ProjectMainConfigPage::initLayout()
main_layout0 -> addSpacing(10);
QVBoxLayout *wiring_rules_layout = new QVBoxLayout(wiring_rules_gb_);
wiring_rules_layout -> addWidget(WiringRulesWarning::create(wiring_rules_gb_));
wiring_rules_layout -> addWidget(use_application_rules_cb_);
QHBoxLayout *max_wires_layout = new QHBoxLayout();
max_wires_layout -> addWidget(max_wires_label_);
+19 -31
View File
@@ -19,41 +19,29 @@
#include "wiringruleswarning.h"
#include <QApplication>
#include <QFrame>
#include <QHBoxLayout>
#include <QLabel>
#include <QStyle>
#include <QMessageBox>
/**
@brief WiringRulesWarning::create
A warning box shown wherever the wires-per-terminal rules are set
(discussion #1158, review of #1272): the rules count wires on a terminal
as QElectroTech models them today, and would have to be redesigned if
wires and conductors become separate objects, so they are experimental.
@brief WiringRulesWarning::show
Warn, when a wires-per-terminal rule is turned on (discussion #1158,
review of #1272), that the rules are experimental: they count wires on
a terminal as QElectroTech models them today, and would have to be
redesigned if wires and conductors become separate objects. A plain
warning, as the element editor gives for unnamed terminals: OK goes on.
@param parent
@return the box, a framed icon and text
*/
QWidget *WiringRulesWarning::create(QWidget *parent)
void WiringRulesWarning::show(QWidget *parent)
{
auto frame = new QFrame(parent);
frame->setFrameShape(QFrame::StyledPanel);
auto icon = new QLabel(frame);
const int size = frame->style()->pixelMetric(QStyle::PM_SmallIconSize);
icon->setPixmap(frame->style()->standardIcon(QStyle::SP_MessageBoxWarning).pixmap(size, size));
icon->setAlignment(Qt::AlignTop);
auto text = new QLabel(QApplication::translate(
QMessageBox::warning(
parent,
QApplication::translate("WiringRulesWarning", "Avertissement"),
QApplication::translate(
"WiringRulesWarning",
"Fonction expérimentale. Ces règles comptent les conducteurs tels "
"que QElectroTech les représente aujourd'hui ; elles pourraient "
"changer, et vos réglages devoir être refaits, si les fils et les "
"conducteurs deviennent des objets distincts dans une version future."),
frame);
text->setWordWrap(true);
auto layout = new QHBoxLayout(frame);
layout->addWidget(icon);
layout->addWidget(text, 1);
return frame;
"<b>Les règles de conducteurs par borne sont une fonction expérimentale.</b>"
"<br><br>Elles comptent les conducteurs tels que QElectroTech les représente "
"aujourd'hui. Elles pourraient changer, et vos réglages devoir être refaits, "
"si les fils et les conducteurs deviennent des objets distincts dans une "
"version future."
"<br><br>Toutes ces règles peuvent être désactivées dans Configurer "
"QElectroTech > Général."));
}
+1 -1
View File
@@ -23,7 +23,7 @@ class QWidget;
namespace WiringRulesWarning
{
QWidget *create(QWidget *parent = nullptr);
void show(QWidget *parent);
}
#endif // WIRINGRULESWARNING_H
+12
View File
@@ -235,3 +235,15 @@ QList<int> WiringRules::chainOrder(const QList<QPointF> &points)
}
return order;
}
/**
@brief WiringRules::turnsRuleOn
@param before, after : the rules in force before and after a change
@return true if the change turns on a rule that was off: QElectroTech
then warns that the rules are experimental (review of #1272).
*/
bool WiringRules::turnsRuleOn(const Settings &before, const Settings &after)
{
return (after.max_wires > 0 && before.max_wires <= 0)
|| (after.one_wire_per_report && !before.one_wire_per_report);
}
+1
View File
@@ -75,6 +75,7 @@ namespace WiringRules
Settings applicationSettings();
void setApplicationSettings(const Settings &settings);
Settings effective(const Settings &project, const Settings &application);
bool turnsRuleOn(const Settings &before, const Settings &after);
Settings fromXml(const QDomElement &project_root);
void toXml(const Settings &settings, QDomElement &project_root);
+17
View File
@@ -271,6 +271,23 @@ private slots:
QCOMPARE(WiringRules::effective(own, application).max_wires, 6);
}
void warnsWhenARuleIsTurnedOn()
{
WiringRules::Settings off;
WiringRules::Settings limit;
limit.max_wires = 4;
WiringRules::Settings report;
report.one_wire_per_report = true;
QVERIFY(WiringRules::turnsRuleOn(off, limit));
QVERIFY(WiringRules::turnsRuleOn(off, report));
QVERIFY(WiringRules::turnsRuleOn(limit, [&]{ auto s = limit; s.one_wire_per_report = true; return s; }()));
// Changing a limit that was already on, or turning rules off: no warning
QVERIFY(!WiringRules::turnsRuleOn(limit, [&]{ auto s = limit; s.max_wires = 2; return s; }()));
QVERIFY(!WiringRules::turnsRuleOn(limit, off));
QVERIFY(!WiringRules::turnsRuleOn(off, off));
}
void xmlRoundTrip()
{
QDomDocument doc;