diff --git a/sources/ui/configpage/generalconfigurationpage.cpp b/sources/ui/configpage/generalconfigurationpage.cpp
index 7d66a34b7..826679667 100644
--- a/sources/ui/configpage/generalconfigurationpage.cpp
+++ b/sources/ui/configpage/generalconfigurationpage.cpp
@@ -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());
diff --git a/sources/ui/configpage/generalconfigurationpage.ui b/sources/ui/configpage/generalconfigurationpage.ui
index 6c91701b4..427c9fc7b 100644
--- a/sources/ui/configpage/generalconfigurationpage.ui
+++ b/sources/ui/configpage/generalconfigurationpage.ui
@@ -83,13 +83,6 @@
- -
-
-
- 20
-
-
-
-
diff --git a/sources/ui/configpage/projectconfigpages.cpp b/sources/ui/configpage/projectconfigpages.cpp
index 43fd863b8..fdb9444fb 100644
--- a/sources/ui/configpage/projectconfigpages.cpp
+++ b/sources/ui/configpage/projectconfigpages.cpp
@@ -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_);
diff --git a/sources/ui/wiringruleswarning.cpp b/sources/ui/wiringruleswarning.cpp
index 2024ad633..2bd975e6f 100644
--- a/sources/ui/wiringruleswarning.cpp
+++ b/sources/ui/wiringruleswarning.cpp
@@ -19,41 +19,29 @@
#include "wiringruleswarning.h"
#include
-#include
-#include
-#include
-#include
+#include
/**
- @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;
+ "Les règles de conducteurs par borne sont une fonction expérimentale."
+ "
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."
+ "
Toutes ces règles peuvent être désactivées dans Configurer "
+ "QElectroTech > Général."));
}
diff --git a/sources/ui/wiringruleswarning.h b/sources/ui/wiringruleswarning.h
index 4d7d690a1..033a2d6f6 100644
--- a/sources/ui/wiringruleswarning.h
+++ b/sources/ui/wiringruleswarning.h
@@ -23,7 +23,7 @@ class QWidget;
namespace WiringRulesWarning
{
- QWidget *create(QWidget *parent = nullptr);
+ void show(QWidget *parent);
}
#endif // WIRINGRULESWARNING_H
diff --git a/sources/wiringrules.cpp b/sources/wiringrules.cpp
index d0d4e5fc8..19d7380e4 100644
--- a/sources/wiringrules.cpp
+++ b/sources/wiringrules.cpp
@@ -173,3 +173,15 @@ bool WiringRules::hasRoom(int limit, int wires)
{
return limit <= 0 || wires < limit;
}
+
+/**
+ @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);
+}
diff --git a/sources/wiringrules.h b/sources/wiringrules.h
index af6311886..c4eef1db8 100644
--- a/sources/wiringrules.h
+++ b/sources/wiringrules.h
@@ -72,6 +72,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);
diff --git a/tests/qttest/tst_wiringrules.cpp b/tests/qttest/tst_wiringrules.cpp
index f7f258d68..be4d283e2 100644
--- a/tests/qttest/tst_wiringrules.cpp
+++ b/tests/qttest/tst_wiringrules.cpp
@@ -195,6 +195,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;