Ver Fonte

HackStudio: Add TODO entries widget

Federico Guerinoni há 4 anos atrás
pai
commit
935c7b2f4b

+ 1 - 0
Userland/DevTools/HackStudio/CMakeLists.txt

@@ -44,6 +44,7 @@ set(SOURCES
     ProjectTemplate.cpp
     TerminalWrapper.cpp
     ToDoEntries.cpp
+    ToDoEntriesWidget.cpp
     main.cpp
 )
 

+ 6 - 0
Userland/DevTools/HackStudio/HackStudioWidget.cpp

@@ -22,6 +22,7 @@
 #include "Project.h"
 #include "ProjectDeclarations.h"
 #include "TerminalWrapper.h"
+#include "ToDoEntries.h"
 #include <AK/LexicalPath.h>
 #include <AK/StringBuilder.h>
 #include <Kernel/API/InodeWatcherEvent.h>
@@ -867,6 +868,7 @@ void HackStudioWidget::create_action_tab(GUI::Widget& parent)
     };
 
     m_find_in_files_widget = m_action_tab_widget->add_tab<FindInFilesWidget>("Find in files");
+    m_todo_entries_widget = m_action_tab_widget->add_tab<ToDoEntriesWidget>("TODO");
     m_terminal_wrapper = m_action_tab_widget->add_tab<TerminalWrapper>("Build", false);
     m_debug_info_widget = m_action_tab_widget->add_tab<DebugInfoWidget>("Debug");
     m_disassembly_widget = m_action_tab_widget->add_tab<DisassemblyWidget>("Disassembly");
@@ -875,6 +877,10 @@ void HackStudioWidget::create_action_tab(GUI::Widget& parent)
         m_diff_viewer->set_content(original_content, diff);
         set_edit_mode(EditMode::Diff);
     });
+
+    ToDoEntries::the().on_update = [this]() {
+        m_todo_entries_widget->refresh();
+    };
 }
 
 void HackStudioWidget::create_project_tab(GUI::Widget& parent)

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

@@ -19,6 +19,7 @@
 #include "Project.h"
 #include "ProjectFile.h"
 #include "TerminalWrapper.h"
+#include "ToDoEntriesWidget.h"
 #include <LibGUI/ActionGroup.h>
 #include <LibGUI/Scrollbar.h>
 #include <LibGUI/Splitter.h>
@@ -143,6 +144,7 @@ private:
     RefPtr<TerminalWrapper> m_terminal_wrapper;
     RefPtr<Locator> m_locator;
     RefPtr<FindInFilesWidget> m_find_in_files_widget;
+    RefPtr<ToDoEntriesWidget> m_todo_entries_widget;
     RefPtr<DebugInfoWidget> m_debug_info_widget;
     RefPtr<DisassemblyWidget> m_disassembly_widget;
     RefPtr<Threading::Thread> m_debugger_thread;

+ 96 - 0
Userland/DevTools/HackStudio/ToDoEntriesWidget.cpp

@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2021, Federico Guerinoni <guerinoni.federico@gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include "ToDoEntriesWidget.h"
+#include "HackStudio.h"
+#include "Project.h"
+#include "ToDoEntries.h"
+#include <AK/StringBuilder.h>
+#include <LibGUI/BoxLayout.h>
+#include <LibGUI/Button.h>
+#include <LibGUI/TableView.h>
+#include <LibGUI/TextBox.h>
+#include <LibGfx/FontDatabase.h>
+
+namespace HackStudio {
+
+class ToDoEntriesModel final : public GUI::Model {
+public:
+    enum Column {
+        Filename,
+        Text,
+        __Count
+    };
+
+    explicit ToDoEntriesModel(const Vector<ToDoEntryPair>&& matches)
+        : m_matches(move(matches))
+    {
+    }
+
+    virtual int row_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override { return m_matches.size(); }
+    virtual int column_count(const GUI::ModelIndex& = GUI::ModelIndex()) const override { return Column::__Count; }
+
+    virtual String column_name(int column) const override
+    {
+        switch (column) {
+        case Column::Filename:
+            return "Filename";
+        case Column::Text:
+            return "Text";
+        default:
+            VERIFY_NOT_REACHED();
+        }
+    }
+
+    virtual GUI::Variant data(const GUI::ModelIndex& index, GUI::ModelRole role) const override
+    {
+        if (role == GUI::ModelRole::TextAlignment)
+            return Gfx::TextAlignment::CenterLeft;
+        if (role == GUI::ModelRole::Font) {
+            if (index.column() == Column::Text)
+                return Gfx::FontDatabase::default_fixed_width_font();
+            return {};
+        }
+        if (role == GUI::ModelRole::Display) {
+            auto& match = m_matches.at(index.row());
+            switch (index.column()) {
+            case Column::Filename:
+                return match.filename;
+            case Column::Text:
+                return match.comment;
+            }
+        }
+        return {};
+    }
+
+    virtual void update() override { }
+    virtual GUI::ModelIndex index(int row, int column = 0, const GUI::ModelIndex& = GUI::ModelIndex()) const override
+    {
+        if (row < 0 || row >= (int)m_matches.size())
+            return {};
+        if (column < 0 || column >= Column::__Count)
+            return {};
+        return create_index(row, column, &m_matches.at(row));
+    }
+
+private:
+    Vector<ToDoEntryPair> m_matches;
+};
+
+void ToDoEntriesWidget::refresh()
+{
+    const auto& entries = ToDoEntries::the().get_entries();
+    auto results_model = adopt_ref(*new ToDoEntriesModel(move(entries)));
+    m_result_view->set_model(results_model);
+}
+
+ToDoEntriesWidget::ToDoEntriesWidget()
+{
+    set_layout<GUI::VerticalBoxLayout>();
+    m_result_view = add<GUI::TableView>();
+}
+
+}

+ 29 - 0
Userland/DevTools/HackStudio/ToDoEntriesWidget.h

@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2021, Federico Guerinoni <guerinoni.federico@gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibGUI/Button.h>
+#include <LibGUI/TableView.h>
+#include <LibGUI/TextBox.h>
+#include <LibGUI/Widget.h>
+
+namespace HackStudio {
+
+class ToDoEntriesWidget final : public GUI::Widget {
+    C_OBJECT(ToDoEntriesWidget)
+public:
+    virtual ~ToDoEntriesWidget() override { }
+
+    void refresh();
+
+private:
+    explicit ToDoEntriesWidget();
+
+    RefPtr<GUI::TableView> m_result_view;
+};
+
+}