From 8693515726b9fc7cfb1158151d59d89aab8dc540 Mon Sep 17 00:00:00 2001 From: Lu Zhen Date: Wed, 8 Nov 2023 13:22:34 +0800 Subject: [PATCH] feat: add codegeex config option Log: Change-Id: I00709b1879be24a2400a68a5910f0eeafc4d6d05 --- src/plugins/codegeex/CMakeLists.txt | 6 + src/plugins/codegeex/codegeex.cpp | 8 +- src/plugins/codegeex/copilot.cpp | 19 ++- src/plugins/codegeex/copilot.h | 1 + .../codegeex/option/codegeexoptionwidget.cpp | 74 ++++++++++++ .../codegeex/option/codegeexoptionwidget.h | 28 +++++ src/plugins/codegeex/option/detailwidget.cpp | 114 ++++++++++++++++++ src/plugins/codegeex/option/detailwidget.h | 43 +++++++ .../option/optioncodegeexgenerator.cpp | 22 ++++ .../codegeex/option/optioncodegeexgenerator.h | 18 +++ src/services/option/optionmanager.cpp | 9 ++ src/services/option/optionmanager.h | 2 + src/services/optionservice.cpp | 10 -- src/services/optionservice.h | 15 --- 14 files changed, 339 insertions(+), 30 deletions(-) create mode 100644 src/plugins/codegeex/option/codegeexoptionwidget.cpp create mode 100644 src/plugins/codegeex/option/codegeexoptionwidget.h create mode 100644 src/plugins/codegeex/option/detailwidget.cpp create mode 100644 src/plugins/codegeex/option/detailwidget.h create mode 100644 src/plugins/codegeex/option/optioncodegeexgenerator.cpp create mode 100644 src/plugins/codegeex/option/optioncodegeexgenerator.h delete mode 100644 src/services/optionservice.cpp delete mode 100644 src/services/optionservice.h diff --git a/src/plugins/codegeex/CMakeLists.txt b/src/plugins/codegeex/CMakeLists.txt index 36576b6b3..b777233bf 100644 --- a/src/plugins/codegeex/CMakeLists.txt +++ b/src/plugins/codegeex/CMakeLists.txt @@ -8,6 +8,9 @@ set(CXX_CPP codegeex/askapi.cpp codegeex/copilotapi.cpp askpage/askpage.cpp + option/codegeexoptionwidget.cpp + option/detailwidget.cpp + option/optioncodegeexgenerator.cpp copilot.cpp codegeex.json ) @@ -19,6 +22,9 @@ set(CXX_H codegeex/copilotapi.h copilot.h askpage/askpage.h + option/codegeexoptionwidget.h + option/detailwidget.h + option/optioncodegeexgenerator.h ) add_library(${PROJECT_NAME} diff --git a/src/plugins/codegeex/codegeex.cpp b/src/plugins/codegeex/codegeex.cpp index 01003c86e..c6da5f2fa 100644 --- a/src/plugins/codegeex/codegeex.cpp +++ b/src/plugins/codegeex/codegeex.cpp @@ -4,9 +4,11 @@ #include "codegeex.h" #include "askpage/askpage.h" +#include "option/optioncodegeexgenerator.h" #include "common/common.h" #include "services/window/windowservice.h" +#include "services/option/optionservice.h" #include "copilot.h" #include "base/abstractwidget.h" @@ -24,7 +26,6 @@ void CodeGeex::initialize() bool CodeGeex::start() { auto windowService = dpfGetService(dpfservice::WindowService); - if (windowService) { QString title = "CodeGeex"; @@ -35,6 +36,11 @@ bool CodeGeex::start() } } + auto optionService = dpfGetService(dpfservice::OptionService); + if (optionService) { + optionService->implGenerator(OptionCodeGeeXGenerator::kitName()); + } + Copilot::instance(); return true; diff --git a/src/plugins/codegeex/copilot.cpp b/src/plugins/codegeex/copilot.cpp index b84fb74f7..8696febdf 100644 --- a/src/plugins/codegeex/copilot.cpp +++ b/src/plugins/codegeex/copilot.cpp @@ -3,12 +3,12 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "copilot.h" #include "services/editor/editorservice.h" +#include "services/option/optionmanager.h" #include #include #include -static const char *kApiKey = "f30ea902c3824ee88e221a32363c0823"; static const char *kUrlGenerateOneLine = "https://tianqi.aminer.cn/api/v2/multilingual_code_generate"; static const char *kUrlGenerateMultiLine = "https://tianqi.aminer.cn/api/v2/multilingual_code_generate_adapt"; static const char *kUrlComment = "https://tianqi.aminer.cn/api/v2/multilingual_code_explain"; @@ -64,6 +64,17 @@ QString Copilot::selectedText() const return editorService->getSelectedText(); } +QString Copilot::apiKey() const +{ + QStringList properties; + properties << "CodeGeeX" << "Detail" << "apiKey"; + QVariant var = OptionManager::getInstance()->getValue("CodeGeeX", properties); + if (var.isValid()) { + return var.toString(); + } + return {}; +} + Copilot *Copilot::instance() { static Copilot ins; @@ -91,7 +102,7 @@ QMenu *Copilot::getMenu() void Copilot::translateCode(const QString &code, const QString &dstLanguage) { - copilotApi.postTranslate(kUrlTranslate, kApiKey, code, "c++", dstLanguage); + copilotApi.postTranslate(kUrlTranslate, apiKey(), code, "c++", dstLanguage); } void Copilot::replaceSelectedText(const QString &text) @@ -117,7 +128,7 @@ void Copilot::processKeyPressEvent(Qt::Key key) void Copilot::addComment() { copilotApi.postComment(kUrlComment, - kApiKey, + apiKey(), selectedText(), "cpp", "zh-CN"); @@ -129,7 +140,7 @@ void Copilot::generateCode() QString suffix = editorService->getCursorAfterText(); copilotApi.postGenerate(kUrlGenerateMultiLine, - kApiKey, + apiKey(), prompt, suffix); } diff --git a/src/plugins/codegeex/copilot.h b/src/plugins/codegeex/copilot.h index 230a93f4f..8fc0b2529 100644 --- a/src/plugins/codegeex/copilot.h +++ b/src/plugins/codegeex/copilot.h @@ -41,6 +41,7 @@ public slots: private: explicit Copilot(QObject *parent = nullptr); QString selectedText() const; + QString apiKey() const; CodeGeeX::CopilotApi copilotApi; dpfservice::EditorService *editorService = nullptr; diff --git a/src/plugins/codegeex/option/codegeexoptionwidget.cpp b/src/plugins/codegeex/option/codegeexoptionwidget.cpp new file mode 100644 index 000000000..b28c52e9a --- /dev/null +++ b/src/plugins/codegeex/option/codegeexoptionwidget.cpp @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "codegeexoptionwidget.h" +#include "detailwidget.h" + +#include "services/option/optionutils.h" +#include "services/option/optiondatastruct.h" +#include "services/option/optionmanager.h" + +#include +#include + + +static const char *kCATEGORY_CODEGEEX = "CodeGeeX"; + +class CodeGeeXOptionWidgetPrivate +{ + QTabWidget* tabWidget = nullptr; + friend class CodeGeeXOptionWidget; +}; + +CodeGeeXOptionWidget::CodeGeeXOptionWidget(QWidget *parent) + : PageWidget(parent) + , d(new CodeGeeXOptionWidgetPrivate()) +{ + QHBoxLayout *layout = new QHBoxLayout(); + d->tabWidget = new QTabWidget(); + layout->addWidget(d->tabWidget); + + d->tabWidget->addTab(new DetailWidget(), tr("CodeGeeX")); + QObject::connect(d->tabWidget, &QTabWidget::currentChanged, [this]() { + readConfig(); + }); + + setLayout(layout); +} + +CodeGeeXOptionWidget::~CodeGeeXOptionWidget() +{ + if (d) + delete d; +} + +void CodeGeeXOptionWidget::saveConfig() +{ + for (int index = 0; index < d->tabWidget->count(); index++) { + PageWidget *pageWidget = qobject_cast(d->tabWidget->widget(index)); + if (pageWidget) { + QString itemNode = d->tabWidget->tabText(d->tabWidget->currentIndex()); + QMap map; + pageWidget->getUserConfig(map); + OptionUtils::writeJsonSection(OptionUtils::getJsonFilePath(), kCATEGORY_CODEGEEX, itemNode, map); + + OptionManager::getInstance()->updateData(); + } + } +} + +void CodeGeeXOptionWidget::readConfig() +{ + for (int index = 0; index < d->tabWidget->count(); index++) { + PageWidget *pageWidget = qobject_cast(d->tabWidget->widget(index)); + if (pageWidget) { + QString itemNode = d->tabWidget->tabText(d->tabWidget->currentIndex()); + QMap map; + OptionUtils::readJsonSection(OptionUtils::getJsonFilePath(), + kCATEGORY_CODEGEEX, itemNode, map); + pageWidget->setUserConfig(map); + } + } +} + diff --git a/src/plugins/codegeex/option/codegeexoptionwidget.h b/src/plugins/codegeex/option/codegeexoptionwidget.h new file mode 100644 index 000000000..fdba43f81 --- /dev/null +++ b/src/plugins/codegeex/option/codegeexoptionwidget.h @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef CODEGEEXOPTIONWIDGET_H +#define CODEGEEXOPTIONWIDGET_H + +#include "common/common.h" + +class CodeGeeXOptionWidgetPrivate; +class CodeGeeXOptionWidget : public PageWidget +{ + Q_OBJECT +public: + explicit CodeGeeXOptionWidget(QWidget *parent = nullptr); + ~CodeGeeXOptionWidget() override; + + void saveConfig() override; + void readConfig() override; + +signals: + +public slots: +private: + CodeGeeXOptionWidgetPrivate *const d; +}; + +#endif // CODEGEEXOPTIONWIDGET_H diff --git a/src/plugins/codegeex/option/detailwidget.cpp b/src/plugins/codegeex/option/detailwidget.cpp new file mode 100644 index 000000000..5cad33311 --- /dev/null +++ b/src/plugins/codegeex/option/detailwidget.cpp @@ -0,0 +1,114 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "detailwidget.h" +#include "common/util/custompaths.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const char *kApiKey = "apiKey"; + +// this is a temporary key +static const char *kDefaultApiKey = "f30ea902c3824ee88e221a32363c0823"; + +class DetailWidgetPrivate +{ + friend class DetailWidget; + + QLineEdit *apiKeyWidget = nullptr; +}; + +DetailWidget::DetailWidget(QWidget *parent) + : PageWidget(parent) + , d(new DetailWidgetPrivate()) +{ + setupUi(); + updateUi(); +} + +DetailWidget::~DetailWidget() +{ + if (d) { + delete d; + } +} + +void DetailWidget::setupUi() +{ + QVBoxLayout *vLayout = new QVBoxLayout(); + setLayout(vLayout); + + QHBoxLayout *hLayout = new QHBoxLayout(); + QLabel *label = new QLabel(QLabel::tr("CodeGeeX Api Key:")); + d->apiKeyWidget = new QLineEdit(); + hLayout->addWidget(label); + hLayout->addWidget(d->apiKeyWidget); + + vLayout->addLayout(hLayout); + vLayout->addStretch(); +} + +void DetailWidget::updateUi() +{ +} + +bool DetailWidget::getControlValue(QMap &map) +{ + CodeGeeXConfig config; + config.apiKey = d->apiKeyWidget->text(); + dataToMap(config, map); + + return true; +} + +void DetailWidget::setControlValue(const QMap &map) +{ + CodeGeeXConfig config; + mapToData(map, config); + + if (config.apiKey.isEmpty()) { + config.apiKey = kDefaultApiKey; + } + d->apiKeyWidget->setText(config.apiKey); +} + +bool DetailWidget::dataToMap(const CodeGeeXConfig &config, QMap &map) +{ + QMap apiKey; + apiKey.insert(kApiKey, config.apiKey); + + map.insert(tr("Detail"), apiKey); + + return true; +} + +bool DetailWidget::mapToData(const QMap &map, CodeGeeXConfig &config) +{ + QMap detail = map.value(tr("Detail")).toMap(); + config.apiKey = detail.value(kApiKey).toString(); + + return true; +} + +void DetailWidget::setUserConfig(const QMap &map) +{ + setControlValue(map); +} + +void DetailWidget::getUserConfig(QMap &map) +{ + getControlValue(map); +} diff --git a/src/plugins/codegeex/option/detailwidget.h b/src/plugins/codegeex/option/detailwidget.h new file mode 100644 index 000000000..25b58c972 --- /dev/null +++ b/src/plugins/codegeex/option/detailwidget.h @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef DETAILWIDGET_H +#define DETAILWIDGET_H + +#include "services/option/toolchaindata.h" +#include "common/widget/pagewidget.h" + +struct CodeGeeXConfig{ + QString apiKey; +}; + +class DetailWidgetPrivate; +class DetailWidget : public PageWidget +{ + Q_OBJECT +public: + explicit DetailWidget(QWidget *parent = nullptr); + ~DetailWidget() override; + + void setUserConfig(const QMap &map) override; + void getUserConfig(QMap &map) override; + +signals: + +public slots: + +private: + void setupUi(); + void updateUi(); + + bool dataToMap(const CodeGeeXConfig &config, QMap &map); + bool mapToData(const QMap &map, CodeGeeXConfig &config); + + bool getControlValue(QMap &map); + void setControlValue(const QMap &map); + + DetailWidgetPrivate *const d; +}; + +#endif // DETAILWIDGET_H diff --git a/src/plugins/codegeex/option/optioncodegeexgenerator.cpp b/src/plugins/codegeex/option/optioncodegeexgenerator.cpp new file mode 100644 index 000000000..ce85ac043 --- /dev/null +++ b/src/plugins/codegeex/option/optioncodegeexgenerator.cpp @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "optioncodegeexgenerator.h" +#include "codegeexoptionwidget.h" + +#include "common/widget/pagewidget.h" + +#include +#include +#include + +OptionCodeGeeXGenerator::OptionCodeGeeXGenerator() +{ + +} + +QWidget *OptionCodeGeeXGenerator::optionWidget() +{ + return new CodeGeeXOptionWidget(); +} diff --git a/src/plugins/codegeex/option/optioncodegeexgenerator.h b/src/plugins/codegeex/option/optioncodegeexgenerator.h new file mode 100644 index 000000000..3b2b141ec --- /dev/null +++ b/src/plugins/codegeex/option/optioncodegeexgenerator.h @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef OPTIONCODEGEEXGENERATOR_H +#define OPTIONCODEGEEXGENERATOR_H + +#include "services/option/optiongenerator.h" + +class OptionCodeGeeXGenerator : public dpfservice::OptionGenerator +{ +public: + OptionCodeGeeXGenerator(); + inline static QString kitName() {return "CodeGeeX";} + virtual QWidget *optionWidget() override; +}; + +#endif // OPTIONCODEGEEXGENERATOR_H diff --git a/src/services/option/optionmanager.cpp b/src/services/option/optionmanager.cpp index 90ece9c6c..a5cc362ea 100644 --- a/src/services/option/optionmanager.cpp +++ b/src/services/option/optionmanager.cpp @@ -115,3 +115,12 @@ QString OptionManager::getToolPath(const QString &kit) return ""; } +QVariant OptionManager::getValue(const QString &category, const QStringList &properties) +{ + QVariant tmp = d->dataMap.value(category).toMap(); + for (auto property : properties) { + tmp = tmp.toMap().value(property); + } + return tmp; +} + diff --git a/src/services/option/optionmanager.h b/src/services/option/optionmanager.h index fa6fda209..65c1a7bb1 100644 --- a/src/services/option/optionmanager.h +++ b/src/services/option/optionmanager.h @@ -7,6 +7,7 @@ #include "optiondatastruct.h" #include +#include class OptionManagerPrivate; class OptionManager : public QObject @@ -26,6 +27,7 @@ class OptionManager : public QObject QString getCxxDebuggerToolPath(); QString getJSToolPath(); QString getToolPath(const QString &kit); + QVariant getValue(const QString &category, const QStringList &properties); signals: private: diff --git a/src/services/optionservice.cpp b/src/services/optionservice.cpp deleted file mode 100644 index 0e3766efa..000000000 --- a/src/services/optionservice.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "optionservice.h" - -OptionService::OptionService() -{ - -} diff --git a/src/services/optionservice.h b/src/services/optionservice.h deleted file mode 100644 index cf07c0642..000000000 --- a/src/services/optionservice.h +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef OPTIONSERVICE_H -#define OPTIONSERVICE_H - - -class OptionService -{ -public: - OptionService(); -}; - -#endif // OPTIONSERVICE_H \ No newline at end of file