Latest v3.0.0 rc4 fixes (#2490)
* Use the same font size for code blocks as we do for the rest of the chat text. * Add a conversation tray after discussion with Vincent and Andriy and gathering of feedback from some other users. This adds the reset context back as a recycle button and copy chat features back to the app for v3.0.0. Signed-off-by: Adam Treat <treat.adam@gmail.com>
@ -175,6 +175,7 @@ qt_add_qml_module(chat
|
|||||||
icons/antenna_3.svg
|
icons/antenna_3.svg
|
||||||
icons/send_message.svg
|
icons/send_message.svg
|
||||||
icons/stop_generating.svg
|
icons/stop_generating.svg
|
||||||
|
icons/recycle.svg
|
||||||
icons/regenerate.svg
|
icons/regenerate.svg
|
||||||
icons/caret_down.svg
|
icons/caret_down.svg
|
||||||
icons/caret_right.svg
|
icons/caret_right.svg
|
||||||
|
@ -888,6 +888,7 @@ ChatViewTextProcessor::ChatViewTextProcessor(QObject *parent)
|
|||||||
, m_syntaxHighlighter(new SyntaxHighlighter(this))
|
, m_syntaxHighlighter(new SyntaxHighlighter(this))
|
||||||
, m_isProcessingText(false)
|
, m_isProcessingText(false)
|
||||||
, m_shouldProcessText(true)
|
, m_shouldProcessText(true)
|
||||||
|
, m_fontPixelSize(QGuiApplication::font().pointSizeF())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,6 +934,20 @@ void ChatViewTextProcessor::setShouldProcessText(bool b)
|
|||||||
handleTextChanged();
|
handleTextChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qreal ChatViewTextProcessor::fontPixelSize() const
|
||||||
|
{
|
||||||
|
return m_fontPixelSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatViewTextProcessor::setFontPixelSize(qreal sz)
|
||||||
|
{
|
||||||
|
if (m_fontPixelSize == sz)
|
||||||
|
return;
|
||||||
|
m_fontPixelSize = sz;
|
||||||
|
emit fontPixelSizeChanged();
|
||||||
|
handleTextChanged();
|
||||||
|
}
|
||||||
|
|
||||||
void traverseDocument(QTextDocument *doc, QTextFrame *frame)
|
void traverseDocument(QTextDocument *doc, QTextFrame *frame)
|
||||||
{
|
{
|
||||||
QTextFrame *rootFrame = frame ? frame : doc->rootFrame();
|
QTextFrame *rootFrame = frame ? frame : doc->rootFrame();
|
||||||
@ -1126,7 +1141,7 @@ void ChatViewTextProcessor::handleCodeBlocks()
|
|||||||
codeBlockCharFormat.setForeground(defaultColor);
|
codeBlockCharFormat.setForeground(defaultColor);
|
||||||
|
|
||||||
QFont monospaceFont("Courier");
|
QFont monospaceFont("Courier");
|
||||||
monospaceFont.setPointSize(QGuiApplication::font().pointSize() + 2);
|
monospaceFont.setPointSize(m_fontPixelSize);
|
||||||
if (monospaceFont.family() != "Courier") {
|
if (monospaceFont.family() != "Courier") {
|
||||||
monospaceFont.setFamily("Monospace"); // Fallback if Courier isn't available
|
monospaceFont.setFamily("Monospace"); // Fallback if Courier isn't available
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ class ChatViewTextProcessor : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(QQuickTextDocument* textDocument READ textDocument WRITE setTextDocument NOTIFY textDocumentChanged())
|
Q_PROPERTY(QQuickTextDocument* textDocument READ textDocument WRITE setTextDocument NOTIFY textDocumentChanged())
|
||||||
Q_PROPERTY(bool shouldProcessText READ shouldProcessText WRITE setShouldProcessText NOTIFY shouldProcessTextChanged())
|
Q_PROPERTY(bool shouldProcessText READ shouldProcessText WRITE setShouldProcessText NOTIFY shouldProcessTextChanged())
|
||||||
|
Q_PROPERTY(qreal fontPixelSize READ fontPixelSize WRITE setFontPixelSize NOTIFY fontPixelSizeChanged())
|
||||||
QML_ELEMENT
|
QML_ELEMENT
|
||||||
public:
|
public:
|
||||||
explicit ChatViewTextProcessor(QObject *parent = nullptr);
|
explicit ChatViewTextProcessor(QObject *parent = nullptr);
|
||||||
@ -57,9 +58,13 @@ public:
|
|||||||
bool shouldProcessText() const;
|
bool shouldProcessText() const;
|
||||||
void setShouldProcessText(bool b);
|
void setShouldProcessText(bool b);
|
||||||
|
|
||||||
|
qreal fontPixelSize() const;
|
||||||
|
void setFontPixelSize(qreal b);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void textDocumentChanged();
|
void textDocumentChanged();
|
||||||
void shouldProcessTextChanged();
|
void shouldProcessTextChanged();
|
||||||
|
void fontPixelSizeChanged();
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void handleTextChanged();
|
void handleTextChanged();
|
||||||
@ -75,6 +80,7 @@ private:
|
|||||||
QColor m_headerColor;
|
QColor m_headerColor;
|
||||||
bool m_shouldProcessText = false;
|
bool m_shouldProcessText = false;
|
||||||
bool m_isProcessingText = false;
|
bool m_isProcessingText = false;
|
||||||
|
qreal m_fontPixelSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CHATVIEWTEXTPROCESSOR_H
|
#endif // CHATVIEWTEXTPROCESSOR_H
|
||||||
|
@ -1,5 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="#7d7d8e" viewBox="0 0 352 512"><path d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path></svg>
|
||||||
<!--
|
|
||||||
Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
|
|
||||||
License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
||||||
-->
|
|
Before Width: | Height: | Size: 686 B After Width: | Height: | Size: 308 B |
@ -1,9 +1 @@
|
|||||||
<svg fill="#7d7d8e" height="800px" width="800px" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" xmlns:xlink="http://www.w3.org/1999/xlink" enable-background="new 0 0 512 512">
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"></path></svg>
|
||||||
<g>
|
|
||||||
<g>
|
|
||||||
<path d="M480.6,109.1h-87.5V31.4c0-11.3-9.1-20.4-20.4-20.4H31.4C20.1,11,11,20.1,11,31.4v351c0,11.3,9.1,20.4,20.4,20.4h87.5 v77.7c0,11.3,9.1,20.4,20.4,20.4h341.3c11.3,0,20.4-9.1,20.4-20.4v-351C501,118.3,491.9,109.1,480.6,109.1z M51.8,362V51.8h300.4 v57.3H139.3c-11.3,0-20.4,9.1-20.4,20.4V362H51.8z M460.2,460.2H159.7V150h300.4V460.2z"/>
|
|
||||||
<path d="m233.3,254.4h155.8c11.3,0 20.4-9.1 20.4-20.4 0-11.3-9.1-20.4-20.4-20.4h-155.8c-11.3,0-20.4,9.1-20.4,20.4 0,11.2 9.1,20.4 20.4,20.4z"/>
|
|
||||||
<path d="m233.3,396.6h155.8c11.3,0 20.4-9.1 20.4-20.4 0-11.3-9.1-20.4-20.4-20.4h-155.8c-11.3,0-20.4,9.1-20.4,20.4 0,11.3 9.1,20.4 20.4,20.4z"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 885 B After Width: | Height: | Size: 303 B |
@ -1,5 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="#7d7d8e" viewBox="0 0 512 512"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm-32-316v116h-67c-10.7 0-16 12.9-8.5 20.5l99 99c4.7 4.7 12.3 4.7 17 0l99-99c7.6-7.6 2.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z"></path></svg>
|
||||||
<!--
|
|
||||||
Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
|
|
||||||
License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
||||||
-->
|
|
Before Width: | Height: | Size: 576 B After Width: | Height: | Size: 341 B |
@ -1,6 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V158.75l-26.07-26.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L40,149.37V56ZM40,172l52-52,80,80H40Zm176,28H194.63l-36-36,20-20L216,181.38V200ZM144,100a12,12,0,1,1,12,12A12,12,0,0,1,144,100Z"></path></svg>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="#7d7d8e" viewBox="0 0 512 512"><path d="M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z"/></svg>
|
|
||||||
<!--
|
|
||||||
Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
|
|
||||||
License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
||||||
-->
|
|
Before Width: | Height: | Size: 606 B After Width: | Height: | Size: 424 B |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="#7d7d8e" viewBox="0 0 22 22"><g transform="matrix(1.37217 0 0 1.37217-27.479-15.472)"><path d="m28.04 13.847c-2.891 0-5.608 1.126-7.652 3.17l1.167 1.167c1.732-1.732 4.04-2.686 6.485-2.686 2.45 0 4.753.954 6.485 2.686l1.167-1.167c-2.044-2.044-4.761-3.17-7.652-3.17"/><path d="m22.466 19.09l1.167 1.167c1.178-1.178 2.745-1.828 4.412-1.828 1.667 0 3.233.649 4.412 1.828l1.167-1.167c-1.49-1.49-3.471-2.311-5.579-2.311-2.108 0-4.089.821-5.579 2.311"/><path d="m24.541 21.17l1.167 1.167c.624-.624 1.454-.968 2.337-.968.883 0 1.712.344 2.337.968l1.167-1.167c-.936-.936-2.18-1.451-3.504-1.451-1.324 0-2.568.515-3.504 1.451"/><path d="m28.04 22.994c-.429 0-.858.164-1.185.491-.011.011-.022.023-.033.035l1.218 1.222 1.221-1.218c-.012-.013-.024-.026-.036-.038-.327-.327-.756-.491-1.185-.491"/></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M140,204a12,12,0,1,1-12-12A12,12,0,0,1,140,204ZM237.08,87A172,172,0,0,0,18.92,87,8,8,0,0,0,29.08,99.37a156,156,0,0,1,197.84,0A8,8,0,0,0,237.08,87ZM205,122.77a124,124,0,0,0-153.94,0A8,8,0,0,0,61,135.31a108,108,0,0,1,134.06,0,8,8,0,0,0,11.24-1.3A8,8,0,0,0,205,122.77Zm-32.26,35.76a76.05,76.05,0,0,0-89.42,0,8,8,0,0,0,9.42,12.94,60,60,0,0,1,70.58,0,8,8,0,1,0,9.42-12.94Z"></path></svg>
|
Before Width: | Height: | Size: 839 B After Width: | Height: | Size: 491 B |
@ -1,8 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M140,180a12,12,0,1,1-12-12A12,12,0,0,1,140,180ZM128,72c-22.06,0-40,16.15-40,36v4a8,8,0,0,0,16,0v-4c0-11,10.77-20,24-20s24,9,24,20-10.77,20-24,20a8,8,0,0,0-8,8v8a8,8,0,0,0,16,0v-.72c18.24-3.35,32-17.9,32-35.28C168,88.15,150.06,72,128,72Zm104,56A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"></path></svg>
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
<svg id="svg2" xmlns="http://www.w3.org/2000/svg" fill="#7d7d8e" height="200" width="200" version="1.0">
|
|
||||||
<path id="path2382" d="m165.33 113.44a103.61 103.61 0 1 1 -207.22 0 103.61 103.61 0 1 1 207.22 0z" transform="matrix(.93739 0 0 .93739 42.143 -6.3392)" stroke-width="0" fill="#fff"/>
|
|
||||||
<g id="layer1">
|
|
||||||
<path id="path2413" d="m100 0c-55.2 0-100 44.8-100 100-5.0495e-15 55.2 44.8 100 100 100s100-44.8 100-100-44.8-100-100-100zm0 12.812c48.13 0 87.19 39.058 87.19 87.188s-39.06 87.19-87.19 87.19-87.188-39.06-87.188-87.19 39.058-87.188 87.188-87.188zm1.47 21.25c-5.45 0.03-10.653 0.737-15.282 2.063-4.699 1.346-9.126 3.484-12.876 6.219-3.238 2.362-6.333 5.391-8.687 8.531-4.159 5.549-6.461 11.651-7.063 18.687-0.04 0.468-0.07 0.868-0.062 0.876 0.016 0.016 21.702 2.687 21.812 2.687 0.053 0 0.113-0.234 0.282-0.937 1.941-8.085 5.486-13.521 10.968-16.813 4.32-2.594 9.808-3.612 15.778-2.969 2.74 0.295 5.21 0.96 7.38 2 2.71 1.301 5.18 3.361 6.94 5.813 1.54 2.156 2.46 4.584 2.75 7.312 0.08 0.759 0.05 2.48-0.03 3.219-0.23 1.826-0.7 3.378-1.5 4.969-0.81 1.597-1.48 2.514-2.76 3.812-2.03 2.077-5.18 4.829-10.78 9.407-3.6 2.944-6.04 5.156-8.12 7.343-4.943 5.179-7.191 9.069-8.564 14.719-0.905 3.72-1.256 7.55-1.156 13.19 0.025 1.4 0.062 2.73 0.062 2.97v0.43h21.598l0.03-2.4c0.03-3.27 0.21-5.37 0.56-7.41 0.57-3.27 1.43-5 3.94-7.81 1.6-1.8 3.7-3.76 6.93-6.47 4.77-3.991 8.11-6.99 11.26-10.125 4.91-4.907 7.46-8.26 9.28-12.187 1.43-3.092 2.22-6.166 2.46-9.532 0.06-0.816 0.07-3.03 0-3.968-0.45-7.043-3.1-13.253-8.15-19.032-0.8-0.909-2.78-2.887-3.72-3.718-4.96-4.394-10.69-7.353-17.56-9.094-4.19-1.062-8.23-1.6-13.35-1.75-0.78-0.023-1.59-0.036-2.37-0.032zm-10.908 103.6v22h21.998v-22h-21.998z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 466 B |
1
gpt4all-chat/icons/recycle.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M96,208a8,8,0,0,1-8,8H40a24,24,0,0,1-20.77-36l34.29-59.25L39.47,124.5A8,8,0,1,1,35.33,109l32.77-8.77a8,8,0,0,1,9.8,5.66l8.79,32.77A8,8,0,0,1,81,148.5a8.37,8.37,0,0,1-2.08.27,8,8,0,0,1-7.72-5.93l-3.8-14.15L33.11,188A8,8,0,0,0,40,200H88A8,8,0,0,1,96,208Zm140.73-28-23.14-40a8,8,0,0,0-13.84,8l23.14,40A8,8,0,0,1,216,200H147.31l10.34-10.34a8,8,0,0,0-11.31-11.32l-24,24a8,8,0,0,0,0,11.32l24,24a8,8,0,0,0,11.31-11.32L147.31,216H216a24,24,0,0,0,20.77-36ZM128,32a7.85,7.85,0,0,1,6.92,4l34.29,59.25-14.08-3.78A8,8,0,0,0,151,106.92l32.78,8.79a8.23,8.23,0,0,0,2.07.27,8,8,0,0,0,7.72-5.93l8.79-32.79a8,8,0,1,0-15.45-4.14l-3.8,14.17L148.77,28a24,24,0,0,0-41.54,0L84.07,68a8,8,0,0,0,13.85,8l23.16-40A7.85,7.85,0,0,1,128,32Z"></path></svg>
|
After Width: | Height: | Size: 833 B |
1
gpt4all-chat/icons/redo.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z"></path></svg>
|
After Width: | Height: | Size: 320 B |
@ -1 +1 @@
|
|||||||
<svg stroke="#7d7d8e" fill="none" stroke-width="1.5" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-3 w-3" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><polyline points="1 4 1 10 7 10"></polyline><polyline points="23 20 23 14 17 14"></polyline><path d="M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15"></path></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"></path></svg>
|
Before Width: | Height: | Size: 380 B After Width: | Height: | Size: 527 B |
@ -1,6 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"></path></svg>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
|
|
||||||
<!--
|
|
||||||
Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
|
|
||||||
License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
||||||
-->
|
|
Before Width: | Height: | Size: 602 B After Width: | Height: | Size: 267 B |
@ -1 +1 @@
|
|||||||
<svg stroke="#7d7d8e" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4 mr-1" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14,0-.07-40.06-82.3,48-48a8,8,0,0,0-11.31-11.31l-48,48L24.08,98.25l-.07,0,.14,0L216,40Z"></path></svg>
|
Before Width: | Height: | Size: 304 B After Width: | Height: | Size: 453 B |
@ -1 +1 @@
|
|||||||
<svg stroke="#7d7d8e" fill="none" stroke-width="1.5" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-3 w-3" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M200,40H56A16,16,0,0,0,40,56V200a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,160H56V56H200V200Z"></path></svg>
|
Before Width: | Height: | Size: 265 B After Width: | Height: | Size: 240 B |
@ -1,5 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="#7d7d8e" viewBox="0 0 512 512"><path d="M0 56v240c0 13.255 10.745 24 24 24h80c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H24C10.745 32 0 42.745 0 56zm40 200c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24zm272 256c-20.183 0-29.485-39.293-33.931-57.795-5.206-21.666-10.589-44.07-25.393-58.902-32.469-32.524-49.503-73.967-89.117-113.111a11.98 11.98 0 0 1-3.558-8.521V59.901c0-6.541 5.243-11.878 11.783-11.998 15.831-.29 36.694-9.079 52.651-16.178C256.189 17.598 295.709.017 343.995 0h2.844c42.777 0 93.363.413 113.774 29.737 8.392 12.057 10.446 27.034 6.148 44.632 16.312 17.053 25.063 48.863 16.382 74.757 17.544 23.432 19.143 56.132 9.308 79.469l.11.11c11.893 11.949 19.523 31.259 19.439 49.197-.156 30.352-26.157 58.098-59.553 58.098H350.723C358.03 364.34 384 388.132 384 430.548 384 504 336 512 312 512z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M239.82,157l-12-96A24,24,0,0,0,204,40H32A16,16,0,0,0,16,56v88a16,16,0,0,0,16,16H75.06l37.78,75.58A8,8,0,0,0,120,240a40,40,0,0,0,40-40V184h56a24,24,0,0,0,23.82-27ZM72,144H32V56H72Zm150,21.29a7.88,7.88,0,0,1-6,2.71H152a8,8,0,0,0-8,8v24a24,24,0,0,1-19.29,23.54L88,150.11V56H204a8,8,0,0,1,7.94,7l12,96A7.87,7.87,0,0,1,222,165.29Z"></path></svg>
|
||||||
<!--
|
|
||||||
Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
|
|
||||||
License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
||||||
-->
|
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 449 B |
@ -1,5 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" fill="#7d7d8e" viewBox="0 0 512 512"><path d="M104 224H24c-13.255 0-24 10.745-24 24v240c0 13.255 10.745 24 24 24h80c13.255 0 24-10.745 24-24V248c0-13.255-10.745-24-24-24zM64 472c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zM384 81.452c0 42.416-25.97 66.208-33.277 94.548h101.723c33.397 0 59.397 27.746 59.553 58.098.084 17.938-7.546 37.249-19.439 49.197l-.11.11c9.836 23.337 8.237 56.037-9.308 79.469 8.681 25.895-.069 57.704-16.382 74.757 4.298 17.598 2.244 32.575-6.148 44.632C440.202 511.587 389.616 512 346.839 512l-2.845-.001c-48.287-.017-87.806-17.598-119.56-31.725-15.957-7.099-36.821-15.887-52.651-16.178-6.54-.12-11.783-5.457-11.783-11.998v-213.77c0-3.2 1.282-6.271 3.558-8.521 39.614-39.144 56.648-80.587 89.117-113.111 14.804-14.832 20.188-37.236 25.393-58.902C282.515 39.293 291.817 0 312 0c24 0 72 8 72 81.452z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M234,80.12A24,24,0,0,0,216,72H160V56a40,40,0,0,0-40-40,8,8,0,0,0-7.16,4.42L75.06,96H32a16,16,0,0,0-16,16v88a16,16,0,0,0,16,16H204a24,24,0,0,0,23.82-21l12-96A24,24,0,0,0,234,80.12ZM32,112H72v88H32ZM223.94,97l-12,96a8,8,0,0,1-7.94,7H88V105.89l36.71-73.43A24,24,0,0,1,144,56V80a8,8,0,0,0,8,8h64a8,8,0,0,1,7.94,9Z"></path></svg>
|
||||||
<!--
|
|
||||||
Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
|
|
||||||
License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
||||||
-->
|
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 433 B |
1
gpt4all-chat/icons/undo.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M224,128a96,96,0,0,1-94.71,96H128A95.38,95.38,0,0,1,62.1,197.8a8,8,0,0,1,11-11.63A80,80,0,1,0,71.43,71.39a3.07,3.07,0,0,1-.26.25L44.59,96H72a8,8,0,0,1,0,16H24a8,8,0,0,1-8-8V56a8,8,0,0,1,16,0V85.8L60.25,60A96,96,0,0,1,224,128Z"></path></svg>
|
After Width: | Height: | Size: 349 B |
@ -949,6 +949,7 @@ Rectangle {
|
|||||||
|
|
||||||
ChatViewTextProcessor {
|
ChatViewTextProcessor {
|
||||||
id: textProcessor
|
id: textProcessor
|
||||||
|
fontPixelSize: myTextArea.font.pixelSize
|
||||||
}
|
}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
@ -1019,9 +1020,9 @@ Rectangle {
|
|||||||
MyToolButton {
|
MyToolButton {
|
||||||
id: thumbsDown
|
id: thumbsDown
|
||||||
anchors.top: thumbsUp.top
|
anchors.top: thumbsUp.top
|
||||||
anchors.topMargin: 10
|
anchors.topMargin: 3
|
||||||
anchors.left: thumbsUp.right
|
anchors.left: thumbsUp.right
|
||||||
anchors.leftMargin: 2
|
anchors.leftMargin: 3
|
||||||
width: 24
|
width: 24
|
||||||
height: 24
|
height: 24
|
||||||
imageWidth: width
|
imageWidth: width
|
||||||
@ -1307,33 +1308,122 @@ Rectangle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: conversationTrayContent
|
||||||
|
anchors.bottom: conversationTrayButton.top
|
||||||
|
anchors.horizontalCenter: conversationTrayButton.horizontalCenter
|
||||||
|
width: conversationTrayContentLayout.width
|
||||||
|
height: conversationTrayContentLayout.height
|
||||||
|
color: theme.containerBackground
|
||||||
|
radius: 5
|
||||||
|
opacity: 0
|
||||||
|
visible: false
|
||||||
|
clip: true
|
||||||
|
z: 400
|
||||||
|
|
||||||
|
property bool isHovered: {
|
||||||
|
return conversationTrayButton.isHovered ||
|
||||||
|
resetContextButton.hovered || copyChatButton.hovered ||
|
||||||
|
regenerateButton.hovered || stopButton.hovered
|
||||||
|
}
|
||||||
|
|
||||||
|
state: conversationTrayContent.isHovered ? "expanded" : "collapsed"
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "expanded"
|
||||||
|
PropertyChanges { target: conversationTrayContent; opacity: 1 }
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "collapsed"
|
||||||
|
PropertyChanges { target: conversationTrayContent; opacity: 0 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
transitions: [
|
||||||
|
Transition {
|
||||||
|
from: "collapsed"
|
||||||
|
to: "expanded"
|
||||||
|
SequentialAnimation {
|
||||||
|
ScriptAction {
|
||||||
|
script: conversationTrayContent.visible = true
|
||||||
|
}
|
||||||
|
PropertyAnimation {
|
||||||
|
target: conversationTrayContent
|
||||||
|
property: "opacity"
|
||||||
|
duration: 300
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Transition {
|
||||||
|
from: "expanded"
|
||||||
|
to: "collapsed"
|
||||||
|
SequentialAnimation {
|
||||||
|
PropertyAnimation {
|
||||||
|
target: conversationTrayContent
|
||||||
|
property: "opacity"
|
||||||
|
duration: 300
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
}
|
||||||
|
ScriptAction {
|
||||||
|
script: conversationTrayContent.visible = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
id: conversationButtons
|
id: conversationTrayContentLayout
|
||||||
anchors.bottom: textInputView.top
|
spacing: 0
|
||||||
anchors.horizontalCenter: textInputView.horizontalCenter
|
MyToolButton {
|
||||||
anchors.bottomMargin: 20
|
id: resetContextButton
|
||||||
spacing: 10
|
Layout.preferredWidth: 40
|
||||||
MyButton {
|
Layout.preferredHeight: 40
|
||||||
textColor: theme.textColor
|
source: "qrc:/gpt4all/icons/recycle.svg"
|
||||||
visible: chatModel.count && !currentChat.isServer && currentChat.isModelLoaded
|
imageWidth: 20
|
||||||
Image {
|
imageHeight: 20
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
onClicked: {
|
||||||
anchors.left: parent.left
|
Network.trackChatEvent("reset_context", { "length": chatModel.count })
|
||||||
anchors.leftMargin: 15
|
currentChat.reset();
|
||||||
source: currentChat.responseInProgress ? "qrc:/gpt4all/icons/stop_generating.svg" : "qrc:/gpt4all/icons/regenerate.svg"
|
currentChat.processSystemPrompt();
|
||||||
}
|
}
|
||||||
|
ToolTip.visible: resetContextButton.hovered
|
||||||
leftPadding: 50
|
ToolTip.text: qsTr("Erase and reset chat session")
|
||||||
|
}
|
||||||
|
MyToolButton {
|
||||||
|
id: copyChatButton
|
||||||
|
Layout.preferredWidth: 40
|
||||||
|
Layout.preferredHeight: 40
|
||||||
|
source: "qrc:/gpt4all/icons/copy.svg"
|
||||||
|
imageWidth: 20
|
||||||
|
imageHeight: 20
|
||||||
|
TextEdit{
|
||||||
|
id: copyEdit
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
onClicked: {
|
||||||
|
var conversation = getConversation()
|
||||||
|
copyEdit.text = conversation
|
||||||
|
copyEdit.selectAll()
|
||||||
|
copyEdit.copy()
|
||||||
|
copyMessage.open()
|
||||||
|
}
|
||||||
|
ToolTip.visible: copyChatButton.hovered
|
||||||
|
ToolTip.text: qsTr("Copy chat session to clipboard")
|
||||||
|
}
|
||||||
|
MyToolButton {
|
||||||
|
id: regenerateButton
|
||||||
|
Layout.preferredWidth: 40
|
||||||
|
Layout.preferredHeight: 40
|
||||||
|
source: "qrc:/gpt4all/icons/regenerate.svg"
|
||||||
|
imageWidth: 20
|
||||||
|
imageHeight: 20
|
||||||
|
visible: chatModel.count && !currentChat.isServer && currentChat.isModelLoaded && !currentChat.responseInProgress
|
||||||
onClicked: {
|
onClicked: {
|
||||||
var index = Math.max(0, chatModel.count - 1);
|
var index = Math.max(0, chatModel.count - 1);
|
||||||
var listElement = chatModel.get(index);
|
var listElement = chatModel.get(index);
|
||||||
|
|
||||||
if (currentChat.responseInProgress) {
|
|
||||||
listElement.stopped = true
|
|
||||||
currentChat.stopGenerating()
|
|
||||||
} else {
|
|
||||||
currentChat.regenerateResponse()
|
currentChat.regenerateResponse()
|
||||||
if (chatModel.count) {
|
if (chatModel.count) {
|
||||||
if (listElement.name === qsTr("Response: ")) {
|
if (listElement.name === qsTr("Response: ")) {
|
||||||
@ -1346,21 +1436,58 @@ Rectangle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ToolTip.visible: regenerateButton.hovered
|
||||||
|
ToolTip.text: qsTr("Redo last chat response")
|
||||||
|
}
|
||||||
|
MyToolButton {
|
||||||
|
id: stopButton
|
||||||
|
Layout.preferredWidth: 40
|
||||||
|
Layout.preferredHeight: 40
|
||||||
|
source: "qrc:/gpt4all/icons/stop_generating.svg"
|
||||||
|
imageWidth: 20
|
||||||
|
imageHeight: 20
|
||||||
|
visible: currentChat.responseInProgress
|
||||||
|
onClicked: {
|
||||||
|
var index = Math.max(0, chatModel.count - 1);
|
||||||
|
var listElement = chatModel.get(index);
|
||||||
|
listElement.stopped = true
|
||||||
|
currentChat.stopGenerating()
|
||||||
|
}
|
||||||
|
ToolTip.visible: stopButton.hovered
|
||||||
|
ToolTip.text: qsTr("Stop the current response generation")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
borderWidth: 1
|
Item {
|
||||||
backgroundColor: theme.conversationButtonBackground
|
id: conversationTrayButton
|
||||||
backgroundColorHovered: theme.conversationButtonBackgroundHovered
|
anchors.bottom: textInputView.top
|
||||||
backgroundRadius: 5
|
anchors.horizontalCenter: textInputView.horizontalCenter
|
||||||
padding: 15
|
width: 30
|
||||||
topPadding: 8
|
height: 30
|
||||||
bottomPadding: 8
|
visible: chatModel.count && !currentChat.isServer && currentChat.isModelLoaded
|
||||||
text: currentChat.responseInProgress ? qsTr("Stop generating") : qsTr("Regenerate response")
|
property bool isHovered: conversationTrayMouseAreaButton.containsMouse
|
||||||
fontPixelSize: theme.fontSizeSmall
|
MouseArea {
|
||||||
Accessible.description: qsTr("Controls generation of the response")
|
id: conversationTrayMouseAreaButton
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
id: conversationTrayTextButton
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
horizontalAlignment: Qt.AlignHCenter
|
||||||
|
leftPadding: 5
|
||||||
|
rightPadding: 5
|
||||||
|
text: "\u00B7\u00B7\u00B7"
|
||||||
|
color: theme.textColor
|
||||||
|
font.pixelSize: 20 // fixed size
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MyButton {
|
MyButton {
|
||||||
|
anchors.bottom: textInputView.top
|
||||||
|
anchors.horizontalCenter: textInputView.horizontalCenter
|
||||||
|
anchors.bottomMargin: 20
|
||||||
textColor: theme.textColor
|
textColor: theme.textColor
|
||||||
visible: !currentChat.isServer
|
visible: !currentChat.isServer
|
||||||
&& !currentChat.isModelLoaded
|
&& !currentChat.isModelLoaded
|
||||||
@ -1373,9 +1500,11 @@ Rectangle {
|
|||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: 15
|
anchors.leftMargin: 15
|
||||||
|
sourceSize.width: 15
|
||||||
|
sourceSize.height: 15
|
||||||
source: "qrc:/gpt4all/icons/regenerate.svg"
|
source: "qrc:/gpt4all/icons/regenerate.svg"
|
||||||
}
|
}
|
||||||
leftPadding: 50
|
leftPadding: 40
|
||||||
onClicked: {
|
onClicked: {
|
||||||
currentChat.reloadModel();
|
currentChat.reloadModel();
|
||||||
}
|
}
|
||||||
@ -1391,7 +1520,6 @@ Rectangle {
|
|||||||
fontPixelSize: theme.fontSizeSmall
|
fontPixelSize: theme.fontSizeSmall
|
||||||
Accessible.description: qsTr("Reloads the model")
|
Accessible.description: qsTr("Reloads the model")
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
id: statusBar
|
id: statusBar
|
||||||
|
@ -518,7 +518,7 @@ QtObject {
|
|||||||
case "Dark":
|
case "Dark":
|
||||||
return accentColor;
|
return accentColor;
|
||||||
default:
|
default:
|
||||||
return accentColor;
|
return black;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -529,7 +529,7 @@ QtObject {
|
|||||||
case "Dark":
|
case "Dark":
|
||||||
return darkwhite;
|
return darkwhite;
|
||||||
default:
|
default:
|
||||||
return black;
|
return accentColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -740,7 +740,7 @@ QtObject {
|
|||||||
case "Dark":
|
case "Dark":
|
||||||
return green400;
|
return green400;
|
||||||
default:
|
default:
|
||||||
return green400;
|
return black;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|