//// Menu.cpp// hifi//// Created by Stephen Birarda on 8/12/13.// Copyright (c) 2013 HighFidelity, Inc. All rights reserved.// #include <cstdlib> #include <QMenuBar>#include <QBoxLayout>#include <QColorDialog>#include <QDialogButtonBox>#include <QDoubleSpinBox>#include <QFileDialog>#include <QFormLayout>#include <QLineEdit>#include <QMainWindow>#include <QStandardPaths> #include "Application.h"#include "fvupdater.h"#include "PairingHandler.h"#include "Menu.h"#include "Util.h" Menu* Menu::_instance = NULL; Menu* Menu::getInstance() { if (!_instance) { qDebug("First call to Menu::getInstance() - initing menu.\n"); _instance = new Menu(); } return _instance;} const ViewFrustumOffset DEFAULT_FRUSTUM_OFFSET = {-135.0f, 0.0f, 0.0f, 25.0f, 0.0f}; Menu::Menu() : _actionHash(), _audioJitterBufferSamples(0), _bandwidthDialog(NULL), _fieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES), _frustumDrawMode(FRUSTUM_DRAW_MODE_ALL), _viewFrustumOffset(DEFAULT_FRUSTUM_OFFSET), _voxelModeActionsGroup(NULL), _voxelStatsDialog(NULL){ Application *appInstance = Application::getInstance(); QMenu* fileMenu = addMenu("File"); (addActionToQMenuAndActionHash(fileMenu, MenuOption::Preferences, Qt::CTRL | Qt::Key_Comma, this, SLOT(editPreferences())))->setMenuRole(QAction::PreferencesRole); #if defined(Q_OS_MAC) && defined(QT_NO_DEBUG) // show "Check for Updates" in the menu (addActionToQMenuAndActionHash(fileMenu, MenuOption::CheckForUpdates, 0, this, SLOT(checkForUpdates())))->setMenuRole(QAction::ApplicationSpecificRole);#endif addDisabledActionAndSeparator(fileMenu, "Voxels"); addActionToQMenuAndActionHash(fileMenu, MenuOption::ExportVoxels, Qt::CTRL | Qt::Key_E, appInstance, SLOT(exportVoxels())); addActionToQMenuAndActionHash(fileMenu, MenuOption::ImportVoxels, Qt::CTRL | Qt::Key_I, appInstance, SLOT(importVoxels())); addDisabledActionAndSeparator(fileMenu, "Go"); addActionToQMenuAndActionHash(fileMenu, MenuOption::GoHome, Qt::CTRL | Qt::Key_G, appInstance->getAvatar(), SLOT(goHome())); addActionToQMenuAndActionHash(fileMenu, MenuOption::GoToDomain, Qt::CTRL | Qt::Key_D, this, SLOT(goToDomain())); addActionToQMenuAndActionHash(fileMenu, MenuOption::GoToLocation, Qt::CTRL | Qt::SHIFT | Qt::Key_L, this, SLOT(goToLocation())); addDisabledActionAndSeparator(fileMenu, "Settings"); addActionToQMenuAndActionHash(fileMenu, MenuOption::SettingsImport, 0, this, SLOT(importSettings())); addActionToQMenuAndActionHash(fileMenu, MenuOption::SettingsExport, 0, this, SLOT(exportSettings())); addDisabledActionAndSeparator(fileMenu, "Devices"); addActionToQMenuAndActionHash(fileMenu, MenuOption::Pair, 0, PairingHandler::getInstance(), SLOT(sendPairRequest())); addCheckableActionToQMenuAndActionHash(fileMenu, MenuOption::TransmitterDrive, 0, true); (addActionToQMenuAndActionHash(fileMenu, MenuOption::Quit, Qt::CTRL | Qt::Key_Q, appInstance, SLOT(quit())))->setMenuRole(QAction::QuitRole); QMenu* editMenu = addMenu("Edit"); addActionToQMenuAndActionHash(editMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels())); addActionToQMenuAndActionHash(editMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels())); addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels())); addActionToQMenuAndActionHash(editMenu, MenuOption::NudgeVoxels, Qt::CTRL | Qt::Key_N, appInstance, SLOT(nudgeVoxels())); addDisabledActionAndSeparator(editMenu, "Physics"); addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true); addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Collisions, 0, true, appInstance->getAvatar(), SLOT(setWantCollisionsOn(bool))); QMenu* toolsMenu = addMenu("Tools"); _voxelModeActionsGroup = new QActionGroup(this); _voxelModeActionsGroup->setExclusive(false); QAction* addVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelAddMode, Qt::Key_V); _voxelModeActionsGroup->addAction(addVoxelMode); QAction* deleteVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelDeleteMode, Qt::Key_R); _voxelModeActionsGroup->addAction(deleteVoxelMode); QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B); _voxelModeActionsGroup->addAction(colorVoxelMode); QAction* nudgeVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelNudgeMode, Qt::Key_N); _voxelModeActionsGroup->addAction(nudgeVoxelMode); QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O); _voxelModeActionsGroup->addAction(selectVoxelMode); QAction* getColorMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelGetColorMode, Qt::Key_G); _voxelModeActionsGroup->addAction(getColorMode); // connect each of the voxel mode actions to the updateVoxelModeActionsSlot foreach (QAction* action, _voxelModeActionsGroup->actions()) { connect(action, SIGNAL(triggered()), this, SLOT(updateVoxelModeActions())); } QAction* voxelPaintColor = addActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelPaintColor, Qt::META | Qt::Key_C, this, SLOT(chooseVoxelPaintColor())); Application::getInstance()->getSwatch()->setAction(voxelPaintColor); QColor paintColor(128, 128, 128); voxelPaintColor->setData(paintColor); voxelPaintColor->setIcon(Swatch::createIcon(paintColor)); addActionToQMenuAndActionHash(toolsMenu, MenuOption::DecreaseVoxelSize, QKeySequence::ZoomOut, appInstance, SLOT(decreaseVoxelSize())); addActionToQMenuAndActionHash(toolsMenu, MenuOption::IncreaseVoxelSize, QKeySequence::ZoomIn, appInstance, SLOT(increaseVoxelSize())); addActionToQMenuAndActionHash(toolsMenu, MenuOption::ResetSwatchColors, 0, this, SLOT(resetSwatchColors())); QMenu* viewMenu = addMenu("View"); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Fullscreen, Qt::Key_F, false, appInstance, SLOT(setFullscreen(bool))); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPerson, Qt::Key_P, true); addActionToQMenuAndActionHash(viewMenu, MenuOption::IncreaseAvatarSize, Qt::Key_Plus, appInstance->getAvatar(), SLOT(increaseSize())); addActionToQMenuAndActionHash(viewMenu, MenuOption::DecreaseAvatarSize, Qt::Key_Minus, appInstance->getAvatar(), SLOT(decreaseSize())); addActionToQMenuAndActionHash(viewMenu, MenuOption::ResetAvatarSize, 0, appInstance->getAvatar(), SLOT(resetSize())); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Mirror, Qt::Key_H); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::SkeletonTracking, 0, false, appInstance->getWebcam(), SLOT(setSkeletonTrackingOn(bool))); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::LEDTracking, 0, false, appInstance->getWebcam()->getGrabber(), SLOT(setLEDTrackingOn(bool))); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::OffAxisProjection, 0, false); addDisabledActionAndSeparator(viewMenu, "Stats"); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Stats, Qt::Key_Slash); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Log, Qt::CTRL | Qt::Key_L); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Oscilloscope, 0, true); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Bandwidth, 0, true); addActionToQMenuAndActionHash(viewMenu, MenuOption::BandwidthDetails, 0, this, SLOT(bandwidthDetails())); addActionToQMenuAndActionHash(viewMenu, MenuOption::VoxelStats, 0, this, SLOT(voxelStatsDetails())); QMenu* developerMenu = addMenu("Developer"); addDisabledActionAndSeparator(developerMenu, "Rendering"); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Voxels, Qt::SHIFT | Qt::Key_V, true, appInstance, SLOT(setRenderVoxels(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::VoxelTextures); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::AmbientOcclusion); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Stars, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Atmosphere, Qt::SHIFT | Qt::Key_A, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::GroundPlane, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Avatars, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::AvatarAsBalls); addActionToQMenuAndActionHash(developerMenu, MenuOption::VoxelMode, 0, appInstance->getAvatar()->getVoxels(), SLOT(cycleMode())); addActionToQMenuAndActionHash(developerMenu, MenuOption::FaceMode, 0, &appInstance->getAvatar()->getHead().getFace(), SLOT(cycleRenderMode())); addActionToQMenuAndActionHash(developerMenu, MenuOption::GlowMode, 0, appInstance->getGlowEffect(), SLOT(cycleRenderMode())); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::LookAtVectors, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::LookAtIndicator, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::FrameTimer); addDisabledActionAndSeparator(developerMenu, "Testing"); QMenu* frustumMenu = developerMenu->addMenu("View Frustum Debugging Tools"); addCheckableActionToQMenuAndActionHash(frustumMenu, MenuOption::DisplayFrustum, Qt::SHIFT | Qt::Key_F); addActionToQMenuAndActionHash(frustumMenu, MenuOption::FrustumRenderMode, Qt::SHIFT | Qt::Key_R, this, SLOT(cycleFrustumRenderMode())); updateFrustumRenderModeAction(); addActionToQMenuAndActionHash(developerMenu, MenuOption::RunTimingTests, 0, this, SLOT(runTests())); addActionToQMenuAndActionHash(developerMenu, MenuOption::TreeStats, Qt::SHIFT | Qt::Key_S, appInstance->getVoxels(), SLOT(collectStatsForTreesAndVBOs())); QMenu* renderDebugMenu = developerMenu->addMenu("Render Debugging Tools"); addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::PipelineWarnings); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::KillLocalVoxels, Qt::CTRL | Qt::Key_K, appInstance, SLOT(doKillLocalVoxels())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::RandomizeVoxelColors, Qt::CTRL | Qt::Key_R, appInstance->getVoxels(), SLOT(randomizeVoxelColors())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorRandomly, 0, appInstance->getVoxels(), SLOT(falseColorizeRandom())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorEveryOtherVoxel, 0, appInstance->getVoxels(), SLOT(falseColorizeRandomEveryOther())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorByDistance, 0, appInstance->getVoxels(), SLOT(falseColorizeDistanceFromView())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorOutOfView, 0, appInstance->getVoxels(), SLOT(falseColorizeInView())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorOccluded, 0, appInstance->getVoxels(), SLOT(falseColorizeOccluded())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorOccludedV2, 0, appInstance->getVoxels(), SLOT(falseColorizeOccludedV2())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorBySource, 0, appInstance->getVoxels(), SLOT(falseColorizeBySource())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::ShowTrueColors, Qt::CTRL | Qt::Key_T, appInstance->getVoxels(), SLOT(trueColorize())); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Webcam, 0, false, appInstance->getWebcam(), SLOT(setEnabled(bool))); addActionToQMenuAndActionHash(developerMenu, MenuOption::WebcamMode, 0, appInstance->getWebcam()->getGrabber(), SLOT(cycleVideoSendMode())); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::WebcamTexture, 0, false, appInstance->getWebcam()->getGrabber(), SLOT(setDepthOnly(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Faceshift, 0, false, appInstance->getFaceshift(), SLOT(setEnabled(bool))); QMenu* audioDebugMenu = developerMenu->addMenu("Audio Debugging Tools"); addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::EchoAudio); addActionToQMenuAndActionHash(audioDebugMenu, MenuOption::ListenModeNormal, Qt::CTRL | Qt::Key_1, appInstance, SLOT(setListenModeNormal())); addActionToQMenuAndActionHash(audioDebugMenu, MenuOption::ListenModePoint, Qt::CTRL | Qt::Key_2, appInstance, SLOT(setListenModePoint())); addActionToQMenuAndActionHash(audioDebugMenu, MenuOption::ListenModeSingleSource, Qt::CTRL | Qt::Key_3, appInstance, SLOT(setListenModeSingleSource())); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::TestPing, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::SendVoxelColors, 0, true, appInstance->getAvatar(), SLOT(setWantColor(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::LowRes, 0, true, appInstance->getAvatar(), SLOT(setWantLowResMoving(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::DeltaSending, 0, true, appInstance->getAvatar(), SLOT(setWantDelta(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::OcclusionCulling, Qt::SHIFT | Qt::Key_C, true, appInstance->getAvatar(), SLOT(setWantOcclusionCulling(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::CoverageMap, Qt::SHIFT | Qt::CTRL | Qt::Key_O); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::CoverageMapV2, Qt::SHIFT | Qt::CTRL | Qt::Key_P); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::SimulateLeapHand); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::TestRaveGlove); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::GyroLook, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::HeadMouse); addDisabledActionAndSeparator(developerMenu, "Voxels"); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::DestructiveAddVoxel);} Menu::~Menu() { bandwidthDetailsClosed(); voxelStatsDetailsClosed();} void Menu::loadSettings(QSettings* settings) { if (!settings) { settings = Application::getInstance()->getSettings(); } _gyroCameraSensitivity = loadSetting(settings, "gyroCameraSensitivity", 0.5f); _audioJitterBufferSamples = loadSetting(settings, "audioJitterBufferSamples", 0); _fieldOfView = loadSetting(settings, "fieldOfView", DEFAULT_FIELD_OF_VIEW_DEGREES); settings->beginGroup("View Frustum Offset Camera"); // in case settings is corrupt or missing loadSetting() will check for NaN _viewFrustumOffset.yaw = loadSetting(settings, "viewFrustumOffsetYaw", 0.0f); _viewFrustumOffset.pitch = loadSetting(settings, "viewFrustumOffsetPitch", 0.0f); _viewFrustumOffset.roll = loadSetting(settings, "viewFrustumOffsetRoll", 0.0f); _viewFrustumOffset.distance = loadSetting(settings, "viewFrustumOffsetDistance", 0.0f); _viewFrustumOffset.up = loadSetting(settings, "viewFrustumOffsetUp", 0.0f); settings->endGroup(); scanMenuBar(&loadAction, settings); Application::getInstance()->getAvatar()->loadData(settings); Application::getInstance()->getSwatch()->loadData(settings);} void Menu::saveSettings(QSettings* settings) { if (!settings) { settings = Application::getInstance()->getSettings(); } settings->setValue("gyroCameraSensitivity", _gyroCameraSensitivity); settings->setValue("audioJitterBufferSamples", _audioJitterBufferSamples); settings->setValue("fieldOfView", _fieldOfView); settings->beginGroup("View Frustum Offset Camera"); settings->setValue("viewFrustumOffsetYaw", _viewFrustumOffset.yaw); settings->setValue("viewFrustumOffsetPitch", _viewFrustumOffset.pitch); settings->setValue("viewFrustumOffsetRoll", _viewFrustumOffset.roll); settings->setValue("viewFrustumOffsetDistance", _viewFrustumOffset.distance); settings->setValue("viewFrustumOffsetUp", _viewFrustumOffset.up); settings->endGroup(); scanMenuBar(&saveAction, settings); Application::getInstance()->getAvatar()->saveData(settings); Application::getInstance()->getSwatch()->saveData(settings); // ask the NodeList to save its data NodeList::getInstance()->saveData(settings);} void Menu::importSettings() { QString locationDir(QStandardPaths::displayName(QStandardPaths::DesktopLocation)); QString fileName = QFileDialog::getOpenFileName(Application::getInstance()->getWindow(), tr("Open .ini config file"), locationDir, tr("Text files (*.ini)")); if (fileName != "") { QSettings tmp(fileName, QSettings::IniFormat); loadSettings(&tmp); }Lines 1–500 of 970. Load more
// // Menu.cpp // hifi // // Created by Stephen Birarda on 8/12/13. // Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // #include <cstdlib> #include <QMenuBar> #include <QBoxLayout> #include <QColorDialog> #include <QDialogButtonBox> #include <QDoubleSpinBox> #include <QFileDialog> #include <QFormLayout> #include <QLineEdit> #include <QMainWindow> #include <QStandardPaths> #include "Application.h" #include "fvupdater.h" #include "PairingHandler.h" #include "Menu.h" #include "Util.h" Menu* Menu::_instance = NULL; Menu* Menu::getInstance() { if (!_instance) { qDebug("First call to Menu::getInstance() - initing menu.\n"); _instance = new Menu(); } return _instance; } const ViewFrustumOffset DEFAULT_FRUSTUM_OFFSET = {-135.0f, 0.0f, 0.0f, 25.0f, 0.0f}; Menu::Menu() : _actionHash(), _audioJitterBufferSamples(0), _bandwidthDialog(NULL), _fieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES), _frustumDrawMode(FRUSTUM_DRAW_MODE_ALL), _viewFrustumOffset(DEFAULT_FRUSTUM_OFFSET), _voxelModeActionsGroup(NULL), _voxelStatsDialog(NULL) { Application *appInstance = Application::getInstance(); QMenu* fileMenu = addMenu("File"); (addActionToQMenuAndActionHash(fileMenu, MenuOption::Preferences, Qt::CTRL | Qt::Key_Comma, this, SLOT(editPreferences())))->setMenuRole(QAction::PreferencesRole); #if defined(Q_OS_MAC) && defined(QT_NO_DEBUG) // show "Check for Updates" in the menu (addActionToQMenuAndActionHash(fileMenu, MenuOption::CheckForUpdates, 0, this, SLOT(checkForUpdates())))->setMenuRole(QAction::ApplicationSpecificRole); #endif addDisabledActionAndSeparator(fileMenu, "Voxels"); addActionToQMenuAndActionHash(fileMenu, MenuOption::ExportVoxels, Qt::CTRL | Qt::Key_E, appInstance, SLOT(exportVoxels())); addActionToQMenuAndActionHash(fileMenu, MenuOption::ImportVoxels, Qt::CTRL | Qt::Key_I, appInstance, SLOT(importVoxels())); addDisabledActionAndSeparator(fileMenu, "Go"); addActionToQMenuAndActionHash(fileMenu, MenuOption::GoHome, Qt::CTRL | Qt::Key_G, appInstance->getAvatar(), SLOT(goHome())); addActionToQMenuAndActionHash(fileMenu, MenuOption::GoToDomain, Qt::CTRL | Qt::Key_D, this, SLOT(goToDomain())); addActionToQMenuAndActionHash(fileMenu, MenuOption::GoToLocation, Qt::CTRL | Qt::SHIFT | Qt::Key_L, this, SLOT(goToLocation())); addDisabledActionAndSeparator(fileMenu, "Settings"); addActionToQMenuAndActionHash(fileMenu, MenuOption::SettingsImport, 0, this, SLOT(importSettings())); addActionToQMenuAndActionHash(fileMenu, MenuOption::SettingsExport, 0, this, SLOT(exportSettings())); addDisabledActionAndSeparator(fileMenu, "Devices"); addActionToQMenuAndActionHash(fileMenu, MenuOption::Pair, 0, PairingHandler::getInstance(), SLOT(sendPairRequest())); addCheckableActionToQMenuAndActionHash(fileMenu, MenuOption::TransmitterDrive, 0, true); (addActionToQMenuAndActionHash(fileMenu, MenuOption::Quit, Qt::CTRL | Qt::Key_Q, appInstance, SLOT(quit())))->setMenuRole(QAction::QuitRole); QMenu* editMenu = addMenu("Edit"); addActionToQMenuAndActionHash(editMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels())); addActionToQMenuAndActionHash(editMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels())); addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels())); addActionToQMenuAndActionHash(editMenu, MenuOption::NudgeVoxels, Qt::CTRL | Qt::Key_N, appInstance, SLOT(nudgeVoxels())); addDisabledActionAndSeparator(editMenu, "Physics"); addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true); addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Collisions, 0, true, appInstance->getAvatar(), SLOT(setWantCollisionsOn(bool))); QMenu* toolsMenu = addMenu("Tools"); _voxelModeActionsGroup = new QActionGroup(this); _voxelModeActionsGroup->setExclusive(false); QAction* addVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelAddMode, Qt::Key_V); _voxelModeActionsGroup->addAction(addVoxelMode); QAction* deleteVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelDeleteMode, Qt::Key_R); _voxelModeActionsGroup->addAction(deleteVoxelMode); QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B); _voxelModeActionsGroup->addAction(colorVoxelMode); QAction* nudgeVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelNudgeMode, Qt::Key_N); _voxelModeActionsGroup->addAction(nudgeVoxelMode); QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O); _voxelModeActionsGroup->addAction(selectVoxelMode); QAction* getColorMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelGetColorMode, Qt::Key_G); _voxelModeActionsGroup->addAction(getColorMode); // connect each of the voxel mode actions to the updateVoxelModeActionsSlot foreach (QAction* action, _voxelModeActionsGroup->actions()) { connect(action, SIGNAL(triggered()), this, SLOT(updateVoxelModeActions())); } QAction* voxelPaintColor = addActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelPaintColor, Qt::META | Qt::Key_C, this, SLOT(chooseVoxelPaintColor())); Application::getInstance()->getSwatch()->setAction(voxelPaintColor); QColor paintColor(128, 128, 128); voxelPaintColor->setData(paintColor); voxelPaintColor->setIcon(Swatch::createIcon(paintColor)); addActionToQMenuAndActionHash(toolsMenu, MenuOption::DecreaseVoxelSize, QKeySequence::ZoomOut, appInstance, SLOT(decreaseVoxelSize())); addActionToQMenuAndActionHash(toolsMenu, MenuOption::IncreaseVoxelSize, QKeySequence::ZoomIn, appInstance, SLOT(increaseVoxelSize())); addActionToQMenuAndActionHash(toolsMenu, MenuOption::ResetSwatchColors, 0, this, SLOT(resetSwatchColors())); QMenu* viewMenu = addMenu("View"); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Fullscreen, Qt::Key_F, false, appInstance, SLOT(setFullscreen(bool))); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPerson, Qt::Key_P, true); addActionToQMenuAndActionHash(viewMenu, MenuOption::IncreaseAvatarSize, Qt::Key_Plus, appInstance->getAvatar(), SLOT(increaseSize())); addActionToQMenuAndActionHash(viewMenu, MenuOption::DecreaseAvatarSize, Qt::Key_Minus, appInstance->getAvatar(), SLOT(decreaseSize())); addActionToQMenuAndActionHash(viewMenu, MenuOption::ResetAvatarSize, 0, appInstance->getAvatar(), SLOT(resetSize())); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Mirror, Qt::Key_H); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::SkeletonTracking, 0, false, appInstance->getWebcam(), SLOT(setSkeletonTrackingOn(bool))); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::LEDTracking, 0, false, appInstance->getWebcam()->getGrabber(), SLOT(setLEDTrackingOn(bool))); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::OffAxisProjection, 0, false); addDisabledActionAndSeparator(viewMenu, "Stats"); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Stats, Qt::Key_Slash); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Log, Qt::CTRL | Qt::Key_L); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Oscilloscope, 0, true); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Bandwidth, 0, true); addActionToQMenuAndActionHash(viewMenu, MenuOption::BandwidthDetails, 0, this, SLOT(bandwidthDetails())); addActionToQMenuAndActionHash(viewMenu, MenuOption::VoxelStats, 0, this, SLOT(voxelStatsDetails())); QMenu* developerMenu = addMenu("Developer"); addDisabledActionAndSeparator(developerMenu, "Rendering"); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Voxels, Qt::SHIFT | Qt::Key_V, true, appInstance, SLOT(setRenderVoxels(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::VoxelTextures); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::AmbientOcclusion); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Stars, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Atmosphere, Qt::SHIFT | Qt::Key_A, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::GroundPlane, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Avatars, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::AvatarAsBalls); addActionToQMenuAndActionHash(developerMenu, MenuOption::VoxelMode, 0, appInstance->getAvatar()->getVoxels(), SLOT(cycleMode())); addActionToQMenuAndActionHash(developerMenu, MenuOption::FaceMode, 0, &appInstance->getAvatar()->getHead().getFace(), SLOT(cycleRenderMode())); addActionToQMenuAndActionHash(developerMenu, MenuOption::GlowMode, 0, appInstance->getGlowEffect(), SLOT(cycleRenderMode())); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::LookAtVectors, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::LookAtIndicator, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::FrameTimer); addDisabledActionAndSeparator(developerMenu, "Testing"); QMenu* frustumMenu = developerMenu->addMenu("View Frustum Debugging Tools"); addCheckableActionToQMenuAndActionHash(frustumMenu, MenuOption::DisplayFrustum, Qt::SHIFT | Qt::Key_F); addActionToQMenuAndActionHash(frustumMenu, MenuOption::FrustumRenderMode, Qt::SHIFT | Qt::Key_R, this, SLOT(cycleFrustumRenderMode())); updateFrustumRenderModeAction(); addActionToQMenuAndActionHash(developerMenu, MenuOption::RunTimingTests, 0, this, SLOT(runTests())); addActionToQMenuAndActionHash(developerMenu, MenuOption::TreeStats, Qt::SHIFT | Qt::Key_S, appInstance->getVoxels(), SLOT(collectStatsForTreesAndVBOs())); QMenu* renderDebugMenu = developerMenu->addMenu("Render Debugging Tools"); addCheckableActionToQMenuAndActionHash(renderDebugMenu, MenuOption::PipelineWarnings); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::KillLocalVoxels, Qt::CTRL | Qt::Key_K, appInstance, SLOT(doKillLocalVoxels())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::RandomizeVoxelColors, Qt::CTRL | Qt::Key_R, appInstance->getVoxels(), SLOT(randomizeVoxelColors())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorRandomly, 0, appInstance->getVoxels(), SLOT(falseColorizeRandom())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorEveryOtherVoxel, 0, appInstance->getVoxels(), SLOT(falseColorizeRandomEveryOther())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorByDistance, 0, appInstance->getVoxels(), SLOT(falseColorizeDistanceFromView())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorOutOfView, 0, appInstance->getVoxels(), SLOT(falseColorizeInView())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorOccluded, 0, appInstance->getVoxels(), SLOT(falseColorizeOccluded())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorOccludedV2, 0, appInstance->getVoxels(), SLOT(falseColorizeOccludedV2())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::FalseColorBySource, 0, appInstance->getVoxels(), SLOT(falseColorizeBySource())); addActionToQMenuAndActionHash(renderDebugMenu, MenuOption::ShowTrueColors, Qt::CTRL | Qt::Key_T, appInstance->getVoxels(), SLOT(trueColorize())); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Webcam, 0, false, appInstance->getWebcam(), SLOT(setEnabled(bool))); addActionToQMenuAndActionHash(developerMenu, MenuOption::WebcamMode, 0, appInstance->getWebcam()->getGrabber(), SLOT(cycleVideoSendMode())); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::WebcamTexture, 0, false, appInstance->getWebcam()->getGrabber(), SLOT(setDepthOnly(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::Faceshift, 0, false, appInstance->getFaceshift(), SLOT(setEnabled(bool))); QMenu* audioDebugMenu = developerMenu->addMenu("Audio Debugging Tools"); addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::EchoAudio); addActionToQMenuAndActionHash(audioDebugMenu, MenuOption::ListenModeNormal, Qt::CTRL | Qt::Key_1, appInstance, SLOT(setListenModeNormal())); addActionToQMenuAndActionHash(audioDebugMenu, MenuOption::ListenModePoint, Qt::CTRL | Qt::Key_2, appInstance, SLOT(setListenModePoint())); addActionToQMenuAndActionHash(audioDebugMenu, MenuOption::ListenModeSingleSource, Qt::CTRL | Qt::Key_3, appInstance, SLOT(setListenModeSingleSource())); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::TestPing, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::SendVoxelColors, 0, true, appInstance->getAvatar(), SLOT(setWantColor(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::LowRes, 0, true, appInstance->getAvatar(), SLOT(setWantLowResMoving(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::DeltaSending, 0, true, appInstance->getAvatar(), SLOT(setWantDelta(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::OcclusionCulling, Qt::SHIFT | Qt::Key_C, true, appInstance->getAvatar(), SLOT(setWantOcclusionCulling(bool))); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::CoverageMap, Qt::SHIFT | Qt::CTRL | Qt::Key_O); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::CoverageMapV2, Qt::SHIFT | Qt::CTRL | Qt::Key_P); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::SimulateLeapHand); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::TestRaveGlove); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::GyroLook, 0, true); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::HeadMouse); addDisabledActionAndSeparator(developerMenu, "Voxels"); addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::DestructiveAddVoxel); } Menu::~Menu() { bandwidthDetailsClosed(); voxelStatsDetailsClosed(); } void Menu::loadSettings(QSettings* settings) { if (!settings) { settings = Application::getInstance()->getSettings(); } _gyroCameraSensitivity = loadSetting(settings, "gyroCameraSensitivity", 0.5f); _audioJitterBufferSamples = loadSetting(settings, "audioJitterBufferSamples", 0); _fieldOfView = loadSetting(settings, "fieldOfView", DEFAULT_FIELD_OF_VIEW_DEGREES); settings->beginGroup("View Frustum Offset Camera"); // in case settings is corrupt or missing loadSetting() will check for NaN _viewFrustumOffset.yaw = loadSetting(settings, "viewFrustumOffsetYaw", 0.0f); _viewFrustumOffset.pitch = loadSetting(settings, "viewFrustumOffsetPitch", 0.0f); _viewFrustumOffset.roll = loadSetting(settings, "viewFrustumOffsetRoll", 0.0f); _viewFrustumOffset.distance = loadSetting(settings, "viewFrustumOffsetDistance", 0.0f); _viewFrustumOffset.up = loadSetting(settings, "viewFrustumOffsetUp", 0.0f); settings->endGroup(); scanMenuBar(&loadAction, settings); Application::getInstance()->getAvatar()->loadData(settings); Application::getInstance()->getSwatch()->loadData(settings); } void Menu::saveSettings(QSettings* settings) { if (!settings) { settings = Application::getInstance()->getSettings(); } settings->setValue("gyroCameraSensitivity", _gyroCameraSensitivity); settings->setValue("audioJitterBufferSamples", _audioJitterBufferSamples); settings->setValue("fieldOfView", _fieldOfView); settings->beginGroup("View Frustum Offset Camera"); settings->setValue("viewFrustumOffsetYaw", _viewFrustumOffset.yaw); settings->setValue("viewFrustumOffsetPitch", _viewFrustumOffset.pitch); settings->setValue("viewFrustumOffsetRoll", _viewFrustumOffset.roll); settings->setValue("viewFrustumOffsetDistance", _viewFrustumOffset.distance); settings->setValue("viewFrustumOffsetUp", _viewFrustumOffset.up); settings->endGroup(); scanMenuBar(&saveAction, settings); Application::getInstance()->getAvatar()->saveData(settings); Application::getInstance()->getSwatch()->saveData(settings); // ask the NodeList to save its data NodeList::getInstance()->saveData(settings); } void Menu::importSettings() { QString locationDir(QStandardPaths::displayName(QStandardPaths::DesktopLocation)); QString fileName = QFileDialog::getOpenFileName(Application::getInstance()->getWindow(), tr("Open .ini config file"), locationDir, tr("Text files (*.ini)")); if (fileName != "") { QSettings tmp(fileName, QSettings::IniFormat); loadSettings(&tmp); }