mirror of
https://github.com/Palm1r/QodeAssist.git
synced 2026-06-13 01:39:13 -04:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
abb3351246 | ||
|
|
57eeb32ceb | ||
|
|
74eed49fb4 | ||
|
|
43a30281b6 | ||
|
|
bf4307c459 | ||
|
|
6df70e608b | ||
|
|
ee1bf4ffe5 |
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "AgentRoleController.hpp"
|
#include "AgentRoleController.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ qt_add_qml_module(QodeAssistChatView
|
|||||||
icons/window-unlock.svg
|
icons/window-unlock.svg
|
||||||
icons/chat-icon.svg
|
icons/chat-icon.svg
|
||||||
icons/chat-pause-icon.svg
|
icons/chat-pause-icon.svg
|
||||||
|
icons/warning-icon.svg
|
||||||
icons/new-chat-icon.svg
|
icons/new-chat-icon.svg
|
||||||
icons/rules-icon.svg
|
icons/rules-icon.svg
|
||||||
icons/context-icon.svg
|
icons/context-icon.svg
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ChatCompressor.hpp"
|
#include "ChatCompressor.hpp"
|
||||||
|
|
||||||
@@ -75,6 +76,8 @@ void ChatCompressor::startCompression(const QString &chatFilePath, ChatModel *ch
|
|||||||
const QString customEndpoint = Settings::generalSettings().caCustomEndpoint();
|
const QString customEndpoint = Settings::generalSettings().caCustomEndpoint();
|
||||||
const QString endpoint = !customEndpoint.isEmpty() ? customEndpoint
|
const QString endpoint = !customEndpoint.isEmpty() ? customEndpoint
|
||||||
: promptTemplate->endpoint();
|
: promptTemplate->endpoint();
|
||||||
|
m_provider->client()->setTransferTimeout(
|
||||||
|
static_cast<int>(Settings::generalSettings().requestTimeout() * 1000));
|
||||||
m_currentRequestId = m_provider->sendRequest(
|
m_currentRequestId = m_provider->sendRequest(
|
||||||
QUrl(Settings::generalSettings().caUrl()), payload, endpoint);
|
QUrl(Settings::generalSettings().caUrl()), payload, endpoint);
|
||||||
LOG_MESSAGE(QString("Starting compression request: %1").arg(m_currentRequestId));
|
LOG_MESSAGE(QString("Starting compression request: %1").arg(m_currentRequestId));
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ChatConfigurationController.hpp"
|
#include "ChatConfigurationController.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ChatFileManager.hpp"
|
#include "ChatFileManager.hpp"
|
||||||
#include "Logger.hpp"
|
#include "Logger.hpp"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ChatHistoryStore.hpp"
|
#include "ChatHistoryStore.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ChatModel.hpp"
|
#include "ChatModel.hpp"
|
||||||
#include <utils/aspects.h>
|
#include <utils/aspects.h>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ChatRootView.hpp"
|
#include "ChatRootView.hpp"
|
||||||
|
|
||||||
@@ -10,6 +11,7 @@
|
|||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
#include <QKeySequence>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QQmlContext>
|
#include <QQmlContext>
|
||||||
#include <QQmlEngine>
|
#include <QQmlEngine>
|
||||||
@@ -52,6 +54,21 @@ bool isChatEditor(Core::IEditor *editor)
|
|||||||
return editor && editor->document()
|
return editor && editor->document()
|
||||||
&& editor->document()->id() == Utils::Id(Constants::QODE_ASSIST_CHAT_EDITOR_ID);
|
&& editor->document()->id() == Utils::Id(Constants::QODE_ASSIST_CHAT_EDITOR_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QKeySequence sendMessageKeySequence()
|
||||||
|
{
|
||||||
|
auto command = Core::ActionManager::command(Constants::QODE_ASSIST_CHAT_SEND_MESSAGE);
|
||||||
|
if (!command)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
QKeySequence sequence = command->keySequence();
|
||||||
|
if (sequence.isEmpty()) {
|
||||||
|
const QList<QKeySequence> defaults = command->defaultKeySequences();
|
||||||
|
if (!defaults.isEmpty())
|
||||||
|
sequence = defaults.constFirst();
|
||||||
|
}
|
||||||
|
return sequence;
|
||||||
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
ChatRootView::ChatRootView(QQuickItem *parent)
|
ChatRootView::ChatRootView(QQuickItem *parent)
|
||||||
@@ -76,6 +93,22 @@ ChatRootView::ChatRootView(QQuickItem *parent)
|
|||||||
this,
|
this,
|
||||||
[this]() { setIsSyncOpenFiles(Settings::chatAssistantSettings().linkOpenFiles()); });
|
[this]() { setIsSyncOpenFiles(Settings::chatAssistantSettings().linkOpenFiles()); });
|
||||||
|
|
||||||
|
QMetaObject::invokeMethod(
|
||||||
|
this,
|
||||||
|
[this] {
|
||||||
|
if (auto sendCommand
|
||||||
|
= Core::ActionManager::command(Constants::QODE_ASSIST_CHAT_SEND_MESSAGE)) {
|
||||||
|
connect(
|
||||||
|
sendCommand,
|
||||||
|
&Core::Command::keySequenceChanged,
|
||||||
|
this,
|
||||||
|
&ChatRootView::sendShortcutTextChanged,
|
||||||
|
Qt::UniqueConnection);
|
||||||
|
}
|
||||||
|
emit sendShortcutTextChanged();
|
||||||
|
},
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
|
||||||
auto &settings = Settings::generalSettings();
|
auto &settings = Settings::generalSettings();
|
||||||
|
|
||||||
connect(
|
connect(
|
||||||
@@ -743,6 +776,32 @@ void ChatRootView::calculateMessageTokensCount(const QString &message)
|
|||||||
m_tokenCounter->setMessage(message);
|
m_tokenCounter->setMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ChatRootView::isSendShortcut(int key, int modifiers) const
|
||||||
|
{
|
||||||
|
const QKeySequence sequence = sendMessageKeySequence();
|
||||||
|
if (sequence.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const QKeyCombination combination = sequence[0];
|
||||||
|
const int sequenceKey = combination.key();
|
||||||
|
|
||||||
|
const int relevantMask = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier
|
||||||
|
| Qt::MetaModifier;
|
||||||
|
const int sequenceModifiers = combination.keyboardModifiers() & relevantMask;
|
||||||
|
const int eventModifiers = modifiers & relevantMask;
|
||||||
|
|
||||||
|
const bool isReturnLike = sequenceKey == Qt::Key_Return || sequenceKey == Qt::Key_Enter;
|
||||||
|
const bool keyMatches = key == sequenceKey
|
||||||
|
|| (isReturnLike && (key == Qt::Key_Return || key == Qt::Key_Enter));
|
||||||
|
|
||||||
|
return keyMatches && eventModifiers == sequenceModifiers;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ChatRootView::sendShortcutText() const
|
||||||
|
{
|
||||||
|
return sendMessageKeySequence().toString(QKeySequence::NativeText);
|
||||||
|
}
|
||||||
|
|
||||||
void ChatRootView::setIsSyncOpenFiles(bool state)
|
void ChatRootView::setIsSyncOpenFiles(bool state)
|
||||||
{
|
{
|
||||||
if (m_isSyncOpenFiles != state) {
|
if (m_isSyncOpenFiles != state) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
@@ -49,6 +50,7 @@ class ChatRootView : public QQuickItem
|
|||||||
Q_PROPERTY(int activeRulesCount READ activeRulesCount NOTIFY activeRulesCountChanged FINAL)
|
Q_PROPERTY(int activeRulesCount READ activeRulesCount NOTIFY activeRulesCountChanged FINAL)
|
||||||
Q_PROPERTY(bool useTools READ useTools WRITE setUseTools NOTIFY useToolsChanged FINAL)
|
Q_PROPERTY(bool useTools READ useTools WRITE setUseTools NOTIFY useToolsChanged FINAL)
|
||||||
Q_PROPERTY(bool useThinking READ useThinking WRITE setUseThinking NOTIFY useThinkingChanged FINAL)
|
Q_PROPERTY(bool useThinking READ useThinking WRITE setUseThinking NOTIFY useThinkingChanged FINAL)
|
||||||
|
Q_PROPERTY(QString sendShortcutText READ sendShortcutText NOTIFY sendShortcutTextChanged FINAL)
|
||||||
|
|
||||||
Q_PROPERTY(int currentMessageTotalEdits READ currentMessageTotalEdits NOTIFY currentMessageEditsStatsChanged FINAL)
|
Q_PROPERTY(int currentMessageTotalEdits READ currentMessageTotalEdits NOTIFY currentMessageEditsStatsChanged FINAL)
|
||||||
Q_PROPERTY(int currentMessageAppliedEdits READ currentMessageAppliedEdits NOTIFY currentMessageEditsStatsChanged FINAL)
|
Q_PROPERTY(int currentMessageAppliedEdits READ currentMessageAppliedEdits NOTIFY currentMessageEditsStatsChanged FINAL)
|
||||||
@@ -98,6 +100,8 @@ public:
|
|||||||
Q_INVOKABLE void showAddImageDialog();
|
Q_INVOKABLE void showAddImageDialog();
|
||||||
Q_INVOKABLE bool isImageFile(const QString &filePath) const;
|
Q_INVOKABLE bool isImageFile(const QString &filePath) const;
|
||||||
Q_INVOKABLE void calculateMessageTokensCount(const QString &message);
|
Q_INVOKABLE void calculateMessageTokensCount(const QString &message);
|
||||||
|
Q_INVOKABLE bool isSendShortcut(int key, int modifiers) const;
|
||||||
|
QString sendShortcutText() const;
|
||||||
Q_INVOKABLE void setIsSyncOpenFiles(bool state);
|
Q_INVOKABLE void setIsSyncOpenFiles(bool state);
|
||||||
Q_INVOKABLE void openChatHistoryFolder();
|
Q_INVOKABLE void openChatHistoryFolder();
|
||||||
Q_INVOKABLE void openRulesFolder();
|
Q_INVOKABLE void openRulesFolder();
|
||||||
@@ -218,6 +222,7 @@ signals:
|
|||||||
|
|
||||||
void lastErrorMessageChanged();
|
void lastErrorMessageChanged();
|
||||||
void lastInfoMessageChanged();
|
void lastInfoMessageChanged();
|
||||||
|
void sendShortcutTextChanged();
|
||||||
void activeRulesChanged();
|
void activeRulesChanged();
|
||||||
void activeRulesCountChanged();
|
void activeRulesCountChanged();
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ChatSerializer.hpp"
|
#include "ChatSerializer.hpp"
|
||||||
#include "Logger.hpp"
|
#include "Logger.hpp"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ChatUtils.h"
|
#include "ChatUtils.h"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ChatView.hpp"
|
#include "ChatView.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ChatWidget.hpp"
|
#include "ChatWidget.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ClientInterface.hpp"
|
#include "ClientInterface.hpp"
|
||||||
|
|
||||||
@@ -337,6 +338,9 @@ void ClientInterface::sendMessage(
|
|||||||
provider->client()->setMaxToolContinuations(
|
provider->client()->setMaxToolContinuations(
|
||||||
Settings::toolsSettings().maxToolContinuations());
|
Settings::toolsSettings().maxToolContinuations());
|
||||||
|
|
||||||
|
provider->client()->setTransferTimeout(
|
||||||
|
static_cast<int>(Settings::generalSettings().requestTimeout() * 1000));
|
||||||
|
|
||||||
connect(
|
connect(
|
||||||
provider->client(),
|
provider->client(),
|
||||||
&::LLMQore::BaseClient::chunkReceived,
|
&::LLMQore::BaseClient::chunkReceived,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "FileEditController.hpp"
|
#include "FileEditController.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "FileItem.hpp"
|
#include "FileItem.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2026 Petr Mironychev
|
// Copyright (C) 2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "FileMentionItem.hpp"
|
#include "FileMentionItem.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2026 Petr Mironychev
|
// Copyright (C) 2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "InputTokenCounter.hpp"
|
#include "InputTokenCounter.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "SessionFileRegistry.hpp"
|
#include "SessionFileRegistry.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
5
ChatView/icons/warning-icon.svg
Normal file
5
ChatView/icons/warning-icon.svg
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M12 3L22 20H2L12 3Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
|
||||||
|
<path d="M12 10V14" stroke="black" stroke-width="2" stroke-linecap="round"/>
|
||||||
|
<path d="M12 17H12.01" stroke="black" stroke-width="2.4" stroke-linecap="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 350 B |
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
@@ -19,6 +20,9 @@ ChatRootView {
|
|||||||
colorGroup: SystemPalette.Active
|
colorGroup: SystemPalette.Active
|
||||||
}
|
}
|
||||||
|
|
||||||
|
property bool hasActiveError: false
|
||||||
|
readonly property color errorColor: "#d32f2f"
|
||||||
|
|
||||||
palette {
|
palette {
|
||||||
window: sysPalette.window
|
window: sysPalette.window
|
||||||
windowText: sysPalette.windowText
|
windowText: sysPalette.windowText
|
||||||
@@ -411,11 +415,10 @@ ChatRootView {
|
|||||||
QQC.TextArea {
|
QQC.TextArea {
|
||||||
id: messageInput
|
id: messageInput
|
||||||
|
|
||||||
placeholderText: Qt.platform.os === "osx"
|
placeholderText: qsTr("Type your message here... (%1 to send)").arg(root.sendShortcutText)
|
||||||
? qsTr("Type your message here... (⌘+↩ to send)")
|
|
||||||
: qsTr("Type your message here... (Ctrl+Enter to send)")
|
|
||||||
placeholderTextColor: palette.mid
|
placeholderTextColor: palette.mid
|
||||||
color: palette.text
|
color: palette.text
|
||||||
|
wrapMode: TextArea.Wrap
|
||||||
background: Rectangle {
|
background: Rectangle {
|
||||||
radius: 2
|
radius: 2
|
||||||
color: palette.base
|
color: palette.base
|
||||||
@@ -494,6 +497,9 @@ ChatRootView {
|
|||||||
skillCommandPopup.dismiss()
|
skillCommandPopup.dismiss()
|
||||||
event.accepted = true
|
event.accepted = true
|
||||||
}
|
}
|
||||||
|
} else if (root.isSendShortcut(event.key, event.modifiers)) {
|
||||||
|
root.sendChatMessage()
|
||||||
|
event.accepted = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -586,13 +592,21 @@ ChatRootView {
|
|||||||
Layout.preferredHeight: 40
|
Layout.preferredHeight: 40
|
||||||
|
|
||||||
isCompressing: root.isCompressing
|
isCompressing: root.isCompressing
|
||||||
|
isProcessing: root.isRequestInProgress
|
||||||
sendButton.onClicked: !root.isRequestInProgress ? root.sendChatMessage()
|
sendButton.onClicked: !root.isRequestInProgress ? root.sendChatMessage()
|
||||||
: root.cancelRequest()
|
: root.cancelRequest()
|
||||||
sendButton.icon.source: !root.isRequestInProgress ? "qrc:/qt/qml/ChatView/icons/chat-icon.svg"
|
sendButton.icon.source: root.isRequestInProgress
|
||||||
: "qrc:/qt/qml/ChatView/icons/chat-pause-icon.svg"
|
? ""
|
||||||
sendButton.text: !root.isRequestInProgress ? qsTr("Send") : qsTr("Stop")
|
: (root.hasActiveError ? "qrc:/qt/qml/ChatView/icons/warning-icon.svg"
|
||||||
sendButtonTooltip.text: !root.isRequestInProgress ? qsTr("Send message to LLM %1").arg(Qt.platform.os === "osx" ? "Cmd+Return" : "Ctrl+Return")
|
: "qrc:/qt/qml/ChatView/icons/chat-icon.svg")
|
||||||
: qsTr("Stop")
|
sendButton.text: root.isRequestInProgress ? qsTr("Stop") : qsTr("Send")
|
||||||
|
sendButton.accentColor: (root.hasActiveError && !root.isRequestInProgress)
|
||||||
|
? root.errorColor : "transparent"
|
||||||
|
sendButtonTooltip.text: root.isRequestInProgress
|
||||||
|
? qsTr("Stop")
|
||||||
|
: (root.hasActiveError
|
||||||
|
? root.lastErrorMessage
|
||||||
|
: qsTr("Send message to LLM %1").arg(root.sendShortcutText))
|
||||||
compressButton.onClicked: compressConfirmDialog.open()
|
compressButton.onClicked: compressConfirmDialog.open()
|
||||||
cancelCompressButton.onClicked: root.cancelCompression()
|
cancelCompressButton.onClicked: root.cancelCompression()
|
||||||
syncOpenFiles {
|
syncOpenFiles {
|
||||||
@@ -667,6 +681,7 @@ ChatRootView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sendChatMessage() {
|
function sendChatMessage() {
|
||||||
|
root.hasActiveError = false
|
||||||
root.sendMessage(fileMentionPopup.expandMentions(messageInput.text))
|
root.sendMessage(fileMentionPopup.expandMentions(messageInput.text))
|
||||||
messageInput.text = ""
|
messageInput.text = ""
|
||||||
fileMentionPopup.clearMentions()
|
fileMentionPopup.clearMentions()
|
||||||
@@ -689,13 +704,122 @@ ChatRootView {
|
|||||||
onAccepted: root.compressCurrentChat()
|
onAccepted: root.compressCurrentChat()
|
||||||
}
|
}
|
||||||
|
|
||||||
Toast {
|
Rectangle {
|
||||||
id: errorToast
|
id: errorBanner
|
||||||
z: 1000
|
|
||||||
|
|
||||||
color: Qt.rgba(0.8, 0.2, 0.2, 0.9)
|
z: 1000
|
||||||
border.color: Qt.darker(infoToast.color, 1.3)
|
visible: root.hasActiveError && root.lastErrorMessage.length > 0
|
||||||
toastTextColor: "#FFFFFF"
|
|
||||||
|
width: parent.width / 2
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.rightMargin: 10
|
||||||
|
anchors.bottomMargin: bottomBar.height + 48
|
||||||
|
|
||||||
|
height: visible ? errorRow.implicitHeight + 12 : 0
|
||||||
|
|
||||||
|
color: Qt.rgba(0.83, 0.18, 0.18, 0.96)
|
||||||
|
radius: 6
|
||||||
|
border.color: Qt.darker(color, 1.3)
|
||||||
|
border.width: 1
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
id: errorRow
|
||||||
|
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.leftMargin: 10
|
||||||
|
anchors.rightMargin: 6
|
||||||
|
spacing: 8
|
||||||
|
|
||||||
|
TextEdit {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: root.lastErrorMessage
|
||||||
|
color: "#FFFFFF"
|
||||||
|
font.pixelSize: 12
|
||||||
|
wrapMode: TextEdit.Wrap
|
||||||
|
readOnly: true
|
||||||
|
selectByMouse: true
|
||||||
|
selectionColor: Qt.darker(errorBanner.color, 1.3)
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: copyErrorButton
|
||||||
|
|
||||||
|
property bool copied: false
|
||||||
|
|
||||||
|
Layout.alignment: Qt.AlignTop
|
||||||
|
implicitWidth: copyErrorLabel.implicitWidth + 18
|
||||||
|
implicitHeight: 22
|
||||||
|
radius: 4
|
||||||
|
color: copyErrorMouse.containsMouse ? Qt.rgba(1, 1, 1, 0.28)
|
||||||
|
: Qt.rgba(1, 1, 1, 0.16)
|
||||||
|
border.color: Qt.rgba(1, 1, 1, 0.45)
|
||||||
|
border.width: 1
|
||||||
|
|
||||||
|
Behavior on color { ColorAnimation { duration: 120 } }
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: copyErrorLabel
|
||||||
|
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: copyErrorButton.copied ? qsTr("Copied") : qsTr("Copy")
|
||||||
|
color: "#FFFFFF"
|
||||||
|
font.pixelSize: 12
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: copyErrorMouse
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
onClicked: {
|
||||||
|
root.copyToClipboard(root.lastErrorMessage)
|
||||||
|
copyErrorButton.copied = true
|
||||||
|
copyErrorResetTimer.restart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: copyErrorResetTimer
|
||||||
|
|
||||||
|
interval: 1500
|
||||||
|
onTriggered: copyErrorButton.copied = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: closeErrorButton
|
||||||
|
|
||||||
|
Layout.alignment: Qt.AlignTop
|
||||||
|
implicitWidth: 22
|
||||||
|
implicitHeight: 22
|
||||||
|
radius: 4
|
||||||
|
color: closeErrorMouse.containsMouse ? Qt.rgba(1, 1, 1, 0.28) : "transparent"
|
||||||
|
border.color: Qt.rgba(1, 1, 1, 0.45)
|
||||||
|
border.width: closeErrorMouse.containsMouse ? 1 : 0
|
||||||
|
|
||||||
|
Behavior on color { ColorAnimation { duration: 120 } }
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: "✕"
|
||||||
|
color: "#FFFFFF"
|
||||||
|
font.pixelSize: 12
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: closeErrorMouse
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
onClicked: root.hasActiveError = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Toast {
|
Toast {
|
||||||
@@ -735,7 +859,7 @@ ChatRootView {
|
|||||||
target: root
|
target: root
|
||||||
function onLastErrorMessageChanged() {
|
function onLastErrorMessageChanged() {
|
||||||
if (root.lastErrorMessage.length > 0) {
|
if (root.lastErrorMessage.length > 0) {
|
||||||
errorToast.show(root.lastErrorMessage)
|
root.hasActiveError = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function onLastInfoMessageChanged() {
|
function onLastInfoMessageChanged() {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import ChatView
|
import ChatView
|
||||||
@@ -355,10 +356,9 @@ Rectangle {
|
|||||||
smooth: true
|
smooth: true
|
||||||
mipmap: true
|
mipmap: true
|
||||||
|
|
||||||
BusyIndicator {
|
QoABusyIndicator {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
running: imageDisplay.status === Image.Loading
|
running: imageDisplay.status === Image.Loading
|
||||||
visible: running
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Qt.labs.platform as Platform
|
import Qt.labs.platform as Platform
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Qt.labs.platform as Platform
|
import Qt.labs.platform as Platform
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Qt.labs.platform as Platform
|
import Qt.labs.platform as Platform
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
@@ -19,6 +20,7 @@ Rectangle {
|
|||||||
property alias cancelCompressButton: cancelCompressButtonId
|
property alias cancelCompressButton: cancelCompressButtonId
|
||||||
|
|
||||||
property bool isCompressing: false
|
property bool isCompressing: false
|
||||||
|
property bool isProcessing: false
|
||||||
property alias sendButtonTooltip: sendButtonTooltipId
|
property alias sendButtonTooltip: sendButtonTooltipId
|
||||||
|
|
||||||
color: palette.window.hslLightness > 0.5 ?
|
color: palette.window.hslLightness > 0.5 ?
|
||||||
@@ -107,7 +109,7 @@ Rectangle {
|
|||||||
visible: root.isCompressing
|
visible: root.isCompressing
|
||||||
spacing: 6
|
spacing: 6
|
||||||
|
|
||||||
BusyIndicator {
|
QoABusyIndicator {
|
||||||
id: compressBusyIndicator
|
id: compressBusyIndicator
|
||||||
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
@@ -159,11 +161,24 @@ Rectangle {
|
|||||||
QoAButton {
|
QoAButton {
|
||||||
id: sendButtonId
|
id: sendButtonId
|
||||||
|
|
||||||
|
leftPadding: root.isProcessing ? 22 : 4
|
||||||
|
|
||||||
icon {
|
icon {
|
||||||
height: 15
|
height: 15
|
||||||
width: 15
|
width: 15
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QoABusyIndicator {
|
||||||
|
id: sendBusyIndicator
|
||||||
|
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 5
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
width: 14
|
||||||
|
height: 14
|
||||||
|
running: root.isProcessing
|
||||||
|
}
|
||||||
|
|
||||||
QoAToolTip {
|
QoAToolTip {
|
||||||
id: sendButtonTooltipId
|
id: sendButtonTooltipId
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2026 Petr Mironychev
|
// Copyright (C) 2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2026 Petr Mironychev
|
// Copyright (C) 2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// Copyright (C) 2025 Povilas Kanapickas <povilas@radix.lt>
|
// Copyright (C) 2025 Povilas Kanapickas <povilas@radix.lt>
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "CodeHandler.hpp"
|
#include "CodeHandler.hpp"
|
||||||
#include <settings/CodeCompletionSettings.hpp>
|
#include <settings/CodeCompletionSettings.hpp>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "ConfigurationManager.hpp"
|
#include "ConfigurationManager.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
21
LICENSE
21
LICENSE
@@ -1,3 +1,24 @@
|
|||||||
|
===============================================================
|
||||||
|
ADDITIONAL TERMS UNDER GPLv3 SECTION 7(b)
|
||||||
|
===============================================================
|
||||||
|
|
||||||
|
In accordance with Section 7(b) of the GNU General Public License v3.0,
|
||||||
|
the following additional attribution term applies to QodeAssist:
|
||||||
|
|
||||||
|
You must preserve all author attributions, copyright notices, and the
|
||||||
|
project name "QodeAssist" in all copies and modified versions,
|
||||||
|
including in source file headers, the plugin metadata
|
||||||
|
(QodeAssist.json.in), and the About dialog or equivalent user-facing
|
||||||
|
identification. Modified versions must be clearly marked as different
|
||||||
|
from the original.
|
||||||
|
|
||||||
|
This is a reasonable attribution requirement permitted under GPLv3
|
||||||
|
§7(b) and §7(c). It supplements the notice-preservation obligations of
|
||||||
|
§4 and §5.
|
||||||
|
|
||||||
|
Copyright (C) 2024-2026 Petr Mironychev
|
||||||
|
===============================================================
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 3, 29 June 2007
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "LLMClientInterface.hpp"
|
#include "LLMClientInterface.hpp"
|
||||||
|
|
||||||
@@ -353,6 +354,9 @@ void LLMClientInterface::handleCompletion(const QJsonObject &request)
|
|||||||
&LLMClientInterface::handleRequestFailed,
|
&LLMClientInterface::handleRequestFailed,
|
||||||
Qt::UniqueConnection);
|
Qt::UniqueConnection);
|
||||||
|
|
||||||
|
provider->client()->setTransferTimeout(
|
||||||
|
static_cast<int>(m_generalSettings.requestTimeout() * 1000));
|
||||||
|
|
||||||
auto requestId
|
auto requestId
|
||||||
= provider->sendRequest(QUrl(url), payload, resolveEndpoint(promptTemplate, isPreset1Active));
|
= provider->sendRequest(QUrl(url), payload, resolveEndpoint(promptTemplate, isPreset1Active));
|
||||||
m_activeRequests[requestId] = {request, provider};
|
m_activeRequests[requestId] = {request, provider};
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// Copyright (C) 2023 The Qt Company Ltd.
|
// Copyright (C) 2023 The Qt Company Ltd.
|
||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "LLMSuggestion.hpp"
|
#include "LLMSuggestion.hpp"
|
||||||
#include <texteditor/texteditor.h>
|
#include <texteditor/texteditor.h>
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"Id" : "qodeassist",
|
"Id" : "qodeassist",
|
||||||
"Name" : "QodeAssist",
|
"Name" : "QodeAssist",
|
||||||
"Version" : "0.9.19",
|
"Version" : "0.9.20",
|
||||||
"CompatVersion" : "${IDE_VERSION}",
|
"CompatVersion" : "${IDE_VERSION}",
|
||||||
"Vendor" : "Petr Mironychev",
|
"Vendor" : "Petr Mironychev",
|
||||||
"VendorId" : "petrmironychev",
|
"VendorId" : "petrmironychev",
|
||||||
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} Petr Mironychev, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
|
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} Petr Mironychev, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
|
||||||
"License" : "GPLv3",
|
"License" : "GPLv3 with additional attribution terms (§7b) — see LICENSE",
|
||||||
"Description": "QodeAssist is an AI-powered coding assistant for Qt Creator. It provides intelligent code completion and suggestions for your code. Prerequisites: Requires one of the supported LLM providers installed (e.g., Ollama or LM Studio) and a compatible large language model downloaded for your chosen provider (e.g., CodeLlama, StarCoder2).",
|
"Description": "QodeAssist is an AI-powered coding assistant for Qt Creator. It provides intelligent code completion and suggestions for your code. Prerequisites: Requires one of the supported LLM providers installed (e.g., Ollama or LM Studio) and a compatible large language model downloaded for your chosen provider (e.g., CodeLlama, StarCoder2).",
|
||||||
"Url" : "https://github.com/Palm1r/QodeAssist",
|
"Url" : "https://github.com/Palm1r/QodeAssist",
|
||||||
"DocumentationUrl" : "https://github.com/Palm1r/QodeAssist",
|
"DocumentationUrl" : "https://github.com/Palm1r/QodeAssist",
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "QodeAssistClient.hpp"
|
#include "QodeAssistClient.hpp"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// Copyright (C) 2023 The Qt Company Ltd.
|
// Copyright (C) 2023 The Qt Company Ltd.
|
||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "QuickRefactorHandler.hpp"
|
#include "QuickRefactorHandler.hpp"
|
||||||
|
|
||||||
@@ -143,6 +144,9 @@ void QuickRefactorHandler::prepareAndSendRequest(
|
|||||||
provider->client()->setMaxToolContinuations(
|
provider->client()->setMaxToolContinuations(
|
||||||
Settings::toolsSettings().maxToolContinuations());
|
Settings::toolsSettings().maxToolContinuations());
|
||||||
|
|
||||||
|
provider->client()->setTransferTimeout(
|
||||||
|
static_cast<int>(Settings::generalSettings().requestTimeout() * 1000));
|
||||||
|
|
||||||
m_isRefactoringInProgress = true;
|
m_isRefactoringInProgress = true;
|
||||||
|
|
||||||
connect(
|
connect(
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
39
README.md
39
README.md
@@ -590,6 +590,45 @@ cmake --build .
|
|||||||
|
|
||||||
For detailed development guidelines, architecture patterns, and best practices, see the [project workspace rules](.cursor/rules.mdc).
|
For detailed development guidelines, architecture patterns, and best practices, see the [project workspace rules](.cursor/rules.mdc).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
QodeAssist is licensed under the **GNU General Public License v3.0**
|
||||||
|
(see [`LICENSE`](LICENSE)), with **additional attribution terms under
|
||||||
|
GPLv3 Section 7(b)**.
|
||||||
|
|
||||||
|
You are free to use, modify, and redistribute QodeAssist under GPL-3.0,
|
||||||
|
but you **must preserve** the original author attribution, copyright
|
||||||
|
notices, and project identification — including in source file headers,
|
||||||
|
the plugin metadata (`QodeAssist.json.in`), and the About dialog or
|
||||||
|
equivalent user-facing identification. Modified versions must be clearly
|
||||||
|
marked as different from the original.
|
||||||
|
|
||||||
|
### Commercial licensing
|
||||||
|
|
||||||
|
QodeAssist is also available under a separate commercial license for use
|
||||||
|
in proprietary or closed-source products without GPL-3.0 obligations.
|
||||||
|
For commercial licensing inquiries, contact **palm1r-github-dev@pm.me**.
|
||||||
|
|
||||||
|
### Qt Creator components and attributions
|
||||||
|
|
||||||
|
QodeAssist is a plugin for Qt Creator and incorporates certain components
|
||||||
|
(plugin templates, API headers, and related boilerplate) originating from
|
||||||
|
Qt Creator, which are copyright (C) The Qt Company Ltd.
|
||||||
|
|
||||||
|
These components are provided by The Qt Company under the GNU General
|
||||||
|
Public License version 3, annotated with **The Qt Company GPL Exception
|
||||||
|
1.0**. This exception permits the development and distribution of Qt
|
||||||
|
Creator plugins under licenses of the plugin author's own choosing,
|
||||||
|
notwithstanding the GPL's general linking requirements. It is this
|
||||||
|
exception that allows QodeAssist to be offered under both GPL-3.0 and a
|
||||||
|
separate commercial license.
|
||||||
|
|
||||||
|
The original copyright and license notices of The Qt Company are
|
||||||
|
preserved in the relevant source files and must not be removed.
|
||||||
|
|
||||||
|
For Qt Creator's licensing terms, see
|
||||||
|
[LICENSE.GPL3-EXCEPT](https://github.com/qt-creator/qt-creator/blob/master/LICENSES/LICENSE.GPL3-EXCEPT).
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "RefactorSuggestion.hpp"
|
#include "RefactorSuggestion.hpp"
|
||||||
#include "LLMSuggestion.hpp"
|
#include "LLMSuggestion.hpp"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2024-2026 Petr Mironychev
|
// Copyright (C) 2024-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "RefactorSuggestionHoverHandler.hpp"
|
#include "RefactorSuggestionHoverHandler.hpp"
|
||||||
#include "RefactorSuggestion.hpp"
|
#include "RefactorSuggestion.hpp"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "FlowEditor.hpp"
|
#include "FlowEditor.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "FlowItem.hpp"
|
#include "FlowItem.hpp"
|
||||||
|
|
||||||
namespace QodeAssist::TaskFlow {
|
namespace QodeAssist::TaskFlow {
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QQuickItem>
|
#include <QQuickItem>
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "FlowsModel.hpp"
|
#include "FlowsModel.hpp"
|
||||||
|
|
||||||
#include "FlowManager.hpp"
|
#include "FlowManager.hpp"
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QAbstractListModel>
|
#include <QAbstractListModel>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "GridBackground.hpp"
|
#include "GridBackground.hpp"
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "TaskConnectionItem.hpp"
|
#include "TaskConnectionItem.hpp"
|
||||||
#include "TaskItem.hpp"
|
#include "TaskItem.hpp"
|
||||||
#include "TaskPortItem.hpp"
|
#include "TaskPortItem.hpp"
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "TaskConnection.hpp"
|
#include "TaskConnection.hpp"
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "TaskConnectionsModel.hpp"
|
#include "TaskConnectionsModel.hpp"
|
||||||
|
|
||||||
namespace QodeAssist::TaskFlow {
|
namespace QodeAssist::TaskFlow {
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QAbstractListModel>
|
#include <QAbstractListModel>
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "TaskItem.hpp"
|
#include "TaskItem.hpp"
|
||||||
|
|
||||||
namespace QodeAssist::TaskFlow {
|
namespace QodeAssist::TaskFlow {
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QQuickItem>
|
#include <QQuickItem>
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "TaskModel.hpp"
|
#include "TaskModel.hpp"
|
||||||
|
|
||||||
namespace QodeAssist::TaskFlow {
|
namespace QodeAssist::TaskFlow {
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QAbstractListModel>
|
#include <QAbstractListModel>
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "TaskPortItem.hpp"
|
#include "TaskPortItem.hpp"
|
||||||
|
|
||||||
namespace QodeAssist::TaskFlow {
|
namespace QodeAssist::TaskFlow {
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <TaskPort.hpp>
|
#include <TaskPort.hpp>
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#include "TaskPortModel.hpp"
|
#include "TaskPortModel.hpp"
|
||||||
#include "TaskPort.hpp"
|
#include "TaskPort.hpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QAbstractListModel>
|
#include <QAbstractListModel>
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import TaskFlow.Editor
|
import TaskFlow.Editor
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (C) 2025-2026 Petr Mironychev
|
// Copyright (C) 2025-2026 Petr Mironychev
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user