//// WindowScriptingInterface.h// interface/src/scripting//// Created by Ryan Huffman on 4/29/14.// Copyright 2014 High Fidelity, Inc.// Copyright 2023 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// SPDX-License-Identifier: Apache-2.0// #ifndef hifi_WindowScriptingInterface_h#define hifi_WindowScriptingInterface_h #include <glm/glm.hpp> #include <QtCore/QObject>#include <QtCore/QString>#include <QtQuick/QQuickItem>#include <QtWidgets/QMessageBox> #include <DependencyManager.h>#include <Scriptable.h>#include <ScriptValue.h> /*@jsdoc * The <code>Window</code> API provides various facilities not covered elsewhere, including: window dimensions, window focus, * camera view, announcements, user connections, common dialog boxes, snapshots, file import, domain navigation, domain changes, * domain physics, OS clipboard, build number. * * @namespace Window * * @hifi-interface * @hifi-client-entity * @hifi-avatar * * @property {number} innerWidth - The width of the drawable area of the Interface window (i.e., without borders or other * chrome), in pixels. <em>Read-only.</em> * @property {number} innerHeight - The height of the drawable area of the Interface window (i.e., without borders or other * chrome), in pixels. <em>Read-only.</em> * @property {number} x - The x display coordinate of the top left corner of the drawable area of the Interface window. * <em>Read-only.</em> * @property {number} y - The y display coordinate of the top left corner of the drawable area of the Interface window. * <em>Read-only.</em> * @property {boolean} interstitialModeEnabled=false - <code>true</code> if the interstitial graphics are displayed when a * domain is loading, otherwise <code>false</code>. * @property {location} location - Provides facilities for working with your current directory services location. */ class WindowScriptingInterface : public QObject, protected Scriptable, public Dependency { Q_OBJECT Q_PROPERTY(int innerWidth READ getInnerWidth) Q_PROPERTY(int innerHeight READ getInnerHeight) Q_PROPERTY(int x READ getX) Q_PROPERTY(int y READ getY) Q_PROPERTY(bool interstitialModeEnabled READ getInterstitialModeEnabled WRITE setInterstitialModeEnabled) public: WindowScriptingInterface(); ~WindowScriptingInterface(); int getInnerWidth(); int getInnerHeight(); int getX(); int getY(); public slots: /*@jsdoc * Checks whether the Interface window has focus. * @function Window.hasFocus * @returns {boolean} <code>true</code> if the Interface window has focus, <code>false</code> if it doesn't. */ ScriptValue hasFocus(); /*@jsdoc * Makes the Interface window have focus. On Windows, if Interface doesn't already have focus, the task bar icon flashes to * indicate that Interface wants attention but focus isn't taken away from the application that the user is using. * @function Window.setFocus */ void setFocus(); /*@jsdoc * Raises the Interface window if it is minimized. If raised, the window gains focus. * @function Window.raise */ void raise(); /*@jsdoc * Displays a dialog with the specified message and an "OK" button. The dialog is non-modal; the script continues without * waiting for a user response. * @function Window.alert * @param {string} [message=""] - The message to display. * @example <caption>Display a friendly greeting.</caption> * Window.alert("Welcome!"); * print("Script continues without waiting"); */ void alert(const QString& message = ""); /*@jsdoc * Prompts the user to confirm something. Displays a modal dialog with a message plus "Yes" and "No" buttons. * @function Window.confirm * @param {string} [message=""] - The question to display. * @returns {boolean} <code>true</code> if the user selects "Yes", otherwise <code>false</code>. * @example <caption>Ask the user a question requiring a yes/no answer.</caption> * var answer = Window.confirm("Are you sure?"); * print(answer); // true or false */ ScriptValue confirm(const QString& message = ""); /*@jsdoc * Prompts the user to enter some text. Displays a modal dialog with a message and a text box, plus "OK" and "Cancel" * buttons. * @function Window.prompt * @param {string} message - The question to display. * @param {string} defaultText - The default answer text. * @returns {string} The text that the user entered if they select "OK", otherwise null. * @example <caption>Ask the user a question requiring a text answer.</caption> * var answer = Window.prompt("Question", "answer"); * if (answer === null) { * print("User canceled"); * } else { * print("User answer: " + answer); * } */ ScriptValue prompt(const QString& message, const QString& defaultText); /*@jsdoc * Prompts the user to enter some text. Displays a non-modal dialog with a message and a text box, plus "OK" and "Cancel" * buttons. A {@link Window.promptTextChanged|promptTextChanged} signal is emitted when the user OKs the dialog; no signal * is emitted if the user cancels the dialog. * @function Window.promptAsync * @param {string} [message=""] - The question to display. * @param {string} [defaultText=""] - The default answer text. * @example <caption>Ask the user a question requiring a text answer without waiting for the answer.</caption> * function onPromptTextChanged(text) { * print("User answer: " + text); * } * Window.promptTextChanged.connect(onPromptTextChanged); * * Window.promptAsync("Question", "answer"); * print("Script continues without waiting"); */ void promptAsync(const QString& message = "", const QString& defaultText = ""); /*@jsdoc * Prompts the user to choose a directory. Displays a modal dialog that navigates the directory tree. * @function Window.browseDir * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @returns {string} The path of the directory if one is chosen, otherwise <code>null</code>. * @example <caption>Ask the user to choose a directory.</caption> * var directory = Window.browseDir("Select Directory", Paths.resources); * print("Directory: " + directory); */ ScriptValue browseDir(const QString& title = "", const QString& directory = ""); /*@jsdoc * Prompts the user to choose a directory. Displays a non-modal dialog that navigates the directory tree. A * {@link Window.browseDirChanged|browseDirChanged} signal is emitted when a directory is chosen; no signal is emitted if * the user cancels the dialog. * @function Window.browseDirAsync * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @example <caption>Ask the user to choose a directory without waiting for the answer.</caption> * function onBrowseDirChanged(directory) { * print("Directory: " + directory); * } * Window.browseDirChanged.connect(onBrowseDirChanged); * * Window.browseDirAsync("Select Directory", Paths.resources); * print("Script continues without waiting"); */ void browseDirAsync(const QString& title = "", const QString& directory = ""); /*@jsdoc * Prompts the user to choose a file. Displays a modal dialog that navigates the directory tree. * @function Window.browse * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @returns {string} The path and name of the file if one is chosen, otherwise <code>null</code>. * @example <caption>Ask the user to choose an image file.</caption> * var filename = Window.browse("Select Image File", Paths.resources, "Images (*.png *.jpg *.svg)"); * print("File: " + filename); */ ScriptValue browse(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Prompts the user to choose a file. Displays a non-modal dialog that navigates the directory tree. A * {@link Window.browseChanged|browseChanged} signal is emitted when a file is chosen; no signal is emitted if the user * cancels the dialog. * @function Window.browseAsync * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @example <caption>Ask the user to choose an image file without waiting for the answer.</caption> * function onBrowseChanged(filename) { * print("File: " + filename); * } * Window.browseChanged.connect(onBrowseChanged); * * Window.browseAsync("Select Image File", Paths.resources, "Images (*.png *.jpg *.svg)"); * print("Script continues without waiting"); */ void browseAsync(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Prompts the user to specify the path and name of a file to save to. Displays a modal dialog that navigates the directory * tree and allows the user to type in a file name. * @function Window.save * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @returns {string} The path and name of the file if one is specified, otherwise <code>null</code>. If a single file type * is specified in the nameFilter, that file type extension is automatically appended to the result when appropriate. * @example <caption>Ask the user to specify a file to save to.</caption> * var filename = Window.save("Save to JSON file", Paths.resources, "*.json"); * print("File: " + filename); */ ScriptValue save(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Prompts the user to specify the path and name of a file to save to. Displays a non-modal dialog that navigates the * directory tree and allows the user to type in a file name. A {@link Window.saveFileChanged|saveFileChanged} signal is * emitted when a file is specified; no signal is emitted if the user cancels the dialog. * @function Window.saveAsync * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @example <caption>Ask the user to specify a file to save to without waiting for an answer.</caption> * function onSaveFileChanged(filename) { * print("File: " + filename); * } * Window.saveFileChanged.connect(onSaveFileChanged); * * Window.saveAsync("Save to JSON file", Paths.resources, "*.json"); * print("Script continues without waiting"); */ void saveAsync(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Prompts the user to choose an Asset Server item. Displays a modal dialog that navigates the tree of assets on the Asset * Server. * @function Window.browseAssets * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @returns {string} The path and name of the asset if one is chosen, otherwise <code>null</code>. * @example <caption>Ask the user to select an FBX asset.</caption> * var asset = Window.browseAssets("Select FBX File", "/", "*.fbx"); * print("FBX file: " + asset); */ ScriptValue browseAssets(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Prompts the user to choose an Asset Server item. Displays a non-modal dialog that navigates the tree of assets on the * Asset Server. An {@link Window.assetsDirChanged|assetsDirChanged} signal is emitted when an asset is chosen; no signal is * emitted if the user cancels the dialog. * @function Window.browseAssetsAsync * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @example * function onAssetsDirChanged(asset) { * print("FBX file: " + asset); * } * Window.assetsDirChanged.connect(onAssetsDirChanged); * * Window.browseAssetsAsync("Select FBX File", "/", "*.fbx"); * print("Script continues without waiting"); */ void browseAssetsAsync(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Opens the Asset Browser dialog. If a file to upload is specified, the user is prompted to enter the folder and name to * map the file to on the asset server. * @function Window.showAssetServer * @param {string} [uploadFile=""] - The path and name of a file to upload to the asset server. * @example <caption>Upload a file to the asset server.</caption> * var filename = Window.browse("Select File to Add to Asset Server", Paths.resources); * print("File: " + filename); * Window.showAssetServer(filename); */ void showAssetServer(const QString& upload = ""); /*@jsdoc * Gets Interface's build number. * @function Window.checkVersion * @returns {string} Interface's build number. */ QString checkVersion(); /*@jsdoc * Gets Interface's user agent. * @function Window.getUserAgent * @returns {string} Interface's user agent. */ QString getUserAgent(); /*@jsdoc * Gets the signature for Interface's protocol version. * @function Window.protocolSignature * @returns {string} A string uniquely identifying the version of the directory services protocol that Interface is using. */ QString protocolSignature(); /*@jsdoc * Copies text to the operating system's clipboard. * @function Window.copyToClipboard * @param {string} text - The text to copy to the operating system's clipboard. */ void copyToClipboard(const QString& text); /*@jsdoc * Takes a snapshot of the current Interface view from the primary camera. When a still image only is captured, * {@link Window.stillSnapshotTaken|stillSnapshotTaken} is emitted; when a still image plus moving images are captured, * {@link Window.processingGifStarted|processingGifStarted} and {@link Window.processingGifCompleted|processingGifCompleted} * are emitted. * <p>Snapshots are saved to the path specified in Settings > General > Snapshots, which can be accessed via the * {@link Snapshot} API.</p> * * @function Window.takeSnapshot * @param {boolean} [notify=true] - This value is passed on through the {@link Window.stillSnapshotTaken|stillSnapshotTaken} * signal. * @param {boolean} [includeAnimated=false] - If <code>true</code>, a moving image is captured as an animated GIF in addition * to a still image. * @param {number} [aspectRatio=0] - The width/height ratio of the snapshot required. If the value is <code>0</code>, the * full resolution is used (window dimensions in desktop mode; HMD display dimensions in HMD mode), otherwise one of the * dimensions is adjusted in order to match the aspect ratio. * @param {string} [filename=""] - If a filename is not provided, the image is saved as "overte-snap-by-<user * name>-on-YYYY-MM-DD_HH-MM-SS". * <p>Still images are saved in JPEG, PNG or WEBP format according to the extension provided — <code>".jpg"</code>, * <code>".jpeg"</code>, <code>".png"</code>, or <code>".webp"</code> — or if not provided then in the format chosen in general settings, * Default is PNG. Animated images are saved in GIF format.</p> * * @example <caption>Using the snapshot function and signals.</caption> * function onStillSnapshotTaken(path, notify) { * print("Still snapshot taken: " + path); * print("Notify: " + notify); * } * * function onProcessingGifStarted(stillPath) { * print("Still snapshot taken: " + stillPath); * } * * function onProcessingGifCompleted(animatedPath) { * print("Animated snapshot taken: " + animatedPath); * } * * Window.stillSnapshotTaken.connect(onStillSnapshotTaken); * Window.processingGifStarted.connect(onProcessingGifStarted); * Window.processingGifCompleted.connect(onProcessingGifCompleted); * * var notify = true; * var animated = true; * var aspect = 1920 / 1080; * var filename = "example-snapshot"; * Window.takeSnapshot(notify, animated, aspect, filename); */ void takeSnapshot(bool notify = true, bool includeAnimated = false, float aspectRatio = 0.0f, const QString& filename = QString()); /*@jsdoc * Takes a still snapshot of the current view from the secondary camera that can be set up through the {@link Render} API. * <p>Snapshots are saved to the path specified in Settings > General > Snapshots, which can be accessed via the * {@link Snapshot} API.</p> * @function Window.takeSecondaryCameraSnapshot * @param {boolean} [notify=true] - This value is passed on through the {@link Window.stillSnapshotTaken|stillSnapshotTaken} * signal. * @param {string} [filename=""] - If a filename is not provided, the image is saved as "overte-snap-by-<user * name>-on-YYYY-MM-DD_HH-MM-SS". * <p>Still images are saved in JPEG, PNG or WEBP format according to the extension provided — <code>".jpg"</code>, * <code>".jpeg"</code>, <code>".png"</code>, or <code>".webp"</code> — or if not provided then in the format chosen in general settings, * Default is PNG. Animated images are saved in GIF format.</p> */ void takeSecondaryCameraSnapshot(const bool& notify = true, const QString& filename = QString()); /*@jsdoc * Takes a 360° snapshot at a given position for the secondary camera. The secondary camera does not need to have been * set up. * <p>Snapshots are saved to the path specified in Settings > General > Snapshots, which can be accessed via the * {@link Snapshot} API.</p> * @function Window.takeSecondaryCamera360Snapshot * @param {Vec3} cameraPosition - The position of the camera for the snapshot. * @param {boolean} [cubemapOutputFormat=false] - If <code>true</code> then the snapshot is saved as a cube map image, * otherwise it is saved as an equirectangular image. * @param {boolean} [notify=true] - This value is passed on through the {@link Window.stillSnapshotTaken|stillSnapshotTaken} * signal. * @param {string} [filename=""] - If a filename is not provided, the image is saved as "overte-snap-by-<user * name>-on-YYYY-MM-DD_HH-MM-SS". * <p>Still images are saved in JPEG, PNG or WEBP format according to the extension provided — <code>".jpg"</code>, * <code>".jpeg"</code>, <code>".png"</code>, or <code>".webp"</code> — or if not provided then in the format chosen in general settings, * Default is PNG. Animated images are saved in GIF format.</p> */ void takeSecondaryCamera360Snapshot(const glm::vec3& cameraPosition, const bool& cubemapOutputFormat = false, const bool& notify = true, const QString& filename = QString()); /*@jsdoc * Emits a {@link Window.connectionAdded|connectionAdded} or a {@link Window.connectionError|connectionError} signal that * indicates whether or not a user connection was successfully made using the Web API. * @function Window.makeConnection * @param {boolean} success - If <code>true</code> then {@link Window.connectionAdded|connectionAdded} is emitted, otherwise * {@link Window.connectionError|connectionError} is emitted. * @param {string} description - Descriptive text about the connection success or error. This is sent in the signal emitted. */ void makeConnection(bool success, const QString& userNameOrError); /*@jsdoc * Displays a notification message. Notifications are displayed in panels by the default script, nofications.js. An * {@link Window.announcement|announcement} signal is emitted when this function is called. * @function Window.displayAnnouncement * @param {string} message - The announcement message. * @example <caption>Send and capture an announcement message.</caption> * function onAnnouncement(message) { * // The message is also displayed as a notification by notifications.js. * print("Announcement: " + message); * } * Window.announcement.connect(onAnnouncement); * * Window.displayAnnouncement("Hello"); */ void displayAnnouncement(const QString& message); /*@jsdoc * Prepares a snapshot ready for sharing. A {@link Window.snapshotShared|snapshotShared} signal is emitted when the snapshot * has been prepared. * @function Window.shareSnapshot * @param {string} path - The path and name of the image file to share. * @param {string} [href=""] - The directory services location where the snapshot was taken. */ void shareSnapshot(const QString& path, const QUrl& href = QUrl("")); /*@jsdoc * Checks to see if physics is active for you in the domain you're visiting - there is a delay between your arrival at a * domain and physics becoming active for you in that domain. * @function Window.isPhysicsEnabled * @returns {boolean} <code>true</code> if physics is currently active for you, otherwise <code>false</code>. * @example <caption>Wait for physics to be enabled when you change domains.</caption> * function checkForPhysics() { * var isPhysicsEnabled = Window.isPhysicsEnabled(); * print("Physics enabled: " + isPhysicsEnabled); * if (!isPhysicsEnabled) { * Script.setTimeout(checkForPhysics, 1000); * } * } * * function onDomainChanged(domain) { * print("Domain changed: " + domain); * Script.setTimeout(checkForPhysics, 1000); * } * * Window.domainChanged.connect(onDomainChanged); */ bool isPhysicsEnabled(); /*@jsdoc * Sets what to show on the PC display. For entity camera view, the entity camera is configured using * {@link Camera.setCameraEntity} and {@link Camera|Camera.mode}. * @function Window.setDisplayTexture * @param {Window.DisplayTexture} texture - The view to display. * @returns {boolean} <code>true</code> if the display texture was successfully set, otherwise <code>false</code>. */ bool setDisplayTexture(const QString& name); /*@jsdoc * Checks if a 2D point is within the desktop window if in desktop mode, or the drawable area of the HUD overlay if in HMD * mode. * @function Window.isPointOnDesktopWindow * @param {Vec2} point - The point to check. * @returns {boolean} <code>true</code> if the point is within the window or HUD, otherwise <code>false</code>. */ bool isPointOnDesktopWindow(QVariant point); /*@jsdoc * Gets the size of the drawable area of the Interface window if in desktop mode or the HMD rendering surface if in HMD mode. * @function Window.getDeviceSize * @returns {Vec2} The width and height of the Interface window or HMD rendering surface, in pixels. */ glm::vec2 getDeviceSize() const; /*@jsdoc * Gets the last domain connection error when a connection is refused. * @function Window.getLastDomainConnectionError * @returns {Window.ConnectionRefusedReason} Integer number that enumerates the last domain connection refused. */ int getLastDomainConnectionError() const; /*@jsdoc * Opens a non-modal message box that can have a variety of button combinations. See also, * {@link Window.updateMessageBox|updateMessageBox} and {@link Window.closeMessageBox|closeMessageBox}. * @function Window.openMessageBox * @param {string} title - The title to display for the message box. * @param {string} text - Text to display in the message box.Lines 1–500 of 875. Load more
// // WindowScriptingInterface.h // interface/src/scripting // // Created by Ryan Huffman on 4/29/14. // Copyright 2014 High Fidelity, Inc. // Copyright 2023 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 // SPDX-License-Identifier: Apache-2.0 // #ifndef hifi_WindowScriptingInterface_h #define hifi_WindowScriptingInterface_h #include <glm/glm.hpp> #include <QtCore/QObject> #include <QtCore/QString> #include <QtQuick/QQuickItem> #include <QtWidgets/QMessageBox> #include <DependencyManager.h> #include <Scriptable.h> #include <ScriptValue.h> /*@jsdoc * The <code>Window</code> API provides various facilities not covered elsewhere, including: window dimensions, window focus, * camera view, announcements, user connections, common dialog boxes, snapshots, file import, domain navigation, domain changes, * domain physics, OS clipboard, build number. * * @namespace Window * * @hifi-interface * @hifi-client-entity * @hifi-avatar * * @property {number} innerWidth - The width of the drawable area of the Interface window (i.e., without borders or other * chrome), in pixels. <em>Read-only.</em> * @property {number} innerHeight - The height of the drawable area of the Interface window (i.e., without borders or other * chrome), in pixels. <em>Read-only.</em> * @property {number} x - The x display coordinate of the top left corner of the drawable area of the Interface window. * <em>Read-only.</em> * @property {number} y - The y display coordinate of the top left corner of the drawable area of the Interface window. * <em>Read-only.</em> * @property {boolean} interstitialModeEnabled=false - <code>true</code> if the interstitial graphics are displayed when a * domain is loading, otherwise <code>false</code>. * @property {location} location - Provides facilities for working with your current directory services location. */ class WindowScriptingInterface : public QObject, protected Scriptable, public Dependency { Q_OBJECT Q_PROPERTY(int innerWidth READ getInnerWidth) Q_PROPERTY(int innerHeight READ getInnerHeight) Q_PROPERTY(int x READ getX) Q_PROPERTY(int y READ getY) Q_PROPERTY(bool interstitialModeEnabled READ getInterstitialModeEnabled WRITE setInterstitialModeEnabled) public: WindowScriptingInterface(); ~WindowScriptingInterface(); int getInnerWidth(); int getInnerHeight(); int getX(); int getY(); public slots: /*@jsdoc * Checks whether the Interface window has focus. * @function Window.hasFocus * @returns {boolean} <code>true</code> if the Interface window has focus, <code>false</code> if it doesn't. */ ScriptValue hasFocus(); /*@jsdoc * Makes the Interface window have focus. On Windows, if Interface doesn't already have focus, the task bar icon flashes to * indicate that Interface wants attention but focus isn't taken away from the application that the user is using. * @function Window.setFocus */ void setFocus(); /*@jsdoc * Raises the Interface window if it is minimized. If raised, the window gains focus. * @function Window.raise */ void raise(); /*@jsdoc * Displays a dialog with the specified message and an "OK" button. The dialog is non-modal; the script continues without * waiting for a user response. * @function Window.alert * @param {string} [message=""] - The message to display. * @example <caption>Display a friendly greeting.</caption> * Window.alert("Welcome!"); * print("Script continues without waiting"); */ void alert(const QString& message = ""); /*@jsdoc * Prompts the user to confirm something. Displays a modal dialog with a message plus "Yes" and "No" buttons. * @function Window.confirm * @param {string} [message=""] - The question to display. * @returns {boolean} <code>true</code> if the user selects "Yes", otherwise <code>false</code>. * @example <caption>Ask the user a question requiring a yes/no answer.</caption> * var answer = Window.confirm("Are you sure?"); * print(answer); // true or false */ ScriptValue confirm(const QString& message = ""); /*@jsdoc * Prompts the user to enter some text. Displays a modal dialog with a message and a text box, plus "OK" and "Cancel" * buttons. * @function Window.prompt * @param {string} message - The question to display. * @param {string} defaultText - The default answer text. * @returns {string} The text that the user entered if they select "OK", otherwise null. * @example <caption>Ask the user a question requiring a text answer.</caption> * var answer = Window.prompt("Question", "answer"); * if (answer === null) { * print("User canceled"); * } else { * print("User answer: " + answer); * } */ ScriptValue prompt(const QString& message, const QString& defaultText); /*@jsdoc * Prompts the user to enter some text. Displays a non-modal dialog with a message and a text box, plus "OK" and "Cancel" * buttons. A {@link Window.promptTextChanged|promptTextChanged} signal is emitted when the user OKs the dialog; no signal * is emitted if the user cancels the dialog. * @function Window.promptAsync * @param {string} [message=""] - The question to display. * @param {string} [defaultText=""] - The default answer text. * @example <caption>Ask the user a question requiring a text answer without waiting for the answer.</caption> * function onPromptTextChanged(text) { * print("User answer: " + text); * } * Window.promptTextChanged.connect(onPromptTextChanged); * * Window.promptAsync("Question", "answer"); * print("Script continues without waiting"); */ void promptAsync(const QString& message = "", const QString& defaultText = ""); /*@jsdoc * Prompts the user to choose a directory. Displays a modal dialog that navigates the directory tree. * @function Window.browseDir * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @returns {string} The path of the directory if one is chosen, otherwise <code>null</code>. * @example <caption>Ask the user to choose a directory.</caption> * var directory = Window.browseDir("Select Directory", Paths.resources); * print("Directory: " + directory); */ ScriptValue browseDir(const QString& title = "", const QString& directory = ""); /*@jsdoc * Prompts the user to choose a directory. Displays a non-modal dialog that navigates the directory tree. A * {@link Window.browseDirChanged|browseDirChanged} signal is emitted when a directory is chosen; no signal is emitted if * the user cancels the dialog. * @function Window.browseDirAsync * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @example <caption>Ask the user to choose a directory without waiting for the answer.</caption> * function onBrowseDirChanged(directory) { * print("Directory: " + directory); * } * Window.browseDirChanged.connect(onBrowseDirChanged); * * Window.browseDirAsync("Select Directory", Paths.resources); * print("Script continues without waiting"); */ void browseDirAsync(const QString& title = "", const QString& directory = ""); /*@jsdoc * Prompts the user to choose a file. Displays a modal dialog that navigates the directory tree. * @function Window.browse * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @returns {string} The path and name of the file if one is chosen, otherwise <code>null</code>. * @example <caption>Ask the user to choose an image file.</caption> * var filename = Window.browse("Select Image File", Paths.resources, "Images (*.png *.jpg *.svg)"); * print("File: " + filename); */ ScriptValue browse(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Prompts the user to choose a file. Displays a non-modal dialog that navigates the directory tree. A * {@link Window.browseChanged|browseChanged} signal is emitted when a file is chosen; no signal is emitted if the user * cancels the dialog. * @function Window.browseAsync * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @example <caption>Ask the user to choose an image file without waiting for the answer.</caption> * function onBrowseChanged(filename) { * print("File: " + filename); * } * Window.browseChanged.connect(onBrowseChanged); * * Window.browseAsync("Select Image File", Paths.resources, "Images (*.png *.jpg *.svg)"); * print("Script continues without waiting"); */ void browseAsync(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Prompts the user to specify the path and name of a file to save to. Displays a modal dialog that navigates the directory * tree and allows the user to type in a file name. * @function Window.save * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @returns {string} The path and name of the file if one is specified, otherwise <code>null</code>. If a single file type * is specified in the nameFilter, that file type extension is automatically appended to the result when appropriate. * @example <caption>Ask the user to specify a file to save to.</caption> * var filename = Window.save("Save to JSON file", Paths.resources, "*.json"); * print("File: " + filename); */ ScriptValue save(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Prompts the user to specify the path and name of a file to save to. Displays a non-modal dialog that navigates the * directory tree and allows the user to type in a file name. A {@link Window.saveFileChanged|saveFileChanged} signal is * emitted when a file is specified; no signal is emitted if the user cancels the dialog. * @function Window.saveAsync * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @example <caption>Ask the user to specify a file to save to without waiting for an answer.</caption> * function onSaveFileChanged(filename) { * print("File: " + filename); * } * Window.saveFileChanged.connect(onSaveFileChanged); * * Window.saveAsync("Save to JSON file", Paths.resources, "*.json"); * print("Script continues without waiting"); */ void saveAsync(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Prompts the user to choose an Asset Server item. Displays a modal dialog that navigates the tree of assets on the Asset * Server. * @function Window.browseAssets * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @returns {string} The path and name of the asset if one is chosen, otherwise <code>null</code>. * @example <caption>Ask the user to select an FBX asset.</caption> * var asset = Window.browseAssets("Select FBX File", "/", "*.fbx"); * print("FBX file: " + asset); */ ScriptValue browseAssets(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Prompts the user to choose an Asset Server item. Displays a non-modal dialog that navigates the tree of assets on the * Asset Server. An {@link Window.assetsDirChanged|assetsDirChanged} signal is emitted when an asset is chosen; no signal is * emitted if the user cancels the dialog. * @function Window.browseAssetsAsync * @param {string} [title=""] - The title to display at the top of the dialog. * @param {string} [directory=""] - The initial directory to start browsing at. * @param {string} [nameFilter=""] - The types of files to display. Examples: <code>"*.json"</code> and * <code>"Images (*.png *.jpg *.svg)"</code>. All files are displayed if a filter isn't specified. * @example * function onAssetsDirChanged(asset) { * print("FBX file: " + asset); * } * Window.assetsDirChanged.connect(onAssetsDirChanged); * * Window.browseAssetsAsync("Select FBX File", "/", "*.fbx"); * print("Script continues without waiting"); */ void browseAssetsAsync(const QString& title = "", const QString& directory = "", const QString& nameFilter = ""); /*@jsdoc * Opens the Asset Browser dialog. If a file to upload is specified, the user is prompted to enter the folder and name to * map the file to on the asset server. * @function Window.showAssetServer * @param {string} [uploadFile=""] - The path and name of a file to upload to the asset server. * @example <caption>Upload a file to the asset server.</caption> * var filename = Window.browse("Select File to Add to Asset Server", Paths.resources); * print("File: " + filename); * Window.showAssetServer(filename); */ void showAssetServer(const QString& upload = ""); /*@jsdoc * Gets Interface's build number. * @function Window.checkVersion * @returns {string} Interface's build number. */ QString checkVersion(); /*@jsdoc * Gets Interface's user agent. * @function Window.getUserAgent * @returns {string} Interface's user agent. */ QString getUserAgent(); /*@jsdoc * Gets the signature for Interface's protocol version. * @function Window.protocolSignature * @returns {string} A string uniquely identifying the version of the directory services protocol that Interface is using. */ QString protocolSignature(); /*@jsdoc * Copies text to the operating system's clipboard. * @function Window.copyToClipboard * @param {string} text - The text to copy to the operating system's clipboard. */ void copyToClipboard(const QString& text); /*@jsdoc * Takes a snapshot of the current Interface view from the primary camera. When a still image only is captured, * {@link Window.stillSnapshotTaken|stillSnapshotTaken} is emitted; when a still image plus moving images are captured, * {@link Window.processingGifStarted|processingGifStarted} and {@link Window.processingGifCompleted|processingGifCompleted} * are emitted. * <p>Snapshots are saved to the path specified in Settings > General > Snapshots, which can be accessed via the * {@link Snapshot} API.</p> * * @function Window.takeSnapshot * @param {boolean} [notify=true] - This value is passed on through the {@link Window.stillSnapshotTaken|stillSnapshotTaken} * signal. * @param {boolean} [includeAnimated=false] - If <code>true</code>, a moving image is captured as an animated GIF in addition * to a still image. * @param {number} [aspectRatio=0] - The width/height ratio of the snapshot required. If the value is <code>0</code>, the * full resolution is used (window dimensions in desktop mode; HMD display dimensions in HMD mode), otherwise one of the * dimensions is adjusted in order to match the aspect ratio. * @param {string} [filename=""] - If a filename is not provided, the image is saved as "overte-snap-by-<user * name>-on-YYYY-MM-DD_HH-MM-SS". * <p>Still images are saved in JPEG, PNG or WEBP format according to the extension provided — <code>".jpg"</code>, * <code>".jpeg"</code>, <code>".png"</code>, or <code>".webp"</code> — or if not provided then in the format chosen in general settings, * Default is PNG. Animated images are saved in GIF format.</p> * * @example <caption>Using the snapshot function and signals.</caption> * function onStillSnapshotTaken(path, notify) { * print("Still snapshot taken: " + path); * print("Notify: " + notify); * } * * function onProcessingGifStarted(stillPath) { * print("Still snapshot taken: " + stillPath); * } * * function onProcessingGifCompleted(animatedPath) { * print("Animated snapshot taken: " + animatedPath); * } * * Window.stillSnapshotTaken.connect(onStillSnapshotTaken); * Window.processingGifStarted.connect(onProcessingGifStarted); * Window.processingGifCompleted.connect(onProcessingGifCompleted); * * var notify = true; * var animated = true; * var aspect = 1920 / 1080; * var filename = "example-snapshot"; * Window.takeSnapshot(notify, animated, aspect, filename); */ void takeSnapshot(bool notify = true, bool includeAnimated = false, float aspectRatio = 0.0f, const QString& filename = QString()); /*@jsdoc * Takes a still snapshot of the current view from the secondary camera that can be set up through the {@link Render} API. * <p>Snapshots are saved to the path specified in Settings > General > Snapshots, which can be accessed via the * {@link Snapshot} API.</p> * @function Window.takeSecondaryCameraSnapshot * @param {boolean} [notify=true] - This value is passed on through the {@link Window.stillSnapshotTaken|stillSnapshotTaken} * signal. * @param {string} [filename=""] - If a filename is not provided, the image is saved as "overte-snap-by-<user * name>-on-YYYY-MM-DD_HH-MM-SS". * <p>Still images are saved in JPEG, PNG or WEBP format according to the extension provided — <code>".jpg"</code>, * <code>".jpeg"</code>, <code>".png"</code>, or <code>".webp"</code> — or if not provided then in the format chosen in general settings, * Default is PNG. Animated images are saved in GIF format.</p> */ void takeSecondaryCameraSnapshot(const bool& notify = true, const QString& filename = QString()); /*@jsdoc * Takes a 360° snapshot at a given position for the secondary camera. The secondary camera does not need to have been * set up. * <p>Snapshots are saved to the path specified in Settings > General > Snapshots, which can be accessed via the * {@link Snapshot} API.</p> * @function Window.takeSecondaryCamera360Snapshot * @param {Vec3} cameraPosition - The position of the camera for the snapshot. * @param {boolean} [cubemapOutputFormat=false] - If <code>true</code> then the snapshot is saved as a cube map image, * otherwise it is saved as an equirectangular image. * @param {boolean} [notify=true] - This value is passed on through the {@link Window.stillSnapshotTaken|stillSnapshotTaken} * signal. * @param {string} [filename=""] - If a filename is not provided, the image is saved as "overte-snap-by-<user * name>-on-YYYY-MM-DD_HH-MM-SS". * <p>Still images are saved in JPEG, PNG or WEBP format according to the extension provided — <code>".jpg"</code>, * <code>".jpeg"</code>, <code>".png"</code>, or <code>".webp"</code> — or if not provided then in the format chosen in general settings, * Default is PNG. Animated images are saved in GIF format.</p> */ void takeSecondaryCamera360Snapshot(const glm::vec3& cameraPosition, const bool& cubemapOutputFormat = false, const bool& notify = true, const QString& filename = QString()); /*@jsdoc * Emits a {@link Window.connectionAdded|connectionAdded} or a {@link Window.connectionError|connectionError} signal that * indicates whether or not a user connection was successfully made using the Web API. * @function Window.makeConnection * @param {boolean} success - If <code>true</code> then {@link Window.connectionAdded|connectionAdded} is emitted, otherwise * {@link Window.connectionError|connectionError} is emitted. * @param {string} description - Descriptive text about the connection success or error. This is sent in the signal emitted. */ void makeConnection(bool success, const QString& userNameOrError); /*@jsdoc * Displays a notification message. Notifications are displayed in panels by the default script, nofications.js. An * {@link Window.announcement|announcement} signal is emitted when this function is called. * @function Window.displayAnnouncement * @param {string} message - The announcement message. * @example <caption>Send and capture an announcement message.</caption> * function onAnnouncement(message) { * // The message is also displayed as a notification by notifications.js. * print("Announcement: " + message); * } * Window.announcement.connect(onAnnouncement); * * Window.displayAnnouncement("Hello"); */ void displayAnnouncement(const QString& message); /*@jsdoc * Prepares a snapshot ready for sharing. A {@link Window.snapshotShared|snapshotShared} signal is emitted when the snapshot * has been prepared. * @function Window.shareSnapshot * @param {string} path - The path and name of the image file to share. * @param {string} [href=""] - The directory services location where the snapshot was taken. */ void shareSnapshot(const QString& path, const QUrl& href = QUrl("")); /*@jsdoc * Checks to see if physics is active for you in the domain you're visiting - there is a delay between your arrival at a * domain and physics becoming active for you in that domain. * @function Window.isPhysicsEnabled * @returns {boolean} <code>true</code> if physics is currently active for you, otherwise <code>false</code>. * @example <caption>Wait for physics to be enabled when you change domains.</caption> * function checkForPhysics() { * var isPhysicsEnabled = Window.isPhysicsEnabled(); * print("Physics enabled: " + isPhysicsEnabled); * if (!isPhysicsEnabled) { * Script.setTimeout(checkForPhysics, 1000); * } * } * * function onDomainChanged(domain) { * print("Domain changed: " + domain); * Script.setTimeout(checkForPhysics, 1000); * } * * Window.domainChanged.connect(onDomainChanged); */ bool isPhysicsEnabled(); /*@jsdoc * Sets what to show on the PC display. For entity camera view, the entity camera is configured using * {@link Camera.setCameraEntity} and {@link Camera|Camera.mode}. * @function Window.setDisplayTexture * @param {Window.DisplayTexture} texture - The view to display. * @returns {boolean} <code>true</code> if the display texture was successfully set, otherwise <code>false</code>. */ bool setDisplayTexture(const QString& name); /*@jsdoc * Checks if a 2D point is within the desktop window if in desktop mode, or the drawable area of the HUD overlay if in HMD * mode. * @function Window.isPointOnDesktopWindow * @param {Vec2} point - The point to check. * @returns {boolean} <code>true</code> if the point is within the window or HUD, otherwise <code>false</code>. */ bool isPointOnDesktopWindow(QVariant point); /*@jsdoc * Gets the size of the drawable area of the Interface window if in desktop mode or the HMD rendering surface if in HMD mode. * @function Window.getDeviceSize * @returns {Vec2} The width and height of the Interface window or HMD rendering surface, in pixels. */ glm::vec2 getDeviceSize() const; /*@jsdoc * Gets the last domain connection error when a connection is refused. * @function Window.getLastDomainConnectionError * @returns {Window.ConnectionRefusedReason} Integer number that enumerates the last domain connection refused. */ int getLastDomainConnectionError() const; /*@jsdoc * Opens a non-modal message box that can have a variety of button combinations. See also, * {@link Window.updateMessageBox|updateMessageBox} and {@link Window.closeMessageBox|closeMessageBox}. * @function Window.openMessageBox * @param {string} title - The title to display for the message box. * @param {string} text - Text to display in the message box.