app/resources/qml/MainPage/CenterContent.qml

396 lines
12 KiB
QML

import QtQuick 2.0
import QtQuick.Controls 2.0
import QtGraphicalEffects 1.0
import QtQuick.Layouts 1.0
import "../components"
import "../components/layout"
import de.itsblue.ScStw 2.0
import de.itsblue.ScStw.Styling 2.0
import de.itsblue.ScStw.Styling.Components 1.0
Item {
id: control
GridLayout {
id: centerLayout
//anchors.centerIn: parent
anchors {
right: parent.right
bottom: parent.bottom
}
width: parent.width
height: parent.height
columns: app.landscape() ? 3:1
rows: app.landscape() ? 1:3
Item {
id: centerExtraContentTop
property double size
Layout.preferredHeight: app.landscape() ? centerLayout.height * 0.6:Math.min(centerLayout.width * size, centerLayout.height * size)
Layout.preferredWidth: app.landscape() ? Math.min(centerLayout.width * size, centerLayout.height * size):centerLayout.width * 0.8
Layout.alignment: Layout.Center
Behavior on size {
NumberAnimation {
duration: 800
easing.type: Easing.InOutQuart
}
}
StackView {
id: centerExtraContentTopStack
anchors.fill: parent
anchors.margins: 1
property QtObject newItem: emptyComp
onNewItemChanged: {
centerExtraContentTopStack.replace(newItem)
}
replaceEnter: Transition {
SequentialAnimation {
PauseAnimation {
duration: 400
}
NumberAnimation {
property: "opacity"
from: 0
to: 1
duration: 400
easing.type: Easing.InOutQuart
}
}
}
replaceExit: Transition {
NumberAnimation {
property: "opacity"
from: 1
to: 0
duration: 400
easing.type: Easing.InOutQuart
}
}
Component {
id: waitingDetailsComp
Column {
opacity: 0
Row {
id: stateIndicatorRow
property int delegateWidth: width / stateIndicatorRepeater.model - (spacing * (stateIndicatorRepeater.model - 1) / stateIndicatorRepeater.model)
property int delegateHeight: height
width: parent.width
height: parent.height * 0.9
spacing: width * 0.1
Repeater {
id: stateIndicatorRepeater
model: scStwRemoteRace.timers.length
delegate: ColumnLayout {
id: timerStatusColumn
property var thisTimer: scStwRemoteRace.timers[index]
width: parent.delegateWidth
height: parent.delegateHeight
Label {
Layout.preferredWidth: parent.width
Layout.preferredHeight: parent.height * 0.1
font.pixelSize: height * 0.8
fontSizeMode: Text.Fit
minimumPointSize: 1
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: appTheme.theme.colors.text
text: "Lane " + timerStatusColumn.thisTimer["letter"]
}
StateIndicator {
Layout.fillWidth: true
Layout.fillHeight: true
backgroundColor: appTheme.theme.colors.background
successColor: appTheme.theme.colors.success
warningColor: appTheme.theme.colors.warning
state: timerStatusColumn.thisTimer["readyState"] === ScStwTimer.IsReady ?
"success":timerStatusColumn.thisTimer["readyState"] === ScStwTimer.IsDisabled ?
"unknown":"warn"
indicatorSize: 0.8
MouseArea {
anchors.fill: parent
onClicked: {
var disabled = timerStatusColumn.thisTimer["state"] !== ScStwTimer.DISABLED
console.log("setting timer to disabled: " + disabled)
scStwRemoteRace.setTimerDisabled(timerStatusColumn.thisTimer["id"], disabled)
}
}
}
}
}
}
Label {
width: parent.width
height: parent.height * 0.1
font.pixelSize: height * 0.6
fontSizeMode: Text.Fit
minimumPointSize: 1
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: appTheme.theme.colors.text
text: "Tap on a lane to disable it"
}
}
}
Component {
id: incidentDetailsComp
ExtensionOverview {
opacity: 0
backgroundColor: appTheme.theme.colors.background
delegateHeight: centerExtraContentTopStack.height / 5
}
}
Component {
id: emptyComp
Item {}
}
}
}
MainActionButton {
id: mainActionButton
property double size
startProgress: scStwRemoteRace.currentStartDelay["progress"]
Layout.alignment: Layout.Center
Layout.preferredHeight: app.landscape() ? width:Math.min(centerLayout.width * size, centerLayout.height * size)
Layout.preferredWidth: app.landscape() ? Math.min(centerLayout.width * size, centerLayout.height * size):height
onClicked: {
if(progressControlActivated && progress < 1.0)
return
var ret;
switch(scStwRemoteRace.state) {
case ScStwRace.IDLE:
ret = scStwRemoteRace.start()
break;
case ScStwRace.WAITING:
if(!scStwRemoteRace.readySoundEnabled && scStwRemoteRace.isReadyForNextState)
ret = scStwRemoteRace.start()
else
ret = scStwRemoteRace.cancel()
break;
case ScStwRace.PREPAIRING:
case ScStwRace.STARTING:
ret = scStwRemoteRace.cancel()
break;
case ScStwRace.RUNNING:
ret = scStwRemoteRace.stop()
break;
case ScStwRace.STOPPED:
case ScStwRace.INCIDENT:
ret = scStwRemoteRace.reset()
break;
}
if(ret !== 200)
console.log("Error executing main button action: " + ret)
progress = 0
}
Behavior on size {
NumberAnimation {
duration: 800
easing.type: Easing.InOutQuart
}
}
}
Item {
id: centerExtraContentBottom
property double size
Layout.preferredHeight: app.landscape() ? centerLayout.height:Math.min(centerLayout.width * size, centerLayout.height * size)
Layout.preferredWidth: app.landscape() ? Math.min(centerLayout.width * size, centerLayout.height * size):centerLayout.width
Behavior on size {
NumberAnimation {
duration: 400
easing.type: Easing.InOutQuart
}
}
}
}
states: [
State {
name: ScStwRace.IDLE
PropertyChanges {
target: mainActionButton
size: 0.9
text: "start"
}
PropertyChanges {
target: centerLayout
height: app.landscape() ? control.height : Math.max(control.height, app.height * 0.4)
width: app.landscape() ? Math.max(control.width, app.width * 0.4) : control.width
}
},
State {
name: ScStwRace.PREPAIRING
PropertyChanges {
target: mainActionButton
size: 0.9
text: "cancel"
}
},
State {
name: ScStwRace.WAITING
PropertyChanges {
target: mainActionButton
size: scStwRemoteRace.competitionMode ? 0.3:0.9
text: scStwRemoteRace.readySoundEnabled ? "cancel": scStwRemoteRace.isReadyForNextState ? "ready":"cancel"
progressControlActivated: scStwRemoteRace.competitionMode && !scStwRemoteRace.readySoundEnabled && !scStwRemoteRace.isReadyForNextState
}
PropertyChanges {
target: centerExtraContentTop
size: scStwRemoteRace.competitionMode ? 0.7:0
}
PropertyChanges {
target: centerExtraContentBottom
size: scStwRemoteRace.competitionMode ? 0.05:0
}
PropertyChanges {
target: centerExtraContentTopStack
newItem: scStwRemoteRace.competitionMode ? waitingDetailsComp:emptyComp
}
},
State {
name: ScStwRace.STARTING
PropertyChanges {
target: mainActionButton
size: 0.9
text: "cancel"
}
},
State {
name: ScStwRace.RUNNING
PropertyChanges {
target: mainActionButton
size: 0.9
text: scStwRemoteRace.competitionMode ? "cancel":"stop"
progressControlActivated: scStwRemoteRace.competitionMode
}
},
State {
name: ScStwRace.STOPPED
PropertyChanges {
target: mainActionButton
size: 0.5
text: "reset"
}
PropertyChanges {
target: centerLayout
height: app.landscape() ? control.height : Math.max(control.height, app.height * 0.4)
width: app.landscape() ? Math.max(control.width, app.width * 0.4) : control.width
}
},
State {
name: ScStwRace.INCIDENT
PropertyChanges {
target: mainActionButton
size: 0.5
text: "reset"
}
PropertyChanges {
target: centerExtraContentTop
size: scStwRemoteRace.competitionMode ? 0.7:0
}
PropertyChanges {
target: centerExtraContentBottom
size: scStwRemoteRace.competitionMode ? 0.05:0
}
PropertyChanges {
target: centerExtraContentTopStack
newItem: scStwRemoteRace.competitionMode ? incidentDetailsComp:emptyComp
}
}
]
}