Browse Source

HackStudio: Add new multiline commit dialog

This new commit dialog features multi-line input and a line and column
indicator. A great improvement over the last one, if you ask me! :^)
Conor Byrne 3 năm trước cách đây
mục cha
commit
4cfc992125

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

@@ -9,6 +9,7 @@ add_subdirectory(LanguageServers)
 add_subdirectory(LanguageClients)
 
 compile_gml(Dialogs/NewProjectDialog.gml Dialogs/NewProjectDialogGML.h new_project_dialog_gml)
+compile_gml(Dialogs/Git/GitCommitDialog.gml Dialogs/Git/GitCommitDialogGML.h git_commit_dialog_gml)
 
 set(SOURCES
     CodeDocument.cpp
@@ -23,6 +24,8 @@ set(SOURCES
     Debugger/EvaluateExpressionDialog.cpp
     Debugger/RegistersModel.cpp
     Debugger/VariablesModel.cpp
+    Dialogs/Git/GitCommitDialog.cpp
+    Dialogs/Git/GitCommitDialogGML.h
     Dialogs/NewProjectDialog.cpp
     Dialogs/NewProjectDialogGML.h
     Dialogs/ProjectTemplatesModel.cpp

+ 50 - 0
Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.cpp

@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2021, Conor Byrne <conor@cbyrne.dev>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include "GitCommitDialog.h"
+#include <DevTools/HackStudio/Dialogs/Git/GitCommitDialogGML.h>
+
+namespace HackStudio {
+
+GitCommitDialog::GitCommitDialog(GUI::Window* parent)
+    : Dialog(parent)
+{
+    resize(400, 260);
+    center_within(*parent);
+    set_modal(true);
+    set_title("Commit");
+    set_icon(parent->icon());
+
+    auto& widget = set_main_widget<GUI::Widget>();
+    widget.load_from_gml(git_commit_dialog_gml);
+
+    m_message_editor = widget.find_descendant_of_type_named<GUI::TextEditor>("message_editor");
+    m_cancel_button = widget.find_descendant_of_type_named<GUI::Button>("cancel_button");
+    m_commit_button = widget.find_descendant_of_type_named<GUI::Button>("commit_button");
+    m_line_and_col_label = widget.find_descendant_of_type_named<GUI::Label>("line_and_col_label");
+
+    m_message_editor->on_change = [this]() {
+        m_commit_button->set_enabled(!m_message_editor->text().is_empty() && on_commit);
+    };
+    m_message_editor->on_cursor_change = [this]() {
+        auto line = m_message_editor->cursor().line() + 1;
+        auto col = m_message_editor->cursor().column();
+
+        m_line_and_col_label->set_text(String::formatted("Line: {}, Col: {}", line, col));
+    };
+
+    m_commit_button->set_enabled(!m_message_editor->text().is_empty() && on_commit);
+    m_commit_button->on_click = [this](auto) {
+        on_commit(m_message_editor->text());
+        done(ExecResult::ExecOK);
+    };
+
+    m_cancel_button->on_click = [this](auto) {
+        done(ExecResult::ExecCancel);
+    };
+}
+
+}

+ 42 - 0
Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.gml

@@ -0,0 +1,42 @@
+@GUI::Frame {
+    fill_with_background_color: true
+
+    layout: @GUI::VerticalBoxLayout {
+        spacing: 4
+        margins: [4, 4, 4, 4]
+    }
+
+    @GUI::Label {
+        text: "Enter commit message:"
+        text_alignment: "CenterLeft"
+        fixed_height: 20
+    }
+
+    @GUI::TextEditor {
+        name: "message_editor"
+    }
+
+    @GUI::Widget {
+        layout: @GUI::HorizontalBoxLayout
+        shrink_to_fit: true
+
+        @GUI::Label {
+            name: "line_and_col_label"
+            text: "Line: 1, Col: 0"
+            text_alignment: "CenterLeft"
+            fixed_height: 20
+        }
+
+        @GUI::Button {
+            name: "commit_button"
+            text: "Commit"
+            fixed_width: 75
+        }
+
+        @GUI::Button {
+            name: "cancel_button"
+            text: "Cancel"
+            fixed_width: 75
+        }
+    }
+}

+ 35 - 0
Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.h

@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2021, Conor Byrne <conor@cbyrne.dev>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/RefPtr.h>
+#include <LibGUI/Button.h>
+#include <LibGUI/Dialog.h>
+#include <LibGUI/Label.h>
+#include <LibGUI/TextEditor.h>
+#include <LibGUI/Window.h>
+
+namespace HackStudio {
+
+using OnCommitCallback = Function<void(String const& message)>;
+
+class GitCommitDialog final : public GUI::Dialog {
+    C_OBJECT(GitCommitDialog);
+
+public:
+    OnCommitCallback on_commit;
+
+private:
+    GitCommitDialog(GUI::Window* parent);
+
+    RefPtr<GUI::Button> m_commit_button;
+    RefPtr<GUI::Button> m_cancel_button;
+    RefPtr<GUI::TextEditor> m_message_editor;
+    RefPtr<GUI::Label> m_line_and_col_label;
+};
+
+}

+ 11 - 6
Userland/DevTools/HackStudio/Git/GitWidget.cpp

@@ -5,6 +5,7 @@
  */
 
 #include "GitWidget.h"
+#include "../Dialogs/Git/GitCommitDialog.h"
 #include "GitFilesModel.h"
 #include <LibCore/File.h>
 #include <LibDiff/Format.h>
@@ -134,13 +135,17 @@ void GitWidget::unstage_file(const LexicalPath& file)
 
 void GitWidget::commit()
 {
-    String message;
-    auto res = GUI::InputBox::show(window(), message, "Commit message:", "Commit");
-    if (res != GUI::InputBox::ExecOK || message.is_empty())
+    if (m_git_repo.is_null()) {
+        GUI::MessageBox::show(window(), "There is no git repository to commit to!", "Error", GUI::MessageBox::Type::Error);
         return;
-    dbgln("commit message: {}", message);
-    m_git_repo->commit(message);
-    refresh();
+    }
+
+    auto dialog = GitCommitDialog::construct(window());
+    dialog->on_commit = [this](auto& message) {
+        m_git_repo->commit(message);
+        refresh();
+    };
+    dialog->exec();
 }
 
 void GitWidget::set_view_diff_callback(ViewDiffCallback callback)