* add nlhomann json header

* add get scene app fn

* add get current binding and related logic

* add save binding file to settings folder

* apply binding fn added fixed uid bug

* add button logic to QML, add enable Bind Setting

* add finding logic for all custom bind

* fix minor qml issues

* fix get controllername bug, fix bug with save bind

* fix regex issue

* change webrequest for selectconfig

* change to properly urlify path to send

* fix race condition web requests

* change steamvr tab qml formatting

* change color scheme

* change colors of icons to text color

* change bind qml better for better ux

* add possible workaround for space drag issues

* add deact color to pushbutton

* increment version

* adjust button size in movecenter

* move nlhomann json

* fix PKGBUILD to include missing dependency (#606) (#613)

It turns out qt5-websockets needs to be included for a successful build.

Co-authored-by: James R <71466513+ColdIce1605@users.noreply.github.com>

* fix warning

* improved logging messages around perapp bindings

* improve getsceneappID logging

* add HMD based controller Finding

* improve logging controller name

* change logging around initial chaperone calibration

* increment version

* improve logging/error handling around sceneappid failures

* added fallback for getting scene app by pid

* update version string

* update documentation

Co-authored-by: James R <71466513+ColdIce1605@users.noreply.github.com>
This commit is contained in:
ykeara
2022-07-28 16:44:22 -05:00
committed by GitHub
co-authored by James R
parent 3be11339b9
commit 65b5aace06
102 changed files with 23168 additions and 128 deletions
+44
View File
@@ -0,0 +1,44 @@
#include "ovr_application_wrapper.h"
constexpr uint32_t bufferLen = 4096;
namespace ovr_application_wrapper
{
std::string getSceneAppID()
{
uint32_t pidScene = vr::VRApplications()->GetCurrentSceneProcessId();
char key[bufferLen];
vr::EVRApplicationError error
= vr::VRApplications()->GetApplicationKeyByProcessId(
pidScene, key, bufferLen );
std::string keys = key;
if ( error != vr::VRApplicationError_None )
{
LOG( WARNING ) << "Could not Get App ID by PID: "
+ std::to_string( error );
LOG( WARNING ) << "Attempting to find through Enumeration";
auto appCount = vr::VRApplications()->GetApplicationCount();
const uint32_t bufferMax = vr::k_unMaxApplicationKeyLength;
char cStringOut[bufferMax];
for ( uint32_t i = 0; i < appCount; i++ )
{
auto error2 = vr::VRApplications()->GetApplicationKeyByIndex(
i, cStringOut, bufferMax );
std::string appID( cStringOut );
if ( appID.find( "steam.app" ) != std::string::npos )
{
LOG( WARNING ) << "Found App ID through Enumeration (only "
"steam apps caught): "
<< appID;
if ( error2 == vr::VRApplicationError_None )
{
return appID;
}
LOG( WARNING ) << "Error getting app id via Enum: " << error2;
}
}
LOG( ERROR ) << "Unable to Find App ID by PID or by Enumeration";
return "error";
}
return keys;
}
} // namespace ovr_application_wrapper
+28
View File
@@ -0,0 +1,28 @@
#pragma once
#include <openvr.h>
#include <iostream>
#include <string>
#include <easylogging++.h>
#include <utility>
#include <map>
/* Wrapper For OpenVR's IVR application class, allows us to do our error logging
* while also minimizing code
*
*/
namespace ovr_application_wrapper
{
// might make sense to mirror ovr's errors exactly, but for now this is more
// than sufficient
enum class ApplicationError
{
NoError,
UndefinedError,
};
std::string getSceneAppID();
} // namespace ovr_application_wrapper
+107
View File
@@ -231,4 +231,111 @@ std::vector<int> getAllConnectedDevices( bool onlyWearable )
return output;
}
std::string getControllerName()
{
// This call is deprecated but probably exactly what we need
int found = 0;
bool hasHMD = false;
uint32_t hmdIdx = 999;
uint32_t lftIdx = 999;
uint32_t rightIdx = 999;
for ( uint32_t i = 0; i < vr::k_unMaxTrackedDeviceCount; i++ )
{
auto trackedDeviceClass = vr::VRSystem()->GetTrackedDeviceClass( i );
if ( trackedDeviceClass == vr::TrackedDeviceClass_HMD )
{
hmdIdx = i;
hasHMD = true;
}
if ( trackedDeviceClass == vr::TrackedDeviceClass_Controller )
{
auto handRole = getInt32TrackedProperty(
i, vr::Prop_ControllerRoleHint_Int32 )
.second;
switch ( handRole )
{
case vr::TrackedControllerRole_LeftHand:
lftIdx = i;
found |= 0b100;
break;
case vr::TrackedControllerRole_RightHand:
rightIdx = i;
found |= 0b010;
break;
default:
break;
}
}
if ( found == 0b110 )
{
break;
}
}
bool isRightCon = false, isLeftCon = false;
std::string right, left;
if ( found == 0b110 || found == 0b100 )
{
isLeftCon = vr::VRSystem()->IsTrackedDeviceConnected( lftIdx );
if ( isLeftCon )
{
left = getStringTrackedProperty( lftIdx,
vr::Prop_ControllerType_String )
.second;
}
}
if ( found == 0b110 || found == 0b010 )
{
isRightCon = vr::VRSystem()->IsTrackedDeviceConnected( rightIdx );
if ( isRightCon )
{
right = getStringTrackedProperty( rightIdx,
vr::Prop_ControllerType_String )
.second;
}
}
if ( !isLeftCon && !isRightCon && hasHMD )
{
LOG( WARNING ) << "WARNING: No Controllers assuming based on HMD";
auto hmdName
= getStringTrackedProperty( hmdIdx, vr::Prop_ControllerType_String )
.second;
if ( hmdName == "indexhmd" )
{
return "knuckles";
}
if ( hmdName == "vive" )
{
return "vive_controller";
}
if ( hmdName == "vive_pro" )
{
LOG( WARNING )
<< "Vive Pro Detected, Assuming Knuckles this may be wrong";
return "knuckles";
}
if ( hmdName == "holographic_hmd" )
{
LOG( WARNING ) << "WMR detected, Assuming HP CONTROLLERS";
return "hpmotioncontroller";
}
if ( hmdName == "rift" )
{
return "oculus_touch";
}
LOG( WARNING ) << "Headset Not recognized Assuming touch controllers "
+ hmdName;
return "oculus_touch";
}
if ( right != left )
{
LOG( WARNING ) << "WARNING: Left and Right Controllers are Different, "
"Prioritizing right";
}
if ( rightIdx == 999 )
{
return left;
}
return right;
}
} // namespace ovr_system_wrapper
+1
View File
@@ -53,5 +53,6 @@ vr::ETrackedDeviceClass getDeviceClass( int index );
std::vector<int> getAllConnectedDevices( bool onlyWearable = false );
std::string getDeviceName( int index );
std::string getControllerName();
} // namespace ovr_system_wrapper
+11
View File
@@ -1275,6 +1275,17 @@ void OverlayController::mainEventLoop()
}
}
break;
case vr::VREvent_Input_ActionManifestReloaded:
{
// LOG( WARNING ) << "Action Manifest Reloaded";
if ( m_steamVRTabController.perAppBindEnabled() )
{
m_steamVRTabController.applyAllCustomBindings();
}
}
break;
default:
break;
}
}
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2013-2022 Niels Lohmann
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -4,7 +4,7 @@
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#FFFFFF;}
.st1{fill:#d9dbe0;}
</style>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st1" d="M5,8.6l5.3,3.4L5,15.4V8.6 M3,5v14l11-7L3,5z"/>

Before

Width:  |  Height:  |  Size: 598 B

After

Width:  |  Height:  |  Size: 598 B

@@ -1 +1,51 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path fill="white" d="M6 18l8.5-6L6 6v12zm2-8.14L11.03 12 8 14.14V9.86zM16 6h2v12h-2z"/></svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="24"
height="24"
viewBox="0 0 24 24"
version="1.1"
id="svg483"
sodipodi:docname="outline_skip_next_white_24dp.svg"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs487" />
<sodipodi:namedview
id="namedview485"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="41.75"
inkscape:cx="12.011976"
inkscape:cy="12"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg483" />
<path
fill="none"
d="M0 0h24v24H0V0z"
id="path479" />
<path
fill="d9dbe0"
d="M6 18l8.5-6L6 6v12zm2-8.14L11.03 12 8 14.14V9.86zM16 6h2v12h-2z"
id="path481" />
<path
style="fill:#d9dbe0;stroke-width:0.0239521"
d="M 6.011976,12.000363 V 6.0247354 l 0.3652695,0.2582853 c 0.2008982,0.1420569 2.0898204,1.4746434 4.1976045,2.9613034 2.107785,1.4866599 3.846428,2.7158709 3.863653,2.7315789 0.02493,0.02273 -0.781583,0.602286 -3.952096,2.839957 -2.1908773,1.546268 -4.093892,2.889861 -4.228922,2.985763 l -0.245509,0.174368 z m 3.5100594,1.083469 C 10.347054,12.500898 11.022723,12.013636 11.023522,12.001027 11.024783,11.981129 8.0402106,9.8562874 8.0110007,9.8562874 8.0049503,9.8562874 8,10.820958 8,12 c 0,1.179042 0.00495,2.143713 0.011001,2.143713 0.00605,0 0.6860161,-0.476947 1.5110344,-1.059881 z"
id="path558" />
<path
style="fill:#d9dbe0;stroke-width:0.0239521"
d="M 16,12 V 6 h 0.994012 0.994012 v 6 6 H 16.994012 16 Z"
id="path560" />
</svg>

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -1 +1,51 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path fill="white" d="M6 6h2v12H6zm3.5 6l8.5 6V6l-8.5 6zm6.5 2.14L12.97 12 16 9.86v4.28z"/></svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="24"
height="24"
viewBox="0 0 24 24"
version="1.1"
id="svg590"
sodipodi:docname="outline_skip_previous_white_24dp.svg"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs594" />
<sodipodi:namedview
id="namedview592"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="41.75"
inkscape:cx="12.011976"
inkscape:cy="12"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg590" />
<path
fill="none"
d="M0 0h24v24H0V0z"
id="path586" />
<path
fill="d9dbe0"
d="M6 6h2v12H6zm3.5 6l8.5 6V6l-8.5 6zm6.5 2.14L12.97 12 16 9.86v4.28z"
id="path588" />
<path
style="fill:#d9dbe0;stroke-width:0.0239521"
d="M 6.011976,12 V 6 H 7.005988 8 v 6 6 H 7.005988 6.011976 Z"
id="path596" />
<path
style="fill:#d9dbe0;stroke-width:0.0239521"
d="m 13.760479,14.992438 c -2.318563,-1.638523 -4.2121727,-2.987515 -4.2080218,-2.997761 0.00415,-0.01025 1.9038518,-1.35724 4.2215568,-2.9933189 l 4.21401,-2.9746899 v 5.9746898 c 0,3.286079 -0.0027,5.973682 -0.006,5.972451 -0.0033,-0.0012 -1.902994,-1.342849 -4.221557,-2.981371 z M 16,11.998004 c 0,-1.18014 -0.0089,-2.1421159 -0.01967,-2.1377245 -0.01082,0.00439 -0.697171,0.4870405 -1.525223,1.0725535 l -1.50555,1.064569 0.06176,0.04611 c 0.211567,0.157958 2.956098,2.096221 2.970725,2.098007 C 15.991916,14.142726 16,13.178144 16,11.998004 Z"
id="path600" />
</svg>

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -1 +1,47 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path fill="white" d="M16 8v8H8V8h8m2-2H6v12h12V6z"/></svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="24"
height="24"
viewBox="0 0 24 24"
version="1.1"
id="svg623"
sodipodi:docname="outline_stop_white_24dp.svg"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs627" />
<sodipodi:namedview
id="namedview625"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="41.75"
inkscape:cx="12.035928"
inkscape:cy="12"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg623" />
<path
fill="none"
d="M0 0h24v24H0V0z"
id="path619" />
<path
fill="d9dbe0"
d="M16 8v8H8V8h8m2-2H6v12h12V6z"
id="path621" />
<path
style="fill:#d9dbe0;stroke-width:0.0239521"
d="M 6.011976,12 V 6 H 12 17.988024 v 6 6 H 12 6.011976 Z M 16,12 V 7.988024 H 12 8 V 12 16.011976 h 4 4 z"
id="path720" />
</svg>

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 1.4 KiB

+4 -4
View File
@@ -55,21 +55,21 @@
<g
transform="matrix(0.1327649,0,0,0.1327649,3.5653647,1.971854)"
id="g10"
style="fill:#ffffff">
style="fill:#d9dbe0">
<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"
style="fill:#d9dbe0"
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"
style="fill:#d9dbe0"
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"
style="fill:#d9dbe0"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

+3 -3
View File
@@ -55,16 +55,16 @@
<g
transform="matrix(0.13276686,0,0,0.13276686,4.7597584,1.971588)"
id="g10"
style="fill:#ffffff">
style="fill:#d9dbe0">
<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"
style="fill:#d9dbe0"
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"
style="fill:#d9dbe0"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

@@ -59,18 +59,18 @@
<g
transform="matrix(0.12612852,0,0,0.12612852,2.0717705,2.4230086)"
id="g10"
style="fill:#ffffff">
style="fill:#d9dbe0">
<g
id="g4141"
transform="matrix(1.1111111,0,0,1.1111111,-5.2223894,-7.5557786)">
<path
inkscape:connector-curvature="0"
style="fill:#ffffff"
style="fill:#d9dbe0"
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"
style="fill:#d9dbe0"
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>

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

+1 -1
View File
@@ -1 +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>
<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="#d9dbe0" 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="#d9dbe0" 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="#d9dbe0" fill-opacity="1" transform="matrix(8.22579 0 0 8.22579-32.543-28.351)"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

+1 -1
View File
@@ -1 +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>
<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="#d9dbe0"><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>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

+1 -1
View File
@@ -1 +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>
<svg xmlns="http://www.w3.org/2000/svg" width="270" height="270"><path d="M30 180l60 60L240 30" stroke="#d9dbe0" stroke-width="30" fill="none"/></svg>

Before

Width:  |  Height:  |  Size: 147 B

After

Width:  |  Height:  |  Size: 150 B

@@ -3,7 +3,7 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st0{fill:#d9dbe0;}
.st1{fill:none;}
</style>
<path class="st0" d="M3,9v6h4l5,5V4L7,9H3z M16.5,12c0-1.8-1-3.3-2.5-4V16C15.5,15.3,16.5,13.8,16.5,12z M14,3.2v2.1

Before

Width:  |  Height:  |  Size: 667 B

After

Width:  |  Height:  |  Size: 667 B

@@ -3,7 +3,7 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st0{fill:#d9dbe0;}
</style>
<g>
<path class="st0" d="M21.6,6.3V19c0,1.9-1.6,3.5-3.5,3.5h-6.4c-0.9,0-1.8-0.4-2.5-1l-6.9-7c0,0,1.1-1.1,1.1-1.1

Before

Width:  |  Height:  |  Size: 807 B

After

Width:  |  Height:  |  Size: 807 B

@@ -3,7 +3,7 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st0{fill:#d9dbe0;}
.st1{fill:none;}
</style>
<path class="st0" d="M13,7h-2v2h2V7z M13,11h-2v2h2V11z M17,11h-2v2h2V11z M3,3v18h18V3H3z M19,19H5V5h14V19z M13,15h-2v2h2V15z

Before

Width:  |  Height:  |  Size: 622 B

After

Width:  |  Height:  |  Size: 622 B

@@ -3,7 +3,7 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st0{fill:#d9dbe0;}
.st1{fill:none;}
</style>
<path class="st0" d="M15.5,5.5l-1.8,1.8L12,5.5l-1.8,1.8L8.5,5.5L12,2L15.5,5.5z M18.5,15.5l-1.8-1.8l1.8-1.8l-1.8-1.8l1.8-1.8

Before

Width:  |  Height:  |  Size: 783 B

After

Width:  |  Height:  |  Size: 783 B

@@ -4,7 +4,7 @@
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#FFFFFF;}
.st1{fill:#d9dbe0;}
</style>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st1" d="M20,2H4C2.9,2,2,2.9,2,4v16c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V4C22,2.9,21.1,2,20,2z M8,20H4v-4h4V20z M8,14

Before

Width:  |  Height:  |  Size: 745 B

After

Width:  |  Height:  |  Size: 745 B

@@ -4,7 +4,7 @@
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#FFFFFF;}
.st1{fill:#d9dbe0;}
</style>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st1" d="M15.6,5.6L11,1v3.1C7.1,4.6,4,7.9,4,12s3.1,7.4,7,7.9v-2C8.2,17.4,6,15,6,12s2.2-5.4,5-5.9V10L15.6,5.6z

Before

Width:  |  Height:  |  Size: 827 B

After

Width:  |  Height:  |  Size: 827 B

@@ -4,7 +4,7 @@
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#FFFFFF;}
.st1{fill:#d9dbe0;}
</style>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st1" d="M12,10c-1.1,0-2,0.9-2,2s0.9,2,2,2s2-0.9,2-2S13.1,10,12,10z M19,3H5C3.9,3,3,3.9,3,5v14c0,1.1,0.9,2,2,2h14

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -4,7 +4,7 @@
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#FFFFFF;}
.st1{fill:#d9dbe0;}
</style>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st1" d="M3,5H1v16c0,1.1,0.9,2,2,2h16v-2H3V5z M21,1H7C5.9,1,5,1.9,5,3v14c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V3

Before

Width:  |  Height:  |  Size: 641 B

After

Width:  |  Height:  |  Size: 641 B

@@ -3,7 +3,7 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st0{fill:#d9dbe0;}
.st1{fill:none;}
</style>
<path class="st0" d="M4,10.5c-0.8,0-1.5,0.7-1.5,1.5s0.7,1.5,1.5,1.5s1.5-0.7,1.5-1.5S4.8,10.5,4,10.5z M4,4.5

Before

Width:  |  Height:  |  Size: 788 B

After

Width:  |  Height:  |  Size: 788 B

@@ -4,7 +4,7 @@
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#FFFFFF;}
.st1{fill:#d9dbe0;}
</style>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st1" d="M3,17v2h6v-2H3z M3,5v2h10V5H3z M13,21v-2h8v-2h-8v-2h-2v6H13z M7,9v2H3v2h4v2h2V9H7z M21,13v-2H11v2H21z M15,9

Before

Width:  |  Height:  |  Size: 629 B

After

Width:  |  Height:  |  Size: 629 B

@@ -4,7 +4,7 @@
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#FFFFFF;}
.st1{fill:#d9dbe0;}
</style>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st1" d="M22.7,19l-9.1-9.1c0.9-2.3,0.4-5-1.5-6.9c-2-2-5-2.4-7.4-1.3L9,6L6,9L1.6,4.7c-1.2,2.4-0.7,5.4,1.3,7.4

Before

Width:  |  Height:  |  Size: 689 B

After

Width:  |  Height:  |  Size: 689 B

@@ -3,7 +3,7 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st0{fill:#d9dbe0;}
.st1{fill:none;}
</style>
<path class="st0" d="M21,3H3C1.9,3,1,3.9,1,5v12c0,1.1,0.9,2,2,2h5v2h8v-2h5c1.1,0,2-0.9,2-2l0-12C23,3.9,22.1,3,21,3z M21,17H3V5

Before

Width:  |  Height:  |  Size: 615 B

After

Width:  |  Height:  |  Size: 615 B

+4 -4
View File
@@ -167,14 +167,14 @@ MyStackViewPage {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
ColumnLayout {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -364,7 +364,7 @@ MyStackViewPage {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -372,7 +372,7 @@ MyStackViewPage {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
+6 -6
View File
@@ -409,11 +409,11 @@ MyStackViewPage {
Rectangle {
id: summaryVersionCheckTextRect
visible: true
color: "#1b2939"
color: "#2a2e35"
MyText {
id: summaryVersionCheckText
text: ""
color: "#fffec8"
color: "#3d4450"
font.pointSize: 22
minimumPointSize: 11
fontSizeMode: Text.Fit
@@ -451,7 +451,7 @@ MyStackViewPage {
{
summaryVersionCheckTextRect.color = "#ff0000"
} else {
summaryVersionCheckTextRect.color = "#1b2939"
summaryVersionCheckTextRect.color = "#2a2e35"
}
@@ -478,7 +478,7 @@ MyStackViewPage {
{
summaryVersionCheckTextRect.color = "#ff0000"
} else {
summaryVersionCheckTextRect.color = "#1b2939"
summaryVersionCheckTextRect.color = "#2a2e35"
}
}
onVersionCheckTextChanged: {
@@ -488,14 +488,14 @@ MyStackViewPage {
if (OverlayController.disableVersionCheck)
{
summaryVersionCheckText.visible = false
summaryVersionCheckTextRect.color = "#1b2939"
summaryVersionCheckTextRect.color = "#2a2e35"
} else {
summaryVersionCheckText.visible = true
if (OverlayController.newVersionDetected)
{
summaryVersionCheckTextRect.color = "#ff0000"
} else {
summaryVersionCheckTextRect.color = "#1b2939"
summaryVersionCheckTextRect.color = "#2a2e35"
}
}
}
+2 -2
View File
@@ -157,7 +157,7 @@ MyStackViewPage {
MyTextField {
id: customTickRateText
text: "20"
keyBoardUID: 1001
keyBoardUID: 501
Layout.preferredWidth: 140
Layout.leftMargin: 10
Layout.rightMargin: 1
@@ -200,7 +200,7 @@ MyStackViewPage {
MyTextField {
id: debugStateText
text: "0"
keyBoardUID: 1002
keyBoardUID: 502
Layout.preferredWidth: 140
Layout.leftMargin: 10
Layout.rightMargin: 1
+1 -1
View File
@@ -47,7 +47,7 @@ MyStackViewPage {
MyTextField {
id: chaperoneNewProfileName
keyBoardUID: 390
color: "#cccccc"
color: "#d9dbe0"
text: ""
Layout.fillWidth: true
font.pointSize: 20
@@ -16,7 +16,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -24,7 +24,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -16,7 +16,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -24,7 +24,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -16,7 +16,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -24,7 +24,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
+1 -1
View File
@@ -34,7 +34,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
+2 -2
View File
@@ -40,10 +40,10 @@ MyComboBox {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
text: parent.text
color: parent.enabled ? "#ffffff" : "#909090"
color: parent.enabled ? "#d9dbe0" : "#65676b"
}
background: Rectangle {
color: parent.pressed ? "#406288" : (parent.hovered ? "#365473" : "#2c435d")
color: parent.pressed ? "#282b31" : (parent.hovered ? "#484f5b" : "#2a2e35")
}
}
}
+1 -1
View File
@@ -8,7 +8,7 @@ import ".."
// Insert inside a ColumnLayout containing this and a RowLayout
// to neatly separate header and buttons.
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
+2 -2
View File
@@ -76,10 +76,10 @@ MyComboBox {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
text: parent.text
color: parent.enabled ? "#ffffff" : "#909090"
color: parent.enabled ? "#d9dbe0" : "#65676b"
}
background: Rectangle {
color: parent.pressed ? "#406288" : (parent.hovered ? "#365473" : "#2c435d")
color: parent.pressed ? "#282b31" : (parent.hovered ? "#484f5b" : "#2a2e35")
}
}
}
+4 -4
View File
@@ -7,7 +7,7 @@ ComboBox {
id: myComboBox
hoverEnabled: true
background: Rectangle {
color: parent.pressed ? "#406288" : (parent.activeFocus ? "#365473" : "#2c435d")
color: parent.pressed ? "#181a1e" : (parent.activeFocus ? "#586170" : "#3d4450")
}
contentItem: MyText {
@@ -27,10 +27,10 @@ ComboBox {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
text: parent.text
color: parent.enabled ? "#ffffff" : "#909090"
color: parent.enabled ? "#d9dbe0" : "#65676b"
}
background: Rectangle {
color: parent.pressed ? "#406288" : (parent.hovered ? "#365473" : "#2c435d")
color: parent.pressed ? "#181a1e" : (parent.hovered ? "#586170" : "#3d4450")
}
}
@@ -68,6 +68,6 @@ ComboBox {
}
Component.onCompleted: {
popup.background.color = "#2c435d"
popup.background.color = "#2a2e35"
}
}
+3 -3
View File
@@ -35,8 +35,8 @@ Popup {
implicitHeight: dialogHeight
anchors.centerIn: parent
radius: 24
color: "#1b2939"
border.color: "#cccccc"
color: "#2a2e35"
border.color: "#d9dbe0"
border.width: 2
ColumnLayout {
anchors.fill: parent
@@ -47,7 +47,7 @@ Popup {
text: dialogTitle
}
Rectangle {
color: "#cccccc"
color: "#2a2e35"
height: 1
Layout.fillWidth: true
}
+3 -3
View File
@@ -35,8 +35,8 @@ Popup {
implicitHeight: dialogHeight
anchors.centerIn: parent
radius: 24
color: "#1b2939"
border.color: "#cccccc"
color: "#2a2e35"
border.color: "#d9dbe0"
border.width: 2
ColumnLayout {
anchors.fill: parent
@@ -47,7 +47,7 @@ Popup {
text: dialogTitle
}
Rectangle {
color: "#cccccc"
color: "#2a2e35"
height: 1
Layout.fillWidth: true
}
+2 -2
View File
@@ -13,10 +13,10 @@ Button {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: parent.text
color: parent.enabled ? "#ffffff" : "#909090"
color: parent.enabled ? "#d9dbe0" : "#65676b"
}
background: Rectangle {
color: parent.down ? "#406288" : (parent.activeFocus ? "#365473" : "#2c435d")
color: parent.enabled? (parent.down ? "#181a1e" : (parent.activeFocus ? "#586170" : "#3d4450")): "#181a1e"
}
Image {
+3 -3
View File
@@ -8,11 +8,11 @@ Button {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: parent.text
color: parent.enabled ? "#ffffff" : "#909090"
color: parent.enabled ? "#d9dbe0" : "#65676b"
}
background: Rectangle {
color: parent.down ? "#406288" : (parent.activeFocus ? "#365473" : "transparent")
border.color: parent.enabled ? "#ffffff" : "#909090"
color: parent.down ? "#282b31" : (parent.activeFocus ? "#484f5b" : "transparent")
border.color: parent.enabled ? "#d9dbe0" : "#65676b"
radius: 8
}
onHoveredChanged: {
+1 -1
View File
@@ -8,7 +8,7 @@ RadioButton {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: parent.text
color: parent.enabled ? "#ffffff" : "#909090"
color: parent.enabled ? "#d9dbe0" : "#65676b"
}
onHoveredChanged: {
if (hovered) {
+4 -4
View File
@@ -17,14 +17,14 @@ Slider {
width: parent.availableWidth
height: parent.availableHeight
radius: 2
color: parent.activeFocus ? "#2c435d" : "#1b2939"
color: parent.activeFocus ? "#484f5b" : "#2a2e35"
Rectangle {
y: parent.height / 2 - height / 2
implicitHeight: 4
width: parent.width
height: implicitHeight
radius: 2
color: "#bdbebf"
color: "#181a1e"
}
}
@@ -34,8 +34,8 @@ Slider {
implicitWidth: 20
implicitHeight: 40
radius: 4
color: parent.pressed ? "#ffffff" : "#eeeeee"
border.color: "#bdbebf"
color: parent.pressed ? "#586170" : "#3d4450"
border.color: "#181a1e"
}
onHoveredChanged: {
+2 -2
View File
@@ -6,7 +6,7 @@ import "." // QTBUG-34418, singletons require explicit import to load qmldir fil
import ".."
Rectangle {
color: "#1b2939"
color: "#2a2e35"
width: 1200
height: 800
@@ -33,7 +33,7 @@ Rectangle {
}
background: Rectangle {
opacity: parent.down ? 1.0 : (parent.activeFocus ? 0.5 : 0.0)
color: "#406288"
color: "#2a2e35"
radius: 4
anchors.fill: parent
}
+1 -1
View File
@@ -3,6 +3,6 @@ import QtQuick.Controls 2.0
Text {
color: "#ffffff"
color: "#d9dbe0"
font.pointSize: 20
}
+3 -3
View File
@@ -6,14 +6,14 @@ TextField {
property int keyBoardUID: 0
property string savedText: ""
id: myTextField
color: "#cccccc"
color: "#d9dbe0"
text: ""
font.pointSize: 20
background: Button {
hoverEnabled: true
background: Rectangle {
color: parent.hovered ? "#2c435d" : "#1b2939"
border.color: "#cccccc"
color: parent.hovered ? "#484f5b" : "#2a2e35"
border.color: "#d9dbe0"
border.width: 2
}
onClicked: {
+3 -3
View File
@@ -15,7 +15,7 @@ CheckBox {
implicitHeight: 28
x: parent.leftPadding
y: parent.height / 2 - height / 2
color: parent.enabled ? (parent.down ? "#e0e0e0" : "#ffffff") : "#a0a0a0"
color: parent.enabled ? (parent.down ? "#181a1e" : "#3d4450") : "#181a1e"
border.width: 0
Path {
startX: 0
@@ -43,11 +43,11 @@ CheckBox {
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
leftPadding: parent.indicator.width + parent.spacing
color: parent.enabled ? "#ffffff" : "#909090"
color: parent.enabled ? "#d9dbe0" : "#65676b"
}
background: Rectangle {
color: "#2c435d"
color: "#2a2e35"
opacity: parent.activeFocus ? 1.0 : 0
}
+1 -1
View File
@@ -14,7 +14,7 @@ import "../steamvr_page/steamvr_additional"
Rectangle {
id: root
color: "#1b2939"
color: "#2a2e35"
width: 1200
height: 800
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -89,6 +89,14 @@ GroupBox {
}
}
RowLayout{
MyPushButton{
text:"Ignore Boundary State"
Layout.preferredWidth: 300
onClicked:{
MoveCenterTabController.setIgnoreChaperoneState();
}
}
Item{
Layout.fillWidth: true
}
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 3
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 3
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 3
+4
View File
@@ -5,6 +5,7 @@ import ovras.advsettings 1.0
import "../common"
import "camera"
import "steamvrmisc"
import "steamvrbind"
MyStackViewPage {
width: 1200
@@ -17,6 +18,9 @@ MyStackViewPage {
id: steamVRMiscGroupBox}
CameraGroupBox {
id: cameraGroupBox}
SteamVRBindGroupBox{
id: steamVRBindGroupBox
}
Item { Layout.fillHeight: true; Layout.fillWidth: true}
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -102,14 +102,14 @@ MyStackViewPage {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
ColumnLayout{
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -0,0 +1,138 @@
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import ovras.advsettings 1.0
import "../../common"
GroupBox {
id: steamVRBindGroupBox
Layout.fillWidth: true
label:
MyText {
leftPadding: 10
text: "Binds:"
bottomPadding: -10
}
background: Rectangle {
color: "transparent"
border.color: "#d9dbe0"
radius: 8
}
ColumnLayout {
anchors.fill: parent
Rectangle {
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
}
RowLayout {
spacing: 16
MyToggleButton {
id: steamvrBindingToggle
text: "Enable Per-App"
Layout.preferredWidth: 250
onCheckedChanged: {
SteamVRTabController.setPerAppBindEnabled(this.checked, false)
if(!steamvrBindingToggle.checked){
appSelect.enabled = false;
setDefaultBtn.enabled = false;
setBinding.enabled = false;
}else{
appSelect.enabled = true;
setDefaultBtn.enabled = true;
setBinding.enabled = true;
}
}
}
MyText {
Layout.preferredWidth: 0
text: " "
}
MyText {
text: "Application: "
Layout.preferredWidth: 150
horizontalAlignment: Text.AlignRight
Layout.rightMargin: 2
}
MyTextField {
id: appSelect
Layout.fillWidth: true
text: "steam.overlay.1009850"
keyBoardUID: 201
Layout.leftMargin: 10
Layout.rightMargin: 10
horizontalAlignment: Text.AlignHCenter
function onInputEvent(input) {
this.text = input
}
}
MyPushButton {
id: bindingsButton
activationSoundEnabled: false
text: "Open Bindings"
Layout.preferredWidth: 180
onClicked: {
SteamVRTabController.launchBindingUI()
}
}
}
RowLayout {
spacing: 16
MyText {
text: "Save Current Binding of Selected App: "
Layout.preferredWidth: 500
horizontalAlignment: Text.AlignLeft
Layout.rightMargin: 2
}
MyPushButton {
id: setBinding
text:"For Current Game"
onClicked: {
SteamVRTabController.setBindingQMLWrapper(appSelect.text)
}
}
MyText {
Layout.preferredWidth: 50
text: " "
}
MyPushButton {
id: setDefaultBtn
text:"As Default"
onClicked: {
SteamVRTabController.setBindingQMLWrapper(appSelect.text,true)
}
}
}
}
Component.onCompleted: {
steamvrBindingToggle.checked = SteamVRTabController.perAppBindEnabled
if(!steamvrBindingToggle.checked){
appSelect.enabled = false;
setDefaultBtn.enabled = false;
setBinding.enabled = false;
}else{
appSelect.enabled = true;
setDefaultBtn.enabled = true;
setBinding.enabled = true;
}
}
Connections {
target: SteamVRTabController
onPerformanceGraphChanged:{
steamvrBindingToggle.checked = SteamVRTabController.perAppBindEnabled
}
}
}
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
ColumnLayout {
@@ -15,14 +15,14 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
ColumnLayout {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -30,7 +30,7 @@ MyPushButton2 {
background: Rectangle {
// Provides feedback for mousing over and clicking buttons.
opacity: parent.down ? 1.0 : (parent.activeFocus ? 0.5 : 0.0)
color: "#406288"
color: "#3d4450"
radius: 4
anchors.fill: parent
}
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
ColumnLayout {
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -22,7 +22,7 @@ MyDialogOkCancelPopup {
MyTextField {
id: videoNewProfileName
keyBoardUID: 990
color: "#cccccc"
color: "#d9dbe0"
text: ""
Layout.fillWidth: true
font.pointSize: 20
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -27,14 +27,14 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
ColumnLayout {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
@@ -15,7 +15,7 @@ GroupBox {
}
background: Rectangle {
color: "transparent"
border.color: "#ffffff"
border.color: "#d9dbe0"
radius: 8
}
@@ -23,7 +23,7 @@ GroupBox {
anchors.fill: parent
Rectangle {
color: "#ffffff"
color: "#d9dbe0"
height: 1
Layout.fillWidth: true
Layout.bottomMargin: 5
+5 -1
View File
@@ -419,7 +419,11 @@ private:
BoolSettingValue{ BoolSetting::ROTATION_autoturnShowNotification,
SettingCategory::Rotation,
QtInfo{ "autoturnShowNotification" },
true }
true },
BoolSettingValue{ BoolSetting::STEAMVR_perappBindEnabled,
SettingCategory::SteamVR,
QtInfo{ "perappBindEnabled" },
false }
};
constexpr static auto doubleSettingSize
@@ -17,6 +17,7 @@ enum class SettingCategory
Chaperone,
ChaperoneProfiles,
Rotation,
SteamVR,
};
struct QtInfo
@@ -56,6 +57,8 @@ struct QtInfo
return "chaperoneProfiles";
case SettingCategory::Rotation:
return "rotationSettings";
case SettingCategory::SteamVR:
return "steamVRSettings";
}
return "no-value";
}
+2 -1
View File
@@ -63,7 +63,8 @@ enum class BoolSetting
ROTATION_autoturnViewRatchettingEnabled,
ROTATION_autoturnShowNotification,
// LAST_ENUMERATOR must always be set to the last value
LAST_ENUMERATOR = ROTATION_autoturnShowNotification,
STEAMVR_perappBindEnabled,
LAST_ENUMERATOR = STEAMVR_perappBindEnabled,
};
enum class DoubleSetting
+21 -3
View File
@@ -1120,9 +1120,21 @@ void MoveCenterTabController::zeroOffsets()
// finished checking if out of bounds, proceed with normal zeroing
// offsets
if ( vr::VRChaperone()->GetCalibrationState()
== vr::ChaperoneCalibrationState_OK )
auto chaperoneState = vr::VRChaperone()->GetCalibrationState();
if ( chaperoneState < vr::ChaperoneCalibrationState_Error
|| m_ignoreChaperoneState )
{
if ( !m_chaperoneInit )
{
m_chaperoneInit = true;
LOG( INFO ) << "Chaperone Initially Calibrated";
}
if ( chaperoneState > vr::ChaperoneCalibrationState_OK )
{
LOG( WARNING )
<< "Chaperone Cal State Is warning during zero offsets: "
<< chaperoneState;
}
m_oldOffsetX = 0.0f;
m_oldOffsetY = 0.0f;
m_oldOffsetZ = 0.0f;
@@ -1180,7 +1192,6 @@ void MoveCenterTabController::zeroOffsets()
}
else
{
LOG( WARNING ) << "Chaperone not calibrated?";
if ( !m_pendingZeroOffsets )
{
LOG( INFO ) << "PENDING: Chaperone Data Update and Offsets zeroing";
@@ -3088,4 +3099,11 @@ void MoveCenterTabController::eventLoopTick(
updateSpace();
}
}
void MoveCenterTabController::setIgnoreChaperoneState()
{
m_ignoreChaperoneState = true;
LOG( INFO ) << "Ignoring Chaperone State for Zero Offsets";
}
} // namespace advsettings
@@ -161,6 +161,7 @@ private:
float m_lastControllerPosition[3];
bool m_heightToggle = false;
float m_gravityFloor = 0.0f;
bool m_ignoreChaperoneState = false;
// Set lastHandQuaternion.w to -1000.0 when last hand is invalid.
vr::HmdQuaternion_t m_lastHandQuaternion
= { k_quaternionInvalidValue, 0.0, 0.0, 0.0 };
@@ -206,6 +207,8 @@ private:
unsigned m_dragComfortFrameSkipCounter = 0;
unsigned m_turnComfortFrameSkipCounter = 0;
bool m_chaperoneInit = true;
// Matrix used For Center Marker
vr::HmdMatrix34_t m_offsetmatrix = utils::k_forwardUpMatrix;
@@ -290,6 +293,7 @@ public:
void saveOffsetProfiles();
Q_INVOKABLE unsigned getOffsetProfileCount();
Q_INVOKABLE QString getOffsetProfileName( unsigned index );
Q_INVOKABLE void setIgnoreChaperoneState();
// actions:
void leftHandSpaceDrag( bool leftHandDragActive );
+347
View File
@@ -628,4 +628,351 @@ std::vector<QString>
return dongleList;
}
// Binding Functions
void SteamVRTabController::getBindingUrlReq( std::string appID )
{
m_lastAppID = appID;
std::string urls
= "http://localhost:27062/input/getactions.json?app_key=" + appID;
QUrl url = QUrl( urls.c_str() );
QNetworkRequest request;
request.setUrl( url );
// This is Important as otherwise Valve's VRWebServerWillIgnore the Request
request.setRawHeader(
QByteArray( "Referer" ),
QByteArray(
"http://localhost:27062/dashboard/controllerbinding.html" ) );
// TODO start Timeout timer?
connect( &m_networkManagerUrl,
SIGNAL( finished( QNetworkReply* ) ),
this,
SLOT( onGetBindingUrlResponse( QNetworkReply* ) ) );
m_networkManagerUrl.get( request );
return;
}
void SteamVRTabController::onGetBindingUrlResponse( QNetworkReply* reply )
{
QString data = QString::fromUtf8( reply->readAll() );
if ( data.size() < 2 )
{
return;
}
std::string controllerName = ovr_system_wrapper::getControllerName();
if ( controllerName == "" )
{
LOG( WARNING ) << "No Controller Detected Skipping Bindings";
return;
}
json jsonfull = json::parse( data.toStdString() );
// LOG( INFO ) << "URL RESPOSNE XXXXXXX";
// LOG( INFO ) << jsonfull.dump().c_str();
std::string filepath
= jsonfull["current_binding_url"][controllerName].get<std::string>();
LOG( INFO ) << "binding url at " << filepath;
// TODO perhaps some form of error checking if packet wrong?
reply->close();
getBindingDataReq( filepath, m_lastAppID, controllerName );
return;
}
void SteamVRTabController::getBindingDataReq( std::string steamURL,
std::string appID,
std::string ctrlType )
{
std::string urls = "http://localhost:27062/input/"
"loadbindingfromurl.json?binding_url="
+ steamURL + "&controller_type=" + ctrlType
+ "&app_key=" + appID;
QUrl url = QUrl( urls.c_str() );
QNetworkRequest request;
request.setUrl( url );
// This is Important as otherwise Valve's VRWebServerWillIgnore the Request
request.setRawHeader(
QByteArray( "Referer" ),
QByteArray(
"http://localhost:27062/dashboard/controllerbinding.html" ) );
// TODO start Timeout timer?
connect( &m_networkManagerBind,
SIGNAL( finished( QNetworkReply* ) ),
this,
SLOT( onGetBindingDataResponse( QNetworkReply* ) ) );
m_networkManagerBind.get( request );
return;
}
void SteamVRTabController::onGetBindingDataResponse( QNetworkReply* reply )
{
json output = "";
QString data = QString::fromUtf8( reply->readAll() );
if ( data.size() < 2 )
{
return;
}
// LOG( WARNING ) << "DATA RESPONSE";
// LOG( WARNING ) << data.toStdString();
json jsonfull = json::parse( data.toStdString() );
if ( !jsonfull.contains( "success" ) )
{
LOG( ERROR ) << "Binding Data Packet Mal-Formed?";
}
if ( !jsonfull["success"].get<bool>() )
{
// TODO better error handling?
LOG( ERROR ) << "Binding Data Request Failed";
}
reply->close();
output = jsonfull["binding_config"];
std::string sceneAppID = ovr_application_wrapper::getSceneAppID();
if ( sceneAppID == "error" )
{
LOG( ERROR ) << "aborting bind save, could not find scene app ID";
return;
}
std::string ctrl = ovr_system_wrapper::getControllerName();
saveBind( m_lastAppID, sceneAppID, ctrl, output, m_setDefault );
return;
}
bool SteamVRTabController::saveBind( std::string appID,
std::string sceneAppID,
std::string ctrlType,
json binds,
bool def )
{
m_setDefault = false;
QFileInfo fi(
QString::fromStdString( settings::initializeAndGetSettingsPath() ) );
QDir directory = fi.absolutePath();
QString Fn;
if ( def )
{
Fn = QString::fromStdString( "defovl" + appID + "ctrl" + ctrlType
+ ".json" );
}
else
{
Fn = QString::fromStdString( "ovl" + appID + "scene" + sceneAppID
+ "ctrl" + ctrlType + ".json" );
}
QString absPath = directory.absolutePath() + "/" + Fn;
QFile bindFile( absPath );
bindFile.open( QIODevice::ReadWrite | QIODevice::Truncate
| QIODevice::Text );
QByteArray qba = binds.dump().c_str();
bindFile.write( qba );
bindFile.flush();
bindFile.close();
if ( bindFile.exists() )
{
LOG( INFO ) << ( def ? "Default " : ( sceneAppID + " " ) )
+ "Binding File saved at:"
<< absPath.toStdString();
std::string jsonstring = binds.dump().c_str();
LOG( INFO ) << jsonstring;
return true;
}
return false;
}
bool SteamVRTabController::customBindExists( std::string appID,
std::string sceneAppID,
std::string ctrl )
{
if ( appID == "" )
{
appID = m_lastAppID;
}
if ( sceneAppID == "" )
{
sceneAppID = ovr_application_wrapper::getSceneAppID();
}
if ( ctrl == "" )
{
ctrl = ovr_system_wrapper::getControllerName();
}
QFileInfo fi( QString::fromStdString(
settings::initializeAndGetSettingsPath() + "ovl" + appID + "scene"
+ sceneAppID + "ctrl" + ctrl + ".json" ) );
if ( fi.exists() )
{
return true;
}
return false;
}
bool SteamVRTabController::defBindExists( std::string appID, std::string ctrl )
{
if ( appID == "" )
{
appID = m_lastAppID;
}
if ( ctrl == "" )
{
ctrl = ovr_system_wrapper::getControllerName();
}
QFileInfo fi( QString::fromStdString(
settings::initializeAndGetSettingsPath() + "defovl" + appID + "ctrl"
+ ctrl + ".json" ) );
if ( fi.exists() )
{
return true;
}
return false;
}
void SteamVRTabController::applyBindingReq( std::string appID )
{
std::string ctrlType = ovr_system_wrapper::getControllerName();
QFileInfo fi(
QString::fromStdString( settings::initializeAndGetSettingsPath() ) );
QDir directory = fi.absolutePath();
QString Fn;
std::string sceneAppID = ovr_application_wrapper::getSceneAppID();
if ( sceneAppID == "" )
{
LOG( ERROR ) << "NO Scene App Detected unable to apply bindings";
return;
}
// TODO check forward slash compatibility with linux
Fn = QString::fromStdString( "ovl" + appID + "scene" + sceneAppID + "ctrl"
+ ctrlType + ".json" );
if ( !QFileInfo::exists( fi.absolutePath() + QString( "/" ) + Fn ) )
{
LOG( INFO ) << "No Specific Binding Detected for: " + appID
+ "for Scene: " + sceneAppID + " Checking Default";
Fn = QString::fromStdString( "defovl" + appID + "ctrl" + ctrlType
+ ".json" );
if ( !QFileInfo::exists( fi.absolutePath() + QString( "/" ) + Fn ) )
{
LOG( INFO ) << "No Def Binding Detected for: " + appID
+ " Not Adjusting Bindings";
return;
}
}
// TODO possible linux compatibility issue
QString absPath = directory.absolutePath() + "/" + Fn;
QUrl urlized = QUrl::fromLocalFile( absPath );
// std::string filePath = "file:///" + absPath.toStdString();
std::string url = "http://localhost:27062/input/selectconfig.action";
// LOG( INFO ) << urlized.toEncoded().toStdString();
QUrl urls = QUrl( url.c_str() );
QNetworkRequest request;
request.setUrl( urls );
LOG( INFO ) << "Attempting to Apply Binding at: "
<< urlized
.toEncoded( QUrl::EncodeSpaces | QUrl::EncodeReserved )
.toStdString();
// This is Important as otherwise Valve's VRWebServerWillIgnore the Request
// If referrer is wrong
request.setHeader( QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded" );
request.setRawHeader(
QByteArray( "Referer" ),
QByteArray(
"http://localhost:27062/dashboard/controllerbinding.html" ) );
QByteArray data
= ( "{\"app_key\":\"" + appID + "\",\"controller_type\":\"" + ctrlType
+ "\",\"url\":\""
+ urlized.toEncoded( QUrl::EncodeSpaces | QUrl::EncodeReserved )
.toStdString()
+ "\"}" )
.c_str();
// LOG( INFO ) << "Sending Binding Set Request";
// LOG( INFO ) << data.toStdString();
connect( &m_networkManagerApply,
SIGNAL( finished( QNetworkReply* ) ),
this,
SLOT( onApplyBindingResponse( QNetworkReply* ) ) );
m_networkManagerApply.post( request, data );
}
void SteamVRTabController::onApplyBindingResponse( QNetworkReply* reply )
{
json output = "";
QString data = QString::fromUtf8( reply->readAll() );
if ( data.size() < 2 )
{
return;
}
// LOG( INFO ) << "APPLY RESPONSE";
// LOG( INFO ) << data.toStdString();
reply->close();
json jsonfull = json::parse( data.toStdString() );
if ( !jsonfull.contains( "success" ) )
{
LOG( ERROR ) << "Apply Binding Packet Mal-Formed?";
return;
}
if ( !jsonfull["success"].get<bool>() )
{
// TODO better error handling?
LOG( ERROR ) << "Binding Failed To Apply";
}
LOG( INFO ) << "New Binding Applied";
return;
}
void SteamVRTabController::setBindingQMLWrapper( QString appID, bool def )
{
m_setDefault = def;
std::string aID = appID.toStdString();
getBindingUrlReq( aID );
}
bool SteamVRTabController::perAppBindEnabled() const
{
return settings::getSetting(
settings::BoolSetting::STEAMVR_perappBindEnabled );
}
void SteamVRTabController::setPerAppBindEnabled( bool value, bool notify )
{
settings::setSetting( settings::BoolSetting::STEAMVR_perappBindEnabled,
value );
if ( notify )
{
emit perAppBindEnabledChanged( value );
}
}
void SteamVRTabController::applyAllCustomBindings()
{
QFileInfo fi(
QString::fromStdString( settings::initializeAndGetSettingsPath() ) );
QDir directory = fi.absolutePath();
QStringList bindings = directory.entryList( QStringList() << "*.json"
<< "*.JSON",
QDir::Files );
std::set<std::string> appIDs;
std::regex r1( "ovl(.*)scene" );
std::regex r2( "defovl(.*)ctrl" );
foreach ( QString filename, bindings )
{
std::smatch m;
std::string s = filename.toStdString();
if ( regex_search( s, m, r1 ) )
{
if ( m.size() == 2 )
{
appIDs.insert( m[1].str() );
continue;
}
}
if ( regex_search( s, m, r2 ) )
{
if ( m.size() == 2 )
{
appIDs.insert( m[1].str() );
continue;
}
}
}
foreach ( std::string appID, appIDs )
{
applyBindingReq( appID );
}
}
} // namespace advsettings
+46
View File
@@ -4,6 +4,7 @@
#include <QObject>
#include "../utils/FrameRateUtils.h"
#include "../openvr/ovr_settings_wrapper.h"
#include "../openvr/ovr_application_wrapper.h"
#include "../openvr/lh_console_util.h"
#include <QStringListModel>
#include <QTableWidget>
@@ -14,7 +15,13 @@
#include <QtWebSockets/QWebSocket>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include "../../third-party/nlhomann/json.hpp"
#include <QNetworkReply>
#include <set>
#include <regex>
using namespace nlohmann;
class QQuickWindow;
// application namespace
namespace advsettings
@@ -58,6 +65,8 @@ class SteamVRTabController : public QObject
cameraRoomChanged )
Q_PROPERTY( bool cameraDashboard READ cameraDashboard WRITE
setCameraDashboard NOTIFY cameraDashboardChanged )
Q_PROPERTY( bool perAppBindEnabled READ perAppBindEnabled WRITE
setPerAppBindEnabled NOTIFY perAppBindEnabledChanged )
private:
OverlayController* parent;
@@ -67,6 +76,11 @@ private:
bool m_noFadeToGridToggle = false;
bool m_multipleDriverToggle = false;
bool m_dnd = false;
QNetworkAccessManager m_networkManagerApply;
QNetworkAccessManager m_networkManagerUrl;
QNetworkAccessManager m_networkManagerBind;
QNetworkRequest m_networkRequest;
// QNetworkReply* m_networkReply;
bool m_cameraActive = false;
bool m_cameraBounds = false;
@@ -77,6 +91,8 @@ private:
int m_dongleCountMax = 0;
QString m_unparsedDongleString = "";
QString m_last_pair_sn = "";
std::string m_lastAppID = "steam.overlay.1009850";
bool m_setDefault = false;
std::vector<DeviceInfo> m_deviceList;
@@ -85,6 +101,7 @@ private:
void synchSteamVR();
std::vector<QString> getDongleSerialList( std::string deviceString );
bool isSteamVRTracked( QString sn );
void applyBindingReq( std::string appID );
public:
void initStage1();
@@ -106,6 +123,27 @@ public:
QNetworkProxy m_proxy;
QWebSocket m_webSocket;
bool m_adjustBinding = true;
void getBindingUrlReq( std::string appID );
void getBindingDataReq( std::string steamURL,
std::string appID,
std::string ctrlType );
bool customBindExists( std::string appID = "",
std::string sceneAppID = "",
std::string ctrl = "" );
bool defBindExists( std::string appID = "", std::string ctrl = "" );
// void setCustomBind( std::string appID,
// std::string sceneAppID = "",
// std::string ctrl = "" );
bool saveBind( std::string appID,
std::string sceneAppID,
std::string ctrlType,
json binds,
bool def = false );
bool perAppBindEnabled() const;
void applyAllCustomBindings();
Q_INVOKABLE void searchRXTX();
Q_INVOKABLE void launchBindingUI();
@@ -118,6 +156,7 @@ public:
Q_INVOKABLE QString getDongleUsage();
Q_INVOKABLE void pairDevice( QString sn );
Q_INVOKABLE void updateRXTXList();
Q_INVOKABLE void setBindingQMLWrapper( QString appID, bool def = false );
public slots:
void onConnected();
@@ -134,7 +173,12 @@ public slots:
void setCameraRoom( bool value, bool notify = true );
void setCameraDashboard( bool value, bool notify = true );
void setPerAppBindEnabled( bool value, bool notify = true );
void restartSteamVR();
void onGetBindingUrlResponse( QNetworkReply* reply );
void onApplyBindingResponse( QNetworkReply* reply );
void onGetBindingDataResponse( QNetworkReply* reply );
signals:
@@ -151,6 +195,8 @@ signals:
void pairStatusChanged( QString value );
void updateRXTX( bool value );
void perAppBindEnabledChanged( bool value );
};
} // namespace advsettings