mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 04:57:58 +02:00
Dominant Hands Branch Initial Commit
Adds a new option in the Avatar Basics section of the Avatar Settings. API Accessible Functions: MyAvatar.getUseAlternativeHand() MyAvatar.setUseAlternativeHand() Defaults to false (Right Hand). Will return True if set to Left Hand.
This commit is contained in:
parent
bec7f7c644
commit
630922dd95
7 changed files with 199 additions and 2 deletions
71
interface/resources/qml/controls-uit/RadioButton.qml
Normal file
71
interface/resources/qml/controls-uit/RadioButton.qml
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
//
|
||||||
|
// RadioButton.qml
|
||||||
|
//
|
||||||
|
// Created by Cain Kilgore on 20th July 2017
|
||||||
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
import QtQuick 2.5
|
||||||
|
import QtQuick.Controls 1.4 as Original
|
||||||
|
import QtQuick.Controls.Styles 1.4
|
||||||
|
|
||||||
|
import "../styles-uit"
|
||||||
|
import "../controls-uit" as HifiControls
|
||||||
|
|
||||||
|
Original.RadioButton {
|
||||||
|
id: radioButton
|
||||||
|
HifiConstants { id: hifi }
|
||||||
|
|
||||||
|
property int colorScheme: hifi.colorSchemes.light
|
||||||
|
readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light
|
||||||
|
|
||||||
|
readonly property int boxSize: 14
|
||||||
|
readonly property int boxRadius: 3
|
||||||
|
readonly property int checkSize: 10
|
||||||
|
readonly property int checkRadius: 2
|
||||||
|
|
||||||
|
style: RadioButtonStyle {
|
||||||
|
indicator: Rectangle {
|
||||||
|
id: box
|
||||||
|
width: boxSize
|
||||||
|
height: boxSize
|
||||||
|
radius: boxRadius
|
||||||
|
gradient: Gradient {
|
||||||
|
GradientStop {
|
||||||
|
position: 0.2
|
||||||
|
color: pressed || hovered
|
||||||
|
? (radioButton.isLightColorScheme ? hifi.colors.checkboxDarkStart : hifi.colors.checkboxLightStart)
|
||||||
|
: (radioButton.isLightColorScheme ? hifi.colors.checkboxLightStart : hifi.colors.checkboxDarkStart)
|
||||||
|
}
|
||||||
|
GradientStop {
|
||||||
|
position: 1.0
|
||||||
|
color: pressed || hovered
|
||||||
|
? (radioButton.isLightColorScheme ? hifi.colors.checkboxDarkFinish : hifi.colors.checkboxLightFinish)
|
||||||
|
: (radioButton.isLightColorScheme ? hifi.colors.checkboxLightFinish : hifi.colors.checkboxDarkFinish)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: check
|
||||||
|
width: checkSize
|
||||||
|
height: checkSize
|
||||||
|
radius: checkRadius
|
||||||
|
anchors.centerIn: parent
|
||||||
|
color: hifi.colors.checkBoxChecked
|
||||||
|
border.width: 1
|
||||||
|
border.color: hifi.colors.checkBoxCheckedBorder
|
||||||
|
visible: checked && !pressed || !checked && pressed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label: RalewaySemiBold {
|
||||||
|
text: control.text
|
||||||
|
size: hifi.fontSizes.inputLabel
|
||||||
|
color: isLightColorScheme ? hifi.colors.lightGray : hifi.colors.lightGrayText
|
||||||
|
x: radioButton.boxSize / 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,102 @@
|
||||||
|
//
|
||||||
|
// PrimaryHandPreference.qml
|
||||||
|
//
|
||||||
|
// Created by Cain Kilgore on 20th July 2017
|
||||||
|
// Copyright 2017 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
import QtQuick 2.5
|
||||||
|
|
||||||
|
import "../../controls-uit"
|
||||||
|
|
||||||
|
Preference {
|
||||||
|
id: root
|
||||||
|
property alias box1: box1
|
||||||
|
property alias box2: box2
|
||||||
|
|
||||||
|
height: control.height + hifi.dimensions.controlInterlineHeight
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
if(preference.value) {
|
||||||
|
box1.checked = true;
|
||||||
|
} else {
|
||||||
|
box2.checked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function save() {
|
||||||
|
// Box1 = True, Box2 = False (Right Hand for Default)
|
||||||
|
if(box1.checked && !box2.checked) {
|
||||||
|
preference.value = true;
|
||||||
|
}
|
||||||
|
if(!box1.checked && box2.checked) {
|
||||||
|
preference.value = false;
|
||||||
|
}
|
||||||
|
preference.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: control
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
right: parent.right
|
||||||
|
bottom: parent.bottom
|
||||||
|
}
|
||||||
|
height: Math.max(labelName.height, box1.height, box2.height)
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: labelName
|
||||||
|
text: root.label + ":"
|
||||||
|
colorScheme: hifi.colorSchemes.dark
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
right: box1.left
|
||||||
|
rightMargin: hifi.dimensions.labelPadding
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
horizontalAlignment: Text.AlignRight
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
}
|
||||||
|
|
||||||
|
RadioButton {
|
||||||
|
id: box1
|
||||||
|
text: "Left"
|
||||||
|
width: 60
|
||||||
|
anchors {
|
||||||
|
right: box2.left
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
onClicked: {
|
||||||
|
if(box2.checked) {
|
||||||
|
box2.checked = false;
|
||||||
|
}
|
||||||
|
if(!box1.checked && !box2.checked) {
|
||||||
|
box2.checked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
colorScheme: hifi.colorSchemes.dark
|
||||||
|
}
|
||||||
|
|
||||||
|
RadioButton {
|
||||||
|
id: box2
|
||||||
|
text: "Right"
|
||||||
|
width: 60
|
||||||
|
anchors {
|
||||||
|
right: parent.right
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
onClicked: {
|
||||||
|
if(box1.checked) {
|
||||||
|
box1.checked = false;
|
||||||
|
}
|
||||||
|
if(!box1.checked && !box2.checked) {
|
||||||
|
box2.checked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
colorScheme: hifi.colorSchemes.dark
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -73,6 +73,7 @@ Preference {
|
||||||
property var buttonBuilder: Component { ButtonPreference { } }
|
property var buttonBuilder: Component { ButtonPreference { } }
|
||||||
property var comboBoxBuilder: Component { ComboBoxPreference { } }
|
property var comboBoxBuilder: Component { ComboBoxPreference { } }
|
||||||
property var spinnerSliderBuilder: Component { SpinnerSliderPreference { } }
|
property var spinnerSliderBuilder: Component { SpinnerSliderPreference { } }
|
||||||
|
property var primaryHandBuilder: Component { PrimaryHandPreference { } }
|
||||||
property var preferences: []
|
property var preferences: []
|
||||||
property int checkBoxCount: 0
|
property int checkBoxCount: 0
|
||||||
|
|
||||||
|
@ -134,6 +135,10 @@ Preference {
|
||||||
checkBoxCount = 0;
|
checkBoxCount = 0;
|
||||||
builder = spinnerSliderBuilder;
|
builder = spinnerSliderBuilder;
|
||||||
break;
|
break;
|
||||||
|
case Preference.PrimaryHand:
|
||||||
|
checkBoxCount++;
|
||||||
|
builder = primaryHandBuilder;
|
||||||
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (builder) {
|
if (builder) {
|
||||||
|
|
|
@ -926,6 +926,7 @@ void MyAvatar::saveData() {
|
||||||
Settings settings;
|
Settings settings;
|
||||||
settings.beginGroup("Avatar");
|
settings.beginGroup("Avatar");
|
||||||
|
|
||||||
|
settings.setValue("useAlternativeHand", _useAlternativeHand);
|
||||||
settings.setValue("headPitch", getHead()->getBasePitch());
|
settings.setValue("headPitch", getHead()->getBasePitch());
|
||||||
|
|
||||||
settings.setValue("scale", _targetScale);
|
settings.setValue("scale", _targetScale);
|
||||||
|
@ -1122,7 +1123,7 @@ void MyAvatar::loadData() {
|
||||||
setCollisionSoundURL(settings.value("collisionSoundURL", DEFAULT_AVATAR_COLLISION_SOUND_URL).toString());
|
setCollisionSoundURL(settings.value("collisionSoundURL", DEFAULT_AVATAR_COLLISION_SOUND_URL).toString());
|
||||||
setSnapTurn(settings.value("useSnapTurn", _useSnapTurn).toBool());
|
setSnapTurn(settings.value("useSnapTurn", _useSnapTurn).toBool());
|
||||||
setClearOverlayWhenMoving(settings.value("clearOverlayWhenMoving", _clearOverlayWhenMoving).toBool());
|
setClearOverlayWhenMoving(settings.value("clearOverlayWhenMoving", _clearOverlayWhenMoving).toBool());
|
||||||
|
setUseAlternativeHand(settings.value("useAlternativeHand", _useAlternativeHand).toBool());
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
setEnableMeshVisible(Menu::getInstance()->isOptionChecked(MenuOption::MeshVisible));
|
setEnableMeshVisible(Menu::getInstance()->isOptionChecked(MenuOption::MeshVisible));
|
||||||
|
|
|
@ -339,6 +339,9 @@ public:
|
||||||
Q_INVOKABLE bool getClearOverlayWhenMoving() const { return _clearOverlayWhenMoving; }
|
Q_INVOKABLE bool getClearOverlayWhenMoving() const { return _clearOverlayWhenMoving; }
|
||||||
Q_INVOKABLE void setClearOverlayWhenMoving(bool on) { _clearOverlayWhenMoving = on; }
|
Q_INVOKABLE void setClearOverlayWhenMoving(bool on) { _clearOverlayWhenMoving = on; }
|
||||||
|
|
||||||
|
Q_INVOKABLE void setUseAlternativeHand(bool hand) { _useAlternativeHand = hand; }
|
||||||
|
Q_INVOKABLE bool getUseAlternativeHand() const { return _useAlternativeHand; }
|
||||||
|
|
||||||
Q_INVOKABLE void setHMDLeanRecenterEnabled(bool value) { _hmdLeanRecenterEnabled = value; }
|
Q_INVOKABLE void setHMDLeanRecenterEnabled(bool value) { _hmdLeanRecenterEnabled = value; }
|
||||||
Q_INVOKABLE bool getHMDLeanRecenterEnabled() const { return _hmdLeanRecenterEnabled; }
|
Q_INVOKABLE bool getHMDLeanRecenterEnabled() const { return _hmdLeanRecenterEnabled; }
|
||||||
|
|
||||||
|
@ -424,7 +427,6 @@ public:
|
||||||
Q_INVOKABLE QString getFullAvatarModelName() const { return _fullAvatarModelName; }
|
Q_INVOKABLE QString getFullAvatarModelName() const { return _fullAvatarModelName; }
|
||||||
void resetFullAvatarURL();
|
void resetFullAvatarURL();
|
||||||
|
|
||||||
|
|
||||||
virtual void setAttachmentData(const QVector<AttachmentData>& attachmentData) override;
|
virtual void setAttachmentData(const QVector<AttachmentData>& attachmentData) override;
|
||||||
|
|
||||||
MyCharacterController* getCharacterController() { return &_characterController; }
|
MyCharacterController* getCharacterController() { return &_characterController; }
|
||||||
|
@ -720,6 +722,7 @@ private:
|
||||||
QUrl _fstAnimGraphOverrideUrl;
|
QUrl _fstAnimGraphOverrideUrl;
|
||||||
bool _useSnapTurn { true };
|
bool _useSnapTurn { true };
|
||||||
bool _clearOverlayWhenMoving { true };
|
bool _clearOverlayWhenMoving { true };
|
||||||
|
bool _useAlternativeHand{ false }; // False defaults to right hand, true to left
|
||||||
|
|
||||||
const float ROLL_CONTROL_DEAD_ZONE_DEFAULT = 8.0f; // deg
|
const float ROLL_CONTROL_DEAD_ZONE_DEFAULT = 8.0f; // deg
|
||||||
const float ROLL_CONTROL_RATE_DEFAULT = 2.5f; // deg/sec/deg
|
const float ROLL_CONTROL_RATE_DEFAULT = 2.5f; // deg/sec/deg
|
||||||
|
|
|
@ -67,6 +67,12 @@ void setupPreferences() {
|
||||||
auto setter = [=](bool value) { myAvatar->setClearOverlayWhenMoving(value); };
|
auto setter = [=](bool value) { myAvatar->setClearOverlayWhenMoving(value); };
|
||||||
preferences->addPreference(new CheckPreference(AVATAR_BASICS, "Clear overlays when moving", getter, setter));
|
preferences->addPreference(new CheckPreference(AVATAR_BASICS, "Clear overlays when moving", getter, setter));
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
auto getter = [=]()->bool { return myAvatar->getUseAlternativeHand(); };
|
||||||
|
auto setter = [=](bool value) { myAvatar->setUseAlternativeHand(value); };
|
||||||
|
preferences->addPreference(new PrimaryHandPreference(AVATAR_BASICS, "Dominant Hand", getter, setter));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// UI
|
// UI
|
||||||
static const QString UI_CATEGORY { "UI" };
|
static const QString UI_CATEGORY { "UI" };
|
||||||
|
|
|
@ -56,6 +56,7 @@ public:
|
||||||
Checkbox,
|
Checkbox,
|
||||||
Button,
|
Button,
|
||||||
ComboBox,
|
ComboBox,
|
||||||
|
PrimaryHand,
|
||||||
// Special casing for an unusual preference
|
// Special casing for an unusual preference
|
||||||
Avatar
|
Avatar
|
||||||
};
|
};
|
||||||
|
@ -339,6 +340,14 @@ public:
|
||||||
Type getType() override { return Checkbox; }
|
Type getType() override { return Checkbox; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class PrimaryHandPreference : public BoolPreference {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
PrimaryHandPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
||||||
|
: BoolPreference(category, name, getter, setter) { }
|
||||||
|
Type getType() override { return PrimaryHand; }
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue