gui: replace backend/model ComboBoxes with TextField + picker dialogs
- Backend: TextField with '...' button opens ListView of available backends - Model: TextField with '...' button opens ListView filtered by selected backend - Auto-populate model placeholder when backend text changes - Model picker also works on manual click for re-selection - Update onAccepted to use field.text instead of combo.currentText
This commit is contained in:
parent
e86b09447b
commit
7f083c0d7a
109
gui/main.qml
109
gui/main.qml
|
|
@ -303,7 +303,11 @@ ApplicationWindow {
|
|||
}
|
||||
Button {
|
||||
text: "Browse..."
|
||||
onClicked: folderDialog.open()
|
||||
onClicked: {
|
||||
var folder = theme.chooseFolder("Select Project Directory", dirField.text || "")
|
||||
if (folder !== "")
|
||||
dirField.text = folder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -322,12 +326,14 @@ ApplicationWindow {
|
|||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
Label { text: "Backend:"; Layout.preferredWidth: 80 }
|
||||
ComboBox {
|
||||
id: backendCombo
|
||||
TextField {
|
||||
id: backendField
|
||||
Layout.fillWidth: true
|
||||
enabled: ollie.rootBackendsLoaded
|
||||
model: ollie.availableBackends
|
||||
currentIndex: 0
|
||||
placeholderText: "ollama"
|
||||
}
|
||||
Button {
|
||||
text: "..."
|
||||
onClicked: backendPicker.open()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -335,12 +341,16 @@ ApplicationWindow {
|
|||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
Label { text: "Model:"; Layout.preferredWidth: 80 }
|
||||
ComboBox {
|
||||
id: modelCombo
|
||||
TextField {
|
||||
id: modelField
|
||||
Layout.fillWidth: true
|
||||
enabled: ollie.rootModelsLoaded && backendCombo.count > 0
|
||||
model: ollie.getAvailableModels(backendCombo.currentText)
|
||||
currentIndex: 0
|
||||
placeholderText: "(auto-populated)"
|
||||
enabled: backendField.text.trim() !== ""
|
||||
}
|
||||
Button {
|
||||
text: "..."
|
||||
enabled: backendField.text.trim() !== "" && ollie.rootModelsLoaded
|
||||
onClicked: modelPicker.open()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -368,10 +378,73 @@ ApplicationWindow {
|
|||
}
|
||||
}
|
||||
|
||||
// Backend picker dialog
|
||||
Dialog {
|
||||
id: backendPicker
|
||||
title: "Select Backend"
|
||||
anchors.centerIn: parent
|
||||
modal: true
|
||||
standardButtons: Dialog.Cancel
|
||||
|
||||
contentItem: ListView {
|
||||
width: 300
|
||||
height: 200
|
||||
model: ollie.availableBackends
|
||||
delegate: ItemDelegate {
|
||||
width: parent.width
|
||||
text: modelData
|
||||
onClicked: {
|
||||
backendField.text = modelData
|
||||
backendPicker.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Model picker dialog
|
||||
Dialog {
|
||||
id: modelPicker
|
||||
title: "Select Model"
|
||||
anchors.centerIn: parent
|
||||
modal: true
|
||||
standardButtons: Dialog.Cancel
|
||||
|
||||
contentItem: ListView {
|
||||
width: 400
|
||||
height: 300
|
||||
model: ollie.getAvailableModels(backendField.text.trim())
|
||||
delegate: ItemDelegate {
|
||||
width: parent.width
|
||||
text: modelData
|
||||
onClicked: {
|
||||
modelField.text = modelData
|
||||
modelPicker.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
if (!ollie.rootBackendsLoaded) ollie.loadRootBackends()
|
||||
if (!ollie.rootAgentsLoaded) ollie.loadRootAgents()
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: backendField
|
||||
function onTextChanged() {
|
||||
var be = backendField.text.trim()
|
||||
if (be !== "" && ollie.rootModelsLoaded) {
|
||||
var models = ollie.getAvailableModels(be)
|
||||
if (models.length > 0) {
|
||||
modelField.placeholderText = models[0]
|
||||
} else {
|
||||
modelField.placeholderText = "(no models)"
|
||||
}
|
||||
} else {
|
||||
modelField.placeholderText = "(auto-populated)"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onAccepted: {
|
||||
|
|
@ -381,8 +454,8 @@ ApplicationWindow {
|
|||
return
|
||||
}
|
||||
var name = nameField.text.trim()
|
||||
var backend = backendCombo.currentText
|
||||
var model = modelCombo.currentText
|
||||
var backend = backendField.text.trim()
|
||||
var model = modelField.text.trim()
|
||||
var agent = agentCombo.currentText
|
||||
var remote = remoteField.text.trim()
|
||||
|
||||
|
|
@ -395,16 +468,6 @@ ApplicationWindow {
|
|||
}
|
||||
}
|
||||
|
||||
FileDialog {
|
||||
id: folderDialog
|
||||
title: "Select Project Directory"
|
||||
currentFolder: StandardPaths.homePath
|
||||
selectFolder: true
|
||||
onAccepted: {
|
||||
dirField.text = selectedFolder
|
||||
}
|
||||
}
|
||||
|
||||
SplitView {
|
||||
anchors.fill: parent
|
||||
|
||||
|
|
|
|||
Reference in New Issue