diff options
author | Conor Byrne <71222289+cbyrneee@users.noreply.github.com> | 2021-12-31 17:50:49 +0000 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-01-01 14:47:23 +0100 |
commit | 4cfc992125dcb0c0be26da0e692719b1aa0ce2f5 (patch) | |
tree | 997cd7cd9e571f72faf2e2e072019424eb278fd5 /Userland | |
parent | e92b6047ad101d071016734cb2c95993ca42d47c (diff) | |
download | serenity-4cfc992125dcb0c0be26da0e692719b1aa0ce2f5.zip |
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! :^)
Diffstat (limited to 'Userland')
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) |