KTextAddons

textautogeneratewidget.cpp
1/*
2 SPDX-FileCopyrightText: 2025 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "textautogeneratewidget.h"
8#include "core/textautogeneratechatmodel.h"
9#include "core/textautogenerateengineloader.h"
10#include "core/textautogenerateengineutil.h"
11#include "core/textautogeneratemanager.h"
12#include "core/textautogeneratemessage.h"
13#include "core/textautogeneratetextclient.h"
14#include "core/textautogeneratetextplugin.h"
15#include "textautogeneratetextwidget_debug.h"
16#include "widgets/textautogenerateheaderwidget.h"
17#include "widgets/textautogeneratehistorywidget.h"
18#include "widgets/textautogenerateresultwidget.h"
19#include "widgets/textautogeneratetextlineeditwidget.h"
20
21#include <KConfigGroup>
22#include <KSharedConfig>
23#include <KSplitterCollapserButton>
24#include <QKeyEvent>
25#include <QSplitter>
26#include <QVBoxLayout>
27
28using namespace TextAutogenerateText;
29TextAutogenerateWidget::TextAutogenerateWidget(QWidget *parent)
30 : QWidget{parent}
31 , mTextAutogenerateResultWidget(new TextAutogenerateResultWidget(this))
32 , mTextAutogenerateTextLineEditWidget(new TextAutogenerateTextLineEditWidget(this))
33 , mSplitter(new QSplitter(this))
34 , mHistoryWidget(new TextAutogenerateHistoryWidget(this))
35 , mHeaderWidget(new TextAutogenerateHeaderWidget(this))
36{
37 auto mainLayout = new QVBoxLayout(this);
38 mainLayout->setObjectName(QStringLiteral("mainLayout"));
39 mainLayout->setContentsMargins(QMargins{});
40 mHeaderWidget->setObjectName(QStringLiteral("mHeaderWidget"));
41 mainLayout->addWidget(mHeaderWidget);
42
43 mSplitter->setOrientation(Qt::Horizontal);
44 mSplitter->setObjectName(QStringLiteral("mSplitter"));
45
46 mainLayout->addWidget(mSplitter, 1);
47
48 mTextAutogenerateResultWidget->setObjectName(QStringLiteral("mTextAutogenerateResultWidget"));
49
50 mHistoryWidget->setObjectName(QStringLiteral("mHistoryWidget"));
51 mSplitter->addWidget(mHistoryWidget);
52 mSplitter->addWidget(mTextAutogenerateResultWidget);
53
54 new KSplitterCollapserButton(mHistoryWidget, mSplitter);
55
56 mTextAutogenerateTextLineEditWidget->setObjectName(QStringLiteral("mTextAutogenerateTextLineEditWidget"));
57 mainLayout->addWidget(mTextAutogenerateTextLineEditWidget);
58 connect(mTextAutogenerateTextLineEditWidget, &TextAutogenerateTextLineEditWidget::editingFinished, this, &TextAutogenerateWidget::slotEditingFinished);
59
60 connect(mHeaderWidget, &TextAutogenerateHeaderWidget::configChanged, this, &TextAutogenerateWidget::slotConfigureChanged);
61 connect(mHeaderWidget, &TextAutogenerateHeaderWidget::clearModel, this, &TextAutogenerateWidget::slotClearModel);
62
63 connect(TextAutogenerateManager::self(), &TextAutogenerateManager::sendMessageRequested, this, [this](const QString &str) {
64 slotEditingFinished(str, {});
65 });
66
67 connect(mTextAutogenerateTextLineEditWidget, &TextAutogenerateTextLineEditWidget::keyPressed, this, &TextAutogenerateWidget::keyPressedInLineEdit);
68 connect(mTextAutogenerateResultWidget, &TextAutogenerateResultWidget::editMessage, this, &TextAutogenerateWidget::slotEditMessage);
69 connect(mTextAutogenerateResultWidget, &TextAutogenerateResultWidget::cancelRequest, this, &TextAutogenerateWidget::slotCancelRequest);
70 connect(mHistoryWidget, &TextAutogenerateHistoryWidget::goToDiscussion, mTextAutogenerateResultWidget, &TextAutogenerateResultWidget::goToDiscussion);
71 loadEngine();
72 readConfig();
73}
74
75TextAutogenerateWidget::~TextAutogenerateWidget()
76{
77 if (mTextAutogeneratePlugin) {
78 mTextAutogeneratePlugin->cancelRequest({});
79 mTextAutogeneratePlugin->deleteLater();
80 }
81 writeConfig();
82}
83
84void TextAutogenerateWidget::keyPressedInLineEdit(QKeyEvent *ev)
85{
86 const int key = ev->key();
87 if (key == Qt::Key_Escape) {
88 ev->accept();
89 // TODO
90 } else {
91 mTextAutogenerateResultWidget->handleKeyPressEvent(ev);
92 }
93}
94
95void TextAutogenerateWidget::slotClearModel()
96{
97 TextAutogenerateManager::self()->textAutoGenerateChatModel()->resetConversation();
98}
99
100void TextAutogenerateWidget::writeConfig()
101{
102 KConfigGroup group(KSharedConfig::openStateConfig(), QStringLiteral("TextAutogenerateWidget"));
103 group.writeEntry("mainSplitter", mSplitter->sizes());
104}
105
106void TextAutogenerateWidget::readConfig()
107{
108 KConfigGroup group(KSharedConfig::openStateConfig(), QStringLiteral("TextAutogenerateWidget"));
109 const QList<int> size = {100, 400};
110
111 mSplitter->setSizes(group.readEntry("mainSplitter", size));
112}
113
114QString TextAutogenerateWidget::textLineEdit() const
115{
116 return mTextAutogenerateTextLineEditWidget->text();
117}
118
119void TextAutogenerateWidget::loadEngine()
120{
121 if (mTextAutogeneratePlugin) {
122 disconnect(mTextAutogeneratePlugin);
123 delete mTextAutogeneratePlugin;
124 mTextAutogeneratePlugin = nullptr;
125 }
126 // TODO connect(TextAutogenerateText::TextAutogenerateEngineLoader::self(), &TextAutogenerateText::TextAutogenerateEngineLoader::noPluginsFound, this, &)
127 TextAutogenerateText::TextAutogenerateEngineLoader::self()->loadPlugins();
128
129 mTextAutogenerateClient =
130 TextAutogenerateText::TextAutogenerateEngineLoader::self()->createTextAutoGenerateTextClient(TextAutogenerateEngineUtil::loadEngine());
131 if (!mTextAutogenerateClient) {
132 const QString fallBackEngineName = TextAutogenerateText::TextAutogenerateEngineLoader::self()->fallbackFirstEngine();
133 if (!fallBackEngineName.isEmpty()) {
134 mTextAutogenerateClient = TextAutogenerateText::TextAutogenerateEngineLoader::self()->createTextAutoGenerateTextClient(fallBackEngineName);
135 }
136 }
137 if (mTextAutogenerateClient) {
138 mHeaderWidget->updateEngineName(TextAutogenerateText::TextAutogenerateEngineLoader::self()->generateDisplayName(mTextAutogenerateClient));
139 mTextAutogeneratePlugin = mTextAutogenerateClient->createTextAutogeneratePlugin();
140 connect(mTextAutogeneratePlugin, &TextAutogenerateText::TextAutogenerateTextPlugin::finished, this, &TextAutogenerateWidget::slotAutogenerateFinished);
141 connect(mTextAutogeneratePlugin,
142 &TextAutogenerateText::TextAutogenerateTextPlugin::errorOccurred,
143 this,
144 &TextAutogenerateWidget::slotAutogenerateFailed);
145 } else {
146 qCWarning(TEXTAUTOGENERATETEXT_WIDGET_LOG) << "Impossible to create client" << TextAutogenerateEngineUtil::loadEngine();
147 }
148}
149
150void TextAutogenerateWidget::slotConfigureChanged()
151{
152 loadEngine();
153}
154
155void TextAutogenerateWidget::slotEditingFinished(const QString &str, const QByteArray &uuid)
156{
157 if (uuid.isEmpty()) {
158 mTextAutogeneratePlugin->sendMessage(str);
159 } else {
160 mTextAutogeneratePlugin->editMessage(uuid, str);
161 }
162 mTextAutogenerateResultWidget->editingFinished(uuid);
163}
164
165void TextAutogenerateWidget::slotAutogenerateFinished(const TextAutoGenerateMessage &msg)
166{
167 qDebug() << " TextAutogenerateWidget::slotAutogenerateFinished " << msg;
168 // mTextAutogenerateResultWidget->addMessage(msg);
169}
170
171void TextAutogenerateWidget::slotAutogenerateFailed(const QString &errorMessage)
172{
173 qDebug() << " TextAutogenerateWidget::slotAutogenerateFailed " << errorMessage;
174 // TODO report error
175}
176
177void TextAutogenerateWidget::slotEditMessage(const QModelIndex &index)
178{
179 const QByteArray uuid = index.data(TextAutoGenerateChatModel::UuidRole).toByteArray();
180 const QString messageStr = index.data(TextAutoGenerateChatModel::MessageRole).toString();
181 mTextAutogenerateTextLineEditWidget->setUuid(uuid);
182 mTextAutogenerateTextLineEditWidget->setText(messageStr);
183}
184
185void TextAutogenerateWidget::slotCancelRequest(const QByteArray &uuid)
186{
187 mTextAutogeneratePlugin->cancelRequest(uuid);
188}
189
190#include "moc_textautogeneratewidget.cpp"
static KSharedConfig::Ptr openStateConfig(const QString &fileName=QString())
KCALUTILS_EXPORT QString errorMessage(const KCalendarCore::Exception &exception)
bool isEmpty() const const
void accept()
int key() const const
QVariant data(int role) const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool disconnect(const QMetaObject::Connection &connection)
bool isEmpty() const const
Key_Escape
Horizontal
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QByteArray toByteArray() const const
QString toString() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri May 2 2025 12:06:03 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.