Revision control
++ // Copyright (C) 2026 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ import QtQuick
++ import QtQuick.Controls
++ import QtQuick.Controls.Material
++
++ import chat_example
++
++ pragma ComponentBehavior: Bound
++
++ Item {
++ id: root
++ anchors.fill: parent
++
++ signal choiceIsDone()
++
++ ComboBox {
++ id: availableModels
++ anchors.bottom: charachters.top
++ anchors.bottomMargin: 20
++ anchors.horizontalCenter: parent.horizontalCenter
++
++ width: charachters.width
++ height: 40
++
++ font.family: "Segoe UI"
++ font.pointSize: 12
++
++ contentItem: Text {
++ text: availableModels.displayText
++ font: availableModels.font
++ color: "#FFFFFF"
++ verticalAlignment: Text.AlignVCenter
++ leftPadding: 10
++ }
++
++ delegate: ItemDelegate {
++ id: comboItem
++ width: ListView.view.width
++
++ required property string modelData
++
++ contentItem: Text {
++ text: comboItem.modelData
++ font.family: "Segoe UI"
++ font.pointSize: 12
++ color: "#FFFFFF"
++ verticalAlignment: Text.AlignVCenter
++ }
++ }
++
++ model: OpenAIChatManager.modelList
++ displayText: count > 0 ? currentText : "No models available"
++
++ onCurrentTextChanged: {
++ OpenAIChatManager.modelName = currentText
++ }
++ }
++
++ ListModel {
++ id: choices
++ ListElement {
++ elementId: OpenAIChatManager.Wizard
++ elementName: "Wizard"
++ elementImage: "magic-hat.svg"
++ elementColor1: "#2A2440"
++ elementColor2: "#4B2E83"
++ elementColor3: "#7A5CFF"
++ pressedElementColor1: "#211C33"
++ pressedElementColor2: "#3E256B"
++ pressedElementColor3: "#654BE0"
++ }
++ ListElement {
++ elementId: OpenAIChatManager.Scientist
++ elementName: "Scientist"
++ elementImage: "graduation-hat.svg"
++ elementColor1: "#24303A"
++ elementColor2: "#2C6E9B"
++ elementColor3: "#4CC9F0"
++ pressedElementColor1: "#1C252D"
++ pressedElementColor2: "#255C82"
++ pressedElementColor3: "#3FB0D6"
++ }
++ ListElement {
++ elementId: OpenAIChatManager.DefaultMode
++ elementName: "Regular mode"
++ elementImage: "head.svg"
++ elementColor1: "#2E2E2E"
++ elementColor2: "#3A3A3A"
++ elementColor3: "#505050"
++ pressedElementColor1: "#242424"
++ pressedElementColor2: "#303030"
++ pressedElementColor3: "#444444"
++ }
++ ListElement {
++ elementId: OpenAIChatManager.UserCharacter
++ elementName: "Your choice"
++ elementImage: "head-plus.svg"
++ elementColor1: "#2C2C35"
++ elementColor2: "#6A4DFF"
++ elementColor3: "#5CC8FF"
++ pressedElementColor1: "#23232A"
++ pressedElementColor2: "#563ED6"
++ pressedElementColor3: "#49AEE0"
++ }
++ }
++
++ Grid {
++ id: charachters
++
++ anchors.centerIn: parent
++ columns: 2
++ spacing: 10
++ Repeater {
++ model: choices
++ delegate: Rectangle {
++ id: itemChoice
++ width: 180
++ height: 180
++
++ required property int elementId
++ required property string elementName
++ required property string elementImage
++ required property color elementColor1
++ required property color elementColor2
++ required property color elementColor3
++ required property color pressedElementColor1
++ required property color pressedElementColor2
++ required property color pressedElementColor3
++
++ gradient: Gradient {
++ GradientStop { position: 0.0; color: mouseArea.isPressed
++ ? itemChoice.pressedElementColor1 : itemChoice.elementColor1 }
++ GradientStop { position: 0.5; color: mouseArea.isPressed
++ ? itemChoice.pressedElementColor2 : itemChoice.elementColor2 }
++ GradientStop { position: 1.0; color: mouseArea.isPressed
++ ? itemChoice.pressedElementColor3 : itemChoice.elementColor3 }
++ }
++
++ Image {
++ id: icon
++ anchors.centerIn: parent
++
++ width: 50
++ height: 50
++
++ source: "resources/" + itemChoice.elementImage
++ fillMode: Image.PreserveAspectFit
++ smooth: true
++ }
++
++ Text {
++ anchors.top: icon.bottom
++ anchors.horizontalCenter: parent.horizontalCenter
++
++ text: itemChoice.elementName
++ font.pointSize: 12
++ }
++
++ MouseArea {
++ id: mouseArea
++
++ anchors.fill: parent
++ enabled: OpenAIChatManager.modelName !== ""
++ property bool isPressed: false
++
++ onPressed: {
++ isPressed = true
++ }
++ onReleased: {
++ isPressed = false
++ }
++ onClicked: {
++ OpenAIChatManager.characterId = itemChoice.elementId
++ root.choiceIsDone()
++ }
++ }
++ }
++ }
++ }
++ }