Merge branch 'mklim-accessibility_tab'

This commit is contained in:
2017-02-09 23:56:57 +01:00
12 changed files with 371 additions and 128 deletions
+4 -2
View File
@@ -24,7 +24,8 @@ SOURCES += src/main.cpp\
src/tabcontrollers/ReviveTabController.cpp \
src/tabcontrollers/UtilitiesTabController.cpp \
src/tabcontrollers/audiomanager/AudioManagerWindows.cpp \
src/tabcontrollers/PttController.cpp
src/tabcontrollers/PttController.cpp \
src/tabcontrollers/AccessibilityTabController.cpp
HEADERS += src/overlaycontroller.h \
src/logging.h \
@@ -39,7 +40,8 @@ HEADERS += src/overlaycontroller.h \
src/tabcontrollers/UtilitiesTabController.h \
src/tabcontrollers/AudioManager.h \
src/tabcontrollers/audiomanager/AudioManagerWindows.h \
src/tabcontrollers/PttController.h
src/tabcontrollers/PttController.h \
src/tabcontrollers/AccessibilityTabController.h
INCLUDEPATH += third-party/openvr/include \
third-party/easylogging++
+187
View File
@@ -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
}
}
}
}
+2 -92
View File
@@ -8,11 +8,6 @@ import matzman666.advsettings 1.0
MyStackViewPage {
headerText: "Play Space Settings"
PttControllerConfigDialog {
id: pttControllerConfigDialog
pttControllerConfigClass: MoveCenterTabController
}
content: ColumnLayout {
spacing: 18
@@ -68,10 +63,10 @@ MyStackViewPage {
}
}
MyTextField {
MyTextField {
id: playSpaceMoveXText
text: "0.00"
keyBoardUID: 101
keyBoardUID: 101
Layout.preferredWidth: 140
Layout.leftMargin: 10
Layout.rightMargin: 10
@@ -270,79 +265,9 @@ MyStackViewPage {
}
}
GroupBox {
Layout.fillWidth: true
label: MyText {
leftPadding: 10
text: "Push-to-Toggle Y-Axis Offset"
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 {
MyToggleButton {
id: offsetYPttEnabledToggle
Layout.preferredWidth: 260
text: "Enabled"
onClicked: {
MoveCenterTabController.pttEnabled = checked
}
}
MyToggleButton {
id: offsetYPttLeftControllerToggle
text: "Left Controller"
onClicked: {
MoveCenterTabController.setPttLeftControllerEnabled(checked, false)
}
}
MyPushButton {
text: "Configure"
onClicked: {
pttControllerConfigDialog.openPopup(0)
}
}
Item {
Layout.fillWidth: true
}
MyToggleButton {
id: offsetYPttRightControllerToggle
text: "Right Controller"
onClicked: {
MoveCenterTabController.setPttRightControllerEnabled(checked, false)
}
}
MyPushButton {
text: "Configure"
onClicked: {
pttControllerConfigDialog.openPopup(1)
}
}
}
}
}
}
MyToggleButton {
id: playspaceAdjustChaperoneToggle
text: "Adjust Chaperone"
Layout.preferredWidth: 270
onCheckedChanged: {
MoveCenterTabController.adjustChaperone = this.checked
}
@@ -380,9 +305,6 @@ MyStackViewPage {
} else {
playspaceModeText.text = "Unknown(" + MoveCenterTabController.trackingUniverse + ")"
}
offsetYPttEnabledToggle.checked = MoveCenterTabController.pttEnabled
offsetYPttLeftControllerToggle.checked = MoveCenterTabController.pttLeftControllerEnabled
offsetYPttRightControllerToggle.checked = MoveCenterTabController.pttRightControllerEnabled
}
Connections {
@@ -419,18 +341,6 @@ MyStackViewPage {
playspaceModeText.text = "Unknown(" + MoveCenterTabController.trackingUniverse + ")"
}
}
onPttEnabledChanged: {
offsetYPttEnabledToggle.checked = MoveCenterTabController.pttEnabled
}
onPttActiveChanged: {
}
onPttLeftControllerEnabledChanged: {
offsetYPttLeftControllerToggle.checked = MoveCenterTabController.pttLeftControllerEnabled
}
onPttRightControllerEnabledChanged: {
offsetYPttRightControllerToggle.checked = MoveCenterTabController.pttRightControllerEnabled
}
}
}
+11
View File
@@ -100,6 +100,17 @@ MyStackViewPage {
}
}
MyPushButton {
id: accessibilityButton
activationSoundEnabled: false
text: "Accessibility"
Layout.fillWidth: true
onClicked: {
MyResources.playFocusChangedSound()
mainView.push(accessibilityPage)
}
}
MyPushButton {
id: statisticsButton
activationSoundEnabled: false
+5
View File
@@ -58,6 +58,11 @@ Rectangle {
visible: false
}
property AccessibilityPage accessibilityPage: AccessibilityPage {
stackView: mainView
visible: false
}
StackView {
id: mainView
anchors.fill: parent
+1
View File
@@ -417,6 +417,7 @@ Delete $INSTDIR\res\qml\speaker_on.svg
Delete $INSTDIR\res\qml\StatisticsPage.qml
Delete $INSTDIR\res\qml\SteamVRPage.qml
Delete $INSTDIR\res\qml\UtilitiesPage.qml
Delete $INSTDIR\res\qml\AccessibilityPage.qml
Delete $INSTDIR\res\thumbicon.png
Delete $INSTDIR\restartvrserver.bat
Delete $INSTDIR\startdesktopmode.bat
+9 -1
View File
@@ -114,6 +114,7 @@ void OverlayController::Init(QQmlEngine* qmlEngine) {
settingsTabController.initStage1();
reviveTabController.initStage1(settingsTabController.forceRevivePage());
utilitiesTabController.initStage1();
accessibilityTabController.initStage1();
// Set qml context
qmlEngine->rootContext()->setContextProperty("applicationVersion", getVersionString());
@@ -170,6 +171,11 @@ void OverlayController::Init(QQmlEngine* qmlEngine) {
QQmlEngine::setObjectOwnership(obj, QQmlEngine::CppOwnership);
return obj;
});
qmlRegisterSingletonType<SteamVRTabController>("matzman666.advsettings", 1, 0, "AccessibilityTabController", [](QQmlEngine*, QJSEngine*) {
QObject* obj = &getInstance()->accessibilityTabController;
QQmlEngine::setObjectOwnership(obj, QQmlEngine::CppOwnership);
return obj;
});
}
void OverlayController::Shutdown() {
@@ -255,6 +261,7 @@ void OverlayController::SetWidget(QQuickItem* quickItem, const std::string& name
settingsTabController.initStage2(this, m_pWindow.get());
reviveTabController.initStage2(this, m_pWindow.get());
utilitiesTabController.initStage2(this, m_pWindow.get());
accessibilityTabController.initStage2(this, m_pWindow.get());
}
@@ -298,7 +305,7 @@ void OverlayController::OnTimeoutPumpEvents() {
break;
}
}*/
vr::TrackedDevicePose_t devicePoses[vr::k_unMaxTrackedDeviceCount];
vr::VRSystem()->GetDeviceToAbsoluteTrackingPose(vr::TrackingUniverseStanding, 0.0f, devicePoses, vr::k_unMaxTrackedDeviceCount);
fixFloorTabController.eventLoopTick(devicePoses);
@@ -310,6 +317,7 @@ void OverlayController::OnTimeoutPumpEvents() {
reviveTabController.eventLoopTick();
audioTabController.eventLoopTick();
utilitiesTabController.eventLoopTick();
accessibilityTabController.eventLoopTick(vr::VRCompositor()->GetTrackingSpace());
vr::VREvent_t vrEvent;
while (vr::VROverlay()->PollNextOverlayEvent(m_ulOverlayHandle, &vrEvent, sizeof(vrEvent))) {
+2
View File
@@ -31,6 +31,7 @@
#include "tabcontrollers/SettingsTabController.h"
#include "tabcontrollers/ReviveTabController.h"
#include "tabcontrollers/UtilitiesTabController.h"
#include "tabcontrollers/AccessibilityTabController.h"
@@ -78,6 +79,7 @@ public: // I know it's an ugly hack to make them public to enable external acces
SettingsTabController settingsTabController;
ReviveTabController reviveTabController;
UtilitiesTabController utilitiesTabController;
AccessibilityTabController accessibilityTabController;
private:
OverlayController(bool desktopMode, bool noSound) : QObject(), desktopMode(desktopMode), noSound(noSound) {}
@@ -0,0 +1,97 @@
#include "AccessibilityTabController.h"
#include <QQuickWindow>
#include "../overlaycontroller.h"
// application namespace
namespace advsettings {
void AccessibilityTabController::initStage1() {
setTrackingUniverse(vr::VRCompositor()->GetTrackingSpace());
auto settings = OverlayController::appSettings();
settings->beginGroup(getSettingsName());
auto value = settings->value("heightOffset", m_heightOffset);
settings->endGroup();
if (value.isValid() && !value.isNull()) {
m_heightOffset = value.toFloat();
emit heightOffsetChanged(m_heightOffset);
}
reloadPttConfig();
}
void AccessibilityTabController::initStage2(OverlayController * parent, QQuickWindow * widget) {
this->parent = parent;
this->widget = widget;
}
void AccessibilityTabController::setTrackingUniverse(int value) {
if (m_trackingUniverse != value) {
reset();
m_trackingUniverse = value;
}
}
float AccessibilityTabController::heightOffset() const {
return m_heightOffset;
}
void AccessibilityTabController::setHeightOffset(float value, bool notify) {
if (std::abs(m_heightOffset - value) > 0.001) {
modHeightOffset(value - m_heightOffset, notify);
}
}
void AccessibilityTabController::modHeightOffset(float value, bool notify) {
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, -value, false);
m_heightOffset += value;
auto settings = OverlayController::appSettings();
settings->beginGroup(getSettingsName());
settings->setValue("heightOffset", m_heightOffset);
settings->endGroup();
settings->sync();
if (notify) {
emit heightOffsetChanged(m_heightOffset);
}
}
void AccessibilityTabController::onPttStart() {
m_toggleHeightOffset = m_heightOffset;
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, m_toggleHeightOffset, false);
}
void AccessibilityTabController::onPttStop() {
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, -m_toggleHeightOffset, false);
}
void AccessibilityTabController::onPttDisabled() {
if (pttActive()) {
stopPtt();
}
m_toggleHeightOffset = 0;
}
void AccessibilityTabController::reset() {
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
vr::VRChaperoneSetup()->RevertWorkingCopy();
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, m_heightOffset, false, false);
vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live);
m_heightOffset = 0.0f;
emit heightOffsetChanged(m_heightOffset);
}
void AccessibilityTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe) {
if (!eventLoopMutex.try_lock()) {
return;
}
if (settingsUpdateCounter >= 50) {
setTrackingUniverse((int)universe);
settingsUpdateCounter = 0;
} else {
settingsUpdateCounter++;
}
checkPttStatus();
eventLoopMutex.unlock();
}
} // namespace advconfig
@@ -0,0 +1,50 @@
#pragma once
#include "PttController.h"
class QQuickWindow;
// application namespace
namespace advsettings {
// forward declaration
class OverlayController;
class AccessibilityTabController : public PttController {
Q_OBJECT
Q_PROPERTY(float heightOffset READ heightOffset WRITE setHeightOffset NOTIFY heightOffsetChanged)
private:
OverlayController* parent;
QQuickWindow* widget;
int m_trackingUniverse = (int)vr::TrackingUniverseStanding;
float m_heightOffset = 0.0f;
float m_toggleHeightOffset = 0.0f;
unsigned settingsUpdateCounter = 0;
QString getSettingsName() override { return "accessibilitySettings"; }
void onPttStart() override;
void onPttStop() override;
void onPttDisabled() override;
public:
void initStage1();
void initStage2(OverlayController* parent, QQuickWindow* widget);
void eventLoopTick(vr::ETrackingUniverseOrigin universe);
float heightOffset() const;
public slots:
void setTrackingUniverse(int value);
void setHeightOffset(float value, bool notify = true);
void modHeightOffset(float value, bool notify = true);
void reset();
signals:
void heightOffsetChanged(float value);
};
} // namespace advsettings
@@ -14,8 +14,6 @@ void MoveCenterTabController::initStage1() {
if (value.isValid() && !value.isNull()) {
m_adjustChaperone = value.toBool();
}
reloadPttConfig();
}
void MoveCenterTabController::initStage2(OverlayController * parent, QQuickWindow * widget) {
@@ -137,22 +135,6 @@ void MoveCenterTabController::setAdjustChaperone(bool value, bool notify) {
}
}
void MoveCenterTabController::onPttStart() {
m_toggleOffsetY = m_offsetY;
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, -m_toggleOffsetY, m_adjustChaperone);
}
void MoveCenterTabController::onPttStop() {
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 1, m_toggleOffsetY, m_adjustChaperone);
}
void MoveCenterTabController::onPttDisabled() {
if (pttActive()) {
stopPtt();
}
m_toggleOffsetY = 0;
}
void MoveCenterTabController::modOffsetX(float value, bool notify) {
if (m_rotation == 0) {
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, value, m_adjustChaperone);
@@ -194,7 +176,6 @@ void MoveCenterTabController::modOffsetZ(float value, bool notify) {
}
void MoveCenterTabController::reset() {
std::lock_guard<std::recursive_mutex> lock(eventLoopMutex);
vr::VRChaperoneSetup()->RevertWorkingCopy();
parent->RotateUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, -m_rotation * 2 * M_PI / 360.0, m_adjustChaperone, false);
parent->AddOffsetToUniverseCenter((vr::TrackingUniverseOrigin)m_trackingUniverse, 0, -m_offsetX, m_adjustChaperone, false);
@@ -203,7 +184,6 @@ void MoveCenterTabController::reset() {
vr::VRChaperoneSetup()->CommitWorkingCopy(vr::EChaperoneConfigFile_Live);
m_offsetX = 0.0f;
m_offsetY = 0.0f;
m_toggleOffsetY = 0.0f;
m_offsetZ = 0.0f;
m_rotation = 0;
emit offsetXChanged(m_offsetX);
@@ -213,17 +193,12 @@ void MoveCenterTabController::reset() {
}
void MoveCenterTabController::eventLoopTick(vr::ETrackingUniverseOrigin universe) {
if (!eventLoopMutex.try_lock()) {
return;
}
if (settingsUpdateCounter >= 50) {
setTrackingUniverse((int)universe);
settingsUpdateCounter = 0;
} else {
settingsUpdateCounter++;
}
checkPttStatus();
eventLoopMutex.unlock();
}
} // namespace advconfig
+3 -8
View File
@@ -1,7 +1,8 @@
#pragma once
#include "PttController.h"
#include <QObject>
#include <openvr.h>
class QQuickWindow;
// application namespace
@@ -11,7 +12,7 @@ namespace advsettings {
class OverlayController;
class MoveCenterTabController : public PttController {
class MoveCenterTabController : public QObject {
Q_OBJECT
Q_PROPERTY(int trackingUniverse READ trackingUniverse WRITE setTrackingUniverse NOTIFY trackingUniverseChanged)
Q_PROPERTY(float offsetX READ offsetX WRITE setOffsetX NOTIFY offsetXChanged)
@@ -27,18 +28,12 @@ private:
int m_trackingUniverse = (int)vr::TrackingUniverseStanding;
float m_offsetX = 0.0f;
float m_offsetY = 0.0f;
float m_toggleOffsetY = 0.0f;
float m_offsetZ = 0.0f;
int m_rotation = 0;
bool m_adjustChaperone = true;
unsigned settingsUpdateCounter = 0;
QString getSettingsName() override { return "playspaceSettings"; }
void onPttStart() override;
void onPttStop() override;
void onPttDisabled() override;
public:
void initStage1();
void initStage2(OverlayController* parent, QQuickWindow* widget);