summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/DevTools/HackStudio/CMakeLists.txt3
-rw-r--r--Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.cpp50
-rw-r--r--Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.gml42
-rw-r--r--Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.h35
-rw-r--r--Userland/DevTools/HackStudio/Git/GitWidget.cpp17
5 files changed, 141 insertions, 6 deletions
diff --git a/Userland/DevTools/HackStudio/CMakeLists.txt b/Userland/DevTools/HackStudio/CMakeLists.txt
index e9a2a29a66..7dc1b35db6 100644
--- a/Userland/DevTools/HackStudio/CMakeLists.txt
+++ b/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
diff --git a/Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.cpp b/Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.cpp
new file mode 100644
index 0000000000..4423440952
--- /dev/null
+++ b/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);
+ };
+}
+
+}
diff --git a/Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.gml b/Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.gml
new file mode 100644
index 0000000000..86984d4deb
--- /dev/null
+++ b/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
+ }
+ }
+}
diff --git a/Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.h b/Userland/DevTools/HackStudio/Dialogs/Git/GitCommitDialog.h
new file mode 100644
index 0000000000..346280c013
--- /dev/null
+++ b/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;
+};
+
+}
diff --git a/Userland/DevTools/HackStudio/Git/GitWidget.cpp b/Userland/DevTools/HackStudio/Git/GitWidget.cpp
index df86faddca..e86165ba0f 100644
--- a/Userland/DevTools/HackStudio/Git/GitWidget.cpp
+++ b/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)