diff --git a/src/plugins/score-lib-process/Process/Script/ScriptEditor.cpp b/src/plugins/score-lib-process/Process/Script/ScriptEditor.cpp index c05a75f091..3671586b11 100644 --- a/src/plugins/score-lib-process/Process/Script/ScriptEditor.cpp +++ b/src/plugins/score-lib-process/Process/Script/ScriptEditor.cpp @@ -2,8 +2,10 @@ #include "MultiScriptEditor.hpp" #include "ScriptWidget.hpp" +#include "score/tools/FileWatch.hpp" #include +#include #include #include #include @@ -176,16 +178,8 @@ void ScriptDialog::openInExternalEditor() return; } - if(!QFile::exists(editorPath)) - { - QMessageBox::warning( - this, tr("Error"), tr("the configured external editor does not exist.")); - return; - } - - QString tempDir = QStandardPaths::writableLocation(QStandardPaths::TempLocation); - QString tempFile = tempDir + "/ossia_script_temp.js"; - + QString tempFile = QStandardPaths::writableLocation(QStandardPaths::TempLocation) + + "/ossia_script_temp.js"; QFile file(tempFile); if(!file.open(QIODevice::WriteOnly)) { @@ -196,12 +190,40 @@ void ScriptDialog::openInExternalEditor() file.write(this->text().toUtf8()); file.close(); + auto& w = score::FileWatch::instance(); + m_fileHandle = std::make_shared>([this, tempFile]() { + QFile file(tempFile); + if(file.open(QIODevice::ReadOnly)) + { + QString updatedContent = QString::fromUtf8(file.readAll()); + file.close(); + + QMetaObject::invokeMethod(m_textedit, [this, updatedContent]() { + if(m_textedit) + { + m_textedit->setPlainText(updatedContent); + } + }); + } + }); + w.add(tempFile, m_fileHandle); + if(!QProcess::startDetached(editorPath, QStringList() << tempFile)) { - QMessageBox::warning(this, tr("Error"), tr("Failed to launch external editor")); + QMessageBox::warning(this, tr("Error"), tr("failed to launch external editor")); } } +void ScriptDialog::stopWatchingFile(const QString& tempFile) +{ + if(tempFile.isEmpty()) + { + return; + } + + auto& w = score::FileWatch::instance(); + w.remove(tempFile, m_fileHandle); +} void MultiScriptDialog::openInExternalEditor() { QString editorPath = QSettings{}.value("Skin/DefaultEditor").toString(); diff --git a/src/plugins/score-lib-process/Process/Script/ScriptEditor.hpp b/src/plugins/score-lib-process/Process/Script/ScriptEditor.hpp index 4496dc9937..493cfb5220 100644 --- a/src/plugins/score-lib-process/Process/Script/ScriptEditor.hpp +++ b/src/plugins/score-lib-process/Process/Script/ScriptEditor.hpp @@ -29,6 +29,7 @@ class SCORE_LIB_PROCESS_EXPORT ScriptDialog : public QDialog void setText(const QString& str); void setError(int line, const QString& str); void openInExternalEditor(); + void stopWatchingFile(const QString& tempFile); protected: virtual void on_accepted() = 0; @@ -36,6 +37,9 @@ class SCORE_LIB_PROCESS_EXPORT ScriptDialog : public QDialog const score::DocumentContext& m_context; QTextEdit* m_textedit{}; QPlainTextEdit* m_error{}; + +private: + std::shared_ptr> m_fileHandle; }; template