2026-08-27 09:21:51 +03:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-27 16:44:42 +03:00
|
|
|
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()
|
2026-08-27 09:21:51 +03:00
|
|
|
}
|
|
|
|
|
|
2026-08-27 16:44:42 +03:00
|
|
|
combo.currentIndex = loaderRow.versionIndex(loaderRow.selectedVersion)
|
2026-08-27 09:21:51 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function reload() {
|
|
|
|
|
if (!box.checked || loaderRow.gameVersion === "") {
|
2026-08-27 16:44:42 +03:00
|
|
|
loaderRow.applyEntries([])
|
2026-08-27 09:21:51 +03:00
|
|
|
return
|
|
|
|
|
}
|
2026-08-27 16:44:42 +03:00
|
|
|
loaderRow.applyEntries(loaderRow.backend.loaderVersions(loaderRow.loaderKey,
|
|
|
|
|
loaderRow.gameVersion))
|
2026-08-27 09:21:51 +03:00
|
|
|
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
|
2026-08-27 16:44:42 +03:00
|
|
|
loaderRow.applyEntries(loaderRow.backend.loaderVersions(key, game))
|
2026-08-27 09:21:51 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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)
|
2026-09-03 09:18:48 +03:00
|
|
|
? Loc.t.loader.progress.loadingVersions.arg(loaderRow.title)
|
|
|
|
|
: Loc.t.loader.status.unsupported.arg(loaderRow.title)
|
2026-08-27 09:21:51 +03:00
|
|
|
.arg(loaderRow.gameVersion)
|
|
|
|
|
}
|
|
|
|
|
}
|