Files
BiLauncher/LoaderRow.qml
T
2026-10-09 12:29:21 +03:00

149 lines
4.4 KiB
QML

import QtQuick
import QtQuick.Controls 2.15
Column {
id: loaderRow
required property var backend
required property string loaderKey
required property string title
property string gameVersion: ""
property alias checked: box.checked
property string selectedVersion: ""
property var entries: []
signal userChecked()
signal changed()
property bool applying: false
spacing: 4
function versionIndex(version) {
for (var i = 0; i < loaderRow.entries.length; ++i) {
if (loaderRow.entries[i].version === version)
return i
}
return -1
}
function applyEntries(list) {
loaderRow.entries = list
if (loaderRow.versionIndex(loaderRow.selectedVersion) < 0) {
const fallback = list.length > 0 ? list[0].version : ""
const changedValue = loaderRow.selectedVersion !== fallback
loaderRow.selectedVersion = fallback
if (changedValue && !loaderRow.applying)
loaderRow.changed()
}
combo.currentIndex = loaderRow.versionIndex(loaderRow.selectedVersion)
}
function reload() {
if (!box.checked || loaderRow.gameVersion === "") {
loaderRow.applyEntries([])
return
}
loaderRow.applyEntries(loaderRow.backend.loaderVersions(loaderRow.loaderKey,
loaderRow.gameVersion))
loaderRow.backend.refreshLoaderVersions(loaderRow.loaderKey, loaderRow.gameVersion)
}
function applyBuild(loader, loaderVersion) {
loaderRow.applying = true
box.checked = loader === loaderRow.loaderKey
loaderRow.selectedVersion = box.checked ? loaderVersion : ""
loaderRow.reload()
loaderRow.applying = false
}
onGameVersionChanged: {
loaderRow.selectedVersion = ""
loaderRow.reload()
}
Connections {
target: loaderRow.backend
function onLoaderVersionsChanged(key, game) {
if (key !== loaderRow.loaderKey || game !== loaderRow.gameVersion || !box.checked)
return
loaderRow.applyEntries(loaderRow.backend.loaderVersions(key, game))
}
}
CheckBox {
id: box
text: loaderRow.title
enabled: loaderRow.gameVersion !== ""
indicator: Rectangle {
implicitWidth: 18
implicitHeight: 18
x: 0
y: (box.height - height) / 2
radius: 4
color: box.checked ? "#91B315" : "#2a2a2a"
border.color: box.checked ? "#91B315" : "#444444"
border.width: 1
Text {
anchors.centerIn: parent
visible: box.checked
text: "✓"
color: "#1e1e1e"
font.pixelSize: 13
font.bold: true
}
}
contentItem: Text {
leftPadding: box.indicator.width + 8
text: box.text
color: box.enabled ? "#ffffff" : "#666666"
font.pixelSize: 12
verticalAlignment: Text.AlignVCenter
}
onToggled: {
if (box.checked)
loaderRow.userChecked()
else
loaderRow.selectedVersion = ""
loaderRow.reload()
loaderRow.changed()
}
}
DarkCombo {
id: combo
visible: box.checked && loaderRow.entries.length > 0
width: loaderRow.width - 26
height: 32
x: 26
model: loaderRow.entries.map(entry => entry.label)
onActivated: (index) => {
if (index < 0 || index >= loaderRow.entries.length)
return
loaderRow.selectedVersion = loaderRow.entries[index].version
loaderRow.changed()
}
}
Text {
visible: box.checked && loaderRow.entries.length === 0
x: 26
width: loaderRow.width - 26
wrapMode: Text.Wrap
font.pixelSize: 11
color: loaderRow.backend.loaderVersionsLoading(loaderRow.loaderKey, loaderRow.gameVersion)
? "#888888" : "#cc6666"
text: loaderRow.backend.loaderVersionsLoading(loaderRow.loaderKey, loaderRow.gameVersion)
? Loc.t.loader.progress.loadingVersions.arg(loaderRow.title)
: Loc.t.loader.status.unsupported.arg(loaderRow.title)
.arg(loaderRow.gameVersion)
}
}