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

245 lines
8.0 KiB
QML

/*
Copyright 2021 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
3 years ago
import QtQuick.Dialogs 6.2
3 years ago
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 {
}
3 years ago
property real margins: 16
3 years ago
cellWidth: 292 + 16
cellHeight: 190 + 16
readonly property real displayedItems: Math.floor((parent.width - margins*2) / cellWidth)
width: displayedItems * cellWidth
model: uiModel.targetList;
3 years ago
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 }
}
3 years ago
InfoDialog {
id: writeErrorDialog
titleText: qsTr("Error")
text: qsTr("Error writing shortcuts.vdf...")
}
delegate: RPane {
id: delegateRoot
color: Qt.lighter(Material.background, 1.6)
bgOpacity: 0.3
radius: 8
3 years ago
width: 292
height: 190
Material.elevation: 4
3 years ago
clip: true
property bool isInSteam: uiModel.isInSteam(modelData);
Label {
3 years ago
id: label
anchors.top: parent.top
anchors.left: parent.left
3 years ago
anchors.right: parent.right
text: modelData.name
font.bold: true
font.pixelSize: 16
elide: Text.ElideRight
}
3 years ago
Column {
anchors.top: label.bottom
anchors.left: parent.left
anchors.bottom: buttonrow.top
3 years ago
anchors.margins: 12
3 years ago
spacing: 8
3 years ago
Row {
spacing: 8
visible: modelData.launchPath && modelData.launchPath.length > 0
Label {
id: typeLabel
3 years ago
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
3 years ago
}
}
3 years ago
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
}
}
3 years ago
}
Image {
anchors.right: parent.right
anchors.bottom: buttonrow.top
id: maybeIcon
anchors.bottomMargin: 8
source: modelData.icon ? "file:///" + modelData.icon : null
// TODO: extract exe icons.
width: 48
height: 48
visible: modelData.icon
}
3 years ago
Button {
id: steambutton
3 years ago
anchors.left: parent.left
anchors.bottom: parent.bottom
width: 72
onClicked: function(){
if (delegateRoot.isInSteam) {
if (!uiModel.removeFromSteam(modelData.name)) {
3 years ago
writeErrorDialog.open();
return;
}
} else {
if (!uiModel.addToSteam(modelData)) {
3 years ago
writeErrorDialog.open();
return;
}
}
delegateRoot.isInSteam = uiModel.isInSteam(modelData)
3 years ago
steamShortcutsChanged = true
}
highlighted: delegateRoot.isInSteam
3 years ago
Material.accent: Material.color(Material.Red, Material.Shade800)
3 years ago
Row {
anchors.centerIn: parent
spacing: 8
Label {
anchors.verticalCenter: parent.verticalCenter
text: delegateRoot.isInSteam ? "-" : "+"
3 years ago
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
3 years ago
RoundButton {
onClicked: uiModel.deleteTarget(index)
highlighted: true
3 years ago
Material.accent: Material.color(Material.Red, Material.Shade900)
Image {
anchors.centerIn: parent
source: "qrc:/svg/delete_white_24dp.svg"
width: 16
height: 16
}
}
3 years ago
RoundButton {
onClicked: editClicked(index, modelData)
3 years ago
highlighted: true
Image {
anchors.centerIn: parent
source: "qrc:/svg/edit_white_24dp.svg"
width: 16
height: 16
}
}
}
}
}