aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/copilot/copilotoptionspage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/copilot/copilotoptionspage.cpp')
-rw-r--r--src/plugins/copilot/copilotoptionspage.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/plugins/copilot/copilotoptionspage.cpp b/src/plugins/copilot/copilotoptionspage.cpp
new file mode 100644
index 00000000000..001db87834d
--- /dev/null
+++ b/src/plugins/copilot/copilotoptionspage.cpp
@@ -0,0 +1,101 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
+
+#include "copilotoptionspage.h"
+
+#include "authwidget.h"
+#include "copilotconstants.h"
+#include "copilotsettings.h"
+#include "copilottr.h"
+
+#include <coreplugin/icore.h>
+
+#include <utils/layoutbuilder.h>
+#include <utils/pathchooser.h>
+
+using namespace Utils;
+using namespace LanguageClient;
+
+namespace Copilot {
+
+class CopilotOptionsPageWidget : public Core::IOptionsPageWidget
+{
+public:
+ CopilotOptionsPageWidget()
+ {
+ using namespace Layouting;
+
+ auto authWidget = new AuthWidget();
+
+ QLabel *helpLabel = new QLabel();
+ helpLabel->setTextFormat(Qt::MarkdownText);
+ helpLabel->setWordWrap(true);
+ helpLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse
+ | Qt::LinksAccessibleByKeyboard);
+ helpLabel->setOpenExternalLinks(true);
+
+ // clang-format off
+ helpLabel->setText(Tr::tr(R"(
+The Copilot plugin requires node.js and the Copilot neovim plugin.
+If you install the neovim plugin as described in the
+[README.md](https://github.com/github/copilot.vim),
+the plugin will find the agent.js file automatically.
+
+Otherwise you need to specify the path to the
+[agent.js](https://github.com/github/copilot.vim/tree/release/copilot/dist)
+file from the Copilot neovim plugin.
+ )", "Markdown text for the copilot instruction label"));
+
+ Column {
+ authWidget, br,
+ CopilotSettings::instance().enableCopilot, br,
+ CopilotSettings::instance().nodeJsPath, br,
+ CopilotSettings::instance().distPath, br,
+ CopilotSettings::instance().autoComplete, br,
+ helpLabel, br,
+ st
+ }.attachTo(this);
+ // clang-format on
+
+ auto updateAuthWidget = [authWidget]() {
+ authWidget->updateClient(
+ FilePath::fromUserInput(
+ CopilotSettings::instance().nodeJsPath.volatileValue().toString()),
+ FilePath::fromUserInput(
+ CopilotSettings::instance().distPath.volatileValue().toString()));
+ };
+
+ connect(CopilotSettings::instance().nodeJsPath.pathChooser(),
+ &PathChooser::textChanged,
+ authWidget,
+ updateAuthWidget);
+ connect(CopilotSettings::instance().distPath.pathChooser(),
+ &PathChooser::textChanged,
+ authWidget,
+ updateAuthWidget);
+ updateAuthWidget();
+
+ setOnApply([] {
+ CopilotSettings::instance().apply();
+ CopilotSettings::instance().writeSettings(Core::ICore::settings());
+ });
+ }
+};
+
+CopilotOptionsPage::CopilotOptionsPage()
+{
+ setId(Constants::COPILOT_GENERAL_OPTIONS_ID);
+ setDisplayName("Copilot");
+ setCategory(Constants::COPILOT_GENERAL_OPTIONS_CATEGORY);
+ setDisplayCategory(Constants::COPILOT_GENERAL_OPTIONS_DISPLAY_CATEGORY);
+ setCategoryIconPath(":/copilot/images/settingscategory_copilot.png");
+ setWidgetCreator([] { return new CopilotOptionsPageWidget; });
+}
+
+CopilotOptionsPage &CopilotOptionsPage::instance()
+{
+ static CopilotOptionsPage settingsPage;
+ return settingsPage;
+}
+
+} // namespace Copilot