mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-04 02:53:10 +02:00
242 lines
15 KiB
C++
242 lines
15 KiB
C++
//
|
|
// OffscreenUi.h
|
|
// interface/src/entities
|
|
//
|
|
// Created by Bradley Austin Davis on 2015-04-04
|
|
// Copyright 2015 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
|
|
//
|
|
#pragma once
|
|
#ifndef hifi_OffscreenUi_h
|
|
#define hifi_OffscreenUi_h
|
|
|
|
#include <unordered_map>
|
|
#include <functional>
|
|
|
|
#include <QtCore/QVariant>
|
|
#include <QtCore/QQueue>
|
|
#include <QtWidgets/QFileDialog>
|
|
#include <QtWidgets/QMessageBox>
|
|
#include <QtWidgets/QInputDialog>
|
|
|
|
#include <DependencyManager.h>
|
|
|
|
#include "ui/OffscreenQmlSurface.h"
|
|
#include "OffscreenQmlElement.h"
|
|
|
|
class VrMenu;
|
|
|
|
#define OFFSCREEN_VISIBILITY_PROPERTY "shown"
|
|
|
|
class OffscreenUi : public OffscreenQmlSurface, public Dependency {
|
|
Q_OBJECT
|
|
|
|
friend class VrMenu;
|
|
public:
|
|
OffscreenUi();
|
|
virtual void create(QOpenGLContext* context) override;
|
|
void createDesktop(const QUrl& url);
|
|
void show(const QUrl& url, const QString& name, std::function<void(QQmlContext*, QObject*)> f = [](QQmlContext*, QObject*) {});
|
|
void hide(const QString& name);
|
|
bool isVisible(const QString& name);
|
|
void toggle(const QUrl& url, const QString& name, std::function<void(QQmlContext*, QObject*)> f = [](QQmlContext*, QObject*) {});
|
|
bool shouldSwallowShortcut(QEvent* event);
|
|
bool navigationFocused();
|
|
void setNavigationFocused(bool focused);
|
|
void unfocusWindows();
|
|
|
|
|
|
// Setting pinned to true will hide all overlay elements on the desktop that don't have a pinned flag
|
|
void setPinned(bool pinned = true);
|
|
|
|
void togglePinned();
|
|
void setConstrainToolbarToCenterX(bool constrained);
|
|
|
|
bool eventFilter(QObject* originalDestination, QEvent* event) override;
|
|
void addMenuInitializer(std::function<void(VrMenu*)> f);
|
|
QObject* getFlags();
|
|
QQuickItem* getDesktop();
|
|
QQuickItem* getToolWindow();
|
|
QObject* getRootMenu();
|
|
enum Icon {
|
|
ICON_NONE = 0,
|
|
ICON_QUESTION,
|
|
ICON_INFORMATION,
|
|
ICON_WARNING,
|
|
ICON_CRITICAL,
|
|
ICON_PLACEMARK
|
|
};
|
|
|
|
// Message box compatibility
|
|
Q_INVOKABLE QMessageBox::StandardButton messageBox(Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton);
|
|
Q_INVOKABLE void asyncMessageBox(Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton);
|
|
// Must be called from the main thread
|
|
QQuickItem* createMessageBox(Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton);
|
|
// Must be called from the main thread
|
|
Q_INVOKABLE int waitForMessageBoxResult(QQuickItem* messageBox);
|
|
|
|
/// Same design as QMessageBox::critical(), will block, returns result
|
|
static QMessageBox::StandardButton critical(void* ignored, const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
|
|
return critical(title, text, buttons, defaultButton);
|
|
}
|
|
/// Same design as QMessageBox::information(), will block, returns result
|
|
static QMessageBox::StandardButton information(void* ignored, const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
|
|
return information(title, text, buttons, defaultButton);
|
|
}
|
|
static void asyncCritical(void* ignored, const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
|
|
return asyncCritical(title, text, buttons, defaultButton);
|
|
}
|
|
static void asyncInformation(void* ignored, const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
|
|
return asyncInformation(title, text, buttons, defaultButton);
|
|
}
|
|
/// Same design as QMessageBox::question(), will block, returns result
|
|
static QMessageBox::StandardButton question(void* ignored, const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
|
|
return question(title, text, buttons, defaultButton);
|
|
}
|
|
|
|
static void asyncQuestion(void* ignored, const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
|
|
return asyncQuestion(title, text, buttons, defaultButton);
|
|
}
|
|
/// Same design as QMessageBox::warning(), will block, returns result
|
|
static QMessageBox::StandardButton warning(void* ignored, const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
|
|
return warning(title, text, buttons, defaultButton);
|
|
}
|
|
static void asyncWarning(void* ignored, const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
|
|
return asyncWarning(title, text, buttons, defaultButton);
|
|
}
|
|
|
|
static QMessageBox::StandardButton critical(const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
|
|
static QMessageBox::StandardButton information(const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
|
|
static void asyncCritical(const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
|
|
static void asyncInformation(const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
|
|
static QMessageBox::StandardButton question(const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
|
|
static void asyncQuestion (const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
|
|
static QMessageBox::StandardButton warning(const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
|
|
static void asyncWarning(const QString& title, const QString& text,
|
|
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
|
|
|
|
Q_INVOKABLE QString fileOpenDialog(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
Q_INVOKABLE void fileOpenDialogAsync(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
Q_INVOKABLE QString fileSaveDialog(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
Q_INVOKABLE void fileSaveDialogAsync(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
Q_INVOKABLE QString existingDirectoryDialog(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
Q_INVOKABLE void existingDirectoryDialogAsync(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
|
|
Q_INVOKABLE QString assetOpenDialog(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
Q_INVOKABLE void assetOpenDialogAsync(const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
|
|
// Compatibility with QFileDialog::getOpenFileName
|
|
static QString getOpenFileName(void* ignored, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
static void getOpenFileNameAsync(void* ignored, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
|
|
// Compatibility with QFileDialog::getSaveFileName
|
|
static QString getSaveFileName(void* ignored, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
static void getSaveFileNameAsync(void* ignored, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
// Compatibility with QFileDialog::getExistingDirectory
|
|
static QString getExistingDirectory(void* ignored, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
static void getExistingDirectoryAsync(void* ignored, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
|
|
static QString getOpenAssetName(void* ignored, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
static void getOpenAssetNameAsync(void* ignored, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = 0);
|
|
|
|
Q_INVOKABLE QVariant inputDialog(const Icon icon, const QString& title, const QString& label = QString(), const QVariant& current = QVariant());
|
|
Q_INVOKABLE void inputDialogAsync(const Icon icon, const QString& title, const QString& label = QString(), const QVariant& current = QVariant());
|
|
Q_INVOKABLE QVariant customInputDialog(const Icon icon, const QString& title, const QVariantMap& config);
|
|
Q_INVOKABLE void customInputDialogAsync(const Icon icon, const QString& title, const QVariantMap& config);
|
|
QQuickItem* createInputDialog(const Icon icon, const QString& title, const QString& label, const QVariant& current);
|
|
QQuickItem* createCustomInputDialog(const Icon icon, const QString& title, const QVariantMap& config);
|
|
QVariant waitForInputDialogResult(QQuickItem* inputDialog);
|
|
|
|
// Compatibility with QInputDialog::getText
|
|
static QString getText(void* ignored, const QString & title, const QString & label,
|
|
QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), bool * ok = 0,
|
|
Qt::WindowFlags flags = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone) {
|
|
return getText(OffscreenUi::ICON_NONE, title, label, text, ok);
|
|
}
|
|
// Compatibility with QInputDialog::getItem
|
|
static QString getItem(void *ignored, const QString & title, const QString & label, const QStringList & items,
|
|
int current = 0, bool editable = true, bool * ok = 0, Qt::WindowFlags flags = 0,
|
|
Qt::InputMethodHints inputMethodHints = Qt::ImhNone) {
|
|
return getItem(OffscreenUi::ICON_NONE, title, label, items, current, editable, ok);
|
|
}
|
|
|
|
// Compatibility with QInputDialog::getText
|
|
static void getTextAsync(void* ignored, const QString & title, const QString & label,
|
|
QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), bool * ok = 0,
|
|
Qt::WindowFlags flags = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone) {
|
|
return getTextAsync(OffscreenUi::ICON_NONE, title, label, text);
|
|
}
|
|
// Compatibility with QInputDialog::getItem
|
|
static void getItemAsync(void *ignored, const QString & title, const QString & label, const QStringList & items,
|
|
int current = 0, bool editable = true, bool * ok = 0, Qt::WindowFlags flags = 0,
|
|
Qt::InputMethodHints inputMethodHints = Qt::ImhNone) {
|
|
return getItemAsync(OffscreenUi::ICON_NONE, title, label, items, current, editable);
|
|
}
|
|
|
|
static QString getText(const Icon icon, const QString & title, const QString & label, const QString & text = QString(), bool * ok = 0);
|
|
static QString getItem(const Icon icon, const QString & title, const QString & label, const QStringList & items, int current = 0, bool editable = true, bool * ok = 0);
|
|
static QVariant getCustomInfo(const Icon icon, const QString& title, const QVariantMap& config, bool* ok = 0);
|
|
static void getTextAsync(const Icon icon, const QString & title, const QString & label, const QString & text = QString());
|
|
static void getItemAsync(const Icon icon, const QString & title, const QString & label, const QStringList & items, int current = 0, bool editable = true);
|
|
static void getCustomInfoAsync(const Icon icon, const QString& title, const QVariantMap& config);
|
|
|
|
unsigned int getMenuUserDataId() const;
|
|
QList<QObject *> &getModalDialogListeners();
|
|
|
|
signals:
|
|
void showDesktop();
|
|
void response(QMessageBox::StandardButton response);
|
|
void fileDialogResponse(QString response);
|
|
void assetDialogResponse(QString response);
|
|
void inputDialogResponse(QVariant response);
|
|
public slots:
|
|
void removeModalDialog(QObject* modal);
|
|
|
|
private:
|
|
QString fileDialog(const QVariantMap& properties);
|
|
void fileDialogAsync(const QVariantMap &properties);
|
|
QString assetDialog(const QVariantMap& properties);
|
|
void assetDialogAsync(const QVariantMap& properties);
|
|
|
|
QQuickItem* _desktop { nullptr };
|
|
QQuickItem* _toolWindow { nullptr };
|
|
QList<QObject*> _modalDialogListeners;
|
|
std::unordered_map<int, bool> _pressedKeys;
|
|
VrMenu* _vrMenu { nullptr };
|
|
QQueue<std::function<void(VrMenu*)>> _queuedMenuInitializers;
|
|
};
|
|
|
|
#endif
|