diff --git a/lang/qet_en.ts b/lang/qet_en.ts
index bb95c6732..15f7578a4 100644
--- a/lang/qet_en.ts
+++ b/lang/qet_en.ts
@@ -7217,6 +7217,16 @@ This setting is in Configure QElectroTech > General > Projects.&Désactiver
&Turn off
+
+
+ Ne plus demander au démarrage
+ Don't ask again at start
+
+
+
+ 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.
+ Live mode will open at every start. To be warned again, turn it off and back on in Configure QElectroTech > General > Projects.
+
@@ -7273,9 +7283,13 @@ This setting is in Configure QElectroTech > General > Projects.&Decline
-
+
+ &Toujours
+ &Always
+
+ &Toujours pour cette session
- &Always this session
+ &Always this session
@@ -11320,6 +11334,11 @@ A script runs with your permissions: it can read and modify the open project and
Enable scripts? This setting can be changed in Configure QElectroTech > General > Projects.
+
+
+ Retenu après un redémarrage
+ Remembered after a restart
+ Scripts JavaScript (*.js);;Tous les fichiers (*)
@@ -11412,7 +11431,7 @@ To make a script of it, ask your AI assistant: the button below copies the reque
Pour cette session seulement : chaque démarrage redemande
- For this session only: every start asks again
+ For this session only: every start asks again
diff --git a/misc/qet-mcp/README.md b/misc/qet-mcp/README.md
index f71f2befc..cfff5419a 100644
--- a/misc/qet-mcp/README.md
+++ b/misc/qet-mcp/README.md
@@ -369,7 +369,8 @@ between pages need no tool of their own: in `qet_live_run_script`,
contacts, across folios.
A script the assistant writes on the spot is shown to you first, with
-*Run*, *Decline* or *Always this session*; the Assistant
+*Run*, *Decline* or *Always* (remembered after a restart; untick "Ask
+before running" in the Assistant panel to be asked again); the Assistant
panel lists everything it did.
QElectroTech only listens when three things are true:
@@ -380,7 +381,8 @@ QElectroTech only listens when three things are true:
mode)" is ticked (off by default; in French, Configurer QElectroTech >
Général > Projets);
3. at this start, you answered *Continue* to the warning QElectroTech shows
- every time it starts with that setting on.
+ when it starts with that setting on -- or, once, ticked "Don't ask again
+ at start" in it, which lasts until the setting is switched off.
While it listens, the status bar says so and shows the assistant's last
action, with a *Stop* button that closes the channel for the rest of
diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp
index 5c51490f2..c7faddfa6 100644
--- a/sources/qetdiagrameditor.cpp
+++ b/sources/qetdiagrameditor.cpp
@@ -4088,7 +4088,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 1fbbba119..5327c0d95 100644
--- a/sources/scripting/liveserver.cpp
+++ b/sources/scripting/liveserver.cpp
@@ -48,6 +48,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -81,7 +82,8 @@ LiveServer &LiveServer::instance()
return server;
}
-LiveServer::LiveServer()
+LiveServer::LiveServer() :
+ m_ask_first(QetSettings::liveAskFirst())
{
connect(qApp, &QCoreApplication::aboutToQuit, this, &LiveServer::stop);
}
@@ -112,6 +114,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é "
@@ -125,11 +131,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();
}
}
@@ -249,7 +261,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"));
@@ -405,6 +417,7 @@ void LiveServer::setAskFirst(bool ask)
{
if (ask == m_ask_first) return;
m_ask_first = ask;
+ QetSettings::setLiveAskFirst(ask);
emit askFirstChanged(ask);
}
@@ -909,7 +922,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 882d86bbc..5a1211feb 100644
--- a/sources/scripting/liveserver.h
+++ b/sources/scripting/liveserver.h
@@ -35,7 +35,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,
@@ -106,7 +107,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 de5f6e6b4..632d30b52 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 abea8d460..f291caf93 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 Free-text drawing conventions for this installation (grid,