Browse Source

HackStudio: Support opening the same file in both editors

Hey, it actually works! You can now edit the same file in both editors
and even the C++ highlighting updates correctly in both of them. :^)
Andreas Kling 5 năm trước cách đây
mục cha
commit
e2d7f585da

+ 9 - 0
DevTools/HackStudio/Project.cpp

@@ -79,3 +79,12 @@ bool Project::add_file(const String& filename)
     m_model->update();
     return true;
 }
+
+TextDocument* Project::get_file(const String& filename)
+{
+    for (auto& file : m_files) {
+        if (file.name() == filename)
+            return &file;
+    }
+    return nullptr;
+}

+ 2 - 0
DevTools/HackStudio/Project.h

@@ -14,6 +14,8 @@ public:
 
     [[nodiscard]] bool add_file(const String& filename);
 
+    TextDocument* get_file(const String& filename);
+
     GModel& model() { return *m_model; }
 
     template<typename Callback>

+ 9 - 0
DevTools/HackStudio/TextDocument.cpp

@@ -2,6 +2,15 @@
 #include <LibCore/CFile.h>
 #include <string.h>
 
+const GTextDocument& TextDocument::document() const
+{
+    if (!m_document) {
+        m_document = GTextDocument::create(nullptr);
+        m_document->set_text(contents());
+    }
+    return *m_document;
+}
+
 const ByteBuffer& TextDocument::contents() const
 {
     if (m_contents.is_null()) {

+ 4 - 0
DevTools/HackStudio/TextDocument.h

@@ -4,6 +4,7 @@
 #include <AK/NonnullRefPtr.h>
 #include <AK/RefCounted.h>
 #include <AK/String.h>
+#include <LibGUI/GTextDocument.h>
 
 class TextDocument : public RefCounted<TextDocument> {
 public:
@@ -18,6 +19,8 @@ public:
 
     Vector<int> find(const StringView&) const;
 
+    const GTextDocument& document() const;
+
 private:
     explicit TextDocument(const String& name)
         : m_name(name)
@@ -26,4 +29,5 @@ private:
 
     String m_name;
     mutable ByteBuffer m_contents;
+    mutable RefPtr<GTextDocument> m_document;
 };

+ 2 - 7
DevTools/HackStudio/main.cpp

@@ -305,13 +305,8 @@ static void rehighlight()
 
 void open_file(const String& filename)
 {
-    auto file = CFile::construct(filename);
-    if (!file->open(CFile::ReadOnly)) {
-        GMessageBox::show("Could not open!", "Error", GMessageBox::Type::Error, GMessageBox::InputType::OK, g_window);
-        return;
-    }
-    auto contents = file->read_all();
-    current_editor().set_text(contents);
+    auto file = g_project->get_file(filename);
+    current_editor().set_document(const_cast<GTextDocument&>(file->document()));
 
     if (filename.ends_with(".cpp")) {
         current_editor().on_change = [] { rehighlight(); };