} else if ((int)event->type() == (int)Paint) { // NOTE: This must be updated as close to painting as possible, // or AvatarInputs will mysteriously move to the bottom-right AvatarInputs::getInstance()->update(); paintGL(); isPaintingThrottled = false; return true; } if ((int)event->type() == (int)Lambda) { static_cast<LambdaEvent*>(event)->call(); return true; } if (!_keyboardFocusedItem.isInvalidID()) { switch (event->type()) { case QEvent::KeyPress: case QEvent::KeyRelease: { auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>(); auto entity = entityScriptingInterface->getEntityTree()->findEntityByID(_keyboardFocusedItem); RenderableWebEntityItem* webEntity = dynamic_cast<RenderableWebEntityItem*>(entity.get()); if (webEntity && webEntity->getEventHandler()) { event->setAccepted(false); QCoreApplication::sendEvent(webEntity->getEventHandler(), event); if (event->isAccepted()) { _lastAcceptedKeyPress = usecTimestampNow(); return true; } } break; } default: break; } } switch (event->type()) { case QEvent::MouseMove: mouseMoveEvent(static_cast<QMouseEvent*>(event)); return true; case QEvent::MouseButtonPress: mousePressEvent(static_cast<QMouseEvent*>(event)); return true; case QEvent::MouseButtonDblClick: mouseDoublePressEvent(static_cast<QMouseEvent*>(event)); return true; case QEvent::MouseButtonRelease: mouseReleaseEvent(static_cast<QMouseEvent*>(event)); return true; case QEvent::KeyPress: keyPressEvent(static_cast<QKeyEvent*>(event)); return true; case QEvent::KeyRelease: keyReleaseEvent(static_cast<QKeyEvent*>(event)); return true; case QEvent::FocusOut: focusOutEvent(static_cast<QFocusEvent*>(event)); return true; case QEvent::TouchBegin: touchBeginEvent(static_cast<QTouchEvent*>(event)); event->accept(); return true; case QEvent::TouchEnd: touchEndEvent(static_cast<QTouchEvent*>(event)); return true; case QEvent::TouchUpdate: touchUpdateEvent(static_cast<QTouchEvent*>(event)); return true; case QEvent::Wheel: wheelEvent(static_cast<QWheelEvent*>(event)); return true; case QEvent::Drop: dropEvent(static_cast<QDropEvent*>(event)); return true; default: break; } // handle custom URL if (event->type() == QEvent::FileOpen) { QFileOpenEvent* fileEvent = static_cast<QFileOpenEvent*>(event); QUrl url = fileEvent->url(); if (!url.isEmpty()) { QString urlString = url.toString(); if (canAcceptURL(urlString)) { return acceptURL(urlString); } } return false; } if (HFActionEvent::types().contains(event->type())) { _controllerScriptingInterface->handleMetaEvent(static_cast<HFMetaEvent*>(event)); } return QApplication::event(event);} bool Application::eventFilter(QObject* object, QEvent* event) { if (event->type() == QEvent::Leave) { getApplicationCompositor().handleLeaveEvent(); } if (event->type() == QEvent::ShortcutOverride) { if (DependencyManager::get<OffscreenUi>()->shouldSwallowShortcut(event)) { event->accept(); return true; } // Filter out captured keys before they're used for shortcut actions. if (_controllerScriptingInterface->isKeyCaptured(static_cast<QKeyEvent*>(event))) { event->accept(); return true; } } return false;} static bool _altPressed{ false }; void Application::keyPressEvent(QKeyEvent* event) { _altPressed = event->key() == Qt::Key_Alt; _keysPressed.insert(event->key()); _controllerScriptingInterface->emitKeyPressEvent(event); // send events to any registered scripts // if one of our scripts have asked to capture this event, then stop processing it if (_controllerScriptingInterface->isKeyCaptured(event)) { return; } if (hasFocus()) { if (_keyboardMouseDevice->isActive()) { _keyboardMouseDevice->keyPressEvent(event); } bool isShifted = event->modifiers().testFlag(Qt::ShiftModifier); bool isMeta = event->modifiers().testFlag(Qt::ControlModifier); bool isOption = event->modifiers().testFlag(Qt::AltModifier); switch (event->key()) { case Qt::Key_Enter: case Qt::Key_Return: if (isOption) { if (_window->isFullScreen()) { unsetFullscreen(); } else { setFullscreen(nullptr); } } else { Menu::getInstance()->triggerOption(MenuOption::AddressBar); } break; case Qt::Key_1: case Qt::Key_2: case Qt::Key_3: case Qt::Key_4: case Qt::Key_5: case Qt::Key_6: case Qt::Key_7: if (isMeta || isOption) { unsigned int index = static_cast<unsigned int>(event->key() - Qt::Key_1); auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); if (index < displayPlugins.size()) { auto targetPlugin = displayPlugins.at(index); QString targetName = targetPlugin->getName(); auto menu = Menu::getInstance(); QAction* action = menu->getActionForOption(targetName); if (action && !action->isChecked()) { action->trigger(); } } } break; case Qt::Key_X: if (isShifted && isMeta) { auto offscreenUi = DependencyManager::get<OffscreenUi>(); offscreenUi->togglePinned(); //offscreenUi->getRootContext()->engine()->clearComponentCache(); //OffscreenUi::information("Debugging", "Component cache cleared"); // placeholder for dialogs being converted to QML. } break; case Qt::Key_Y: if (isShifted && isMeta) { getActiveDisplayPlugin()->cycleDebugOutput(); } break; case Qt::Key_B: if (isMeta) { auto offscreenUi = DependencyManager::get<OffscreenUi>(); offscreenUi->load("Browser.qml"); } break; case Qt::Key_L: if (isShifted && isMeta) { Menu::getInstance()->triggerOption(MenuOption::Log); } else if (isMeta) { Menu::getInstance()->triggerOption(MenuOption::AddressBar); } else if (isShifted) { Menu::getInstance()->triggerOption(MenuOption::LodTools); } break; case Qt::Key_F: { _physicsEngine->dumpNextStats(); break; } case Qt::Key_Asterisk: Menu::getInstance()->triggerOption(MenuOption::Stars); break; case Qt::Key_S: if (isShifted && isMeta && !isOption) { Menu::getInstance()->triggerOption(MenuOption::SuppressShortTimings); } else if (isOption && !isShifted && !isMeta) { Menu::getInstance()->triggerOption(MenuOption::ScriptEditor); } else if (!isOption && !isShifted && isMeta) { takeSnapshot(); } break; case Qt::Key_Apostrophe: { if (isMeta) { auto cursor = Cursor::Manager::instance().getCursor(); auto curIcon = cursor->getIcon(); if (curIcon == Cursor::Icon::DEFAULT) { cursor->setIcon(Cursor::Icon::LINK); } else { cursor->setIcon(Cursor::Icon::DEFAULT); } } else { resetSensors(true); } break; } case Qt::Key_Backslash: Menu::getInstance()->triggerOption(MenuOption::Chat); break; case Qt::Key_Up: if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { if (!isShifted) { _scaleMirror *= 0.95f; } else { _raiseMirror += 0.05f; } } break; case Qt::Key_Down: if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { if (!isShifted) { _scaleMirror *= 1.05f; } else { _raiseMirror -= 0.05f; } } break; case Qt::Key_Left: if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _rotateMirror += PI / 20.0f; } break; case Qt::Key_Right: if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _rotateMirror -= PI / 20.0f; } break; #if 0 case Qt::Key_I: if (isShifted) { _myCamera.setEyeOffsetOrientation(glm::normalize( glm::quat(glm::vec3(0.002f, 0, 0)) * _myCamera.getEyeOffsetOrientation())); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0.001, 0)); } updateProjectionMatrix(); break; case Qt::Key_K: if (isShifted) { _myCamera.setEyeOffsetOrientation(glm::normalize( glm::quat(glm::vec3(-0.002f, 0, 0)) * _myCamera.getEyeOffsetOrientation())); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, -0.001, 0)); } updateProjectionMatrix(); break; case Qt::Key_J: if (isShifted) { QMutexLocker viewLocker(&_viewMutex); _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() - 0.1f); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(-0.001, 0, 0)); } updateProjectionMatrix(); break; case Qt::Key_M: if (isShifted) { QMutexLocker viewLocker(&_viewMutex); _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() + 0.1f); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0.001, 0, 0)); } updateProjectionMatrix(); break; case Qt::Key_U: if (isShifted) { _myCamera.setEyeOffsetOrientation(glm::normalize( glm::quat(glm::vec3(0, 0, -0.002f)) * _myCamera.getEyeOffsetOrientation())); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0, -0.001)); } updateProjectionMatrix(); break; case Qt::Key_Y: if (isShifted) { _myCamera.setEyeOffsetOrientation(glm::normalize( glm::quat(glm::vec3(0, 0, 0.002f)) * _myCamera.getEyeOffsetOrientation())); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0, 0.001)); } updateProjectionMatrix(); break;#endif case Qt::Key_H: if (isShifted) { Menu::getInstance()->triggerOption(MenuOption::MiniMirror); } else { // whenever switching to/from full screen mirror from the keyboard, remember // the state you were in before full screen mirror, and return to that. auto previousMode = _myCamera.getMode(); if (previousMode != CAMERA_MODE_MIRROR) { switch (previousMode) { case CAMERA_MODE_FIRST_PERSON: _returnFromFullScreenMirrorTo = MenuOption::FirstPerson; break; case CAMERA_MODE_THIRD_PERSON: _returnFromFullScreenMirrorTo = MenuOption::ThirdPerson; break; // FIXME - it's not clear that these modes make sense to return to... case CAMERA_MODE_INDEPENDENT: _returnFromFullScreenMirrorTo = MenuOption::IndependentMode; break; case CAMERA_MODE_ENTITY: _returnFromFullScreenMirrorTo = MenuOption::CameraEntityMode; break; default: _returnFromFullScreenMirrorTo = MenuOption::ThirdPerson; break; } } bool isMirrorChecked = Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror); Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, !isMirrorChecked); if (isMirrorChecked) { // if we got here without coming in from a non-Full Screen mirror case, then our // _returnFromFullScreenMirrorTo is unknown. In that case we'll go to the old // behavior of returning to ThirdPerson if (_returnFromFullScreenMirrorTo.isEmpty()) { _returnFromFullScreenMirrorTo = MenuOption::ThirdPerson; } Menu::getInstance()->setIsOptionChecked(_returnFromFullScreenMirrorTo, true); } cameraMenuChanged(); } break; case Qt::Key_P: { bool isFirstPersonChecked = Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson); Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, !isFirstPersonChecked); Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, isFirstPersonChecked); cameraMenuChanged(); break; } case Qt::Key_Slash: Menu::getInstance()->triggerOption(MenuOption::Stats); break; case Qt::Key_Plus: { if (isMeta && event->modifiers().testFlag(Qt::KeypadModifier)) { auto& cursorManager = Cursor::Manager::instance(); cursorManager.setScale(cursorManager.getScale() * 1.1f); } else { getMyAvatar()->increaseSize(); } break; } case Qt::Key_Minus: { if (isMeta && event->modifiers().testFlag(Qt::KeypadModifier)) { auto& cursorManager = Cursor::Manager::instance(); cursorManager.setScale(cursorManager.getScale() / 1.1f); } else { getMyAvatar()->decreaseSize(); } break; } case Qt::Key_Equal: getMyAvatar()->resetSize(); break; case Qt::Key_Space: { if (!event->isAutoRepeat()) { // FIXME -- I don't think we've tested the HFActionEvent in a while... this looks possibly dubious // this starts an HFActionEvent HFActionEvent startActionEvent(HFActionEvent::startType(), computePickRay(getMouse().x, getMouse().y)); sendEvent(this, &startActionEvent); } break; } case Qt::Key_Escape: { getActiveDisplayPlugin()->abandonCalibration(); if (!event->isAutoRepeat()) { // this starts the HFCancelEvent HFBackEvent startBackEvent(HFBackEvent::startType()); sendEvent(this, &startBackEvent); } break; } default: event->ignore(); break; } }} void Application::keyReleaseEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Alt && _altPressed && hasFocus()) { toggleMenuUnderReticle(); } _keysPressed.remove(event->key()); _controllerScriptingInterface->emitKeyReleaseEvent(event); // send events to any registered scripts // if one of our scripts have asked to capture this event, then stop processing it if (_controllerScriptingInterface->isKeyCaptured(event)) { return; } if (_keyboardMouseDevice->isActive()) { _keyboardMouseDevice->keyReleaseEvent(event); } switch (event->key()) { case Qt::Key_Space: { if (!event->isAutoRepeat()) { // FIXME -- I don't think we've tested the HFActionEvent in a while... this looks possibly dubious // this ends the HFActionEvent HFActionEvent endActionEvent(HFActionEvent::endType(), computePickRay(getMouse().x, getMouse().y)); sendEvent(this, &endActionEvent); } break; } case Qt::Key_Escape: { if (!event->isAutoRepeat()) { // this ends the HFCancelEvent HFBackEvent endBackEvent(HFBackEvent::endType()); sendEvent(this, &endBackEvent); } break; } default: event->ignore(); break;Lines 2001–2500 of 5476. Previous lines Load more
} else if ((int)event->type() == (int)Paint) { // NOTE: This must be updated as close to painting as possible, // or AvatarInputs will mysteriously move to the bottom-right AvatarInputs::getInstance()->update(); paintGL(); isPaintingThrottled = false; return true; } if ((int)event->type() == (int)Lambda) { static_cast<LambdaEvent*>(event)->call(); return true; } if (!_keyboardFocusedItem.isInvalidID()) { switch (event->type()) { case QEvent::KeyPress: case QEvent::KeyRelease: { auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>(); auto entity = entityScriptingInterface->getEntityTree()->findEntityByID(_keyboardFocusedItem); RenderableWebEntityItem* webEntity = dynamic_cast<RenderableWebEntityItem*>(entity.get()); if (webEntity && webEntity->getEventHandler()) { event->setAccepted(false); QCoreApplication::sendEvent(webEntity->getEventHandler(), event); if (event->isAccepted()) { _lastAcceptedKeyPress = usecTimestampNow(); return true; } } break; } default: break; } } switch (event->type()) { case QEvent::MouseMove: mouseMoveEvent(static_cast<QMouseEvent*>(event)); return true; case QEvent::MouseButtonPress: mousePressEvent(static_cast<QMouseEvent*>(event)); return true; case QEvent::MouseButtonDblClick: mouseDoublePressEvent(static_cast<QMouseEvent*>(event)); return true; case QEvent::MouseButtonRelease: mouseReleaseEvent(static_cast<QMouseEvent*>(event)); return true; case QEvent::KeyPress: keyPressEvent(static_cast<QKeyEvent*>(event)); return true; case QEvent::KeyRelease: keyReleaseEvent(static_cast<QKeyEvent*>(event)); return true; case QEvent::FocusOut: focusOutEvent(static_cast<QFocusEvent*>(event)); return true; case QEvent::TouchBegin: touchBeginEvent(static_cast<QTouchEvent*>(event)); event->accept(); return true; case QEvent::TouchEnd: touchEndEvent(static_cast<QTouchEvent*>(event)); return true; case QEvent::TouchUpdate: touchUpdateEvent(static_cast<QTouchEvent*>(event)); return true; case QEvent::Wheel: wheelEvent(static_cast<QWheelEvent*>(event)); return true; case QEvent::Drop: dropEvent(static_cast<QDropEvent*>(event)); return true; default: break; } // handle custom URL if (event->type() == QEvent::FileOpen) { QFileOpenEvent* fileEvent = static_cast<QFileOpenEvent*>(event); QUrl url = fileEvent->url(); if (!url.isEmpty()) { QString urlString = url.toString(); if (canAcceptURL(urlString)) { return acceptURL(urlString); } } return false; } if (HFActionEvent::types().contains(event->type())) { _controllerScriptingInterface->handleMetaEvent(static_cast<HFMetaEvent*>(event)); } return QApplication::event(event); } bool Application::eventFilter(QObject* object, QEvent* event) { if (event->type() == QEvent::Leave) { getApplicationCompositor().handleLeaveEvent(); } if (event->type() == QEvent::ShortcutOverride) { if (DependencyManager::get<OffscreenUi>()->shouldSwallowShortcut(event)) { event->accept(); return true; } // Filter out captured keys before they're used for shortcut actions. if (_controllerScriptingInterface->isKeyCaptured(static_cast<QKeyEvent*>(event))) { event->accept(); return true; } } return false; } static bool _altPressed{ false }; void Application::keyPressEvent(QKeyEvent* event) { _altPressed = event->key() == Qt::Key_Alt; _keysPressed.insert(event->key()); _controllerScriptingInterface->emitKeyPressEvent(event); // send events to any registered scripts // if one of our scripts have asked to capture this event, then stop processing it if (_controllerScriptingInterface->isKeyCaptured(event)) { return; } if (hasFocus()) { if (_keyboardMouseDevice->isActive()) { _keyboardMouseDevice->keyPressEvent(event); } bool isShifted = event->modifiers().testFlag(Qt::ShiftModifier); bool isMeta = event->modifiers().testFlag(Qt::ControlModifier); bool isOption = event->modifiers().testFlag(Qt::AltModifier); switch (event->key()) { case Qt::Key_Enter: case Qt::Key_Return: if (isOption) { if (_window->isFullScreen()) { unsetFullscreen(); } else { setFullscreen(nullptr); } } else { Menu::getInstance()->triggerOption(MenuOption::AddressBar); } break; case Qt::Key_1: case Qt::Key_2: case Qt::Key_3: case Qt::Key_4: case Qt::Key_5: case Qt::Key_6: case Qt::Key_7: if (isMeta || isOption) { unsigned int index = static_cast<unsigned int>(event->key() - Qt::Key_1); auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); if (index < displayPlugins.size()) { auto targetPlugin = displayPlugins.at(index); QString targetName = targetPlugin->getName(); auto menu = Menu::getInstance(); QAction* action = menu->getActionForOption(targetName); if (action && !action->isChecked()) { action->trigger(); } } } break; case Qt::Key_X: if (isShifted && isMeta) { auto offscreenUi = DependencyManager::get<OffscreenUi>(); offscreenUi->togglePinned(); //offscreenUi->getRootContext()->engine()->clearComponentCache(); //OffscreenUi::information("Debugging", "Component cache cleared"); // placeholder for dialogs being converted to QML. } break; case Qt::Key_Y: if (isShifted && isMeta) { getActiveDisplayPlugin()->cycleDebugOutput(); } break; case Qt::Key_B: if (isMeta) { auto offscreenUi = DependencyManager::get<OffscreenUi>(); offscreenUi->load("Browser.qml"); } break; case Qt::Key_L: if (isShifted && isMeta) { Menu::getInstance()->triggerOption(MenuOption::Log); } else if (isMeta) { Menu::getInstance()->triggerOption(MenuOption::AddressBar); } else if (isShifted) { Menu::getInstance()->triggerOption(MenuOption::LodTools); } break; case Qt::Key_F: { _physicsEngine->dumpNextStats(); break; } case Qt::Key_Asterisk: Menu::getInstance()->triggerOption(MenuOption::Stars); break; case Qt::Key_S: if (isShifted && isMeta && !isOption) { Menu::getInstance()->triggerOption(MenuOption::SuppressShortTimings); } else if (isOption && !isShifted && !isMeta) { Menu::getInstance()->triggerOption(MenuOption::ScriptEditor); } else if (!isOption && !isShifted && isMeta) { takeSnapshot(); } break; case Qt::Key_Apostrophe: { if (isMeta) { auto cursor = Cursor::Manager::instance().getCursor(); auto curIcon = cursor->getIcon(); if (curIcon == Cursor::Icon::DEFAULT) { cursor->setIcon(Cursor::Icon::LINK); } else { cursor->setIcon(Cursor::Icon::DEFAULT); } } else { resetSensors(true); } break; } case Qt::Key_Backslash: Menu::getInstance()->triggerOption(MenuOption::Chat); break; case Qt::Key_Up: if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { if (!isShifted) { _scaleMirror *= 0.95f; } else { _raiseMirror += 0.05f; } } break; case Qt::Key_Down: if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { if (!isShifted) { _scaleMirror *= 1.05f; } else { _raiseMirror -= 0.05f; } } break; case Qt::Key_Left: if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _rotateMirror += PI / 20.0f; } break; case Qt::Key_Right: if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _rotateMirror -= PI / 20.0f; } break; #if 0 case Qt::Key_I: if (isShifted) { _myCamera.setEyeOffsetOrientation(glm::normalize( glm::quat(glm::vec3(0.002f, 0, 0)) * _myCamera.getEyeOffsetOrientation())); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0.001, 0)); } updateProjectionMatrix(); break; case Qt::Key_K: if (isShifted) { _myCamera.setEyeOffsetOrientation(glm::normalize( glm::quat(glm::vec3(-0.002f, 0, 0)) * _myCamera.getEyeOffsetOrientation())); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, -0.001, 0)); } updateProjectionMatrix(); break; case Qt::Key_J: if (isShifted) { QMutexLocker viewLocker(&_viewMutex); _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() - 0.1f); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(-0.001, 0, 0)); } updateProjectionMatrix(); break; case Qt::Key_M: if (isShifted) { QMutexLocker viewLocker(&_viewMutex); _viewFrustum.setFocalLength(_viewFrustum.getFocalLength() + 0.1f); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0.001, 0, 0)); } updateProjectionMatrix(); break; case Qt::Key_U: if (isShifted) { _myCamera.setEyeOffsetOrientation(glm::normalize( glm::quat(glm::vec3(0, 0, -0.002f)) * _myCamera.getEyeOffsetOrientation())); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0, -0.001)); } updateProjectionMatrix(); break; case Qt::Key_Y: if (isShifted) { _myCamera.setEyeOffsetOrientation(glm::normalize( glm::quat(glm::vec3(0, 0, 0.002f)) * _myCamera.getEyeOffsetOrientation())); } else { _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0, 0.001)); } updateProjectionMatrix(); break; #endif case Qt::Key_H: if (isShifted) { Menu::getInstance()->triggerOption(MenuOption::MiniMirror); } else { // whenever switching to/from full screen mirror from the keyboard, remember // the state you were in before full screen mirror, and return to that. auto previousMode = _myCamera.getMode(); if (previousMode != CAMERA_MODE_MIRROR) { switch (previousMode) { case CAMERA_MODE_FIRST_PERSON: _returnFromFullScreenMirrorTo = MenuOption::FirstPerson; break; case CAMERA_MODE_THIRD_PERSON: _returnFromFullScreenMirrorTo = MenuOption::ThirdPerson; break; // FIXME - it's not clear that these modes make sense to return to... case CAMERA_MODE_INDEPENDENT: _returnFromFullScreenMirrorTo = MenuOption::IndependentMode; break; case CAMERA_MODE_ENTITY: _returnFromFullScreenMirrorTo = MenuOption::CameraEntityMode; break; default: _returnFromFullScreenMirrorTo = MenuOption::ThirdPerson; break; } } bool isMirrorChecked = Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror); Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, !isMirrorChecked); if (isMirrorChecked) { // if we got here without coming in from a non-Full Screen mirror case, then our // _returnFromFullScreenMirrorTo is unknown. In that case we'll go to the old // behavior of returning to ThirdPerson if (_returnFromFullScreenMirrorTo.isEmpty()) { _returnFromFullScreenMirrorTo = MenuOption::ThirdPerson; } Menu::getInstance()->setIsOptionChecked(_returnFromFullScreenMirrorTo, true); } cameraMenuChanged(); } break; case Qt::Key_P: { bool isFirstPersonChecked = Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson); Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, !isFirstPersonChecked); Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, isFirstPersonChecked); cameraMenuChanged(); break; } case Qt::Key_Slash: Menu::getInstance()->triggerOption(MenuOption::Stats); break; case Qt::Key_Plus: { if (isMeta && event->modifiers().testFlag(Qt::KeypadModifier)) { auto& cursorManager = Cursor::Manager::instance(); cursorManager.setScale(cursorManager.getScale() * 1.1f); } else { getMyAvatar()->increaseSize(); } break; } case Qt::Key_Minus: { if (isMeta && event->modifiers().testFlag(Qt::KeypadModifier)) { auto& cursorManager = Cursor::Manager::instance(); cursorManager.setScale(cursorManager.getScale() / 1.1f); } else { getMyAvatar()->decreaseSize(); } break; } case Qt::Key_Equal: getMyAvatar()->resetSize(); break; case Qt::Key_Space: { if (!event->isAutoRepeat()) { // FIXME -- I don't think we've tested the HFActionEvent in a while... this looks possibly dubious // this starts an HFActionEvent HFActionEvent startActionEvent(HFActionEvent::startType(), computePickRay(getMouse().x, getMouse().y)); sendEvent(this, &startActionEvent); } break; } case Qt::Key_Escape: { getActiveDisplayPlugin()->abandonCalibration(); if (!event->isAutoRepeat()) { // this starts the HFCancelEvent HFBackEvent startBackEvent(HFBackEvent::startType()); sendEvent(this, &startBackEvent); } break; } default: event->ignore(); break; } } } void Application::keyReleaseEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Alt && _altPressed && hasFocus()) { toggleMenuUnderReticle(); } _keysPressed.remove(event->key()); _controllerScriptingInterface->emitKeyReleaseEvent(event); // send events to any registered scripts // if one of our scripts have asked to capture this event, then stop processing it if (_controllerScriptingInterface->isKeyCaptured(event)) { return; } if (_keyboardMouseDevice->isActive()) { _keyboardMouseDevice->keyReleaseEvent(event); } switch (event->key()) { case Qt::Key_Space: { if (!event->isAutoRepeat()) { // FIXME -- I don't think we've tested the HFActionEvent in a while... this looks possibly dubious // this ends the HFActionEvent HFActionEvent endActionEvent(HFActionEvent::endType(), computePickRay(getMouse().x, getMouse().y)); sendEvent(this, &endActionEvent); } break; } case Qt::Key_Escape: { if (!event->isAutoRepeat()) { // this ends the HFCancelEvent HFBackEvent endBackEvent(HFBackEvent::endType()); sendEvent(this, &endBackEvent); } break; } default: event->ignore(); break;