FreeKill/Fk/Pages/PackageManage.qml

206 lines
4.9 KiB
QML
Raw Permalink Normal View History

// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Item {
id: root
ToolBar {
id: bar
width: parent.width
RowLayout {
anchors.fill: parent
ToolButton {
icon.source: AppPath + "/image/modmaker/back"
onClicked: mainStack.pop();
}
Label {
text: qsTr("Package Manager")
horizontalAlignment: Qt.AlignHCenter
Layout.fillWidth: true
}
ToolButton {
icon.source: AppPath + "/image/modmaker/menu"
onClicked: menu.open()
Menu {
id: menu
y: bar.height
MenuItem {
text: qsTr("Enable All")
onTriggered: {
for (let i = 0; i < packageModel.count; i++) {
const name = packageModel.get(i).pkgName;
Pacman.enablePack(name);
}
updatePackageList();
}
}
MenuItem {
text: qsTr("Disable All")
onTriggered: {
for (let i = 0; i < packageModel.count; i++) {
const name = packageModel.get(i).pkgName;
Pacman.disablePack(name);
}
updatePackageList();
}
}
MenuItem {
text: qsTr("Upgrade All")
onTriggered: {
for (let i = 0; i < packageModel.count; i++) {
const name = packageModel.get(i).pkgName;
Pacman.upgradePack(name);
}
updatePackageList();
}
}
}
}
}
}
Rectangle {
width: parent.width
height: parent.height - bar.height - urlInstaller.height
anchors.top: bar.bottom
color: "snow"
opacity: 0.75
clip: true
ListView {
id: packageList
clip: true
anchors.fill: parent
model: ListModel {
id: packageModel
}
delegate: ItemDelegate {
width: root.width
height: 64
ColumnLayout {
anchors.fill: parent
anchors.margins: 8
Text {
text: "<b>" + pkgName + "</b> (" + pkgVersion + ")"
font.pixelSize: 18
textFormat: Text.RichText
color: pkgEnabled === "1" ? "black" : "grey"
}
Text {
text: pkgURL
color: pkgEnabled === "1" ? "black" : "grey"
}
}
Button {
id: enableBtn
text: pkgEnabled === "0" ? qsTr("Enable") : qsTr("Disable")
anchors.right: upgradeBtn.left
anchors.rightMargin: 8
onClicked: {
if (pkgEnabled === "0") {
Pacman.enablePack(pkgName);
pkgEnabled = "1";
} else {
Pacman.disablePack(pkgName);
pkgEnabled = "0";
}
// updatePackageList();
}
}
Button {
id: upgradeBtn
text: qsTr("Upgrade")
anchors.right: delBtn.left
anchors.rightMargin: 8
onClicked: {
Pacman.upgradePack(pkgName);
// updatePackageList();
const data = JSON.parse(Pacman.listPackages());
const e = data[index];
packageModel.set(index, {
pkgName: e.name,
pkgURL: e.url,
pkgVersion: e.hash.substring(0, 8),
pkgEnabled: e.enabled
});
}
}
Button {
id: delBtn
text: qsTr("Remove")
anchors.right: parent.right
anchors.rightMargin: 8
onClicked: {
Pacman.removePack(pkgName);
// updatePackageList();
packageModel.remove(index);
}
}
onClicked: {
Backend.copyToClipboard(pkgURL);
toast.show(qsTr("Copied %1.").arg(pkgURL));
}
}
}
}
Rectangle {
id: urlInstaller
width: parent.width
height: childrenRect.height
color: "snow"
opacity: 0.75
anchors.bottom: parent.bottom
RowLayout {
width: parent.width
TextField {
id: urlEdit
Layout.fillWidth: true
clip: true
}
Button {
text: qsTr("Install From URL")
enabled: urlEdit.text !== ""
onClicked: {
const url = urlEdit.text;
mainWindow.busy = true;
Pacman.downloadNewPack(url, true);
}
}
}
}
function updatePackageList() {
packageModel.clear();
const data = JSON.parse(Pacman.listPackages());
data.forEach(e => packageModel.append({
pkgName: e.name,
pkgURL: e.url,
pkgVersion: e.hash.substring(0, 8),
pkgEnabled: e.enabled
}));
}
function downloadComplete() {
const idx = packageList.currentIndex;
updatePackageList();
packageList.currentIndex = idx;
}
Component.onCompleted: {
updatePackageList();
}
}