add settings dialog (color scheme, font family/style/size)
This commit is contained in:
parent
da1f7f02dd
commit
e03488e6bb
129
gui/main.qml
129
gui/main.qml
|
|
@ -8,9 +8,10 @@ ApplicationWindow {
|
||||||
width: 1000
|
width: 1000
|
||||||
height: 600
|
height: 600
|
||||||
title: "Ollie"
|
title: "Ollie"
|
||||||
|
font.family: theme.fontFamily || Qt.application.font.family
|
||||||
|
font.pointSize: theme.fontSize > 0 ? theme.fontSize : Qt.application.font.pointSize
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
// Load initial log content
|
|
||||||
var log = ollie.readLog()
|
var log = ollie.readLog()
|
||||||
if (log) chatModel.appendData(log)
|
if (log) chatModel.appendData(log)
|
||||||
}
|
}
|
||||||
|
|
@ -27,6 +28,124 @@ ApplicationWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- Settings Dialog ---
|
||||||
|
Dialog {
|
||||||
|
id: settingsDialog
|
||||||
|
title: "Settings"
|
||||||
|
anchors.centerIn: parent
|
||||||
|
width: 380
|
||||||
|
modal: true
|
||||||
|
standardButtons: Dialog.Close
|
||||||
|
|
||||||
|
contentItem: ColumnLayout {
|
||||||
|
spacing: 16
|
||||||
|
Layout.margins: 16
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: "Color Scheme"
|
||||||
|
font.bold: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: "Uses KDE Breeze color schemes from /usr/share/color-schemes/"
|
||||||
|
opacity: 0.6
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
Layout.fillWidth: true
|
||||||
|
font.pixelSize: Qt.application.font.pixelSize * 0.9
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
spacing: 8
|
||||||
|
|
||||||
|
RadioButton {
|
||||||
|
id: systemRadio
|
||||||
|
text: "Use system theme"
|
||||||
|
checked: theme.mode === "system"
|
||||||
|
onClicked: theme.mode = "system"
|
||||||
|
}
|
||||||
|
RadioButton {
|
||||||
|
id: lightRadio
|
||||||
|
text: "Breeze Light"
|
||||||
|
checked: theme.mode === "light"
|
||||||
|
onClicked: theme.mode = "light"
|
||||||
|
}
|
||||||
|
RadioButton {
|
||||||
|
id: darkRadio
|
||||||
|
text: "Breeze Dark"
|
||||||
|
checked: theme.mode === "dark"
|
||||||
|
onClicked: theme.mode = "dark"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: theme.isDark ? "Current: dark" : "Current: light"
|
||||||
|
opacity: 0.5
|
||||||
|
font.pixelSize: Qt.application.font.pixelSize * 0.85
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
height: 1
|
||||||
|
color: palette.mid
|
||||||
|
Layout.topMargin: 8
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: "Font"
|
||||||
|
font.bold: true
|
||||||
|
}
|
||||||
|
|
||||||
|
GridLayout {
|
||||||
|
columns: 2
|
||||||
|
columnSpacing: 12
|
||||||
|
rowSpacing: 8
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
Label { text: "Family:" }
|
||||||
|
ComboBox {
|
||||||
|
id: fontFamilyCombo
|
||||||
|
Layout.fillWidth: true
|
||||||
|
model: theme.availableFamilies
|
||||||
|
editable: true
|
||||||
|
currentIndex: {
|
||||||
|
let fam = theme.fontFamily || Qt.application.font.family
|
||||||
|
let idx = model.indexOf(fam)
|
||||||
|
return idx >= 0 ? idx : 0
|
||||||
|
}
|
||||||
|
onActivated: theme.fontFamily = currentText
|
||||||
|
onAccepted: theme.fontFamily = editText
|
||||||
|
}
|
||||||
|
|
||||||
|
Label { text: "Style:" }
|
||||||
|
ComboBox {
|
||||||
|
id: fontStyleCombo
|
||||||
|
Layout.fillWidth: true
|
||||||
|
model: theme.availableStyles
|
||||||
|
currentIndex: {
|
||||||
|
let st = theme.fontStyle
|
||||||
|
let idx = model.indexOf(st)
|
||||||
|
return idx >= 0 ? idx : 0
|
||||||
|
}
|
||||||
|
onActivated: theme.fontStyle = currentText
|
||||||
|
}
|
||||||
|
|
||||||
|
Label { text: "Size:" }
|
||||||
|
SpinBox {
|
||||||
|
id: fontSizeSpin
|
||||||
|
from: 6
|
||||||
|
to: 72
|
||||||
|
value: theme.fontSize > 0 ? theme.fontSize : Qt.application.font.pointSize
|
||||||
|
onValueModified: theme.fontSize = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: "Reset to system font"
|
||||||
|
onClicked: theme.resetFont()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SplitView {
|
SplitView {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
|
|
@ -45,6 +164,12 @@ ApplicationWindow {
|
||||||
text: "\u21BB"
|
text: "\u21BB"
|
||||||
onClicked: ollie.refreshSessions()
|
onClicked: ollie.refreshSessions()
|
||||||
}
|
}
|
||||||
|
ToolButton {
|
||||||
|
text: "\u2699"
|
||||||
|
onClicked: settingsDialog.open()
|
||||||
|
ToolTip.text: "Settings"
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -127,7 +252,6 @@ ApplicationWindow {
|
||||||
boundsBehavior: Flickable.StopAtBounds
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
|
|
||||||
onCountChanged: {
|
onCountChanged: {
|
||||||
// Auto-scroll to bottom on new blocks
|
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
positionViewAtEnd()
|
positionViewAtEnd()
|
||||||
}
|
}
|
||||||
|
|
@ -136,7 +260,6 @@ ApplicationWindow {
|
||||||
Connections {
|
Connections {
|
||||||
target: chatModel
|
target: chatModel
|
||||||
function onDataChanged() {
|
function onDataChanged() {
|
||||||
// Keep scrolled to bottom when content streams in
|
|
||||||
if (chatView.atYEnd)
|
if (chatView.atYEnd)
|
||||||
chatView.positionViewAtEnd()
|
chatView.positionViewAtEnd()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Reference in New Issue