From 5db78ef2e15ea1ee05c817074517c55e6fc396ac Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 15 May 2019 12:55:25 -0700 Subject: [PATCH 1/7] Add scripting to set the refresh rate --- interface/src/Application.cpp | 6 ++- interface/src/RefreshRateManager.cpp | 5 --- interface/src/RefreshRateManager.h | 1 + .../PerformanceScriptingInterface.cpp | 28 ++++++++++++ .../scripting/PerformanceScriptingInterface.h | 43 +++++++++++++++++++ 5 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 interface/src/scripting/PerformanceScriptingInterface.cpp create mode 100644 interface/src/scripting/PerformanceScriptingInterface.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d8df9ea62d..7f429d9765 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -193,6 +193,7 @@ #include "scripting/TTSScriptingInterface.h" #include "scripting/KeyboardScriptingInterface.h" #include "scripting/RefreshRateScriptingInterface.h" +#include "scripting/PerformanceScriptingInterface.h" @@ -3280,6 +3281,7 @@ void Application::onDesktopRootContextCreated(QQmlContext* surfaceContext) { surfaceContext->setContextProperty("Controller", DependencyManager::get().data()); surfaceContext->setContextProperty("Entities", DependencyManager::get().data()); surfaceContext->setContextProperty("RefreshRate", new RefreshRateScriptingInterface()); + surfaceContext->setContextProperty("Performance", new PerformanceScriptingInterface()); _fileDownload = new FileScriptingInterface(engine); surfaceContext->setContextProperty("File", _fileDownload); connect(_fileDownload, &FileScriptingInterface::unzipResult, this, &Application::handleUnzip); @@ -3430,6 +3432,7 @@ void Application::setupQmlSurface(QQmlContext* surfaceContext, bool setAdditiona surfaceContext->setContextProperty("Settings", SettingsScriptingInterface::getInstance()); surfaceContext->setContextProperty("MenuInterface", MenuScriptingInterface::getInstance()); surfaceContext->setContextProperty("RefreshRate", new RefreshRateScriptingInterface()); + surfaceContext->setContextProperty("Performance", new PerformanceScriptingInterface()); surfaceContext->setContextProperty("Account", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED surfaceContext->setContextProperty("GlobalServices", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED @@ -7413,7 +7416,8 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEnginePointe scriptEngine->registerGlobalObject("LODManager", DependencyManager::get().data()); scriptEngine->registerGlobalObject("Keyboard", DependencyManager::get().data()); - scriptEngine->registerGlobalObject("RefreshRate", new RefreshRateScriptingInterface); + scriptEngine->registerGlobalObject("RefreshRate", new RefreshRateScriptingInterface()); + scriptEngine->registerGlobalObject("Performance", new PerformanceScriptingInterface()); scriptEngine->registerGlobalObject("Paths", DependencyManager::get().data()); diff --git a/interface/src/RefreshRateManager.cpp b/interface/src/RefreshRateManager.cpp index 0c5bcd405e..f2033b9491 100644 --- a/interface/src/RefreshRateManager.cpp +++ b/interface/src/RefreshRateManager.cpp @@ -13,13 +13,8 @@ #include "RefreshRateManager.h" #include -#include -#include - -#include - static const int VR_TARGET_RATE = 90; static const std::array REFRESH_RATE_PROFILE_TO_STRING = diff --git a/interface/src/RefreshRateManager.h b/interface/src/RefreshRateManager.h index 6ded8c8869..6316de3bfb 100644 --- a/interface/src/RefreshRateManager.h +++ b/interface/src/RefreshRateManager.h @@ -14,6 +14,7 @@ #include #include +#include #include diff --git a/interface/src/scripting/PerformanceScriptingInterface.cpp b/interface/src/scripting/PerformanceScriptingInterface.cpp new file mode 100644 index 0000000000..53529beeef --- /dev/null +++ b/interface/src/scripting/PerformanceScriptingInterface.cpp @@ -0,0 +1,28 @@ +// +// Created by Bradley Austin Davis on 2019/05/14 +// Copyright 2013-2019 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 +// + + +#include "PerformanceScriptingInterface.h" + +#include "../Application.h" + +std::once_flag PerformanceScriptingInterface::registry_flag; + +PerformanceScriptingInterface::PerformanceScriptingInterface() { + std::call_once(registry_flag, [] { + qmlRegisterType("PerformanceEnums", 1, 0, "RefreshRate"); + }); +} + +void PerformanceScriptingInterface::setRefreshRateProfile(RefreshRateProfile refreshRateProfile) { + qApp->getRefreshRateManager().setRefreshRateProfile((RefreshRateManager::RefreshRateProfile)refreshRateProfile); +} + +PerformanceScriptingInterface::RefreshRateProfile PerformanceScriptingInterface::getRefreshRateProfile() const { + return (PerformanceScriptingInterface::RefreshRateProfile)qApp->getRefreshRateManager().getRefreshRateProfile(); +} diff --git a/interface/src/scripting/PerformanceScriptingInterface.h b/interface/src/scripting/PerformanceScriptingInterface.h new file mode 100644 index 0000000000..266fa7229f --- /dev/null +++ b/interface/src/scripting/PerformanceScriptingInterface.h @@ -0,0 +1,43 @@ +// +// Created by Bradley Austin Davis on 2019/05/14 +// Copyright 2013-2019 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 +// + +#pragma once +#ifndef hifi_PerformanceScriptingInterface_h +#define hifi_PerformanceScriptingInterface_h + +#include + +#include + +#include "../RefreshRateManager.h" + + +class PerformanceScriptingInterface : public QObject { + Q_OBJECT +public: + // Must match RefreshRateManager enums + enum RefreshRateProfile { + ECO = RefreshRateManager::RefreshRateProfile::ECO, + INTERACTIVE = RefreshRateManager::RefreshRateProfile::INTERACTIVE, + REALTIME = RefreshRateManager::RefreshRateProfile::REALTIME, + }; + Q_ENUM(RefreshRateProfile) + + + PerformanceScriptingInterface(); + ~PerformanceScriptingInterface() = default; + +public slots: + void setRefreshRateProfile(RefreshRateProfile refreshRateProfile); + RefreshRateProfile getRefreshRateProfile() const; + +private: + static std::once_flag registry_flag; +}; + +#endif // header guard From 8c375db90f3185263c4180db78cc495d4968f199 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 15 May 2019 12:55:47 -0700 Subject: [PATCH 2/7] Add display plugin introspection to the window scripting interface --- .../scripting/WindowScriptingInterface.cpp | 33 ++++++++++++++++ .../src/scripting/WindowScriptingInterface.h | 38 +++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index 2c1311924f..e1272d68a7 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include "AndroidHelper.h" @@ -609,3 +610,35 @@ void WindowScriptingInterface::onMessageBoxSelected(int button) { float WindowScriptingInterface::domainLoadingProgress() { return qApp->getOctreePacketProcessor().domainLoadingProgress(); } + +const DisplayPluginList& getDisplayPlugins() { + static const auto& list = PluginManager::getInstance()->getDisplayPlugins(); + return list; +} + +int WindowScriptingInterface::getDisplayPluginCount() { + return getDisplayPlugins().size(); +} + +QString WindowScriptingInterface::getDisplayPluginName(int index) { + return getDisplayPlugins().at(index)->getName(); +} + +bool WindowScriptingInterface::isDisplayPluginHmd(int index) { + return getDisplayPlugins().at(index)->isHmd(); +} + +int WindowScriptingInterface::getActiveDisplayPlugin() { + auto active = qApp->getActiveDisplayPlugin(); + auto size = getDisplayPluginCount(); + for (int i = 0; i < size; ++i) { + if (getDisplayPlugins().at(i) == active) { + return i; + } + } + return -1; +} + +void WindowScriptingInterface::setActiveDisplayPlugin(int index) { + qApp->setActiveDisplayPlugin(getDisplayPlugins().at(index)->getName()); +} diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 77b586ec70..c165e5474e 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -575,6 +575,44 @@ public slots: float domainLoadingProgress(); + /**jsdoc + * Return the number of display plugins currently available + * @function Window.getDisplayPluginCount + * @returns {int} The number of currently available display plugins + */ + int getDisplayPluginCount(); + + /**jsdoc + * Return the human readable name of a display plugin + * @function Window.getDisplayPluginName + * @param {int} index - The index of the display plugin. Must be less than the value returned by {@link Window.getDisplayPluginCount|getDisplayPluginCount}. + * @returns {string} The name of the specified display plugin + */ + QString getDisplayPluginName(int index); + + /**jsdoc + * Return whether a given display plugin is an HMD + * @function Window.isDisplayPluginHmd + * @param {int} index - The index of the display plugin. Must be less than the value returned by {@link Window.getDisplayPluginCount|getDisplayPluginCount}. + * @returns {bool} True if the specified display plugin is a HMD + */ + bool isDisplayPluginHmd(int index); + + /**jsdoc + * Return the currently active display plugin + * @function Window.getActiveDisplayPlugin + * @returns {int} The index of the currently active display plugin + */ + int getActiveDisplayPlugin(); + + /**jsdoc + * Return the currently active display plugin + * @function Window.setActiveDisplayPlugin + * @param {int} index - The index of the display plugin. Must be less than the value returned by {@link Window.getDisplayPluginCount|getDisplayPluginCount}. + */ + void setActiveDisplayPlugin(int index); + + private slots: void onWindowGeometryChanged(const QRect& geometry); void onMessageBoxSelected(int button); From a9bc7c880674965ef110b4efe3c0f05f72b23016 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 15 May 2019 17:14:02 -0700 Subject: [PATCH 3/7] Images, not glyphs --- .../simplifiedUI/topBar/SimplifiedTopBar.qml | 174 ++++++++++-------- .../topBar/images/desktopMode.svg | 13 ++ .../topBar/images/outputDeviceLoud.svg | 13 ++ .../topBar/images/outputDeviceMuted.svg | 14 ++ .../simplifiedUI/topBar/images/settings.svg | 13 ++ .../topBar/images/updatedIcons.zip | Bin 0 -> 7619 bytes .../simplifiedUI/topBar/images/vrMode.svg | 13 ++ 7 files changed, 162 insertions(+), 78 deletions(-) create mode 100644 interface/resources/qml/hifi/simplifiedUI/topBar/images/desktopMode.svg create mode 100644 interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceLoud.svg create mode 100644 interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceMuted.svg create mode 100644 interface/resources/qml/hifi/simplifiedUI/topBar/images/settings.svg create mode 100644 interface/resources/qml/hifi/simplifiedUI/topBar/images/updatedIcons.zip create mode 100644 interface/resources/qml/hifi/simplifiedUI/topBar/images/vrMode.svg diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml b/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml index 2c1e632cff..be8ff3f2c3 100644 --- a/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml @@ -203,39 +203,45 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.left: inputDeviceButton.right anchors.leftMargin: 24 - width: 20 + width: 30 height: width - HifiStylesUit.HiFiGlyphs { - property bool outputMuted: false + Image { id: outputDeviceButton - text: (outputDeviceButton.outputMuted ? simplifiedUI.glyphs.vol_0 : simplifiedUI.glyphs.vol_3) - color: (outputDeviceButton.outputMuted ? simplifiedUI.colors.controls.outputVolumeButton.text.muted : simplifiedUI.colors.controls.outputVolumeButton.text.noisy) - opacity: outputDeviceButtonMouseArea.containsMouse ? 1.0 : 0.7 - size: 32 + property bool outputMuted: false + source: outputDeviceButton.outputMuted ? "./images/outputDeviceMuted.svg" : "./images/outputDeviceLoud.svg" anchors.centerIn: parent - width: parent.width - height: parent.height - horizontalAlignment: Text.AlignHCenter - MouseArea { - id: outputDeviceButtonMouseArea - anchors.fill: parent - hoverEnabled: true - onEntered: { - Tablet.playSound(TabletEnums.ButtonHover); - } - onClicked: { - Tablet.playSound(TabletEnums.ButtonClick); - outputDeviceButton.outputMuted = !outputDeviceButton.outputMuted; + width: 20 + height: 20 + fillMode: Image.PreserveAspectFit + visible: false + } - sendToScript({ - "source": "SimplifiedTopBar.qml", - "method": "setOutputMuted", - "data": { - "outputMuted": outputDeviceButton.outputMuted - } - }); - } + ColorOverlay { + anchors.fill: outputDeviceButton + opacity: outputDeviceButtonMouseArea.containsMouse ? 1.0 : 0.7 + source: outputDeviceButton + color: (outputDeviceButton.outputMuted ? simplifiedUI.colors.controls.outputVolumeButton.text.muted : simplifiedUI.colors.controls.outputVolumeButton.text.noisy) + } + + MouseArea { + id: outputDeviceButtonMouseArea + anchors.fill: parent + hoverEnabled: true + onEntered: { + Tablet.playSound(TabletEnums.ButtonHover); + } + onClicked: { + Tablet.playSound(TabletEnums.ButtonClick); + outputDeviceButton.outputMuted = !outputDeviceButton.outputMuted; + + sendToScript({ + "source": "SimplifiedTopBar.qml", + "method": "setOutputMuted", + "data": { + "outputMuted": outputDeviceButton.outputMuted + } + }); } } } @@ -244,34 +250,40 @@ Rectangle { Item { id: hmdButtonContainer - anchors.top: parent.top - anchors.bottom: parent.bottom + anchors.verticalCenter: parent.verticalCenter anchors.right: settingsButtonContainer.left anchors.rightMargin: 8 - width: height + width: 48 + height: width - HifiStylesUit.HiFiGlyphs { - id: hmdGlyph - text: HMD.active ? simplifiedUI.glyphs.hmd : simplifiedUI.glyphs.screen - color: simplifiedUI.colors.text.white - opacity: hmdGlyphMouseArea.containsMouse ? 1.0 : 0.7 - size: 40 + Image { + id: displayModeImage + source: HMD.active ? "./images/vrMode.svg" : "./images/desktopMode.svg" anchors.centerIn: parent - width: 35 - height: parent.height - horizontalAlignment: Text.AlignHCenter - MouseArea { - id: hmdGlyphMouseArea - anchors.fill: parent - hoverEnabled: true - onEntered: { - Tablet.playSound(TabletEnums.ButtonHover); - } - onClicked: { - Tablet.playSound(TabletEnums.ButtonClick); - // TODO: actually do this right and change the display plugin - HMD.active = !HMD.active; - } + width: 29 + height: 16 + fillMode: Image.PreserveAspectFit + visible: false + } + + ColorOverlay { + anchors.fill: displayModeImage + opacity: displayModeMouseArea.containsMouse ? 1.0 : 0.7 + source: displayModeImage + color: simplifiedUI.colors.text.white + } + + MouseArea { + id: displayModeMouseArea + anchors.fill: parent + hoverEnabled: true + onEntered: { + Tablet.playSound(TabletEnums.ButtonHover); + } + onClicked: { + Tablet.playSound(TabletEnums.ButtonClick); + // TODO: actually do this right and change the display plugin + HMD.active = !HMD.active; } } } @@ -280,36 +292,42 @@ Rectangle { Item { id: settingsButtonContainer - anchors.top: parent.top - anchors.bottom: parent.bottom + anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right anchors.rightMargin: 16 - width: height + width: 48 + height: width - HifiStylesUit.HiFiGlyphs { - id: settingsGlyph - text: simplifiedUI.glyphs.gear - color: simplifiedUI.colors.text.white - opacity: settingsGlyphMouseArea.containsMouse ? 1.0 : 0.7 - size: 40 + Image { + id: settingsButtonImage + source: "./images/settings.svg" anchors.centerIn: parent - width: 35 - height: parent.height - horizontalAlignment: Text.AlignHCenter - MouseArea { - id: settingsGlyphMouseArea - anchors.fill: parent - hoverEnabled: true - onEntered: { - Tablet.playSound(TabletEnums.ButtonHover); - } - onClicked: { - Tablet.playSound(TabletEnums.ButtonClick); - sendToScript({ - "source": "SimplifiedTopBar.qml", - "method": "toggleSettingsApp" - }); - } + width: 20 + height: 20 + fillMode: Image.PreserveAspectFit + visible: false + } + + ColorOverlay { + opacity: settingsButtonMouseArea.containsMouse ? 1.0 : 0.7 + anchors.fill: settingsButtonImage + source: settingsButtonImage + color: simplifiedUI.colors.text.white + } + + MouseArea { + id: settingsButtonMouseArea + anchors.fill: parent + hoverEnabled: true + onEntered: { + Tablet.playSound(TabletEnums.ButtonHover); + } + onClicked: { + Tablet.playSound(TabletEnums.ButtonClick); + sendToScript({ + "source": "SimplifiedTopBar.qml", + "method": "toggleSettingsApp" + }); } } } diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/images/desktopMode.svg b/interface/resources/qml/hifi/simplifiedUI/topBar/images/desktopMode.svg new file mode 100644 index 0000000000..8b04caca88 --- /dev/null +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/images/desktopMode.svg @@ -0,0 +1,13 @@ + + + + + + image/svg+xml + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceLoud.svg b/interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceLoud.svg new file mode 100644 index 0000000000..987f6eecdf --- /dev/null +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceLoud.svg @@ -0,0 +1,13 @@ + + + + + + image/svg+xml + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceMuted.svg b/interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceMuted.svg new file mode 100644 index 0000000000..4188175c31 --- /dev/null +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceMuted.svg @@ -0,0 +1,14 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/images/settings.svg b/interface/resources/qml/hifi/simplifiedUI/topBar/images/settings.svg new file mode 100644 index 0000000000..04a031d498 --- /dev/null +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/images/settings.svg @@ -0,0 +1,13 @@ + + + + + + image/svg+xml + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/images/updatedIcons.zip b/interface/resources/qml/hifi/simplifiedUI/topBar/images/updatedIcons.zip new file mode 100644 index 0000000000000000000000000000000000000000..205133e4c98e958659ebb6d1c8208e15eded01cc GIT binary patch literal 7619 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 E0o-)w2mk;8 literal 0 HcmV?d00001 diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/images/vrMode.svg b/interface/resources/qml/hifi/simplifiedUI/topBar/images/vrMode.svg new file mode 100644 index 0000000000..57b564813d --- /dev/null +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/images/vrMode.svg @@ -0,0 +1,13 @@ + + + + + + image/svg+xml + + + + + + + From 9bcc23f0c48445b9dfa0da1c9cb716308ee0b381 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 16 May 2019 09:40:22 -0700 Subject: [PATCH 4/7] PR comments --- interface/src/Application.cpp | 4 -- .../PerformanceScriptingInterface.cpp | 12 +++++ .../scripting/PerformanceScriptingInterface.h | 5 ++ .../scripting/RefreshRateScriptingInterface.h | 46 ------------------- 4 files changed, 17 insertions(+), 50 deletions(-) delete mode 100644 interface/src/scripting/RefreshRateScriptingInterface.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7f429d9765..3d6c2218ce 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -192,7 +192,6 @@ #include "scripting/WalletScriptingInterface.h" #include "scripting/TTSScriptingInterface.h" #include "scripting/KeyboardScriptingInterface.h" -#include "scripting/RefreshRateScriptingInterface.h" #include "scripting/PerformanceScriptingInterface.h" @@ -3280,7 +3279,6 @@ void Application::onDesktopRootContextCreated(QQmlContext* surfaceContext) { surfaceContext->setContextProperty("Controller", DependencyManager::get().data()); surfaceContext->setContextProperty("Entities", DependencyManager::get().data()); - surfaceContext->setContextProperty("RefreshRate", new RefreshRateScriptingInterface()); surfaceContext->setContextProperty("Performance", new PerformanceScriptingInterface()); _fileDownload = new FileScriptingInterface(engine); surfaceContext->setContextProperty("File", _fileDownload); @@ -3431,7 +3429,6 @@ void Application::setupQmlSurface(QQmlContext* surfaceContext, bool setAdditiona surfaceContext->setContextProperty("Settings", SettingsScriptingInterface::getInstance()); surfaceContext->setContextProperty("MenuInterface", MenuScriptingInterface::getInstance()); - surfaceContext->setContextProperty("RefreshRate", new RefreshRateScriptingInterface()); surfaceContext->setContextProperty("Performance", new PerformanceScriptingInterface()); surfaceContext->setContextProperty("Account", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED @@ -7416,7 +7413,6 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEnginePointe scriptEngine->registerGlobalObject("LODManager", DependencyManager::get().data()); scriptEngine->registerGlobalObject("Keyboard", DependencyManager::get().data()); - scriptEngine->registerGlobalObject("RefreshRate", new RefreshRateScriptingInterface()); scriptEngine->registerGlobalObject("Performance", new PerformanceScriptingInterface()); scriptEngine->registerGlobalObject("Paths", DependencyManager::get().data()); diff --git a/interface/src/scripting/PerformanceScriptingInterface.cpp b/interface/src/scripting/PerformanceScriptingInterface.cpp index 53529beeef..b1b4e62dca 100644 --- a/interface/src/scripting/PerformanceScriptingInterface.cpp +++ b/interface/src/scripting/PerformanceScriptingInterface.cpp @@ -26,3 +26,15 @@ void PerformanceScriptingInterface::setRefreshRateProfile(RefreshRateProfile ref PerformanceScriptingInterface::RefreshRateProfile PerformanceScriptingInterface::getRefreshRateProfile() const { return (PerformanceScriptingInterface::RefreshRateProfile)qApp->getRefreshRateManager().getRefreshRateProfile(); } + +int PerformanceScriptingInterface::getActiveRefreshRate() const { + return qApp->getRefreshRateManager().getActiveRefreshRate(); +} + +RefreshRateManager::UXMode PerformanceScriptingInterface::getUXMode() const { + return qApp->getRefreshRateManager().getUXMode(); +} + +RefreshRateManager::RefreshRateRegime PerformanceScriptingInterface::getRefreshRateRegime() const { + return qApp->getRefreshRateManager().getRefreshRateRegime(); +} diff --git a/interface/src/scripting/PerformanceScriptingInterface.h b/interface/src/scripting/PerformanceScriptingInterface.h index 266fa7229f..90b51d173c 100644 --- a/interface/src/scripting/PerformanceScriptingInterface.h +++ b/interface/src/scripting/PerformanceScriptingInterface.h @@ -36,6 +36,11 @@ public slots: void setRefreshRateProfile(RefreshRateProfile refreshRateProfile); RefreshRateProfile getRefreshRateProfile() const; + int getActiveRefreshRate() const; + RefreshRateManager::UXMode getUXMode() const; + RefreshRateManager::RefreshRateRegime getRefreshRateRegime() const; + + private: static std::once_flag registry_flag; }; diff --git a/interface/src/scripting/RefreshRateScriptingInterface.h b/interface/src/scripting/RefreshRateScriptingInterface.h deleted file mode 100644 index 697141583f..0000000000 --- a/interface/src/scripting/RefreshRateScriptingInterface.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// RefreshRateScriptingInterface.h -// interface/src/scrfipting -// -// Created by Dante Ruiz on 2019-04-15. -// Copyright 2019 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 -// - -#ifndef hifi_RefreshRateScriptingInterface_h -#define hifi_RefreshRateScriptingInterface_h - -#include - -#include - -class RefreshRateScriptingInterface : public QObject { - Q_OBJECT -public: - RefreshRateScriptingInterface() = default; - ~RefreshRateScriptingInterface() = default; - -public: - Q_INVOKABLE QString getRefreshRateProfile() { - RefreshRateManager& refreshRateManager = qApp->getRefreshRateManager(); - return QString::fromStdString(RefreshRateManager::refreshRateProfileToString(refreshRateManager.getRefreshRateProfile())); - } - - Q_INVOKABLE QString getRefreshRateRegime() { - RefreshRateManager& refreshRateManager = qApp->getRefreshRateManager(); - return QString::fromStdString(RefreshRateManager::refreshRateRegimeToString(refreshRateManager.getRefreshRateRegime())); - } - - Q_INVOKABLE QString getUXMode() { - RefreshRateManager& refreshRateManager = qApp->getRefreshRateManager(); - return QString::fromStdString(RefreshRateManager::uxModeToString(refreshRateManager.getUXMode())); - } - - Q_INVOKABLE int getActiveRefreshRate() { - return qApp->getRefreshRateManager().getActiveRefreshRate(); - } -}; - -#endif From 6a0b479041f1f96356f1a7ab260b47211627ca0d Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 16 May 2019 10:48:18 -0700 Subject: [PATCH 5/7] Fix warning and build failures --- .../src/scripting/WindowScriptingInterface.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index e1272d68a7..3194fa24eb 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -611,28 +611,23 @@ float WindowScriptingInterface::domainLoadingProgress() { return qApp->getOctreePacketProcessor().domainLoadingProgress(); } -const DisplayPluginList& getDisplayPlugins() { - static const auto& list = PluginManager::getInstance()->getDisplayPlugins(); - return list; -} - int WindowScriptingInterface::getDisplayPluginCount() { - return getDisplayPlugins().size(); + return (int)PluginManager::getInstance()->getDisplayPlugins().size(); } QString WindowScriptingInterface::getDisplayPluginName(int index) { - return getDisplayPlugins().at(index)->getName(); + return PluginManager::getInstance()->getDisplayPlugins().at(index)->getName(); } bool WindowScriptingInterface::isDisplayPluginHmd(int index) { - return getDisplayPlugins().at(index)->isHmd(); + return PluginManager::getInstance()->getDisplayPlugins().at(index)->isHmd(); } int WindowScriptingInterface::getActiveDisplayPlugin() { auto active = qApp->getActiveDisplayPlugin(); auto size = getDisplayPluginCount(); for (int i = 0; i < size; ++i) { - if (getDisplayPlugins().at(i) == active) { + if (PluginManager::getInstance()->getDisplayPlugins().at(i) == active) { return i; } } @@ -640,5 +635,6 @@ int WindowScriptingInterface::getActiveDisplayPlugin() { } void WindowScriptingInterface::setActiveDisplayPlugin(int index) { - qApp->setActiveDisplayPlugin(getDisplayPlugins().at(index)->getName()); + auto name = PluginManager::getInstance()->getDisplayPlugins().at(index)->getName(); + qApp->setActiveDisplayPlugin(name); } From e3e2bbc0566501cac537a0ce306cdb1f85439283 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Thu, 16 May 2019 12:36:54 -0700 Subject: [PATCH 6/7] Add guard for challenging Node disappearing --- interface/src/commerce/Wallet.cpp | 51 +++++++++++++++++-------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp index 127bca9eba..aa50b42075 100644 --- a/interface/src/commerce/Wallet.cpp +++ b/interface/src/commerce/Wallet.cpp @@ -879,35 +879,40 @@ void Wallet::sendChallengeOwnershipResponses() { textByteArraySize = textByteArray.size(); int idSize = id.size(); // setup the packet - Node& sendingNode = *nodeList->nodeWithLocalID(packet->getSourceID()); - if (challengeOriginatedFromClient) { - auto textPacket = NLPacket::create(PacketType::ChallengeOwnershipReply, - idSize + textByteArraySize + challengingNodeUUIDByteArraySize + 3 * sizeof(int), - true); + const SharedNodePointer sendingNode = nodeList->nodeWithLocalID(packet->getSourceID()); + if (!sendingNode.isNull()) { + if (challengeOriginatedFromClient) { + auto textPacket = NLPacket::create(PacketType::ChallengeOwnershipReply, + idSize + textByteArraySize + challengingNodeUUIDByteArraySize + 3 * sizeof(int), + true); - textPacket->writePrimitive(idSize); - textPacket->writePrimitive(textByteArraySize); - textPacket->writePrimitive(challengingNodeUUIDByteArraySize); - textPacket->write(id); - textPacket->write(textByteArray); - textPacket->write(challengingNodeUUID); + textPacket->writePrimitive(idSize); + textPacket->writePrimitive(textByteArraySize); + textPacket->writePrimitive(challengingNodeUUIDByteArraySize); + textPacket->write(id); + textPacket->write(textByteArray); + textPacket->write(challengingNodeUUID); - qCDebug(commerce) << "Sending ChallengeOwnershipReply Packet containing signed text" << textByteArray << "for id" << id; + qCDebug(commerce) << "Sending ChallengeOwnershipReply Packet containing signed text" << textByteArray << "for id" << id; - nodeList->sendPacket(std::move(textPacket), sendingNode); + nodeList->sendPacket(std::move(textPacket), *sendingNode); + } else { + auto textPacket = NLPacket::create(PacketType::ChallengeOwnership, idSize + textByteArraySize + 2 * sizeof(int), true); + + textPacket->writePrimitive(idSize); + textPacket->writePrimitive(textByteArraySize); + textPacket->write(id); + textPacket->write(textByteArray); + + qCDebug(commerce) << "Sending ChallengeOwnership Packet containing signed text" << textByteArray << "for id" << id; + + nodeList->sendPacket(std::move(textPacket), *sendingNode); + } } else { - auto textPacket = NLPacket::create(PacketType::ChallengeOwnership, idSize + textByteArraySize + 2 * sizeof(int), true); - - textPacket->writePrimitive(idSize); - textPacket->writePrimitive(textByteArraySize); - textPacket->write(id); - textPacket->write(textByteArray); - - qCDebug(commerce) << "Sending ChallengeOwnership Packet containing signed text" << textByteArray << "for id" << id; - - nodeList->sendPacket(std::move(textPacket), sendingNode); + qCDebug(commerce) << "Challenging Node Local ID" << packet->getSourceID() << "disconnected before response"; } + if (status == -1) { qCDebug(commerce) << "During entity ownership challenge, signing the text failed."; long error = ERR_get_error(); From 90a5b25600de2b0ec135e7a375cd41cf2c8093c8 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 16 May 2019 14:13:41 -0700 Subject: [PATCH 7/7] A bunch of changes here --- .../hifi/simplifiedUI/avatarApp/AvatarApp.qml | 7 ++- .../components/AvatarAppListDelegate.qml | 8 ++- .../components/DisplayNameHeader.qml | 2 + .../simplifiedUI/images/defaultAvatar.svg | 14 +++++ .../inputDeviceButton/InputDeviceButton.qml | 29 +++------ .../inputDeviceButton/images/mic-clip-i.svg | 30 ++++++--- .../inputDeviceButton/images/mic-gate-i.svg | 16 ++++- .../inputDeviceButton/images/mic-mute-a.svg | 16 ++++- .../inputDeviceButton/images/mic-mute-i.svg | 16 ++++- .../inputDeviceButton/images/mic-ptt-a.svg | 18 +++++- .../inputDeviceButton/images/mic-ptt-i.svg | 22 +------ .../inputDeviceButton/images/mic-unmute-a.svg | 58 +++++++++++++++++- .../inputDeviceButton/images/mic-unmute-i.svg | 16 ++++- .../simplifiedUI/topBar/SimplifiedTopBar.qml | 40 ++++++------ .../topBar/images/defaultAvatar.jpg | Bin 36764 -> 0 bytes .../topBar/images/outputDeviceLoud.svg | 16 +---- .../topBar/images/updatedIcons.zip | Bin 7619 -> 0 bytes scripts/system/simplifiedUI/simplifiedUI.js | 29 +++++---- 18 files changed, 225 insertions(+), 112 deletions(-) create mode 100644 interface/resources/qml/hifi/simplifiedUI/images/defaultAvatar.svg delete mode 100644 interface/resources/qml/hifi/simplifiedUI/topBar/images/defaultAvatar.jpg delete mode 100644 interface/resources/qml/hifi/simplifiedUI/topBar/images/updatedIcons.zip diff --git a/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml b/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml index a659ff4e0c..57bec2250f 100644 --- a/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml +++ b/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml @@ -92,7 +92,7 @@ Rectangle { AvatarAppComponents.DisplayNameHeader { id: displayNameHeader - previewUrl: avatarPreviewUrl + previewUrl: root.avatarPreviewUrl loading: !inventoryContentsList.visible anchors.top: parent.top anchors.topMargin: 30 @@ -210,7 +210,10 @@ Rectangle { downloadUrl = avatarAppInventoryModel.get(i).download_url; previewUrl = avatarAppInventoryModel.get(i).preview; if (MyAvatar.skeletonModelURL === downloadUrl) { - avatarPreviewUrl = previewUrl; + if (previewUrl.indexOf("missing.png") > -1) { + previewUrl = "../../images/defaultAvatar.svg"; // Extra `../` because the image is stored 2 levels up from `DisplayNameHeader.qml` + } + root.avatarPreviewUrl = previewUrl; return; } } diff --git a/interface/resources/qml/hifi/simplifiedUI/avatarApp/components/AvatarAppListDelegate.qml b/interface/resources/qml/hifi/simplifiedUI/avatarApp/components/AvatarAppListDelegate.qml index 7c6ad1b09c..cdfa06190c 100644 --- a/interface/resources/qml/hifi/simplifiedUI/avatarApp/components/AvatarAppListDelegate.qml +++ b/interface/resources/qml/hifi/simplifiedUI/avatarApp/components/AvatarAppListDelegate.qml @@ -51,12 +51,14 @@ Rectangle { Image { id: itemPreviewImage - source: root.itemPreviewImageUrl + source: root.itemPreviewImageUrl.indexOf("missing.png") > -1 ? "../../images/defaultAvatar.svg" : root.itemPreviewImageUrl anchors.left: parent.left anchors.leftMargin: 20 anchors.verticalCenter: parent.verticalCenter - height: 60 - width: height + width: 60 + height: width + sourceSize.width: width + sourceSize.height: height fillMode: Image.PreserveAspectCrop mipmap: true layer.enabled: true diff --git a/interface/resources/qml/hifi/simplifiedUI/avatarApp/components/DisplayNameHeader.qml b/interface/resources/qml/hifi/simplifiedUI/avatarApp/components/DisplayNameHeader.qml index 6bf3d34d6f..a6be398e53 100644 --- a/interface/resources/qml/hifi/simplifiedUI/avatarApp/components/DisplayNameHeader.qml +++ b/interface/resources/qml/hifi/simplifiedUI/avatarApp/components/DisplayNameHeader.qml @@ -43,6 +43,8 @@ Item { anchors.verticalCenter: parent.verticalCenter height: 100 width: height + sourceSize.width: width + sourceSize.height: height fillMode: Image.PreserveAspectCrop layer.enabled: true layer.effect: OpacityMask { diff --git a/interface/resources/qml/hifi/simplifiedUI/images/defaultAvatar.svg b/interface/resources/qml/hifi/simplifiedUI/images/defaultAvatar.svg new file mode 100644 index 0000000000..05779e7d40 --- /dev/null +++ b/interface/resources/qml/hifi/simplifiedUI/images/defaultAvatar.svg @@ -0,0 +1,14 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/InputDeviceButton.qml b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/InputDeviceButton.qml index 506c2a72bc..cb10cc5eef 100644 --- a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/InputDeviceButton.qml +++ b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/InputDeviceButton.qml @@ -48,9 +48,6 @@ Rectangle { } } - height: 30 - width: 34 - opacity: 0.7 onLevelChanged: { @@ -67,13 +64,8 @@ Rectangle { MouseArea { id: mouseArea - - anchors { - left: icon.left - right: bar.right - top: icon.top - bottom: icon.bottom - } + + anchors.fill: parent hoverEnabled: true scrollGestureEnabled: false @@ -109,9 +101,10 @@ Rectangle { Item { id: icon anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - width: parent.width - bar.width - bar.anchors.leftMargin - height: parent.height + anchors.right: parent.horizontalCenter + anchors.rightMargin: 2 + width: 13 + height: 21 Item { anchors.fill: parent @@ -136,14 +129,12 @@ Rectangle { Item { id: bar - anchors { - left: icon.right - leftMargin: 0 - verticalCenter: icon.verticalCenter - } + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.horizontalCenter + anchors.leftMargin: 2 width: 4 - height: parent.height + height: 21 Rectangle { // base id: baseBar diff --git a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-clip-i.svg b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-clip-i.svg index f912c1e744..8b694c7f3d 100644 --- a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-clip-i.svg +++ b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-clip-i.svg @@ -1,10 +1,20 @@ - - - - - - - - - - + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-gate-i.svg b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-gate-i.svg index 8255174532..ac70ce66cb 100644 --- a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-gate-i.svg +++ b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-gate-i.svg @@ -1,3 +1,13 @@ - - - + + + + + + image/svg+xml + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-mute-a.svg b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-mute-a.svg index 67eafc27c8..eb36c2dd55 100644 --- a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-mute-a.svg +++ b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-mute-a.svg @@ -1,3 +1,13 @@ - - - + + + + + + image/svg+xml + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-mute-i.svg b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-mute-i.svg index 63af1b0da8..ebca81f370 100644 --- a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-mute-i.svg +++ b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-mute-i.svg @@ -1,3 +1,13 @@ - - - + + + + + + image/svg+xml + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-ptt-a.svg b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-ptt-a.svg index e6df3c69d7..3ce7c0ca51 100644 --- a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-ptt-a.svg +++ b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-ptt-a.svg @@ -1 +1,17 @@ -mic-ptt-a \ No newline at end of file + + + + + + image/svg+xml + + mic-ptt-a + + + + + + + mic-ptt-a + + diff --git a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-ptt-i.svg b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-ptt-i.svg index 2141ea5229..3bf1f1bf9e 100644 --- a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-ptt-i.svg +++ b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-ptt-i.svg @@ -1,24 +1,8 @@ - + - +image/svg+xml - + diff --git a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-unmute-a.svg b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-unmute-a.svg index 0bf7677017..0bd0b0c238 100644 --- a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-unmute-a.svg +++ b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-unmute-a.svg @@ -1,3 +1,57 @@ - - + + + + + + image/svg+xml + + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-unmute-i.svg b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-unmute-i.svg index 0bf7677017..121873dd1b 100644 --- a/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-unmute-i.svg +++ b/interface/resources/qml/hifi/simplifiedUI/inputDeviceButton/images/mic-unmute-i.svg @@ -1,3 +1,13 @@ - - - + + + + + + image/svg+xml + + + + + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml b/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml index be8ff3f2c3..6622da33d9 100644 --- a/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml @@ -122,21 +122,14 @@ Rectangle { width: 48 height: width - AnimatedImage { - visible: avatarButtonImage.source === "" - anchors.centerIn: parent - width: parent.width - 10 - height: width - source: "../images/loading.gif" - } - Image { id: avatarButtonImage - visible: source !== "" - source: "" + source: "./images/defaultAvatar.svg" anchors.centerIn: parent - width: parent.width - 10 + width: 32 height: width + sourceSize.width: width + sourceSize.height: height mipmap: true fillMode: Image.PreserveAspectCrop layer.enabled: true @@ -194,7 +187,9 @@ Rectangle { id: inputDeviceButton anchors.verticalCenter: parent.verticalCenter anchors.left: avatarButtonContainer.right - anchors.leftMargin: 8 + anchors.leftMargin: 6 + width: 32 + height: width } @@ -202,8 +197,8 @@ Rectangle { id: outputDeviceButtonContainer anchors.verticalCenter: parent.verticalCenter anchors.left: inputDeviceButton.right - anchors.leftMargin: 24 - width: 30 + anchors.leftMargin: 2 + width: 32 height: width Image { @@ -252,13 +247,13 @@ Rectangle { id: hmdButtonContainer anchors.verticalCenter: parent.verticalCenter anchors.right: settingsButtonContainer.left - anchors.rightMargin: 8 - width: 48 + anchors.rightMargin: 14 + width: 32 height: width Image { id: displayModeImage - source: HMD.active ? "./images/vrMode.svg" : "./images/desktopMode.svg" + source: HMD.active ? "./images/desktopMode.svg" : "./images/vrMode.svg" anchors.centerIn: parent width: 29 height: 16 @@ -295,7 +290,7 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right anchors.rightMargin: 16 - width: 48 + width: 32 height: width Image { @@ -340,6 +335,9 @@ Rectangle { downloadUrl = topBarInventoryModel.get(i).download_url; previewUrl = topBarInventoryModel.get(i).preview; if (MyAvatar.skeletonModelURL === downloadUrl) { + if (previewUrl.indexOf("missing.png") > -1) { + previewUrl = "../images/defaultAvatar.svg"; + } avatarButtonImage.source = previewUrl; return; } @@ -354,7 +352,11 @@ Rectangle { switch (message.method) { case "updateAvatarThumbnailURL": - avatarButtonImage.source = message.data.avatarThumbnailURL; + if (message.data.avatarThumbnailURL.indexOf("defaultAvatar.svg") > -1) { + avatarButtonImage.source = "../images/defaultAvatar.svg"; + } else { + avatarButtonImage.source = message.data.avatarThumbnailURL; + } break; case "updateOutputMuted": diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/images/defaultAvatar.jpg b/interface/resources/qml/hifi/simplifiedUI/topBar/images/defaultAvatar.jpg deleted file mode 100644 index 821be6c584d86455df30a882481ae210048bb294..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36764 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 diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceLoud.svg b/interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceLoud.svg index 987f6eecdf..ebd844c471 100644 --- a/interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceLoud.svg +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/images/outputDeviceLoud.svg @@ -1,13 +1,3 @@ - - - - - - image/svg+xml - - - - - - - + + + diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/images/updatedIcons.zip b/interface/resources/qml/hifi/simplifiedUI/topBar/images/updatedIcons.zip deleted file mode 100644 index 205133e4c98e958659ebb6d1c8208e15eded01cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7619 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 E0o-)w2mk;8 diff --git a/scripts/system/simplifiedUI/simplifiedUI.js b/scripts/system/simplifiedUI/simplifiedUI.js index 3f22f376cf..c6181d2ad9 100644 --- a/scripts/system/simplifiedUI/simplifiedUI.js +++ b/scripts/system/simplifiedUI/simplifiedUI.js @@ -15,7 +15,6 @@ // START CONFIG OPTIONS var DOCKED_QML_SUPPORTED = true; -var REMOVE_EXISTING_UI = true; var TOOLBAR_NAME = "com.highfidelity.interface.toolbar.system"; var DEFAULT_SCRIPTS_PATH_PREFIX = ScriptDiscoveryService.defaultScriptsPath + "/"; // END CONFIG OPTIONS @@ -24,7 +23,7 @@ var DEFAULT_SCRIPTS_PATH_PREFIX = ScriptDiscoveryService.defaultScriptsPath + "/ var DEFAULT_SCRIPTS_SEPARATE = [ DEFAULT_SCRIPTS_PATH_PREFIX + "system/controllers/controllerScripts.js" ]; -function loadSeparateDefaults() { +function loadNewSeparateDefaults() { for (var i in DEFAULT_SCRIPTS_SEPARATE) { Script.load(DEFAULT_SCRIPTS_SEPARATE[i]); } @@ -36,7 +35,7 @@ var DEFAULT_SCRIPTS_COMBINED = [ DEFAULT_SCRIPTS_PATH_PREFIX + "system/progress.js", DEFAULT_SCRIPTS_PATH_PREFIX + "system/away.js" ]; -function runDefaultsTogether() { +function runNewDefaultsTogether() { for (var i in DEFAULT_SCRIPTS_COMBINED) { Script.include(DEFAULT_SCRIPTS_COMBINED[i]); } @@ -47,10 +46,13 @@ function runDefaultsTogether() { // Until then, users are required to access some functionality from the top menu bar. //var MENU_NAMES = ["File", "Edit", "Display", "View", "Navigate", "Settings", "Developer", "Help"]; var MENU_NAMES = ["File", "Edit", "View", "Navigate", "Help"]; -function removeDesktopMenu() { - MENU_NAMES.forEach(function(menu) { - Menu.removeMenu(menu); - }); +var keepMenusSetting = Settings.getValue("simplifiedUI/keepMenus", false); +function maybeRemoveDesktopMenu() { + if (!keepMenusSetting) { + MENU_NAMES.forEach(function(menu) { + Menu.removeMenu(menu); + }); + } } @@ -436,18 +438,21 @@ function ensureFirstPersonCameraInHMD(isHMDMode) { var simplifiedNametag = Script.require("../simplifiedNametag/simplifiedNametag.js"); var oldShowAudioTools; var oldShowBubbleTools; +var keepExistingUIAndScriptsSetting = Settings.getValue("simplifiedUI/keepExistingUIAndScripts", false); function startup() { - if (REMOVE_EXISTING_UI) { + maybeRemoveDesktopMenu(); + + if (!keepExistingUIAndScriptsSetting) { pauseCurrentScripts(); - removeDesktopMenu(); - runDefaultsTogether(); - loadSeparateDefaults(); + runNewDefaultsTogether(); + loadNewSeparateDefaults(); if (!HMD.active) { var toolbar = Toolbars.getToolbar(TOOLBAR_NAME); toolbar.writeProperty("visible", false); } } + loadSimplifiedTopBar(); simplifiedNametag.create(); @@ -476,7 +481,7 @@ function restoreScripts() { function shutdown() { restoreScripts(); - if (REMOVE_EXISTING_UI) { + if (!keepExistingUIAndScriptsSetting) { Window.confirm("You'll have to restart Interface to get full functionality back. Clicking yes or no will dismiss this dialog."); if (!HMD.active) {