diff --git a/gui/main.qml b/gui/main.qml index 8dcd96b..0636087 100644 --- a/gui/main.qml +++ b/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