Browse Source

HackStudio: Fix editor not marking file with unsaved changes as dirty

The editor's on_change callback was being overwritten in
HackStudioWidget.cpp in order to call update_gml_preview on every
change. This stopped the original callback from being called and marking
files as dirty when changed.

Now we call update_gml_preview in a new callback within the editor
wrapper, which is then called within the original on_change callback
in the editor.
Lennon Donaghy 3 years ago
parent
commit
82b88c6e16

+ 2 - 0
Userland/DevTools/HackStudio/EditorWrapper.cpp

@@ -43,6 +43,8 @@ EditorWrapper::EditorWrapper()
     };
     };
 
 
     m_editor->on_change = [this] {
     m_editor->on_change = [this] {
+        if (this->on_change)
+            this->on_change();
         bool was_dirty = m_document_dirty;
         bool was_dirty = m_document_dirty;
         m_document_dirty = true;
         m_document_dirty = true;
         if (!was_dirty)
         if (!was_dirty)

+ 2 - 0
Userland/DevTools/HackStudio/EditorWrapper.h

@@ -52,6 +52,8 @@ public:
     void update_diff();
     void update_diff();
     Vector<Diff::Hunk> const& hunks() const { return m_hunks; }
     Vector<Diff::Hunk> const& hunks() const { return m_hunks; }
 
 
+    Function<void()> on_change;
+
 private:
 private:
     EditorWrapper();
     EditorWrapper();
 
 

+ 2 - 2
Userland/DevTools/HackStudio/HackStudioWidget.cpp

@@ -295,7 +295,7 @@ bool HackStudioWidget::open_file(const String& full_filename)
     current_editor().set_focus(true);
     current_editor().set_focus(true);
 
 
     current_editor().on_cursor_change = [this] { update_statusbar(); };
     current_editor().on_cursor_change = [this] { update_statusbar(); };
-    current_editor().on_change = [this] { update_gml_preview(); };
+    current_editor_wrapper().on_change = [this] { update_gml_preview(); };
     update_gml_preview();
     update_gml_preview();
 
 
     return true;
     return true;
@@ -541,7 +541,7 @@ void HackStudioWidget::add_new_editor(GUI::Widget& parent)
     wrapper->editor().set_focus(true);
     wrapper->editor().set_focus(true);
     wrapper->set_project_root(LexicalPath(m_project->root_path()));
     wrapper->set_project_root(LexicalPath(m_project->root_path()));
     wrapper->editor().on_cursor_change = [this] { update_statusbar(); };
     wrapper->editor().on_cursor_change = [this] { update_statusbar(); };
-    wrapper->editor().on_change = [this] { update_gml_preview(); };
+    wrapper->on_change = [this] { update_gml_preview(); };
     set_edit_mode(EditMode::Text);
     set_edit_mode(EditMode::Text);
 }
 }