feature: Add popup window for chat
* feature: Add chat view via QQuickView * feature: Update chat UI * fix: Disable chat in navigation panel and bottom bar by default
@ -25,6 +25,14 @@ qt_add_qml_module(QodeAssistChatView
|
|||||||
icons/close-light.svg
|
icons/close-light.svg
|
||||||
icons/link-file-light.svg
|
icons/link-file-light.svg
|
||||||
icons/link-file-dark.svg
|
icons/link-file-dark.svg
|
||||||
|
icons/load-chat-dark.svg
|
||||||
|
icons/save-chat-dark.svg
|
||||||
|
icons/clean-icon-dark.svg
|
||||||
|
icons/file-in-system.svg
|
||||||
|
icons/window-lock.svg
|
||||||
|
icons/window-unlock.svg
|
||||||
|
icons/chat-icon.svg
|
||||||
|
icons/chat-pause-icon.svg
|
||||||
SOURCES
|
SOURCES
|
||||||
ChatWidget.hpp ChatWidget.cpp
|
ChatWidget.hpp ChatWidget.cpp
|
||||||
ChatModel.hpp ChatModel.cpp
|
ChatModel.hpp ChatModel.cpp
|
||||||
@ -33,6 +41,7 @@ qt_add_qml_module(QodeAssistChatView
|
|||||||
MessagePart.hpp
|
MessagePart.hpp
|
||||||
ChatUtils.h ChatUtils.cpp
|
ChatUtils.h ChatUtils.cpp
|
||||||
ChatSerializer.hpp ChatSerializer.cpp
|
ChatSerializer.hpp ChatSerializer.cpp
|
||||||
|
ChatView.hpp ChatView.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(QodeAssistChatView
|
target_link_libraries(QodeAssistChatView
|
||||||
|
@ -66,6 +66,10 @@ ChatRootView::ChatRootView(QQuickItem *parent)
|
|||||||
this,
|
this,
|
||||||
&ChatRootView::autosave);
|
&ChatRootView::autosave);
|
||||||
|
|
||||||
|
connect(m_clientInterface, &ClientInterface::messageReceivedCompletely, this, [this]() {
|
||||||
|
this->setRequestProgressStatus(false);
|
||||||
|
});
|
||||||
|
|
||||||
connect(
|
connect(
|
||||||
m_clientInterface,
|
m_clientInterface,
|
||||||
&ClientInterface::messageReceivedCompletely,
|
&ClientInterface::messageReceivedCompletely,
|
||||||
@ -156,6 +160,7 @@ void ChatRootView::sendMessage(const QString &message)
|
|||||||
|
|
||||||
m_clientInterface->sendMessage(message, m_attachmentFiles, m_linkedFiles);
|
m_clientInterface->sendMessage(message, m_attachmentFiles, m_linkedFiles);
|
||||||
clearAttachmentFiles();
|
clearAttachmentFiles();
|
||||||
|
setRequestProgressStatus(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatRootView::copyToClipboard(const QString &text)
|
void ChatRootView::copyToClipboard(const QString &text)
|
||||||
@ -166,6 +171,7 @@ void ChatRootView::copyToClipboard(const QString &text)
|
|||||||
void ChatRootView::cancelRequest()
|
void ChatRootView::cancelRequest()
|
||||||
{
|
{
|
||||||
m_clientInterface->cancelRequest();
|
m_clientInterface->cancelRequest();
|
||||||
|
setRequestProgressStatus(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatRootView::clearAttachmentFiles()
|
void ChatRootView::clearAttachmentFiles()
|
||||||
@ -602,4 +608,17 @@ int ChatRootView::textFormat() const
|
|||||||
return Settings::chatAssistantSettings().textFormat();
|
return Settings::chatAssistantSettings().textFormat();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ChatRootView::isRequestInProgress() const
|
||||||
|
{
|
||||||
|
return m_isRequestInProgress;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatRootView::setRequestProgressStatus(bool state)
|
||||||
|
{
|
||||||
|
if (m_isRequestInProgress == state)
|
||||||
|
return;
|
||||||
|
m_isRequestInProgress = state;
|
||||||
|
emit isRequestInProgressChanged();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace QodeAssist::Chat
|
} // namespace QodeAssist::Chat
|
||||||
|
@ -43,6 +43,8 @@ class ChatRootView : public QQuickItem
|
|||||||
Q_PROPERTY(int codeFontSize READ codeFontSize NOTIFY codeFontSizeChanged FINAL)
|
Q_PROPERTY(int codeFontSize READ codeFontSize NOTIFY codeFontSizeChanged FINAL)
|
||||||
Q_PROPERTY(int textFontSize READ textFontSize NOTIFY textFontSizeChanged FINAL)
|
Q_PROPERTY(int textFontSize READ textFontSize NOTIFY textFontSizeChanged FINAL)
|
||||||
Q_PROPERTY(int textFormat READ textFormat NOTIFY textFormatChanged FINAL)
|
Q_PROPERTY(int textFormat READ textFormat NOTIFY textFormatChanged FINAL)
|
||||||
|
Q_PROPERTY(
|
||||||
|
bool isRequestInProgress READ isRequestInProgress NOTIFY isRequestInProgressChanged FINAL)
|
||||||
|
|
||||||
QML_ELEMENT
|
QML_ELEMENT
|
||||||
|
|
||||||
@ -92,6 +94,9 @@ public:
|
|||||||
int textFontSize() const;
|
int textFontSize() const;
|
||||||
int textFormat() const;
|
int textFormat() const;
|
||||||
|
|
||||||
|
bool isRequestInProgress() const;
|
||||||
|
void setRequestProgressStatus(bool state);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void sendMessage(const QString &message);
|
void sendMessage(const QString &message);
|
||||||
void copyToClipboard(const QString &text);
|
void copyToClipboard(const QString &text);
|
||||||
@ -112,6 +117,8 @@ signals:
|
|||||||
void codeFontSizeChanged();
|
void codeFontSizeChanged();
|
||||||
void textFontSizeChanged();
|
void textFontSizeChanged();
|
||||||
void textFormatChanged();
|
void textFormatChanged();
|
||||||
|
void chatRequestStarted();
|
||||||
|
void isRequestInProgressChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString getChatsHistoryDir() const;
|
QString getChatsHistoryDir() const;
|
||||||
@ -128,6 +135,7 @@ private:
|
|||||||
int m_inputTokensCount{0};
|
int m_inputTokensCount{0};
|
||||||
bool m_isSyncOpenFiles;
|
bool m_isSyncOpenFiles;
|
||||||
QList<Core::IEditor *> m_currentEditors;
|
QList<Core::IEditor *> m_currentEditors;
|
||||||
|
bool m_isRequestInProgress;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QodeAssist::Chat
|
} // namespace QodeAssist::Chat
|
||||||
|
106
ChatView/ChatView.cpp
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024-2025 Petr Mironychev
|
||||||
|
*
|
||||||
|
* This file is part of QodeAssist.
|
||||||
|
*
|
||||||
|
* QodeAssist is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* QodeAssist is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ChatView.hpp"
|
||||||
|
|
||||||
|
#include <QQmlContext>
|
||||||
|
#include <QQmlEngine>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QVariantMap>
|
||||||
|
|
||||||
|
#include <coreplugin/actionmanager/actionmanager.h>
|
||||||
|
#include <logger/Logger.hpp>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
constexpr Qt::WindowFlags baseFlags = Qt::Window | Qt::WindowTitleHint | Qt::WindowSystemMenuHint
|
||||||
|
| Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint
|
||||||
|
| Qt::WindowCloseButtonHint;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace QodeAssist::Chat {
|
||||||
|
|
||||||
|
ChatView::ChatView()
|
||||||
|
: m_isPin(false)
|
||||||
|
{
|
||||||
|
setTitle("QodeAssist Chat");
|
||||||
|
engine()->rootContext()->setContextProperty("_chatview", this);
|
||||||
|
setSource(QUrl("qrc:/qt/qml/ChatView/qml/RootItem.qml"));
|
||||||
|
setResizeMode(QQuickView::SizeRootObjectToView);
|
||||||
|
setMinimumSize({400, 300});
|
||||||
|
setFlags(baseFlags);
|
||||||
|
|
||||||
|
if (auto action = Core::ActionManager::command("QodeAssist.CloseChatView")) {
|
||||||
|
m_closeShortcut = new QShortcut(action->keySequence(), this);
|
||||||
|
connect(m_closeShortcut, &QShortcut::activated, this, &QQuickView::close);
|
||||||
|
|
||||||
|
connect(action, &Core::Command::keySequenceChanged, this, [action, this]() {
|
||||||
|
if (m_closeShortcut) {
|
||||||
|
m_closeShortcut->setKey(action->keySequence());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
restoreSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatView::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
saveSettings();
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatView::saveSettings()
|
||||||
|
{
|
||||||
|
QSettings settings;
|
||||||
|
settings.setValue("QodeAssist/ChatView/geometry", geometry());
|
||||||
|
settings.setValue("QodeAssist/ChatView/pinned", m_isPin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatView::restoreSettings()
|
||||||
|
{
|
||||||
|
QSettings settings;
|
||||||
|
const QRect savedGeometry
|
||||||
|
= settings.value("QodeAssist/ChatView/geometry", QRect(100, 100, 800, 600)).toRect();
|
||||||
|
setGeometry(savedGeometry);
|
||||||
|
|
||||||
|
const bool pinned = settings.value("QodeAssist/ChatView/pinned", false).toBool();
|
||||||
|
setIsPin(pinned);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ChatView::isPin() const
|
||||||
|
{
|
||||||
|
return m_isPin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatView::setIsPin(bool newIsPin)
|
||||||
|
{
|
||||||
|
if (m_isPin == newIsPin)
|
||||||
|
return;
|
||||||
|
m_isPin = newIsPin;
|
||||||
|
|
||||||
|
if (m_isPin) {
|
||||||
|
setFlags(baseFlags | Qt::WindowStaysOnTopHint);
|
||||||
|
} else {
|
||||||
|
setFlags(baseFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
emit isPinChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace QodeAssist::Chat
|
51
ChatView/ChatView.hpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024-2025 Petr Mironychev
|
||||||
|
*
|
||||||
|
* This file is part of QodeAssist.
|
||||||
|
*
|
||||||
|
* QodeAssist is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* QodeAssist is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QQuickView>
|
||||||
|
#include <QShortcut>
|
||||||
|
|
||||||
|
namespace QodeAssist::Chat {
|
||||||
|
|
||||||
|
class ChatView : public QQuickView
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(bool isPin READ isPin WRITE setIsPin NOTIFY isPinChanged FINAL)
|
||||||
|
public:
|
||||||
|
ChatView();
|
||||||
|
|
||||||
|
bool isPin() const;
|
||||||
|
void setIsPin(bool newIsPin);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void isPinChanged();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void closeEvent(QCloseEvent *event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void saveSettings();
|
||||||
|
void restoreSettings();
|
||||||
|
|
||||||
|
bool m_isPin;
|
||||||
|
QShortcut *m_closeShortcut;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace QodeAssist::Chat
|
10
ChatView/icons/chat-icon.svg
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_5_6)">
|
||||||
|
<path d="M21.6 0H2.4C1.08 0 0 1.08 0 2.4V16.8C0 18.12 1.08 19.2 2.4 19.2H7.2V22.8C7.2 23.46 7.74 24 8.4 24H9C9.3 24 9.6 23.88 9.84 23.652L14.28 19.2H21.6C22.92 19.2 24 18.12 24 16.8V2.4C24 1.08 22.92 0 21.6 0ZM21.6 16.8H13.44L8.76 21.48L8.4 21.6V16.8H2.4V2.4H21.6V16.8Z" fill="black"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_5_6">
|
||||||
|
<rect width="24" height="24" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 523 B |
10
ChatView/icons/chat-pause-icon.svg
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_5_17)">
|
||||||
|
<path d="M21.6 0H2.4C1.08 0 0 1.08 0 2.4V16.8C0 18.12 1.08 19.2 2.4 19.2H7.2V22.8C7.2 23.46 7.74 24 8.4 24H9C9.3 24 9.6 23.88 9.84 23.652L14.28 19.2H21.6C22.92 19.2 24 18.12 24 16.8V2.4C24 1.08 22.92 0 21.6 0ZM21.6 16.8H13.44L8.76 21.48L8.4 21.6V16.8H2.4V2.4H21.6V16.8ZM8.4 6H15.6V13.2H8.4V6Z" fill="black"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_5_17">
|
||||||
|
<rect width="24" height="24" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 548 B |
8
ChatView/icons/clean-icon-dark.svg
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<svg width="20" height="44" viewBox="0 0 20 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M16.75 15H3.25C2.00736 15 1 16.0074 1 17.25V39.75C1 40.9926 2.00736 42 3.25 42H16.75C17.9926 42 19 40.9926 19 39.75V17.25C19 16.0074 17.9926 15 16.75 15Z" stroke="black" stroke-width="2"/>
|
||||||
|
<path d="M1.04316 11.015L18.9554 8.90787" stroke="black" stroke-width="2" stroke-linecap="round"/>
|
||||||
|
<path d="M7.19462 10.363L7.02032 8.59516C6.92446 7.62284 8.18688 6.64116 9.8257 6.41365C11.4645 6.18615 12.8838 6.79555 12.9797 7.76787L13.154 9.53573" stroke="black" stroke-width="2"/>
|
||||||
|
<path d="M6 24V34" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
<path d="M10 24V34" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
<path d="M14 24V34" stroke="black" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 822 B |
12
ChatView/icons/file-in-system.svg
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_59_114)">
|
||||||
|
<path d="M2 8H12L16 4H40C42 4 44 6 44 8V36C44 38 42 40 40 40H6C4 40 2 38 2 36V8Z" fill="black" fill-opacity="0.1" stroke="black" stroke-width="3"/>
|
||||||
|
<path d="M25 37C32.732 37 39 30.732 39 23C39 15.268 32.732 9 25 9C17.268 9 11 15.268 11 23C11 30.732 17.268 37 25 37Z" stroke="black" stroke-width="4"/>
|
||||||
|
<path d="M33 35L42 44" stroke="black" stroke-width="4" stroke-linecap="round"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_59_114">
|
||||||
|
<rect width="44" height="44" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 624 B |
5
ChatView/icons/load-chat-dark.svg
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<svg width="20" height="44" viewBox="0 0 20 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M5 8H15" stroke="black" stroke-width="2.5" stroke-linecap="round"/>
|
||||||
|
<path d="M10 16V36" stroke="black" stroke-width="2.5" stroke-linecap="round"/>
|
||||||
|
<path d="M5 21L10 16L15 21" stroke="black" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 370 B |
5
ChatView/icons/save-chat-dark.svg
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<svg width="20" height="44" viewBox="0 0 20 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M10 8V28" stroke="black" stroke-width="2.5" stroke-linecap="round"/>
|
||||||
|
<path d="M5 23L10 28L15 23" stroke="black" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M5 36H15" stroke="black" stroke-width="2.5" stroke-linecap="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 370 B |
5
ChatView/icons/window-lock.svg
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M31 18H13C11.3431 18 10 19.3431 10 21V37C10 38.6569 11.3431 40 13 40H31C32.6569 40 34 38.6569 34 37V21C34 19.3431 32.6569 18 31 18Z" fill="black" fill-opacity="0.3" stroke="black" stroke-width="4"/>
|
||||||
|
<path d="M14 18V10C14 5.6 17.6 2 22 2C26.4 2 30 5.6 30 10V18" stroke="black" stroke-width="4"/>
|
||||||
|
<path d="M22 32C23.6569 32 25 30.6569 25 29C25 27.3431 23.6569 26 22 26C20.3431 26 19 27.3431 19 29C19 30.6569 20.3431 32 22 32Z" fill="black"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 552 B |
5
ChatView/icons/window-unlock.svg
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<svg width="44" height="44" viewBox="0 0 44 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M31 18H13C11.3431 18 10 19.3431 10 21V37C10 38.6569 11.3431 40 13 40H31C32.6569 40 34 38.6569 34 37V21C34 19.3431 32.6569 18 31 18Z" fill="black" fill-opacity="0.1" stroke="black" stroke-width="4"/>
|
||||||
|
<path d="M14 17V9.5C14 5.375 17.15 2 21 2C24.85 2 27.5 2.875 27.5 7" stroke="black" stroke-width="4"/>
|
||||||
|
<path d="M22 32C23.6569 32 25 30.6569 25 29C25 27.3431 23.6569 26 22 26C20.3431 26 19 27.3431 19 29C19 30.6569 20.3431 32 22 32Z" fill="black"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 559 B |
@ -23,6 +23,7 @@ Rectangle {
|
|||||||
id: root
|
id: root
|
||||||
|
|
||||||
property alias text: badgeText.text
|
property alias text: badgeText.text
|
||||||
|
property alias hovered: mouse.hovered
|
||||||
|
|
||||||
implicitWidth: badgeText.implicitWidth + root.radius
|
implicitWidth: badgeText.implicitWidth + root.radius
|
||||||
implicitHeight: badgeText.implicitHeight + 6
|
implicitHeight: badgeText.implicitHeight + 6
|
||||||
@ -37,4 +38,10 @@ Rectangle {
|
|||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
color: palette.buttonText
|
color: palette.buttonText
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HoverHandler {
|
||||||
|
id: mouse
|
||||||
|
|
||||||
|
acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,12 +70,17 @@ ChatRootView {
|
|||||||
loadButton.onClicked: root.showLoadDialog()
|
loadButton.onClicked: root.showLoadDialog()
|
||||||
clearButton.onClicked: root.clearChat()
|
clearButton.onClicked: root.clearChat()
|
||||||
tokensBadge {
|
tokensBadge {
|
||||||
text: qsTr("tokens:%1/%2").arg(root.inputTokensCount).arg(root.chatModel.tokensThreshold)
|
text: qsTr("%1/%2").arg(root.inputTokensCount).arg(root.chatModel.tokensThreshold)
|
||||||
}
|
}
|
||||||
recentPath {
|
recentPath {
|
||||||
text: qsTr("Latest chat file name: %1").arg(root.chatFileName.length > 0 ? root.chatFileName : "Unsaved")
|
text: qsTr("Latest chat file name: %1").arg(root.chatFileName.length > 0 ? root.chatFileName : "Unsaved")
|
||||||
}
|
}
|
||||||
openChatHistory.onClicked: root.openChatHistoryFolder()
|
openChatHistory.onClicked: root.openChatHistoryFolder()
|
||||||
|
pinButton {
|
||||||
|
visible: typeof _chatview !== 'undefined'
|
||||||
|
checked: typeof _chatview !== 'undefined' ? _chatview.isPin : false
|
||||||
|
onCheckedChanged: _chatview.isPin = topBar.pinButton.checked
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ListView {
|
ListView {
|
||||||
@ -203,8 +208,9 @@ ChatRootView {
|
|||||||
Layout.preferredWidth: parent.width
|
Layout.preferredWidth: parent.width
|
||||||
Layout.preferredHeight: 40
|
Layout.preferredHeight: 40
|
||||||
|
|
||||||
sendButton.onClicked: root.sendChatMessage()
|
sendButton.onClicked: !root.isRequestInProgress ? root.sendChatMessage()
|
||||||
stopButton.onClicked: root.cancelRequest()
|
: root.cancelRequest()
|
||||||
|
isRequestInProgress: root.isRequestInProgress
|
||||||
syncOpenFiles {
|
syncOpenFiles {
|
||||||
checked: root.isSyncOpenFiles
|
checked: root.isSyncOpenFiles
|
||||||
onCheckedChanged: root.setIsSyncOpenFiles(bottomBar.syncOpenFiles.checked)
|
onCheckedChanged: root.setIsSyncOpenFiles(bottomBar.syncOpenFiles.checked)
|
||||||
@ -229,4 +235,8 @@ ChatRootView {
|
|||||||
messageInput.text = ""
|
messageInput.text = ""
|
||||||
scrollToBottom()
|
scrollToBottom()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
messageInput.forceActiveFocus()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,11 +26,12 @@ Rectangle {
|
|||||||
id: root
|
id: root
|
||||||
|
|
||||||
property alias sendButton: sendButtonId
|
property alias sendButton: sendButtonId
|
||||||
property alias stopButton: stopButtonId
|
|
||||||
property alias syncOpenFiles: syncOpenFilesId
|
property alias syncOpenFiles: syncOpenFilesId
|
||||||
property alias attachFiles: attachFilesId
|
property alias attachFiles: attachFilesId
|
||||||
property alias linkFiles: linkFilesId
|
property alias linkFiles: linkFilesId
|
||||||
|
|
||||||
|
property bool isRequestInProgress: false
|
||||||
|
|
||||||
color: palette.window.hslLightness > 0.5 ?
|
color: palette.window.hslLightness > 0.5 ?
|
||||||
Qt.darker(palette.window, 1.1) :
|
Qt.darker(palette.window, 1.1) :
|
||||||
Qt.lighter(palette.window, 1.1)
|
Qt.lighter(palette.window, 1.1)
|
||||||
@ -51,13 +52,16 @@ Rectangle {
|
|||||||
QoAButton {
|
QoAButton {
|
||||||
id: sendButtonId
|
id: sendButtonId
|
||||||
|
|
||||||
text: qsTr("Send")
|
icon {
|
||||||
}
|
source: !root.isRequestInProgress ? "qrc:/qt/qml/ChatView/icons/chat-icon.svg"
|
||||||
|
: "qrc:/qt/qml/ChatView/icons/chat-pause-icon.svg"
|
||||||
QoAButton {
|
height: 15
|
||||||
id: stopButtonId
|
width: 15
|
||||||
|
}
|
||||||
text: qsTr("Stop")
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.delay: 250
|
||||||
|
ToolTip.text: !root.isRequestInProgress ? qsTr("Send message to LLM")
|
||||||
|
: qsTr("Stop")
|
||||||
}
|
}
|
||||||
|
|
||||||
QoAButton {
|
QoAButton {
|
||||||
@ -68,7 +72,9 @@ Rectangle {
|
|||||||
height: 15
|
height: 15
|
||||||
width: 8
|
width: 8
|
||||||
}
|
}
|
||||||
text: qsTr("Attach files")
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.delay: 250
|
||||||
|
ToolTip.text: qsTr("Attach file to message")
|
||||||
}
|
}
|
||||||
|
|
||||||
QoAButton {
|
QoAButton {
|
||||||
@ -79,7 +85,9 @@ Rectangle {
|
|||||||
height: 15
|
height: 15
|
||||||
width: 8
|
width: 8
|
||||||
}
|
}
|
||||||
text: qsTr("Link files")
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.delay: 250
|
||||||
|
ToolTip.text: qsTr("Link file to context")
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckBox {
|
CheckBox {
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
|
import QtQuick.Controls
|
||||||
import ChatView
|
import ChatView
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
@ -30,6 +31,7 @@ Rectangle {
|
|||||||
property alias tokensBadge: tokensBadgeId
|
property alias tokensBadge: tokensBadgeId
|
||||||
property alias recentPath: recentPathId
|
property alias recentPath: recentPathId
|
||||||
property alias openChatHistory: openChatHistoryId
|
property alias openChatHistory: openChatHistoryId
|
||||||
|
property alias pinButton: pinButtonId
|
||||||
|
|
||||||
color: palette.window.hslLightness > 0.5 ?
|
color: palette.window.hslLightness > 0.5 ?
|
||||||
Qt.darker(palette.window, 1.1) :
|
Qt.darker(palette.window, 1.1) :
|
||||||
@ -46,22 +48,61 @@ Rectangle {
|
|||||||
|
|
||||||
spacing: 10
|
spacing: 10
|
||||||
|
|
||||||
|
QoAButton {
|
||||||
|
id: pinButtonId
|
||||||
|
|
||||||
|
checkable: true
|
||||||
|
|
||||||
|
icon {
|
||||||
|
source: checked ? "qrc:/qt/qml/ChatView/icons/window-lock.svg"
|
||||||
|
: "qrc:/qt/qml/ChatView/icons/window-unlock.svg"
|
||||||
|
color: palette.window.hslLightness > 0.5 ? "#000000" : "#FFFFFF"
|
||||||
|
height: 15
|
||||||
|
width: 15
|
||||||
|
}
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.delay: 250
|
||||||
|
ToolTip.text: checked ? qsTr("Unpin chat window")
|
||||||
|
: qsTr("Pin chat window to the top")
|
||||||
|
}
|
||||||
|
|
||||||
QoAButton {
|
QoAButton {
|
||||||
id: saveButtonId
|
id: saveButtonId
|
||||||
|
|
||||||
text: qsTr("Save")
|
icon {
|
||||||
|
source: "qrc:/qt/qml/ChatView/icons/save-chat-dark.svg"
|
||||||
|
height: 15
|
||||||
|
width: 8
|
||||||
|
}
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.delay: 250
|
||||||
|
ToolTip.text: qsTr("Save chat to *.json file")
|
||||||
}
|
}
|
||||||
|
|
||||||
QoAButton {
|
QoAButton {
|
||||||
id: loadButtonId
|
id: loadButtonId
|
||||||
|
|
||||||
text: qsTr("Load")
|
icon {
|
||||||
|
source: "qrc:/qt/qml/ChatView/icons/load-chat-dark.svg"
|
||||||
|
height: 15
|
||||||
|
width: 8
|
||||||
|
}
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.delay: 250
|
||||||
|
ToolTip.text: qsTr("Load chat from *.json file")
|
||||||
}
|
}
|
||||||
|
|
||||||
QoAButton {
|
QoAButton {
|
||||||
id: clearButtonId
|
id: clearButtonId
|
||||||
|
|
||||||
text: qsTr("Clear")
|
icon {
|
||||||
|
source: "qrc:/qt/qml/ChatView/icons/clean-icon-dark.svg"
|
||||||
|
height: 15
|
||||||
|
width: 8
|
||||||
|
}
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.delay: 250
|
||||||
|
ToolTip.text: qsTr("Clean chat")
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
@ -74,7 +115,14 @@ Rectangle {
|
|||||||
QoAButton {
|
QoAButton {
|
||||||
id: openChatHistoryId
|
id: openChatHistoryId
|
||||||
|
|
||||||
text: qsTr("Show in system")
|
icon {
|
||||||
|
source: "qrc:/qt/qml/ChatView/icons/file-in-system.svg"
|
||||||
|
height: 15
|
||||||
|
width: 15
|
||||||
|
}
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.delay: 250
|
||||||
|
ToolTip.text: qsTr("Show in system")
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
@ -83,6 +131,10 @@ Rectangle {
|
|||||||
|
|
||||||
Badge {
|
Badge {
|
||||||
id: tokensBadgeId
|
id: tokensBadgeId
|
||||||
|
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.delay: 250
|
||||||
|
ToolTip.text: qsTr("Current amount tokens in chat and LLM limit threshold")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
#include "LLMClientInterface.hpp"
|
#include "LLMClientInterface.hpp"
|
||||||
#include "LSPCompletion.hpp"
|
#include "LSPCompletion.hpp"
|
||||||
#include "QuickRefactorHandler.hpp"
|
#include "QuickRefactorHandler.hpp"
|
||||||
@ -37,6 +39,7 @@ namespace QodeAssist {
|
|||||||
|
|
||||||
class QodeAssistClient : public LanguageClient::Client
|
class QodeAssistClient : public LanguageClient::Client
|
||||||
{
|
{
|
||||||
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit QodeAssistClient(LLMClientInterface *clientInterface);
|
explicit QodeAssistClient(LLMClientInterface *clientInterface);
|
||||||
~QodeAssistClient() override;
|
~QodeAssistClient() override;
|
||||||
|
@ -33,6 +33,9 @@ UpdateStatusWidget::UpdateStatusWidget(QWidget *parent)
|
|||||||
m_actionButton = new QToolButton(this);
|
m_actionButton = new QToolButton(this);
|
||||||
m_actionButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
|
m_actionButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
|
||||||
|
|
||||||
|
m_chatButton = new QToolButton(this);
|
||||||
|
m_chatButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
|
||||||
|
|
||||||
m_versionLabel = new QLabel(this);
|
m_versionLabel = new QLabel(this);
|
||||||
m_versionLabel->setVisible(false);
|
m_versionLabel->setVisible(false);
|
||||||
|
|
||||||
@ -41,6 +44,7 @@ UpdateStatusWidget::UpdateStatusWidget(QWidget *parent)
|
|||||||
m_updateButton->setStyleSheet("QPushButton { padding: 2px 8px; }");
|
m_updateButton->setStyleSheet("QPushButton { padding: 2px 8px; }");
|
||||||
|
|
||||||
layout->addWidget(m_actionButton);
|
layout->addWidget(m_actionButton);
|
||||||
|
layout->addWidget(m_chatButton);
|
||||||
layout->addWidget(m_versionLabel);
|
layout->addWidget(m_versionLabel);
|
||||||
layout->addWidget(m_updateButton);
|
layout->addWidget(m_updateButton);
|
||||||
}
|
}
|
||||||
@ -64,6 +68,11 @@ void UpdateStatusWidget::hideUpdateInfo()
|
|||||||
m_updateButton->setVisible(false);
|
m_updateButton->setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdateStatusWidget::setChatButtonAction(QAction *action)
|
||||||
|
{
|
||||||
|
m_chatButton->setDefaultAction(action);
|
||||||
|
}
|
||||||
|
|
||||||
QPushButton *UpdateStatusWidget::updateButton() const
|
QPushButton *UpdateStatusWidget::updateButton() const
|
||||||
{
|
{
|
||||||
return m_updateButton;
|
return m_updateButton;
|
||||||
|
@ -36,11 +36,13 @@ public:
|
|||||||
void setDefaultAction(QAction *action);
|
void setDefaultAction(QAction *action);
|
||||||
void showUpdateAvailable(const QString &version);
|
void showUpdateAvailable(const QString &version);
|
||||||
void hideUpdateInfo();
|
void hideUpdateInfo();
|
||||||
|
void setChatButtonAction(QAction *action);
|
||||||
|
|
||||||
QPushButton *updateButton() const;
|
QPushButton *updateButton() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QToolButton *m_actionButton;
|
QToolButton *m_actionButton;
|
||||||
|
QToolButton *m_chatButton;
|
||||||
QLabel *m_versionLabel;
|
QLabel *m_versionLabel;
|
||||||
QPushButton *m_updateButton;
|
QPushButton *m_updateButton;
|
||||||
};
|
};
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QTranslator>
|
#include <QTranslator>
|
||||||
|
|
||||||
|
#include <QInputDialog>
|
||||||
#include "ConfigurationManager.hpp"
|
#include "ConfigurationManager.hpp"
|
||||||
#include "QodeAssistClient.hpp"
|
#include "QodeAssistClient.hpp"
|
||||||
#include "UpdateStatusWidget.hpp"
|
#include "UpdateStatusWidget.hpp"
|
||||||
@ -53,17 +54,18 @@
|
|||||||
#include "llmcore/ProvidersManager.hpp"
|
#include "llmcore/ProvidersManager.hpp"
|
||||||
#include "logger/RequestPerformanceLogger.hpp"
|
#include "logger/RequestPerformanceLogger.hpp"
|
||||||
#include "providers/Providers.hpp"
|
#include "providers/Providers.hpp"
|
||||||
|
#include "settings/ChatAssistantSettings.hpp"
|
||||||
#include "settings/GeneralSettings.hpp"
|
#include "settings/GeneralSettings.hpp"
|
||||||
#include "settings/ProjectSettingsPanel.hpp"
|
#include "settings/ProjectSettingsPanel.hpp"
|
||||||
#include "settings/SettingsConstants.hpp"
|
#include "settings/SettingsConstants.hpp"
|
||||||
#include "templates/Templates.hpp"
|
#include "templates/Templates.hpp"
|
||||||
#include "widgets/QuickRefactorDialog.hpp"
|
#include "widgets/QuickRefactorDialog.hpp"
|
||||||
|
#include <ChatView/ChatView.hpp>
|
||||||
#include <coreplugin/actionmanager/actioncontainer.h>
|
#include <coreplugin/actionmanager/actioncontainer.h>
|
||||||
#include <coreplugin/actionmanager/actionmanager.h>
|
#include <coreplugin/actionmanager/actionmanager.h>
|
||||||
#include <texteditor/textdocument.h>
|
#include <texteditor/textdocument.h>
|
||||||
#include <texteditor/texteditor.h>
|
#include <texteditor/texteditor.h>
|
||||||
#include <texteditor/texteditorconstants.h>
|
#include <texteditor/texteditorconstants.h>
|
||||||
#include <QInputDialog>
|
|
||||||
|
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
using namespace Core;
|
using namespace Core;
|
||||||
@ -86,8 +88,12 @@ public:
|
|||||||
~QodeAssistPlugin() final
|
~QodeAssistPlugin() final
|
||||||
{
|
{
|
||||||
delete m_qodeAssistClient;
|
delete m_qodeAssistClient;
|
||||||
delete m_chatOutputPane;
|
if (m_chatOutputPane) {
|
||||||
delete m_navigationPanel;
|
delete m_chatOutputPane;
|
||||||
|
}
|
||||||
|
if (m_navigationPanel) {
|
||||||
|
delete m_navigationPanel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadTranslations()
|
void loadTranslations()
|
||||||
@ -148,8 +154,10 @@ public:
|
|||||||
UpdateDialog::checkForUpdatesAndShow(Core::ICore::mainWindow());
|
UpdateDialog::checkForUpdatesAndShow(Core::ICore::mainWindow());
|
||||||
});
|
});
|
||||||
|
|
||||||
if (Settings::generalSettings().enableChat()) {
|
if (Settings::chatAssistantSettings().enableChatInBottomToolBar()) {
|
||||||
m_chatOutputPane = new Chat::ChatOutputPane(this);
|
m_chatOutputPane = new Chat::ChatOutputPane(this);
|
||||||
|
}
|
||||||
|
if (Settings::chatAssistantSettings().enableChatInNavigationPanel()) {
|
||||||
m_navigationPanel = new Chat::NavigationPanel();
|
m_navigationPanel = new Chat::NavigationPanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,6 +194,34 @@ public:
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ActionBuilder showChatViewAction(this, "QodeAssist.ShowChatView");
|
||||||
|
const QKeySequence showChatViewShortcut = QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_W);
|
||||||
|
showChatViewAction.setDefaultKeySequence(showChatViewShortcut);
|
||||||
|
showChatViewAction.setToolTip(Tr::tr("Show QodeAssist Chat"));
|
||||||
|
showChatViewAction.setText(Tr::tr("Show QodeAssist Chat"));
|
||||||
|
showChatViewAction.setIcon(QCODEASSIST_ICON.icon());
|
||||||
|
showChatViewAction.addOnTriggered(this, [this] {
|
||||||
|
if (!m_chatView->isVisible()) {
|
||||||
|
m_chatView->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_chatView->raise();
|
||||||
|
m_chatView->requestActivate();
|
||||||
|
});
|
||||||
|
m_statusWidget->setChatButtonAction(showChatViewAction.contextAction());
|
||||||
|
|
||||||
|
ActionBuilder closeChatViewAction(this, "QodeAssist.CloseChatView");
|
||||||
|
const QKeySequence closeChatViewShortcut = QKeySequence(Qt::CTRL | Qt::ALT | Qt::Key_S);
|
||||||
|
closeChatViewAction.setDefaultKeySequence(closeChatViewShortcut);
|
||||||
|
closeChatViewAction.setToolTip(Tr::tr("Close QodeAssist Chat"));
|
||||||
|
closeChatViewAction.setText(Tr::tr("Close QodeAssist Chat"));
|
||||||
|
closeChatViewAction.setIcon(QCODEASSIST_ICON.icon());
|
||||||
|
closeChatViewAction.addOnTriggered(this, [this] {
|
||||||
|
if (m_chatView->isVisible()) {
|
||||||
|
m_chatView->close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Core::ActionContainer *editorContextMenu = Core::ActionManager::actionContainer(
|
Core::ActionContainer *editorContextMenu = Core::ActionManager::actionContainer(
|
||||||
TextEditor::Constants::M_STANDARDCONTEXTMENU);
|
TextEditor::Constants::M_STANDARDCONTEXTMENU);
|
||||||
if (editorContextMenu) {
|
if (editorContextMenu) {
|
||||||
@ -193,10 +229,14 @@ public:
|
|||||||
editorContextMenu
|
editorContextMenu
|
||||||
->addAction(quickRefactorAction.command(), Core::Constants::G_DEFAULT_THREE);
|
->addAction(quickRefactorAction.command(), Core::Constants::G_DEFAULT_THREE);
|
||||||
editorContextMenu->addAction(requestAction.command(), Core::Constants::G_DEFAULT_THREE);
|
editorContextMenu->addAction(requestAction.command(), Core::Constants::G_DEFAULT_THREE);
|
||||||
|
editorContextMenu->addAction(showChatViewAction.command(),
|
||||||
|
Core::Constants::G_DEFAULT_THREE);
|
||||||
|
editorContextMenu->addAction(closeChatViewAction.command(),
|
||||||
|
Core::Constants::G_DEFAULT_THREE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void extensionsInitialized() final {}
|
void extensionsInitialized() final { m_chatView.reset(new Chat::ChatView()); }
|
||||||
|
|
||||||
void restartClient()
|
void restartClient()
|
||||||
{
|
{
|
||||||
@ -256,6 +296,7 @@ private:
|
|||||||
QPointer<PluginUpdater> m_updater;
|
QPointer<PluginUpdater> m_updater;
|
||||||
UpdateStatusWidget *m_statusWidget{nullptr};
|
UpdateStatusWidget *m_statusWidget{nullptr};
|
||||||
QString m_lastRefactorInstructions;
|
QString m_lastRefactorInstructions;
|
||||||
|
QScopedPointer<Chat::ChatView> m_chatView;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QodeAssist::Internal
|
} // namespace QodeAssist::Internal
|
||||||
|
@ -64,6 +64,14 @@ ChatAssistantSettings::ChatAssistantSettings()
|
|||||||
autosave.setDefaultValue(true);
|
autosave.setDefaultValue(true);
|
||||||
autosave.setLabelText(Tr::tr("Enable autosave when message received"));
|
autosave.setLabelText(Tr::tr("Enable autosave when message received"));
|
||||||
|
|
||||||
|
enableChatInBottomToolBar.setSettingsKey(Constants::CA_ENABLE_CHAT_IN_BOTTOM_TOOLBAR);
|
||||||
|
enableChatInBottomToolBar.setLabelText(Tr::tr("Enable chat in bottom toolbar"));
|
||||||
|
enableChatInBottomToolBar.setDefaultValue(false);
|
||||||
|
|
||||||
|
enableChatInNavigationPanel.setSettingsKey(Constants::CA_ENABLE_CHAT_IN_NAVIGATION_PANEL);
|
||||||
|
enableChatInNavigationPanel.setLabelText(Tr::tr("Enable chat in navigation panel"));
|
||||||
|
enableChatInNavigationPanel.setDefaultValue(false);
|
||||||
|
|
||||||
// General Parameters Settings
|
// General Parameters Settings
|
||||||
temperature.setSettingsKey(Constants::CA_TEMPERATURE);
|
temperature.setSettingsKey(Constants::CA_TEMPERATURE);
|
||||||
temperature.setLabelText(Tr::tr("Temperature:"));
|
temperature.setLabelText(Tr::tr("Temperature:"));
|
||||||
@ -226,29 +234,32 @@ ChatAssistantSettings::ChatAssistantSettings()
|
|||||||
chatViewSettingsGrid.addRow({codeFontFamily, codeFontSize});
|
chatViewSettingsGrid.addRow({codeFontFamily, codeFontSize});
|
||||||
chatViewSettingsGrid.addRow({textFormat});
|
chatViewSettingsGrid.addRow({textFormat});
|
||||||
|
|
||||||
return Column{
|
return Column{Row{Stretch{1}, resetToDefaults},
|
||||||
Row{Stretch{1}, resetToDefaults},
|
Space{8},
|
||||||
Space{8},
|
Group{title(Tr::tr("Chat Settings")),
|
||||||
Group{
|
Column{Row{chatTokensThreshold, Stretch{1}},
|
||||||
title(Tr::tr("Chat Settings")),
|
linkOpenFiles,
|
||||||
Column{Row{chatTokensThreshold, Stretch{1}}, linkOpenFiles, stream, autosave}},
|
stream,
|
||||||
Space{8},
|
autosave,
|
||||||
Group{
|
enableChatInBottomToolBar,
|
||||||
title(Tr::tr("General Parameters")),
|
enableChatInNavigationPanel}},
|
||||||
Row{genGrid, Stretch{1}},
|
Space{8},
|
||||||
},
|
Group{
|
||||||
Space{8},
|
title(Tr::tr("General Parameters")),
|
||||||
Group{title(Tr::tr("Advanced Parameters")), Column{Row{advancedGrid, Stretch{1}}}},
|
Row{genGrid, Stretch{1}},
|
||||||
Space{8},
|
},
|
||||||
Group{
|
Space{8},
|
||||||
title(Tr::tr("Context Settings")),
|
Group{title(Tr::tr("Advanced Parameters")),
|
||||||
Column{
|
Column{Row{advancedGrid, Stretch{1}}}},
|
||||||
Row{useSystemPrompt, Stretch{1}},
|
Space{8},
|
||||||
systemPrompt,
|
Group{title(Tr::tr("Context Settings")),
|
||||||
}},
|
Column{
|
||||||
Group{title(Tr::tr("Ollama Settings")), Column{Row{ollamaGrid, Stretch{1}}}},
|
Row{useSystemPrompt, Stretch{1}},
|
||||||
Group{title(Tr::tr("Chat Settings")), Row{chatViewSettingsGrid, Stretch{1}}},
|
systemPrompt,
|
||||||
Stretch{1}};
|
}},
|
||||||
|
Group{title(Tr::tr("Ollama Settings")), Column{Row{ollamaGrid, Stretch{1}}}},
|
||||||
|
Group{title(Tr::tr("Chat Settings")), Row{chatViewSettingsGrid, Stretch{1}}},
|
||||||
|
Stretch{1}};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,8 @@ public:
|
|||||||
Utils::BoolAspect linkOpenFiles{this};
|
Utils::BoolAspect linkOpenFiles{this};
|
||||||
Utils::BoolAspect stream{this};
|
Utils::BoolAspect stream{this};
|
||||||
Utils::BoolAspect autosave{this};
|
Utils::BoolAspect autosave{this};
|
||||||
|
Utils::BoolAspect enableChatInBottomToolBar{this};
|
||||||
|
Utils::BoolAspect enableChatInNavigationPanel{this};
|
||||||
|
|
||||||
// General Parameters Settings
|
// General Parameters Settings
|
||||||
Utils::DoubleAspect temperature{this};
|
Utils::DoubleAspect temperature{this};
|
||||||
|
@ -79,10 +79,6 @@ GeneralSettings::GeneralSettings()
|
|||||||
enableCheckUpdate.setLabelText(TrConstants::ENABLE_CHECK_UPDATE_ON_START);
|
enableCheckUpdate.setLabelText(TrConstants::ENABLE_CHECK_UPDATE_ON_START);
|
||||||
enableCheckUpdate.setDefaultValue(true);
|
enableCheckUpdate.setDefaultValue(true);
|
||||||
|
|
||||||
enableChat.setSettingsKey(Constants::ENABLE_CHAT);
|
|
||||||
enableChat.setLabelText(TrConstants::ENABLE_CHAT);
|
|
||||||
enableChat.setDefaultValue(true);
|
|
||||||
|
|
||||||
resetToDefaults.m_buttonText = TrConstants::RESET_TO_DEFAULTS;
|
resetToDefaults.m_buttonText = TrConstants::RESET_TO_DEFAULTS;
|
||||||
checkUpdate.m_buttonText = TrConstants::CHECK_UPDATE;
|
checkUpdate.m_buttonText = TrConstants::CHECK_UPDATE;
|
||||||
|
|
||||||
@ -258,7 +254,6 @@ GeneralSettings::GeneralSettings()
|
|||||||
Row{enableQodeAssist, Stretch{1}, Row{checkUpdate, resetToDefaults}},
|
Row{enableQodeAssist, Stretch{1}, Row{checkUpdate, resetToDefaults}},
|
||||||
Row{enableLogging, Stretch{1}},
|
Row{enableLogging, Stretch{1}},
|
||||||
Row{enableCheckUpdate, Stretch{1}},
|
Row{enableCheckUpdate, Stretch{1}},
|
||||||
Row{enableChat, Stretch{1}},
|
|
||||||
Space{8},
|
Space{8},
|
||||||
ccGroup,
|
ccGroup,
|
||||||
Space{8},
|
Space{8},
|
||||||
|
@ -36,7 +36,6 @@ public:
|
|||||||
Utils::BoolAspect enableQodeAssist{this};
|
Utils::BoolAspect enableQodeAssist{this};
|
||||||
Utils::BoolAspect enableLogging{this};
|
Utils::BoolAspect enableLogging{this};
|
||||||
Utils::BoolAspect enableCheckUpdate{this};
|
Utils::BoolAspect enableCheckUpdate{this};
|
||||||
Utils::BoolAspect enableChat{this};
|
|
||||||
|
|
||||||
ButtonAspect checkUpdate{this};
|
ButtonAspect checkUpdate{this};
|
||||||
ButtonAspect resetToDefaults{this};
|
ButtonAspect resetToDefaults{this};
|
||||||
|
@ -68,7 +68,6 @@ const char CC_SHOW_PROGRESS_WIDGET[] = "QodeAssist.ccShowProgressWidget";
|
|||||||
const char CC_USE_OPEN_FILES_CONTEXT[] = "QodeAssist.ccUseOpenFilesContext";
|
const char CC_USE_OPEN_FILES_CONTEXT[] = "QodeAssist.ccUseOpenFilesContext";
|
||||||
const char ENABLE_LOGGING[] = "QodeAssist.enableLogging";
|
const char ENABLE_LOGGING[] = "QodeAssist.enableLogging";
|
||||||
const char ENABLE_CHECK_UPDATE[] = "QodeAssist.enableCheckUpdate";
|
const char ENABLE_CHECK_UPDATE[] = "QodeAssist.enableCheckUpdate";
|
||||||
const char ENABLE_CHAT[] = "QodeAssist.enableChat";
|
|
||||||
|
|
||||||
const char PROVIDER_PATHS[] = "QodeAssist.providerPaths";
|
const char PROVIDER_PATHS[] = "QodeAssist.providerPaths";
|
||||||
const char СС_START_SUGGESTION_TIMER[] = "QodeAssist.startSuggestionTimer";
|
const char СС_START_SUGGESTION_TIMER[] = "QodeAssist.startSuggestionTimer";
|
||||||
@ -85,6 +84,9 @@ const char CA_STREAM[] = "QodeAssist.caStream";
|
|||||||
const char CA_AUTOSAVE[] = "QodeAssist.caAutosave";
|
const char CA_AUTOSAVE[] = "QodeAssist.caAutosave";
|
||||||
const char CC_CUSTOM_LANGUAGES[] = "QodeAssist.ccCustomLanguages";
|
const char CC_CUSTOM_LANGUAGES[] = "QodeAssist.ccCustomLanguages";
|
||||||
|
|
||||||
|
const char CA_ENABLE_CHAT_IN_BOTTOM_TOOLBAR[] = "QodeAssist.caEnableChatInBottomToolbar";
|
||||||
|
const char CA_ENABLE_CHAT_IN_NAVIGATION_PANEL[] = "QodeAssist.caEnableChatInNavigationPanel";
|
||||||
|
|
||||||
const char QODE_ASSIST_GENERAL_OPTIONS_ID[] = "QodeAssist.GeneralOptions";
|
const char QODE_ASSIST_GENERAL_OPTIONS_ID[] = "QodeAssist.GeneralOptions";
|
||||||
const char QODE_ASSIST_GENERAL_SETTINGS_PAGE_ID[] = "QodeAssist.1GeneralSettingsPageId";
|
const char QODE_ASSIST_GENERAL_SETTINGS_PAGE_ID[] = "QodeAssist.1GeneralSettingsPageId";
|
||||||
const char QODE_ASSIST_CODE_COMPLETION_SETTINGS_PAGE_ID[]
|
const char QODE_ASSIST_CODE_COMPLETION_SETTINGS_PAGE_ID[]
|
||||||
|