#pragma once #include #include #include #include #include #include #include #include #include #include class KateAiPlugin : public KTextEditor::Plugin { Q_OBJECT private: QWebSocket m_webSocket; QUrl m_serverUrl; private: void onConnected(); int configPages() const override { return 1; } KTextEditor::ConfigPage *configPage(int number = 0, QWidget *parent = nullptr) override; public: explicit KateAiPlugin(QObject *parent = nullptr, const QList & = QList()); ~KateAiPlugin() override; QObject *createView(KTextEditor::MainWindow *mainWindow) override; void readConfig(); void reconnect(); Q_SIGNAL void instructChanged(); }; class KateAiPluginView : public QObject, public KXMLGUIClient { Q_OBJECT private: struct Request { KTextEditor::Cursor cursor; QPointer document; }; KTextEditor::MainWindow *m_mainWindow; QPointer m_webSocket; QHash m_requests; bool m_useInstruct = false; private: void generate(); void socketMessage(const QString& message); static QStringList getIncludePaths(const QString& text); QString assembleContext(QPointer document, const KTextEditor::Cursor& cursor); QPointer activeDocument() const; KTextEditor::Cursor getCurrentCursor() const; public: KateAiPluginView(KateAiPlugin *plugin, KTextEditor::MainWindow *mainwindow, QPointer webSocket, bool instruct = false); ~KateAiPluginView() override; void setInstruct(bool instruct); Q_SIGNAL void reconnect(); };