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;