942 lines · 48.4 KB · C++
RawDownload
////  Menu.cpp//  interface/src////  Created by Stephen Birarda on 8/12/13.//  Copyright 2013 High Fidelity, Inc.//  Copyright 2020 Vircadia contributors.//  Copyright 2023 Overte e.V.////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html//  SPDX-License-Identifier: Apache-2.0////  For happ(ier) development of QML, use these two things://  This forces QML files to be pulled from the source as you edit it: set environment variable HIFI_USE_SOURCE_TREE_RESOURCES=1//  Use this to live reload: DependencyManager::get<OffscreenUi>()->clearCache();  // QT6TODO: The Key Enums should be replaced by QKeyCombination in Qt6 #include "Menu.h"#include <QDesktopServices>#include <QFileDialog>#include <QMenuBar>#include <QShortcut> #include <thread> #include <AddressManager.h>#include <AssetClient.h>#include <AudioClient.h>#include <CrashHelpers.h>#include <DependencyManager.h>#include <ui/TabletScriptingInterface.h>#include <display-plugins/DisplayPlugin.h>#include <PathUtils.h>#include <SettingHandle.h>#include <UserActivityLogger.h>#include <VrMenu.h>#include <ScriptEngines.h>#include <MenuItemProperties.h>#include <ui/types/FileTypeProfile.h>#include <ui/types/HFWebEngineProfile.h> #include "Application.h"#include "AccountManager.h"#include "assets/ATPAssetMigrator.h"#include "audio/AudioScope.h"#include "avatar/AvatarManager.h"#include "avatar/AvatarPackager.h"#include "AvatarBookmarks.h"#include <display-plugins/OpenGLDisplayPlugin.h>#include "DomainAccountManager.h"#include "MainWindow.h"#include "render/DrawStatus.h"#include "scripting/MenuScriptingInterface.h"#include "scripting/HMDScriptingInterface.h"#include "ui/DialogsManager.h"#include "ui/StandAloneJSConsole.h"#include "InterfaceLogging.h"#include "LocationBookmarks.h"#include "DeferredLightingEffect.h"#include "PickManager.h"#include "crash-handler/CrashHandler.h" #include "scripting/SettingsScriptingInterface.h"#if defined(Q_OS_MAC) || defined(Q_OS_WIN)#include "SpeechRecognizer.h"#endif #include "scripting/RenderScriptingInterface.h" extern bool DEV_DECIMATE_TEXTURES; Menu* Menu::getInstance() {    return dynamic_cast<Menu*>(qApp->getWindow()->menuBar());} const char* EXCLUSION_GROUP_KEY = "exclusionGroup"; Menu::Menu() {    auto dialogsManager = DependencyManager::get<DialogsManager>();    auto accountManager = DependencyManager::get<AccountManager>();    auto domainAccountManager = DependencyManager::get<DomainAccountManager>();     // File/Application menu ----------------------------------    MenuWrapper* fileMenu = addMenu("File");     // File > Login menu items    {        addActionToQMenuAndActionHash(fileMenu, MenuOption::Login);         // connect to the appropriate signal of the AccountManager so that we can change the Login/Logout menu item        connect(accountManager.data(), &AccountManager::profileChanged,                dialogsManager.data(), &DialogsManager::toggleLoginDialog);        connect(accountManager.data(), &AccountManager::logoutComplete,                dialogsManager.data(), &DialogsManager::toggleLoginDialog);    }     auto domainLogin = addActionToQMenuAndActionHash(fileMenu, "Domain: Log In");    domainLogin->setVisible(false);    connect(domainLogin, &QAction::triggered, [] {        auto dialogsManager = DependencyManager::get<DialogsManager>();        dialogsManager->setDomainLoginState();        dialogsManager->showDomainLoginDialog();    });    connect(domainAccountManager.data(), &DomainAccountManager::hasLogInChanged, [domainLogin](bool hasLogIn) {        domainLogin->setVisible(hasLogIn);    });     // File > Quit    addActionToQMenuAndActionHash(fileMenu, MenuOption::Quit, static_cast<int>(Qt::CTRL) | static_cast<int>(Qt::Key_Q), qApp, SLOT(quit()), QAction::QuitRole);      // Edit menu ----------------------------------    MenuWrapper* editMenu = addMenu("Edit");     // Edit > Cut    auto cutAction = addActionToQMenuAndActionHash(editMenu, "Cut", QKeySequence::Cut);    connect(cutAction, &QAction::triggered, [] {            QKeyEvent* keyEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_X, Qt::ControlModifier);            QCoreApplication::postEvent(QCoreApplication::instance(), keyEvent);    });     // Edit > Copy    auto copyAction = addActionToQMenuAndActionHash(editMenu, "Copy", QKeySequence::Copy);    connect(copyAction, &QAction::triggered, [] {            QKeyEvent* keyEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_C, Qt::ControlModifier);            QCoreApplication::postEvent(QCoreApplication::instance(), keyEvent);    });     // Edit > Paste    auto pasteAction = addActionToQMenuAndActionHash(editMenu, "Paste", QKeySequence::Paste);    connect(pasteAction, &QAction::triggered, [] {            QKeyEvent* keyEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_V, Qt::ControlModifier);            QCoreApplication::postEvent(QCoreApplication::instance(), keyEvent);    });     // Edit > Delete    auto deleteAction = addActionToQMenuAndActionHash(editMenu, "Delete", QKeySequence::Delete);    connect(deleteAction, &QAction::triggered, [] {            QKeyEvent* keyEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_Delete, Qt::NoModifier);            QCoreApplication::postEvent(QCoreApplication::instance(), keyEvent);    });     editMenu->addSeparator();     // Edit > Running Scripts    auto action = addActionToQMenuAndActionHash(editMenu, MenuOption::RunningScripts, static_cast<int>(Qt::CTRL) | static_cast<int>(Qt::Key_J));    connect(action, &QAction::triggered, [] {        if (!qApp->getLoginDialogPoppedUp()) {            static const QUrl widgetUrl("hifi/dialogs/RunningScripts.qml");            static const QUrl tabletUrl("hifi/dialogs/TabletRunningScripts.qml");            static const QString name("RunningScripts");            qApp->showDialog(widgetUrl, tabletUrl, name);        }    });     editMenu->addSeparator();     // Edit > Asset Browser    auto assetServerAction = addActionToQMenuAndActionHash(editMenu, MenuOption::AssetServer,                                                           static_cast<int>(Qt::CTRL | Qt::SHIFT) | static_cast<int>(Qt::Key_A),                                                           qApp, SLOT(showAssetServerWidget()));    {        auto nodeList = DependencyManager::get<NodeList>();        QObject::connect(nodeList.data(), &NodeList::canWriteAssetsChanged, assetServerAction, &QAction::setEnabled);        assetServerAction->setEnabled(nodeList->getThisNodeCanWriteAssets());    }     // Edit > Avatar Packager#ifndef Q_OS_ANDROID    action = addActionToQMenuAndActionHash(editMenu, MenuOption::AvatarPackager);    connect(action, &QAction::triggered, [] {        DependencyManager::get<AvatarPackager>()->open();    });#endif     // Edit > Reload All Content    addActionToQMenuAndActionHash(editMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches()));     // Display menu ----------------------------------    // FIXME - this is not yet matching Alan's spec because it doesn't have    // menus for "2D"/"3D" - we need to add support for detecting the appropriate    // default 3D display mode    addMenu(DisplayPlugin::MENU_PATH());    MenuWrapper* displayModeMenu = addMenu(MenuOption::OutputMenu);    QActionGroup* displayModeGroup = new QActionGroup(displayModeMenu);    displayModeGroup->setExclusive(true);      // View menu ----------------------------------    MenuWrapper* viewMenu = addMenu("View");    QActionGroup* cameraModeGroup = new QActionGroup(viewMenu);     // View > [camera group]    cameraModeGroup->setExclusive(true);     // View > First Person    auto firstPersonAction = cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash(                                   viewMenu, MenuOption::FirstPersonLookAt, 0,                                   true, qApp, SLOT(cameraMenuChanged())));     firstPersonAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup));     // View > Look At    auto lookAtAction = cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash(                                   viewMenu, MenuOption::LookAtCamera, 0,                                   false, qApp, SLOT(cameraMenuChanged())));     lookAtAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup));     // View > Selfie    auto selfieAction = cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash(        viewMenu, MenuOption::SelfieCamera, 0,        false, qApp, SLOT(cameraMenuChanged())));     selfieAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup));     viewMenu->addSeparator();     // View > Center Player In View    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::CenterPlayerInView,        0, true, qApp, SLOT(rotationModeChanged()));     // View > Enter First Person Mode in HMD    addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPersonHMD, 0, true);     //TODO: Remove Navigation menu when these functions are included in GoTo menu    // Navigate menu ----------------------------------    MenuWrapper* navigateMenu = addMenu("Navigate");     // Navigate > LocationBookmarks related menus -- Note: the LocationBookmarks class adds its own submenus here.    auto locationBookmarks = DependencyManager::get<LocationBookmarks>();    locationBookmarks->setupMenus(this, navigateMenu);     // Navigate > Copy Address    auto addressManager = DependencyManager::get<AddressManager>();    addActionToQMenuAndActionHash(navigateMenu, MenuOption::CopyAddress, 0,        addressManager.data(), SLOT(copyAddress()));     // Navigate > Copy Path    addActionToQMenuAndActionHash(navigateMenu, MenuOption::CopyPath, 0,        addressManager.data(), SLOT(copyPath()));     // Navigate > Start-up Location    MenuWrapper* startupLocationMenu = navigateMenu->addMenu(MenuOption::StartUpLocation);    QActionGroup* startupLocationGroup = new QActionGroup(startupLocationMenu);    startupLocationGroup->setExclusive(true);    startupLocationGroup->addAction(addCheckableActionToQMenuAndActionHash(startupLocationMenu, MenuOption::HomeLocation, 0,        false));    startupLocationGroup->addAction(addCheckableActionToQMenuAndActionHash(startupLocationMenu, MenuOption::LastLocation, 0,        true));     // Settings menu ----------------------------------    MenuWrapper* settingsMenu = addMenu("Settings");     // Settings > General...    action = addActionToQMenuAndActionHash(settingsMenu, MenuOption::Preferences, static_cast<int>(Qt::CTRL) | static_cast<int>(Qt::Key_G), nullptr, nullptr);    connect(action, &QAction::triggered, [] {        if (!qApp->getLoginDialogPoppedUp()) {            qApp->showDialog(QString("hifi/dialogs/GeneralPreferencesDialog.qml"),                QString("hifi/tablet/TabletGeneralPreferences.qml"), "GeneralPreferencesDialog");        }    });     // Settings > Controls...    action = addActionToQMenuAndActionHash(settingsMenu, "Controls...");    connect(action, &QAction::triggered, [] {            auto tablet = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system");            auto hmd = DependencyManager::get<HMDScriptingInterface>();            tablet->pushOntoStack("hifi/tablet/ControllerSettings.qml");             if (!hmd->getShouldShowTablet()) {                hmd->toggleShouldShowTablet();            }    });     // Settings > Audio...    action = addActionToQMenuAndActionHash(settingsMenu, "Audio...");    connect(action, &QAction::triggered, [] {        static const QUrl tabletUrl("hifi/audio/Audio.qml");        auto tablet = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system");        auto hmd = DependencyManager::get<HMDScriptingInterface>();        tablet->pushOntoStack(tabletUrl);         if (!hmd->getShouldShowTablet()) {            hmd->toggleShouldShowTablet();        }    });     // Settings > Security...    action = addActionToQMenuAndActionHash(settingsMenu, "Security...");    connect(action, &QAction::triggered, [] {		auto tablet = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system");		auto hmd = DependencyManager::get<HMDScriptingInterface>();		tablet->pushOntoStack("hifi/dialogs/security/Security.qml"); 		if (!hmd->getShouldShowTablet()) {			hmd->toggleShouldShowTablet();		}    });     // Settings > Entity Script / QML Allowlist    action = addActionToQMenuAndActionHash(settingsMenu, "Entity Script / QML Allowlist");    connect(action, &QAction::triggered, [] {        auto tablet = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system");        auto hmd = DependencyManager::get<HMDScriptingInterface>();         tablet->pushOntoStack("hifi/dialogs/security/EntityScriptQMLAllowlist.qml");         if (!hmd->getShouldShowTablet()) {            hmd->toggleShouldShowTablet();        }    });     // Settings > Script Security    action = addActionToQMenuAndActionHash(settingsMenu, MenuOption::ScriptSecurity);    connect(action, &QAction::triggered, [] {        auto tablet = DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system");        auto hmd = DependencyManager::get<HMDScriptingInterface>();         tablet->pushOntoStack("hifi/dialogs/security/ScriptSecurity.qml");         if (!hmd->getShouldShowTablet()) {            hmd->toggleShouldShowTablet();        }    });     // Settings > Developer Menu    addCheckableActionToQMenuAndActionHash(settingsMenu, "Developer Menu", 0, false, this, SLOT(toggleDeveloperMenus()));     // Settings > Ask to Reset Settings    addCheckableActionToQMenuAndActionHash(settingsMenu, MenuOption::AskToResetSettings, 0, false);     // Developer menu ----------------------------------    MenuWrapper* developerMenu = addMenu("Developer", "Developer");     // Developer > Scripting >>>    MenuWrapper* scriptingOptionsMenu = developerMenu->addMenu("Scripting");     // Developer > Scripting > Console...    addActionToQMenuAndActionHash(scriptingOptionsMenu, MenuOption::Console, static_cast<int>(Qt::CTRL | Qt::ALT) | static_cast<int>(Qt::Key_J),                                  DependencyManager::get<StandAloneJSConsole>().data(),                                  SLOT(toggleConsole()),                                  QAction::NoRole,                                  UNSPECIFIED_POSITION);      // Developer > Scripting > API Debugger    action = addActionToQMenuAndActionHash(scriptingOptionsMenu, "API Debugger");    connect(action, &QAction::triggered, [] {        QUrl defaultScriptsLoc = PathUtils::defaultScriptsLocation();        defaultScriptsLoc.setPath(defaultScriptsLoc.path() + "developer/utilities/tools/currentAPI.js");        DependencyManager::get<ScriptEngines>()->loadScript(defaultScriptsLoc.toString());    });     // Developer > Scripting > Entity Script Server Log    auto essLogAction = addActionToQMenuAndActionHash(scriptingOptionsMenu, MenuOption::EntityScriptServerLog, 0,                                                      qApp, SLOT(toggleEntityScriptServerLogDialog()));    {        auto nodeList = DependencyManager::get<NodeList>();        QObject::connect(nodeList.data(), &NodeList::canRezChanged, essLogAction, [essLogAction] {            auto nodeList = DependencyManager::get<NodeList>();            essLogAction->setEnabled(nodeList->getThisNodeCanRez());        });        essLogAction->setEnabled(nodeList->getThisNodeCanRez());    }     // Developer > Scripting > Script Log (HMD friendly)...    addActionToQMenuAndActionHash(scriptingOptionsMenu, "Script Log (HMD friendly)...", Qt::NoButton,                                           qApp, SLOT(showScriptLogs()));     // Developer > Scripting > Verbose Logging    addCheckableActionToQMenuAndActionHash(scriptingOptionsMenu, MenuOption::VerboseLogging, 0, false,                                           qApp, SLOT(updateVerboseLogging()));    // Developer > Scripting > Enable Cachebusting of Script.require   addCheckableActionToQMenuAndActionHash(scriptingOptionsMenu, MenuOption::CachebustRequire, 0, false,                                          qApp, SLOT(setCachebustRequire()));     // Developer > Scripting > Enable Speech Control API#if defined(Q_OS_MAC) || defined(Q_OS_WIN)    auto speechRecognizer = DependencyManager::get<SpeechRecognizer>();    QAction* speechRecognizerAction = addCheckableActionToQMenuAndActionHash(scriptingOptionsMenu, MenuOption::ControlWithSpeech,        static_cast<int>(Qt::CTRL | Qt::SHIFT) | static_cast<int>(Qt::Key_C),        speechRecognizer->getEnabled(),        speechRecognizer.data(),        SLOT(setEnabled(bool)),        UNSPECIFIED_POSITION);    connect(speechRecognizer.data(), SIGNAL(enabledUpdated(bool)), speechRecognizerAction, SLOT(setChecked(bool)));#endif     // Developer > UI >>>    MenuWrapper* uiOptionsMenu = developerMenu->addMenu("UI");     // Developer > UI > Show Overlays    action = addCheckableActionToQMenuAndActionHash(uiOptionsMenu, MenuOption::Overlays, 0, true);     connect(action, &QAction::triggered, [action] {        qApp->getApplicationOverlay().setEnabled(action->isChecked());    });     // Developer > UI > Desktop Tablet Becomes Toolbar    action = addCheckableActionToQMenuAndActionHash(uiOptionsMenu, MenuOption::DesktopTabletToToolbar, 0,                                                    qApp->getDesktopTabletBecomesToolbarSetting());     connect(action, &QAction::triggered, [action] {        qApp->setDesktopTabletBecomesToolbarSetting(action->isChecked());    });      // Developer > UI > HMD Tablet Becomes Toolbar    action = addCheckableActionToQMenuAndActionHash(uiOptionsMenu, MenuOption::HMDTabletToToolbar, 0,                                                    qApp->getHmdTabletBecomesToolbarSetting());    connect(action, &QAction::triggered, [action] {        qApp->setHmdTabletBecomesToolbarSetting(action->isChecked());    });     // Developer > Render >>>    MenuWrapper* renderOptionsMenu = developerMenu->addMenu("Render");     addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::Shadows, 0, RenderScriptingInterface::getInstance()->getShadowsEnabled(),        RenderScriptingInterface::getInstance(), SLOT(setShadowsEnabled(bool)));     addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::AmbientOcclusion, 0, RenderScriptingInterface::getInstance()->getAmbientOcclusionEnabled(),        RenderScriptingInterface::getInstance(), SLOT(setAmbientOcclusionEnabled(bool)));     addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::LocalLights, 0, RenderScriptingInterface::getInstance()->getLocalLightingEnabled(),        RenderScriptingInterface::getInstance(), SLOT(setLocalLightingEnabled(bool)));     addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::WorldAxes);    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::DefaultSkybox, 0, true);     // Developer > Render > Throttle FPS If Not Focus    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::ThrottleFPSIfNotFocus, 0, true);     // Developer > Render > OpenVR threaded submit    addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::OpenVrThreadedSubmit, 0, true);     //const QString  = "Automatic Texture Memory";    //const QString  = "64 MB";    //const QString  = "256 MB";    //const QString  = "512 MB";    //const QString  = "1024 MB";    //const QString  = "2048 MB";     // Developer > Render > Maximum Texture Memory    MenuWrapper* textureMenu = renderOptionsMenu->addMenu(MenuOption::RenderMaxTextureMemory);    QActionGroup* textureGroup = new QActionGroup(textureMenu);    textureGroup->setExclusive(true);    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTextureAutomatic, 0, true));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture4MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture64MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture256MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture512MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture1024MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture2048MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture4096MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture6144MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture8192MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture10240MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture12288MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture16384MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture20480MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture24576MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture28672MB, 0, false));    textureGroup->addAction(addCheckableActionToQMenuAndActionHash(textureMenu, MenuOption::RenderMaxTexture32768MB, 0, false));    connect(textureGroup, &QActionGroup::triggered, [textureGroup] {        auto checked = textureGroup->checkedAction();        auto text = checked->text();        gpu::Context::Size newMaxTextureMemory { 0 };         if (MenuOption::RenderMaxTexture4MB == text) {            newMaxTextureMemory = MB_TO_BYTES(4);        } else if (MenuOption::RenderMaxTexture64MB == text) {            newMaxTextureMemory = MB_TO_BYTES(64);        } else if (MenuOption::RenderMaxTexture256MB == text) {            newMaxTextureMemory = MB_TO_BYTES(256);        } else if (MenuOption::RenderMaxTexture512MB == text) {            newMaxTextureMemory = MB_TO_BYTES(512);        } else if (MenuOption::RenderMaxTexture1024MB == text) {            newMaxTextureMemory = MB_TO_BYTES(1024);        } else if (MenuOption::RenderMaxTexture2048MB == text) {            newMaxTextureMemory = MB_TO_BYTES(2048);        } else if (MenuOption::RenderMaxTexture4096MB == text) {            newMaxTextureMemory = MB_TO_BYTES(4096);        } else if (MenuOption::RenderMaxTexture6144MB == text) {            newMaxTextureMemory = MB_TO_BYTES(6144);        } else if (MenuOption::RenderMaxTexture1024MB == text) {            newMaxTextureMemory = MB_TO_BYTES(8192);        } else if (MenuOption::RenderMaxTexture10240MB == text) {            newMaxTextureMemory = MB_TO_BYTES(10240);        } else if (MenuOption::RenderMaxTexture12288MB == text) {            newMaxTextureMemory = MB_TO_BYTES(12288);        } else if (MenuOption::RenderMaxTexture16384MB == text) {            newMaxTextureMemory = MB_TO_BYTES(16384);        } else if (MenuOption::RenderMaxTexture20480MB == text) {            newMaxTextureMemory = MB_TO_BYTES(20480);        } else if (MenuOption::RenderMaxTexture24576MB == text) {            newMaxTextureMemory = MB_TO_BYTES(24576);        } else if (MenuOption::RenderMaxTexture28672MB == text) {

Lines 1–500 of 942.