mirror of
https://github.com/overte-org/overte.git
synced 2025-04-07 18:12:24 +02:00
817 lines
26 KiB
JavaScript
817 lines
26 KiB
JavaScript
"use strict";
|
|
/* jslint vars: true, plusplus: true */
|
|
|
|
//
|
|
// simplifiedUI.js
|
|
//
|
|
// Authors: Wayne Chen & Zach Fox
|
|
// Created: 2019-05-01
|
|
// Copyright 2019 High Fidelity, Inc.
|
|
// Copyright 2024 Overte e.V.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
|
|
|
|
// START CONFIG OPTIONS
|
|
var TOOLBAR_NAME = "com.highfidelity.interface.toolbar.system";
|
|
var DEFAULT_SCRIPTS_PATH_PREFIX = ScriptDiscoveryService.defaultScriptsPath + "/";
|
|
// END CONFIG OPTIONS
|
|
|
|
|
|
var MENU_NAMES = ["File", "Edit", "Display", "View", "Navigate", "Settings", "Developer", "Help"];
|
|
var keepMenusSetting = Settings.getValue("simplifiedUI/keepMenus", true);
|
|
function maybeRemoveDesktopMenu() {
|
|
if (!keepMenusSetting) {
|
|
MENU_NAMES.forEach(function(menu) {
|
|
Menu.removeMenu(menu);
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
function handleUpdateAvatarThumbnailURL(avatarThumbnailURL) {
|
|
if (topBarWindow) {
|
|
topBarWindow.sendToQml({
|
|
"source": "simplifiedUI.js",
|
|
"method": "updateAvatarThumbnailURL",
|
|
"data": {
|
|
"avatarThumbnailURL": avatarThumbnailURL
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
var AVATAR_APP_MESSAGE_SOURCE = "AvatarApp.qml";
|
|
function onMessageFromAvatarApp(message) {
|
|
if (message.source !== AVATAR_APP_MESSAGE_SOURCE) {
|
|
return;
|
|
}
|
|
|
|
switch (message.method) {
|
|
case "updateAvatarThumbnailURL":
|
|
handleUpdateAvatarThumbnailURL(message.data.avatarThumbnailURL);
|
|
break;
|
|
|
|
default:
|
|
console.log("Unrecognized message from " + AVATAR_APP_MESSAGE_SOURCE + ": " + JSON.stringify(message));
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
function onAvatarAppClosed() {
|
|
if (avatarAppWindow) {
|
|
avatarAppWindow.fromQml.disconnect(onMessageFromAvatarApp);
|
|
avatarAppWindow.closed.disconnect(onAvatarAppClosed);
|
|
}
|
|
avatarAppWindow = false;
|
|
}
|
|
|
|
|
|
var AVATAR_APP_QML_PATH = Script.resourcesPath() + "qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml";
|
|
var AVATAR_APP_WINDOW_TITLE = "Your Profile";
|
|
var AVATAR_APP_PRESENTATION_MODE = Desktop.PresentationMode.NATIVE;
|
|
var AVATAR_APP_WIDTH_PX = 480;
|
|
var AVATAR_APP_HEIGHT_PX = 615;
|
|
var avatarAppWindow = false;
|
|
var POPOUT_SAFE_MARGIN_X = 30;
|
|
var POPOUT_SAFE_MARGIN_Y = 30;
|
|
var AVATAR_APP_WINDOW_FLAGS = 0x00000001 | // Qt::Window
|
|
0x00001000 | // Qt::WindowTitleHint
|
|
0x00002000 | // Qt::WindowSystemMenuHint
|
|
0x08000000 | // Qt::WindowCloseButtonHint
|
|
0x00008000 | // Qt::WindowMaximizeButtonHint
|
|
0x00004000; // Qt::WindowMinimizeButtonHint
|
|
function toggleAvatarApp() {
|
|
if (avatarAppWindow) {
|
|
avatarAppWindow.close();
|
|
// This really shouldn't be necessary.
|
|
// This signal really should automatically be called by the signal handler set up below.
|
|
// But fixing that requires an engine change, so this workaround will do.
|
|
onAvatarAppClosed();
|
|
return;
|
|
}
|
|
|
|
avatarAppWindow = Desktop.createWindow(AVATAR_APP_QML_PATH, {
|
|
title: AVATAR_APP_WINDOW_TITLE,
|
|
presentationMode: AVATAR_APP_PRESENTATION_MODE,
|
|
size: {
|
|
x: AVATAR_APP_WIDTH_PX,
|
|
y: AVATAR_APP_HEIGHT_PX
|
|
},
|
|
position: {
|
|
x: Math.max(Window.x + POPOUT_SAFE_MARGIN_X, Window.x + Window.innerWidth / 2 - AVATAR_APP_WIDTH_PX / 2),
|
|
y: Math.max(Window.y + POPOUT_SAFE_MARGIN_Y, Window.y + Window.innerHeight / 2 - AVATAR_APP_HEIGHT_PX / 2)
|
|
},
|
|
overrideFlags: AVATAR_APP_WINDOW_FLAGS
|
|
});
|
|
|
|
avatarAppWindow.fromQml.connect(onMessageFromAvatarApp);
|
|
avatarAppWindow.closed.connect(onAvatarAppClosed);
|
|
}
|
|
|
|
|
|
function handleAvatarNametagMode(newAvatarNametagMode) {
|
|
nametag.handleAvatarNametagMode(newAvatarNametagMode);
|
|
}
|
|
|
|
|
|
var SETTINGS_APP_MESSAGE_SOURCE = "SettingsApp.qml";
|
|
function onMessageFromSettingsApp(message) {
|
|
if (message.source !== SETTINGS_APP_MESSAGE_SOURCE) {
|
|
return;
|
|
}
|
|
|
|
switch (message.method) {
|
|
/*
|
|
This calls an update methon on the module apis because I can't get a signal from Settings.QML to the emoji.js without it being a module like
|
|
nametag.
|
|
*/
|
|
case "handleAvatarNametagMode":
|
|
handleAvatarNametagMode(message.avatarNametagMode);
|
|
break;
|
|
default:
|
|
console.log("Unrecognized message from " + SETTINGS_APP_MESSAGE_SOURCE + ": " + JSON.stringify(message));
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
function onSettingsAppClosed() {
|
|
if (settingsAppWindow) {
|
|
settingsAppWindow.fromQml.disconnect(onMessageFromSettingsApp);
|
|
settingsAppWindow.closed.disconnect(onSettingsAppClosed);
|
|
}
|
|
settingsAppWindow = false;
|
|
}
|
|
|
|
|
|
var SETTINGS_APP_QML_PATH = Script.resourcesPath() + "qml/hifi/simplifiedUI/settingsApp/SettingsApp.qml";
|
|
var SETTINGS_APP_WINDOW_TITLE = "Settings";
|
|
var SETTINGS_APP_PRESENTATION_MODE = Desktop.PresentationMode.NATIVE;
|
|
var SETTINGS_APP_WIDTH_PX = 480;
|
|
var SETTINGS_APP_HEIGHT_PX = 615;
|
|
var SETTINGS_APP_WINDOW_FLAGS = 0x00000001 | // Qt::Window
|
|
0x00001000 | // Qt::WindowTitleHint
|
|
0x00002000 | // Qt::WindowSystemMenuHint
|
|
0x08000000 | // Qt::WindowCloseButtonHint
|
|
0x00008000 | // Qt::WindowMaximizeButtonHint
|
|
0x00004000; // Qt::WindowMinimizeButtonHint
|
|
var SETTINGS_APP_RIGHT_MARGIN = 48;
|
|
var settingsAppWindow = false;
|
|
function toggleSettingsApp() {
|
|
if (settingsAppWindow) {
|
|
settingsAppWindow.close();
|
|
// This really shouldn't be necessary.
|
|
// This signal really should automatically be called by the signal handler set up below.
|
|
// But fixing that requires an engine change, so this workaround will do.
|
|
onSettingsAppClosed();
|
|
return;
|
|
}
|
|
|
|
settingsAppWindow = Desktop.createWindow(SETTINGS_APP_QML_PATH, {
|
|
title: SETTINGS_APP_WINDOW_TITLE,
|
|
presentationMode: SETTINGS_APP_PRESENTATION_MODE,
|
|
size: {
|
|
x: SETTINGS_APP_WIDTH_PX,
|
|
y: SETTINGS_APP_HEIGHT_PX
|
|
},
|
|
position: {
|
|
x: Window.x + Window.innerWidth - SETTINGS_APP_WIDTH_PX - SETTINGS_APP_RIGHT_MARGIN,
|
|
y: Math.max(Window.y + POPOUT_SAFE_MARGIN_Y, Window.y + Window.innerHeight / 2 - SETTINGS_APP_HEIGHT_PX / 2)
|
|
},
|
|
overrideFlags: SETTINGS_APP_WINDOW_FLAGS
|
|
});
|
|
|
|
settingsAppWindow.fromQml.connect(onMessageFromSettingsApp);
|
|
settingsAppWindow.closed.connect(onSettingsAppClosed);
|
|
}
|
|
|
|
|
|
function handleGoToAudioSettings() {
|
|
if (!settingsAppWindow) {
|
|
toggleSettingsApp();
|
|
}
|
|
|
|
settingsAppWindow.sendToQml({
|
|
"source": "simplifiedUI.js",
|
|
"method": "goToSettingsTab",
|
|
"data": {
|
|
"settingsTab": "audio"
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
var HELP_APP_MESSAGE_SOURCE = "HelpApp.qml";
|
|
function onMessageFromHelpApp(message) {
|
|
if (message.source !== HELP_APP_MESSAGE_SOURCE) {
|
|
return;
|
|
}
|
|
|
|
switch (message.method) {
|
|
case "goToAudioSettings":
|
|
handleGoToAudioSettings();
|
|
break;
|
|
|
|
default:
|
|
console.log("Unrecognized message from " + HELP_APP_MESSAGE_SOURCE + ": " + JSON.stringify(message));
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
function onHelpAppClosed() {
|
|
if (helpAppWindow) {
|
|
helpAppWindow.fromQml.disconnect(onMessageFromHelpApp);
|
|
helpAppWindow.closed.disconnect(onHelpAppClosed);
|
|
}
|
|
helpAppWindow = false;
|
|
}
|
|
|
|
|
|
var HELP_APP_QML_PATH = Script.resourcesPath() + "qml/hifi/simplifiedUI/helpApp/HelpApp.qml";
|
|
var HELP_APP_WINDOW_TITLE = "Help";
|
|
var HELP_APP_PRESENTATION_MODE = Desktop.PresentationMode.NATIVE;
|
|
var HELP_APP_WIDTH_PX = 480;
|
|
var HELP_APP_HEIGHT_PX = 615;
|
|
var HELP_APP_WINDOW_FLAGS = 0x00000001 | // Qt::Window
|
|
0x00001000 | // Qt::WindowTitleHint
|
|
0x00002000 | // Qt::WindowSystemMenuHint
|
|
0x08000000 | // Qt::WindowCloseButtonHint
|
|
0x00008000 | // Qt::WindowMaximizeButtonHint
|
|
0x00004000; // Qt::WindowMinimizeButtonHint
|
|
var helpAppWindow = false;
|
|
function toggleHelpApp() {
|
|
if (helpAppWindow) {
|
|
helpAppWindow.close();
|
|
// This really shouldn't be necessary.
|
|
// This signal really should automatically be called by the signal handler set up below.
|
|
// But fixing that requires an engine change, so this workaround will do.
|
|
onHelpAppClosed();
|
|
return;
|
|
}
|
|
|
|
helpAppWindow = Desktop.createWindow(HELP_APP_QML_PATH, {
|
|
title: HELP_APP_WINDOW_TITLE,
|
|
presentationMode: HELP_APP_PRESENTATION_MODE,
|
|
size: {
|
|
x: HELP_APP_WIDTH_PX,
|
|
y: HELP_APP_HEIGHT_PX
|
|
},
|
|
position: {
|
|
x: Math.max(Window.x + POPOUT_SAFE_MARGIN_X, Window.x + Window.innerWidth / 2 - HELP_APP_WIDTH_PX / 2),
|
|
y: Math.max(Window.y + POPOUT_SAFE_MARGIN_Y, Window.y + Window.innerHeight / 2 - HELP_APP_HEIGHT_PX / 2)
|
|
},
|
|
overrideFlags: HELP_APP_WINDOW_FLAGS
|
|
});
|
|
|
|
helpAppWindow.fromQml.connect(onMessageFromHelpApp);
|
|
helpAppWindow.closed.connect(onHelpAppClosed);
|
|
}
|
|
|
|
|
|
function maybeDeleteOutputDeviceMutedOverlay() {
|
|
if (outputDeviceMutedOverlay) {
|
|
Overlays.deleteOverlay(outputDeviceMutedOverlay);
|
|
outputDeviceMutedOverlay = false;
|
|
}
|
|
}
|
|
|
|
|
|
var outputDeviceMutedOverlay = false;
|
|
var OUTPUT_DEVICE_MUTED_OVERLAY_DEFAULT_DIMS_PX = 300;
|
|
var OUTPUT_DEVICE_MUTED_OVERLAY_DEFAULT_MARGINS_PX = 20;
|
|
var OUTPUT_DEVICE_MUTED_DIMS_RATIO_TO_WINDOW_SIZE = 0.8;
|
|
function updateOutputDeviceMutedOverlay(isMuted) {
|
|
if (isMuted) {
|
|
var props = {
|
|
imageURL: Script.resolvePath("images/outputDeviceMuted.svg"),
|
|
alpha: 0.5
|
|
};
|
|
|
|
var overlayDims = OUTPUT_DEVICE_MUTED_OVERLAY_DEFAULT_DIMS_PX;
|
|
var overlayWithMarginsDims = overlayDims + 2 * OUTPUT_DEVICE_MUTED_OVERLAY_DEFAULT_MARGINS_PX;
|
|
|
|
if (overlayWithMarginsDims > Window.innerHeight || overlayWithMarginsDims > Window.innerWidth) {
|
|
var minWindowDims = Math.min(Window.innerHeight, Window.innerWidth);
|
|
overlayDims = Math.round(minWindowDims * OUTPUT_DEVICE_MUTED_DIMS_RATIO_TO_WINDOW_SIZE);
|
|
}
|
|
|
|
props.width = overlayDims;
|
|
props.height = overlayDims;
|
|
props.x = Window.innerWidth / 2 - overlayDims / 2;
|
|
props.y = Window.innerHeight / 2 - overlayDims / 2;
|
|
if (outputDeviceMutedOverlay) {
|
|
Overlays.editOverlay(outputDeviceMutedOverlay, props);
|
|
} else {
|
|
outputDeviceMutedOverlay = Overlays.addOverlay("image", props);
|
|
}
|
|
} else {
|
|
maybeDeleteOutputDeviceMutedOverlay();
|
|
}
|
|
}
|
|
|
|
|
|
var savedAvatarGain = Audio.avatarGain;
|
|
var savedServerInjectorGain = Audio.serverInjectorGain;
|
|
var savedLocalInjectorGain = Audio.localInjectorGain;
|
|
var savedSystemInjectorGain = Audio.systemInjectorGain;
|
|
var MUTED_VALUE_DB = -60; // This should always match `SimplifiedConstants.qml` -> numericConstants -> mutedValue!
|
|
function setOutputMuted(outputMuted) {
|
|
if (outputMuted) {
|
|
savedAvatarGain = Audio.avatarGain;
|
|
savedServerInjectorGain = Audio.serverInjectorGain;
|
|
savedLocalInjectorGain = Audio.localInjectorGain;
|
|
savedSystemInjectorGain = Audio.systemInjectorGain;
|
|
|
|
Audio.avatarGain = MUTED_VALUE_DB;
|
|
Audio.serverInjectorGain = MUTED_VALUE_DB;
|
|
Audio.localInjectorGain = MUTED_VALUE_DB;
|
|
Audio.systemInjectorGain = MUTED_VALUE_DB;
|
|
} else {
|
|
if (savedAvatarGain === MUTED_VALUE_DB) {
|
|
savedAvatarGain = 0;
|
|
}
|
|
Audio.avatarGain = savedAvatarGain;
|
|
if (savedServerInjectorGain === MUTED_VALUE_DB) {
|
|
savedServerInjectorGain = 0;
|
|
}
|
|
Audio.serverInjectorGain = savedServerInjectorGain;
|
|
if (savedLocalInjectorGain === MUTED_VALUE_DB) {
|
|
savedLocalInjectorGain = 0;
|
|
}
|
|
Audio.localInjectorGain = savedLocalInjectorGain;
|
|
if (savedSystemInjectorGain === MUTED_VALUE_DB) {
|
|
savedSystemInjectorGain = 0;
|
|
}
|
|
Audio.systemInjectorGain = savedSystemInjectorGain;
|
|
}
|
|
}
|
|
|
|
var TOP_BAR_HEIGHT_PX = 48;
|
|
var INITIAL_LAUNCH_QML_PATH = Script.resolvePath("./simplifiedFTUE/InitialLaunchWindow.qml");
|
|
var INITIAL_LAUNCH_WINDOW_TITLE = "Initial Launch";
|
|
var INITIAL_LAUNCH_PRESENTATION_MODE = Desktop.PresentationMode.NATIVE;
|
|
var INITIAL_WINDOW_FLAGS = 0x00000001 | // Qt::Window
|
|
0x00000008 | // Qt::Popup
|
|
0x00000002 | // Qt::Tool
|
|
0x00000800 | // Qt::FramelessWindowHint
|
|
0x40000000; // Qt::NoDropShadowWindowHint
|
|
var initialLaunchWindow = false;
|
|
function displayInitialLaunchWindow() {
|
|
if (initialLaunchWindow) {
|
|
return;
|
|
}
|
|
|
|
simplifiedEmote.handleFTUEScreensVisibilityChanged(true);
|
|
|
|
initialLaunchWindow = Desktop.createWindow(INITIAL_LAUNCH_QML_PATH, {
|
|
title: INITIAL_LAUNCH_WINDOW_TITLE,
|
|
presentationMode: INITIAL_LAUNCH_PRESENTATION_MODE,
|
|
isFullScreenWindow: true,
|
|
overrideFlags: INITIAL_WINDOW_FLAGS
|
|
});
|
|
|
|
initialLaunchWindow.fromQml.connect(onMessageFromInitialLaunchWindow);
|
|
|
|
Window.location = "file:///~/serverless/empty.json";
|
|
}
|
|
|
|
var SECOND_LAUNCH_QML_PATH = Script.resolvePath("simplifiedFTUE/SecondLaunchWindow.qml");
|
|
var SECOND_LAUNCH_WINDOW_TITLE = "Second Launch";
|
|
var SECOND_LAUNCH_PRESENTATION_MODE = Desktop.PresentationMode.NATIVE;
|
|
var SECOND_WINDOW_FLAGS = 0x00000001 | // Qt::Window
|
|
0x00000008 | // Qt::Popup
|
|
0x00000002 | // Qt::Tool
|
|
0x00000800 | // Qt::FramelessWindowHint
|
|
0x40000000; // Qt::NoDropShadowWindowHint
|
|
var secondLaunchWindow = false;
|
|
function displaySecondLaunchWindow() {
|
|
if (secondLaunchWindow) {
|
|
return;
|
|
}
|
|
|
|
simplifiedEmote.handleFTUEScreensVisibilityChanged(true);
|
|
|
|
secondLaunchWindow = Desktop.createWindow(SECOND_LAUNCH_QML_PATH, {
|
|
title: SECOND_LAUNCH_WINDOW_TITLE,
|
|
presentationMode: SECOND_LAUNCH_PRESENTATION_MODE,
|
|
isFullScreenWindow: true,
|
|
overrideFlags: SECOND_WINDOW_FLAGS
|
|
});
|
|
|
|
secondLaunchWindow.fromQml.connect(onMessageFromSecondLaunchWindow);
|
|
|
|
Window.location = "file:///~/serverless/empty.json";
|
|
}
|
|
|
|
function closeInitialLaunchWindow() {
|
|
if (initialLaunchWindow) {
|
|
initialLaunchWindow.fromQml.disconnect(onMessageFromInitialLaunchWindow);
|
|
initialLaunchWindow.close();
|
|
initialLaunchWindow = null;
|
|
}
|
|
|
|
simplifiedEmote.handleFTUEScreensVisibilityChanged(false);
|
|
}
|
|
|
|
function closeSecondLaunchWindow() {
|
|
if (secondLaunchWindow) {
|
|
secondLaunchWindow.fromQml.disconnect(onMessageFromSecondLaunchWindow);
|
|
secondLaunchWindow.close();
|
|
secondLaunchWindow = null;
|
|
}
|
|
|
|
simplifiedEmote.handleFTUEScreensVisibilityChanged(false);
|
|
}
|
|
|
|
var INITIAL_LAUNCH_WINDOW_MESSAGE_SOURCE = "InitialLaunchWindow.qml";
|
|
function onMessageFromInitialLaunchWindow(message) {
|
|
if (message.source !== INITIAL_LAUNCH_WINDOW_MESSAGE_SOURCE) {
|
|
return;
|
|
}
|
|
|
|
switch (message.method) {
|
|
case "closeInitialLaunchWindow":
|
|
closeInitialLaunchWindow();
|
|
var homeLocation = LocationBookmarks.getAddress("hqhome");
|
|
if (homeLocation) {
|
|
Window.location = homeLocation;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
console.log("Unrecognized message from " + INITIAL_LAUNCH_WINDOW_MESSAGE_SOURCE + ": " + JSON.stringify(message));
|
|
break;
|
|
}
|
|
}
|
|
|
|
var SECOND_LAUNCH_WINDOW_MESSAGE_SOURCE = "SecondLaunchWindow.qml";
|
|
function onMessageFromSecondLaunchWindow(message) {
|
|
if (message.source !== SECOND_LAUNCH_WINDOW_MESSAGE_SOURCE) {
|
|
return;
|
|
}
|
|
|
|
switch (message.method) {
|
|
case "closeSecondLaunchWindow":
|
|
closeSecondLaunchWindow();
|
|
var homeLocation = LocationBookmarks.getAddress("hqhome");
|
|
if (homeLocation) {
|
|
Window.location = homeLocation;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
console.log("Unrecognized message from " + SECOND_LAUNCH_WINDOW_MESSAGE_SOURCE + ": " + JSON.stringify(message));
|
|
break;
|
|
}
|
|
}
|
|
|
|
var WAIT_FOR_TOP_BAR_MS = 1000;
|
|
function sendLocalStatusToQml() {
|
|
var currentStatus = si.getLocalStatus();
|
|
|
|
if (topBarWindow && currentStatus) {
|
|
topBarWindow.sendToQml({
|
|
"source": "simplifiedUI.js",
|
|
"method": "updateStatusButton",
|
|
"data": {
|
|
"currentStatus": currentStatus
|
|
}
|
|
});
|
|
} else {
|
|
Script.setTimeout(sendLocalStatusToQml, WAIT_FOR_TOP_BAR_MS);
|
|
}
|
|
}
|
|
|
|
|
|
var TOP_BAR_MESSAGE_SOURCE = "SimplifiedTopBar.qml";
|
|
function onMessageFromTopBar(message) {
|
|
if (message.source !== TOP_BAR_MESSAGE_SOURCE) {
|
|
return;
|
|
}
|
|
switch (message.method) {
|
|
case "toggleAvatarApp":
|
|
toggleAvatarApp();
|
|
break;
|
|
|
|
case "toggleSettingsApp":
|
|
toggleSettingsApp();
|
|
break;
|
|
|
|
case "toggleHelpApp":
|
|
toggleHelpApp();
|
|
break;
|
|
|
|
case "setOutputMuted":
|
|
setOutputMuted(message.data.outputMuted);
|
|
break;
|
|
|
|
case "toggleStatus":
|
|
si.toggleStatus();
|
|
break;
|
|
|
|
case "displayInitialLaunchWindow":
|
|
displayInitialLaunchWindow();
|
|
break;
|
|
|
|
case "displaySecondLaunchWindow":
|
|
displaySecondLaunchWindow();
|
|
break;
|
|
|
|
default:
|
|
console.log("Unrecognized message from " + TOP_BAR_MESSAGE_SOURCE + ": " + JSON.stringify(message));
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
function onTopBarClosed() {
|
|
if (topBarWindow) {
|
|
topBarWindow.fromQml.disconnect(onMessageFromTopBar);
|
|
topBarWindow.closed.disconnect(onTopBarClosed);
|
|
}
|
|
topBarWindow = false;
|
|
}
|
|
|
|
|
|
function isOutputMuted() {
|
|
return Audio.avatarGain === MUTED_VALUE_DB &&
|
|
Audio.serverInjectorGain === MUTED_VALUE_DB &&
|
|
Audio.localInjectorGain === MUTED_VALUE_DB &&
|
|
Audio.systemInjectorGain === MUTED_VALUE_DB;
|
|
}
|
|
|
|
|
|
var TOP_BAR_QML_PATH = Script.resourcesPath() + "qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml";
|
|
var TOP_BAR_WINDOW_TITLE = "Simplified Top Bar";
|
|
var TOP_BAR_PRESENTATION_MODE = Desktop.PresentationMode.NATIVE;
|
|
var TOP_BAR_WIDTH_PX = Window.innerWidth;
|
|
var topBarWindow = false;
|
|
function loadSimplifiedTopBar() {
|
|
var windowProps = {
|
|
title: TOP_BAR_WINDOW_TITLE,
|
|
presentationMode: TOP_BAR_PRESENTATION_MODE,
|
|
size: {
|
|
x: TOP_BAR_WIDTH_PX,
|
|
y: TOP_BAR_HEIGHT_PX
|
|
}
|
|
};
|
|
windowProps.presentationWindowInfo = {
|
|
dockArea: Desktop.DockArea.TOP
|
|
};
|
|
topBarWindow = Desktop.createWindow(TOP_BAR_QML_PATH, windowProps);
|
|
|
|
topBarWindow.fromQml.connect(onMessageFromTopBar);
|
|
topBarWindow.closed.connect(onTopBarClosed);
|
|
|
|
// The eventbridge takes a nonzero time to initialize, so we have to wait a bit
|
|
// for the QML to load and for that to happen before updating the UI.
|
|
Script.setTimeout(function() {
|
|
sendLocalStatusToQml();
|
|
}, WAIT_FOR_TOP_BAR_MS);
|
|
}
|
|
|
|
|
|
function maybeDeleteInputDeviceMutedOverlay() {
|
|
if (inputDeviceMutedOverlay) {
|
|
Overlays.deleteOverlay(inputDeviceMutedOverlay);
|
|
inputDeviceMutedOverlay = false;
|
|
}
|
|
}
|
|
|
|
|
|
var inputDeviceMutedOverlay = false;
|
|
var INPUT_DEVICE_MUTED_OVERLAY_DEFAULT_X_PX = 237;
|
|
var INPUT_DEVICE_MUTED_OVERLAY_DEFAULT_Y_PX = 64;
|
|
var INPUT_DEVICE_MUTED_MARGIN_LEFT_PX = 20;
|
|
var INPUT_DEVICE_MUTED_MARGIN_TOP_PX = 20;
|
|
function updateInputDeviceMutedOverlay(isMuted) {
|
|
if (isMuted) {
|
|
var props = {
|
|
imageURL: Script.resolvePath("images/inputDeviceMuted.svg"),
|
|
alpha: 0.5
|
|
};
|
|
props.width = INPUT_DEVICE_MUTED_OVERLAY_DEFAULT_X_PX;
|
|
props.height = INPUT_DEVICE_MUTED_OVERLAY_DEFAULT_Y_PX;
|
|
props.x = INPUT_DEVICE_MUTED_MARGIN_LEFT_PX;
|
|
props.y = INPUT_DEVICE_MUTED_MARGIN_TOP_PX;
|
|
if (inputDeviceMutedOverlay) {
|
|
Overlays.editOverlay(inputDeviceMutedOverlay, props);
|
|
} else {
|
|
inputDeviceMutedOverlay = Overlays.addOverlay("image", props);
|
|
}
|
|
} else {
|
|
maybeDeleteInputDeviceMutedOverlay();
|
|
}
|
|
}
|
|
|
|
|
|
function onDesktopInputDeviceMutedChanged(isMuted) {
|
|
if (!HMD.active) {
|
|
updateInputDeviceMutedOverlay(isMuted);
|
|
}
|
|
}
|
|
|
|
|
|
function onHMDInputDeviceMutedChanged(isMuted) {
|
|
if (HMD.active) {
|
|
updateInputDeviceMutedOverlay(isMuted);
|
|
}
|
|
}
|
|
|
|
|
|
function onGeometryChanged(rect) {
|
|
updateInputDeviceMutedOverlay(Audio.muted);
|
|
updateOutputDeviceMutedOverlay(isOutputMuted());
|
|
}
|
|
|
|
var initialLaunchWindowIsMinimized = false;
|
|
var secondLaunchWindowIsMinimized = false;
|
|
function onWindowMinimizedChanged(isMinimized) {
|
|
if (isMinimized) {
|
|
handleInitialLaunchWindowVisibleChanged(false);
|
|
handleSecondLaunchWindowVisibleChanged(false);
|
|
} else if (!HMD.active) {
|
|
handleInitialLaunchWindowVisibleChanged(true);
|
|
handleSecondLaunchWindowVisibleChanged(true);
|
|
}
|
|
}
|
|
|
|
function handleInitialLaunchWindowVisibleChanged(shouldBeVisible) {
|
|
if (shouldBeVisible && !initialLaunchWindow && initialLaunchWindowIsMinimized) {
|
|
displayInitialLaunchWindow();
|
|
initialLaunchWindowIsMinimized = false;
|
|
} else if (!shouldBeVisible && initialLaunchWindow) {
|
|
closeInitialLaunchWindow();
|
|
initialLaunchWindowIsMinimized = true;
|
|
}
|
|
}
|
|
|
|
function handleSecondLaunchWindowVisibleChanged(shouldBeVisible) {
|
|
if (shouldBeVisible && !secondLaunchWindow && secondLaunchWindowIsMinimized) {
|
|
displaySecondLaunchWindow();
|
|
secondLaunchWindowIsMinimized = false;
|
|
} else if (!shouldBeVisible && secondLaunchWindow) {
|
|
closeSecondLaunchWindow();
|
|
secondLaunchWindowIsMinimized = true;
|
|
}
|
|
}
|
|
|
|
function onDisplayModeChanged(isHMDMode) {
|
|
if (isHMDMode) {
|
|
Camera.setModeString("first person look at");
|
|
}
|
|
|
|
if (isHMDMode) {
|
|
onHMDInputDeviceMutedChanged(Audio.mutedHMD);
|
|
handleInitialLaunchWindowVisibleChanged(false);
|
|
handleSecondLaunchWindowVisibleChanged(false);
|
|
} else {
|
|
onDesktopInputDeviceMutedChanged(Audio.mutedDesktop);
|
|
handleInitialLaunchWindowVisibleChanged(true);
|
|
handleSecondLaunchWindowVisibleChanged(true);
|
|
}
|
|
}
|
|
|
|
function onToolbarVisibleChanged(isVisible, toolbarName) {
|
|
if (isVisible && toolbarName == TOOLBAR_NAME && !Settings.getValue("simplifiedUI/keepExistingUIAndScripts", false)) {
|
|
var toolbar = Toolbars.getToolbar(toolbarName);
|
|
if (toolbar) {
|
|
toolbar.writeProperty("visible", false);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function onStatusChanged() {
|
|
sendLocalStatusToQml();
|
|
}
|
|
|
|
|
|
function maybeUpdateOutputDeviceMutedOverlay() {
|
|
updateOutputDeviceMutedOverlay(isOutputMuted());
|
|
}
|
|
|
|
|
|
var oldAutomaticLODAdjust;
|
|
var oldLODAngleDeg;
|
|
var SIMPLIFIED_UI_AUTO_LOD_ADJUST = false;
|
|
var SIMPLIFIED_UI_LOD_ANGLE_DEG = 0.248;
|
|
function modifyLODSettings() {
|
|
oldAutomaticLODAdjust = LODManager.automaticLODAdjust;
|
|
oldLODAngleDeg = LODManager.lodAngleDeg;
|
|
|
|
LODManager.automaticLODAdjust = SIMPLIFIED_UI_AUTO_LOD_ADJUST;
|
|
LODManager.lodAngleDeg = SIMPLIFIED_UI_LOD_ANGLE_DEG;
|
|
}
|
|
|
|
|
|
function restoreLODSettings() {
|
|
LODManager.automaticLODAdjust = oldAutomaticLODAdjust;
|
|
LODManager.lodAngleDeg = oldLODAngleDeg;
|
|
}
|
|
|
|
|
|
var nametag = Script.require("./simplifiedNametag/simplifiedNametag.js");
|
|
var si = Script.require("./simplifiedStatusIndicator/simplifiedStatusIndicator.js");
|
|
var simplifiedEmote = Script.require("../simplifiedEmote/simplifiedEmote.js");
|
|
var oldShowAudioTools;
|
|
var oldShowBubbleTools;
|
|
var keepExistingUIAndScriptsSetting = Settings.getValue("simplifiedUI/keepExistingUIAndScripts", false);
|
|
function startup() {
|
|
maybeRemoveDesktopMenu();
|
|
modifyLODSettings();
|
|
|
|
if (!keepExistingUIAndScriptsSetting) {
|
|
if (!HMD.active) {
|
|
var toolbar = Toolbars.getToolbar(TOOLBAR_NAME);
|
|
if (toolbar) {
|
|
toolbar.writeProperty("visible", false);
|
|
}
|
|
}
|
|
}
|
|
|
|
loadSimplifiedTopBar();
|
|
|
|
|
|
si.updateProperties({ statusChanged: onStatusChanged });
|
|
|
|
updateInputDeviceMutedOverlay(Audio.muted);
|
|
updateOutputDeviceMutedOverlay(isOutputMuted());
|
|
Audio.mutedDesktopChanged.connect(onDesktopInputDeviceMutedChanged);
|
|
Audio.mutedHMDChanged.connect(onHMDInputDeviceMutedChanged);
|
|
Window.geometryChanged.connect(onGeometryChanged);
|
|
Window.minimizedChanged.connect(onWindowMinimizedChanged);
|
|
HMD.displayModeChanged.connect(onDisplayModeChanged);
|
|
Audio.avatarGainChanged.connect(maybeUpdateOutputDeviceMutedOverlay);
|
|
Audio.localInjectorGainChanged.connect(maybeUpdateOutputDeviceMutedOverlay);
|
|
Audio.serverInjectorGainChanged.connect(maybeUpdateOutputDeviceMutedOverlay);
|
|
Audio.systemInjectorGainChanged.connect(maybeUpdateOutputDeviceMutedOverlay);
|
|
Toolbars.toolbarVisibleChanged.connect(onToolbarVisibleChanged);
|
|
|
|
oldShowAudioTools = AvatarInputs.showAudioTools;
|
|
AvatarInputs.showAudioTools = false;
|
|
oldShowBubbleTools = AvatarInputs.showBubbleTools;
|
|
AvatarInputs.showBubbleTools = false;
|
|
}
|
|
|
|
|
|
function shutdown() {
|
|
restoreLODSettings();
|
|
|
|
if (!keepExistingUIAndScriptsSetting) {
|
|
|
|
if (!HMD.active) {
|
|
var toolbar = Toolbars.getToolbar(TOOLBAR_NAME);
|
|
if (toolbar) {
|
|
toolbar.writeProperty("visible", true);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (topBarWindow) {
|
|
topBarWindow.close();
|
|
}
|
|
|
|
if (avatarAppWindow) {
|
|
avatarAppWindow.close();
|
|
}
|
|
|
|
if (settingsAppWindow) {
|
|
settingsAppWindow.close();
|
|
}
|
|
|
|
if (initialLaunchWindow) {
|
|
closeInitialLaunchWindow();
|
|
}
|
|
|
|
if (secondLaunchWindow) {
|
|
closeSecondLaunchWindow();
|
|
}
|
|
|
|
maybeDeleteInputDeviceMutedOverlay();
|
|
maybeDeleteOutputDeviceMutedOverlay();
|
|
|
|
Audio.mutedDesktopChanged.disconnect(onDesktopInputDeviceMutedChanged);
|
|
Audio.mutedHMDChanged.disconnect(onHMDInputDeviceMutedChanged);
|
|
Window.geometryChanged.disconnect(onGeometryChanged);
|
|
Window.minimizedChanged.disconnect(onWindowMinimizedChanged);
|
|
HMD.displayModeChanged.disconnect(onDisplayModeChanged);
|
|
Audio.avatarGainChanged.disconnect(maybeUpdateOutputDeviceMutedOverlay);
|
|
Audio.localInjectorGainChanged.disconnect(maybeUpdateOutputDeviceMutedOverlay);
|
|
Audio.serverInjectorGainChanged.disconnect(maybeUpdateOutputDeviceMutedOverlay);
|
|
Audio.systemInjectorGainChanged.disconnect(maybeUpdateOutputDeviceMutedOverlay);
|
|
Toolbars.toolbarVisibleChanged.disconnect(onToolbarVisibleChanged);
|
|
|
|
AvatarInputs.showAudioTools = oldShowAudioTools;
|
|
AvatarInputs.showBubbleTools = oldShowBubbleTools;
|
|
}
|
|
|
|
|
|
Script.scriptEnding.connect(shutdown);
|
|
startup();
|