196 lines · 6.2 KB · C++
RawDownload
#include "PluginContainerProxy.h" #include <QtGui/QScreen>#include <QtGui/QWindow> #include <plugins/Plugin.h>#include <plugins/PluginManager.h>#include <display-plugins/DisplayPlugin.h>#include <DependencyManager.h>#include <FramebufferCache.h> #include "Application.h"#include "MainWindow.h"#include "GLCanvas.h"#include "ui/DialogsManager.h" #include <gl/OffscreenGLCanvas.h>#include <QtGui/QOpenGLContext> PluginContainerProxy::PluginContainerProxy() {} PluginContainerProxy::~PluginContainerProxy() {} bool PluginContainerProxy::isForeground() {    return qApp->isForeground() && !qApp->getWindow()->isMinimized();} void PluginContainerProxy::addMenu(const QString& menuName) {    Menu::getInstance()->addMenu(menuName);} void PluginContainerProxy::removeMenu(const QString& menuName) {    Menu::getInstance()->removeMenu(menuName);} QAction* PluginContainerProxy::addMenuItem(PluginType type, const QString& path, const QString& name, std::function<void(bool)> onClicked, bool checkable, bool checked, const QString& groupName) {    auto menu = Menu::getInstance();    MenuWrapper* parentItem = menu->getMenu(path);    QAction* action = menu->addActionToQMenuAndActionHash(parentItem, name);    if (!groupName.isEmpty()) {        QActionGroup* group{ nullptr };        if (!_exclusiveGroups.count(groupName)) {            group = _exclusiveGroups[groupName] = new QActionGroup(menu);            group->setExclusive(true);        } else {            group = _exclusiveGroups[groupName];        }        group->addAction(action);    }    connect(action, &QAction::triggered, [=] {        onClicked(action->isChecked());    });    action->setCheckable(checkable);    action->setChecked(checked);    if (type == PluginType::DISPLAY_PLUGIN) {        _currentDisplayPluginActions.push_back({ path, name });    } else {        _currentInputPluginActions.push_back({ path, name });    }    return action;} void PluginContainerProxy::removeMenuItem(const QString& menuName, const QString& menuItem) {    Menu::getInstance()->removeMenuItem(menuName, menuItem);} bool PluginContainerProxy::isOptionChecked(const QString& name) {    return Menu::getInstance()->isOptionChecked(name);} void PluginContainerProxy::setIsOptionChecked(const QString& path, bool checked) {    Menu::getInstance()->setIsOptionChecked(path, checked);} // FIXME there is a bug in the fullscreen setting, where leaving// fullscreen does not restore the window frame, making it difficult// or impossible to move or size the window.// Additionally, setting fullscreen isn't hiding the menu on windows// make it useless for stereoscopic modes.void PluginContainerProxy::setFullscreen(const QScreen* target, bool hideMenu) {    auto _window = qApp->getWindow();    if (!_window->isFullScreen()) {        _savedGeometry = _window->geometry();    }    if (nullptr == target) {        // FIXME target the screen where the window currently is        target = qApp->primaryScreen();    }     _window->setGeometry(target->availableGeometry());    _window->windowHandle()->setScreen((QScreen*)target);    _window->showFullScreen(); #ifndef Q_OS_MAC    // also hide the QMainWindow's menuBar    QMenuBar* menuBar = _window->menuBar();    if (menuBar && hideMenu) {        menuBar->setVisible(false);    }#endif} void PluginContainerProxy::unsetFullscreen(const QScreen* avoid) {    auto _window = qApp->getWindow();    _window->showNormal();     QRect targetGeometry = _savedGeometry;    if (avoid != nullptr) {        QRect avoidGeometry = avoid->geometry();        if (avoidGeometry.contains(targetGeometry.topLeft())) {            QScreen* newTarget = qApp->primaryScreen();            if (newTarget == avoid) {                foreach(auto screen, qApp->screens()) {                    if (screen != avoid) {                        newTarget = screen;                        break;                    }                }            }            targetGeometry = newTarget->availableGeometry();        }    }#ifdef Q_OS_MAC    QTimer* timer = new QTimer();    timer->singleShot(2000, [=] {        _window->setGeometry(targetGeometry);        timer->deleteLater();    });#else    _window->setGeometry(targetGeometry);#endif #ifndef Q_OS_MAC    // also show the QMainWindow's menuBar    QMenuBar* menuBar = _window->menuBar();    if (menuBar) {        menuBar->setVisible(true);    }#endif} void PluginContainerProxy::requestReset() {    // We could signal qApp to sequence this, but it turns out that requestReset is only used from within the main thread anyway.    qApp->resetSensors(true);} void PluginContainerProxy::showDisplayPluginsTools() {    DependencyManager::get<DialogsManager>()->hmdTools(true);} GLWidget* PluginContainerProxy::getPrimaryWidget() {    return qApp->_glWidget;} QWindow* PluginContainerProxy::getPrimaryWindow() {    return qApp->_glWidget->windowHandle();} QOpenGLContext* PluginContainerProxy::getPrimaryContext() {    return qApp->_glWidget->context()->contextHandle();} const DisplayPlugin* PluginContainerProxy::getActiveDisplayPlugin() const {    return qApp->getActiveDisplayPlugin();} bool PluginContainerProxy::makeRenderingContextCurrent() {    return qApp->_offscreenContext->makeCurrent();} void PluginContainerProxy::releaseSceneTexture(uint32_t texture) {    Q_ASSERT(QThread::currentThread() == qApp->thread());    auto& framebufferMap = qApp->_lockedFramebufferMap;    Q_ASSERT(framebufferMap.contains(texture));    auto framebufferPointer = framebufferMap[texture];    framebufferMap.remove(texture);    auto framebufferCache = DependencyManager::get<FramebufferCache>();    framebufferCache->releaseFramebuffer(framebufferPointer);} void PluginContainerProxy::releaseOverlayTexture(uint32_t texture) {    // FIXME implement present thread compositing} /// settings interfacebool PluginContainerProxy::getBoolSetting(const QString& settingName, bool defaultValue) {    Setting::Handle<bool> settingValue(settingName, defaultValue);    return settingValue.get();} void PluginContainerProxy::setBoolSetting(const QString& settingName, bool value) {    Setting::Handle<bool> settingValue(settingName, value);    return settingValue.set(value);}