|
|
|
|
/*
|
|
|
|
|
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
|
|
|
|
|
import QtQuick.Layouts
|
|
|
|
|
import QtQuick.Controls
|
|
|
|
|
import QtQuick.Controls.Material
|
|
|
|
|
import QtQuick.Dialogs
|
|
|
|
|
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: 212 + 16
|
|
|
|
|
readonly property real displayedItems: Math.floor((parent.width - margins*2) / cellWidth)
|
|
|
|
|
width: displayedItems * cellWidth
|
|
|
|
|
model: uiModel.targetList;
|
|
|
|
|
GridView.delayRemove: true
|
|
|
|
|
|
|
|
|
|
// 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 }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
delegate: RPane {
|
|
|
|
|
id: delegateRoot
|
|
|
|
|
color: Qt.lighter(Material.background, 1.6)
|
|
|
|
|
bgOpacity: 0.3
|
|
|
|
|
radius: 8
|
|
|
|
|
width: 292
|
|
|
|
|
height: 212
|
|
|
|
|
Material.elevation: 4
|
|
|
|
|
clip: true
|
|
|
|
|
property bool isInSteam: uiModel.isInSteam(modelData);
|
|
|
|
|
bgImgSource: isInSteam ? "file:///" + uiModel.getGridImagePath(modelData) : null
|
|
|
|
|
bgImgOpacity: isInSteam ? 0.12 : -1
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
fillMode: Image.PreserveAspectFit
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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: uiModel.isDebug
|
|
|
|
|
spacing: 4
|
|
|
|
|
Label {
|
|
|
|
|
text: qsTr("AppID: ")
|
|
|
|
|
font.bold: true
|
|
|
|
|
}
|
|
|
|
|
Label {
|
|
|
|
|
text: uiModel.getAppId(modelData)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Column {
|
|
|
|
|
anchors.left: parent.left
|
|
|
|
|
anchors.bottom: parent.bottom
|
|
|
|
|
spacing: 4
|
|
|
|
|
|
|
|
|
|
Button {
|
|
|
|
|
highlighted: true
|
|
|
|
|
visible: delegateRoot.isInSteam
|
|
|
|
|
text: qsTr("Steam controller config")
|
|
|
|
|
onClicked: function() {
|
|
|
|
|
controllerConfigDialog.confirmedExtraParam = uiModel.getAppId(modelData)
|
|
|
|
|
controllerConfigDialog.confirmedParam = uiModel.getAppId(modelData)
|
|
|
|
|
controllerConfigDialog.open();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Button {
|
|
|
|
|
id: steambutton
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|