diff --git a/assignment-client/src/entities/AssignmentParentFinder.cpp b/assignment-client/src/entities/AssignmentParentFinder.cpp
index cc5c7557dc..294556383e 100644
--- a/assignment-client/src/entities/AssignmentParentFinder.cpp
+++ b/assignment-client/src/entities/AssignmentParentFinder.cpp
@@ -13,6 +13,12 @@
SpatiallyNestableWeakPointer AssignmentParentFinder::find(QUuid parentID, bool& success) const {
SpatiallyNestableWeakPointer parent;
+
+ if (parentID.isNull()) {
+ success = true;
+ return parent;
+ }
+
// search entities
parent = _tree->findEntityByEntityItemID(parentID);
if (parent.expired()) {
diff --git a/examples/edit.js b/examples/edit.js
index 99219fcaa2..990e99b32d 100644
--- a/examples/edit.js
+++ b/examples/edit.js
@@ -1026,9 +1026,8 @@ function setupModelMenus() {
// adj our menuitems
Menu.addMenuItem({
menuName: "Edit",
- menuItemName: "Models",
+ menuItemName: "Entities",
isSeparator: true,
- beforeItem: "Physics",
grouping: "Advanced"
});
if (!Menu.menuItemExists("Edit", "Delete")) {
@@ -1039,7 +1038,7 @@ function setupModelMenus() {
shortcutKeyEvent: {
text: "backspace"
},
- afterItem: "Models",
+ afterItem: "Entities",
grouping: "Advanced"
});
modelMenuAddedDelete = true;
@@ -1051,7 +1050,7 @@ function setupModelMenus() {
menuName: "Edit",
menuItemName: "Entity List...",
shortcutKey: "CTRL+META+L",
- afterItem: "Models",
+ afterItem: "Entities",
grouping: "Advanced"
});
Menu.addMenuItem({
@@ -1096,28 +1095,21 @@ function setupModelMenus() {
});
Menu.addMenuItem({
- menuName: "File",
- menuItemName: "Models",
- isSeparator: true,
- beforeItem: "Settings",
- grouping: "Advanced"
- });
- Menu.addMenuItem({
- menuName: "File",
+ menuName: "Edit",
menuItemName: "Export Entities",
shortcutKey: "CTRL+META+E",
- afterItem: "Models",
+ afterItem: "Entities",
grouping: "Advanced"
});
Menu.addMenuItem({
- menuName: "File",
+ menuName: "Edit",
menuItemName: "Import Entities",
shortcutKey: "CTRL+META+I",
afterItem: "Export Entities",
grouping: "Advanced"
});
Menu.addMenuItem({
- menuName: "File",
+ menuName: "Edit",
menuItemName: "Import Entities from URL",
shortcutKey: "CTRL+META+U",
afterItem: "Import Entities",
@@ -1162,7 +1154,7 @@ function setupModelMenus() {
setupModelMenus(); // do this when first running our script.
function cleanupModelMenus() {
- Menu.removeSeparator("Edit", "Models");
+ Menu.removeSeparator("Edit", "Entities");
if (modelMenuAddedDelete) {
// delete our menuitems
Menu.removeMenuItem("Edit", "Delete");
@@ -1175,10 +1167,9 @@ function cleanupModelMenus() {
Menu.removeMenuItem("Edit", "Select All Entities In Box");
Menu.removeMenuItem("Edit", "Select All Entities Touching Box");
- Menu.removeSeparator("File", "Models");
- Menu.removeMenuItem("File", "Export Entities");
- Menu.removeMenuItem("File", "Import Entities");
- Menu.removeMenuItem("File", "Import Entities from URL");
+ Menu.removeMenuItem("Edit", "Export Entities");
+ Menu.removeMenuItem("Edit", "Import Entities");
+ Menu.removeMenuItem("Edit", "Import Entities from URL");
Menu.removeMenuItem("Edit", MENU_AUTO_FOCUS_ON_SELECT);
Menu.removeMenuItem("Edit", MENU_EASE_ON_FOCUS);
diff --git a/examples/selectAudioDevice.js b/examples/selectAudioDevice.js
index 440580b883..b1da219eb5 100644
--- a/examples/selectAudioDevice.js
+++ b/examples/selectAudioDevice.js
@@ -48,8 +48,8 @@ var selectedInputMenu = "";
var selectedOutputMenu = "";
function setupAudioMenus() {
- Menu.addMenu("Tools > Audio");
- Menu.addSeparator("Tools > Audio","Output Audio Device");
+ Menu.addMenu("Audio > Devices", "Advanced");
+ Menu.addSeparator("Audio > Devices","Output Audio Device");
var outputDeviceSetting = Settings.getValue(OUTPUT_DEVICE_SETTING);
var outputDevices = AudioDevice.getOutputDevices();
@@ -63,7 +63,7 @@ function setupAudioMenus() {
var thisDeviceSelected = (outputDevices[i] == selectedOutputDevice);
var menuItem = "Use " + outputDevices[i] + " for Output";
Menu.addMenuItem({
- menuName: "Tools > Audio",
+ menuName: "Audio > Devices",
menuItemName: menuItem,
isCheckable: true,
isChecked: thisDeviceSelected
@@ -73,7 +73,7 @@ function setupAudioMenus() {
}
}
- Menu.addSeparator("Tools > Audio","Input Audio Device");
+ Menu.addSeparator("Audio > Devices","Input Audio Device");
var inputDeviceSetting = Settings.getValue(INPUT_DEVICE_SETTING);
var inputDevices = AudioDevice.getInputDevices();
@@ -87,7 +87,7 @@ function setupAudioMenus() {
var thisDeviceSelected = (inputDevices[i] == selectedInputDevice);
var menuItem = "Use " + inputDevices[i] + " for Input";
Menu.addMenuItem({
- menuName: "Tools > Audio",
+ menuName: "Audio > Devices",
menuItemName: menuItem,
isCheckable: true,
isChecked: thisDeviceSelected
@@ -99,7 +99,7 @@ function setupAudioMenus() {
}
function onDevicechanged() {
- Menu.removeMenu("Tools > Audio");
+ Menu.removeMenu("Audio > Devices");
setupAudioMenus();
}
@@ -110,7 +110,7 @@ Script.setTimeout(function () {
}, 5000);
function scriptEnding() {
- Menu.removeMenu("Tools > Audio");
+ Menu.removeMenu("Audio > Devices");
}
Script.scriptEnding.connect(scriptEnding);
diff --git a/interface/resources/html/interface-welcome.html b/interface/resources/html/interface-welcome.html
index 1fc719ed72..113de7f2a0 100644
--- a/interface/resources/html/interface-welcome.html
+++ b/interface/resources/html/interface-welcome.html
@@ -1,4 +1,4 @@
-
+
@@ -14,7 +14,7 @@
body {
background: white;
- width: 839px;
+ width: 100%;
overflow-x: hidden;
}
@@ -181,7 +181,7 @@
function overrideBodyWidth() {
document.body.style.width = "100%";
- container.style.width = "0";
+
}
//]]>
diff --git a/interface/resources/qml/VrMenu.qml b/interface/resources/qml/VrMenu.qml
index 738ec34a02..689171f9e9 100644
--- a/interface/resources/qml/VrMenu.qml
+++ b/interface/resources/qml/VrMenu.qml
@@ -51,6 +51,16 @@ Hifi.VrMenu {
VrMenuView {
property int menuDepth: root.models.length - 1
model: root.models[menuDepth]
+
+ function fit(position, size, maxposition) {
+ var padding = 8;
+ if (position < padding) {
+ position = padding;
+ } else if (position + size + padding > maxposition) {
+ position = maxposition - (size + padding);
+ }
+ return position;
+ }
Component.onCompleted: {
if (menuDepth === 0) {
@@ -61,6 +71,8 @@ Hifi.VrMenu {
x = lastColumn.x + 64;
y = lastMousePosition.y - height / 2;
}
+ x = fit(x, width, parent.width);
+ y = fit(y, height, parent.height);
}
onSelected: {
diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp
index d57c395b48..6373b3fdb2 100644
--- a/interface/src/Menu.cpp
+++ b/interface/src/Menu.cpp
@@ -57,9 +57,6 @@ Menu::Menu() {
// File/Application menu ----------------------------------
MenuWrapper* fileMenu = addMenu("File");
- // File > Quit
- addActionToQMenuAndActionHash(fileMenu, MenuOption::Quit, Qt::CTRL | Qt::Key_Q, qApp,SLOT(quit()), QAction::QuitRole);
-
// File > Login menu items
{
addActionToQMenuAndActionHash(fileMenu, MenuOption::Login);
@@ -85,6 +82,68 @@ Menu::Menu() {
// File > About
addActionToQMenuAndActionHash(fileMenu, MenuOption::AboutApp, 0, qApp, SLOT(aboutApp()), QAction::AboutRole);
+ // File > Quit
+ addActionToQMenuAndActionHash(fileMenu, MenuOption::Quit, Qt::CTRL | Qt::Key_Q, qApp, SLOT(quit()), QAction::QuitRole);
+
+
+ // Edit menu ----------------------------------
+ MenuWrapper* editMenu = addMenu("Edit");
+
+ // Edit > Undo
+ QUndoStack* undoStack = qApp->getUndoStack();
+ QAction* undoAction = undoStack->createUndoAction(editMenu);
+ undoAction->setShortcut(Qt::CTRL | Qt::Key_Z);
+ addActionToQMenuAndActionHash(editMenu, undoAction);
+
+ // Edit > Redo
+ QAction* redoAction = undoStack->createRedoAction(editMenu);
+ redoAction->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_Z);
+ addActionToQMenuAndActionHash(editMenu, redoAction);
+
+ // Edit > Running Sccripts
+ addActionToQMenuAndActionHash(editMenu, MenuOption::RunningScripts, Qt::CTRL | Qt::Key_J,
+ qApp, SLOT(toggleRunningScriptsWidget()));
+
+ // Edit > Open and Run Script from File... [advanced]
+ addActionToQMenuAndActionHash(editMenu, MenuOption::LoadScript, Qt::CTRL | Qt::Key_O,
+ qApp, SLOT(loadDialog()),
+ QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
+
+ // Edit > Open and Run Script from Url... [advanced]
+ addActionToQMenuAndActionHash(editMenu, MenuOption::LoadScriptURL,
+ Qt::CTRL | Qt::SHIFT | Qt::Key_O, qApp, SLOT(loadScriptURLDialog()),
+ QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
+
+ // Edit > Stop All Scripts... [advanced]
+ addActionToQMenuAndActionHash(editMenu, MenuOption::StopAllScripts, 0, qApp, SLOT(stopAllScripts()),
+ QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
+
+ // Edit > Reload All Scripts... [advanced]
+ addActionToQMenuAndActionHash(editMenu, MenuOption::ReloadAllScripts, Qt::CTRL | Qt::Key_R,
+ qApp, SLOT(reloadAllScripts()),
+ QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
+
+ // Edit > Scripts Editor... [advanced]
+ addActionToQMenuAndActionHash(editMenu, MenuOption::ScriptEditor, Qt::ALT | Qt::Key_S,
+ dialogsManager.data(), SLOT(showScriptEditor()),
+ QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
+
+ // Edit > Console... [advanced]
+ addActionToQMenuAndActionHash(editMenu, MenuOption::Console, Qt::CTRL | Qt::ALT | Qt::Key_J,
+ DependencyManager::get().data(),
+ SLOT(toggleConsole()),
+ QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
+
+ // Edit > Reload All Content [advanced]
+ addActionToQMenuAndActionHash(editMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches()),
+ QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
+
+
+ // Edit > Package Model... [advanced]
+ addActionToQMenuAndActionHash(editMenu, MenuOption::PackageModel, 0,
+ qApp, SLOT(packageModel()),
+ QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
+
// Audio menu ----------------------------------
MenuWrapper* audioMenu = addMenu("Audio");
@@ -186,65 +245,6 @@ Menu::Menu() {
addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::MiniMirror, 0, false);
- // Edit menu ----------------------------------
- MenuWrapper* editMenu = addMenu("Edit");
-
- // Edit > Undo
- QUndoStack* undoStack = qApp->getUndoStack();
- QAction* undoAction = undoStack->createUndoAction(editMenu);
- undoAction->setShortcut(Qt::CTRL | Qt::Key_Z);
- addActionToQMenuAndActionHash(editMenu, undoAction);
-
- // Edit > Redo
- QAction* redoAction = undoStack->createRedoAction(editMenu);
- redoAction->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_Z);
- addActionToQMenuAndActionHash(editMenu, redoAction);
-
- // Edit > Running Sccripts
- addActionToQMenuAndActionHash(editMenu, MenuOption::RunningScripts, Qt::CTRL | Qt::Key_J,
- qApp, SLOT(toggleRunningScriptsWidget()));
-
- // Edit > Open and Run Script from File... [advanced]
- addActionToQMenuAndActionHash(editMenu, MenuOption::LoadScript, Qt::CTRL | Qt::Key_O,
- qApp, SLOT(loadDialog()),
- QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
-
- // Edit > Open and Run Script from Url... [advanced]
- addActionToQMenuAndActionHash(editMenu, MenuOption::LoadScriptURL,
- Qt::CTRL | Qt::SHIFT | Qt::Key_O, qApp, SLOT(loadScriptURLDialog()),
- QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
-
- // Edit > Stop All Scripts... [advanced]
- addActionToQMenuAndActionHash(editMenu, MenuOption::StopAllScripts, 0, qApp, SLOT(stopAllScripts()),
- QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
-
- // Edit > Reload All Scripts... [advanced]
- addActionToQMenuAndActionHash(editMenu, MenuOption::ReloadAllScripts, Qt::CTRL | Qt::Key_R,
- qApp, SLOT(reloadAllScripts()),
- QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
-
- // Edit > Scripts Editor... [advanced]
- addActionToQMenuAndActionHash(editMenu, MenuOption::ScriptEditor, Qt::ALT | Qt::Key_S,
- dialogsManager.data(), SLOT(showScriptEditor()),
- QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
-
- // Edit > Console... [advanced]
- addActionToQMenuAndActionHash(editMenu, MenuOption::Console, Qt::CTRL | Qt::ALT | Qt::Key_J,
- DependencyManager::get().data(),
- SLOT(toggleConsole()),
- QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
-
- // Edit > Reload All Content [advanced]
- addActionToQMenuAndActionHash(editMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches()),
- QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
-
-
- // Edit > Package Model... [advanced]
- addActionToQMenuAndActionHash(editMenu, MenuOption::PackageModel, 0,
- qApp, SLOT(packageModel()),
- QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
-
-
// Navigate menu ----------------------------------
MenuWrapper* navigateMenu = addMenu("Navigate");
@@ -273,14 +273,6 @@ Menu::Menu() {
QAction::NoRole, UNSPECIFIED_POSITION, "Advanced");
- // Market menu ----------------------------------
- MenuWrapper* marketMenu = addMenu("Market");
-
- // Market > Marketplace... -- FIXME: needs implementation
- auto marketplaceAction = addActionToQMenuAndActionHash(marketMenu, "Marketplace...");
- marketplaceAction->setDisabled(true);
-
-
// Settings menu ----------------------------------
MenuWrapper* settingsMenu = addMenu("Settings");
diff --git a/interface/src/scripting/MenuScriptingInterface.cpp b/interface/src/scripting/MenuScriptingInterface.cpp
index 087d391daa..016c8df7e3 100644
--- a/interface/src/scripting/MenuScriptingInterface.cpp
+++ b/interface/src/scripting/MenuScriptingInterface.cpp
@@ -27,8 +27,8 @@ void MenuScriptingInterface::menuItemTriggered() {
}
}
-void MenuScriptingInterface::addMenu(const QString& menu) {
- QMetaObject::invokeMethod(Menu::getInstance(), "addMenu", Q_ARG(const QString&, menu));
+void MenuScriptingInterface::addMenu(const QString& menu, const QString& grouping) {
+ QMetaObject::invokeMethod(Menu::getInstance(), "addMenu", Q_ARG(const QString&, menu), Q_ARG(const QString&, grouping));
}
void MenuScriptingInterface::removeMenu(const QString& menu) {
diff --git a/interface/src/scripting/MenuScriptingInterface.h b/interface/src/scripting/MenuScriptingInterface.h
index 51399c2fa5..03ff4b512a 100644
--- a/interface/src/scripting/MenuScriptingInterface.h
+++ b/interface/src/scripting/MenuScriptingInterface.h
@@ -28,7 +28,7 @@ private slots:
void menuItemTriggered();
public slots:
- void addMenu(const QString& menuName);
+ void addMenu(const QString& menuName, const QString& grouping = QString());
void removeMenu(const QString& menuName);
bool menuExists(const QString& menuName);
diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
index 71a885b31c..290e2e4f79 100644
--- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
@@ -18,13 +18,6 @@
const QString Basic2DWindowOpenGLDisplayPlugin::NAME("2D Display");
static const QString FULLSCREEN = "Fullscreen";
-static const QString FRAMERATE = DisplayPlugin::MENU_PATH() + ">Framerate";
-static const QString FRAMERATE_UNLIMITED = "Unlimited";
-static const QString FRAMERATE_60 = "60";
-static const QString FRAMERATE_50 = "50";
-static const QString FRAMERATE_40 = "40";
-static const QString FRAMERATE_30 = "30";
-static const QString VSYNC_ON = "V-Sync On";
const QString& Basic2DWindowOpenGLDisplayPlugin::getName() const {
return NAME;
@@ -42,38 +35,12 @@ void Basic2DWindowOpenGLDisplayPlugin::activate() {
_container->unsetFullscreen();
}
}, true, false);
- _container->addMenu(FRAMERATE);
- _framerateActions.push_back(
- _container->addMenuItem(PluginType::DISPLAY_PLUGIN, FRAMERATE, FRAMERATE_UNLIMITED,
- [this](bool) { updateFramerate(); }, true, true, FRAMERATE));
- _framerateActions.push_back(
- _container->addMenuItem(PluginType::DISPLAY_PLUGIN, FRAMERATE, FRAMERATE_60,
- [this](bool) { updateFramerate(); }, true, false, FRAMERATE));
- _framerateActions.push_back(
- _container->addMenuItem(PluginType::DISPLAY_PLUGIN, FRAMERATE, FRAMERATE_50,
- [this](bool) { updateFramerate(); }, true, false, FRAMERATE));
- _framerateActions.push_back(
- _container->addMenuItem(PluginType::DISPLAY_PLUGIN, FRAMERATE, FRAMERATE_40,
- [this](bool) { updateFramerate(); }, true, false, FRAMERATE));
- _framerateActions.push_back(
- _container->addMenuItem(PluginType::DISPLAY_PLUGIN, FRAMERATE, FRAMERATE_30,
- [this](bool) { updateFramerate(); }, true, false, FRAMERATE));
-
- // Vsync detection happens in the parent class activate, so we need to check after that
- if (_vsyncSupported) {
- _vsyncAction = _container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), VSYNC_ON, [this](bool) {}, true, true);
- } else {
- _vsyncAction = nullptr;
- }
updateFramerate();
}
void Basic2DWindowOpenGLDisplayPlugin::submitSceneTexture(uint32_t frameIndex, uint32_t sceneTexture, const glm::uvec2& sceneSize) {
- if (_vsyncAction) {
- _wantVsync = _vsyncAction->isChecked();
- }
-
+ _wantVsync = true; // always
WindowOpenGLDisplayPlugin::submitSceneTexture(frameIndex, sceneTexture, sceneSize);
}
@@ -87,9 +54,7 @@ const uint32_t THROTTLED_FRAMERATE = 15;
int Basic2DWindowOpenGLDisplayPlugin::getDesiredInterval() const {
static const int ULIMIITED_PAINT_TIMER_DELAY_MS = 1;
int result = ULIMIITED_PAINT_TIMER_DELAY_MS;
- if (0 != _framerateTarget) {
- result = MSECS_PER_SECOND / _framerateTarget;
- } else if (_isThrottled) {
+ if (_isThrottled) {
// This test wouldn't be necessary if we could depend on updateFramerate setting _framerateTarget.
// Alas, that gets complicated: isThrottled() is const and other stuff depends on it.
result = MSECS_PER_SECOND / THROTTLED_FRAMERATE;
@@ -112,30 +77,6 @@ bool Basic2DWindowOpenGLDisplayPlugin::isThrottled() const {
}
void Basic2DWindowOpenGLDisplayPlugin::updateFramerate() {
- QAction* checkedFramerate{ nullptr };
- foreach(auto action, _framerateActions) {
- if (action->isChecked()) {
- checkedFramerate = action;
- break;
- }
- }
-
- _framerateTarget = 0;
- if (checkedFramerate) {
- QString actionText = checkedFramerate->text();
- if (FRAMERATE_60 == actionText) {
- _framerateTarget = 60;
- } else if (FRAMERATE_50 == actionText) {
- _framerateTarget = 50;
- } else if (FRAMERATE_40 == actionText) {
- _framerateTarget = 40;
- } else if (FRAMERATE_30 == actionText) {
- _framerateTarget = 30;
- }
- } else if (_isThrottled) {
- _framerateTarget = THROTTLED_FRAMERATE;
- }
-
int newInterval = getDesiredInterval();
_timer.start(newInterval);
}
diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp
index 07d5ddeeb0..02b1c0c0ae 100644
--- a/libraries/shared/src/SpatiallyNestable.cpp
+++ b/libraries/shared/src/SpatiallyNestable.cpp
@@ -598,7 +598,8 @@ AACube SpatiallyNestable::getQueryAACube(bool& success) const {
return _queryAACube;
}
success = false;
- return AACube(getPosition(success) - glm::vec3(defaultAACubeSize / 2.0f), defaultAACubeSize);
+ bool getPositionSuccess;
+ return AACube(getPosition(getPositionSuccess) - glm::vec3(defaultAACubeSize / 2.0f), defaultAACubeSize);
}
AACube SpatiallyNestable::getQueryAACube() const {