You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
GlosSI/GlosSIConfig/qml/ShortcutCards.qml

377 lines
12 KiB
QML

/*
Copyright 2021-2022 Peter Repukat - FlatspotSoftware
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import QtQuick 6.2
import QtQuick.Layouts 6.2
import QtQuick.Controls 6.2
import QtQuick.Controls.Material 6.2
import QtQuick.Dialogs 6.2
import Qt5Compat.GraphicalEffects
GridView {
id: shortcutgrid
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: margins
visible: model.length > 0
signal editClicked(var index, var shortcutInfo)
ScrollBar.vertical: ScrollBar {
}
property real margins: 16
cellWidth: 292 + 16
cellHeight: 190 + 16
readonly property real displayedItems: Math.floor((parent.width - margins*2) / cellWidth)
width: displayedItems * cellWidth
model: uiModel.targetList;
GridView.delayRemove: true
property var manualInfo: null
// TODO: animations only properly work with abstractListModel... grrr...
addDisplaced: Transition {
NumberAnimation { properties: "x,y"; duration: 300 }
}
add: Transition {
ParallelAnimation {
NumberAnimation { property: "opacity"; from: 0; duration: 300; easing.type: Easing.OutQuad }
NumberAnimation { properties: "x,y"; from: height; duration: 300; easing.type: Easing.OutQuad }
}
}
populate: Transition {
ParallelAnimation {
NumberAnimation { property: "opacity"; from: 0; duration: 300; easing.type: Easing.OutQuad }
NumberAnimation { properties: "x,y"; duration: 300; easing.type: Easing.OutQuad }
}
}
remove: Transition {
NumberAnimation { property: "opacity"; to: 0; duration: 300; easing.type: Easing.InQuad }
}
removeDisplaced: Transition {
NumberAnimation { properties: "x,y"; duration: 300; easing.type: Easing.InQuad }
}
Dialog {
id: manualAddDialog
anchors.centerIn: parent
visible: false
modal: true
dim: true
parent: Overlay.overlay
Overlay.modal: Rectangle {
color: Qt.rgba(0,0,0,0.4)
opacity: backdropOpacity
Behavior on opacity {
NumberAnimation {
duration: 300
}
}
}
property real backdropOpacity: 1.0
enter: Transition {
NumberAnimation{target: madcontent; property: "y"; from: parent.height; to: 16; duration: 300; easing.type: Easing.OutQuad }
NumberAnimation{target: madbackground; property: "y"; from: parent.height; to: 0; duration: 300; easing.type: Easing.OutQuad }
NumberAnimation{target: manualAddDialog; property: "backdropOpacity"; from: 0; to: 1; duration: 300; easing.type: Easing.OutQuad }
}
exit: Transition {
NumberAnimation{target: madcontent; property: "y"; from: 16; to: parent.height; duration: 300; easing.type: Easing.InQuad }
NumberAnimation{target: madbackground; property: "y"; from: 0; to: parent.height; duration: 300; easing.type: Easing.InQuad }
NumberAnimation{target: manualAddDialog; property: "backdropOpacity"; from: 1; to: 0; duration: 300; easing.type: Easing.InQuad }
}
background: RPane {
id: madbackground
radius: 4
Material.elevation: 64
bgOpacity: 0.97
}
contentItem: Item {
id: madcontent
implicitWidth: steamscreener.width
implicitHeight: madtext.height + 16 + steamscreener.height + 16 + madrow.height
Label {
id: madtext
text: qsTr("Add \"GlosSITarget\" as game to Steam and change it's properties (in Steam) to this:")
}
Image {
anchors.top: madtext.bottom
anchors.left: madtext.left
anchors.topMargin: 16
id: steamscreener
source: "qrc:/steamscreener.png"
}
FluentTextInput {
id: madnameinput
text: manualInfo ? manualInfo.name : ""
anchors.top: steamscreener.top
anchors.left: steamscreener.left
anchors.topMargin: 72
anchors.leftMargin: 92
readOnly: true
background: Item {}
width: 550
}
FluentTextInput {
id: glossiPathInput
text: manualInfo ? manualInfo.launch : ""
anchors.top: steamscreener.top
anchors.left: steamscreener.left
anchors.topMargin: 192
anchors.leftMargin: 24
readOnly: true
background: Item {}
width: 550
}
FluentTextInput {
id: startDirInput
text: manualInfo ? manualInfo.launchDir : ""
anchors.top: steamscreener.top
anchors.left: steamscreener.left
anchors.topMargin: 266
anchors.leftMargin: 24
readOnly: true
background: Item {}
width: 550
}
FluentTextInput {
id: launchOptsInput
text: manualInfo ? manualInfo.config : ""
anchors.top: steamscreener.top
anchors.left: steamscreener.left
anchors.topMargin: 432
anchors.leftMargin: 24
readOnly: true
background: Item {}
width: 550
}
Row {
id: madrow
anchors.top: steamscreener.bottom
anchors.topMargin: 16
spacing: 16
Button {
text: qsTr("OK")
onClicked: function(){
manualAddDialog.close()
}
}
anchors.right: parent.right
}
}
}
InfoDialog {
id: writeErrorDialog
titleText: qsTr("Error")
text: qsTr("Error writing shortcuts.vdf...\nPlease make sure Steam is running")
extraButton: true
extraButtonText: qsTr("Manual instructions")
onConfirmedExtra: function(data) {
manualAddDialog.open();
}
}
delegate: RPane {
id: delegateRoot
color: Qt.lighter(Material.background, 1.6)
bgOpacity: 0.3
radius: 8
width: 292
height: 190
Material.elevation: 4
clip: true
property bool isInSteam: uiModel.isInSteam(modelData);
Image {
anchors.top: parent.top
anchors.left: parent.left
id: maybeIcon
source: !!modelData.icon
? modelData.icon.endsWith(".exe")
? "image://exe/" + modelData.icon
: "file:///" + modelData.icon
: 'qrc:/svg/add_photo_alternate_white_24dp.svg'
width: 48
height: 48
}
Label {
id: label
anchors.top: parent.top
anchors.leftMargin: 8
anchors.left: maybeIcon.right
anchors.right: parent.right
text: modelData.name
font.bold: true
font.pixelSize: 16
elide: Text.ElideRight
}
Column {
anchors.top: maybeIcon.bottom
anchors.left: parent.left
anchors.bottom: buttonrow.top
anchors.margins: 12
spacing: 8
Row {
spacing: 8
visible: !!modelData.launchPath && modelData.launchPath.length > 0
Label {
id: typeLabel
text: uiModel.isWindows && !!modelData.launchPath
? modelData.launchPath.replace(/^.{1,3}:/, "").length < modelData.launchPath.length
? "Win32"
: "UWP"
: qsTr("Launch")
font.bold: true
}
Label {
property string te: modelData.launchPath
? modelData.launchPath.replace(/.*(\\|\/)/gm, "")
: ""
text: uiModel.isWindows ? te : te.replace(/\..{3}$/, "")
width: 292 - typeLabel.width - 72
elide: Text.ElideRight
}
}
Row {
visible: false // TODO: dunno about this...
spacing: 4
Label {
text: qsTr("Is in")
font.bold: true
}
Image {
anchors.verticalCenter: parent.verticalCenter
source: "qrc:/svg/steam.svg"
width: 16
height: 16
smooth: true
mipmap: true
ColorOverlay {
anchors.fill: parent
source: parent
color: "white"
}
}
Item {
width: 4
height: 1
}
Label {
anchors.verticalCenter: parent.verticalCenter
text: delegateRoot.isInSteam ? qsTr("Yes") : qsTr("No")
width: 292 - typeLabel.width - 72
elide: Text.ElideRight
}
}
}
Button {
id: steambutton
anchors.left: parent.left
anchors.bottom: parent.bottom
width: 72
onClicked: function(){
if (delegateRoot.isInSteam) {
if (!uiModel.removeFromSteam(modelData.name, "")) {
writeErrorDialog.open();
return;
}
} else {
if (!uiModel.addToSteam(modelData, "")) {
manualInfo = uiModel.manualProps(modelData);
writeErrorDialog.open();
return;
}
}
if (steamShortcutsChanged == false) {
steamChangedDialog.open();
}
delegateRoot.isInSteam = uiModel.isInSteam(modelData)
steamShortcutsChanged = true
}
highlighted: delegateRoot.isInSteam
Material.accent: Material.color(Material.Red, Material.Shade800)
Row {
anchors.centerIn: parent
spacing: 8
Label {
anchors.verticalCenter: parent.verticalCenter
text: delegateRoot.isInSteam ? "-" : "+"
font.bold: true
font.pixelSize: 24
}
Image {
anchors.verticalCenter: parent.verticalCenter
source: "qrc:/svg/steam.svg"
width: 22
height: 22
smooth: true
mipmap: true
ColorOverlay {
anchors.fill: parent
source: parent
color: "white"
}
}
}
}
Row {
id: buttonrow
anchors.right: parent.right
anchors.bottom: parent.bottom
spacing: 4
RoundButton {
onClicked: uiModel.deleteTarget(index)
highlighted: true
Material.accent: Material.color(Material.Red, Material.Shade900)
Image {
anchors.centerIn: parent
source: "qrc:/svg/delete_white_24dp.svg"
width: 16
height: 16
}
}
RoundButton {
onClicked: editClicked(index, modelData)
highlighted: true
Image {
anchors.centerIn: parent
source: "qrc:/svg/edit_white_24dp.svg"
width: 16
height: 16
}
}
}
}
}