From 709fb25ff6d4148e0457dfd8308c4c6e7bae42e0 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 9 Apr 2023 23:49:08 +0200 Subject: [PATCH] Fix the script editor breaking when trying to add a new script with errors Fixes #1006 --- libnymea-app/scripting/codecompletion.cpp | 5 ++ libnymea-app/scripting/codecompletion.h | 1 + libnymea-app/scriptmanager.cpp | 22 ++++++-- libnymea-app/scriptmanager.h | 18 +++++-- nymea-app/ui/magic/ScriptEditor.qml | 63 ++++++++++++++++++++--- 5 files changed, 92 insertions(+), 17 deletions(-) diff --git a/libnymea-app/scripting/codecompletion.cpp b/libnymea-app/scripting/codecompletion.cpp index 29cd9e42..953dd8eb 100644 --- a/libnymea-app/scripting/codecompletion.cpp +++ b/libnymea-app/scripting/codecompletion.cpp @@ -961,6 +961,11 @@ void CodeCompletion::moveCursor(CodeCompletion::MoveOperation moveOperation, int emit cursorPositionChanged(); return; } + case MoveOperationAbsoluteLine: + m_cursor.movePosition(QTextCursor::Start); + m_cursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor, count - 1); + emit cursorPositionChanged(); + break; } } diff --git a/libnymea-app/scripting/codecompletion.h b/libnymea-app/scripting/codecompletion.h index 375014d8..f2262890 100644 --- a/libnymea-app/scripting/codecompletion.h +++ b/libnymea-app/scripting/codecompletion.h @@ -55,6 +55,7 @@ public: MoveOperationNextLine, MoveOperationPreviousWord, MoveOperationNextWord, + MoveOperationAbsoluteLine, }; Q_ENUM(MoveOperation) diff --git a/libnymea-app/scriptmanager.cpp b/libnymea-app/scriptmanager.cpp index 41426fd6..9d0e3db8 100644 --- a/libnymea-app/scriptmanager.cpp +++ b/libnymea-app/scriptmanager.cpp @@ -36,6 +36,8 @@ #include "logging.h" NYMEA_LOGGING_CATEGORY(dcScriptManager, "Scripts") +#include + ScriptManager::ScriptManager(JsonRpcClient *jsonClient, QObject *parent): QObject(parent), m_client(jsonClient) @@ -116,15 +118,19 @@ void ScriptManager::onScriptsFetched(int /*commandId*/, const QVariantMap ¶m void ScriptManager::onScriptFetched(int commandId, const QVariantMap ¶ms) { + QMetaEnum metaEnum = QMetaEnum::fromType(); + ScriptError status = static_cast(metaEnum.keyToValue(params.value("scriptError").toByteArray())); emit fetchScriptReply(commandId, - params.value("scriptError").toString(), + status, params.value("content").toString()); } void ScriptManager::onScriptAdded(int commandId, const QVariantMap ¶ms) { + QMetaEnum metaEnum = QMetaEnum::fromType(); + ScriptError status = static_cast(metaEnum.keyToValue(params.value("scriptError").toByteArray())); emit addScriptReply(commandId, - params.value("scriptError").toString(), + status, params.value("script").toMap().value("id").toUuid(), params.value("errors").toStringList()); @@ -132,20 +138,26 @@ void ScriptManager::onScriptAdded(int commandId, const QVariantMap ¶ms) void ScriptManager::onScriptEdited(int commandId, const QVariantMap ¶ms) { + QMetaEnum metaEnum = QMetaEnum::fromType(); + ScriptError status = static_cast(metaEnum.keyToValue(params.value("scriptError").toByteArray())); emit editScriptReply(commandId, - params.value("scriptError").toString(), + status, params.value("errors").toStringList()); } void ScriptManager::onScriptRenamed(int commandId, const QVariantMap ¶ms) { - emit renameScriptReply(commandId, params.value("scriptError").toString()); + QMetaEnum metaEnum = QMetaEnum::fromType(); + ScriptError status = static_cast(metaEnum.keyToValue(params.value("scriptError").toByteArray())); + emit renameScriptReply(commandId, status); } void ScriptManager::onScriptRemoved(int commandId, const QVariantMap ¶ms) { - emit removeScriptReply(commandId, params.value("scriptError").toString()); + QMetaEnum metaEnum = QMetaEnum::fromType(); + ScriptError status = static_cast(metaEnum.keyToValue(params.value("scriptError").toByteArray())); + emit removeScriptReply(commandId, status); } void ScriptManager::onNotificationReceived(const QVariantMap ¶ms) diff --git a/libnymea-app/scriptmanager.h b/libnymea-app/scriptmanager.h index dc31249d..784a065a 100644 --- a/libnymea-app/scriptmanager.h +++ b/libnymea-app/scriptmanager.h @@ -44,6 +44,14 @@ class ScriptManager : public QObject Q_PROPERTY(bool fetchingData READ fetchingData NOTIFY fetchingDataChanged) public: + enum ScriptError { + ScriptErrorNoError, + ScriptErrorScriptNotFound, + ScriptErrorInvalidScript, + ScriptErrorHardwareFailure + }; + Q_ENUM(ScriptError) + explicit ScriptManager(JsonRpcClient* jsonClient, QObject *parent = nullptr); void init(); @@ -59,11 +67,11 @@ public slots: int fetchScript(const QUuid &id); signals: - void addScriptReply(int id, const QString &scriptError, const QUuid &scriptId, const QStringList &errors); - void editScriptReply(int id, const QString &scriptError, const QStringList &errors); - void renameScriptReply(int id, const QString &scriptError); - void removeScriptReply(int id, const QString &scriptError); - void fetchScriptReply(int id, const QString &scriptError, const QString &content); + void addScriptReply(int id, ScriptError status, const QUuid &scriptId, const QStringList &errors); + void editScriptReply(int id, ScriptError status, const QStringList &errors); + void renameScriptReply(int id, ScriptError status); + void removeScriptReply(int id, ScriptError status); + void fetchScriptReply(int id, ScriptError status, const QString &content); void scriptMessage(const QUuid &scriptId, const QString &type, const QString &message); void fetchingDataChanged(); diff --git a/nymea-app/ui/magic/ScriptEditor.qml b/nymea-app/ui/magic/ScriptEditor.qml index 8d15e691..f301db41 100644 --- a/nymea-app/ui/magic/ScriptEditor.qml +++ b/nymea-app/ui/magic/ScriptEditor.qml @@ -149,18 +149,24 @@ Page { Connections { target: engine.scriptManager onAddScriptReply: { - deployReply(id, scriptError, errors) - d.scriptId = scriptId; + print("Add reply", status) + deployReply(id, status, errors) + if (status == ScriptManager.ScriptErrorNoError) { + d.scriptId = scriptId; + } } - onEditScriptReply: deployReply(id, scriptError, errors) - function deployReply(id, scriptError, errors) { + onEditScriptReply: { + print("Edit reply", status) + deployReply(id, status, errors) + } + function deployReply(id, status, errors) { if (id === d.callId) { d.callId = -1; - if (scriptError === "ScriptErrorNoError") { + if (status === ScriptManager.ScriptErrorNoError) { d.oldContent = scriptEdit.text; infoPane.hide(); errorPane.hide(); - } else if (scriptError === "ScriptErrorInvalidScript") { + } else if (status === ScriptManager.ScriptErrorInvalidScript) { errorPane.show(); } errorModel.update(errors) @@ -168,7 +174,7 @@ Page { } onFetchScriptReply: { - if (id == d.callId && scriptError == "ScriptErrorNoError") { + if (id == d.callId && status == ScriptManager.ScriptErrorNoError) { d.callId = -1; d.oldContent = content; @@ -433,9 +439,35 @@ Page { } delegate: Label { + id: errorDelegate width: parent.width text: model.line + ":" + model.column + ": " + model.message font: scriptEdit.font + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton + onClicked: { + if (mouse.button == Qt.LeftButton) { + scriptEdit.forceActiveFocus() + completion.moveCursor(CodeCompletion.MoveOperationAbsoluteLine, model.line) + } else { + print("rmb") + var popup = rmbMenuComponent.createObject(errorDelegate, {x: mouseX}) + popup.copy.connect(function() { + PlatformHelper.toClipBoard(errorDelegate.text) + }) + popup.copyAll.connect(function() { + var text = []; + for (var i = 0; i < errorModel.count; i++) { + var line = errorModel.get(i) + text.push(line.line + ":" + line.column + ": " + line.message) + } + PlatformHelper.toClipBoard(text.join("\n")) + }) + popup.open() + } + } + } } } } @@ -506,4 +538,21 @@ Page { BusyOverlay { shown: d.callId != -1 } + + Component { + id: rmbMenuComponent + Menu { + signal copy() + signal copyAll() + + MenuItem { + text: qsTr("Copy") + onClicked: copy() + } + MenuItem { + text: qsTr("Copy all") + onClicked: copyAll() + } + } + } }