diff --git a/Makefile b/Makefile index 2886da5..ca24272 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ kf5: # --- KF6 Install (default) --- -install: +install: build @echo "=== Installing ollie-kde (KF6) ===" # Binaries install -m755 $(BUILD_DIR)/ollie-tray /usr/bin/ diff --git a/kate/ollie_kate.cpp b/kate/ollie_kate.cpp index abfe37c..7d80db7 100644 --- a/kate/ollie_kate.cpp +++ b/kate/ollie_kate.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -71,25 +72,49 @@ KTextEditor::ConfigPage *OllieKatePlugin::configPage(int number, QWidget *parent : KTextEditor::ConfigPage(parent), m_plugin(plugin) { auto *layout = new QFormLayout(this); + + // Default session backend/model + m_defaultBackendEdit = new QLineEdit(this); + m_defaultBackendEdit->setPlaceholderText(QStringLiteral("(use OLLIE_BACKEND)")); + m_defaultModelEdit = new QLineEdit(this); + m_defaultModelEdit->setPlaceholderText(QStringLiteral("(use OLLIE_MODEL)")); + + layout->addRow(QStringLiteral("Default backend:"), m_defaultBackendEdit); + layout->addRow(QStringLiteral("Default model:"), m_defaultModelEdit); + + auto *defaultNote = new QLabel( + QStringLiteral("Override OLLIE_BACKEND / OLLIE_MODEL for chat sessions."), + this); + defaultNote->setWordWrap(true); + defaultNote->setStyleSheet(QStringLiteral("color: gray;")); + layout->addRow(defaultNote); + + // Completion backend/model m_backendEdit = new QLineEdit(this); - m_backendEdit->setPlaceholderText(QStringLiteral("(use server default)")); + m_backendEdit->setPlaceholderText(QStringLiteral("(use OLLIE_COMPLETE_BACKEND)")); m_modelEdit = new QLineEdit(this); - m_modelEdit->setPlaceholderText(QStringLiteral("(use server default)")); + m_modelEdit->setPlaceholderText(QStringLiteral("(use OLLIE_COMPLETE_MODEL)")); layout->addRow(QStringLiteral("Completion backend:"), m_backendEdit); layout->addRow(QStringLiteral("Completion model:"), m_modelEdit); auto *note = new QLabel( - QStringLiteral("Leave blank to use the server's OLLIE_COMPLETE_BACKEND / OLLIE_COMPLETE_MODEL."), + QStringLiteral("Override OLLIE_COMPLETE_BACKEND / OLLIE_COMPLETE_MODEL for ghost text."), this); note->setWordWrap(true); note->setStyleSheet(QStringLiteral("color: gray;")); layout->addRow(note); + m_enabledCheck = new QCheckBox(QStringLiteral("Completion enabled on startup"), this); + layout->addRow(m_enabledCheck); + reset(); + connect(m_enabledCheck, &QCheckBox::toggled, this, &ConfigPage::changed); connect(m_backendEdit, &QLineEdit::textChanged, this, &ConfigPage::changed); connect(m_modelEdit, &QLineEdit::textChanged, this, &ConfigPage::changed); + connect(m_defaultBackendEdit, &QLineEdit::textChanged, this, &ConfigPage::changed); + connect(m_defaultModelEdit, &QLineEdit::textChanged, this, &ConfigPage::changed); } QString name() const override { return QStringLiteral("Ollie"); } @@ -97,22 +122,34 @@ KTextEditor::ConfigPage *OllieKatePlugin::configPage(int number, QWidget *parent QIcon icon() const override { return QIcon::fromTheme(QStringLiteral("system-run")); } void apply() override { + m_plugin->setDefaultBackend(m_defaultBackendEdit->text().trimmed()); + m_plugin->setDefaultModel(m_defaultModelEdit->text().trimmed()); m_plugin->setCompletionBackend(m_backendEdit->text().trimmed()); m_plugin->setCompletionModel(m_modelEdit->text().trimmed()); + m_plugin->setCompletionEnabled(m_enabledCheck->isChecked()); } void reset() override { + m_defaultBackendEdit->setText(m_plugin->defaultBackend()); + m_defaultModelEdit->setText(m_plugin->defaultModel()); m_backendEdit->setText(m_plugin->completionBackend()); m_modelEdit->setText(m_plugin->completionModel()); + m_enabledCheck->setChecked(m_plugin->completionEnabled()); } void defaults() override { + m_defaultBackendEdit->clear(); + m_defaultModelEdit->clear(); m_backendEdit->clear(); m_modelEdit->clear(); + m_enabledCheck->setChecked(true); } private: OllieKatePlugin *m_plugin; + QLineEdit *m_defaultBackendEdit; + QLineEdit *m_defaultModelEdit; QLineEdit *m_backendEdit; QLineEdit *m_modelEdit; + QCheckBox *m_enabledCheck; }; return new OllieConfigPage(this, parent); @@ -133,11 +170,37 @@ void OllieKatePlugin::setCompletionModel(const QString &model) saveConfig(); } +bool OllieKatePlugin::completionEnabled() const { return m_completionEnabled; } + +void OllieKatePlugin::setCompletionEnabled(bool enabled) +{ + m_completionEnabled = enabled; + saveConfig(); +} + +QString OllieKatePlugin::defaultBackend() const { return m_defaultBackend; } +QString OllieKatePlugin::defaultModel() const { return m_defaultModel; } + +void OllieKatePlugin::setDefaultBackend(const QString &backend) +{ + m_defaultBackend = backend; + saveConfig(); +} + +void OllieKatePlugin::setDefaultModel(const QString &model) +{ + m_defaultModel = model; + saveConfig(); +} + void OllieKatePlugin::loadConfig() { KConfigGroup grp(KSharedConfig::openConfig(), QStringLiteral("Ollie")); m_completionBackend = grp.readEntry("CompletionBackend", QString()); m_completionModel = grp.readEntry("CompletionModel", QString()); + m_completionEnabled = grp.readEntry("CompletionEnabled", true); + m_defaultBackend = grp.readEntry("DefaultBackend", QString()); + m_defaultModel = grp.readEntry("DefaultModel", QString()); } void OllieKatePlugin::saveConfig() @@ -145,6 +208,9 @@ void OllieKatePlugin::saveConfig() KConfigGroup grp(KSharedConfig::openConfig(), QStringLiteral("Ollie")); grp.writeEntry("CompletionBackend", m_completionBackend); grp.writeEntry("CompletionModel", m_completionModel); + grp.writeEntry("CompletionEnabled", m_completionEnabled); + grp.writeEntry("DefaultBackend", m_defaultBackend); + grp.writeEntry("DefaultModel", m_defaultModel); grp.sync(); } @@ -187,11 +253,24 @@ OllieKateView::OllieKateView(OllieKatePlugin *plugin, KTextEditor::MainWindow *m layout->addWidget(m_cwdLabel); // Completion status indicator (in the main window status bar) - m_completionStatus = new QLabel(QStringLiteral("✦ completion on")); - m_completionStatus->setFont(smallFont); - m_completionStatus->setStyleSheet(QStringLiteral("color: green; padding: 0px 4px;")); + bool startEnabled = m_plugin->completionEnabled(); if (auto *win = qobject_cast(m_mainWindow->window())) { - win->statusBar()->addPermanentWidget(m_completionStatus); + // Reuse existing widget if another view already created it + m_completionStatus = win->statusBar()->findChild(QStringLiteral("ollie_completion_status")); + if (!m_completionStatus) { + m_completionStatus = new QLabel(); + m_completionStatus->setObjectName(QStringLiteral("ollie_completion_status")); + m_completionStatus->setFont(smallFont); + win->statusBar()->addPermanentWidget(m_completionStatus); + } + m_completionStatus->setText(startEnabled + ? QStringLiteral("✦ completion on") + : QStringLiteral("✦ completion off")); + m_completionStatus->setStyleSheet(startEnabled + ? QStringLiteral("color: green; padding: 0px 4px;") + : QStringLiteral("color: gray; padding: 0px 4px;")); + } else { + m_completionStatus = nullptr; } // Button bar @@ -386,7 +465,9 @@ void OllieKateView::newSession() cwd = QDir::homePath(); } - QDBusReply reply = m_iface->call("CreateSession", cwd, QString(), QString(), "default"); + QString backend = m_plugin->defaultBackend(); + QString model = m_plugin->defaultModel(); + QDBusReply reply = m_iface->call("CreateSession", cwd, backend, model, "default"); if (reply.isValid()) { m_sessionId = reply.value(); m_chatView->clear(); @@ -605,6 +686,7 @@ void OllieKateView::setupGhostProvider() // Create new ghost provider for the active view m_ghost = new OllieGhostProvider(view, m_iface, m_plugin, view); + m_ghost->setEnabled(m_plugin->completionEnabled()); // Install event filter on the view widget for Tab interception if (QWidget *proxy = view->focusProxy()) { diff --git a/kate/ollie_kate.h b/kate/ollie_kate.h index 0894c76..97289da 100644 --- a/kate/ollie_kate.h +++ b/kate/ollie_kate.h @@ -41,6 +41,14 @@ public: QString completionModel() const; void setCompletionBackend(const QString &backend); void setCompletionModel(const QString &model); + bool completionEnabled() const; + void setCompletionEnabled(bool enabled); + + // Default session backend/model (overrides OLLIE_BACKEND / OLLIE_MODEL) + QString defaultBackend() const; + QString defaultModel() const; + void setDefaultBackend(const QString &backend); + void setDefaultModel(const QString &model); private: void loadConfig(); @@ -48,6 +56,9 @@ private: QString m_completionBackend; QString m_completionModel; + bool m_completionEnabled = true; + QString m_defaultBackend; + QString m_defaultModel; }; class OllieKateView : public QObject