Button prefs and conditionally enabled prefs

This commit is contained in:
Brad Davis 2016-01-22 19:06:30 -08:00
parent 858bbbf987
commit 71ae36f5c0
13 changed files with 96 additions and 17 deletions

View file

@ -1,7 +1,6 @@
import QtQuick 2.5
import QtQuick.Controls 1.4
import "."
import "../../../dialogs"
Preference {
@ -45,6 +44,7 @@ Preference {
Text {
id: labelText
color: enabled ? "black" : "gray"
text: root.label
}

View file

@ -1,7 +1,6 @@
import QtQuick 2.5
import QtQuick.Controls 1.4
import "."
import "../../../dialogs"
Preference {
@ -23,6 +22,7 @@ Preference {
Text {
id: labelText
color: enabled ? "black" : "gray"
text: root.label
}

View file

@ -0,0 +1,19 @@
import QtQuick 2.5
import QtQuick.Controls 1.4 as Original
import "."
import "../../../dialogs"
Preference {
id: root
height: button.height
Component.onCompleted: button.text = preference.name;
function save() { }
Original.Button {
id: button
onClicked: preference.trigger()
}
}

View file

@ -8,6 +8,7 @@ Preference {
Component.onCompleted: {
checkBox.checked = preference.value;
preference.value = Qt.binding(function(){ return checkBox.checked; });
}
function save() {

View file

@ -17,6 +17,7 @@ Preference {
Text {
id: labelText
color: enabled ? "black" : "gray"
text: root.label
}

View file

@ -6,7 +6,12 @@ Item {
anchors { left: parent.left; right: parent.right }
property var preference;
property string label: preference ? preference.name : "";
Component.onCompleted: if (preference) { preference.load(); }
Component.onCompleted: {
if (preference) {
preference.load();
enabled = Qt.binding(function() { return preference.enabled; } );
}
}
function restore() { }
}

View file

@ -70,12 +70,13 @@ Preference {
QtObject {
id: d
property var editableBuilder: Component { Editable { } }
property var browsableBuilder: Component { Browsable { } }
property var spinnerBuilder: Component { SpinBox { } }
property var checkboxBuilder: Component { CheckBox { } }
property var sliderBuilder: Component { Slider { } }
property var avatarBuilder: Component { Avatar { } }
property var editableBuilder: Component { EditablePreference { } }
property var browsableBuilder: Component { BrowsablePreference { } }
property var spinnerBuilder: Component { SpinBoxPreference { } }
property var checkboxBuilder: Component { CheckBoxPreference { } }
property var sliderBuilder: Component { SliderPreference { } }
property var avatarBuilder: Component { AvatarPreference { } }
property var buttonBuilder: Component { ButtonPreference { } }
property var preferences: []
function buildPreferences() {
@ -115,6 +116,10 @@ Preference {
case Preference.Avatar:
builder = avatarBuilder;
break;
case Preference.Button:
builder = buttonBuilder;
break
};
if (builder) {

View file

@ -20,6 +20,7 @@ Preference {
Text {
text: root.label
color: enabled ? "black" : "gray"
anchors.verticalCenter: slider.verticalCenter
}

View file

@ -19,6 +19,7 @@ Preference {
Text {
text: root.label
color: root.enabled ? "black" : "gray"
anchors.verticalCenter: spinner.verticalCenter
}

View file

@ -77,8 +77,9 @@ void setupPreferences() {
preferences->addPreference(new BrowsePreference("Scripts", "Load scripts from this directory:", getter, setter));
}
preferences->addPreference(new ButtonPreference("Scripts", "Load Default Scripts"));
preferences->addPreference(new ButtonPreference("Scripts", "Load Default Scripts", [] {
DependencyManager::get<ScriptEngines>()->loadDefaultScripts();
}));
{
auto getter = []()->bool {return !Menu::getInstance()->isOptionChecked(MenuOption::DisableActivityLogger); };
@ -87,10 +88,11 @@ void setupPreferences() {
}
static const QString LOD_TUNING("Level of Detail Tuning");
CheckPreference* acuityToggle;
{
auto getter = []()->bool { return DependencyManager::get<LODManager>()->getUseAcuity(); };
auto setter = [](bool value) { DependencyManager::get<LODManager>()->setUseAcuity(value); };
preferences->addPreference(new CheckPreference(LOD_TUNING, "Render based on visual acuity", getter, setter));
preferences->addPreference(acuityToggle = new CheckPreference(LOD_TUNING, "Render based on visual acuity", getter, setter));
}
{
@ -100,6 +102,7 @@ void setupPreferences() {
preference->setMin(0);
preference->setMax(120);
preference->setStep(1);
preference->setEnabler(acuityToggle);
preferences->addPreference(preference);
}
@ -110,6 +113,7 @@ void setupPreferences() {
preference->setMin(0);
preference->setMax(120);
preference->setStep(1);
preference->setEnabler(acuityToggle);
preferences->addPreference(preference);
}
@ -120,6 +124,7 @@ void setupPreferences() {
preference->setMin(5);
preference->setMax(32768);
preference->setStep(1);
preference->setEnabler(acuityToggle, true);
preferences->addPreference(preference);
}

View file

@ -28,3 +28,24 @@ void Preferences::addPreference(Preference* preference) {
_preferencesByCategory[category] = categoryPreferences;
}
void Preference::setEnabler(BoolPreference* enabler, bool inverse) {
if (_enabler) {
disconnect(_enabler);
_enabler = nullptr;
}
_enabler = enabler;
_enablerInverted = inverse;
if (_enabler) {
connect(_enabler, &BoolPreference::valueChanged, this, &Preference::onEnablerValueChanged);
onEnablerValueChanged();
}
}
void Preference::onEnablerValueChanged() {
bool value = _enabler->getValue();
if (_enablerInverted) {
value = !value;
}
setEnabled(value);
}

View file

@ -35,6 +35,8 @@ private:
QList<QString> _categories;
};
class BoolPreference;
class Preference : public QObject {
Q_OBJECT
Q_PROPERTY(QString category READ getCategory CONSTANT)
@ -73,6 +75,8 @@ public:
}
}
void setEnabler(BoolPreference* enabler, bool inverse = false);
virtual Type getType() { return Invalid; };
Q_INVOKABLE virtual void load() {};
@ -81,21 +85,30 @@ public:
signals:
void enabledChanged();
private slots:
void onEnablerValueChanged();
protected:
virtual void emitValueChanged() {};
BoolPreference* _enabler { nullptr };
const QString _category;
const QString _name;
bool _enabled { true };
bool _enablerInverted { false };
};
class ButtonPreference : public Preference {
Q_OBJECT
public:
ButtonPreference(const QString& category, const QString& name)
: Preference(category, name) { }
using Lambda = std::function<void()>;
ButtonPreference(const QString& category, const QString& name, Lambda triggerHandler)
: Preference(category, name), _triggerHandler(triggerHandler) { }
Type getType() { return Button; }
Q_INVOKABLE void trigger() { _triggerHandler(); }
protected:
const Lambda _triggerHandler;
};
@ -108,7 +121,7 @@ public:
TypedPreference(const QString& category, const QString& name, Getter getter, Setter setter)
: Preference(category, name), _getter(getter), _setter(setter) { }
T getValue() const { return _getter(); }
T getValue() const { return _value; }
void setValue(const T& value) { if (_value != value) { _value = value; emitValueChanged(); } }
void load() override { _value = _getter(); }
void save() const override {

View file

@ -96,12 +96,19 @@ DISTFILES += \
../../interface/resources/qml/hifi/dialogs/preferences/Editable.qml \
../../interface/resources/qml/hifi/dialogs/preferences/Slider.qml \
../../interface/resources/qml/hifi/dialogs/preferences/Preference.qml \
../../interface/resources/qml/hifi/dialogs/preferences/SpinBox.qml \
../../interface/resources/qml/hifi/dialogs/preferences/CheckBox.qml \
../../interface/resources/qml/dialogs/fileDialog/FileTableView.qml \
../../interface/resources/qml/hifi/dialogs/preferences/Avatar.qml \
../../interface/resources/qml/hifi/dialogs/preferences/AvatarBrowser.qml \
../../interface/resources/qml/dialogs/QueryDialog.qml
../../interface/resources/qml/dialogs/QueryDialog.qml \
../../interface/resources/qml/hifi/dialogs/preferences/Button.qml \
../../interface/resources/qml/hifi/dialogs/preferences/AvatarPreference.qml \
../../interface/resources/qml/hifi/dialogs/preferences/BrowsablePreference.qml \
../../interface/resources/qml/hifi/dialogs/preferences/ButtonPreference.qml \
../../interface/resources/qml/hifi/dialogs/preferences/CheckBoxPreference.qml \
../../interface/resources/qml/hifi/dialogs/preferences/EditablePreference.qml \
../../interface/resources/qml/hifi/dialogs/preferences/SliderPreference.qml \
../../interface/resources/qml/hifi/dialogs/preferences/SpinBoxPreference.qml
HEADERS += \
../../libraries/ui/src/FileDialogHelper.h