diff --git a/interface/src/scripting/MenuScriptingInterface.h b/interface/src/scripting/MenuScriptingInterface.h index 855b1af13b..b1c389f733 100644 --- a/interface/src/scripting/MenuScriptingInterface.h +++ b/interface/src/scripting/MenuScriptingInterface.h @@ -17,6 +17,30 @@ class MenuItemProperties; +/**jsdoc + * The `Menu` provides access to the menu that is shown at the top of the window + * shown on a user's desktop and the right click menu that is accessible + * in both Desktop and HMD mode. + * + *

Groupings

+ * A `grouping` is a way to group a set of menus and/or menu items together + * so that they can all be set visible or invisible as a group. There are + * 2 available groups: "Advanced" and "Developer" + * These groupings can be toggled in the "Settings" menu. + * + * @namespace Menu + */ + +/** + * CURRENTLY NOT WORKING: + * + *

Action groups

+ * When 1+ menu items are checkable and in the same action group, only 1 can be + * selected at any one time. If another item in the action group is selected, the + * previous will be deselected. This feature provides the ability to create + * "radio-button"-like menus. + */ + class MenuScriptingInterface : public QObject { Q_OBJECT MenuScriptingInterface() { }; @@ -28,33 +52,142 @@ private slots: void menuItemTriggered(); public slots: + /**jsdoc + * Add a new top-level menu. + * @function Menu.addMenu + * @param {string} menuName Name that will be shown in the menu. + * @param {string} grouping Name of the grouping to add this menu to. + */ void addMenu(const QString& menuName, const QString& grouping = QString()); + + /**jsdoc + * Remove a top-level menu. + * @function Menu.removeMenu + * @param {string} menuName Name of the menu to remove. + */ void removeMenu(const QString& menuName); + + /**jsdoc + * Check whether a top-level menu exists. + * @function Menu.menuExists + * @param {string} menuName Name of the menu to check for existence. + * @return {bool} `true` if the menu exists, otherwise `false`. + */ bool menuExists(const QString& menuName); + /**jsdoc + * Add a separator with an unclickable label below it. + * The line will be placed at the bottom of the menu. + * @function Menu.addSeparator + * @param {string} menuName Name of the menu to add a separator to. + * @param {string} separatorName Name of the separator that will be shown (but unclickable) below the separator line. + */ void addSeparator(const QString& menuName, const QString& separatorName); + + /**jsdoc + * Remove a separator and its label from a menu. + * @function Menu.removeSeparator + * @param {string} menuName Name of the menu to remove a separator from. + * @param {string} separatorName Name of the separator to remove. + */ void removeSeparator(const QString& menuName, const QString& separatorName); - + + /**jsdoc + * Add a new menu item to a menu. + * @function Menu.addMenuItem + * @param {Menu.MenuItemProperties} properties + */ void addMenuItem(const MenuItemProperties& properties); + + /**jsdoc + * Add a new menu item to a menu. + * @function Menu.addMenuItem + * @param {string} menuName Name of the menu to add a menu item to. + * @param {string} menuItem Name of the menu item. This is what will be displayed in the menu. + * @param {string} shortcutKey A shortcut key that can be used to trigger the menu item. + */ void addMenuItem(const QString& menuName, const QString& menuitem, const QString& shortcutKey); + + /**jsdoc + * Add a new menu item to a menu. + * @function Menu.addMenuItem + * @param {string} menuName Name of the menu to add a menu item to. + * @param {string} menuItem Name of the menu item. This is what will be displayed in the menu. + */ void addMenuItem(const QString& menuName, const QString& menuitem); + /**jsdoc + * Remove a menu item from a menu. + * @function Menu.removeMenuItem + * @param {string} menuName Name of the menu to remove a menu item from. + * @param {string} menuItem Name of the menu item to remove. + */ void removeMenuItem(const QString& menuName, const QString& menuitem); + + /**jsdoc + * Check if a menu item exists. + * @function Menu.menuItemExists + * @param {string} menuName Name of the menu that the menu item is in. + * @param {string} menuItem Name of the menu item to check for existence of. + * @return {bool} `true` if the menu item exists, otherwise `false`. + */ bool menuItemExists(const QString& menuName, const QString& menuitem); + /** + * Not working, will not document until fixed + */ void addActionGroup(const QString& groupName, const QStringList& actionList, const QString& selected = QString()); void removeActionGroup(const QString& groupName); - + + /**jsdoc + * Check whether a checkable menu item is checked. + * @function Menu.isOptionChecked + * @param {string} menuOption The name of the menu item. + * @return `true` if the option is checked, otherwise false. + */ bool isOptionChecked(const QString& menuOption); + + /**jsdoc + * Set a checkable menu item as checked or unchecked. + * @function Menu.setIsOptionChecked + * @param {string} menuOption The name of the menu item to modify. + * @param {bool} isChecked If `true`, the menu item will be checked, otherwise it will not be checked. + */ void setIsOptionChecked(const QString& menuOption, bool isChecked); + /**jsdoc + * Toggle the status of a checkable menu item. If it is checked, it will be unchecked. + * If it is unchecked, it will be checked. + * @function Menu.setIsOptionChecked + * @param {string} menuOption The name of the menu item to toggle. + */ void triggerOption(const QString& menuOption); + /**jsdoc + * Check whether a menu is enabled. If a menu is disabled it will be greyed out + * and unselectable. + * Menus are enabled by default. + * @function Menu.isMenuEnabled + * @param {string} menuName The name of the menu to check. + * @return {bool} `true` if the menu is enabled, otherwise false. + */ bool isMenuEnabled(const QString& menuName); + + /**jsdoc + * Set a menu to be enabled or disabled. + * @function Menu.setMenuEnabled + * @param {string} menuName The name of the menu to modify. + * @param {bool} isEnabled Whether the menu will be enabled or not. + */ void setMenuEnabled(const QString& menuName, bool isEnabled); - + signals: + /**jsdoc + * This is a signal that is emitted when a menu item is clicked. + * @function Menu.menuItemEvent + * @param {string} menuItem Name of the menu item that was triggered. + */ void menuItemEvent(const QString& menuItem); }; diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index e19a6b36a9..b5fe9c12cc 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -39,6 +39,14 @@ Q_DECLARE_METATYPE(OverlayPropertyResult); QScriptValue OverlayPropertyResultToScriptValue(QScriptEngine* engine, const OverlayPropertyResult& value); void OverlayPropertyResultFromScriptValue(const QScriptValue& object, OverlayPropertyResult& value); +/**jsdoc + * @typedef Overlays.RayToOverlayIntersectionResult + * @property {bool} intersects True if the PickRay intersected with a 3D overlay. + * @property {Overlays.OverlayID} overlayID The ID of the overlay that was intersected with. + * @property {float} distance The distance from the PickRay origin to the intersection point. + * @property {Vec3} surfaceNormal The normal of the surface that was intersected with. + * @property {Vec3} intersection The point at which the PickRay intersected with the overlay. + */ class RayToOverlayIntersectionResult { public: RayToOverlayIntersectionResult(); @@ -57,6 +65,16 @@ Q_DECLARE_METATYPE(RayToOverlayIntersectionResult); QScriptValue RayToOverlayIntersectionResultToScriptValue(QScriptEngine* engine, const RayToOverlayIntersectionResult& value); void RayToOverlayIntersectionResultFromScriptValue(const QScriptValue& object, RayToOverlayIntersectionResult& value); +/**jsdoc + * @typedef {int} Overlays.OverlayID + */ + +/**jsdoc + * + * Overlays namespace... + * @namespace Overlays + */ + class Overlays : public QObject { Q_OBJECT @@ -72,57 +90,137 @@ public: Overlay::Pointer getOverlay(unsigned int id) const; OverlayPanel::Pointer getPanel(unsigned int id) const { return _panels[id]; } - void cleanupAllOverlays(); - -public slots: - /// adds an overlay with the specific properties - unsigned int addOverlay(const QString& type, const QVariant& properties); - /// adds an overlay that's already been created unsigned int addOverlay(Overlay* overlay) { return addOverlay(Overlay::Pointer(overlay)); } unsigned int addOverlay(Overlay::Pointer overlay); - /// clones an existing overlay + void cleanupAllOverlays(); + +public slots: + /**jsdoc + * Add an overlays to the scene. The properties specified will depend + * on the type of overlay that is being created. + * + * @function Overlays.addOverlay + * @param {string} type The type of the overlay to add. + * @param {Overlays.OverlayProperties} The properties of the overlay that you want to add. + * @return {Overlays.OverlayID} The ID of the newly created overlay. + */ + unsigned int addOverlay(const QString& type, const QVariant& properties); + + /**jsdoc + * Create a clone of an existing overlay. + * + * @function Overlays.cloneOverlay + * @param {Overlays.OverlayID} overlayID The ID of the overlay to clone. + * @return {Overlays.OverlayID} The ID of the new overlay. + */ unsigned int cloneOverlay(unsigned int id); - /// edits an overlay updating only the included properties, will return the identified OverlayID in case of - /// successful edit, if the input id is for an unknown overlay this function will have no effect + /**jsdoc + * Edit an overlay's properties. + * + * @function Overlays.editOverlay + * @param {Overlays.OverlayID} overlayID The ID of the overlay to edit. + * @return {bool} `true` if the overlay was found and edited, otherwise false. + */ bool editOverlay(unsigned int id, const QVariant& properties); /// edits an overlay updating only the included properties, will return the identified OverlayID in case of /// successful edit, if the input id is for an unknown overlay this function will have no effect bool editOverlays(const QVariant& propertiesById); - /// deletes an overlay + /**jsdoc + * Delete an overlay. + * + * @function Overlays.deleteOverlay + * @param {Overlays.OverlayID} overlayID The ID of the overlay to delete. + */ void deleteOverlay(unsigned int id); - /// get the string type of the overlay used in addOverlay + /**jsdoc + * Get the type of an overlay. + * + * @function Overlays.getOverlayType + * @param {Overlays.OverlayID} overlayID The ID of the overlay to get the type of. + * @return {string} The type of the overlay if found, otherwise the empty string. + */ QString getOverlayType(unsigned int overlayId) const; + /**jsdoc + * Get the ID of the overlay at a particular point on the HUD/screen. + * + * @function Overlays.getOverlayAtPoint + * @param {Vec2} point The point to check for an overlay. + * @return {Overlays.OverlayID} The ID of the overlay at the point specified. + * If no overlay is found, `0` will be returned. + */ + unsigned int getOverlayAtPoint(const glm::vec2& point); + + /**jsdoc + * Get the value of a an overlay's property. + * + * @function Overlays.getProperty + * @param {Overlays.OverlayID} The ID of the overlay to get the property of. + * @param {string} The name of the property to get the value of. + * @return {Object} The value of the property. If the overlay or the property could + * not be found, `undefined` will be returned. + */ + OverlayPropertyResult getProperty(unsigned int id, const QString& property); + + /*jsdoc + * Find the closest 3D overlay hit by a pick ray. + * + * @function Overlays.findRayIntersection + * @param {PickRay} The PickRay to use for finding overlays. + * @return {Overlays.RayToOverlayIntersectionResult} The result of the ray cast. + */ + RayToOverlayIntersectionResult findRayIntersection(const PickRay& ray); + + /**jsdoc + * Check whether an overlay's assets have been loaded. For example, if the + * overlay is an "image" overlay, this will indicate whether the its image + * has loaded. + * @function Overlays.isLoaded + * @param {Overlays.OverlayID} The ID of the overlay to check. + * @return {bool} `true` if the overlay's assets have been loaded, otherwise `false`. + */ + bool isLoaded(unsigned int id); + + /**jsdoc + * Calculates the size of the given text in the specified overlay if it is a text overlay. + * If it is a 2D text overlay, the size will be in pixels. + * If it is a 3D text overlay, the size will be in meters. + * + * @function Overlays.textSize + * @param {Overlays.OverlayID} The ID of the overlay to measure. + * @param {string} The string to measure. + * @return {Vec2} The size of the text. + */ + QSizeF textSize(unsigned int id, const QString& text) const; + + /**jsdoc + * Get the width of the virtual 2D HUD. + * + * @function Overlays.width + * @return {float} The width of the 2D HUD. + */ + float width() const; + + /**jsdoc + * Get the height of the virtual 2D HUD. + * + * @function Overlays.height + * @return {float} The height of the 2D HUD. + */ + float height() const; + + /// return true if there is an overlay with that id else false + bool isAddedOverlay(unsigned int id); + unsigned int getParentPanel(unsigned int childId) const; void setParentPanel(unsigned int childId, unsigned int panelId); - /// returns the top most 2D overlay at the screen point, or 0 if not overlay at that point - unsigned int getOverlayAtPoint(const glm::vec2& point); - - /// returns the value of specified property, or null if there is no such property - OverlayPropertyResult getProperty(unsigned int id, const QString& property); - - /// returns details about the closest 3D Overlay hit by the pick ray - RayToOverlayIntersectionResult findRayIntersection(const PickRay& ray); - - /// returns whether the overlay's assets are loaded or not - bool isLoaded(unsigned int id); - - /// returns the size of the given text in the specified overlay if it is a text overlay: in pixels if it is a 2D text - /// overlay; in meters if it is a 3D text overlay - QSizeF textSize(unsigned int id, const QString& text) const; - - // Return the size of the virtual screen - float width() const; - float height() const; - - /// adds a panel that has already been created unsigned int addPanel(OverlayPanel::Pointer panel); @@ -138,13 +236,16 @@ public slots: /// deletes a panel and all child overlays void deletePanel(unsigned int panelId); - /// return true if there is an overlay with that id else false - bool isAddedOverlay(unsigned int id); - /// return true if there is a panel with that id else false bool isAddedPanel(unsigned int id) { return _panels.contains(id); } signals: + /**jsdoc + * Emitted when an overlay is deleted + * + * @function Overlays.overlayDeleted + * @param {OverlayID} The ID of the overlay that was deleted. + */ void overlayDeleted(unsigned int id); void panelDeleted(unsigned int id); diff --git a/libraries/script-engine/src/MenuItemProperties.cpp b/libraries/script-engine/src/MenuItemProperties.cpp index d181aee18d..de76dbc3ca 100644 --- a/libraries/script-engine/src/MenuItemProperties.cpp +++ b/libraries/script-engine/src/MenuItemProperties.cpp @@ -28,7 +28,7 @@ MenuItemProperties::MenuItemProperties(const QString& menuName, const QString& m { } -MenuItemProperties::MenuItemProperties(const QString& menuName, const QString& menuItemName, +MenuItemProperties::MenuItemProperties(const QString& menuName, const QString& menuItemName, const KeyEvent& shortcutKeyEvent, bool checkable, bool checked, bool separator) : menuName(menuName), menuItemName(menuItemName), @@ -50,13 +50,31 @@ QScriptValue menuItemPropertiesToScriptValue(QScriptEngine* engine, const MenuIt return obj; } +/**jsdoc + * `MenuItemProperties` is a list of properties that can be passed to Menu.addMenuItem + * to create a new menu item. + * + * If none of position, beforeItem, afterItem, or grouping are specified, the + * menu item will be placed in the last position. + * + * @typedef {Object} Menu.MenuItemProperties + * @property {string} menuName Name of the top-level menu + * @property {string} menuItemName Name of the menu item + * @property {bool} isCheckable Whether the menu item is checkable or not + * @property {bool} isChecked Where the menu item is checked or not + * @property {string} shortcutKey An optional shortcut key to trigger the menu item. + * @property {int} position The position to place the new menu item. `0` is the first menu item. + * @property {string} beforeItem The name of the menu item to place this menu item before. + * @property {string} afterItem The name of the menu item to place this menu item after. + * @property {string} grouping The name of grouping to add this menu item to. + */ void menuItemPropertiesFromScriptValue(const QScriptValue& object, MenuItemProperties& properties) { properties.menuName = object.property("menuName").toVariant().toString(); properties.menuItemName = object.property("menuItemName").toVariant().toString(); properties.isCheckable = object.property("isCheckable").toVariant().toBool(); properties.isChecked = object.property("isChecked").toVariant().toBool(); properties.isSeparator = object.property("isSeparator").toVariant().toBool(); - + // handle the shortcut key options in order... QScriptValue shortcutKeyValue = object.property("shortcutKey"); if (shortcutKeyValue.isValid()) { diff --git a/libraries/script-engine/src/Vec3.h b/libraries/script-engine/src/Vec3.h index 71b6cf3872..07f2279d02 100644 --- a/libraries/script-engine/src/Vec3.h +++ b/libraries/script-engine/src/Vec3.h @@ -20,6 +20,24 @@ #include "GLMHelpers.h" +/**jsdoc + * A 2-dimensional vector. + * + * @typedef Vec2 + * @property {float} x X-coordinate of the vector. + * @property {float} y Y-coordinate of the vector. + */ + +/**jsdoc + * A 3-dimensional vector. + * + * @typedef Vec3 + * @property {float} x X-coordinate of the vector. + * @property {float} y Y-coordinate of the vector. + * @property {float} z Z-coordinate of the vector. + */ + + /// Scriptable interface a Vec3ernion helper class object. Used exclusively in the JavaScript API class Vec3 : public QObject { Q_OBJECT diff --git a/libraries/shared/src/PathUtils.h b/libraries/shared/src/PathUtils.h index 43464fe236..546586fb64 100644 --- a/libraries/shared/src/PathUtils.h +++ b/libraries/shared/src/PathUtils.h @@ -16,6 +16,11 @@ #include "DependencyManager.h" +/**jsdoc + * @namespace Paths + * @readonly + * @property {string} resources The path to the resources directory. + */ class PathUtils : public QObject, public Dependency { Q_OBJECT SINGLETON_DEPENDENCY diff --git a/tools/jsdoc/plugins/hifi.js b/tools/jsdoc/plugins/hifi.js index 084ff57fb5..8a6d2bf0f2 100644 --- a/tools/jsdoc/plugins/hifi.js +++ b/tools/jsdoc/plugins/hifi.js @@ -16,6 +16,7 @@ exports.handlers = { var dirList = [ '../../interface/src', '../../interface/src/scripting', + '../../interface/src/ui/overlays', '../../libraries/script-engine/src', '../../libraries/networking/src', '../../libraries/animation/src',