Skip to content

Commit

Permalink
feat: add codegeex config option
Browse files Browse the repository at this point in the history
Log:
Change-Id: I00709b1879be24a2400a68a5910f0eeafc4d6d05
  • Loading branch information
deepin-mozart committed Nov 8, 2023
1 parent e9128f3 commit 8693515
Show file tree
Hide file tree
Showing 14 changed files with 339 additions and 30 deletions.
6 changes: 6 additions & 0 deletions src/plugins/codegeex/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand All @@ -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}
Expand Down
8 changes: 7 additions & 1 deletion src/plugins/codegeex/codegeex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -24,7 +26,6 @@ void CodeGeex::initialize()
bool CodeGeex::start()
{
auto windowService = dpfGetService(dpfservice::WindowService);

if (windowService) {
QString title = "CodeGeex";

Expand All @@ -35,6 +36,11 @@ bool CodeGeex::start()
}
}

auto optionService = dpfGetService(dpfservice::OptionService);
if (optionService) {
optionService->implGenerator<OptionCodeGeeXGenerator>(OptionCodeGeeXGenerator::kitName());
}

Copilot::instance();

return true;
Expand Down
19 changes: 15 additions & 4 deletions src/plugins/codegeex/copilot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <QMenu>
#include <QDebug>
#include <QTimer>

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";
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -117,7 +128,7 @@ void Copilot::processKeyPressEvent(Qt::Key key)
void Copilot::addComment()
{
copilotApi.postComment(kUrlComment,
kApiKey,
apiKey(),
selectedText(),
"cpp",
"zh-CN");
Expand All @@ -129,7 +140,7 @@ void Copilot::generateCode()
QString suffix = editorService->getCursorAfterText();

copilotApi.postGenerate(kUrlGenerateMultiLine,
kApiKey,
apiKey(),
prompt,
suffix);
}
Expand Down
1 change: 1 addition & 0 deletions src/plugins/codegeex/copilot.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
74 changes: 74 additions & 0 deletions src/plugins/codegeex/option/codegeexoptionwidget.cpp
Original file line number Diff line number Diff line change
@@ -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 <QHBoxLayout>
#include <QTabWidget>


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<PageWidget*>(d->tabWidget->widget(index));
if (pageWidget) {
QString itemNode = d->tabWidget->tabText(d->tabWidget->currentIndex());
QMap<QString, QVariant> 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<PageWidget*>(d->tabWidget->widget(index));
if (pageWidget) {
QString itemNode = d->tabWidget->tabText(d->tabWidget->currentIndex());
QMap<QString, QVariant> map;
OptionUtils::readJsonSection(OptionUtils::getJsonFilePath(),
kCATEGORY_CODEGEEX, itemNode, map);
pageWidget->setUserConfig(map);
}
}
}

28 changes: 28 additions & 0 deletions src/plugins/codegeex/option/codegeexoptionwidget.h
Original file line number Diff line number Diff line change
@@ -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
114 changes: 114 additions & 0 deletions src/plugins/codegeex/option/detailwidget.cpp
Original file line number Diff line number Diff line change
@@ -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 <QJsonObject>
#include <QJsonDocument>
#include <QByteArray>
#include <QJsonArray>
#include <QFile>
#include <QDir>
#include <QRadioButton>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QHeaderView>
#include <QDebug>

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<QString, QVariant> &map)
{
CodeGeeXConfig config;
config.apiKey = d->apiKeyWidget->text();
dataToMap(config, map);

return true;
}

void DetailWidget::setControlValue(const QMap<QString, QVariant> &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<QString, QVariant> &map)
{
QMap<QString, QVariant> apiKey;
apiKey.insert(kApiKey, config.apiKey);

map.insert(tr("Detail"), apiKey);

return true;
}

bool DetailWidget::mapToData(const QMap<QString, QVariant> &map, CodeGeeXConfig &config)
{
QMap<QString, QVariant> detail = map.value(tr("Detail")).toMap();
config.apiKey = detail.value(kApiKey).toString();

return true;
}

void DetailWidget::setUserConfig(const QMap<QString, QVariant> &map)
{
setControlValue(map);
}

void DetailWidget::getUserConfig(QMap<QString, QVariant> &map)
{
getControlValue(map);
}
43 changes: 43 additions & 0 deletions src/plugins/codegeex/option/detailwidget.h
Original file line number Diff line number Diff line change
@@ -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<QString, QVariant> &map) override;
void getUserConfig(QMap<QString, QVariant> &map) override;

signals:

public slots:

private:
void setupUi();
void updateUi();

bool dataToMap(const CodeGeeXConfig &config, QMap<QString, QVariant> &map);
bool mapToData(const QMap<QString, QVariant> &map, CodeGeeXConfig &config);

bool getControlValue(QMap<QString, QVariant> &map);
void setControlValue(const QMap<QString, QVariant> &map);

DetailWidgetPrivate *const d;
};

#endif // DETAILWIDGET_H
Loading

0 comments on commit 8693515

Please sign in to comment.