mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 07:37:20 +02:00
Merge pull request #10965 from CainFoool/avatar-scaler
WL 21422 - Add a scale slider for avatar size
This commit is contained in:
commit
a9197509d8
8 changed files with 151 additions and 6 deletions
|
@ -36,7 +36,7 @@ Slider {
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: parent.height - 2
|
width: parent.height - 2
|
||||||
height: slider.value * (slider.width/(slider.maximumValue - slider.minimumValue)) - 1
|
height: slider.width * (slider.value - slider.minimumValue) / (slider.maximumValue - slider.minimumValue) - 1
|
||||||
radius: height / 2
|
radius: height / 2
|
||||||
anchors {
|
anchors {
|
||||||
top: parent.top
|
top: parent.top
|
||||||
|
|
|
@ -72,6 +72,7 @@ Preference {
|
||||||
property var avatarBuilder: Component { AvatarPreference { } }
|
property var avatarBuilder: Component { AvatarPreference { } }
|
||||||
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 preferences: []
|
property var preferences: []
|
||||||
property int checkBoxCount: 0
|
property int checkBoxCount: 0
|
||||||
|
|
||||||
|
@ -86,7 +87,7 @@ Preference {
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildPreference(preference) {
|
function buildPreference(preference) {
|
||||||
console.log("\tPreference type " + preference.type + " name " + preference.name)
|
console.log("\tPreference type " + preference.type + " name " + preference.name);
|
||||||
var builder;
|
var builder;
|
||||||
switch (preference.type) {
|
switch (preference.type) {
|
||||||
case Preference.Editable:
|
case Preference.Editable:
|
||||||
|
@ -128,6 +129,11 @@ Preference {
|
||||||
checkBoxCount = 0;
|
checkBoxCount = 0;
|
||||||
builder = comboBoxBuilder;
|
builder = comboBoxBuilder;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Preference.SpinnerSlider:
|
||||||
|
checkBoxCount = 0;
|
||||||
|
builder = spinnerSliderBuilder;
|
||||||
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (builder) {
|
if (builder) {
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
//
|
||||||
|
// SpinnerSliderPreference.qml
|
||||||
|
//
|
||||||
|
// Created by Cain Kilgore on 11th July 2017
|
||||||
|
// Copyright 2016 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 "../../dialogs"
|
||||||
|
import "../../controls-uit"
|
||||||
|
|
||||||
|
Preference {
|
||||||
|
id: root
|
||||||
|
property alias slider: slider
|
||||||
|
property alias spinner: spinner
|
||||||
|
height: control.height + hifi.dimensions.controlInterlineHeight
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
slider.value = preference.value;
|
||||||
|
spinner.value = preference.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function save() {
|
||||||
|
preference.value = slider.value;
|
||||||
|
preference.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: control
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
right: parent.right
|
||||||
|
bottom: parent.bottom
|
||||||
|
}
|
||||||
|
height: Math.max(labelText.height, slider.height, spinner.height, button.height)
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: labelText
|
||||||
|
text: root.label + ":"
|
||||||
|
colorScheme: hifi.colorSchemes.dark
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
right: slider.left
|
||||||
|
rightMargin: hifi.dimensions.labelPadding
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
horizontalAlignment: Text.AlignRight
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
}
|
||||||
|
|
||||||
|
Slider {
|
||||||
|
id: slider
|
||||||
|
value: preference.value
|
||||||
|
width: 100
|
||||||
|
minimumValue: MyAvatar.getDomainMinScale()
|
||||||
|
maximumValue: MyAvatar.getDomainMaxScale()
|
||||||
|
stepSize: preference.step
|
||||||
|
onValueChanged: {
|
||||||
|
spinner.value = value
|
||||||
|
}
|
||||||
|
anchors {
|
||||||
|
right: spinner.left
|
||||||
|
rightMargin: 10
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
colorScheme: hifi.colorSchemes.dark
|
||||||
|
}
|
||||||
|
|
||||||
|
SpinBox {
|
||||||
|
id: spinner
|
||||||
|
decimals: preference.decimals
|
||||||
|
value: preference.value
|
||||||
|
minimumValue: MyAvatar.getDomainMinScale()
|
||||||
|
maximumValue: MyAvatar.getDomainMaxScale()
|
||||||
|
width: 100
|
||||||
|
onValueChanged: {
|
||||||
|
slider.value = value;
|
||||||
|
}
|
||||||
|
anchors {
|
||||||
|
right: button.left
|
||||||
|
rightMargin: 10
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
colorScheme: hifi.colorSchemes.dark
|
||||||
|
}
|
||||||
|
|
||||||
|
GlyphButton {
|
||||||
|
id: button
|
||||||
|
onClicked: {
|
||||||
|
if (spinner.maximumValue >= 1) {
|
||||||
|
spinner.value = 1
|
||||||
|
slider.value = 1
|
||||||
|
} else {
|
||||||
|
spinner.value = spinner.maximumValue
|
||||||
|
slider.value = spinner.maximumValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
width: 30
|
||||||
|
glyph: hifi.glyphs.reload
|
||||||
|
anchors {
|
||||||
|
right: parent.right
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
colorScheme: hifi.colorSchemes.dark
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -81,6 +81,7 @@ Preference {
|
||||||
property var avatarBuilder: Component { AvatarPreference { } }
|
property var avatarBuilder: Component { AvatarPreference { } }
|
||||||
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 preferences: []
|
property var preferences: []
|
||||||
property int checkBoxCount: 0
|
property int checkBoxCount: 0
|
||||||
|
|
||||||
|
@ -143,6 +144,10 @@ Preference {
|
||||||
//to be not overlapped when drop down is active
|
//to be not overlapped when drop down is active
|
||||||
zpos = root.z + 1000 - itemNum
|
zpos = root.z + 1000 - itemNum
|
||||||
break;
|
break;
|
||||||
|
case Preference.SpinnerSlider:
|
||||||
|
checkBoxCount = 0;
|
||||||
|
builder = spinnerSliderBuilder;
|
||||||
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (builder) {
|
if (builder) {
|
||||||
|
|
|
@ -2227,6 +2227,14 @@ void MyAvatar::clampScaleChangeToDomainLimits(float desiredScale) {
|
||||||
qCDebug(interfaceapp, "Changed scale to %f", (double)_targetScale);
|
qCDebug(interfaceapp, "Changed scale to %f", (double)_targetScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float MyAvatar::getDomainMinScale() {
|
||||||
|
return _domainMinimumScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
float MyAvatar::getDomainMaxScale() {
|
||||||
|
return _domainMaximumScale;
|
||||||
|
}
|
||||||
|
|
||||||
void MyAvatar::increaseSize() {
|
void MyAvatar::increaseSize() {
|
||||||
// make sure we're starting from an allowable scale
|
// make sure we're starting from an allowable scale
|
||||||
clampTargetScaleToDomainLimits();
|
clampTargetScaleToDomainLimits();
|
||||||
|
|
|
@ -556,6 +556,8 @@ public slots:
|
||||||
void increaseSize();
|
void increaseSize();
|
||||||
void decreaseSize();
|
void decreaseSize();
|
||||||
void resetSize();
|
void resetSize();
|
||||||
|
float getDomainMinScale();
|
||||||
|
float getDomainMaxScale();
|
||||||
|
|
||||||
void goToLocation(const glm::vec3& newPosition,
|
void goToLocation(const glm::vec3& newPosition,
|
||||||
bool hasOrientation = false, const glm::quat& newOrientation = glm::quat(),
|
bool hasOrientation = false, const glm::quat& newOrientation = glm::quat(),
|
||||||
|
|
|
@ -184,12 +184,15 @@ void setupPreferences() {
|
||||||
{
|
{
|
||||||
auto getter = [=]()->float { return myAvatar->getUniformScale(); };
|
auto getter = [=]()->float { return myAvatar->getUniformScale(); };
|
||||||
auto setter = [=](float value) { myAvatar->setTargetScale(value); };
|
auto setter = [=](float value) { myAvatar->setTargetScale(value); };
|
||||||
auto preference = new SpinnerPreference(AVATAR_TUNING, "Avatar scale (default is 1.0)", getter, setter);
|
auto preference = new SpinnerSliderPreference(AVATAR_TUNING, "Avatar Scale", getter, setter);
|
||||||
preference->setMin(0.01f);
|
preference->setStep(0.05f);
|
||||||
preference->setMax(99.9f);
|
|
||||||
preference->setDecimals(2);
|
preference->setDecimals(2);
|
||||||
preference->setStep(1);
|
|
||||||
preferences->addPreference(preference);
|
preferences->addPreference(preference);
|
||||||
|
|
||||||
|
// When the Interface is first loaded, this section setupPreferences(); is loaded -
|
||||||
|
// causing the myAvatar->getDomainMinScale() and myAvatar->getDomainMaxScale() to get set to incorrect values
|
||||||
|
// which can't be changed across domain switches. Having these values loaded up when you load the Dialog each time
|
||||||
|
// is a way around this, therefore they're not specified here but in the QML.
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
auto getter = []()->float { return DependencyManager::get<DdeFaceTracker>()->getEyeClosingThreshold(); };
|
auto getter = []()->float { return DependencyManager::get<DdeFaceTracker>()->getEyeClosingThreshold(); };
|
||||||
|
|
|
@ -52,6 +52,7 @@ public:
|
||||||
Browsable,
|
Browsable,
|
||||||
Slider,
|
Slider,
|
||||||
Spinner,
|
Spinner,
|
||||||
|
SpinnerSlider,
|
||||||
Checkbox,
|
Checkbox,
|
||||||
Button,
|
Button,
|
||||||
ComboBox,
|
ComboBox,
|
||||||
|
@ -254,6 +255,15 @@ public:
|
||||||
Type getType() override { return Spinner; }
|
Type getType() override { return Spinner; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SpinnerSliderPreference : public FloatPreference {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
SpinnerSliderPreference(const QString& category, const QString& name, Getter getter, Setter setter)
|
||||||
|
: FloatPreference(category, name, getter, setter) { }
|
||||||
|
|
||||||
|
Type getType() override { return SpinnerSlider; }
|
||||||
|
};
|
||||||
|
|
||||||
class IntSpinnerPreference : public IntPreference {
|
class IntSpinnerPreference : public IntPreference {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in a new issue