build script, move qml and scripts to src
@@ -0,0 +1,6 @@
|
||||
[Paths]
|
||||
Prefix = qtdata
|
||||
Qml2Imports = .
|
||||
Imports = .
|
||||
[Platforms]
|
||||
WindowsArguments = dpiawareness=0
|
||||
@@ -0,0 +1,187 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
|
||||
|
||||
MyStackViewPage {
|
||||
headerText: "Accessibility Tools"
|
||||
|
||||
PttControllerConfigDialog {
|
||||
id: pttControllerConfigDialog
|
||||
pttControllerConfigClass: AccessibilityTabController
|
||||
}
|
||||
|
||||
content: ColumnLayout {
|
||||
spacing: 92
|
||||
|
||||
GroupBox {
|
||||
Layout.fillWidth: true
|
||||
|
||||
label: MyText {
|
||||
leftPadding: 10
|
||||
text: "Adjust Player Height"
|
||||
bottomPadding: -10
|
||||
}
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "#ffffff"
|
||||
radius: 8
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle {
|
||||
color: "#ffffff"
|
||||
height: 1
|
||||
Layout.fillWidth: true
|
||||
Layout.bottomMargin: 5
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
MyPushButton2 {
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
accessibilityMoveYSlider.value -= 0.05
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: accessibilityMoveYSlider
|
||||
from: 0
|
||||
to: 1.5
|
||||
stepSize: 0.01
|
||||
value: 0.0
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
accessibilityMoveYText.text = val.toFixed(2)
|
||||
}
|
||||
onValueChanged: {
|
||||
AccessibilityTabController.heightOffset = this.value.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
accessibilityMoveYSlider.value += 0.05
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: accessibilityMoveYText
|
||||
text: "0.00"
|
||||
keyBoardUID: 700
|
||||
Layout.preferredWidth: 140
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val >= accessibilityMoveYSlider.from && val <= accessibilityMoveYSlider.to) {
|
||||
accessibilityMoveYSlider.value = val.toFixed(2);
|
||||
} else {
|
||||
AccessibilityTabController.setHeightOffset(val.toFixed(2), false);
|
||||
}
|
||||
}
|
||||
text = AccessibilityTabController.heightOffset.toFixed(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
MyToggleButton {
|
||||
id: heightOffsetPttEnabledToggle
|
||||
Layout.preferredWidth: 260
|
||||
text: "Push-to-Toggle:"
|
||||
onClicked: {
|
||||
AccessibilityTabController.pttEnabled = checked
|
||||
}
|
||||
}
|
||||
MyToggleButton {
|
||||
id: heightOffsetPttLeftControllerToggle
|
||||
text: "Left Controller"
|
||||
onClicked: {
|
||||
AccessibilityTabController.setPttLeftControllerEnabled(checked, false)
|
||||
}
|
||||
}
|
||||
MyPushButton {
|
||||
text: "Configure"
|
||||
onClicked: {
|
||||
pttControllerConfigDialog.openPopup(0)
|
||||
}
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
MyToggleButton {
|
||||
id: heightOffsetPttRightControllerToggle
|
||||
text: "Right Controller"
|
||||
onClicked: {
|
||||
AccessibilityTabController.setPttRightControllerEnabled(checked, false)
|
||||
}
|
||||
}
|
||||
MyPushButton {
|
||||
text: "Configure"
|
||||
onClicked: {
|
||||
pttControllerConfigDialog.openPopup(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item { Layout.fillHeight: true; Layout.fillWidth: true}
|
||||
|
||||
MyPushButton {
|
||||
id: accessibilityResetButton
|
||||
Layout.preferredWidth: 250
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
AccessibilityTabController.reset()
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
var heightOffsetFormatted = AccessibilityTabController.heightOffset.toFixed(2)
|
||||
if (heightOffsetFormatted >= accessibilityMoveYSlider.from && heightOffsetFormatted <= accessibilityMoveYSlider.to) {
|
||||
accessibilityMoveYSlider.value = heightOffsetFormatted
|
||||
}
|
||||
accessibilityMoveYText.text = heightOffsetFormatted
|
||||
heightOffsetPttEnabledToggle.checked = AccessibilityTabController.pttEnabled
|
||||
heightOffsetPttLeftControllerToggle.checked = AccessibilityTabController.pttLeftControllerEnabled
|
||||
heightOffsetPttRightControllerToggle.checked = AccessibilityTabController.pttRightControllerEnabled
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: AccessibilityTabController
|
||||
onHeightOffsetChanged: {
|
||||
var heightOffsetFormatted = AccessibilityTabController.heightOffset.toFixed(2)
|
||||
if (heightOffsetFormatted >= accessibilityMoveYSlider.from && heightOffsetFormatted <= accessibilityMoveYSlider.to) {
|
||||
accessibilityMoveYSlider.value = heightOffsetFormatted
|
||||
}
|
||||
accessibilityMoveYText.text = heightOffsetFormatted
|
||||
}
|
||||
onPttEnabledChanged: {
|
||||
heightOffsetPttEnabledToggle.checked = AccessibilityTabController.pttEnabled
|
||||
}
|
||||
onPttActiveChanged: {
|
||||
|
||||
}
|
||||
onPttLeftControllerEnabledChanged: {
|
||||
heightOffsetPttLeftControllerToggle.checked = AccessibilityTabController.pttLeftControllerEnabled
|
||||
}
|
||||
onPttRightControllerEnabledChanged: {
|
||||
heightOffsetPttRightControllerToggle.checked = AccessibilityTabController.pttRightControllerEnabled
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,590 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
|
||||
MyStackViewPage {
|
||||
width: 1200
|
||||
headerText: "Audio Settings"
|
||||
|
||||
property bool componentCompleted: false
|
||||
|
||||
|
||||
MyDialogOkPopup {
|
||||
id: audioMessageDialog
|
||||
function showMessage(title, text) {
|
||||
dialogTitle = title
|
||||
dialogText = text
|
||||
open()
|
||||
}
|
||||
}
|
||||
|
||||
MyDialogOkCancelPopup {
|
||||
id: pttDeleteProfileDialog
|
||||
property int profileIndex: -1
|
||||
dialogTitle: "Delete Profile"
|
||||
dialogText: "Do you really want to delete this profile?"
|
||||
onClosed: {
|
||||
if (okClicked) {
|
||||
AudioTabController.deletePttProfile(profileIndex)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PttControllerConfigDialog {
|
||||
id: pttControllerConfigDialog
|
||||
pttControllerConfigClass: AudioTabController
|
||||
}
|
||||
|
||||
MyDialogOkCancelPopup {
|
||||
id: pttNewProfileDialog
|
||||
dialogTitle: "Create New Profile"
|
||||
dialogWidth: 600
|
||||
dialogHeight: 220
|
||||
dialogContentItem: ColumnLayout {
|
||||
RowLayout {
|
||||
Layout.topMargin: 16
|
||||
Layout.leftMargin: 16
|
||||
Layout.rightMargin: 16
|
||||
MyText {
|
||||
text: "Name: "
|
||||
}
|
||||
MyTextField {
|
||||
id: pttNewProfileName
|
||||
keyBoardUID: 590
|
||||
color: "#cccccc"
|
||||
text: ""
|
||||
Layout.fillWidth: true
|
||||
font.pointSize: 20
|
||||
function onInputEvent(input) {
|
||||
pttNewProfileName.text = input
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
onClosed: {
|
||||
if (okClicked) {
|
||||
if (pttNewProfileName.text != "") {
|
||||
AudioTabController.addPttProfile(pttNewProfileName.text)
|
||||
} else {
|
||||
audioMessageDialog.showMessage("Create New Profile", "ERROR: No name given.")
|
||||
}
|
||||
}
|
||||
}
|
||||
function openPopup() {
|
||||
pttNewProfileName.text = ""
|
||||
open()
|
||||
}
|
||||
}
|
||||
|
||||
content: ColumnLayout {
|
||||
spacing: 24
|
||||
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Playback Device: "
|
||||
Layout.preferredWidth: 260
|
||||
}
|
||||
MyComboBox {
|
||||
id: audioPlaybackNameCombo
|
||||
Layout.maximumWidth: 850
|
||||
Layout.minimumWidth: 850
|
||||
Layout.preferredWidth: 850
|
||||
onCurrentIndexChanged: {
|
||||
if (componentCompleted) {
|
||||
AudioTabController.setPlaybackDeviceIndex(currentIndex)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 18
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Mirror Device: "
|
||||
Layout.preferredWidth: 260
|
||||
}
|
||||
MyComboBox {
|
||||
id: audioMirrorNameCombo
|
||||
Layout.maximumWidth: 850
|
||||
Layout.minimumWidth: 850
|
||||
Layout.preferredWidth: 850
|
||||
onCurrentIndexChanged: {
|
||||
if (componentCompleted) {
|
||||
AudioTabController.setMirrorDeviceIndex(currentIndex - 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Mirror Volume:"
|
||||
Layout.preferredWidth: 260
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: audioMirrorVolumeMinusButton
|
||||
text: "-"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
audioMirrorVolumeSlider.value -= 0.1
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: audioMirrorVolumeSlider
|
||||
from: 0.0
|
||||
to: 1.0
|
||||
stepSize: 0.01
|
||||
value: 1.0
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.position * 100
|
||||
audioMirrorVolumeText.text = Math.round(val) + "%"
|
||||
}
|
||||
onValueChanged: {
|
||||
AudioTabController.setMirrorVolume(this.value.toFixed(2), false)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: audioMirrorVolumePlusButton
|
||||
text: "+"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
audioMirrorVolumeSlider.value += 0.1
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: audioMirrorVolumeText
|
||||
text: "100%"
|
||||
Layout.preferredWidth: 85
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: audioMirrorMuteToggle
|
||||
Layout.leftMargin: 12
|
||||
checkable: true
|
||||
contentItem: Image {
|
||||
source: parent.checked ? "speaker_off.svg" : "speaker_on.svg"
|
||||
sourceSize.width: 32
|
||||
sourceSize.height: 32
|
||||
anchors.fill: parent
|
||||
}
|
||||
onCheckedChanged: {
|
||||
AudioTabController.setMirrorMuted(checked, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 18
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Microphone: "
|
||||
Layout.preferredWidth: 260
|
||||
}
|
||||
MyComboBox {
|
||||
id: audioMicNameCombo
|
||||
Layout.maximumWidth: 850
|
||||
Layout.minimumWidth: 850
|
||||
Layout.preferredWidth: 850
|
||||
onCurrentIndexChanged: {
|
||||
if (componentCompleted) {
|
||||
AudioTabController.setMicDeviceIndex(currentIndex)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Microphone Volume:"
|
||||
Layout.preferredWidth: 260
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: audioMicVolumeMinusButton
|
||||
text: "-"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
audioMicVolumeSlider.value -= 0.1
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: audioMicVolumeSlider
|
||||
from: 0.0
|
||||
to: 1.0
|
||||
stepSize: 0.01
|
||||
value: 1.0
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.position * 100
|
||||
audioMicVolumeText.text = Math.round(val) + "%"
|
||||
}
|
||||
onValueChanged: {
|
||||
AudioTabController.setMicVolume(this.value.toFixed(2))
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: audioMicVolumePlusButton
|
||||
text: "+"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
audioMicVolumeSlider.value += 0.1
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: audioMicVolumeText
|
||||
text: "100%"
|
||||
Layout.preferredWidth: 85
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: audioMicMuteToggle
|
||||
Layout.leftMargin: 12
|
||||
checkable: true
|
||||
contentItem: Image {
|
||||
source: parent.checked ? "mic_off.svg" : "mic_on.svg"
|
||||
sourceSize.width: 32
|
||||
sourceSize.height: 32
|
||||
anchors.fill: parent
|
||||
}
|
||||
onCheckedChanged: {
|
||||
AudioTabController.setMicMuted(checked)
|
||||
}
|
||||
}
|
||||
}
|
||||
MyToggleButton {
|
||||
id: audioMuteProximitySensorToggle
|
||||
Layout.preferredWidth: 600
|
||||
text: "Proximity Sensor Mutes/Unmutes Microphone"
|
||||
onClicked: {
|
||||
AudioTabController.setMicProximitySensorCanMute(checked, false)
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyToggleButton {
|
||||
id: audioPttEnabledToggle
|
||||
Layout.preferredWidth: 260
|
||||
text: "Push-to-Talk:"
|
||||
onClicked: {
|
||||
AudioTabController.pttEnabled = checked
|
||||
}
|
||||
}
|
||||
MyToggleButton {
|
||||
id: audioPttLeftControllerToggle
|
||||
text: "Left Controller"
|
||||
onClicked: {
|
||||
AudioTabController.setPttLeftControllerEnabled(checked, false)
|
||||
}
|
||||
}
|
||||
MyPushButton {
|
||||
text: "Configure"
|
||||
onClicked: {
|
||||
pttControllerConfigDialog.openPopup(0)
|
||||
}
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
MyToggleButton {
|
||||
id: audioPttRightControllerToggle
|
||||
text: "Right Controller"
|
||||
onClicked: {
|
||||
AudioTabController.setPttRightControllerEnabled(checked, false)
|
||||
}
|
||||
}
|
||||
MyPushButton {
|
||||
text: "Configure"
|
||||
onClicked: {
|
||||
pttControllerConfigDialog.openPopup(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyToggleButton {
|
||||
id: audioPttShowNotificationToggle
|
||||
Layout.leftMargin: 265
|
||||
text: "Show notification in HMD."
|
||||
onCheckedChanged: {
|
||||
AudioTabController.setPttShowNotification(checked, false)
|
||||
}
|
||||
}
|
||||
MyToggleButton {
|
||||
id: audioPttReverseToggle
|
||||
Layout.leftMargin: 118
|
||||
text: "Push-to-Mute"
|
||||
onClicked: {
|
||||
AudioTabController.setMicReversePtt(checked, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
spacing: 18
|
||||
|
||||
MyText {
|
||||
Layout.leftMargin: 270
|
||||
text: "Profile:"
|
||||
}
|
||||
|
||||
MyComboBox {
|
||||
id: pttProfileComboBox
|
||||
Layout.fillWidth: true
|
||||
model: [""]
|
||||
onCurrentIndexChanged: {
|
||||
if (currentIndex > 0) {
|
||||
pttApplyProfileButton.enabled = true
|
||||
pttDeleteProfileButton.enabled = true
|
||||
} else {
|
||||
pttApplyProfileButton.enabled = false
|
||||
pttDeleteProfileButton.enabled = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: pttApplyProfileButton
|
||||
enabled: true
|
||||
Layout.preferredWidth: 200
|
||||
text: "Apply"
|
||||
onClicked: {
|
||||
if (pttProfileComboBox.currentIndex > 0) {
|
||||
AudioTabController.applyPttProfile(pttProfileComboBox.currentIndex - 1)
|
||||
pttProfileComboBox.currentIndex = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
spacing: 18
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
MyPushButton {
|
||||
id: pttDeleteProfileButton
|
||||
enabled: true
|
||||
Layout.preferredWidth: 200
|
||||
text: "Delete Profile"
|
||||
onClicked: {
|
||||
if (pttProfileComboBox.currentIndex > 0) {
|
||||
pttDeleteProfileDialog.profileIndex = pttProfileComboBox.currentIndex - 1
|
||||
pttDeleteProfileDialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
MyPushButton {
|
||||
Layout.preferredWidth: 200
|
||||
text: "New Profile"
|
||||
onClicked: {
|
||||
pttNewProfileDialog.openPopup()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
var devs1 = []
|
||||
var devs2 = ["<None>"]
|
||||
var playbackDeviceCount = AudioTabController.getPlaybackDeviceCount()
|
||||
for (var i = 0; i < playbackDeviceCount; i++) {
|
||||
var name = AudioTabController.getPlaybackDeviceName(i)
|
||||
devs1.push(name)
|
||||
devs2.push(name)
|
||||
}
|
||||
audioPlaybackNameCombo.model = devs1
|
||||
audioPlaybackNameCombo.currentIndex = AudioTabController.playbackDeviceIndex
|
||||
audioMirrorNameCombo.model = devs2
|
||||
if (AudioTabController.mirrorDeviceIndex < 0) {
|
||||
audioMirrorNameCombo.currentIndex = 0
|
||||
audioMirrorVolumeMinusButton.enabled = false
|
||||
audioMirrorVolumeSlider.enabled = false
|
||||
audioMirrorVolumePlusButton.enabled = false
|
||||
audioMirrorMuteToggle.enabled = false
|
||||
} else {
|
||||
audioMirrorVolumeMinusButton.enabled = true
|
||||
audioMirrorVolumeSlider.enabled = true
|
||||
audioMirrorVolumePlusButton.enabled = true
|
||||
audioMirrorMuteToggle.enabled = true
|
||||
audioMirrorVolumeSlider.value = AudioTabController.mirrorVolume
|
||||
audioMirrorMuteToggle.checked = AudioTabController.mirrorMuted
|
||||
audioMirrorNameCombo.currentIndex = AudioTabController.mirrorDeviceIndex + 1
|
||||
}
|
||||
var devs3 = []
|
||||
var micDeviceCount = AudioTabController.getRecordingDeviceCount()
|
||||
for (var i = 0; i < micDeviceCount; i++) {
|
||||
var name = AudioTabController.getRecordingDeviceName(i)
|
||||
devs3.push(name)
|
||||
}
|
||||
audioMicNameCombo.model = devs3
|
||||
if (AudioTabController.micDeviceIndex < 0) {
|
||||
audioMicNameCombo.currentIndex = 0
|
||||
audioMicVolumeMinusButton.enabled = false
|
||||
audioMicVolumeSlider.enabled = false
|
||||
audioMicVolumePlusButton.enabled = false
|
||||
audioMicMuteToggle.enabled = false
|
||||
audioMuteProximitySensorToggle.enabled = false
|
||||
} else {
|
||||
audioMicVolumeMinusButton.enabled = true
|
||||
audioMicVolumeSlider.enabled = true
|
||||
audioMicVolumePlusButton.enabled = true
|
||||
audioMicMuteToggle.enabled = true
|
||||
audioMuteProximitySensorToggle.enabled = true
|
||||
audioMicVolumeSlider.value = AudioTabController.micVolume
|
||||
audioMicMuteToggle.checked = AudioTabController.micMuted
|
||||
audioMuteProximitySensorToggle.checked = AudioTabController.micProximitySensorCanMute
|
||||
audioMicNameCombo.currentIndex = AudioTabController.micDeviceIndex
|
||||
}
|
||||
reloadPttProfiles()
|
||||
audioPttEnabledToggle.checked = AudioTabController.pttEnabled
|
||||
audioPttLeftControllerToggle.checked = AudioTabController.pttLeftControllerEnabled
|
||||
audioPttRightControllerToggle.checked = AudioTabController.pttRightControllerEnabled
|
||||
audioPttShowNotificationToggle.checked = AudioTabController.pttShowNotification
|
||||
audioPttReverseToggle.checked = AudioTabController.micReversePtt
|
||||
componentCompleted = true
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: AudioTabController
|
||||
onPlaybackDeviceIndexChanged: {
|
||||
audioPlaybackNameCombo.currentIndex = index
|
||||
}
|
||||
onMirrorDeviceIndexChanged: {
|
||||
if (index < 0) {
|
||||
audioMirrorNameCombo.currentIndex = 0
|
||||
audioMirrorVolumeMinusButton.enabled = false
|
||||
audioMirrorVolumeSlider.enabled = false
|
||||
audioMirrorVolumePlusButton.enabled = false
|
||||
audioMirrorMuteToggle.enabled = false
|
||||
} else {
|
||||
audioMirrorVolumeMinusButton.enabled = true
|
||||
audioMirrorVolumeSlider.enabled = true
|
||||
audioMirrorVolumePlusButton.enabled = true
|
||||
audioMirrorMuteToggle.enabled = true
|
||||
audioMirrorNameCombo.currentIndex = index + 1
|
||||
}
|
||||
}
|
||||
onMirrorVolumeChanged: {
|
||||
audioMirrorVolumeSlider.value = AudioTabController.mirrorVolume
|
||||
}
|
||||
onMirrorMutedChanged: {
|
||||
audioMirrorMuteToggle.checked = AudioTabController.mirrorMuted
|
||||
}
|
||||
onMicDeviceIndexChanged: {
|
||||
if (index < 0) {
|
||||
audioMicNameCombo.currentIndex = 0
|
||||
audioMicVolumeMinusButton.enabled = false
|
||||
audioMicVolumeSlider.enabled = false
|
||||
audioMicVolumePlusButton.enabled = false
|
||||
audioMicMuteToggle.enabled = false
|
||||
} else {
|
||||
audioMicVolumeMinusButton.enabled = true
|
||||
audioMicVolumeSlider.enabled = true
|
||||
audioMicVolumePlusButton.enabled = true
|
||||
audioMicMuteToggle.enabled = true
|
||||
audioMicNameCombo.currentIndex = index
|
||||
}
|
||||
}
|
||||
onMicVolumeChanged: {
|
||||
audioMicVolumeSlider.value = AudioTabController.micVolume
|
||||
}
|
||||
onMicMutedChanged: {
|
||||
audioMicMuteToggle.checked = AudioTabController.micMuted
|
||||
}
|
||||
onMicProximitySensorCanMuteChanged: {
|
||||
audioMuteProximitySensorToggle.checked = AudioTabController.micProximitySensorCanMute
|
||||
}
|
||||
onMicReversePttChanged: {
|
||||
audioPttReverseToggle.checked = AudioTabController.micReversePtt
|
||||
}
|
||||
onPttEnabledChanged: {
|
||||
audioPttEnabledToggle.checked = AudioTabController.pttEnabled
|
||||
}
|
||||
onPttActiveChanged: {
|
||||
|
||||
}
|
||||
onPttShowNotificationChanged: {
|
||||
audioPttShowNotificationToggle.checked = AudioTabController.pttShowNotification
|
||||
}
|
||||
onPttLeftControllerEnabledChanged: {
|
||||
audioPttLeftControllerToggle.checked = AudioTabController.pttLeftControllerEnabled
|
||||
}
|
||||
onPttRightControllerEnabledChanged: {
|
||||
audioPttRightControllerToggle.checked = AudioTabController.pttRightControllerEnabled
|
||||
}
|
||||
onPttProfilesUpdated: {
|
||||
reloadPttProfiles()
|
||||
}
|
||||
onPlaybackDeviceListChanged: {
|
||||
var devs1 = []
|
||||
var devs2 = ["<None>"]
|
||||
var playbackDeviceCount = AudioTabController.getPlaybackDeviceCount()
|
||||
for (var i = 0; i < playbackDeviceCount; i++) {
|
||||
var name = AudioTabController.getPlaybackDeviceName(i)
|
||||
devs1.push(name)
|
||||
devs2.push(name)
|
||||
}
|
||||
audioPlaybackNameCombo.model = devs1
|
||||
audioPlaybackNameCombo.currentIndex = AudioTabController.playbackDeviceIndex
|
||||
audioMirrorNameCombo.model = devs2
|
||||
if (AudioTabController.mirrorDeviceIndex < 0) {
|
||||
audioMirrorNameCombo.currentIndex = 0
|
||||
audioMirrorVolumeMinusButton.enabled = false
|
||||
audioMirrorVolumeSlider.enabled = false
|
||||
audioMirrorVolumePlusButton.enabled = false
|
||||
audioMirrorMuteToggle.enabled = false
|
||||
} else {
|
||||
audioMirrorVolumeMinusButton.enabled = true
|
||||
audioMirrorVolumeSlider.enabled = true
|
||||
audioMirrorVolumePlusButton.enabled = true
|
||||
audioMirrorMuteToggle.enabled = true
|
||||
audioMirrorVolumeSlider.value = AudioTabController.mirrorVolume
|
||||
audioMirrorMuteToggle.checked = AudioTabController.mirrorMuted
|
||||
audioMirrorNameCombo.currentIndex = AudioTabController.mirrorDeviceIndex + 1
|
||||
}
|
||||
}
|
||||
onRecordingDeviceListChanged: {
|
||||
var devs3 = []
|
||||
var micDeviceCount = AudioTabController.getRecordingDeviceCount()
|
||||
for (var i = 0; i < micDeviceCount; i++) {
|
||||
var name = AudioTabController.getRecordingDeviceName(i)
|
||||
devs3.push(name)
|
||||
}
|
||||
audioMicNameCombo.model = devs3
|
||||
if (AudioTabController.micDeviceIndex < 0) {
|
||||
audioMicNameCombo.currentIndex = 0
|
||||
audioMicVolumeMinusButton.enabled = false
|
||||
audioMicVolumeSlider.enabled = false
|
||||
audioMicVolumePlusButton.enabled = false
|
||||
audioMicMuteToggle.enabled = false
|
||||
} else {
|
||||
audioMicVolumeMinusButton.enabled = true
|
||||
audioMicVolumeSlider.enabled = true
|
||||
audioMicVolumePlusButton.enabled = true
|
||||
audioMicMuteToggle.enabled = true
|
||||
audioMicVolumeSlider.value = AudioTabController.micVolume
|
||||
audioMicMuteToggle.checked = AudioTabController.micMuted
|
||||
audioMicNameCombo.currentIndex = AudioTabController.micDeviceIndex
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function reloadPttProfiles() {
|
||||
var profiles = [""]
|
||||
var profileCount = AudioTabController.getPttProfileCount()
|
||||
for (var i = 0; i < profileCount; i++) {
|
||||
profiles.push(AudioTabController.getPttProfileName(i))
|
||||
}
|
||||
pttProfileComboBox.currentIndex = 0
|
||||
pttProfileComboBox.model = profiles
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,565 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQuick.Dialogs 1.2
|
||||
import matzman666.advsettings 1.0
|
||||
import "." // QTBUG-34418, singletons require explicit import to load qmldir file
|
||||
|
||||
MyStackViewPage {
|
||||
headerText: "Chaperone Settings"
|
||||
|
||||
MyDialogOkPopup {
|
||||
id: chaperoneMessageDialog
|
||||
function showMessage(title, text) {
|
||||
dialogTitle = title
|
||||
dialogText = text
|
||||
open()
|
||||
}
|
||||
}
|
||||
|
||||
MyDialogOkCancelPopup {
|
||||
id: chaperoneDeleteProfileDialog
|
||||
property int profileIndex: -1
|
||||
dialogTitle: "Delete Profile"
|
||||
dialogText: "Do you really want to delete this profile?"
|
||||
onClosed: {
|
||||
if (okClicked) {
|
||||
ChaperoneTabController.deleteChaperoneProfile(profileIndex)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyDialogOkCancelPopup {
|
||||
id: chaperoneNewProfileDialog
|
||||
dialogTitle: "Create New Profile"
|
||||
dialogWidth: 800
|
||||
dialogHeight: 780
|
||||
dialogContentItem: ColumnLayout {
|
||||
RowLayout {
|
||||
Layout.topMargin: 16
|
||||
Layout.leftMargin: 16
|
||||
Layout.rightMargin: 16
|
||||
MyText {
|
||||
text: "Name: "
|
||||
}
|
||||
MyTextField {
|
||||
id: chaperoneNewProfileName
|
||||
keyBoardUID: 390
|
||||
color: "#cccccc"
|
||||
text: ""
|
||||
Layout.fillWidth: true
|
||||
font.pointSize: 20
|
||||
function onInputEvent(input) {
|
||||
chaperoneNewProfileName.text = input
|
||||
}
|
||||
}
|
||||
}
|
||||
MyText {
|
||||
Layout.topMargin: 24
|
||||
text: "What to include:"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: chaperoneNewProfileIncludeGeometry
|
||||
Layout.leftMargin: 32
|
||||
text: "Chaperone Geometry"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: chaperoneNewProfileIncludeStyle
|
||||
Layout.leftMargin: 32
|
||||
text: "Chaperone Style"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: chaperoneNewProfileIncludeBoundsColor
|
||||
Layout.leftMargin: 32
|
||||
text: "Chaperone Color"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: chaperoneNewProfileIncludeVisibility
|
||||
Layout.leftMargin: 32
|
||||
text: "Visibility Setting"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: chaperoneNewProfileIncludeFadeDistance
|
||||
Layout.leftMargin: 32
|
||||
text: "Fade Distance Setting"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: chaperoneNewProfileIncludeCenterMarker
|
||||
Layout.leftMargin: 32
|
||||
text: "Center Marker Setting"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: chaperoneNewProfileIncludePlaySpaceMarker
|
||||
Layout.leftMargin: 32
|
||||
text: "Play Space Marker Setting"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: chaperoneNewProfileIncludeFloorBoundsMarker
|
||||
Layout.leftMargin: 32
|
||||
text: "Floor Bounds Always On Setting"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: chaperoneNewProfileIncludeForceBounds
|
||||
Layout.leftMargin: 32
|
||||
text: "Force Bounds Setting"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: chaperoneNewProfileIncludeProximityWarnings
|
||||
Layout.leftMargin: 32
|
||||
text: "Proximity Warning Settings"
|
||||
}
|
||||
}
|
||||
onClosed: {
|
||||
if (okClicked) {
|
||||
if (chaperoneNewProfileName.text == "") {
|
||||
chaperoneMessageDialog.showMessage("Create New Profile", "ERROR: Empty profile name.")
|
||||
} else if (!chaperoneNewProfileIncludeGeometry.checked
|
||||
&& !chaperoneNewProfileIncludeVisibility.checked
|
||||
&& !chaperoneNewProfileIncludeFadeDistance.checked
|
||||
&& !chaperoneNewProfileIncludeCenterMarker.checked
|
||||
&& !chaperoneNewProfileIncludePlaySpaceMarker.checked
|
||||
&& !chaperoneNewProfileIncludeFloorBoundsMarker.checked
|
||||
&& !chaperoneNewProfileIncludeBoundsColor.checked
|
||||
&& !chaperoneNewProfileIncludeStyle.checked
|
||||
&& !chaperoneNewProfileIncludeForceBounds.checked
|
||||
&& !chaperoneNewProfileIncludeProximityWarnings.checked) {
|
||||
chaperoneMessageDialog.showMessage("Create New Profile", "ERROR: Nothing included.")
|
||||
} else {
|
||||
ChaperoneTabController.addChaperoneProfile(chaperoneNewProfileName.text,
|
||||
chaperoneNewProfileIncludeGeometry.checked,
|
||||
chaperoneNewProfileIncludeVisibility.checked,
|
||||
chaperoneNewProfileIncludeFadeDistance.checked,
|
||||
chaperoneNewProfileIncludeCenterMarker.checked,
|
||||
chaperoneNewProfileIncludePlaySpaceMarker.checked,
|
||||
chaperoneNewProfileIncludeFloorBoundsMarker.checked,
|
||||
chaperoneNewProfileIncludeBoundsColor.checked,
|
||||
chaperoneNewProfileIncludeStyle.checked,
|
||||
chaperoneNewProfileIncludeForceBounds.checked,
|
||||
chaperoneNewProfileIncludeProximityWarnings.checked)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
function openPopup() {
|
||||
chaperoneNewProfileName.text = ""
|
||||
chaperoneNewProfileIncludeGeometry.checked = false
|
||||
chaperoneNewProfileIncludeVisibility.checked = false
|
||||
chaperoneNewProfileIncludeFadeDistance.checked = false
|
||||
chaperoneNewProfileIncludeCenterMarker.checked = false
|
||||
chaperoneNewProfileIncludePlaySpaceMarker.checked = false
|
||||
chaperoneNewProfileIncludeFloorBoundsMarker.checked = false
|
||||
chaperoneNewProfileIncludeBoundsColor.checked = false
|
||||
chaperoneNewProfileIncludeStyle.checked = false
|
||||
chaperoneNewProfileIncludeForceBounds.checked = false
|
||||
chaperoneNewProfileIncludeProximityWarnings.checked = false
|
||||
open()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
content: ColumnLayout {
|
||||
spacing: 18
|
||||
|
||||
ColumnLayout {
|
||||
Layout.bottomMargin: 32
|
||||
spacing: 18
|
||||
RowLayout {
|
||||
spacing: 18
|
||||
|
||||
MyText {
|
||||
text: "Profile:"
|
||||
}
|
||||
|
||||
MyComboBox {
|
||||
id: chaperoneProfileComboBox
|
||||
Layout.maximumWidth: 799
|
||||
Layout.minimumWidth: 799
|
||||
Layout.preferredWidth: 799
|
||||
Layout.fillWidth: true
|
||||
model: [""]
|
||||
onCurrentIndexChanged: {
|
||||
if (currentIndex > 0) {
|
||||
chaperoneApplyProfileButton.enabled = true
|
||||
chaperoneDeleteProfileButton.enabled = true
|
||||
} else {
|
||||
chaperoneApplyProfileButton.enabled = false
|
||||
chaperoneDeleteProfileButton.enabled = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: chaperoneApplyProfileButton
|
||||
enabled: false
|
||||
Layout.preferredWidth: 200
|
||||
text: "Apply"
|
||||
onClicked: {
|
||||
if (chaperoneProfileComboBox.currentIndex > 0) {
|
||||
ChaperoneTabController.applyChaperoneProfile(chaperoneProfileComboBox.currentIndex - 1)
|
||||
chaperoneProfileComboBox.currentIndex = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
spacing: 18
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
MyPushButton {
|
||||
id: chaperoneDeleteProfileButton
|
||||
enabled: false
|
||||
Layout.preferredWidth: 200
|
||||
text: "Delete Profile"
|
||||
onClicked: {
|
||||
if (chaperoneProfileComboBox.currentIndex > 0) {
|
||||
chaperoneDeleteProfileDialog.profileIndex = chaperoneProfileComboBox.currentIndex - 1
|
||||
chaperoneDeleteProfileDialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
MyPushButton {
|
||||
Layout.preferredWidth: 200
|
||||
text: "New Profile"
|
||||
onClicked: {
|
||||
chaperoneNewProfileDialog.openPopup()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GridLayout {
|
||||
columns: 5
|
||||
|
||||
MyText {
|
||||
text: "Visibility:"
|
||||
Layout.rightMargin: 12
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "-"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
chaperoneVisibilitySlider.value -= 0.1
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: chaperoneVisibilitySlider
|
||||
from: 0.0
|
||||
to: 1.0
|
||||
stepSize: 0.01
|
||||
value: 0.6
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.position * 100
|
||||
chaperoneVisibilityText.text = Math.round(val) + "%"
|
||||
}
|
||||
onValueChanged: {
|
||||
ChaperoneTabController.setBoundsVisibility(value.toFixed(2), false)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "+"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
chaperoneVisibilitySlider.value += 0.1
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MyTextField {
|
||||
id: chaperoneVisibilityText
|
||||
text: "0.00"
|
||||
keyBoardUID: 301
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val < 0.0) {
|
||||
val = 0.0
|
||||
} else if (val > 100.0) {
|
||||
val = 100.0
|
||||
}
|
||||
var v = (val/100).toFixed(2)
|
||||
if (v <= chaperoneVisibilitySlider.to) {
|
||||
chaperoneVisibilitySlider.value = v
|
||||
} else {
|
||||
ChaperoneTabController.setBoundsVisibility(v, false)
|
||||
}
|
||||
}
|
||||
text = Math.round(ChaperoneTabController.boundsVisibility * 100) + "%"
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Fade Distance:"
|
||||
Layout.rightMargin: 12
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "-"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
chaperoneFadeDistanceSlider.decrease()
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: chaperoneFadeDistanceSlider
|
||||
from: 0.0
|
||||
to: 2.0
|
||||
stepSize: 0.1
|
||||
value: 0.7
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
chaperoneFadeDistanceText.text = val.toFixed(1)
|
||||
}
|
||||
onValueChanged: {
|
||||
ChaperoneTabController.setFadeDistance(this.value.toFixed(1), false)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "+"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
chaperoneFadeDistanceSlider.increase()
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: chaperoneFadeDistanceText
|
||||
text: "0.00"
|
||||
keyBoardUID: 302
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val < 0.0) {
|
||||
val = 0.0
|
||||
}
|
||||
var v = val.toFixed(1)
|
||||
if (v <= chaperoneFadeDistanceSlider.to) {
|
||||
chaperoneFadeDistanceSlider.value = v
|
||||
} else {
|
||||
ChaperoneTabController.setFadeDistance(v, false)
|
||||
}
|
||||
}
|
||||
text = ChaperoneTabController.fadeDistance.toFixed(1)
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Height:"
|
||||
Layout.rightMargin: 12
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "-"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
chaperoneHeightSlider.decrease()
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: chaperoneHeightSlider
|
||||
from: 0.01
|
||||
to: 15.0
|
||||
stepSize: 0.01
|
||||
value: 2.0
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = (this.from + ( this.position * (this.to - this.from))).toFixed(2)
|
||||
if (activeFocus) {
|
||||
ChaperoneTabController.setHeight(val, false);
|
||||
}
|
||||
chaperoneHeightText.text = val
|
||||
}
|
||||
onValueChanged: {
|
||||
ChaperoneTabController.setHeight(value.toFixed(2), false)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "+"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
chaperoneHeightSlider.increase()
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: chaperoneHeightText
|
||||
text: "0.00"
|
||||
keyBoardUID: 303
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val < 0.01) {
|
||||
val = 0.01
|
||||
}
|
||||
var v = val.toFixed(2)
|
||||
if (v <= chaperoneHeightSlider.to) {
|
||||
chaperoneHeightSlider.value = v
|
||||
} else {
|
||||
ChaperoneTabController.setHeight(v, false)
|
||||
}
|
||||
}
|
||||
text = ChaperoneTabController.height.toFixed(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: 32
|
||||
|
||||
MyToggleButton {
|
||||
id: chaperoneCenterMarkerToggle
|
||||
text: "Center Marker"
|
||||
Layout.fillWidth: false
|
||||
onCheckedChanged: {
|
||||
ChaperoneTabController.setCenterMarker(this.checked, false)
|
||||
}
|
||||
}
|
||||
|
||||
MyToggleButton {
|
||||
id: chaperonePlaySpaceToggle
|
||||
text: "Play Space"
|
||||
onCheckedChanged: {
|
||||
ChaperoneTabController.setPlaySpaceMarker(this.checked, false)
|
||||
}
|
||||
}
|
||||
|
||||
MyToggleButton {
|
||||
id: chaperoneForceBoundsToggle
|
||||
text: "Force Bounds"
|
||||
onCheckedChanged: {
|
||||
ChaperoneTabController.setForceBounds(this.checked, false)
|
||||
}
|
||||
}
|
||||
|
||||
Item { Layout.fillWidth: true }
|
||||
|
||||
MyPushButton {
|
||||
id: chaperoneWarningsConfigButton
|
||||
text: "Proximity Warning Settings"
|
||||
Layout.preferredWidth: 350
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(chaperoneWarningsPage)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: chaperoneFlipOrientationButton
|
||||
text: "Flip Orientation"
|
||||
Layout.preferredWidth: 250
|
||||
onClicked: {
|
||||
ChaperoneTabController.flipOrientation()
|
||||
}
|
||||
}
|
||||
|
||||
Item { Layout.fillHeight: true; Layout.fillWidth: true}
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
|
||||
MyPushButton {
|
||||
id: chaperoneResetButton
|
||||
text: "Reset"
|
||||
Layout.preferredWidth: 250
|
||||
onClicked: {
|
||||
ChaperoneTabController.reset()
|
||||
}
|
||||
}
|
||||
|
||||
Item { Layout.fillWidth: true}
|
||||
|
||||
MyPushButton {
|
||||
id: chaperoneReloadFromDiskButton
|
||||
text: "Reload from Disk"
|
||||
Layout.preferredWidth: 250
|
||||
onClicked: {
|
||||
ChaperoneTabController.reloadFromDisk()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
chaperoneVisibilitySlider.value = ChaperoneTabController.boundsVisibility
|
||||
var d = ChaperoneTabController.fadeDistance.toFixed(1)
|
||||
if (d <= chaperoneFadeDistanceSlider.to) {
|
||||
chaperoneFadeDistanceSlider.value = d
|
||||
}
|
||||
chaperoneFadeDistanceText.text = d
|
||||
var h = ChaperoneTabController.height.toFixed(2)
|
||||
if (h <= chaperoneHeightSlider.to) {
|
||||
chaperoneHeightSlider.value = h
|
||||
}
|
||||
chaperoneHeightText.text = h
|
||||
chaperoneCenterMarkerToggle.checked = ChaperoneTabController.centerMarker
|
||||
chaperonePlaySpaceToggle.checked = ChaperoneTabController.playSpaceMarker
|
||||
chaperoneForceBoundsToggle.checked = ChaperoneTabController.forceBounds
|
||||
reloadChaperoneProfiles()
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: ChaperoneTabController
|
||||
onBoundsVisibilityChanged: {
|
||||
if (Math.abs(chaperoneVisibilitySlider.value - ChaperoneTabController.boundsVisibility) > 0.008) {
|
||||
chaperoneVisibilitySlider.value = ChaperoneTabController.boundsVisibility
|
||||
}
|
||||
}
|
||||
onFadeDistanceChanged: {
|
||||
var d = ChaperoneTabController.fadeDistance.toFixed(1)
|
||||
if (d <= chaperoneFadeDistanceSlider.to && Math.abs(chaperoneFadeDistanceSlider.value - d) > 0.008) {
|
||||
chaperoneFadeDistanceSlider.value = d
|
||||
}
|
||||
chaperoneFadeDistanceText.text = d
|
||||
}
|
||||
onHeightChanged: {
|
||||
var h = ChaperoneTabController.height.toFixed(2)
|
||||
if (h <= chaperoneHeightSlider.to && Math.abs(chaperoneHeightSlider.value - h) > 0.008) {
|
||||
chaperoneHeightSlider.value = h
|
||||
}
|
||||
chaperoneHeightText.text = h
|
||||
}
|
||||
|
||||
onCenterMarkerChanged: {
|
||||
chaperoneCenterMarkerToggle.checked = ChaperoneTabController.centerMarker
|
||||
}
|
||||
onPlaySpaceMarkerChanged: {
|
||||
chaperonePlaySpaceToggle.checked = ChaperoneTabController.playSpaceMarker
|
||||
}
|
||||
onForceBoundsChanged: {
|
||||
chaperoneForceBoundsToggle.checked = ChaperoneTabController.forceBounds
|
||||
}
|
||||
onChaperoneProfilesUpdated: {
|
||||
reloadChaperoneProfiles()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function reloadChaperoneProfiles() {
|
||||
var profiles = [""]
|
||||
var profileCount = ChaperoneTabController.getChaperoneProfileCount()
|
||||
for (var i = 0; i < profileCount; i++) {
|
||||
profiles.push(ChaperoneTabController.getChaperoneProfileName(i))
|
||||
}
|
||||
chaperoneProfileComboBox.currentIndex = 0
|
||||
chaperoneProfileComboBox.model = profiles
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,567 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import QtQuick.Dialogs 1.2
|
||||
import matzman666.advsettings 1.0
|
||||
import "." // QTBUG-34418, singletons require explicit import to load qmldir file
|
||||
|
||||
MyStackViewPage {
|
||||
headerText: "Chaperone Proximity Warning Settings"
|
||||
|
||||
ColorDialog {
|
||||
id: colorDialog
|
||||
title: "Please choose a color"
|
||||
onAccepted: {
|
||||
console.log("You chose: " + colorDialog.color)
|
||||
Qt.quit()
|
||||
}
|
||||
onRejected: {
|
||||
console.log("Canceled")
|
||||
Qt.quit()
|
||||
}
|
||||
}
|
||||
|
||||
content: ColumnLayout {
|
||||
spacing: 36
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 0
|
||||
MyToggleButton {
|
||||
id: switchBeginnerToggle
|
||||
text: "Switch to Beginner Mode"
|
||||
onCheckedChanged: {
|
||||
ChaperoneTabController.chaperoneSwitchToBeginnerEnabled = checked
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Activation Distance: "
|
||||
Layout.preferredWidth: 250
|
||||
}
|
||||
MyPushButton2 {
|
||||
id: switchBeginnerDistanceMinusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
var val = ChaperoneTabController.chaperoneSwitchToBeginnerDistance - 0.1
|
||||
if (val <= 0) {
|
||||
val = 0.1;
|
||||
}
|
||||
ChaperoneTabController.chaperoneSwitchToBeginnerDistance = val.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: switchBeginnerDistanceSlider
|
||||
from: 0
|
||||
to: 2.0
|
||||
stepSize: 0.01
|
||||
value: 0.5
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
switchBeginnerDistanceText.text = val.toFixed(2)
|
||||
}
|
||||
onValueChanged: {
|
||||
var val = switchBeginnerDistanceSlider.value.toFixed(2)
|
||||
if (val < 0.01) {
|
||||
val = 0.01
|
||||
}
|
||||
ChaperoneTabController.chaperoneSwitchToBeginnerDistance = val
|
||||
switchBeginnerDistanceText.text = val
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: switchBeginnerDistancePlusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
var val = ChaperoneTabController.chaperoneSwitchToBeginnerDistance + 0.1
|
||||
if (val > 2.0) {
|
||||
val = 2.0;
|
||||
}
|
||||
ChaperoneTabController.chaperoneSwitchToBeginnerDistance = val.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: switchBeginnerDistanceText
|
||||
text: "0.00"
|
||||
keyBoardUID: 801
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val <= 0.0) {
|
||||
val = 0.01
|
||||
}
|
||||
val = val.toFixed(2)
|
||||
ChaperoneTabController.chaperoneSwitchToBeginnerDistance = val
|
||||
text = val
|
||||
} else {
|
||||
text = ChaperoneTabController.chaperoneSwitchToBeginnerDistance.toFixed(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 0
|
||||
MyToggleButton {
|
||||
id: hapticFeedbackToggle
|
||||
text: "Trigger Haptic Feedback"
|
||||
onCheckedChanged: {
|
||||
ChaperoneTabController.chaperoneHapticFeedbackEnabled = checked
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Activation Distance: "
|
||||
Layout.preferredWidth: 250
|
||||
}
|
||||
MyPushButton2 {
|
||||
id: hapticFeedbackDistanceMinusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
var val = ChaperoneTabController.chaperoneHapticFeedbackDistance - 0.1
|
||||
if (val <= 0) {
|
||||
val = 0.1;
|
||||
}
|
||||
ChaperoneTabController.chaperoneHapticFeedbackDistance = val.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: hapticFeedbackDistanceSlider
|
||||
from: 0
|
||||
to: 2.0
|
||||
stepSize: 0.01
|
||||
value: 0.5
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
hapticFeedbackDistanceText.text = val.toFixed(2)
|
||||
}
|
||||
onValueChanged: {
|
||||
var val = hapticFeedbackDistanceSlider.value.toFixed(2)
|
||||
if (val < 0.01) {
|
||||
val = 0.01
|
||||
}
|
||||
ChaperoneTabController.chaperoneHapticFeedbackDistance = val
|
||||
hapticFeedbackDistanceText.text = val
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: hapticFeedbackDistancePlusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
var val = ChaperoneTabController.chaperoneHapticFeedbackDistance + 0.1
|
||||
if (val > 2.0) {
|
||||
val = 2.0;
|
||||
}
|
||||
ChaperoneTabController.chaperoneHapticFeedbackDistance = val.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: hapticFeedbackDistanceText
|
||||
text: "0.00"
|
||||
keyBoardUID: 805
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val <= 0.0) {
|
||||
val = 0.01
|
||||
}
|
||||
val = val.toFixed(2)
|
||||
ChaperoneTabController.chaperoneHapticFeedbackDistance = val
|
||||
text = val
|
||||
} else {
|
||||
text = ChaperoneTabController.chaperoneHapticFeedbackDistance.toFixed(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 0
|
||||
RowLayout {
|
||||
spacing: 32
|
||||
MyToggleButton {
|
||||
id: audioWarningToggle
|
||||
text: "Audio Warning"
|
||||
onCheckedChanged: {
|
||||
ChaperoneTabController.chaperoneAlarmSoundEnabled = checked
|
||||
}
|
||||
}
|
||||
MyToggleButton {
|
||||
id: audioWarningLoopingToggle
|
||||
text: "Loop Audio"
|
||||
onCheckedChanged: {
|
||||
ChaperoneTabController.chaperoneAlarmSoundLooping = checked
|
||||
audioWarningAdjustVolumeToggle.enabled = checked
|
||||
}
|
||||
}
|
||||
MyToggleButton {
|
||||
id: audioWarningAdjustVolumeToggle
|
||||
text: "Adjust Volume"
|
||||
enabled: false
|
||||
onCheckedChanged: {
|
||||
ChaperoneTabController.chaperoneAlarmSoundAdjustVolume = checked
|
||||
}
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Activation Distance: "
|
||||
Layout.preferredWidth: 250
|
||||
}
|
||||
MyPushButton2 {
|
||||
id: audioWarningDistanceMinusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
var val = ChaperoneTabController.chaperoneAlarmSoundDistance - 0.1
|
||||
if (val <= 0.0) {
|
||||
val = 0.01;
|
||||
}
|
||||
ChaperoneTabController.chaperoneAlarmSoundDistance = val.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: audioWarningDistanceSlider
|
||||
from: 0
|
||||
to: 2.0
|
||||
stepSize: 0.01
|
||||
value: 0.5
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
audioWarningDistanceText.text = val.toFixed(2)
|
||||
}
|
||||
onValueChanged: {
|
||||
var val = audioWarningDistanceSlider.value.toFixed(2)
|
||||
if (val < 0.01) {
|
||||
val = 0.01
|
||||
}
|
||||
ChaperoneTabController.chaperoneAlarmSoundDistance = val
|
||||
audioWarningDistanceText.text = val
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: audioWarningDistancePlusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
var val = ChaperoneTabController.chaperoneAlarmSoundDistance + 0.1
|
||||
if (val > 2.0) {
|
||||
val = 2.0;
|
||||
}
|
||||
ChaperoneTabController.chaperoneAlarmSoundDistance = val.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: audioWarningDistanceText
|
||||
text: "0.00"
|
||||
keyBoardUID: 802
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val <= 0.0) {
|
||||
val = 0.01
|
||||
}
|
||||
val = val.toFixed(2)
|
||||
ChaperoneTabController.chaperoneAlarmSoundDistance = val
|
||||
text = val
|
||||
} else {
|
||||
text = ChaperoneTabController.chaperoneAlarmSoundDistance.toFixed(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 0
|
||||
MyToggleButton {
|
||||
id: openDashboardToggle
|
||||
text: "Open Dashboard"
|
||||
onCheckedChanged: {
|
||||
ChaperoneTabController.chaperoneShowDashboardEnabled = checked
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Activation Distance: "
|
||||
Layout.preferredWidth: 250
|
||||
}
|
||||
MyPushButton2 {
|
||||
id: openDashboardDistanceMinusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
var val = ChaperoneTabController.chaperoneShowDashboardDistance - 0.1
|
||||
if (val <= 0.0) {
|
||||
val = 0.01;
|
||||
}
|
||||
ChaperoneTabController.chaperoneShowDashboardDistance = val.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: openDashboardDistanceSlider
|
||||
from: 0
|
||||
to: 2.0
|
||||
stepSize: 0.01
|
||||
value: 0.5
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
openDashboardDistanceText.text = val.toFixed(2)
|
||||
}
|
||||
onValueChanged: {
|
||||
var val = openDashboardDistanceSlider.value.toFixed(2)
|
||||
if (val < 0.01) {
|
||||
val = 0.01
|
||||
}
|
||||
ChaperoneTabController.chaperoneShowDashboardDistance = val
|
||||
openDashboardDistanceText.text = val
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: openDashboardDistancePlusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
var val = ChaperoneTabController.chaperoneShowDashboardDistance + 0.1
|
||||
if (val > 2.0) {
|
||||
val = 2.0;
|
||||
}
|
||||
ChaperoneTabController.chaperoneShowDashboardDistance = val.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: openDashboardDistanceText
|
||||
text: "0.00"
|
||||
keyBoardUID: 803
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val <= 0.0) {
|
||||
val = 0.01
|
||||
}
|
||||
val = val.toFixed(2)
|
||||
ChaperoneTabController.chaperoneShowDashboardDistance = val
|
||||
text = val
|
||||
} else {
|
||||
text = ChaperoneTabController.chaperoneShowDashboardDistance.toFixed(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ColumnLayout {
|
||||
spacing: 0
|
||||
MyToggleButton {
|
||||
id: velModifierToggle
|
||||
text: "Velocity Dependent Fade/Activation Distance"
|
||||
onCheckedChanged: {
|
||||
ChaperoneTabController.chaperoneVelocityModifierEnabled = checked
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Distance Modifier: "
|
||||
Layout.preferredWidth: 250
|
||||
}
|
||||
MyPushButton2 {
|
||||
id: velModifierMinusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
var val = ChaperoneTabController.chaperoneVelocityModifier - 0.01
|
||||
if (val < 0.0) {
|
||||
val = 0.0;
|
||||
}
|
||||
ChaperoneTabController.chaperoneVelocityModifier = val.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: velModifierSlider
|
||||
from: 0
|
||||
to: 1.0
|
||||
stepSize: 0.01
|
||||
value: 0.3
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
velModifierText.text = val.toFixed(2)
|
||||
}
|
||||
onValueChanged: {
|
||||
var val = velModifierSlider.value.toFixed(2)
|
||||
if (val < 0.0) {
|
||||
val = 0.0
|
||||
}
|
||||
ChaperoneTabController.chaperoneVelocityModifier = val
|
||||
velModifierText.text = val
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: velModifierPlusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
var val = ChaperoneTabController.chaperoneVelocityModifier + 0.01
|
||||
if (val > 1.0) {
|
||||
val = 1.0;
|
||||
}
|
||||
ChaperoneTabController.chaperoneVelocityModifier = val.toFixed(2)
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: velModifierText
|
||||
text: "0.00"
|
||||
keyBoardUID: 803
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val < 0.0) {
|
||||
val = 0.0
|
||||
}
|
||||
val = val.toFixed(2)
|
||||
ChaperoneTabController.chaperoneVelocityModifier = val
|
||||
text = val
|
||||
} else {
|
||||
text = ChaperoneTabController.chaperoneVelocityModifier.toFixed(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Item { Layout.fillHeight: true; Layout.fillWidth: true }
|
||||
|
||||
Component.onCompleted: {
|
||||
switchBeginnerToggle.checked = ChaperoneTabController.chaperoneSwitchToBeginnerEnabled
|
||||
var d = ChaperoneTabController.chaperoneSwitchToBeginnerDistance.toFixed(2)
|
||||
if (d <= switchBeginnerDistanceSlider.to) {
|
||||
switchBeginnerDistanceSlider.value = d
|
||||
}
|
||||
switchBeginnerDistanceText.text = d
|
||||
hapticFeedbackToggle.checked = ChaperoneTabController.chaperoneHapticFeedbackEnabled
|
||||
var d = ChaperoneTabController.chaperoneHapticFeedbackDistance.toFixed(2)
|
||||
if (d <= hapticFeedbackDistanceSlider.to) {
|
||||
hapticFeedbackDistanceSlider.value = d
|
||||
}
|
||||
hapticFeedbackDistanceText.text = d
|
||||
audioWarningToggle.checked = ChaperoneTabController.chaperoneAlarmSoundEnabled
|
||||
audioWarningLoopingToggle.checked = ChaperoneTabController.chaperoneAlarmSoundLooping
|
||||
audioWarningAdjustVolumeToggle.checked = ChaperoneTabController.chaperoneAlarmSoundAdjustVolume
|
||||
d = ChaperoneTabController.chaperoneAlarmSoundDistance.toFixed(2)
|
||||
if (d <= audioWarningDistanceSlider.to) {
|
||||
audioWarningDistanceSlider.value = d
|
||||
}
|
||||
audioWarningDistanceText.text = d
|
||||
openDashboardToggle.checked = ChaperoneTabController.chaperoneShowDashboardEnabled
|
||||
d = ChaperoneTabController.chaperoneShowDashboardDistance.toFixed(2)
|
||||
if (d <= openDashboardDistanceSlider.to) {
|
||||
openDashboardDistanceSlider.value = d
|
||||
}
|
||||
openDashboardDistanceText.text = d
|
||||
velModifierToggle.checked = ChaperoneTabController.chaperoneVelocityModifierEnabled
|
||||
d = ChaperoneTabController.chaperoneVelocityModifier.toFixed(2)
|
||||
if (d <= velModifierSlider.to) {
|
||||
velModifierSlider.value = d
|
||||
}
|
||||
velModifierText.text = d
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: ChaperoneTabController
|
||||
onChaperoneSwitchToBeginnerEnabledChanged: {
|
||||
switchBeginnerToggle.checked = ChaperoneTabController.chaperoneSwitchToBeginnerEnabled
|
||||
}
|
||||
onChaperoneSwitchToBeginnerDistanceChanged: {
|
||||
var d = ChaperoneTabController.chaperoneSwitchToBeginnerDistance.toFixed(2)
|
||||
if (d <= switchBeginnerDistanceSlider.to && Math.abs(switchBeginnerDistanceSlider.value - d) > 0.0008) {
|
||||
switchBeginnerDistanceSlider.value = d
|
||||
}
|
||||
switchBeginnerDistanceText.text = d
|
||||
}
|
||||
onChaperoneHapticFeedbackEnabledChanged: {
|
||||
hapticFeedbackToggle.checked = ChaperoneTabController.chaperoneHapticFeedbackEnabled
|
||||
}
|
||||
onChaperoneHapticFeedbackDistanceChanged: {
|
||||
var d = ChaperoneTabController.chaperoneHapticFeedbackDistance.toFixed(2)
|
||||
if (d <= hapticFeedbackDistanceSlider.to && Math.abs(hapticFeedbackDistanceSlider.value - d) > 0.0008) {
|
||||
hapticFeedbackDistanceSlider.value = d
|
||||
}
|
||||
hapticFeedbackDistanceText.text = d
|
||||
}
|
||||
onChaperoneAlarmSoundEnabledChanged: {
|
||||
audioWarningToggle.checked = ChaperoneTabController.chaperoneAlarmSoundEnabled
|
||||
}
|
||||
onChaperoneAlarmSoundLoopingChanged: {
|
||||
audioWarningLoopingToggle.checked = ChaperoneTabController.chaperoneAlarmSoundLooping
|
||||
}
|
||||
onChaperoneAlarmSoundDistanceChanged: {
|
||||
var d = ChaperoneTabController.chaperoneAlarmSoundDistance.toFixed(2)
|
||||
if (d <= audioWarningDistanceSlider.to && Math.abs(audioWarningDistanceSlider.value - d) > 0.0008) {
|
||||
audioWarningDistanceSlider.value = d
|
||||
}
|
||||
audioWarningDistanceText.text = d
|
||||
}
|
||||
onChaperoneShowDashboardEnabledChanged: {
|
||||
openDashboardToggle.checked = ChaperoneTabController.chaperoneShowDashboardEnabled
|
||||
}
|
||||
onChaperoneShowDashboardDistanceChanged: {
|
||||
var d = ChaperoneTabController.chaperoneShowDashboardDistance.toFixed(2)
|
||||
if (d <= openDashboardDistanceSlider.to && Math.abs(openDashboardDistanceSlider.value - d) > 0.0008) {
|
||||
openDashboardDistanceSlider.value = d
|
||||
}
|
||||
openDashboardDistanceText.text = d
|
||||
}
|
||||
onChaperoneVelocityModifierEnabledChanged: {
|
||||
velModifierToggle.checked = ChaperoneTabController.chaperoneVelocityModifierEnabled
|
||||
}
|
||||
onChaperoneVelocityModifierChanged: {
|
||||
var d = ChaperoneTabController.chaperoneVelocityModifier.toFixed(2)
|
||||
if (d <= velModifierSlider.to && Math.abs(velModifierSlider.value - d) > 0.0008) {
|
||||
velModifierSlider.value = d
|
||||
}
|
||||
velModifierText.text = d
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
|
||||
|
||||
MyStackViewPage {
|
||||
headerText: "Floor Fix"
|
||||
|
||||
content: ColumnLayout {
|
||||
spacing: 18
|
||||
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Place one controller on the ground and ensure good visibility to the base stations."
|
||||
wrapMode: Text.WordWrap
|
||||
font.pointSize: 28
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: statusMessageText
|
||||
enabled: false
|
||||
text: "Status Text"
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: fixButton
|
||||
Layout.fillWidth: true
|
||||
text: "Fix Floor"
|
||||
Layout.preferredHeight: 100
|
||||
onClicked: {
|
||||
FixFloorTabController.fixFloorClicked()
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: recenterButton
|
||||
Layout.fillWidth: true
|
||||
text: "Recenter Playspace"
|
||||
Layout.preferredHeight: 100
|
||||
onClicked: {
|
||||
FixFloorTabController.recenterClicked()
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: undoFixButton
|
||||
enabled: false
|
||||
Layout.fillWidth: true
|
||||
text: "Undo Fix"
|
||||
onClicked: {
|
||||
FixFloorTabController.undoFixFloorClicked()
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.preferredHeight: 32
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
statusMessageText.text = ""
|
||||
undoFixButton.enabled = FixFloorTabController.canUndo
|
||||
fixButton.enabled = true
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: statusMessageTimer
|
||||
repeat: false
|
||||
onTriggered: {
|
||||
statusMessageText.text = ""
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: FixFloorTabController
|
||||
onStatusMessageSignal: {
|
||||
if (statusMessageTimer.running) {
|
||||
statusMessageTimer.stop()
|
||||
}
|
||||
statusMessageText.text = FixFloorTabController.currentStatusMessage()
|
||||
statusMessageTimer.interval = FixFloorTabController.currentStatusMessageTimeout() * 1000
|
||||
statusMessageTimer.start()
|
||||
}
|
||||
onMeasureStartSignal: {
|
||||
fixButton.enabled = false
|
||||
undoFixButton.enabled = false
|
||||
}
|
||||
onMeasureEndSignal: {
|
||||
fixButton.enabled = true
|
||||
undoFixButton.enabled = FixFloorTabController.canUndo
|
||||
}
|
||||
onCanUndoChanged: {
|
||||
undoFixButton.enabled = FixFloorTabController.canUndo
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import "." // QTBUG-34418, singletons require explicit import to load qmldir file
|
||||
|
||||
|
||||
ComboBox {
|
||||
id: myComboBox
|
||||
hoverEnabled: true
|
||||
|
||||
background: Rectangle {
|
||||
color: parent.pressed ? "#406288" : (parent.activeFocus ? "#365473" : "#2c435d")
|
||||
}
|
||||
|
||||
contentItem: MyText {
|
||||
leftPadding: 0
|
||||
rightPadding: parent.indicator.width + parent.spacing
|
||||
text: parent.displayText
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
|
||||
delegate: ItemDelegate {
|
||||
width: myComboBox.width
|
||||
text: modelData
|
||||
hoverEnabled: true
|
||||
contentItem: MyText {
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
text: parent.text
|
||||
color: parent.enabled ? "#ffffff" : "#909090"
|
||||
}
|
||||
background: Rectangle {
|
||||
color: parent.pressed ? "#406288" : (parent.hovered ? "#365473" : "#2c435d")
|
||||
}
|
||||
}
|
||||
|
||||
indicator: Canvas {
|
||||
x: parent.width - width - parent.rightPadding
|
||||
y: parent.topPadding + (parent.availableHeight - height) / 2
|
||||
width: 13
|
||||
height: 7
|
||||
contextType: "2d"
|
||||
|
||||
onPaint: {
|
||||
if (!context) {
|
||||
getContext("2d")
|
||||
}
|
||||
context.reset();
|
||||
context.lineWidth = 2
|
||||
context.moveTo(1, 1);
|
||||
context.lineTo(Math.ceil(width / 2), height - 1);
|
||||
context.lineTo(width - 1, 1);
|
||||
context.strokeStyle = "#ffffff"
|
||||
context.stroke()
|
||||
}
|
||||
}
|
||||
|
||||
onHoveredChanged: {
|
||||
if (hovered) {
|
||||
forceActiveFocus()
|
||||
}
|
||||
}
|
||||
|
||||
onActivated: {
|
||||
if (activeFocus) {
|
||||
MyResources.playActivationSound()
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
popup.background.color = "#2c435d"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
|
||||
Popup {
|
||||
id: myDialogPopup
|
||||
|
||||
implicitHeight: parent.height
|
||||
implicitWidth: parent.width
|
||||
|
||||
property string dialogTitle: ""
|
||||
property string dialogText: ""
|
||||
property int dialogWidth: 600
|
||||
property int dialogHeight: 300
|
||||
|
||||
property Item dialogContentItem: MyText {
|
||||
text: dialogText
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
property bool okClicked: false
|
||||
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
|
||||
|
||||
background: Rectangle {
|
||||
color: "black"
|
||||
opacity: 0.8
|
||||
}
|
||||
|
||||
contentItem: Item {
|
||||
Rectangle {
|
||||
implicitWidth: dialogWidth
|
||||
implicitHeight: dialogHeight
|
||||
anchors.centerIn: parent
|
||||
radius: 24
|
||||
color: "#1b2939"
|
||||
border.color: "#cccccc"
|
||||
border.width: 2
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 12
|
||||
MyText {
|
||||
Layout.leftMargin: 16
|
||||
Layout.rightMargin: 16
|
||||
text: dialogTitle
|
||||
}
|
||||
Rectangle {
|
||||
color: "#cccccc"
|
||||
height: 1
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
ColumnLayout {
|
||||
id: dialogContent
|
||||
}
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 24
|
||||
Layout.rightMargin: 24
|
||||
Layout.bottomMargin: 12
|
||||
MyPushButton {
|
||||
implicitWidth: 200
|
||||
text: "Ok"
|
||||
onClicked: {
|
||||
okClicked = true
|
||||
myDialogPopup.close()
|
||||
}
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
MyPushButton {
|
||||
implicitWidth: 200
|
||||
text: "Cancel"
|
||||
onClicked: {
|
||||
okClicked = false
|
||||
myDialogPopup.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
dialogContentItem.parent = dialogContent
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
|
||||
Popup {
|
||||
id: myDialogPopup
|
||||
|
||||
implicitHeight: parent.height
|
||||
implicitWidth: parent.width
|
||||
|
||||
property string dialogTitle: ""
|
||||
property string dialogText: ""
|
||||
property int dialogWidth: 600
|
||||
property int dialogHeight: 300
|
||||
|
||||
property Item dialogContentItem: MyText {
|
||||
text: dialogText
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
property bool okClicked: false
|
||||
|
||||
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
|
||||
|
||||
background: Rectangle {
|
||||
color: "black"
|
||||
opacity: 0.8
|
||||
}
|
||||
|
||||
contentItem: Item {
|
||||
Rectangle {
|
||||
implicitWidth: dialogWidth
|
||||
implicitHeight: dialogHeight
|
||||
anchors.centerIn: parent
|
||||
radius: 24
|
||||
color: "#1b2939"
|
||||
border.color: "#cccccc"
|
||||
border.width: 2
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 12
|
||||
MyText {
|
||||
Layout.leftMargin: 16
|
||||
Layout.rightMargin: 16
|
||||
text: dialogTitle
|
||||
}
|
||||
Rectangle {
|
||||
color: "#cccccc"
|
||||
height: 1
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
ColumnLayout {
|
||||
id: dialogContent
|
||||
}
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 24
|
||||
Layout.rightMargin: 24
|
||||
Layout.bottomMargin: 12
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
MyPushButton {
|
||||
implicitWidth: 200
|
||||
text: "Ok"
|
||||
onClicked: {
|
||||
okClicked = true
|
||||
myDialogPopup.close()
|
||||
}
|
||||
}
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
dialogContentItem.parent = dialogContent
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import "." // QTBUG-34418, singletons require explicit import to load qmldir file
|
||||
|
||||
Button {
|
||||
property bool activationSoundEnabled: true
|
||||
hoverEnabled: true
|
||||
contentItem: MyText {
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
text: parent.text
|
||||
color: parent.enabled ? "#ffffff" : "#909090"
|
||||
}
|
||||
background: Rectangle {
|
||||
color: parent.down ? "#406288" : (parent.activeFocus ? "#365473" : "#2c435d")
|
||||
}
|
||||
|
||||
onHoveredChanged: {
|
||||
if (hovered) {
|
||||
forceActiveFocus()
|
||||
} else {
|
||||
focus = false
|
||||
}
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
if (activationSoundEnabled) {
|
||||
MyResources.playActivationSound()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import "." // QTBUG-34418, singletons require explicit import to load qmldir file
|
||||
|
||||
Button {
|
||||
hoverEnabled: true
|
||||
contentItem: MyText {
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
text: parent.text
|
||||
color: parent.enabled ? "#ffffff" : "#909090"
|
||||
}
|
||||
background: Rectangle {
|
||||
color: parent.down ? "#406288" : (parent.activeFocus ? "#365473" : "transparent")
|
||||
border.color: parent.enabled ? "#ffffff" : "#909090"
|
||||
radius: 8
|
||||
}
|
||||
onHoveredChanged: {
|
||||
if (hovered) {
|
||||
forceActiveFocus()
|
||||
} else {
|
||||
focus = false
|
||||
}
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
MyResources.playActivationSound()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
pragma Singleton
|
||||
import QtQuick 2.7
|
||||
import QtMultimedia 5.6
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
QtObject {
|
||||
function playActivationSound() {
|
||||
OverlayController.playActivationSound()
|
||||
}
|
||||
function playFocusChangedSound() {
|
||||
OverlayController.playFocusChangedSound()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import "." // QTBUG-34418, singletons require explicit import to load qmldir file
|
||||
|
||||
|
||||
|
||||
Slider {
|
||||
snapMode: Slider.SnapAlways
|
||||
wheelEnabled: true
|
||||
hoverEnabled: true
|
||||
|
||||
background: Rectangle {
|
||||
x: parent.leftPadding
|
||||
y: parent.topPadding + parent.availableHeight / 2 - height / 2
|
||||
width: parent.availableWidth
|
||||
height: parent.availableHeight
|
||||
radius: 2
|
||||
color: parent.activeFocus ? "#2c435d" : "#1b2939"
|
||||
Rectangle {
|
||||
y: parent.height / 2 - height / 2
|
||||
implicitHeight: 4
|
||||
width: parent.width
|
||||
height: implicitHeight
|
||||
radius: 2
|
||||
color: "#bdbebf"
|
||||
}
|
||||
}
|
||||
|
||||
handle: Rectangle {
|
||||
x: parent.leftPadding + parent.visualPosition * (parent.availableWidth - width)
|
||||
y: parent.topPadding + parent.availableHeight / 2 - height / 2
|
||||
implicitWidth: 20
|
||||
implicitHeight: 40
|
||||
radius: 4
|
||||
color: parent.pressed ? "#ffffff" : "#eeeeee"
|
||||
border.color: "#bdbebf"
|
||||
}
|
||||
|
||||
onHoveredChanged: {
|
||||
if (hovered) {
|
||||
forceActiveFocus()
|
||||
} else {
|
||||
focus = false
|
||||
}
|
||||
}
|
||||
|
||||
onValueChanged: {
|
||||
if (activeFocus) {
|
||||
MyResources.playActivationSound()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.2
|
||||
import "." // QTBUG-34418, singletons require explicit import to load qmldir file
|
||||
|
||||
Rectangle {
|
||||
color: "#1b2939"
|
||||
width: 1200
|
||||
height: 800
|
||||
|
||||
property StackView stackView
|
||||
|
||||
property string headerText: "Header Title"
|
||||
|
||||
property bool headerShowBackButton: true
|
||||
|
||||
property Item header: ColumnLayout {
|
||||
RowLayout {
|
||||
Button {
|
||||
id: headerBackButton
|
||||
Layout.preferredHeight: 50
|
||||
Layout.preferredWidth: 50
|
||||
hoverEnabled: true
|
||||
enabled: headerShowBackButton
|
||||
opacity: headerShowBackButton ? 1.0 : 0.0
|
||||
contentItem: Image {
|
||||
source: "backarrow.svg"
|
||||
sourceSize.width: 50
|
||||
sourceSize.height: 50
|
||||
anchors.fill: parent
|
||||
}
|
||||
background: Rectangle {
|
||||
opacity: parent.down ? 1.0 : (parent.activeFocus ? 0.5 : 0.0)
|
||||
color: "#406288"
|
||||
radius: 4
|
||||
anchors.fill: parent
|
||||
}
|
||||
onHoveredChanged: {
|
||||
if (hovered) {
|
||||
forceActiveFocus()
|
||||
} else {
|
||||
focus = false
|
||||
}
|
||||
}
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
stackView.pop()
|
||||
}
|
||||
}
|
||||
MyText {
|
||||
id: headerTitle
|
||||
text: headerText
|
||||
font.pointSize: 30
|
||||
anchors.verticalCenter: headerBackButton.verticalCenter
|
||||
Layout.leftMargin: 32
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
color: "#cccccc"
|
||||
height: 1
|
||||
Layout.topMargin: 10
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
|
||||
property Item content: Frame {
|
||||
MyText {
|
||||
text: "Content"
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: mainLayout
|
||||
spacing: 12
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
header.parent = mainLayout
|
||||
header.Layout.leftMargin = 40
|
||||
header.Layout.topMargin = 30
|
||||
header.Layout.rightMargin = 40
|
||||
content.parent = mainLayout
|
||||
content.Layout.fillHeight = true
|
||||
content.Layout.fillWidth = true
|
||||
content.Layout.topMargin = 10
|
||||
content.Layout.leftMargin = 40
|
||||
content.Layout.rightMargin = 40
|
||||
content.Layout.bottomMargin = 40
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
|
||||
|
||||
Text {
|
||||
color: "#ffffff"
|
||||
font.pointSize: 20
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
TextField {
|
||||
property int keyBoardUID: 0
|
||||
property string savedText: ""
|
||||
id: myTextField
|
||||
color: "#cccccc"
|
||||
text: ""
|
||||
font.pointSize: 20
|
||||
background: Button {
|
||||
hoverEnabled: true
|
||||
background: Rectangle {
|
||||
color: parent.hovered ? "#2c435d" : "#1b2939"
|
||||
border.color: "#cccccc"
|
||||
border.width: 2
|
||||
}
|
||||
onClicked: {
|
||||
myTextField.forceActiveFocus()
|
||||
}
|
||||
}
|
||||
onActiveFocusChanged: {
|
||||
if (activeFocus) {
|
||||
if (!OverlayController.desktopMode) {
|
||||
OverlayController.showKeyboard(text, keyBoardUID)
|
||||
} else {
|
||||
savedText = text
|
||||
}
|
||||
}
|
||||
}
|
||||
onEditingFinished: {
|
||||
if (OverlayController.desktopMode && savedText !== text) {
|
||||
myTextField.onInputEvent(text)
|
||||
}
|
||||
}
|
||||
function onInputEvent(input) {
|
||||
text = input
|
||||
}
|
||||
Connections {
|
||||
target: OverlayController
|
||||
onKeyBoardInputSignal: {
|
||||
if (userValue == keyBoardUID) {
|
||||
if (myTextField.text !== input) {
|
||||
myTextField.onInputEvent(input)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import "." // QTBUG-34418, singletons require explicit import to load qmldir file
|
||||
|
||||
|
||||
CheckBox {
|
||||
checkState: Qt.Checked
|
||||
tristate: false
|
||||
hoverEnabled: true
|
||||
spacing: 12
|
||||
|
||||
indicator: Rectangle {
|
||||
implicitWidth: 28
|
||||
implicitHeight: 28
|
||||
x: parent.leftPadding
|
||||
y: parent.height / 2 - height / 2
|
||||
color: parent.enabled ? (parent.down ? "#e0e0e0" : "#ffffff") : "#a0a0a0"
|
||||
border.width: 0
|
||||
Path {
|
||||
startX: 0
|
||||
startY: 0
|
||||
PathLine {
|
||||
x: 40
|
||||
y: 40
|
||||
}
|
||||
}
|
||||
|
||||
Image {
|
||||
width: 28
|
||||
height: 28
|
||||
x: (parent.width - width) / 2
|
||||
y: (parent.height - height) / 2
|
||||
source: "check.svg"
|
||||
sourceSize.width: width
|
||||
sourceSize.height: height
|
||||
visible: parent.parent.checked
|
||||
}
|
||||
}
|
||||
|
||||
contentItem: MyText {
|
||||
text: parent.text
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
leftPadding: parent.indicator.width + parent.spacing
|
||||
color: parent.enabled ? "#ffffff" : "#909090"
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
color: "#2c435d"
|
||||
opacity: parent.activeFocus ? 1.0 : 0
|
||||
}
|
||||
|
||||
onHoveredChanged: {
|
||||
if (hovered) {
|
||||
forceActiveFocus()
|
||||
} else {
|
||||
focus = false
|
||||
}
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
MyResources.playActivationSound()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,390 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
|
||||
|
||||
MyStackViewPage {
|
||||
headerText: "Play Space Settings"
|
||||
|
||||
content: ColumnLayout {
|
||||
spacing: 18
|
||||
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Tracking Universe:"
|
||||
Layout.preferredWidth: 230
|
||||
}
|
||||
MyText {
|
||||
id: playspaceModeText
|
||||
font.bold: true
|
||||
text: "Standing"
|
||||
}
|
||||
}
|
||||
|
||||
GroupBox {
|
||||
Layout.fillWidth: true
|
||||
|
||||
label: MyText {
|
||||
leftPadding: 10
|
||||
text: "Move Play Space"
|
||||
bottomPadding: -10
|
||||
}
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "#ffffff"
|
||||
radius: 8
|
||||
}
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle {
|
||||
color: "#ffffff"
|
||||
height: 1
|
||||
Layout.fillWidth: true
|
||||
Layout.bottomMargin: 5
|
||||
}
|
||||
|
||||
GridLayout {
|
||||
columns: 4
|
||||
|
||||
MyText {
|
||||
text: "X-Axis (Left/Right):"
|
||||
Layout.preferredWidth: 500
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: playSpaceMoveXMinusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
MoveCenterTabController.modOffsetX(-0.5)
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: playSpaceMoveXText
|
||||
text: "0.00"
|
||||
keyBoardUID: 101
|
||||
Layout.preferredWidth: 140
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
MoveCenterTabController.offsetX = val.toFixed(2)
|
||||
text = MoveCenterTabController.offsetX.toFixed(2)
|
||||
} else {
|
||||
text = MoveCenterTabController.offsetX.toFixed(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: playSpaceMoveXPlusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
MoveCenterTabController.modOffsetX(0.5)
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Y-Axis (Down/Up):"
|
||||
Layout.preferredWidth: 380
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
MoveCenterTabController.modOffsetY(-0.5)
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: playSpaceMoveYText
|
||||
text: "0.00"
|
||||
keyBoardUID: 102
|
||||
Layout.preferredWidth: 140
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
MoveCenterTabController.offsetY = val.toFixed(2)
|
||||
text = MoveCenterTabController.offsetY.toFixed(2)
|
||||
} else {
|
||||
text = MoveCenterTabController.offsetY.toFixed(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
MoveCenterTabController.modOffsetY(0.5)
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Z-Axis (Forth/Back):"
|
||||
Layout.preferredWidth: 380
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
MoveCenterTabController.modOffsetZ(-0.5)
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: playSpaceMoveZText
|
||||
text: "0.00"
|
||||
keyBoardUID: 103
|
||||
Layout.preferredWidth: 140
|
||||
Layout.leftMargin: 10
|
||||
Layout.rightMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
MoveCenterTabController.offsetZ = val.toFixed(2)
|
||||
text = MoveCenterTabController.offsetZ.toFixed(2)
|
||||
} else {
|
||||
text = MoveCenterTabController.offsetZ.toFixed(2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
MoveCenterTabController.modOffsetZ(0.5)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GroupBox {
|
||||
Layout.fillWidth: true
|
||||
|
||||
label: MyText {
|
||||
leftPadding: 10
|
||||
text: "Rotate Play Space"
|
||||
bottomPadding: -10
|
||||
}
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "#ffffff"
|
||||
radius: 8
|
||||
}
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle {
|
||||
color: "#ffffff"
|
||||
height: 1
|
||||
Layout.fillWidth: true
|
||||
Layout.bottomMargin: 5
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
RowLayout {
|
||||
MyPushButton2 {
|
||||
id: playSpaceRotationMinusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
var val = MoveCenterTabController.rotation - 45
|
||||
if (val < -180) {
|
||||
val = val + 360;
|
||||
}
|
||||
MoveCenterTabController.rotation = val
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: playspaceRotationSlider
|
||||
from: -180
|
||||
to: 180
|
||||
stepSize: 1
|
||||
value: 0
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
playspaceRotationText.text = Math.round(val) + "°"
|
||||
}
|
||||
onValueChanged: {
|
||||
MoveCenterTabController.rotation = playspaceRotationSlider.value
|
||||
playspaceRotationText.text = Math.round(playspaceRotationSlider.value) + "°"
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: playSpaceRotationPlusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
var val = MoveCenterTabController.rotation + 45
|
||||
if (val > 180) {
|
||||
val = val -360;
|
||||
}
|
||||
MoveCenterTabController.rotation = val
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: playspaceRotationText
|
||||
text: "0°"
|
||||
keyBoardUID: 104
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseInt(input)
|
||||
if (!isNaN(val)) {
|
||||
val = val % 180
|
||||
MoveCenterTabController.rotation = val
|
||||
text = MoveCenterTabController.rotation + "°"
|
||||
} else {
|
||||
text = MoveCenterTabController.rotation + "°"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GroupBox {
|
||||
Layout.fillWidth: true
|
||||
|
||||
label: MyText {
|
||||
leftPadding: 10
|
||||
text: "Virtual Move Shortcut"
|
||||
bottomPadding: -10
|
||||
}
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "#ffffff"
|
||||
radius: 8
|
||||
}
|
||||
RowLayout {
|
||||
anchors.fill: parent
|
||||
|
||||
MyToggleButton {
|
||||
id: moveShortcutLeft
|
||||
text: "Left Menu Button"
|
||||
onCheckedChanged: {
|
||||
MoveCenterTabController.moveShortcutLeft = this.checked
|
||||
}
|
||||
}
|
||||
|
||||
MyToggleButton {
|
||||
id: moveShortcutRight
|
||||
text: "Right Menu Button"
|
||||
onCheckedChanged: {
|
||||
MoveCenterTabController.moveShortcutRight = this.checked
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyToggleButton {
|
||||
id: playspaceAdjustChaperoneToggle
|
||||
text: "Adjust Chaperone"
|
||||
onCheckedChanged: {
|
||||
MoveCenterTabController.adjustChaperone = this.checked
|
||||
}
|
||||
}
|
||||
|
||||
Item { Layout.fillHeight: true; Layout.fillWidth: true}
|
||||
|
||||
MyPushButton {
|
||||
id: playspaceResetButton
|
||||
Layout.preferredWidth: 250
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
MoveCenterTabController.reset()
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
playspaceAdjustChaperoneToggle.checked = MoveCenterTabController.adjustChaperone
|
||||
playSpaceMoveXText.text = MoveCenterTabController.offsetX.toFixed(2)
|
||||
playSpaceMoveYText.text = MoveCenterTabController.offsetY.toFixed(2)
|
||||
playSpaceMoveZText.text = MoveCenterTabController.offsetZ.toFixed(2)
|
||||
playspaceRotationSlider.value = MoveCenterTabController.rotation
|
||||
moveShortcutRight.checked = MoveCenterTabController.moveShortcutRight;
|
||||
moveShortcutLeft.checked = MoveCenterTabController.moveShortcutLeft;
|
||||
if (MoveCenterTabController.trackingUniverse === 0) {
|
||||
playspaceModeText.text = "Sitting"
|
||||
playSpaceRotationPlusButton.enabled = false
|
||||
playSpaceRotationMinusButton.enabled = false
|
||||
playspaceRotationSlider.enabled = false
|
||||
playspaceRotationText.text = "-"
|
||||
} else if (MoveCenterTabController.trackingUniverse === 1) {
|
||||
playspaceModeText.text = "Standing"
|
||||
playSpaceRotationPlusButton.enabled = true
|
||||
playSpaceRotationMinusButton.enabled = true
|
||||
playspaceRotationSlider.enabled = true
|
||||
playspaceRotationText.text = "0°"
|
||||
} else {
|
||||
playspaceModeText.text = "Unknown(" + MoveCenterTabController.trackingUniverse + ")"
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: MoveCenterTabController
|
||||
onOffsetXChanged: {
|
||||
playSpaceMoveXText.text = MoveCenterTabController.offsetX.toFixed(2)
|
||||
}
|
||||
onOffsetYChanged: {
|
||||
playSpaceMoveYText.text = MoveCenterTabController.offsetY.toFixed(2)
|
||||
}
|
||||
onOffsetZChanged: {
|
||||
playSpaceMoveZText.text = MoveCenterTabController.offsetZ.toFixed(2)
|
||||
}
|
||||
onRotationChanged: {
|
||||
playspaceRotationSlider.value = MoveCenterTabController.rotation
|
||||
}
|
||||
onAdjustChaperoneChanged: {
|
||||
playspaceAdjustChaperoneToggle.checked = MoveCenterTabController.adjustChaperone
|
||||
}
|
||||
onMoveShortcutRightChanged: {
|
||||
moveShortcutRight.checked = MoveCenterTabController.moveShortcutRight
|
||||
}
|
||||
onMoveShortcutLeftChanged: {
|
||||
moveShortcutLeft.checked = MoveCenterTabController.moveShortcutLeft
|
||||
}
|
||||
onTrackingUniverseChanged: {
|
||||
if (MoveCenterTabController.trackingUniverse === 0) {
|
||||
playspaceModeText.text = "Sitting"
|
||||
playSpaceRotationPlusButton.enabled = false
|
||||
playSpaceRotationMinusButton.enabled = false
|
||||
playspaceRotationSlider.enabled = false
|
||||
playspaceRotationText.text = "-"
|
||||
} else if (MoveCenterTabController.trackingUniverse === 1) {
|
||||
playspaceModeText.text = "Standing"
|
||||
playSpaceRotationPlusButton.enabled = true
|
||||
playSpaceRotationMinusButton.enabled = true
|
||||
playspaceRotationSlider.enabled = true
|
||||
playspaceRotationText.text = "0°"
|
||||
} else {
|
||||
playspaceModeText.text = "Unknown(" + MoveCenterTabController.trackingUniverse + ")"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
MyDialogOkCancelPopup {
|
||||
id: pttControllerConfigDialog
|
||||
property var pttControllerConfigClass
|
||||
property int controllerIndex: -1
|
||||
dialogTitle: "Controller Configuration"
|
||||
dialogWidth: 600
|
||||
dialogHeight: 620
|
||||
dialogContentItem: ColumnLayout {
|
||||
MyText {
|
||||
text: "Buttons"
|
||||
}
|
||||
Rectangle {
|
||||
color: "#cccccc"
|
||||
height: 1
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
MyToggleButton {
|
||||
id: pttControllerConfigGripButtonToggle
|
||||
text: "Grip"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: pttControllerConfigMenuButtonToggle
|
||||
text: "Menu"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: pttControllerConfigTriggerButtonToggle
|
||||
text: "Trigger"
|
||||
}
|
||||
|
||||
MyText {
|
||||
Layout.topMargin: 32
|
||||
text: "Touchpad"
|
||||
}
|
||||
Rectangle {
|
||||
color: "#cccccc"
|
||||
height: 1
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
RowLayout {
|
||||
spacing: 64
|
||||
MyToggleButton {
|
||||
id: pttControllerConfigPadLeftToggle
|
||||
text: "Left"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: pttControllerConfigPadRightToggle
|
||||
text: "Right"
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
spacing: 64
|
||||
MyToggleButton {
|
||||
id: pttControllerConfigPadTopToggle
|
||||
text: "Top"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: pttControllerConfigPadBottomToggle
|
||||
text: "Bottom"
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Mode:"
|
||||
}
|
||||
MyComboBox {
|
||||
id: pttControllerConfigPadModeCombo
|
||||
Layout.preferredWidth: 250
|
||||
model: ["Disabled", "Touched", "Pressed"]
|
||||
}
|
||||
}
|
||||
}
|
||||
onClosed: {
|
||||
if (okClicked) {
|
||||
var buttons = []
|
||||
if (pttControllerConfigGripButtonToggle.checked) {
|
||||
buttons.push(2)
|
||||
}
|
||||
if (pttControllerConfigMenuButtonToggle.checked) {
|
||||
buttons.push(1)
|
||||
}
|
||||
var triggerMode = 0
|
||||
if (pttControllerConfigTriggerButtonToggle.checked) {
|
||||
triggerMode = 1
|
||||
}
|
||||
var padAreas = 0
|
||||
if (pttControllerConfigPadLeftToggle.checked) {
|
||||
padAreas |= (1 << 0)
|
||||
}
|
||||
if (pttControllerConfigPadTopToggle.checked) {
|
||||
padAreas |= (1 << 1)
|
||||
}
|
||||
if (pttControllerConfigPadRightToggle.checked) {
|
||||
padAreas |= (1 << 2)
|
||||
}
|
||||
if (pttControllerConfigPadBottomToggle.checked) {
|
||||
padAreas |= (1 << 3)
|
||||
}
|
||||
pttControllerConfigClass.setPttControllerConfig(controllerIndex, buttons, triggerMode, pttControllerConfigPadModeCombo.currentIndex, padAreas);
|
||||
}
|
||||
}
|
||||
function openPopup(controller) {
|
||||
if (controller === 0) {
|
||||
dialogTitle = "Left Controller Configuration"
|
||||
controllerIndex = 0
|
||||
} else {
|
||||
dialogTitle = "Right Controller Configuration"
|
||||
controllerIndex = 1
|
||||
}
|
||||
pttControllerConfigGripButtonToggle.checked = false
|
||||
pttControllerConfigMenuButtonToggle.checked = false
|
||||
pttControllerConfigTriggerButtonToggle.checked = false
|
||||
pttControllerConfigPadLeftToggle.checked = false
|
||||
pttControllerConfigPadTopToggle.checked = false
|
||||
pttControllerConfigPadRightToggle.checked = false
|
||||
pttControllerConfigPadBottomToggle.checked = false
|
||||
pttControllerConfigPadModeCombo.currentIndex = pttControllerConfigClass.pttTouchpadMode(controllerIndex)
|
||||
var buttons = pttControllerConfigClass.pttDigitalButtons(controllerIndex)
|
||||
for (var i = 0; i < buttons.length; i++) {
|
||||
if (buttons[i] == 1) {
|
||||
pttControllerConfigMenuButtonToggle.checked = true
|
||||
} else if (buttons[i] == 2) {
|
||||
pttControllerConfigGripButtonToggle.checked = true
|
||||
}
|
||||
}
|
||||
if (pttControllerConfigClass.pttTriggerMode(controllerIndex) > 0) {
|
||||
pttControllerConfigTriggerButtonToggle.checked = true
|
||||
}
|
||||
var padAreas = pttControllerConfigClass.pttTouchpadArea(controllerIndex)
|
||||
if (padAreas & (1 << 0)) {
|
||||
pttControllerConfigPadLeftToggle.checked = true
|
||||
}
|
||||
if (padAreas & (1 << 1)) {
|
||||
pttControllerConfigPadTopToggle.checked = true
|
||||
}
|
||||
if (padAreas & (1 << 2)) {
|
||||
pttControllerConfigPadRightToggle.checked = true
|
||||
}
|
||||
if (padAreas & (1 << 3)) {
|
||||
pttControllerConfigPadBottomToggle.checked = true
|
||||
}
|
||||
open()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,547 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import matzman666.advsettings 1.0
|
||||
import "." // QTBUG-34418, singletons require explicit import to load qmldir file
|
||||
|
||||
MyStackViewPage {
|
||||
id: rootPage
|
||||
width: 1200
|
||||
height: 800
|
||||
headerText: "OpenVR Advanced Settings"
|
||||
headerShowBackButton: false
|
||||
stackView: mainView
|
||||
content: Item {
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
RowLayout {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
ColumnLayout {
|
||||
Layout.preferredWidth: 250
|
||||
Layout.maximumWidth: 250
|
||||
Layout.fillHeight: true
|
||||
spacing: 18
|
||||
MyPushButton {
|
||||
id: steamVRButton
|
||||
activationSoundEnabled: false
|
||||
text: "SteamVR"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(steamVRPage)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: chaperoneButton
|
||||
activationSoundEnabled: false
|
||||
text: "Chaperone"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(chaperonePage)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: playSpaceButton
|
||||
activationSoundEnabled: false
|
||||
text: "Play Space"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(playspacePage)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: fixFloorButton
|
||||
activationSoundEnabled: false
|
||||
text: "Playspace Fix"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(fixFloorPage)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: audioButton
|
||||
activationSoundEnabled: false
|
||||
text: "Audio"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(audioPage)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: reviveButton
|
||||
activationSoundEnabled: false
|
||||
text: "Revive"
|
||||
Layout.fillWidth: true
|
||||
visible: SettingsTabController.forceRevivePage ? true : ReviveTabController.isOverlayInstalled
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(revivePage)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: utilitiesButton
|
||||
activationSoundEnabled: false
|
||||
text: "Utilities"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(utilitiesPage)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: accessibilityButton
|
||||
activationSoundEnabled: false
|
||||
text: "Accessibility"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(accessibilityPage)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: statisticsButton
|
||||
activationSoundEnabled: false
|
||||
text: "Statistics"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(statisticsPage)
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: settingsButton
|
||||
activationSoundEnabled: false
|
||||
text: "Settings"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
MyResources.playFocusChangedSound()
|
||||
mainView.push(settingsPage)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
Layout.leftMargin: 80
|
||||
spacing: 9
|
||||
|
||||
RowLayout {
|
||||
spacing: 18
|
||||
|
||||
MyText {
|
||||
text: "Supersampling Profile:"
|
||||
}
|
||||
|
||||
MyComboBox {
|
||||
id: summarySteamVRProfileComboBox
|
||||
Layout.maximumWidth: 378
|
||||
Layout.minimumWidth: 378
|
||||
Layout.preferredWidth: 378
|
||||
Layout.fillWidth: true
|
||||
model: [""]
|
||||
onCurrentIndexChanged: {
|
||||
if (currentIndex > 0) {
|
||||
summarySteamVRProfileApplyButton.enabled = true
|
||||
} else {
|
||||
summarySteamVRProfileApplyButton.enabled = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: summarySteamVRProfileApplyButton
|
||||
enabled: false
|
||||
Layout.preferredWidth: 150
|
||||
text: "Apply"
|
||||
onClicked: {
|
||||
if (summarySteamVRProfileComboBox.currentIndex > 0) {
|
||||
SteamVRTabController.applySteamVRProfile(summarySteamVRProfileComboBox.currentIndex - 1)
|
||||
summarySteamVRProfileComboBox.currentIndex = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
spacing: 18
|
||||
|
||||
MyText {
|
||||
text: "Chaperone Profile:"
|
||||
}
|
||||
|
||||
MyComboBox {
|
||||
id: summaryChaperoneProfileComboBox
|
||||
Layout.leftMargin: 47
|
||||
Layout.maximumWidth: 378
|
||||
Layout.minimumWidth: 378
|
||||
Layout.preferredWidth: 378
|
||||
Layout.fillWidth: true
|
||||
model: [""]
|
||||
onCurrentIndexChanged: {
|
||||
if (currentIndex > 0) {
|
||||
summaryChaperoneProfileApplyButton.enabled = true
|
||||
} else {
|
||||
summaryChaperoneProfileApplyButton.enabled = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: summaryChaperoneProfileApplyButton
|
||||
enabled: false
|
||||
Layout.preferredWidth: 150
|
||||
text: "Apply"
|
||||
onClicked: {
|
||||
if (summaryChaperoneProfileComboBox.currentIndex > 0) {
|
||||
ChaperoneTabController.applyChaperoneProfile(summaryChaperoneProfileComboBox.currentIndex - 1)
|
||||
summaryChaperoneProfileComboBox.currentIndex = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Tracking Universe:"
|
||||
}
|
||||
MyText {
|
||||
id: summaryPlaySpaceModeText
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
text: "Unknown"
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "HMD Rotations:"
|
||||
}
|
||||
MyText {
|
||||
id: summaryHmdRotationsText
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
text: "-999.9"
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Dropped Frames:"
|
||||
}
|
||||
MyText {
|
||||
id: summaryDroppedFramesText
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
text: "0"
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Reprojected Frames:"
|
||||
}
|
||||
MyText {
|
||||
id: summaryReprojectedFramesText
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
text: "0"
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Timed Out:"
|
||||
}
|
||||
MyText {
|
||||
id: summaryTimedOutText
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
text: "0"
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Reprojection Ratio:"
|
||||
}
|
||||
MyText {
|
||||
id: summaryTotalRatioText
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
text: "0"
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
|
||||
|
||||
RowLayout {
|
||||
MyText {
|
||||
text: "Microphone:"
|
||||
}
|
||||
MySlider {
|
||||
id: summaryMicVolumeSlider
|
||||
from: 0.0
|
||||
to: 1.0
|
||||
stepSize: 0.01
|
||||
value: 1.0
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.position * 100
|
||||
summaryMicVolumeText.text = Math.round(val) + "%"
|
||||
}
|
||||
onValueChanged: {
|
||||
AudioTabController.setMicVolume(this.value.toFixed(2))
|
||||
}
|
||||
}
|
||||
MyText {
|
||||
id: summaryMicVolumeText
|
||||
text: "100%"
|
||||
Layout.preferredWidth: 85
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: summaryMicMuteToggle
|
||||
Layout.leftMargin: 12
|
||||
checkable: true
|
||||
contentItem: Image {
|
||||
source: parent.checked ? "mic_off.svg" : "mic_on.svg"
|
||||
sourceSize.width: 32
|
||||
sourceSize.height: 32
|
||||
anchors.fill: parent
|
||||
}
|
||||
onCheckedChanged: {
|
||||
AudioTabController.setMicMuted(checked)
|
||||
}
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
MyToggleButton {
|
||||
id: summaryPttToggle
|
||||
text: "Push-to-Talk"
|
||||
onClicked: {
|
||||
AudioTabController.pttEnabled = checked
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
spacing: 18
|
||||
|
||||
MyComboBox {
|
||||
Layout.leftMargin: 78
|
||||
id: summaryPttProfileComboBox
|
||||
Layout.maximumWidth: 378
|
||||
Layout.minimumWidth: 378
|
||||
Layout.preferredWidth: 378
|
||||
Layout.fillWidth: true
|
||||
model: [""]
|
||||
onCurrentIndexChanged: {
|
||||
if (currentIndex > 0) {
|
||||
summaryPttProfileApplyButton.enabled = true
|
||||
} else {
|
||||
summaryPttProfileApplyButton.enabled = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: summaryPttProfileApplyButton
|
||||
enabled: false
|
||||
Layout.preferredWidth: 150
|
||||
text: "Apply"
|
||||
onClicked: {
|
||||
if (summaryPttProfileComboBox.currentIndex > 0) {
|
||||
AudioTabController.applyPttProfile(summaryPttProfileComboBox.currentIndex - 1)
|
||||
summaryPttProfileComboBox.currentIndex = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: summaryVersionText
|
||||
text: "v0.0.0"
|
||||
font.pointSize: 16
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
reloadChaperoneProfiles()
|
||||
reloadSteamVRProfiles()
|
||||
reloadPttProfiles()
|
||||
summaryVersionText.text = applicationVersion
|
||||
if (MoveCenterTabController.trackingUniverse === 0) {
|
||||
summaryPlaySpaceModeText.text = "Sitting"
|
||||
} else if (MoveCenterTabController.trackingUniverse === 1) {
|
||||
summaryPlaySpaceModeText.text = "Standing"
|
||||
} else {
|
||||
summaryPlaySpaceModeText.text = "Unknown(" + MoveCenterTabController.trackingUniverse + ")"
|
||||
}
|
||||
updateStatistics()
|
||||
if (visible) {
|
||||
summaryUpdateTimer.start()
|
||||
}
|
||||
summaryMicVolumeSlider.value = AudioTabController.micVolume
|
||||
summaryMicMuteToggle.checked = AudioTabController.micMuted
|
||||
summaryPttToggle.checked = AudioTabController.pttEnabled
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: ChaperoneTabController
|
||||
onChaperoneProfilesUpdated: {
|
||||
reloadChaperoneProfiles()
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SteamVRTabController
|
||||
onSteamVRProfilesUpdated: {
|
||||
reloadSteamVRProfiles()
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: AudioTabController
|
||||
onPttProfilesUpdated: {
|
||||
reloadPttProfiles()
|
||||
}
|
||||
onMicVolumeChanged: {
|
||||
summaryMicVolumeSlider.value = AudioTabController.micVolume
|
||||
}
|
||||
onMicMutedChanged: {
|
||||
summaryMicMuteToggle.checked = AudioTabController.micMuted
|
||||
}
|
||||
onPttEnabledChanged: {
|
||||
summaryPttToggle.checked = AudioTabController.pttEnabled
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: MoveCenterTabController
|
||||
onTrackingUniverseChanged: {
|
||||
if (MoveCenterTabController.trackingUniverse === 0) {
|
||||
summaryPlaySpaceModeText.text = "Sitting"
|
||||
} else if (MoveCenterTabController.trackingUniverse === 1) {
|
||||
summaryPlaySpaceModeText.text = "Standing"
|
||||
} else {
|
||||
summaryPlaySpaceModeText.text = "Unknown(" + MoveCenterTabController.trackingUniverse + ")"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SettingsTabController
|
||||
onForceRevivePageChanged: {
|
||||
reviveButton.visible = SettingsTabController.forceRevivePage ? true : ReviveTabController.isOverlayInstalled
|
||||
}
|
||||
}
|
||||
|
||||
function updateStatistics() {
|
||||
var rotations = StatisticsTabController.hmdRotations
|
||||
if (rotations > 0) {
|
||||
summaryHmdRotationsText.text = rotations.toFixed(1) + " CCW"
|
||||
} else {
|
||||
summaryHmdRotationsText.text = -rotations.toFixed(1) + " CW"
|
||||
}
|
||||
summaryDroppedFramesText.text = StatisticsTabController.droppedFrames
|
||||
summaryReprojectedFramesText.text = StatisticsTabController.reprojectedFrames
|
||||
summaryTimedOutText.text = StatisticsTabController.timedOut
|
||||
summaryTotalRatioText.text = (StatisticsTabController.totalReprojectedRatio*100.0).toFixed(1) + "%"
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: summaryUpdateTimer
|
||||
repeat: true
|
||||
interval: 100
|
||||
onTriggered: {
|
||||
parent.updateStatistics()
|
||||
}
|
||||
}
|
||||
|
||||
onVisibleChanged: {
|
||||
if (visible) {
|
||||
updateStatistics()
|
||||
summaryUpdateTimer.start()
|
||||
} else {
|
||||
summaryUpdateTimer.stop()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function reloadChaperoneProfiles() {
|
||||
var profiles = [""]
|
||||
var profileCount = ChaperoneTabController.getChaperoneProfileCount()
|
||||
for (var i = 0; i < profileCount; i++) {
|
||||
profiles.push(ChaperoneTabController.getChaperoneProfileName(i))
|
||||
}
|
||||
summaryChaperoneProfileComboBox.currentIndex = 0
|
||||
summaryChaperoneProfileComboBox.model = profiles
|
||||
}
|
||||
|
||||
|
||||
function reloadSteamVRProfiles() {
|
||||
var profiles = [""]
|
||||
var profileCount = SteamVRTabController.getSteamVRProfileCount()
|
||||
for (var i = 0; i < profileCount; i++) {
|
||||
profiles.push(SteamVRTabController.getSteamVRProfileName(i))
|
||||
}
|
||||
summarySteamVRProfileComboBox.currentIndex = 0
|
||||
summarySteamVRProfileComboBox.model = profiles
|
||||
}
|
||||
|
||||
function reloadPttProfiles() {
|
||||
var profiles = [""]
|
||||
var profileCount = AudioTabController.getPttProfileCount()
|
||||
for (var i = 0; i < profileCount; i++) {
|
||||
profiles.push(AudioTabController.getPttProfileName(i))
|
||||
}
|
||||
summaryPttProfileComboBox.currentIndex = 0
|
||||
summaryPttProfileComboBox.model = profiles
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
|
||||
MyStackViewPage {
|
||||
headerText: "Application Settings"
|
||||
|
||||
content: ColumnLayout {
|
||||
spacing: 18
|
||||
|
||||
MyToggleButton {
|
||||
id: settingsAutoStartToggle
|
||||
text: "Autostart"
|
||||
onCheckedChanged: {
|
||||
SettingsTabController.setAutoStartEnabled(checked, false)
|
||||
}
|
||||
}
|
||||
|
||||
MyToggleButton {
|
||||
id: forceReviveToggle
|
||||
text: "Force Revive Page"
|
||||
onCheckedChanged: {
|
||||
SettingsTabController.setForceRevivePage(checked, true)
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
settingsAutoStartToggle.checked = SettingsTabController.autoStartEnabled
|
||||
forceReviveToggle.checked = SettingsTabController.forceRevivePage
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SettingsTabController
|
||||
onAutoStartEnabledChanged: {
|
||||
settingsAutoStartToggle.checked = SettingsTabController.autoStartEnabled
|
||||
}
|
||||
onForceRevivePageChanged: {
|
||||
forceReviveToggle.checked = SettingsTabController.forceRevivePage
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,234 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
|
||||
|
||||
MyStackViewPage {
|
||||
headerText: "Statistics"
|
||||
|
||||
content: ColumnLayout {
|
||||
spacing: 18
|
||||
|
||||
GridLayout {
|
||||
columns: 3
|
||||
|
||||
MyText {
|
||||
text: "HMD Distance Moved:"
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: statsHmdMovedText
|
||||
text: "-00.0"
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
Layout.rightMargin: 10
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
StatisticsTabController.statsDistanceResetClicked()
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "HMD Rotations:"
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: statsHmdRotationText
|
||||
text: "0.0 CCW"
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
Layout.rightMargin: 10
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
StatisticsTabController.statsRotationResetClicked()
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Left Controller Max Speed:"
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: statsLeftControllerSpeedText
|
||||
text: "99.9 m/s"
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
Layout.rightMargin: 10
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
StatisticsTabController.statsLeftControllerSpeedResetClicked()
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Right Controller Max Speed:"
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: statsRightControllerSpeedText
|
||||
text: "99.9 m/s"
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
Layout.rightMargin: 10
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
StatisticsTabController.statsRightControllerSpeedResetClicked()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GridLayout {
|
||||
columns: 3
|
||||
Layout.topMargin: 32
|
||||
|
||||
MyText {
|
||||
text: "Presented Frames:"
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: statsPresentedFramesText
|
||||
text: "000"
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
Layout.rightMargin: 10
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
StatisticsTabController.presentedFramesResetClicked()
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Dropped Frames:"
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: statsDroppedFramesText
|
||||
text: "000"
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
Layout.rightMargin: 10
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
StatisticsTabController.droppedFramesResetClicked()
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Reprojected Frames:"
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: statsReprojectionFramesText
|
||||
text: "000"
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
Layout.rightMargin: 10
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
StatisticsTabController.reprojectedFramesResetClicked()
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Timed Out:"
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: statsTimedOutText
|
||||
text: "000"
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
Layout.rightMargin: 10
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
StatisticsTabController.timedOutResetClicked()
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: "Reprojection Ratio:"
|
||||
}
|
||||
|
||||
MyText {
|
||||
id: statstotalRatioText
|
||||
text: "0.0"
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
Layout.rightMargin: 10
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Reset"
|
||||
onClicked: {
|
||||
StatisticsTabController.totalRatioResetClicked()
|
||||
}
|
||||
}
|
||||
}
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
}
|
||||
|
||||
function updateStatistics() {
|
||||
statsHmdMovedText.text = StatisticsTabController.hmdDistanceMoved.toFixed(1) + " m"
|
||||
var rotations = StatisticsTabController.hmdRotations
|
||||
if (rotations > 0) {
|
||||
statsHmdRotationText.text = rotations.toFixed(1) + " CCW"
|
||||
} else {
|
||||
statsHmdRotationText.text = -rotations.toFixed(1) + " CW"
|
||||
}
|
||||
statsLeftControllerSpeedText.text = " " + StatisticsTabController.leftControllerMaxSpeed.toFixed(1) + " m/s"
|
||||
statsRightControllerSpeedText.text = " " + StatisticsTabController.rightControllerMaxSpeed.toFixed(1) + " m/s"
|
||||
statsPresentedFramesText.text = StatisticsTabController.presentedFrames
|
||||
statsDroppedFramesText.text = StatisticsTabController.droppedFrames
|
||||
statsReprojectionFramesText.text = StatisticsTabController.reprojectedFrames
|
||||
statsTimedOutText.text = StatisticsTabController.timedOut
|
||||
statstotalRatioText.text = (StatisticsTabController.totalReprojectedRatio*100.0).toFixed(1) + "%"
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: statisticsUpdateTimer
|
||||
repeat: true
|
||||
interval: 100
|
||||
onTriggered: {
|
||||
parent.updateStatistics()
|
||||
}
|
||||
}
|
||||
|
||||
onVisibleChanged: {
|
||||
if (visible) {
|
||||
updateStatistics()
|
||||
statisticsUpdateTimer.start()
|
||||
} else {
|
||||
statisticsUpdateTimer.stop()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,437 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
MyStackViewPage {
|
||||
id: myStackViewPage1
|
||||
headerText: "SteamVR Settings"
|
||||
|
||||
|
||||
MyDialogOkPopup {
|
||||
id: steamvrMessageDialog
|
||||
function showMessage(title, text) {
|
||||
dialogTitle = title
|
||||
dialogText = text
|
||||
open()
|
||||
}
|
||||
}
|
||||
|
||||
MyDialogOkCancelPopup {
|
||||
id: steamvrDeleteProfileDialog
|
||||
property int profileIndex: -1
|
||||
dialogTitle: "Delete Profile"
|
||||
dialogText: "Do you really want to delete this profile?"
|
||||
onClosed: {
|
||||
if (okClicked) {
|
||||
SteamVRTabController.deleteSteamVRProfile(profileIndex)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyDialogOkCancelPopup {
|
||||
id: steamvrNewProfileDialog
|
||||
dialogTitle: "Create New Profile"
|
||||
dialogWidth: 600
|
||||
dialogHeight: 400
|
||||
dialogContentItem: ColumnLayout {
|
||||
RowLayout {
|
||||
Layout.topMargin: 16
|
||||
Layout.leftMargin: 16
|
||||
Layout.rightMargin: 16
|
||||
MyText {
|
||||
text: "Name: "
|
||||
}
|
||||
MyTextField {
|
||||
id: steamvrNewProfileName
|
||||
keyBoardUID: 490
|
||||
color: "#cccccc"
|
||||
text: ""
|
||||
Layout.fillWidth: true
|
||||
font.pointSize: 20
|
||||
function onInputEvent(input) {
|
||||
steamvrNewProfileName.text = input
|
||||
}
|
||||
}
|
||||
}
|
||||
MyText {
|
||||
Layout.topMargin: 24
|
||||
text: "What to include:"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: steamvrNewProfileIncludeSupersampling
|
||||
Layout.leftMargin: 32
|
||||
text: "Application Supersampling"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: steamvrNewProfileIncludeSupersampleFiltering
|
||||
Layout.leftMargin: 32
|
||||
text: "Supersample Filtering"
|
||||
}
|
||||
MyToggleButton {
|
||||
id: steamvrNewProfileIncludeReprojectionSettingsg
|
||||
Layout.leftMargin: 32
|
||||
text: "Reprojection Settings"
|
||||
}
|
||||
}
|
||||
onClosed: {
|
||||
if (okClicked) {
|
||||
if (steamvrNewProfileName.text == "") {
|
||||
steamvrMessageDialog.showMessage("Create New Profile", "ERROR: Empty profile name.")
|
||||
} else if (!steamvrNewProfileIncludeSupersampling.checked
|
||||
&& !steamvrNewProfileIncludeSupersampleFiltering.checked
|
||||
&& !steamvrNewProfileIncludeReprojectionSettingsg.checked) {
|
||||
steamvrMessageDialog.showMessage("Create New Profile", "ERROR: Nothing included.")
|
||||
} else {
|
||||
SteamVRTabController.addSteamVRProfile(steamvrNewProfileName.text,
|
||||
steamvrNewProfileIncludeSupersampling.checked,
|
||||
steamvrNewProfileIncludeSupersampleFiltering.checked,
|
||||
steamvrNewProfileIncludeReprojectionSettingsg.checked)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
function openPopup() {
|
||||
steamvrNewProfileName.text = ""
|
||||
steamvrNewProfileIncludeSupersampling.checked = false
|
||||
steamvrNewProfileIncludeSupersampleFiltering.checked = false
|
||||
steamvrNewProfileIncludeReprojectionSettingsg.checked = false
|
||||
open()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
content: ColumnLayout {
|
||||
spacing: 18
|
||||
|
||||
ColumnLayout {
|
||||
Layout.bottomMargin: 32
|
||||
spacing: 18
|
||||
RowLayout {
|
||||
spacing: 18
|
||||
|
||||
MyText {
|
||||
text: "Profile:"
|
||||
}
|
||||
|
||||
MyComboBox {
|
||||
id: steamvrProfileComboBox
|
||||
Layout.maximumWidth: 799
|
||||
Layout.minimumWidth: 799
|
||||
Layout.preferredWidth: 799
|
||||
Layout.fillWidth: true
|
||||
model: [""]
|
||||
onCurrentIndexChanged: {
|
||||
if (currentIndex > 0) {
|
||||
steamvrApplyProfileButton.enabled = true
|
||||
steamvrDeleteProfileButton.enabled = true
|
||||
} else {
|
||||
steamvrApplyProfileButton.enabled = false
|
||||
steamvrDeleteProfileButton.enabled = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
id: steamvrApplyProfileButton
|
||||
enabled: false
|
||||
Layout.preferredWidth: 200
|
||||
text: "Apply"
|
||||
onClicked: {
|
||||
if (steamvrProfileComboBox.currentIndex > 0) {
|
||||
SteamVRTabController.applySteamVRProfile(steamvrProfileComboBox.currentIndex - 1)
|
||||
steamvrProfileComboBox.currentIndex = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
spacing: 18
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
MyPushButton {
|
||||
id: steamvrDeleteProfileButton
|
||||
enabled: false
|
||||
Layout.preferredWidth: 200
|
||||
text: "Delete Profile"
|
||||
onClicked: {
|
||||
if (steamvrProfileComboBox.currentIndex > 0) {
|
||||
steamvrDeleteProfileDialog.profileIndex = steamvrProfileComboBox.currentIndex - 1
|
||||
steamvrDeleteProfileDialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
MyPushButton {
|
||||
Layout.preferredWidth: 200
|
||||
text: "New Profile"
|
||||
onClicked: {
|
||||
steamvrNewProfileDialog.openPopup()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
spacing: 16
|
||||
|
||||
MyText {
|
||||
text: "Application Supersampling:"
|
||||
Layout.preferredWidth: 350
|
||||
Layout.rightMargin: 12
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "-"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
steamvrSupersamplingSlider.decrease()
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: steamvrSupersamplingSlider
|
||||
from: 0.1
|
||||
to: 5.0
|
||||
stepSize: 0.1
|
||||
value: 1.0
|
||||
snapMode: Slider.SnapAlways
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
steamvrSupersamplingText.text = val.toFixed(1)
|
||||
}
|
||||
onValueChanged: {
|
||||
SteamVRTabController.setSuperSampling(this.value.toFixed(1), false)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "+"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
steamvrSupersamplingSlider.increase()
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: steamvrSupersamplingText
|
||||
text: "0.0"
|
||||
keyBoardUID: 401
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val < 0.1) {
|
||||
val = 0.1
|
||||
}
|
||||
var v = val.toFixed(1)
|
||||
if (v <= steamvrSupersamplingSlider.to) {
|
||||
steamvrSupersamplingSlider.value = v
|
||||
} else {
|
||||
SteamVRTabController.setSuperSampling(v, false)
|
||||
}
|
||||
}
|
||||
text = SteamVRTabController.superSampling.toFixed(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
spacing: 16
|
||||
|
||||
MyText {
|
||||
text: "Compositor Render Target Multiplier*:"
|
||||
Layout.preferredWidth: 450
|
||||
Layout.rightMargin: 12
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "-"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
steamvrCompositorSupersamplingSlider.decrease()
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: steamvrCompositorSupersamplingSlider
|
||||
from: 0.1
|
||||
to: 2
|
||||
stepSize: 0.1
|
||||
value: 1.0
|
||||
snapMode: Slider.SnapAlways
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
steamvrCompositorSupersamplingText.text = val.toFixed(1)
|
||||
}
|
||||
onValueChanged: {
|
||||
SteamVRTabController.setCompositorSuperSampling(this.value.toFixed(1), false)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "+"
|
||||
Layout.preferredWidth: 40
|
||||
onClicked: {
|
||||
steamvrCompositorSupersamplingSlider.increase()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MyTextField {
|
||||
id: steamvrCompositorSupersamplingText
|
||||
text: "0.0"
|
||||
keyBoardUID: 402
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val < 0.1) {
|
||||
val = 0.1
|
||||
}
|
||||
var v = val.toFixed(1)
|
||||
if (v <= steamvrCompositorSupersamplingSlider.to) {
|
||||
steamvrCompositorSupersamplingSlider.value = v
|
||||
} else {
|
||||
SteamVRTabController.setCompositorSuperSampling(v, false)
|
||||
}
|
||||
}
|
||||
text = SteamVRTabController.compositorSuperSampling.toFixed(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyToggleButton {
|
||||
id: steamvrAllowSupersampleFilteringToggle
|
||||
text: "Enable Advanced Supersample Filtering"
|
||||
onCheckedChanged: {
|
||||
SteamVRTabController.setAllowSupersampleFiltering(this.checked, false)
|
||||
}
|
||||
}
|
||||
|
||||
MyToggleButton {
|
||||
id: steamvrAllowAsyncReprojectionToggle
|
||||
text: "Allow Asynchronous Reprojection"
|
||||
onCheckedChanged: {
|
||||
SteamVRTabController.setAllowAsyncReprojection(this.checked, false)
|
||||
}
|
||||
}
|
||||
|
||||
MyToggleButton {
|
||||
id: steamvrAllowInterleavedReprojectionToggle
|
||||
text: "Allow Interleaved Reprojection"
|
||||
onCheckedChanged: {
|
||||
SteamVRTabController.setAllowInterleavedReprojection(this.checked, false)
|
||||
}
|
||||
}
|
||||
|
||||
MyToggleButton {
|
||||
id: steamvrForceReprojectionToggle
|
||||
text: "Enable Always-on Reprojection"
|
||||
onCheckedChanged: {
|
||||
SteamVRTabController.setForceReprojection(this.checked, false)
|
||||
}
|
||||
}
|
||||
|
||||
Item { Layout.fillHeight: true; Layout.fillWidth: true}
|
||||
|
||||
MyText {
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
text: "* Requires Restart"
|
||||
font.pointSize: 18
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
|
||||
MyPushButton {
|
||||
id: steamVRResetButton
|
||||
text: "Reset"
|
||||
Layout.preferredWidth: 250
|
||||
onClicked: {
|
||||
SteamVRTabController.reset()
|
||||
}
|
||||
}
|
||||
|
||||
Item { Layout.fillWidth: true}
|
||||
|
||||
MyPushButton {
|
||||
id: steamVRRestartButton
|
||||
text: "Restart SteamVR"
|
||||
Layout.preferredWidth: 250
|
||||
onClicked: {
|
||||
SteamVRTabController.restartSteamVR()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
var s1 = SteamVRTabController.superSampling.toFixed(1)
|
||||
if (s1 <= steamvrSupersamplingSlider.to) {
|
||||
steamvrSupersamplingSlider.value = s1
|
||||
}
|
||||
steamvrSupersamplingText.text = s1
|
||||
var s2 = SteamVRTabController.compositorSuperSampling.toFixed(1)
|
||||
if (s2 <= steamvrCompositorSupersamplingSlider.to) {
|
||||
steamvrCompositorSupersamplingSlider.value = s2
|
||||
}
|
||||
steamvrCompositorSupersamplingText.text = s2
|
||||
steamvrAllowSupersampleFilteringToggle.checked = SteamVRTabController.allowSupersampleFiltering
|
||||
steamvrAllowInterleavedReprojectionToggle.checked = SteamVRTabController.allowInterleavedReprojection
|
||||
steamvrAllowAsyncReprojectionToggle.checked = SteamVRTabController.allowAsyncReprojection
|
||||
steamvrForceReprojectionToggle.checked = SteamVRTabController.forceReprojection
|
||||
reloadSteamVRProfiles()
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SteamVRTabController
|
||||
onSuperSamplingChanged: {
|
||||
var s1 = SteamVRTabController.superSampling.toFixed(1)
|
||||
if (s1 <= steamvrSupersamplingSlider.to && Math.abs(steamvrSupersamplingSlider.value-s1) > 0.08) {
|
||||
steamvrSupersamplingSlider.value = s1
|
||||
}
|
||||
steamvrSupersamplingText.text = s1
|
||||
}
|
||||
onCompositorSuperSamplingChanged: {
|
||||
var s2 = SteamVRTabController.compositorSuperSampling.toFixed(1)
|
||||
if (s2 <= steamvrCompositorSupersamplingSlider.to && Math.abs(steamvrCompositorSupersamplingSlider.value-s2) > 0.08) {
|
||||
steamvrCompositorSupersamplingSlider.value = s2
|
||||
}
|
||||
steamvrCompositorSupersamplingText.text = s2
|
||||
}
|
||||
onAllowSupersampleFilteringChanged: {
|
||||
steamvrAllowSupersampleFilteringToggle.checked = SteamVRTabController.allowSupersampleFiltering
|
||||
}
|
||||
onAllowInterleavedReprojectionChanged: {
|
||||
steamvrAllowInterleavedReprojectionToggle.checked = SteamVRTabController.allowInterleavedReprojection
|
||||
}
|
||||
onAllowAsyncReprojectionChanged: {
|
||||
steamvrAllowAsyncReprojectionToggle.checked = SteamVRTabController.allowAsyncReprojection
|
||||
}
|
||||
onForceReprojectionChanged: {
|
||||
steamvrForceReprojectionToggle.checked = SteamVRTabController.forceReprojection
|
||||
}
|
||||
onSteamVRProfilesUpdated: {
|
||||
reloadSteamVRProfiles()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function reloadSteamVRProfiles() {
|
||||
var profiles = [""]
|
||||
var profileCount = SteamVRTabController.getSteamVRProfileCount()
|
||||
for (var i = 0; i < profileCount; i++) {
|
||||
profiles.push(SteamVRTabController.getSteamVRProfileName(i))
|
||||
}
|
||||
steamvrProfileComboBox.currentIndex = 0
|
||||
steamvrProfileComboBox.model = profiles
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,371 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.3
|
||||
import matzman666.advsettings 1.0
|
||||
|
||||
|
||||
MyStackViewPage {
|
||||
headerText: "Utilities"
|
||||
|
||||
content: ColumnLayout {
|
||||
spacing: 18
|
||||
|
||||
|
||||
GroupBox {
|
||||
id: keyboardGroupBox
|
||||
Layout.fillWidth: true
|
||||
|
||||
label: MyText {
|
||||
leftPadding: 10
|
||||
text: "Keyboard Utilities"
|
||||
bottomPadding: -10
|
||||
}
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "#ffffff"
|
||||
radius: 8
|
||||
}
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle {
|
||||
color: "#ffffff"
|
||||
height: 1
|
||||
Layout.fillWidth: true
|
||||
Layout.bottomMargin: 5
|
||||
}
|
||||
|
||||
|
||||
MyText {
|
||||
text: "Send to active application: "
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
spacing: 18
|
||||
|
||||
MyPushButton {
|
||||
text: "Keyboard Input"
|
||||
Layout.preferredWidth: 250
|
||||
onClicked: {
|
||||
OverlayController.showKeyboard("", 601)
|
||||
}
|
||||
Connections {
|
||||
target: OverlayController
|
||||
onKeyBoardInputSignal: {
|
||||
if (userValue == 601) {
|
||||
UtilitiesTabController.sendKeyboardInput(input)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Enter"
|
||||
Layout.preferredWidth: 250
|
||||
onClicked: {
|
||||
UtilitiesTabController.sendKeyboardEnter()
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "Backspace"
|
||||
Layout.preferredWidth: 250
|
||||
onClicked: {
|
||||
UtilitiesTabController.sendKeyboardBackspace(1)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton {
|
||||
text: "10x Backspace"
|
||||
Layout.preferredWidth: 250
|
||||
onClicked: {
|
||||
UtilitiesTabController.sendKeyboardBackspace(10)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GroupBox {
|
||||
id: alarmGroupBox
|
||||
Layout.fillWidth: true
|
||||
|
||||
label: MyText {
|
||||
leftPadding: 10
|
||||
text: "Alarm Clock"
|
||||
bottomPadding: -10
|
||||
}
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "#ffffff"
|
||||
radius: 8
|
||||
}
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle {
|
||||
color: "#ffffff"
|
||||
height: 1
|
||||
Layout.fillWidth: true
|
||||
Layout.bottomMargin: 5
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
MyToggleButton {
|
||||
id: alarmClockToggle
|
||||
text: ""
|
||||
onCheckedChanged: {
|
||||
UtilitiesTabController.setAlarmEnabled(checked, false)
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: alarmClockHourText
|
||||
text: "00"
|
||||
keyBoardUID: 602
|
||||
Layout.preferredWidth: 50
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseInt(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val < 0) {
|
||||
val = 0
|
||||
} else if (val > 23) {
|
||||
val = 23
|
||||
}
|
||||
UtilitiesTabController.setAlarmTimeHour(val, false)
|
||||
}
|
||||
setAlarmHourText(UtilitiesTabController.alarmTimeHour)
|
||||
}
|
||||
}
|
||||
|
||||
MyText {
|
||||
text: ":"
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: alarmClockMinuteText
|
||||
text: "00"
|
||||
keyBoardUID: 603
|
||||
Layout.preferredWidth: 50
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseInt(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val < 0) {
|
||||
val = 0
|
||||
} else if (val > 59) {
|
||||
val = 59
|
||||
}
|
||||
UtilitiesTabController.setAlarmTimeMinute(val, false)
|
||||
}
|
||||
setAlarmMinuteText(UtilitiesTabController.alarmTimeMinute)
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
Layout.preferredWidth: 200
|
||||
text: "Current Time"
|
||||
onClicked: {
|
||||
UtilitiesTabController.setAlarmTimeToCurrentTime()
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
Layout.leftMargin: 50
|
||||
Layout.preferredWidth: 120
|
||||
text: "+1 Hour"
|
||||
onClicked: {
|
||||
UtilitiesTabController.modAlarmTimeHour(1)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
Layout.preferredWidth: 120
|
||||
text: "-1 Hour"
|
||||
onClicked: {
|
||||
UtilitiesTabController.modAlarmTimeHour(-1)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
text: "+5 Min"
|
||||
Layout.leftMargin: 50
|
||||
Layout.preferredWidth: 120
|
||||
onClicked: {
|
||||
UtilitiesTabController.modAlarmTimeMinute(5)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
Layout.preferredWidth: 120
|
||||
text: "-5 Min"
|
||||
onClicked: {
|
||||
UtilitiesTabController.modAlarmTimeMinute(-5)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
MyToggleButton {
|
||||
id: alarmDontAnnoyToggle
|
||||
text: "Don't Annoy me"
|
||||
onCheckedChanged: {
|
||||
UtilitiesTabController.setAlarmIsModal(!checked, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GroupBox {
|
||||
id: steamDesktopGroupBox
|
||||
Layout.fillWidth: true
|
||||
|
||||
label: MyText {
|
||||
leftPadding: 10
|
||||
text: "Steam Desktop Overlay Width"
|
||||
bottomPadding: -10
|
||||
}
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "#ffffff"
|
||||
radius: 8
|
||||
}
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle {
|
||||
color: "#ffffff"
|
||||
height: 1
|
||||
Layout.fillWidth: true
|
||||
Layout.bottomMargin: 5
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
RowLayout {
|
||||
MyPushButton2 {
|
||||
id: steamDesktopWidthMinusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "-"
|
||||
onClicked: {
|
||||
steamDesktopWidthSlider.value -= 1.0
|
||||
}
|
||||
}
|
||||
|
||||
MySlider {
|
||||
id: steamDesktopWidthSlider
|
||||
from: 0.1
|
||||
to: 32.0
|
||||
stepSize: 0.1
|
||||
value: 1.0
|
||||
Layout.fillWidth: true
|
||||
onPositionChanged: {
|
||||
var val = this.from + ( this.position * (this.to - this.from))
|
||||
steamDesktopWidthText.text = val.toFixed(1)
|
||||
}
|
||||
onValueChanged: {
|
||||
UtilitiesTabController.setSteamDesktopOverlayWidth(value, false)
|
||||
steamDesktopWidthText.text = value.toFixed(1)
|
||||
}
|
||||
}
|
||||
|
||||
MyPushButton2 {
|
||||
id: steamDesktopWidthPlusButton
|
||||
Layout.preferredWidth: 40
|
||||
text: "+"
|
||||
onClicked: {
|
||||
steamDesktopWidthSlider.value += 1.0
|
||||
}
|
||||
}
|
||||
|
||||
MyTextField {
|
||||
id: steamDesktopWidthText
|
||||
text: "0.0"
|
||||
keyBoardUID: 611
|
||||
Layout.preferredWidth: 100
|
||||
Layout.leftMargin: 10
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
function onInputEvent(input) {
|
||||
var val = parseFloat(input)
|
||||
if (!isNaN(val)) {
|
||||
if (val < 0.1) {
|
||||
val = 0.1
|
||||
}
|
||||
steamDesktopWidthSlider.value = val
|
||||
UtilitiesTabController.setSteamDesktopOverlayWidth(val, false)
|
||||
}
|
||||
text = UtilitiesTabController.steamDesktopOverlayWidth.toFixed(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillHeight: true
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
alarmClockToggle.checked = UtilitiesTabController.alarmEnabled
|
||||
alarmDontAnnoyToggle.checked = !UtilitiesTabController.alarmIsModal
|
||||
setAlarmHourText(UtilitiesTabController.alarmTimeHour)
|
||||
setAlarmMinuteText(UtilitiesTabController.alarmTimeMinute)
|
||||
alarmGroupBox.visible = !OverlayController.desktopMode
|
||||
keyboardGroupBox.visible = !OverlayController.desktopMode
|
||||
steamDesktopGroupBox.visible = UtilitiesTabController.steamDesktopOverlayAvailable
|
||||
if (steamDesktopGroupBox.visible) {
|
||||
steamDesktopWidthSlider.value = UtilitiesTabController.steamDesktopOverlayWidth
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: UtilitiesTabController
|
||||
onAlarmEnabledChanged: {
|
||||
alarmClockToggle.checked = UtilitiesTabController.alarmEnabled
|
||||
}
|
||||
onAlarmIsModalChanged: {
|
||||
alarmDontAnnoyToggle.checked = !UtilitiesTabController.alarmIsModal
|
||||
}
|
||||
onAlarmTimeHourChanged: {
|
||||
setAlarmHourText(UtilitiesTabController.alarmTimeHour)
|
||||
}
|
||||
onAlarmTimeMinuteChanged: {
|
||||
setAlarmMinuteText(UtilitiesTabController.alarmTimeMinute)
|
||||
}
|
||||
onSteamDesktopOverlayAvailableChanged: {
|
||||
steamDesktopGroupBox.visible = UtilitiesTabController.steamDesktopOverlayAvailable
|
||||
if (steamDesktopGroupBox.visible) {
|
||||
steamDesktopWidthSlider.value = UtilitiesTabController.steamDesktopOverlayWidth
|
||||
}
|
||||
}
|
||||
onSteamDesktopOverlayWidthChanged: {
|
||||
steamDesktopWidthSlider.value = UtilitiesTabController.steamDesktopOverlayWidth
|
||||
}
|
||||
}
|
||||
}
|
||||
function setAlarmHourText(value) {
|
||||
if (value < 9) {
|
||||
alarmClockHourText.text = "0" + value
|
||||
} else {
|
||||
alarmClockHourText.text = value
|
||||
}
|
||||
}
|
||||
function setAlarmMinuteText(value) {
|
||||
if (value < 9) {
|
||||
alarmClockMinuteText.text = "0" + value
|
||||
} else {
|
||||
alarmClockMinuteText.text = value
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="20"
|
||||
height="20"
|
||||
id="svg3026"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="backarrow.svg">
|
||||
<metadata
|
||||
id="metadata3038">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs3036">
|
||||
<linearGradient
|
||||
id="linearGradient4006">
|
||||
<stop
|
||||
style="stop-color:#252525;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4008" />
|
||||
<stop
|
||||
style="stop-color:#4a4a4a;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop4010" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1137"
|
||||
id="namedview3034"
|
||||
showgrid="true"
|
||||
inkscape:zoom="26.304372"
|
||||
inkscape:cx="11.841239"
|
||||
inkscape:cy="6.8249439"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g3028">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid3040" />
|
||||
</sodipodi:namedview>
|
||||
<g
|
||||
id="g3028"
|
||||
stroke-width="2.23"
|
||||
stroke="#d40000">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4003"
|
||||
style="font-size:11.38508987px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Segoe UI Symbol;-inkscape-font-specification:Segoe UI Symbol"
|
||||
d="m 1.731867,9.9956035 c 2e-5,0.7560365 0.09966,1.4842425 0.298902,2.1846165 0.199287,0.700357 0.477675,1.358232 0.835165,1.973627 0.357528,0.615372 0.786831,1.175079 1.287912,1.67912 0.501116,0.504017 1.057891,0.936251 1.67033,1.296703 0.612469,0.360426 1.270344,0.640279 1.973627,0.839561 0.703309,0.199253 1.432978,0.298886 2.18901,0.298901 0.756055,-1.5e-5 1.484259,-0.09965 2.184616,-0.298901 0.700375,-0.199282 1.355319,-0.479135 1.964834,-0.839561 0.609531,-0.360452 1.167773,-0.792686 1.674726,-1.296703 0.506965,-0.504041 0.940664,-1.063748 1.301099,-1.67912 0.360444,-0.615395 0.641762,-1.27327 0.843956,-1.973627 0.202201,-0.700374 0.3033,-1.42858 0.303296,-2.1846165 4e-6,-0.756049 -0.09963,-1.484254 -0.298901,-2.184615 -0.199263,-0.70037 -0.479116,-1.356779 -0.83956,-1.969231 -0.360435,-0.612454 -0.792669,-1.169231 -1.296704,-1.67033 -0.504022,-0.501098 -1.063729,-0.931867 -1.67912,-1.292307 -0.615377,-0.360439 -1.273251,-0.640292 -1.973626,-0.839561 -0.700357,-0.199264 -1.428561,-0.298899 -2.184616,-0.2989 -0.756032,10e-7 -1.485701,0.09964 -2.18901,0.2989 -0.703283,0.199269 -1.361158,0.477658 -1.973627,0.835165 -0.612439,0.357511 -1.169214,0.786814 -1.67033,1.287912 -0.501081,0.501099 -0.930384,1.05934 -1.287912,1.674726 -0.35749,0.615382 -0.635878,1.273256 -0.835165,1.973626 -0.199247,0.700361 -0.298882,1.428566 -0.298902,2.184615 z m 2.769231,0.035172 0,-0.035172 4.026374,-4.210988 2.918682,0 -3.068132,3.138462 6.672527,0 0,2.1802195 -6.672527,0 3.068132,3.138461 -2.918682,0 z M 0,9.9868115 c 2.0999981e-5,-0.90843 0.120171,-1.784619 0.360439,-2.628572 0.240315,-0.843958 0.58024,-1.636632 1.01978,-2.378021 0.43958,-0.741393 0.964123,-1.416851 1.573627,-2.026375 C 3.563387,2.3443225 4.238845,1.8197795 4.980218,1.3802185 5.721627,0.94065953 6.515765,0.60073453 7.362637,0.36043753 8.209538,0.12014953 9.087192,2.5255985e-6 9.995604,-4.7440151e-7 10.90404,2.5255985e-6 11.781694,0.12015453 12.628571,0.36043853 c 0.846895,0.240297 1.641033,0.577292 2.382418,1.01098997 0.741398,0.433701 1.41832,0.955312 2.030769,1.564835 0.612458,0.609524 1.138465,1.284982 1.578022,2.026374 0.439563,0.74139 0.77949,1.535528 1.01978,2.382416 0.240295,0.846883 0.360442,1.727468 0.36044,2.641759 2e-6,0.9084175 -0.120145,1.7860735 -0.36044,2.6329675 -0.24029,0.846877 -0.580217,1.641015 -1.01978,2.382417 -0.439557,0.74138 -0.965564,1.418303 -1.578022,2.03077 -0.612449,0.61244 -1.289371,1.138447 -2.030769,1.578022 -0.741385,0.439545 -1.535523,0.780937 -2.382418,1.024176 C 11.781694,19.878372 10.90404,19.999984 9.995604,20 9.087192,19.999984 8.209538,19.879837 7.362637,19.63956 6.515765,19.399252 5.721627,19.06079 4.980218,18.624176 4.238845,18.187531 3.563387,17.66299 2.953846,17.050549 2.344342,16.438082 1.819799,15.761159 1.380219,15.019779 0.940679,14.278377 0.600754,13.482774 0.360439,12.632967 0.120168,11.783143 2.0999981e-5,10.901091 0,9.9868125 z" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.1 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="270" height="270"><path d="M30 180l60 60L240 30" stroke="#000" stroke-width="30" fill="none"/></svg>
|
||||
|
After Width: | Height: | Size: 147 B |
@@ -0,0 +1,110 @@
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.0
|
||||
import QtQuick.Layouts 1.0
|
||||
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
color: "#1b2939"
|
||||
width: 1200
|
||||
height: 800
|
||||
|
||||
property RootPage rootPage: RootPage {
|
||||
stackView: mainView
|
||||
}
|
||||
|
||||
property SteamVRPage steamVRPage: SteamVRPage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
property ChaperonePage chaperonePage: ChaperonePage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
property ChaperoneWarningsPage chaperoneWarningsPage: ChaperoneWarningsPage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
property PlayspacePage playspacePage: PlayspacePage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
property FixFloorPage fixFloorPage: FixFloorPage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
property StatisticsPage statisticsPage: StatisticsPage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
property SettingsPage settingsPage: SettingsPage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
property AudioPage audioPage: AudioPage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
property RevivePage revivePage: RevivePage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
property UtilitiesPage utilitiesPage: UtilitiesPage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
property AccessibilityPage accessibilityPage: AccessibilityPage {
|
||||
stackView: mainView
|
||||
visible: false
|
||||
}
|
||||
|
||||
StackView {
|
||||
id: mainView
|
||||
anchors.fill: parent
|
||||
|
||||
pushEnter: Transition {
|
||||
PropertyAnimation {
|
||||
property: "x"
|
||||
from: mainView.width
|
||||
to: 0
|
||||
duration: 200
|
||||
}
|
||||
}
|
||||
pushExit: Transition {
|
||||
PropertyAnimation {
|
||||
property: "x"
|
||||
from: 0
|
||||
to: -mainView.width
|
||||
duration: 200
|
||||
}
|
||||
}
|
||||
popEnter: Transition {
|
||||
PropertyAnimation {
|
||||
property: "x"
|
||||
from: -mainView.width
|
||||
to: 0
|
||||
duration: 200
|
||||
}
|
||||
}
|
||||
popExit: Transition {
|
||||
PropertyAnimation {
|
||||
property: "x"
|
||||
from: 0
|
||||
to: mainView.width
|
||||
duration: 200
|
||||
}
|
||||
}
|
||||
|
||||
initialItem: rootPage
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 22 22"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="mic_off.svg">
|
||||
<metadata
|
||||
id="metadata20">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1137"
|
||||
id="namedview18"
|
||||
showgrid="false"
|
||||
inkscape:zoom="10.727273"
|
||||
inkscape:cx="-0.51271186"
|
||||
inkscape:cy="11"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2" />
|
||||
<defs
|
||||
id="defs4">
|
||||
<clipPath
|
||||
id="clipPath6">
|
||||
<path
|
||||
d="m69.63 12.145h-.052c-22.727-.292-46.47 4.077-46.709 4.122-2.424.451-4.946 2.974-5.397 5.397-.044.237-4.414 23.983-4.122 46.71-.292 22.777 4.078 46.523 4.122 46.761.451 2.423 2.974 4.945 5.398 5.398.237.044 23.982 4.413 46.709 4.121 22.779.292 46.524-4.077 46.761-4.121 2.423-.452 4.946-2.976 5.398-5.399.044-.236 4.413-23.981 4.121-46.709.292-22.777-4.077-46.523-4.121-46.761-.453-2.423-2.976-4.946-5.398-5.397-.238-.045-23.984-4.414-46.71-4.122"
|
||||
id="path8" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g
|
||||
transform="matrix(0.1327649,0,0,0.1327649,3.5653647,1.971854)"
|
||||
id="g10"
|
||||
style="fill:#ffffff">
|
||||
<path
|
||||
d="M 20.722,77.21 C 19.907,73.951 19.5,70.883 19.5,68.004 l 0,-10.43 c 0,-1.412 -0.516,-2.634 -1.548,-3.666 -1.032,-1.032 -2.254,-1.548 -3.666,-1.548 -1.413,0 -2.635,0.516 -3.667,1.548 -1.032,1.032 -1.548,2.254 -1.548,3.666 l 0,10.429 c 0,6.03 1.141,11.841 3.422,17.437 l 8.229,-8.23"
|
||||
id="path12"
|
||||
style="fill:#ffffff"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 56,94.07 c 7.17,0 13.309,-2.553 18.412,-7.657 C 79.517,81.309 82.07,75.17 82.07,68 l 0,-10.429 29.412,-29.412 c 0.543,-0.543 0.815,-1.168 0.815,-1.874 0,-0.706 -0.271,-1.331 -0.815,-1.874 l -6.68,-6.681 c -0.544,-0.544 -1.168,-0.815 -1.875,-0.815 -0.705,0 -1.33,0.271 -1.873,0.815 L 0.514,118.27 c -0.543,0.543 -0.814,1.168 -0.814,1.873 0,0.707 0.271,1.332 0.814,1.875 l 6.681,6.681 c 0.543,0.543 1.168,0.814 1.874,0.814 0.706,0 1.331,-0.271 1.874,-0.814 l 20.694,-20.694 c 5.974,3.695 12.356,5.895 19.15,6.6 l 0,10.756 -20.857,0 c -1.412,0 -2.635,0.516 -3.666,1.548 -1.032,1.032 -1.549,2.254 -1.549,3.666 0,1.411 0.517,2.635 1.549,3.666 1.031,1.032 2.254,1.549 3.666,1.549 l 52.14,0 c 1.412,0 2.635,-0.517 3.666,-1.549 1.033,-1.031 1.549,-2.255 1.549,-3.666 0,-1.412 -0.516,-2.634 -1.549,-3.666 -1.031,-1.032 -2.254,-1.548 -3.666,-1.548 l -20.856,0 0,-10.756 C 73,113.302 82.899,108.21 90.911,99.33 98.921,90.45 102.931,80.008 102.931,68 l 0,-10.431 c 0,-1.412 -0.516,-2.634 -1.547,-3.666 -1.033,-1.032 -2.255,-1.548 -3.667,-1.548 -1.412,0 -2.634,0.516 -3.666,1.548 -1.032,1.032 -1.548,2.254 -1.548,3.666 l 0,10.429 c 0,10.05 -3.572,18.643 -10.714,25.785 -7.142,7.142 -15.738,10.714 -25.786,10.714 -5.866,0 -11.433,-1.384 -16.702,-4.155 l 7.821,-7.82 c 2.934,1.031 5.894,1.546 8.881,1.546"
|
||||
id="path14"
|
||||
style="fill:#ffffff"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="M 71.03,5.02 C 66.549,1.815 61.538,0.212 56,0.212 c -7.17,0 -13.308,2.554 -18.413,7.659 -5.105,5.105 -7.658,11.243 -7.658,18.413 l 0,41.714 50.594,-50.595 C 78.676,12.353 75.513,8.224 71.032,5.02"
|
||||
id="path16"
|
||||
style="fill:#ffffff"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
@@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 22 22"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="mic_on.svg">
|
||||
<metadata
|
||||
id="metadata18">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1137"
|
||||
id="namedview16"
|
||||
showgrid="false"
|
||||
inkscape:zoom="10.727273"
|
||||
inkscape:cx="-0.51271186"
|
||||
inkscape:cy="11"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2" />
|
||||
<defs
|
||||
id="defs4">
|
||||
<clipPath
|
||||
id="clipPath6">
|
||||
<path
|
||||
d="m69.63 12.145h-.052c-22.727-.292-46.47 4.077-46.709 4.122-2.424.451-4.946 2.974-5.397 5.397-.044.237-4.414 23.983-4.122 46.71-.292 22.777 4.078 46.523 4.122 46.761.451 2.423 2.974 4.945 5.398 5.398.237.044 23.982 4.413 46.709 4.121 22.779.292 46.524-4.077 46.761-4.121 2.423-.452 4.946-2.976 5.398-5.399.044-.236 4.413-23.981 4.121-46.709.292-22.777-4.077-46.523-4.121-46.761-.453-2.423-2.976-4.946-5.398-5.397-.238-.045-23.984-4.414-46.71-4.122"
|
||||
id="path8" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g
|
||||
transform="matrix(0.13276686,0,0,0.13276686,4.7597584,1.971588)"
|
||||
id="g10"
|
||||
style="fill:#ffffff">
|
||||
<path
|
||||
d="m 47,94.07 c 7.17,0 13.307,-2.553 18.412,-7.657 C 70.517,81.309 73.07,75.17 73.07,68 l 0,-41.714 C 73.07,19.116 70.519,12.979 65.412,7.873 60.307,2.768 54.17,0.214 47,0.214 c -7.17,0 -13.307,2.554 -18.413,7.659 -5.106,5.105 -7.659,11.243 -7.659,18.413 l 0,41.714 c 0,7.17 2.554,13.309 7.659,18.413 C 33.692,91.517 39.83,94.07 47,94.07"
|
||||
id="path12"
|
||||
style="fill:#ffffff"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 92.38,53.905 c -1.03,-1.032 -2.254,-1.548 -3.666,-1.548 -1.412,0 -2.634,0.516 -3.666,1.548 -1.032,1.032 -1.548,2.254 -1.548,3.666 L 83.5,68 C 83.5,78.05 79.928,86.643 72.786,93.786 65.645,100.929 57.049,104.5 47,104.5 36.95,104.5 28.356,100.929 21.213,93.786 14.071,86.645 10.5,78.049 10.5,68 l 0,-10.429 C 10.5,56.159 9.984,54.937 8.952,53.905 7.92,52.873 6.699,52.357 5.286,52.357 c -1.413,0 -2.635,0.516 -3.667,1.548 -1.032,1.032 -1.548,2.254 -1.548,3.666 l 0,10.429 c 0,12 4.01,22.446 12.02,31.33 8.01,8.88 17.91,13.972 29.697,15.275 l 0,10.756 -20.857,0 c -1.412,0 -2.634,0.516 -3.666,1.548 -1.032,1.032 -1.548,2.254 -1.548,3.666 0,1.411 0.516,2.635 1.548,3.666 1.032,1.032 2.254,1.549 3.666,1.549 l 52.14,0 c 1.412,0 2.636,-0.517 3.666,-1.549 1.033,-1.031 1.55,-2.255 1.55,-3.666 0,-1.412 -0.517,-2.634 -1.55,-3.666 -1.03,-1.032 -2.254,-1.548 -3.666,-1.548 l -20.855,0 0,-10.756 C 64.001,113.302 73.9,108.21 81.912,99.33 89.922,90.45 93.932,80.008 93.932,68 l 0,-10.429 c 0,-1.412 -0.517,-2.633 -1.55,-3.666"
|
||||
id="path14"
|
||||
style="fill:#ffffff"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
@@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 16 22"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="ptt_notification.dvg.svg"
|
||||
width="16"
|
||||
height="22">
|
||||
<metadata
|
||||
id="metadata18">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#1b2939"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1137"
|
||||
id="namedview16"
|
||||
showgrid="false"
|
||||
inkscape:zoom="10.727273"
|
||||
inkscape:cx="-5.3865047"
|
||||
inkscape:cy="11"
|
||||
inkscape:window-x="1912"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2" />
|
||||
<defs
|
||||
id="defs4">
|
||||
<clipPath
|
||||
id="clipPath6">
|
||||
<path
|
||||
d="m 69.63,12.145 -0.052,0 c -22.727,-0.292 -46.47,4.077 -46.709,4.122 -2.424,0.451 -4.946,2.974 -5.397,5.397 -0.044,0.237 -4.414,23.983 -4.122,46.71 -0.292,22.777 4.078,46.523 4.122,46.761 0.451,2.423 2.974,4.945 5.398,5.398 0.237,0.044 23.982,4.413 46.709,4.121 22.779,0.292 46.524,-4.077 46.761,-4.121 2.423,-0.452 4.946,-2.976 5.398,-5.399 0.044,-0.236 4.413,-23.981 4.121,-46.709 0.292,-22.777 -4.077,-46.523 -4.121,-46.761 -0.453,-2.423 -2.976,-4.946 -5.398,-5.397 -0.238,-0.045 -23.984,-4.414 -46.71,-4.122"
|
||||
id="path8"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g
|
||||
transform="matrix(0.12612852,0,0,0.12612852,2.0717705,2.4230086)"
|
||||
id="g10"
|
||||
style="fill:#ffffff">
|
||||
<g
|
||||
id="g4141"
|
||||
transform="matrix(1.1111111,0,0,1.1111111,-5.2223894,-7.5557786)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff"
|
||||
id="path12"
|
||||
d="m 47,94.07 c 7.17,0 13.307,-2.553 18.412,-7.657 C 70.517,81.309 73.07,75.17 73.07,68 l 0,-41.714 C 73.07,19.116 70.519,12.979 65.412,7.873 60.307,2.768 54.17,0.214 47,0.214 c -7.17,0 -13.307,2.554 -18.413,7.659 -5.106,5.105 -7.659,11.243 -7.659,18.413 l 0,41.714 c 0,7.17 2.554,13.309 7.659,18.413 C 33.692,91.517 39.83,94.07 47,94.07" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff"
|
||||
id="path14"
|
||||
d="m 92.38,53.905 c -1.03,-1.032 -2.254,-1.548 -3.666,-1.548 -1.412,0 -2.634,0.516 -3.666,1.548 -1.032,1.032 -1.548,2.254 -1.548,3.666 L 83.5,68 C 83.5,78.05 79.928,86.643 72.786,93.786 65.645,100.929 57.049,104.5 47,104.5 36.95,104.5 28.356,100.929 21.213,93.786 14.071,86.645 10.5,78.049 10.5,68 l 0,-10.429 C 10.5,56.159 9.984,54.937 8.952,53.905 7.92,52.873 6.699,52.357 5.286,52.357 c -1.413,0 -2.635,0.516 -3.667,1.548 -1.032,1.032 -1.548,2.254 -1.548,3.666 l 0,10.429 c 0,12 4.01,22.446 12.02,31.33 8.01,8.88 17.91,13.972 29.697,15.275 l 0,10.756 -20.857,0 c -1.412,0 -2.634,0.516 -3.666,1.548 -1.032,1.032 -1.548,2.254 -1.548,3.666 0,1.411 0.516,2.635 1.548,3.666 1.032,1.032 2.254,1.549 3.666,1.549 l 52.14,0 c 1.412,0 2.636,-0.517 3.666,-1.549 1.033,-1.031 1.55,-2.255 1.55,-3.666 0,-1.412 -0.517,-2.634 -1.55,-3.666 -1.03,-1.032 -2.254,-1.548 -3.666,-1.548 l -20.855,0 0,-10.756 C 64.001,113.302 73.9,108.21 81.912,99.33 89.922,90.45 93.932,80.008 93.932,68 l 0,-10.429 c 0,-1.412 -0.517,-2.633 -1.55,-3.666" />
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
style="fill:none;stroke:#3b607a;stroke-width:0.29646081;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect3337"
|
||||
width="15.012013"
|
||||
height="21.071335"
|
||||
x="0.49399328"
|
||||
y="0.46433258" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
@@ -0,0 +1 @@
|
||||
singleton MyResources 1.0 MyResources.qml
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22"><g transform="matrix(.13811 0 0 .13811 4.955 5.808)" fill-opacity=".8"><g transform="matrix(6.5167 0 0 6.5167-28.01-34.23)"><g transform="matrix(1.17633 0 0 1.17633 1 1.589)" stroke-opacity=".85" fill="#000" stroke="none" fill-opacity="0" stroke-width=".73"><path d="m11.243 12.993c-.192 0-.384-.073-.53-.22-.293-.293-.293-.768 0-1.061 2.047-2.047 2.047-5.378 0-7.425-.293-.293-.293-.768 0-1.061.293-.293.768-.293 1.061 0 1.275 1.275 1.977 2.97 1.977 4.773 0 1.803-.702 3.498-1.977 4.773-.146.146-.338.22-.53.22z"/><path d="m8.578 11.578c-.192 0-.384-.073-.53-.22-.293-.293-.293-.768 0-1.061 1.267-1.267 1.267-3.329 0-4.596-.293-.293-.293-.768 0-1.061.293-.293.768-.293 1.061 0 1.852 1.852 1.852 4.865 0 6.718-.146.146-.338.22-.53.22z"/></g><g transform="translate(16 4)"><g fill="#f2f2f2" fill-opacity="0"><path d="m-1.773 12.874c-.226 0-.452-.086-.623-.259-.345-.345-.345-.903 0-1.248 2.408-2.408 2.408-6.326 0-8.734-.345-.345-.345-.903 0-1.248.345-.345.903-.345 1.248 0 1.5 1.5 2.326 3.494 2.326 5.615 0 2.121-.826 4.115-2.326 5.615-.172.172-.398.259-.623.259z"/><path d="m-4.908 11.209c-.226 0-.452-.086-.623-.259-.345-.345-.345-.903 0-1.248 1.49-1.49 1.49-3.916 0-5.406-.345-.345-.345-.903 0-1.248.345-.345.903-.345 1.248 0 2.179 2.179 2.179 5.723 0 7.903-.172.172-.398.259-.623.259z"/></g><path d="m-7.353 15.235c-.153 0-.303-.06-.416-.172l-4.534-4.534h-2.109c-.325 0-.588-.263-.588-.588v-5.882c0-.325.263-.588.588-.588h2.109l4.534-4.534c.168-.168.421-.219.641-.127.22.092.363.306.363.543v15.292c0 .238-.144.453-.363.543-.073.031-.149.045-.225.045" fill="#fff" fill-opacity="1"/></g></g><path d="m14.75 9.674v1.326h-1.326l-1.674-1.674-1.674 1.674h-1.326v-1.326l1.674-1.674-1.674-1.674v-1.326h1.326l1.674 1.674 1.674-1.674h1.326v1.326l-1.674 1.674 1.674 1.674" fill="#fff" fill-opacity="1" transform="matrix(8.22579 0 0 8.22579-32.543-28.351)"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22"><g transform="matrix(.90003 0 0 .90003 15.507 4.708)" fill-opacity="1" fill="#fff"><path d="m1.36 14.537c-.226 0-.452-.086-.623-.259-.345-.345-.345-.903 0-1.248 1.61-1.61 2.497-3.752 2.497-6.03 0-2.279-.887-4.419-2.497-6.03-.345-.345-.345-.903 0-1.248.345-.345.903-.345 1.248 0 1.944 1.944 3.01 4.529 3.01 7.278 0 2.749-1.07 5.333-3.01 7.278-.172.172-.398.259-.623.259"/><path d="m-1.773 12.874c-.226 0-.452-.086-.623-.259-.345-.345-.345-.903 0-1.248 2.408-2.408 2.408-6.326 0-8.734-.345-.345-.345-.903 0-1.248.345-.345.903-.345 1.248 0 1.5 1.5 2.326 3.494 2.326 5.615 0 2.121-.826 4.115-2.326 5.615-.172.172-.398.259-.623.259z"/><path d="m-4.908 11.209c-.226 0-.452-.086-.623-.259-.345-.345-.345-.903 0-1.248 1.49-1.49 1.49-3.916 0-5.406-.345-.345-.345-.903 0-1.248.345-.345.903-.345 1.248 0 2.179 2.179 2.179 5.723 0 7.903-.172.172-.398.259-.623.259z"/><path d="m-7.353 15.235c-.153 0-.303-.06-.416-.172l-4.534-4.534h-2.109c-.325 0-.588-.263-.588-.588v-5.882c0-.325.263-.588.588-.588h2.109l4.534-4.534c.168-.168.421-.219.641-.127.22.092.363.306.363.543v15.292c0 .238-.144.453-.363.543-.073.031-.149.045-.225.045"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
@@ -0,0 +1,24 @@
|
||||
@echo off
|
||||
|
||||
REM First (optional) parameter is the vr runtime path
|
||||
REM When no parameter given use default steam install location
|
||||
IF [%1] == [] (
|
||||
SET "steamVRPath=C:\Program Files (x86)\Steam\steamapps\common\SteamVR\"
|
||||
) ELSE (
|
||||
SET "steamVRPath=%~1"
|
||||
)
|
||||
echo VR Runtime Path: %steamVRPath%
|
||||
echo.
|
||||
|
||||
REM Kill vrmonitor.exe and give SteamVR some time for a graceful shutdown
|
||||
REM When no process was killed then exit (helps to prevent the taskkill clone bug)
|
||||
(taskkill /im vrmonitor.exe /f >nul 2>nul && echo Give SteamVR some time for a graceful shutdown ... && timeout /t 20) || exit
|
||||
|
||||
REM Forcefully kill all remaining processes
|
||||
taskkill /im vrcompositor.exe /f >nul 2>nul
|
||||
taskkill /im vrdashboard.exe /f >nul 2>nul
|
||||
taskkill /im vrserver.exe /f >nul 2>nul
|
||||
|
||||
REM Start vrmonitor.exe
|
||||
REM start "" "%steamVRPath%\bin\win32\vrmonitor.exe"
|
||||
start "" "%steamVRPath%\bin\win32\vrstartup.exe"
|
||||
@@ -0,0 +1 @@
|
||||
start AdvancedSettings.exe -desktop -nosound
|
||||