From 938959a9f631f2b41e3c4a08a1cdfde410319201 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sat, 22 Mar 2014 21:20:35 -0700 Subject: [PATCH] expose application settings to JS --- interface/src/Application.cpp | 2 ++ interface/src/Application.h | 7 +++- interface/src/Menu.cpp | 15 ++++++-- .../scripting/SettingsScriptingInterface.cpp | 36 +++++++++++++++++++ .../scripting/SettingsScriptingInterface.h | 30 ++++++++++++++++ interface/src/ui/InfoView.cpp | 11 +++--- 6 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 interface/src/scripting/SettingsScriptingInterface.cpp create mode 100644 interface/src/scripting/SettingsScriptingInterface.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 91509386e4..8a8a1961ec 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -74,6 +74,7 @@ #include "scripting/ClipboardScriptingInterface.h" #include "scripting/MenuScriptingInterface.h" +#include "scripting/SettingsScriptingInterface.h" #include "ui/InfoView.h" #include "ui/Snapshot.h" @@ -3550,6 +3551,7 @@ void Application::loadScript(const QString& fileNameString) { scriptEngine->registerGlobalObject("Overlays", &_overlays); scriptEngine->registerGlobalObject("Menu", MenuScriptingInterface::getInstance()); + scriptEngine->registerGlobalObject("Settings", SettingsScriptingInterface::getInstance()); QThread* workerThread = new QThread(this); diff --git a/interface/src/Application.h b/interface/src/Application.h index a796a700bb..10a7a6375b 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -171,7 +171,11 @@ public: Visage* getVisage() { return &_visage; } SixenseManager* getSixenseManager() { return &_sixenseManager; } BandwidthMeter* getBandwidthMeter() { return &_bandwidthMeter; } - QSettings* getSettings() { return _settings; } + + /// if you need to access the application settings, use lockSettings()/unlockSettings() + QSettings* lockSettings() { _settingsMutex.lock(); return _settings; } + void unlockSettings() { _settingsMutex.unlock(); } + QMainWindow* getWindow() { return _window; } NodeToOctreeSceneStats* getOcteeSceneStats() { return &_octreeServerSceneStats; } void lockOctreeSceneStats() { _octreeSceneStatsLock.lockForRead(); } @@ -352,6 +356,7 @@ private: DatagramProcessor _datagramProcessor; QNetworkAccessManager* _networkAccessManager; + QMutex _settingsMutex; QSettings* _settings; glm::vec3 _gravity; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index e0ed6aa055..6eb03021b3 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -374,8 +374,10 @@ Menu::~Menu() { } void Menu::loadSettings(QSettings* settings) { + bool lockedSettings = false; if (!settings) { - settings = Application::getInstance()->getSettings(); + settings = Application::getInstance()->lockSettings(); + lockedSettings = true; } _audioJitterBufferSamples = loadSetting(settings, "audioJitterBufferSamples", 0); @@ -404,11 +406,17 @@ void Menu::loadSettings(QSettings* settings) { // TODO: cache more settings in MyAvatar that are checked with very high frequency. MyAvatar* myAvatar = Application::getInstance()->getAvatar(); myAvatar->updateCollisionFlags(); + + if (lockedSettings) { + Application::getInstance()->unlockSettings(); + } } void Menu::saveSettings(QSettings* settings) { + bool lockedSettings = false; if (!settings) { - settings = Application::getInstance()->getSettings(); + settings = Application::getInstance()->lockSettings(); + lockedSettings = true; } settings->setValue("audioJitterBufferSamples", _audioJitterBufferSamples); @@ -430,6 +438,9 @@ void Menu::saveSettings(QSettings* settings) { Application::getInstance()->getAvatar()->saveData(settings); NodeList::getInstance()->saveData(settings); + if (lockedSettings) { + Application::getInstance()->unlockSettings(); + } } void Menu::importSettings() { diff --git a/interface/src/scripting/SettingsScriptingInterface.cpp b/interface/src/scripting/SettingsScriptingInterface.cpp new file mode 100644 index 0000000000..2a788c2776 --- /dev/null +++ b/interface/src/scripting/SettingsScriptingInterface.cpp @@ -0,0 +1,36 @@ +// +// SettingsScriptingInterface.cpp +// hifi +// +// Created by Brad Hefta-Gaub on 2/25/14 +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// + +#include "Application.h" +#include "SettingsScriptingInterface.h" + + +SettingsScriptingInterface* SettingsScriptingInterface::getInstance() { + static SettingsScriptingInterface sharedInstance; + return &sharedInstance; +} + +QVariant SettingsScriptingInterface::getValue(const QString& setting) { + QSettings* settings = Application::getInstance()->lockSettings(); + QVariant value = settings->value(setting); + Application::getInstance()->unlockSettings(); + return value; +} + +QVariant SettingsScriptingInterface::getValue(const QString& setting, const QVariant& defaultValue) { + QSettings* settings = Application::getInstance()->lockSettings(); + QVariant value = settings->value(setting, defaultValue); + Application::getInstance()->unlockSettings(); + return value; +} + +void SettingsScriptingInterface::setValue(const QString& setting, const QVariant& value) { + QSettings* settings = Application::getInstance()->lockSettings(); + settings->setValue(setting, value); + Application::getInstance()->unlockSettings(); +} diff --git a/interface/src/scripting/SettingsScriptingInterface.h b/interface/src/scripting/SettingsScriptingInterface.h new file mode 100644 index 0000000000..12bda2173f --- /dev/null +++ b/interface/src/scripting/SettingsScriptingInterface.h @@ -0,0 +1,30 @@ +// +// SettingsScriptingInterface.h +// hifi +// +// Created by Brad Hefta-Gaub on 3/22/14 +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// + +#ifndef __hifi__SettingsScriptingInterface__ +#define __hifi__SettingsScriptingInterface__ + +#include +#include +#include + +#include "Application.h" + +class SettingsScriptingInterface : public QObject { + Q_OBJECT + SettingsScriptingInterface() { }; +public: + static SettingsScriptingInterface* getInstance(); + +public slots: + QVariant getValue(const QString& setting); + QVariant getValue(const QString& setting, const QVariant& defaultValue); + void setValue(const QString& setting, const QVariant& value); +}; + +#endif /* defined(__hifi__SettingsScriptingInterface__) */ diff --git a/interface/src/ui/InfoView.cpp b/interface/src/ui/InfoView.cpp index fbf63666d8..8ed4da254c 100644 --- a/interface/src/ui/InfoView.cpp +++ b/interface/src/ui/InfoView.cpp @@ -38,11 +38,12 @@ void InfoView::forcedShow() { } bool InfoView::shouldShow() { + bool shouldShow = false; if (_forced) { return true; } - QSettings* settings = Application::getInstance()->getSettings(); + QSettings* settings = Application::getInstance()->lockSettings(); QString lastVersion = settings->value(SETTINGS_VERSION_KEY).toString(); @@ -51,10 +52,12 @@ bool InfoView::shouldShow() { if (version != QString::null && (lastVersion == QString::null || lastVersion != version)) { settings->setValue(SETTINGS_VERSION_KEY, version); - return true; + shouldShow = true; } else { - return false; - } + shouldShow = false; + } + Application::getInstance()->unlockSettings(); + return shouldShow; } void InfoView::loaded(bool ok) {