5476 lines · 222.9 KB · C++
RawDownload
    } 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