History

Check script file for external changes when editor regains focus

Prompt user whether to reload.

David Rowe committed 12 years ago

Commit c454c791 parent 3df43dc4 files · +56 −4Browse files

Showing the changes to interface/src/ui/ScriptEditorWidget.cpp (1 of 4 files). Show all

Unified · Split

interface/src/ui/ScriptEditorWidget.cpp+35−4
@@ -29,8 +29,11 @@ · 28 unmodified lines
29ScriptEditorWidget::ScriptEditorWidget() :29ScriptEditorWidget::ScriptEditorWidget() :
30 _scriptEditorWidgetUI(new Ui::ScriptEditorWidget),30 _scriptEditorWidgetUI(new Ui::ScriptEditorWidget),
31 _scriptEngine(NULL),31 _scriptEngine(NULL),
32 _isRestarting(false)32 _isRestarting(false),
33 _isReloading(false)
33{34{
35 setAttribute(Qt::WA_DeleteOnClose);
36
34 _scriptEditorWidgetUI->setupUi(this);37 _scriptEditorWidgetUI->setupUi(this);
35 38
36 connect(_scriptEditorWidgetUI->scriptEdit->document(), &QTextDocument::modificationChanged, this,39 connect(_scriptEditorWidgetUI->scriptEdit->document(), &QTextDocument::modificationChanged, this,
@@ -52,7 +55,7 @@ ScriptEditorWidget::~ScriptEditorWidget() { · 15 unmodified lines
52}55}
53 56
54void ScriptEditorWidget::onScriptModified() {57void ScriptEditorWidget::onScriptModified() {
55 if(_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isModified() && isRunning()) {58 if(_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isModified() && isRunning() && !_isReloading) {
56 _isRestarting = true;59 _isRestarting = true;
57 setRunning(false);60 setRunning(false);
58 // Script is restarted once current script instance finishes.61 // Script is restarted once current script instance finishes.
@@ -76,7 +79,7 @@ bool ScriptEditorWidget::isRunning() { · 17 unmodified lines
76}79}
77 80
78bool ScriptEditorWidget::setRunning(bool run) {81bool ScriptEditorWidget::setRunning(bool run) {
79 if (run && !save()) {82 if (run && isModified() && !save()) {
80 return false;83 return false;
81 }84 }
82 85
@@ -114,13 +117,14 @@ bool ScriptEditorWidget::saveFile(const QString &scriptPath) { · 31 unmodified lines
114 117
115 QTextStream out(&file);118 QTextStream out(&file);
116 out << _scriptEditorWidgetUI->scriptEdit->toPlainText();119 out << _scriptEditorWidgetUI->scriptEdit->toPlainText();
120 file.close();
117 121
118 setScriptFile(scriptPath);122 setScriptFile(scriptPath);
119 return true;123 return true;
120}124}
121 125
122void ScriptEditorWidget::loadFile(const QString& scriptPath) {126void ScriptEditorWidget::loadFile(const QString& scriptPath) {
123 QUrl url(scriptPath);127 QUrl url(scriptPath);
124 128
125 // if the scheme length is one or lower, maybe they typed in a file, let's try129 // if the scheme length is one or lower, maybe they typed in a file, let's try
126 const int WINDOWS_DRIVE_LETTER_SIZE = 1;130 const int WINDOWS_DRIVE_LETTER_SIZE = 1;
@@ -133,6 +137,7 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { · 6 unmodified lines
133 }137 }
134 QTextStream in(&file);138 QTextStream in(&file);
135 _scriptEditorWidgetUI->scriptEdit->setPlainText(in.readAll());139 _scriptEditorWidgetUI->scriptEdit->setPlainText(in.readAll());
140 file.close();
136 setScriptFile(scriptPath);141 setScriptFile(scriptPath);
137 142
138 if (_scriptEngine != NULL) {143 if (_scriptEngine != NULL) {
@@ -184,6 +189,7 @@ bool ScriptEditorWidget::saveAs() { · 45 unmodified lines
184 189
185void ScriptEditorWidget::setScriptFile(const QString& scriptPath) {190void ScriptEditorWidget::setScriptFile(const QString& scriptPath) {
186 _currentScript = scriptPath;191 _currentScript = scriptPath;
192 _currentScriptModified = QFileInfo(_currentScript).lastModified();
187 _scriptEditorWidgetUI->scriptEdit->document()->setModified(false);193 _scriptEditorWidgetUI->scriptEdit->document()->setModified(false);
188 setWindowModified(false);194 setWindowModified(false);
189 195
@@ -207,3 +213,28 @@ void ScriptEditorWidget::onScriptError(const QString& message) { · 17 unmodified lines
207void ScriptEditorWidget::onScriptPrint(const QString& message) {213void ScriptEditorWidget::onScriptPrint(const QString& message) {
208 _scriptEditorWidgetUI->debugText->appendPlainText("> " + message);214 _scriptEditorWidgetUI->debugText->appendPlainText("> " + message);
209}215}
216
217void ScriptEditorWidget::onWindowActivated() {
218 if (!_isReloading) {
219 _isReloading = true;
220
221 if (QFileInfo(_currentScript).lastModified() > _currentScriptModified) {
222 if (QMessageBox::warning(this, _currentScript,
223 tr("This file has been modified outside of the Interface editor.") + "\n\n"
224 +(isModified()
225 ? tr("Do you want to reload it and lose the changes you've made in the Interface editor?")
226 : tr("Do you want to reload it?")),
227 QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
228 loadFile(_currentScript);
229 if (_scriptEditorWidgetUI->onTheFlyCheckBox->isChecked() && isRunning()) {
230 _isRestarting = true;
231 setRunning(false);
232 // Script is restarted once current script instance finishes.
233 }
234
235 }
236 }
237
238 _isReloading = false;
239 }
240}