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! :^)
This commit is contained in:
Conor Byrne 2021-12-31 17:50:49 +00:00 committed by Andreas Kling
parent e92b6047ad
commit 4cfc992125
Notes: sideshowbarker 2024-07-17 21:51:10 +09:00
5 changed files with 141 additions and 6 deletions

View file

@ -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

View file

@ -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);
};
}
}

View file

@ -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
}
}
}

View file

@ -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;
};
}

View file

@ -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)