2023-04-23 06:58:07 -04:00
import QtCore
import QtQuick
import QtQuick . Controls
2023-04-23 23:56:33 -04:00
import QtQuick . Controls . Basic
2023-04-25 10:57:40 -04:00
import QtQuick . Dialogs
2023-04-23 06:58:07 -04:00
import QtQuick . Layouts
import download
import network
import llm
Dialog {
id: settingsDialog
modal: true
opacity: 0.9
background: Rectangle {
anchors.fill: parent
anchors.margins: - 20
2023-04-23 09:42:35 -04:00
color: theme . backgroundDarkest
2023-04-23 06:58:07 -04:00
border.width: 1
2023-04-23 09:42:35 -04:00
border.color: theme . dialogBorder
2023-04-23 06:58:07 -04:00
radius: 10
}
2023-05-02 20:31:17 -04:00
onOpened: {
Network . sendSettingsDialog ( ) ;
}
2023-05-09 17:10:47 -04:00
property var currentChat: LLM . chatListModel . currentChat
2023-04-23 09:42:35 -04:00
Theme {
id: theme
}
2023-04-23 06:58:07 -04:00
property real defaultTemperature: 0.28
property real defaultTopP: 0.95
property int defaultTopK: 40
property int defaultMaxLength: 4096
property int defaultPromptBatchSize: 9
2023-04-25 10:57:40 -04:00
property real defaultRepeatPenalty: 1.10
property int defaultRepeatPenaltyTokens: 64
2023-04-24 15:24:55 -04:00
property int defaultThreadCount: 0
2023-05-05 12:30:11 -04:00
property bool defaultSaveChats: false
2023-05-03 12:19:14 -04:00
property string defaultPromptTemplate: " # # # Human:
2023-04-23 06:58:07 -04:00
% 1
2023-05-03 12:19:14 -04:00
# # # Assistant: \ n "
2023-04-25 10:57:40 -04:00
property string defaultModelPath: Download . defaultLocalModelsPath ( )
2023-05-09 17:10:47 -04:00
property string defaultUserDefaultModel: "Application default"
2023-04-23 06:58:07 -04:00
property alias temperature: settings . temperature
property alias topP: settings . topP
property alias topK: settings . topK
property alias maxLength: settings . maxLength
property alias promptBatchSize: settings . promptBatchSize
property alias promptTemplate: settings . promptTemplate
2023-04-25 10:57:40 -04:00
property alias repeatPenalty: settings . repeatPenalty
property alias repeatPenaltyTokens: settings . repeatPenaltyTokens
2023-04-24 15:24:55 -04:00
property alias threadCount: settings . threadCount
2023-05-05 12:30:11 -04:00
property alias saveChats: settings . saveChats
2023-04-25 10:57:40 -04:00
property alias modelPath: settings . modelPath
2023-05-09 17:10:47 -04:00
property alias userDefaultModel: settings . userDefaultModel
2023-04-23 06:58:07 -04:00
Settings {
id: settings
property real temperature: settingsDialog . defaultTemperature
property real topP: settingsDialog . defaultTopP
property int topK: settingsDialog . defaultTopK
property int maxLength: settingsDialog . defaultMaxLength
property int promptBatchSize: settingsDialog . defaultPromptBatchSize
2023-04-24 15:24:55 -04:00
property int threadCount: settingsDialog . defaultThreadCount
2023-05-05 12:30:11 -04:00
property bool saveChats: settingsDialog . defaultSaveChats
2023-04-25 10:57:40 -04:00
property real repeatPenalty: settingsDialog . defaultRepeatPenalty
property int repeatPenaltyTokens: settingsDialog . defaultRepeatPenaltyTokens
2023-04-23 06:58:07 -04:00
property string promptTemplate: settingsDialog . defaultPromptTemplate
2023-04-25 10:57:40 -04:00
property string modelPath: settingsDialog . defaultModelPath
2023-05-09 17:10:47 -04:00
property string userDefaultModel: settingsDialog . defaultUserDefaultModel
2023-04-23 06:58:07 -04:00
}
2023-04-25 10:57:40 -04:00
function restoreGenerationDefaults ( ) {
2023-04-25 13:00:28 -04:00
settings . temperature = defaultTemperature
settings . topP = defaultTopP
settings . topK = defaultTopK
settings . maxLength = defaultMaxLength
settings . promptBatchSize = defaultPromptBatchSize
settings . promptTemplate = defaultPromptTemplate
2023-05-08 12:20:02 -04:00
settings . repeatPenalty = defaultRepeatPenalty
settings . repeatPenaltyTokens = defaultRepeatPenaltyTokens
2023-04-23 06:58:07 -04:00
settings . sync ( )
2023-04-25 10:57:40 -04:00
}
function restoreApplicationDefaults ( ) {
2023-04-25 13:00:28 -04:00
settings . modelPath = settingsDialog . defaultModelPath
2023-04-25 10:57:40 -04:00
settings . threadCount = defaultThreadCount
2023-05-05 12:30:11 -04:00
settings . saveChats = defaultSaveChats
2023-05-09 17:10:47 -04:00
settings . userDefaultModel = defaultUserDefaultModel
2023-04-25 13:00:28 -04:00
Download . downloadLocalModelsPath = settings . modelPath
LLM . threadCount = settings . threadCount
2023-05-05 12:30:11 -04:00
LLM . chatListModel . shouldSaveChats = settings . saveChats
2023-04-25 10:57:40 -04:00
settings . sync ( )
2023-04-24 15:24:55 -04:00
}
Component.onCompleted: {
2023-04-25 13:00:28 -04:00
LLM . threadCount = settings . threadCount
2023-05-05 12:30:11 -04:00
LLM . chatListModel . shouldSaveChats = settings . saveChats
2023-04-25 13:00:28 -04:00
Download . downloadLocalModelsPath = settings . modelPath
2023-04-23 06:58:07 -04:00
}
2023-04-28 10:48:48 -04:00
Connections {
target: settingsDialog
function onClosed ( ) {
settings . sync ( )
}
2023-04-23 06:58:07 -04:00
}
Item {
Accessible.role: Accessible . Dialog
Accessible.name: qsTr ( "Settings dialog" )
2023-04-25 10:57:40 -04:00
Accessible.description: qsTr ( "Dialog containing various application settings" )
2023-04-23 06:58:07 -04:00
}
2023-04-25 10:57:40 -04:00
TabBar {
id: settingsTabBar
2023-04-25 13:00:28 -04:00
width: parent . width / 1.5
2023-04-25 10:57:40 -04:00
TabButton {
2023-04-25 13:00:28 -04:00
id: genSettingsButton
contentItem: IconLabel {
color: theme . textColor
font.bold: genSettingsButton . checked
font.pixelSize: genSettingsButton . checked ? theme.fontSizeLarger : theme . fontSizeLarge
text: qsTr ( "Generation" )
}
background: Rectangle {
color: genSettingsButton . checked ? theme.backgroundDarkest : theme . backgroundLight
2023-04-25 16:20:19 -04:00
border.color: theme . tabBorder
2023-04-25 13:00:28 -04:00
border.width: 1 ? genSettingsButton.checked : 0
}
2023-04-25 10:57:40 -04:00
Accessible.role: Accessible . Button
Accessible.name: qsTr ( "Generation settings" )
Accessible.description: qsTr ( "Settings related to how the model generates text" )
}
2023-04-23 06:58:07 -04:00
2023-04-25 10:57:40 -04:00
TabButton {
2023-04-25 13:00:28 -04:00
id: appSettingsButton
contentItem: IconLabel {
color: theme . textColor
font.bold: appSettingsButton . checked
font.pixelSize: appSettingsButton . checked ? theme.fontSizeLarger : theme . fontSizeLarge
text: qsTr ( "Application" )
}
background: Rectangle {
color: appSettingsButton . checked ? theme.backgroundDarkest : theme . backgroundLight
2023-04-25 16:20:19 -04:00
border.color: theme . tabBorder
2023-04-25 13:00:28 -04:00
border.width: 1 ? appSettingsButton.checked : 0
}
2023-04-25 10:57:40 -04:00
Accessible.role: Accessible . Button
Accessible.name: qsTr ( "Application settings" )
Accessible.description: qsTr ( "Settings related to general behavior of the application" )
2023-04-23 06:58:07 -04:00
}
2023-04-25 10:57:40 -04:00
}
StackLayout {
anchors.top: settingsTabBar . bottom
width: parent . width
2023-04-25 13:00:28 -04:00
height: availableHeight
2023-04-25 10:57:40 -04:00
currentIndex: settingsTabBar . currentIndex
2023-04-25 13:00:28 -04:00
2023-04-25 10:57:40 -04:00
Item {
id: generationSettingsTab
2023-04-25 13:00:28 -04:00
ScrollView {
background: Rectangle {
color: 'transparent'
border.color: theme . tabBorder
border.width: 1
radius: 2
2023-04-23 06:58:07 -04:00
}
2023-04-25 16:20:19 -04:00
padding: 10
2023-04-25 13:00:28 -04:00
width: parent . width
height: parent . height - 30
contentWidth: availableWidth - 20
contentHeight: generationSettingsTabInner . implicitHeight + 40
ScrollBar.vertical.policy: ScrollBar . AlwaysOn
GridLayout {
id: generationSettingsTabInner
anchors.margins: 10
columns: 2
rowSpacing: 10
columnSpacing: 10
anchors.fill: parent
Label {
id: tempLabel
text: qsTr ( "Temperature:" )
color: theme . textColor
Layout.row: 0
Layout.column: 0
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
TextField {
text: settings . temperature . toString ( )
color: theme . textColor
background: Rectangle {
implicitWidth: 150
color: theme . backgroundLighter
radius: 10
}
padding: 10
ToolTip.text: qsTr ( "Temperature increases the chances of choosing less likely tokens - higher temperature gives more creative but less predictable outputs" )
ToolTip.visible: hovered
Layout.row: 0
Layout.column: 1
2023-04-28 11:36:24 -04:00
validator: DoubleValidator {
locale: "C"
}
2023-04-25 13:00:28 -04:00
onEditingFinished: {
var val = parseFloat ( text )
if ( ! isNaN ( val ) ) {
settings . temperature = val
settings . sync ( )
focus = false
} else {
text = settings . temperature . toString ( )
}
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
Accessible.role: Accessible . EditableText
Accessible.name: tempLabel . text
Accessible.description: ToolTip . text
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
Label {
id: topPLabel
text: qsTr ( "Top P:" )
color: theme . textColor
Layout.row: 1
Layout.column: 0
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
TextField {
text: settings . topP . toString ( )
color: theme . textColor
background: Rectangle {
implicitWidth: 150
color: theme . backgroundLighter
radius: 10
}
padding: 10
ToolTip.text: qsTr ( "Only the most likely tokens up to a total probability of top_p can be chosen, prevents choosing highly unlikely tokens, aka Nucleus Sampling" )
ToolTip.visible: hovered
Layout.row: 1
Layout.column: 1
2023-04-28 11:36:24 -04:00
validator: DoubleValidator {
locale: "C"
}
2023-04-25 13:00:28 -04:00
onEditingFinished: {
var val = parseFloat ( text )
if ( ! isNaN ( val ) ) {
settings . topP = val
settings . sync ( )
focus = false
} else {
text = settings . topP . toString ( )
}
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
Accessible.role: Accessible . EditableText
Accessible.name: topPLabel . text
Accessible.description: ToolTip . text
}
Label {
id: topKLabel
text: qsTr ( "Top K:" )
color: theme . textColor
Layout.row: 2
Layout.column: 0
}
TextField {
text: settings . topK . toString ( )
color: theme . textColor
background: Rectangle {
implicitWidth: 150
color: theme . backgroundLighter
radius: 10
}
padding: 10
ToolTip.text: qsTr ( "Only the top K most likely tokens will be chosen from" )
ToolTip.visible: hovered
Layout.row: 2
Layout.column: 1
validator: IntValidator {
bottom: 1
}
onEditingFinished: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
settings . topK = val
settings . sync ( )
focus = false
} else {
text = settings . topK . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: topKLabel . text
Accessible.description: ToolTip . text
}
Label {
id: maxLengthLabel
text: qsTr ( "Max Length:" )
color: theme . textColor
Layout.row: 3
Layout.column: 0
}
TextField {
text: settings . maxLength . toString ( )
color: theme . textColor
background: Rectangle {
implicitWidth: 150
color: theme . backgroundLighter
radius: 10
}
padding: 10
ToolTip.text: qsTr ( "Maximum length of response in tokens" )
ToolTip.visible: hovered
Layout.row: 3
Layout.column: 1
validator: IntValidator {
bottom: 1
}
onEditingFinished: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
settings . maxLength = val
settings . sync ( )
focus = false
} else {
text = settings . maxLength . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: maxLengthLabel . text
Accessible.description: ToolTip . text
2023-04-25 10:57:40 -04:00
}
2023-04-23 06:58:07 -04:00
2023-04-25 13:00:28 -04:00
Label {
id: batchSizeLabel
text: qsTr ( "Prompt Batch Size:" )
color: theme . textColor
Layout.row: 4
Layout.column: 0
}
TextField {
text: settings . promptBatchSize . toString ( )
color: theme . textColor
background: Rectangle {
implicitWidth: 150
color: theme . backgroundLighter
radius: 10
}
padding: 10
ToolTip.text: qsTr ( "Amount of prompt tokens to process at once, higher values can speed up reading prompts but will use more RAM" )
ToolTip.visible: hovered
Layout.row: 4
Layout.column: 1
validator: IntValidator {
bottom: 1
}
onEditingFinished: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
settings . promptBatchSize = val
settings . sync ( )
focus = false
} else {
text = settings . promptBatchSize . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: batchSizeLabel . text
Accessible.description: ToolTip . text
}
Label {
id: repeatPenaltyLabel
text: qsTr ( "Repeat Penalty:" )
color: theme . textColor
Layout.row: 5
Layout.column: 0
}
TextField {
text: settings . repeatPenalty . toString ( )
color: theme . textColor
background: Rectangle {
implicitWidth: 150
color: theme . backgroundLighter
radius: 10
}
2023-04-25 10:57:40 -04:00
padding: 10
2023-04-25 16:33:01 -04:00
ToolTip.text: qsTr ( "Amount to penalize repetitiveness of the output" )
2023-04-25 13:00:28 -04:00
ToolTip.visible: hovered
Layout.row: 5
Layout.column: 1
2023-04-28 11:36:24 -04:00
validator: DoubleValidator {
locale: "C"
}
2023-04-25 13:00:28 -04:00
onEditingFinished: {
var val = parseFloat ( text )
if ( ! isNaN ( val ) ) {
settings . repeatPenalty = val
settings . sync ( )
focus = false
} else {
text = settings . repeatPenalty . toString ( )
}
}
2023-04-25 10:57:40 -04:00
Accessible.role: Accessible . EditableText
2023-04-25 13:00:28 -04:00
Accessible.name: repeatPenaltyLabel . text
Accessible.description: ToolTip . text
}
Label {
id: repeatPenaltyTokensLabel
text: qsTr ( "Repeat Penalty Tokens:" )
color: theme . textColor
Layout.row: 6
Layout.column: 0
}
TextField {
text: settings . repeatPenaltyTokens . toString ( )
color: theme . textColor
background: Rectangle {
implicitWidth: 150
color: theme . backgroundLighter
radius: 10
}
padding: 10
ToolTip.text: qsTr ( "How far back in output to apply repeat penalty" )
ToolTip.visible: hovered
Layout.row: 6
Layout.column: 1
validator: IntValidator {
bottom: 1
}
onEditingFinished: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
settings . repeatPenaltyTokens = val
settings . sync ( )
focus = false
} else {
text = settings . repeatPenaltyTokens . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: repeatPenaltyTokensLabel . text
Accessible.description: ToolTip . text
}
2023-04-25 10:57:40 -04:00
2023-04-25 13:00:28 -04:00
Label {
id: promptTemplateLabel
text: qsTr ( "Prompt Template:" )
color: theme . textColor
Layout.row: 7
Layout.column: 0
}
Rectangle {
Layout.row: 7
Layout.column: 1
Layout.fillWidth: true
height: 200
color: "transparent"
clip: true
Label {
id: promptTemplateLabelHelp
visible: settings . promptTemplate . indexOf (
"%1" ) === - 1
font.bold: true
color: theme . textErrorColor
text: qsTr ( "Prompt template must contain %1 to be replaced with the user's input." )
anchors.fill: templateScrollView
z: 200
padding: 10
wrapMode: TextArea . Wrap
Accessible.role: Accessible . EditableText
Accessible.name: text
}
ScrollView {
id: templateScrollView
anchors.fill: parent
TextArea {
text: settings . promptTemplate
color: theme . textColor
background: Rectangle {
implicitWidth: 150
color: theme . backgroundLighter
radius: 10
}
padding: 10
wrapMode: TextArea . Wrap
onTextChanged: {
settings . promptTemplate = text
settings . sync ( )
}
bottomPadding: 10
Accessible.role: Accessible . EditableText
Accessible.name: promptTemplateLabel . text
Accessible.description: promptTemplateLabelHelp . text
}
}
}
Button {
Layout.row: 8
Layout.column: 1
Layout.fillWidth: true
2023-05-09 17:10:47 -04:00
padding: 10
2023-04-25 13:00:28 -04:00
contentItem: Text {
text: qsTr ( "Restore Defaults" )
horizontalAlignment: Text . AlignHCenter
color: theme . textColor
Accessible.role: Accessible . Button
Accessible.name: text
Accessible.description: qsTr ( "Restores the settings dialog to a default state" )
}
background: Rectangle {
opacity: . 5
border.color: theme . backgroundLightest
border.width: 1
radius: 10
color: theme . backgroundLight
}
onClicked: {
settingsDialog . restoreGenerationDefaults ( )
}
}
}
2023-04-25 10:57:40 -04:00
}
}
Item {
2023-04-25 13:00:28 -04:00
id: applicationSettingsTab
ScrollView {
background: Rectangle {
color: 'transparent'
border.color: theme . tabBorder
border.width: 1
radius: 2
}
2023-04-25 16:20:19 -04:00
padding: 10
2023-04-25 10:57:40 -04:00
width: parent . width
2023-04-25 13:00:28 -04:00
height: parent . height - 30
contentWidth: availableWidth - 20
ScrollBar.vertical.policy: ScrollBar . AlwaysOn
GridLayout {
anchors.margins: 10
columns: 3
rowSpacing: 10
columnSpacing: 10
anchors.fill: parent
2023-05-09 17:10:47 -04:00
Label {
id: defaultModelLabel
text: qsTr ( "Default model:" )
color: theme . textColor
Layout.row: 1
Layout.column: 0
}
ComboBox {
id: comboBox
Layout.row: 1
Layout.column: 1
Layout.minimumWidth: 350
font.pixelSize: theme . fontSizeLarge
spacing: 0
padding: 10
model: modelList
Accessible.role: Accessible . ComboBox
Accessible.name: qsTr ( "ComboBox for displaying/picking the default model" )
Accessible.description: qsTr ( "Use this for picking the default model to use; the first item is the current default model" )
function updateModel ( newModelList ) {
var newArray = Array . from ( newModelList ) ;
newArray . unshift ( 'Application default' ) ;
comboBox . model = newArray ;
settings . sync ( ) ;
comboBox . currentIndex = comboBox . indexOfValue ( settingsDialog . userDefaultModel ) ;
}
Component.onCompleted: {
comboBox . updateModel ( currentChat . modelList )
}
Connections {
target: settings
function onUserDefaultModelChanged ( ) {
comboBox . updateModel ( currentChat . modelList )
}
}
Connections {
target: currentChat
function onModelListChanged ( ) {
comboBox . updateModel ( currentChat . modelList )
}
}
contentItem: Text {
anchors.horizontalCenter: parent . horizontalCenter
leftPadding: 10
rightPadding: 10
text: comboBox . displayText
font: comboBox . font
color: theme . textColor
verticalAlignment: Text . AlignVCenter
horizontalAlignment: Text . AlignHCenter
elide: Text . ElideRight
}
delegate: ItemDelegate {
width: comboBox . width
contentItem: Text {
text: modelData
color: theme . textColor
font: comboBox . font
elide: Text . ElideRight
verticalAlignment: Text . AlignVCenter
}
background: Rectangle {
color: highlighted ? theme.backgroundLight : theme . backgroundDark
}
highlighted: comboBox . highlightedIndex === index
}
popup: Popup {
y: comboBox . height - 1
width: comboBox . width
implicitHeight: contentItem . implicitHeight
padding: 0
contentItem: ListView {
clip: true
implicitHeight: contentHeight
model: comboBox . popup . visible ? comboBox.delegateModel : null
currentIndex: comboBox . highlightedIndex
ScrollIndicator.vertical: ScrollIndicator { }
}
background: Rectangle {
color: theme . backgroundDark
}
}
background: Rectangle {
color: theme . backgroundDark
border.width: 1
border.color: theme . backgroundLightest
radius: 10
}
onActivated: {
settingsDialog . userDefaultModel = comboBox . currentText
settings . sync ( )
}
}
2023-04-25 13:00:28 -04:00
FolderDialog {
id: modelPathDialog
title: "Please choose a directory"
2023-04-28 22:37:59 -04:00
currentFolder: Download . downloadLocalModelsPath
2023-04-25 13:00:28 -04:00
onAccepted: {
Download . downloadLocalModelsPath = selectedFolder
settings . modelPath = Download . downloadLocalModelsPath
settings . sync ( )
}
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
Label {
id: modelPathLabel
2023-04-27 16:27:53 -04:00
text: qsTr ( "Download path:" )
2023-04-25 13:00:28 -04:00
color: theme . textColor
2023-05-09 17:10:47 -04:00
Layout.row: 2
2023-04-25 13:00:28 -04:00
Layout.column: 0
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
TextField {
id: modelPathDisplayLabel
2023-04-27 17:15:46 -04:00
text: Download . downloadLocalModelsPath
2023-04-25 13:00:28 -04:00
readOnly: true
color: theme . textColor
implicitWidth: 300
2023-05-09 17:10:47 -04:00
padding: 10
Layout.row: 2
2023-04-25 13:00:28 -04:00
Layout.column: 1
2023-04-27 16:27:53 -04:00
Layout.fillWidth: true
2023-04-25 13:00:28 -04:00
ToolTip.text: qsTr ( "Path where model files will be downloaded to" )
ToolTip.visible: hovered
Accessible.role: Accessible . ToolTip
2023-04-27 16:27:53 -04:00
Accessible.name: modelPathDisplayLabel . text
2023-04-25 13:00:28 -04:00
Accessible.description: ToolTip . text
2023-04-28 22:07:37 -04:00
background: Rectangle {
color: theme . backgroundLighter
radius: 10
}
2023-04-25 13:00:28 -04:00
}
Button {
2023-05-09 17:10:47 -04:00
Layout.row: 2
2023-04-25 13:00:28 -04:00
Layout.column: 2
text: qsTr ( "Browse" )
contentItem: Text {
text: qsTr ( "Browse" )
horizontalAlignment: Text . AlignHCenter
color: theme . textColor
Accessible.role: Accessible . Button
Accessible.name: text
Accessible.description: qsTr ( "Opens a folder picker dialog to choose where to save model files" )
}
background: Rectangle {
opacity: . 5
border.color: theme . backgroundLightest
border.width: 1
radius: 10
color: theme . backgroundLight
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
onClicked: modelPathDialog . open ( )
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
Label {
id: nThreadsLabel
text: qsTr ( "CPU Threads:" )
2023-04-25 10:57:40 -04:00
color: theme . textColor
2023-05-09 17:10:47 -04:00
Layout.row: 3
2023-04-25 13:00:28 -04:00
Layout.column: 0
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
TextField {
text: settingsDialog . threadCount . toString ( )
color: theme . textColor
background: Rectangle {
implicitWidth: 150
color: theme . backgroundLighter
radius: 10
}
padding: 10
ToolTip.text: qsTr ( "Amount of processing threads to use, a setting of 0 will use the lesser of 4 or your number of CPU threads" )
ToolTip.visible: hovered
2023-05-09 17:10:47 -04:00
Layout.row: 3
2023-04-25 13:00:28 -04:00
Layout.column: 1
validator: IntValidator {
bottom: 1
}
onEditingFinished: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
settingsDialog . threadCount = val
LLM . threadCount = val
settings . sync ( )
focus = false
} else {
text = settingsDialog . threadCount . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: nThreadsLabel . text
Accessible.description: ToolTip . text
2023-04-25 10:57:40 -04:00
}
2023-05-05 12:30:11 -04:00
Label {
id: saveChatsLabel
text: qsTr ( "Save chats to disk:" )
color: theme . textColor
2023-05-09 17:10:47 -04:00
Layout.row: 4
2023-05-05 12:30:11 -04:00
Layout.column: 0
}
CheckBox {
id: saveChatsBox
2023-05-09 17:10:47 -04:00
Layout.row: 4
2023-05-05 12:30:11 -04:00
Layout.column: 1
checked: settingsDialog . saveChats
onClicked: {
Network . sendSaveChatsToggled ( saveChatsBox . checked ) ;
settingsDialog . saveChats = saveChatsBox . checked
LLM . chatListModel . shouldSaveChats = saveChatsBox . checked
settings . sync ( )
}
ToolTip.text: qsTr ( "WARNING: Saving chats to disk can be ~2GB per chat" )
ToolTip.visible: hovered
background: Rectangle {
color: "transparent"
}
indicator: Rectangle {
implicitWidth: 26
implicitHeight: 26
x: saveChatsBox . leftPadding
y: parent . height / 2 - height / 2
border.color: theme . dialogBorder
color: "transparent"
Rectangle {
width: 14
height: 14
x: 6
y: 6
color: theme . textColor
visible: saveChatsBox . checked
}
}
contentItem: Text {
text: saveChatsBox . text
font: saveChatsBox . font
opacity: enabled ? 1.0 : 0.3
color: theme . textColor
verticalAlignment: Text . AlignVCenter
leftPadding: saveChatsBox . indicator . width + saveChatsBox . spacing
}
}
Button {
2023-05-09 17:10:47 -04:00
Layout.row: 5
2023-04-25 13:00:28 -04:00
Layout.column: 1
Layout.fillWidth: true
2023-05-09 17:10:47 -04:00
padding: 10
2023-04-25 13:00:28 -04:00
contentItem: Text {
text: qsTr ( "Restore Defaults" )
horizontalAlignment: Text . AlignHCenter
color: theme . textColor
Accessible.role: Accessible . Button
Accessible.name: text
Accessible.description: qsTr ( "Restores the settings dialog to a default state" )
}
background: Rectangle {
opacity: . 5
border.color: theme . backgroundLightest
border.width: 1
radius: 10
color: theme . backgroundLight
}
onClicked: {
settingsDialog . restoreApplicationDefaults ( )
}
2023-04-25 10:57:40 -04:00
}
}
}
}
2023-04-23 06:58:07 -04:00
}
}