diff --git a/ChatView/ChatRootView.cpp b/ChatView/ChatRootView.cpp index c8ab0c1..89e5a5c 100644 --- a/ChatView/ChatRootView.cpp +++ b/ChatView/ChatRootView.cpp @@ -102,6 +102,26 @@ ChatRootView::ChatRootView(QQuickItem *parent) } } }); + connect( + &Settings::chatAssistantSettings().textFontFamily, + &Utils::BaseAspect::changed, + this, + &ChatRootView::textFamilyChanged); + connect( + &Settings::chatAssistantSettings().codeFontFamily, + &Utils::BaseAspect::changed, + this, + &ChatRootView::codeFamilyChanged); + connect( + &Settings::chatAssistantSettings().textFontSize, + &Utils::BaseAspect::changed, + this, + &ChatRootView::textFontSizeChanged); + connect( + &Settings::chatAssistantSettings().codeFontSize, + &Utils::BaseAspect::changed, + this, + &ChatRootView::codeFontSizeChanged); updateInputTokensCount(); } @@ -552,4 +572,24 @@ bool ChatRootView::shouldIgnoreFileForAttach(const Utils::FilePath &filePath) return false; } +QString ChatRootView::textFontFamily() const +{ + return Settings::chatAssistantSettings().textFontFamily.stringValue(); +} + +QString ChatRootView::codeFontFamily() const +{ + return Settings::chatAssistantSettings().codeFontFamily.stringValue(); +} + +int ChatRootView::codeFontSize() const +{ + return Settings::chatAssistantSettings().codeFontSize(); +} + +int ChatRootView::textFontSize() const +{ + return Settings::chatAssistantSettings().textFontSize(); +} + } // namespace QodeAssist::Chat diff --git a/ChatView/ChatRootView.hpp b/ChatView/ChatRootView.hpp index 16a83e4..a72fa70 100644 --- a/ChatView/ChatRootView.hpp +++ b/ChatView/ChatRootView.hpp @@ -38,6 +38,10 @@ class ChatRootView : public QQuickItem Q_PROPERTY(QStringList linkedFiles READ linkedFiles NOTIFY linkedFilesChanged FINAL) Q_PROPERTY(int inputTokensCount READ inputTokensCount NOTIFY inputTokensCountChanged FINAL) Q_PROPERTY(QString chatFileName READ chatFileName NOTIFY chatFileNameChanged FINAL) + Q_PROPERTY(QString textFontFamily READ textFontFamily NOTIFY textFamilyChanged FINAL) + Q_PROPERTY(QString codeFontFamily READ codeFontFamily NOTIFY codeFamilyChanged FINAL) + Q_PROPERTY(int codeFontSize READ codeFontSize NOTIFY codeFontSizeChanged FINAL) + Q_PROPERTY(int textFontSize READ textFontSize NOTIFY textFontSizeChanged FINAL) QML_ELEMENT @@ -80,6 +84,12 @@ public: void setRecentFilePath(const QString &filePath); bool shouldIgnoreFileForAttach(const Utils::FilePath &filePath); + QString textFontFamily() const; + QString codeFontFamily() const; + + int codeFontSize() const; + int textFontSize() const; + public slots: void sendMessage(const QString &message); void copyToClipboard(const QString &text); @@ -95,6 +105,10 @@ signals: void inputTokensCountChanged(); void isSyncOpenFilesChanged(); void chatFileNameChanged(); + void textFamilyChanged(); + void codeFamilyChanged(); + void codeFontSizeChanged(); + void textFontSizeChanged(); private: QString getChatsHistoryDir() const; diff --git a/ChatView/qml/ChatItem.qml b/ChatView/qml/ChatItem.qml index d39af9d..76b1944 100644 --- a/ChatView/qml/ChatItem.qml +++ b/ChatView/qml/ChatItem.qml @@ -27,6 +27,22 @@ Rectangle { property alias msgModel: msgCreator.model property alias messageAttachments: attachmentsModel.model + property string textFontFamily: Qt.application.font.family + property string codeFontFamily: { + switch (Qt.platform.os) { + case "windows": + return "Consolas"; + case "osx": + return "Menlo"; + case "linux": + return "DejaVu Sans Mono"; + default: + return "monospace"; + } + } + property int textFontSize: Qt.application.font.pointSize + property int codeFontSize: Qt.application.font.pointSize + property bool isUserMessage: false property int messageIndex: -1 property real listViewContentY: 0 @@ -159,6 +175,8 @@ Rectangle { verticalAlignment: Text.AlignVCenter leftPadding: 10 text: utils.getSafeMarkdownText(itemData.text) + font.family: root.textFontFamily + font.pointSize: root.textFontSize ChatUtils { id: utils @@ -178,5 +196,7 @@ Rectangle { code: itemData.text language: itemData.language + codeFontFamily: root.codeFontFamily + codeFontSize: root.codeFontSize } } diff --git a/ChatView/qml/RootItem.qml b/ChatView/qml/RootItem.qml index 863a262..598adcc 100644 --- a/ChatView/qml/RootItem.qml +++ b/ChatView/qml/RootItem.qml @@ -100,6 +100,10 @@ ChatRootView { isUserMessage: model.roleType === ChatModel.User messageIndex: index listViewContentY: chatListView.contentY + textFontFamily: root.textFontFamily + codeFontFamily: root.codeFontFamily + codeFontSize: root.codeFontSize + textFontSize: root.textFontSize onResetChatToMessage: function(index) { messageInput.text = model.content diff --git a/ChatView/qml/dialog/CodeBlock.qml b/ChatView/qml/dialog/CodeBlock.qml index 8ec7602..b0927b5 100644 --- a/ChatView/qml/dialog/CodeBlock.qml +++ b/ChatView/qml/dialog/CodeBlock.qml @@ -30,6 +30,9 @@ Rectangle { property real currentContentY: 0 property real blockStart: 0 + property alias codeFontFamily: codeText.font.family + property alias codeFontSize: codeText.font.pointSize + readonly property real buttonTopMargin: 5 readonly property real blockEnd: blockStart + root.height readonly property real maxButtonOffset: Math.max(0, root.height - copyButton.height - buttonTopMargin) @@ -45,19 +48,6 @@ Rectangle { return buttonTopMargin; } - readonly property string monospaceFont: { - switch (Qt.platform.os) { - case "windows": - return "Consolas"; - case "osx": - return "Menlo"; - case "linux": - return "DejaVu Sans Mono"; - default: - return "monospace"; - } - } - color: palette.alternateBase border.color: root.color.hslLightness > 0.5 ? Qt.darker(root.color, 1.3) : Qt.lighter(root.color, 1.3) @@ -77,8 +67,6 @@ Rectangle { text: root.code readOnly: true selectByMouse: true - font.family: root.monospaceFont - font.pointSize: Qt.application.font.pointSize color: parent.color.hslLightness > 0.5 ? "black" : "white" wrapMode: Text.WordWrap selectionColor: palette.highlight @@ -93,7 +81,7 @@ Rectangle { text: root.language color: root.color.hslLightness > 0.5 ? Qt.darker(root.color, 1.1) : Qt.lighter(root.color, 1.1) - font.pointSize: 8 + font.pointSize: codeText.font.pointSize - 4 } QoAButton { diff --git a/settings/ChatAssistantSettings.cpp b/settings/ChatAssistantSettings.cpp index ef1a821..22290ef 100644 --- a/settings/ChatAssistantSettings.cpp +++ b/settings/ChatAssistantSettings.cpp @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include "SettingsConstants.hpp" @@ -137,6 +139,57 @@ ChatAssistantSettings::ChatAssistantSettings() contextWindow.setRange(-1, 10000); contextWindow.setDefaultValue(2048); + autosave.setDefaultValue(true); + autosave.setLabelText(Tr::tr("Enable autosave when message received")); + + textFontFamily.setSettingsKey(Constants::CA_TEXT_FONT_FAMILY); + textFontFamily.setLabelText(Tr::tr("Text Font:")); + textFontFamily.setDisplayStyle(Utils::SelectionAspect::DisplayStyle::ComboBox); + const QStringList families = QFontDatabase::families(); + for (const QString &family : families) { + textFontFamily.addOption(family); + } + textFontFamily.setDefaultValue(QApplication::font().family()); + + textFontSize.setSettingsKey(Constants::CA_TEXT_FONT_SIZE); + textFontSize.setLabelText(Tr::tr("Text Font Size:")); + textFontSize.setDefaultValue(QApplication::font().pointSize()); + + codeFontFamily.setSettingsKey(Constants::CA_CODE_FONT_FAMILY); + codeFontFamily.setLabelText(Tr::tr("Code Font:")); + codeFontFamily.setDisplayStyle(Utils::SelectionAspect::DisplayStyle::ComboBox); + const QStringList monospaceFamilies = QFontDatabase::families(QFontDatabase::Latin); + for (const QString &family : monospaceFamilies) { + if (QFontDatabase::isFixedPitch(family)) { + codeFontFamily.addOption(family); + } + } + + QString defaultMonoFont; + QStringList fixedPitchFamilies; + + for (const QString &family : monospaceFamilies) { + if (QFontDatabase::isFixedPitch(family)) { + fixedPitchFamilies.append(family); + } + } + + if (fixedPitchFamilies.contains("Consolas")) { + defaultMonoFont = "Consolas"; + } else if (fixedPitchFamilies.contains("Courier New")) { + defaultMonoFont = "Courier New"; + } else if (fixedPitchFamilies.contains("Monospace")) { + defaultMonoFont = "Monospace"; + } else if (!fixedPitchFamilies.isEmpty()) { + defaultMonoFont = fixedPitchFamilies.first(); + } else { + defaultMonoFont = QApplication::font().family(); + } + codeFontFamily.setDefaultValue(defaultMonoFont); + codeFontSize.setSettingsKey(Constants::CA_CODE_FONT_SIZE); + codeFontSize.setLabelText(Tr::tr("Code Font Size:")); + codeFontSize.setDefaultValue(QApplication::font().pointSize()); + resetToDefaults.m_buttonText = TrConstants::RESET_TO_DEFAULTS; readSettings(); @@ -160,6 +213,10 @@ ChatAssistantSettings::ChatAssistantSettings() ollamaGrid.addRow({ollamaLivetime}); ollamaGrid.addRow({contextWindow}); + auto chatViewSettingsGrid = Grid{}; + chatViewSettingsGrid.addRow({textFontFamily, textFontSize}); + chatViewSettingsGrid.addRow({codeFontFamily, codeFontSize}); + return Column{ Row{Stretch{1}, resetToDefaults}, Space{8}, @@ -181,6 +238,7 @@ ChatAssistantSettings::ChatAssistantSettings() systemPrompt, }}, Group{title(Tr::tr("Ollama Settings")), Column{Row{ollamaGrid, Stretch{1}}}}, + Group{title(Tr::tr("Chat Settings")), Row{chatViewSettingsGrid, Stretch{1}}}, Stretch{1}}; }); } @@ -221,6 +279,10 @@ void ChatAssistantSettings::resetSettingsToDefaults() resetAspect(ollamaLivetime); resetAspect(contextWindow); resetAspect(linkOpenFiles); + resetAspect(textFontFamily); + resetAspect(codeFontFamily); + resetAspect(textFontSize); + resetAspect(codeFontSize); } } diff --git a/settings/ChatAssistantSettings.hpp b/settings/ChatAssistantSettings.hpp index a99bf4c..09c1d7a 100644 --- a/settings/ChatAssistantSettings.hpp +++ b/settings/ChatAssistantSettings.hpp @@ -63,6 +63,12 @@ public: Utils::StringAspect ollamaLivetime{this}; Utils::IntegerAspect contextWindow{this}; + // Visuals settings + Utils::SelectionAspect textFontFamily{this}; + Utils::IntegerAspect textFontSize{this}; + Utils::SelectionAspect codeFontFamily{this}; + Utils::IntegerAspect codeFontSize{this}; + private: void setupConnections(); void resetSettingsToDefaults(); diff --git a/settings/SettingsConstants.hpp b/settings/SettingsConstants.hpp index 35c2147..528a760 100644 --- a/settings/SettingsConstants.hpp +++ b/settings/SettingsConstants.hpp @@ -151,5 +151,9 @@ const char CA_USE_FREQUENCY_PENALTY[] = "QodeAssist.chatUseFrequencyPenalty"; const char CA_FREQUENCY_PENALTY[] = "QodeAssist.chatFrequencyPenalty"; const char CA_OLLAMA_LIVETIME[] = "QodeAssist.chatOllamaLivetime"; const char CA_OLLAMA_CONTEXT_WINDOW[] = "QodeAssist.caOllamaContextWindow"; +const char CA_TEXT_FONT_FAMILY[] = "QodeAssist.caTextFontFamily"; +const char CA_TEXT_FONT_SIZE[] = "QodeAssist.caTextFontSize"; +const char CA_CODE_FONT_FAMILY[] = "QodeAssist.caCodeFontFamily"; +const char CA_CODE_FONT_SIZE[] = "QodeAssist.caCodeFontSize"; } // namespace QodeAssist::Constants