diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 41c8e82e5..fa6f73447 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -4086,7 +4086,7 @@ void QETDiagramEditor::setUpLiveIndicator() auto *dock_layout = new QVBoxLayout(content); auto *ask = new QCheckBox(tr("Demander avant d'exécuter un script écrit par l'assistant"), content); ask->setChecked(LiveServer::instance().askFirst()); - ask->setToolTip(tr("Pour cette session seulement : chaque démarrage redemande")); + ask->setToolTip(tr("Retenu après un redémarrage")); auto *log = new QListWidget(content); log->setWordWrap(true); dock_layout->addWidget(ask); diff --git a/sources/scripting/liveserver.cpp b/sources/scripting/liveserver.cpp index 6eb679c18..a892a9f5f 100644 --- a/sources/scripting/liveserver.cpp +++ b/sources/scripting/liveserver.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -73,7 +74,8 @@ LiveServer &LiveServer::instance() return server; } -LiveServer::LiveServer() +LiveServer::LiveServer() : + m_ask_first(QetSettings::liveAskFirst()) { connect(qApp, &QCoreApplication::aboutToQuit, this, &LiveServer::stop); } @@ -104,6 +106,10 @@ void LiveServer::askAndStart(QWidget *parent) return; } m_asked = true; + if (QetSettings::liveSkipStartWarning()) { + start(); + return; + } QMessageBox box(QMessageBox::Warning, tr("Mode direct"), tr("Le mode direct est activé : un assistant IA connecté " @@ -117,11 +123,17 @@ void LiveServer::askAndStart(QWidget *parent) box.addButton(tr("&Pas pour cette session"), QMessageBox::RejectRole); QPushButton *off = box.addButton(tr("&Désactiver"), QMessageBox::DestructiveRole); box.setDefaultButton(go); + auto *remember = new QCheckBox(tr("Ne plus demander au démarrage"), &box); + remember->setToolTip(tr("Le mode direct s'ouvrira à chaque démarrage. Pour être " + "de nouveau averti, désactivez-le puis réactivez-le dans " + "Configurer QElectroTech > Général > Projets.")); + box.setCheckBox(remember); box.exec(); if (box.clickedButton() == off) { QetSettings::setLiveAssistantEnabled(false); } else if (box.clickedButton() == go) { + if (remember->isChecked()) QetSettings::setLiveSkipStartWarning(true); start(); } } @@ -241,7 +253,7 @@ void LiveServer::handle(const QJsonObject &request) const QString name = request.value(QStringLiteral("name")).toString(); const QString source = request.value(QStringLiteral("source")).toString(); //A script the assistant just wrote: the user sees it first, - //unless they said "always" this session. A stored script + //unless they chose "always" (remembered). A stored script //is one the user already has, so it runs as a click would. if (m_ask_first && !confirm(name, source)) answer = failure(QStringLiteral("refused by the user")); @@ -380,6 +392,7 @@ void LiveServer::setAskFirst(bool ask) { if (ask == m_ask_first) return; m_ask_first = ask; + QetSettings::setLiveAskFirst(ask); emit askFirstChanged(ask); } @@ -514,7 +527,7 @@ bool LiveServer::confirm(const QString &name, const QString &source) auto *buttons = new QDialogButtonBox(&dialog); QPushButton *run = buttons->addButton(tr("&Exécuter"), QDialogButtonBox::AcceptRole); buttons->addButton(tr("&Refuser"), QDialogButtonBox::RejectRole); - QPushButton *always = buttons->addButton(tr("&Toujours pour cette session"), + QPushButton *always = buttons->addButton(tr("&Toujours"), QDialogButtonBox::AcceptRole); layout->addWidget(buttons); QPushButton *clicked = nullptr; diff --git a/sources/scripting/liveserver.h b/sources/scripting/liveserver.h index 2a8726a88..6cb06cd9a 100644 --- a/sources/scripting/liveserver.h +++ b/sources/scripting/liveserver.h @@ -34,7 +34,8 @@ class QWidget; Three things must all be true before anything can connect: scripting is allowed, the "mode direct" setting is on (off by default), and the user - accepted the warning shown at this start. With the setting off this + accepted the warning shown at this start (or once ticked "don't ask + again", which lasts until the setting is switched off). With the setting off this class opens nothing and QElectroTech behaves as if it did not exist. The channel is a QLocalServer only the user's own account can open, @@ -96,7 +97,7 @@ class LiveServer : public QObject State m_state = Off; bool m_asked = false; bool m_busy = false; - bool m_ask_first = true; ///< per session, never saved: every start asks again + bool m_ask_first = true; ///< saved: QetSettings::liveAskFirst() }; #endif // LIVESERVER_H diff --git a/sources/utils/qetsettings.cpp b/sources/utils/qetsettings.cpp index 43adb2ce4..507ba928b 100644 --- a/sources/utils/qetsettings.cpp +++ b/sources/utils/qetsettings.cpp @@ -171,6 +171,44 @@ namespace QetSettings { QSettings settings; settings.setValue("scripting/live_assistant", enabled); + //Turned off and on again: the start warning comes back, so + //"don't ask again" never outlives the choice it was made for + if (!enabled) settings.remove("scripting/live_skip_warning"); + } + + /** + * @brief liveSkipStartWarning + * @return true when the user ticked "don't ask again" in live mode's + * start warning: live mode then opens at every start without asking, + * until it is switched off in the settings. False unless they did. + */ + bool liveSkipStartWarning() + { + QSettings settings; + return settings.value("scripting/live_skip_warning", false).toBool(); + } + + void setLiveSkipStartWarning(bool skip) + { + QSettings settings; + settings.setValue("scripting/live_skip_warning", skip); + } + + /** + * @brief liveAskFirst + * @return whether live mode shows each script the assistant wrote and + * asks before running it. On unless the user chose "always". + */ + bool liveAskFirst() + { + QSettings settings; + return settings.value("scripting/live_ask_first", true).toBool(); + } + + void setLiveAskFirst(bool ask) + { + QSettings settings; + settings.setValue("scripting/live_ask_first", ask); } /** diff --git a/sources/utils/qetsettings.h b/sources/utils/qetsettings.h index 64bf4b615..1aad738e8 100644 --- a/sources/utils/qetsettings.h +++ b/sources/utils/qetsettings.h @@ -40,6 +40,10 @@ namespace QetSettings bool scriptingForcedByEnvironment(); bool liveAssistantEnabled(); void setLiveAssistantEnabled(bool enabled); + bool liveSkipStartWarning(); + void setLiveSkipStartWarning(bool skip); + bool liveAskFirst(); + void setLiveAskFirst(bool ask); /** @brief The sheet (folio) background the diagram editors draw.