377 lines
16 KiB
C
Raw Normal View History

//
// Menu.h
2014-04-08 17:30:36 -07:00
// interface/src
//
// Created by Stephen Birarda on 8/12/13.
2014-04-08 17:30:36 -07:00
// Copyright 2013 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
2014-04-09 12:03:17 -07:00
#ifndef hifi_Menu_h
#define hifi_Menu_h
#include <QDir>
#include <QMenuBar>
#include <QHash>
#include <QKeySequence>
2014-01-21 11:43:15 -08:00
#include <QPointer>
#include <QStandardPaths>
2014-02-24 19:09:22 -08:00
#include <EventTypes.h>
2014-02-25 17:32:16 -08:00
#include <MenuItemProperties.h>
#include <OctreeConstants.h>
2014-03-14 20:09:03 +01:00
#include "location/LocationManager.h"
2014-02-27 23:15:57 +01:00
#include "ui/PreferencesDialog.h"
2014-03-14 20:09:03 +01:00
#include "ui/ChatWindow.h"
#include "ui/ScriptEditorWindow.h"
2014-02-27 23:15:57 +01:00
2014-02-12 21:22:21 -08:00
const float ADJUST_LOD_DOWN_FPS = 40.0;
const float ADJUST_LOD_UP_FPS = 55.0;
2014-04-24 18:52:59 +05:30
const float DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS = 30.0f;
2014-02-12 21:22:21 -08:00
const quint64 ADJUST_LOD_DOWN_DELAY = 1000 * 1000 * 5;
const quint64 ADJUST_LOD_UP_DELAY = ADJUST_LOD_DOWN_DELAY * 2;
const float ADJUST_LOD_DOWN_BY = 0.9f;
const float ADJUST_LOD_UP_BY = 1.1f;
const float ADJUST_LOD_MIN_SIZE_SCALE = DEFAULT_OCTREE_SIZE_SCALE * 0.25f;
2014-02-12 21:22:21 -08:00
const float ADJUST_LOD_MAX_SIZE_SCALE = DEFAULT_OCTREE_SIZE_SCALE;
const float MINIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER = 0.1f;
const float MAXIMUM_AVATAR_LOD_DISTANCE_MULTIPLIER = 15.0f;
enum FrustumDrawMode {
FRUSTUM_DRAW_MODE_ALL,
FRUSTUM_DRAW_MODE_VECTORS,
FRUSTUM_DRAW_MODE_PLANES,
FRUSTUM_DRAW_MODE_NEAR_PLANE,
FRUSTUM_DRAW_MODE_FAR_PLANE,
FRUSTUM_DRAW_MODE_KEYHOLE,
FRUSTUM_DRAW_MODE_COUNT
};
struct ViewFrustumOffset {
float yaw;
float pitch;
float roll;
float distance;
float up;
};
class QSettings;
class BandwidthDialog;
2013-10-29 16:16:58 -07:00
class LodToolsDialog;
class MetavoxelEditor;
class ChatWindow;
class OctreeStatsDialog;
class MenuItemProperties;
2014-02-25 20:45:49 -08:00
class Menu : public QMenuBar {
Q_OBJECT
public:
static Menu* getInstance();
~Menu();
void triggerOption(const QString& menuOption);
QAction* getActionForOption(const QString& menuOption);
float getAudioJitterBufferSamples() const { return _audioJitterBufferSamples; }
2014-02-27 23:15:57 +01:00
void setAudioJitterBufferSamples(float audioJitterBufferSamples) { _audioJitterBufferSamples = audioJitterBufferSamples; }
float getFieldOfView() const { return _fieldOfView; }
2014-03-23 16:20:29 +01:00
void setFieldOfView(float fieldOfView) { _fieldOfView = fieldOfView; }
float getFaceshiftEyeDeflection() const { return _faceshiftEyeDeflection; }
2014-02-27 23:15:57 +01:00
void setFaceshiftEyeDeflection(float faceshiftEyeDeflection) { _faceshiftEyeDeflection = faceshiftEyeDeflection; }
2014-04-16 07:46:15 +02:00
QString getSnapshotsLocation() const;
void setSnapshotsLocation(QString snapshotsLocation) { _snapshotsLocation = snapshotsLocation; }
BandwidthDialog* getBandwidthDialog() const { return _bandwidthDialog; }
FrustumDrawMode getFrustumDrawMode() const { return _frustumDrawMode; }
ViewFrustumOffset getViewFrustumOffset() const { return _viewFrustumOffset; }
OctreeStatsDialog* getOctreeStatsDialog() const { return _octreeStatsDialog; }
2013-10-29 16:16:58 -07:00
LodToolsDialog* getLodToolsDialog() const { return _lodToolsDialog; }
int getMaxVoxels() const { return _maxVoxels; }
QAction* getUseVoxelShader() const { return _useVoxelShader; }
void handleViewFrustumOffsetKeyModifier(int key);
2013-10-29 16:16:58 -07:00
2013-10-30 11:01:37 -07:00
// User Tweakable LOD Items
2014-03-12 11:10:52 -07:00
QString getLODFeedbackText();
2014-02-12 21:22:21 -08:00
void autoAdjustLOD(float currentFPS);
void resetLODAdjust();
2013-10-30 11:01:37 -07:00
void setVoxelSizeScale(float sizeScale);
float getVoxelSizeScale() const { return _voxelSizeScale; }
void setAutomaticAvatarLOD(bool automaticAvatarLOD) { _automaticAvatarLOD = automaticAvatarLOD; }
bool getAutomaticAvatarLOD() const { return _automaticAvatarLOD; }
void setAvatarLODDecreaseFPS(float avatarLODDecreaseFPS) { _avatarLODDecreaseFPS = avatarLODDecreaseFPS; }
float getAvatarLODDecreaseFPS() const { return _avatarLODDecreaseFPS; }
void setAvatarLODIncreaseFPS(float avatarLODIncreaseFPS) { _avatarLODIncreaseFPS = avatarLODIncreaseFPS; }
float getAvatarLODIncreaseFPS() const { return _avatarLODIncreaseFPS; }
void setAvatarLODDistanceMultiplier(float multiplier) { _avatarLODDistanceMultiplier = multiplier; }
float getAvatarLODDistanceMultiplier() const { return _avatarLODDistanceMultiplier; }
2013-10-30 11:01:37 -07:00
void setBoundaryLevelAdjust(int boundaryLevelAdjust);
int getBoundaryLevelAdjust() const { return _boundaryLevelAdjust; }
// User Tweakable PPS from Voxel Server
int getMaxVoxelPacketsPerSecond() const { return _maxVoxelPacketsPerSecond; }
2014-02-27 23:15:57 +01:00
void setMaxVoxelPacketsPerSecond(int maxVoxelPacketsPerSecond) { _maxVoxelPacketsPerSecond = maxVoxelPacketsPerSecond; }
2014-02-25 20:23:38 -08:00
QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu,
const QString& actionName,
const QKeySequence& shortcut = 0,
const QObject* receiver = NULL,
const char* member = NULL,
QAction::MenuRole role = QAction::NoRole,
int menuItemLocation = UNSPECIFIED_POSITION);
2014-04-03 16:51:08 -07:00
QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu,
QAction* action,
const QString& actionName = QString(),
const QKeySequence& shortcut = 0,
QAction::MenuRole role = QAction::NoRole,
int menuItemLocation = UNSPECIFIED_POSITION);
2014-02-25 20:23:38 -08:00
void removeAction(QMenu* menu, const QString& actionName);
2014-04-17 00:04:27 +02:00
bool static goToDestination(QString destination);
void static goToOrientation(QString orientation);
void static goToDomain(const QString newDomain);
void static goTo(QString destination);
2014-02-25 20:45:49 -08:00
2014-02-25 20:42:59 -08:00
public slots:
void loginForCurrentDomain();
void bandwidthDetails();
void octreeStatsDetails();
2013-10-29 16:16:58 -07:00
void lodTools();
void loadSettings(QSettings* settings = NULL);
void saveSettings(QSettings* settings = NULL);
void importSettings();
void exportSettings();
void goTo();
2014-04-30 09:39:48 -07:00
bool goToURL(QString location);
2014-03-28 18:44:06 +02:00
void goToUser(const QString& user);
2013-11-13 23:04:51 -08:00
void pasteToVoxel();
2014-04-17 15:18:40 -07:00
void openUrl(const QUrl& url);
2014-04-02 18:07:55 -07:00
void toggleLoginMenuItem();
2014-02-24 23:53:26 -08:00
QMenu* addMenu(const QString& menuName);
void removeMenu(const QString& menuName);
void addSeparator(const QString& menuName, const QString& separatorName);
void removeSeparator(const QString& menuName, const QString& separatorName);
void addMenuItem(const MenuItemProperties& properties);
2014-02-24 23:53:26 -08:00
void removeMenuItem(const QString& menuName, const QString& menuitem);
bool isOptionChecked(const QString& menuOption);
void setIsOptionChecked(const QString& menuOption, bool isChecked);
2014-02-24 19:09:22 -08:00
private slots:
void aboutApp();
void editPreferences();
void goToDomainDialog();
void goToLocation();
2014-03-12 18:53:25 +01:00
void nameLocation();
void bandwidthDetailsClosed();
void octreeStatsDetailsClosed();
2013-10-29 16:16:58 -07:00
void lodToolsClosed();
void cycleFrustumRenderMode();
void runTests();
2014-01-21 11:43:15 -08:00
void showMetavoxelEditor();
void showScriptEditor();
void showChat();
void toggleChat();
void audioMuteToggled();
2014-03-14 20:09:03 +01:00
void namedLocationCreated(LocationManager::NamedLocationCreateResponse response);
2014-03-12 23:02:21 +01:00
void multipleDestinationsDecision(const QJsonObject& userData, const QJsonObject& placeData);
private:
static Menu* _instance;
Menu();
typedef void(*settingsAction)(QSettings*, QAction*);
static void loadAction(QSettings* set, QAction* action);
static void saveAction(QSettings* set, QAction* action);
void scanMenuBar(settingsAction modifySetting, QSettings* set);
void scanMenu(QMenu* menu, settingsAction modifySetting, QSettings* set);
/// helper method to have separators with labels that are also compatible with OS X
2014-04-02 18:07:55 -07:00
void addDisabledActionAndSeparator(QMenu* destinationMenu, const QString& actionName,
int menuItemLocation = UNSPECIFIED_POSITION);
QAction* addCheckableActionToQMenuAndActionHash(QMenu* destinationMenu,
2014-02-25 20:23:38 -08:00
const QString& actionName,
const QKeySequence& shortcut = 0,
const bool checked = false,
const QObject* receiver = NULL,
const char* member = NULL,
int menuItemLocation = UNSPECIFIED_POSITION);
void updateFrustumRenderModeAction();
void addAvatarCollisionSubMenu(QMenu* overMenu);
2014-02-24 23:42:05 -08:00
QAction* getActionFromName(const QString& menuName, QMenu* menu);
QMenu* getSubMenuFromName(const QString& menuName, QMenu* menu);
QMenu* getMenuParent(const QString& menuName, QString& finalMenuPart);
QAction* getMenuAction(const QString& menuName);
int findPositionOfMenuItem(QMenu* menu, const QString& searchMenuItem);
int positionBeforeSeparatorIfNeeded(QMenu* menu, int requestedPosition);
2014-02-24 23:42:05 -08:00
QMenu* getMenu(const QString& menuName);
2014-04-02 18:07:55 -07:00
2014-02-24 23:42:05 -08:00
QHash<QString, QAction*> _actionHash;
int _audioJitterBufferSamples; /// number of extra samples to wait before starting audio playback
BandwidthDialog* _bandwidthDialog;
float _fieldOfView; /// in Degrees, doesn't apply to HMD like Oculus
float _faceshiftEyeDeflection;
FrustumDrawMode _frustumDrawMode;
ViewFrustumOffset _viewFrustumOffset;
QPointer<MetavoxelEditor> _MetavoxelEditor;
QPointer<ScriptEditorWindow> _ScriptEditor;
QPointer<ChatWindow> _chatWindow;
OctreeStatsDialog* _octreeStatsDialog;
2013-10-29 16:16:58 -07:00
LodToolsDialog* _lodToolsDialog;
int _maxVoxels;
2013-10-30 11:01:37 -07:00
float _voxelSizeScale;
bool _automaticAvatarLOD;
float _avatarLODDecreaseFPS;
float _avatarLODIncreaseFPS;
float _avatarLODDistanceMultiplier;
2013-10-30 11:01:37 -07:00
int _boundaryLevelAdjust;
QAction* _useVoxelShader;
int _maxVoxelPacketsPerSecond;
QString replaceLastOccurrence(QChar search, QChar replace, QString string);
2014-02-12 21:22:21 -08:00
quint64 _lastAdjust;
quint64 _lastAvatarDetailDrop;
SimpleMovingAverage _fpsAverage;
SimpleMovingAverage _fastFPSAverage;
QAction* _loginAction;
2014-02-27 23:15:57 +01:00
QPointer<PreferencesDialog> _preferencesDialog;
QAction* _chatAction;
QString _snapshotsLocation;
};
namespace MenuOption {
const QString AboutApp = "About Interface";
const QString AlignForearmsWithWrists = "Align Forearms with Wrists";
const QString AmbientOcclusion = "Ambient Occlusion";
const QString Atmosphere = "Atmosphere";
2014-04-03 16:48:56 -07:00
const QString AudioNoiseReduction = "Audio Noise Reduction";
2014-04-22 06:53:59 -04:00
const QString AudioScope = "Audio Scope";
const QString AudioScopePause = "Pause Audio Scope";
2014-04-03 16:48:56 -07:00
const QString AudioToneInjection = "Inject Test Tone";
const QString AudioSpatialProcessing = "Audio Spatial Processing";
const QString AudioSpatialProcessingHeadOriented = "Head Oriented";
2014-04-16 16:43:01 -07:00
const QString AudioSpatialProcessingIncludeOriginal = "Includes Network Original";
const QString AudioSpatialProcessingPreDelay = "Add Pre-Delay";
const QString AudioSpatialProcessingProcessLocalAudio = "Process Local Audio";
const QString AudioSpatialProcessingRenderPaths = "Render Paths";
const QString AudioSpatialProcessingSeparateEars = "Separate Ears";
const QString AudioSpatialProcessingSlightlyRandomSurfaces = "Slightly Random Surfaces";
const QString AudioSpatialProcessingStereoSource = "Stereo Source";
const QString AudioSpatialProcessingWithDiffusions = "With Diffusions";
const QString AudioSpatialProcessingDontDistanceAttenuate = "Don't calculate distance attenuation";
const QString AudioSpatialProcessingAlternateDistanceAttenuate = "Alternate distance attenuation";
2014-04-03 16:48:56 -07:00
const QString Avatars = "Avatars";
const QString Bandwidth = "Bandwidth Display";
const QString BandwidthDetails = "Bandwidth Details";
const QString BuckyBalls = "Bucky Balls";
2014-04-03 16:48:56 -07:00
const QString Chat = "Chat...";
2013-11-05 12:30:38 -08:00
const QString ChatCircling = "Chat Circling";
const QString CollideWithAvatars = "Collide With Avatars";
2014-04-03 16:48:56 -07:00
const QString CollideWithEnvironment = "Collide With World Boundaries";
const QString CollideWithParticles = "Collide With Particles";
const QString CollideWithVoxels = "Collide With Voxels";
2014-04-03 16:48:56 -07:00
const QString Collisions = "Collisions";
const QString CullSharedFaces = "Cull Shared Voxel Faces";
const QString DecreaseAvatarSize = "Decrease Avatar Size";
const QString DecreaseVoxelSize = "Decrease Voxel Size";
2014-04-03 16:48:56 -07:00
const QString DisableAutoAdjustLOD = "Disable Automatically Adjusting LOD";
const QString DisplayFrustum = "Display Frustum";
const QString DisplayHands = "Display Hands";
2013-12-16 12:04:16 -08:00
const QString DisplayHandTargets = "Display Hand Targets";
const QString DontFadeOnVoxelServerChanges = "Don't Fade In/Out on Voxel Server Changes";
2014-04-03 16:48:56 -07:00
const QString EchoLocalAudio = "Echo Local Audio";
const QString EchoServerAudio = "Echo Server Audio";
const QString Enable3DTVMode = "Enable 3DTV Mode";
2014-04-09 11:14:47 -07:00
const QString Faceplus = "Faceplus";
2014-03-13 15:17:16 -07:00
const QString Faceshift = "Faceshift";
2014-04-03 16:48:56 -07:00
const QString FilterSixense = "Smooth Sixense Movement";
const QString FirstPerson = "First Person";
const QString FrameTimer = "Show Timer";
const QString FrustumRenderMode = "Render Mode";
const QString Fullscreen = "Fullscreen";
const QString FullscreenMirror = "Fullscreen Mirror";
const QString GlowMode = "Cycle Glow Mode";
2014-04-18 17:47:21 -07:00
const QString GlowWhenSpeaking = "Glow When Speaking";
2014-04-03 16:48:56 -07:00
const QString GoHome = "Go Home";
const QString GoTo = "Go To...";
const QString GoToDomain = "Go To Domain...";
const QString GoToLocation = "Go To Location...";
const QString ObeyEnvironmentalGravity = "Obey Environmental Gravity";
2014-04-03 16:48:56 -07:00
const QString HandsCollideWithSelf = "Collide With Self";
const QString HeadMouse = "Head Mouse";
const QString IncreaseAvatarSize = "Increase Avatar Size";
const QString IncreaseVoxelSize = "Increase Voxel Size";
2014-04-03 16:48:56 -07:00
const QString LoadScript = "Open and Run Script File...";
const QString LoadScriptURL = "Open and Run Script from URL...";
2013-10-29 16:16:58 -07:00
const QString LodTools = "LOD Tools";
const QString Log = "Log";
const QString Login = "Login";
2014-02-21 17:13:22 -08:00
const QString Logout = "Logout";
const QString LookAtVectors = "Look-at Vectors";
2014-01-21 11:43:15 -08:00
const QString MetavoxelEditor = "Metavoxel Editor...";
2013-12-11 18:00:17 -08:00
const QString Metavoxels = "Metavoxels";
const QString Mirror = "Mirror";
2014-04-30 11:12:49 -07:00
const QString Models = "Models";
const QString MoveWithLean = "Move with Lean";
2014-04-03 16:48:56 -07:00
const QString MuteAudio = "Mute Microphone";
const QString NameLocation = "Name this location";
const QString NewVoxelCullingMode = "New Voxel Culling Mode";
2014-04-03 16:48:56 -07:00
const QString OctreeStats = "Voxel and Particle Statistics";
const QString OffAxisProjection = "Off-Axis Projection";
const QString OldVoxelCullingMode = "Old Voxel Culling Mode";
const QString Pair = "Pair";
const QString Particles = "Particles";
2013-11-13 23:04:51 -08:00
const QString PasteToVoxel = "Paste to Voxel...";
const QString PipelineWarnings = "Show Render Pipeline Warnings";
const QString PlaySlaps = "Play Slaps";
const QString Preferences = "Preferences...";
2014-04-03 16:48:56 -07:00
const QString Quit = "Quit";
const QString ReloadAllScripts = "Reload All Scripts";
const QString RenderBoundingCollisionShapes = "Bounding Collision Shapes";
2014-04-03 16:48:56 -07:00
const QString RenderHeadCollisionShapes = "Head Collision Shapes";
const QString RenderSkeletonCollisionShapes = "Skeleton Collision Shapes";
const QString ResetAvatarSize = "Reset Avatar Size";
2014-04-02 18:07:55 -07:00
const QString RunningScripts = "Running Scripts";
const QString RunTimingTests = "Run Timing Tests";
const QString ScriptEditor = "Script Editor...";
2014-04-03 16:48:56 -07:00
const QString SettingsExport = "Export Settings";
const QString SettingsImport = "Import Settings";
2013-11-20 16:23:54 -08:00
const QString Shadows = "Shadows";
const QString ShowCulledSharedFaces = "Show Culled Shared Voxel Faces";
const QString ShowIKConstraints = "Show IK Constraints";
const QString Stars = "Stars";
const QString Stats = "Stats";
const QString StopAllScripts = "Stop All Scripts";
2014-04-03 16:48:56 -07:00
const QString SuppressShortTimings = "Suppress Timings Less than 10ms";
const QString TestPing = "Test Ping";
const QString TransmitterDrive = "Transmitter Drive";
2014-04-03 16:48:56 -07:00
const QString TurnWithHead = "Turn using Head";
const QString UploadHead = "Upload Head Model";
const QString UploadSkeleton = "Upload Skeleton Model";
2014-03-13 15:17:16 -07:00
const QString Visage = "Visage";
const QString VoxelMode = "Cycle Voxel Mode";
2014-04-03 16:48:56 -07:00
const QString Voxels = "Voxels";
const QString VoxelTextures = "Voxel Textures";
}
2014-03-25 00:17:19 -07:00
void sendFakeEnterEvent();
2014-04-09 12:03:17 -07:00
#endif // hifi_Menu_h