12 #ifndef hifi_OffscreenUi_h
13 #define hifi_OffscreenUi_h
15 #include <unordered_map>
18 #include <QtCore/QVariant>
19 #include <QtCore/QQueue>
20 #include <QtWidgets/QFileDialog>
21 #include <QtWidgets/QMessageBox>
22 #include <QtWidgets/QInputDialog>
24 #include <DependencyManager.h>
26 #include "ui/OffscreenQmlSurface.h"
27 #include "OffscreenQmlElement.h"
31 #define OFFSCREEN_VISIBILITY_PROPERTY "shown"
33 class ModalDialogListener :
public QObject {
35 friend class OffscreenUi;
38 QQuickItem* getDialogItem() {
return _dialog; };
41 ModalDialogListener(QQuickItem* dialog);
42 virtual ~ModalDialogListener();
43 virtual QVariant waitForResult();
46 void response(
const QVariant& value);
49 virtual void onDestroyed();
53 bool _finished {
false };
57 class OffscreenUi :
public OffscreenQmlSurface,
public Dependency {
63 void createDesktop(
const QUrl& url);
64 void show(
const QUrl& url,
const QString& name, std::function<
void(QQmlContext*, QObject*)> f = [](QQmlContext*, QObject*) {});
65 void hide(
const QString& name);
66 void hideDesktopWindows();
67 bool isVisible(
const QString& name);
68 void toggle(
const QUrl& url,
const QString& name, std::function<
void(QQmlContext*, QObject*)> f = [](QQmlContext*, QObject*) {});
69 bool shouldSwallowShortcut(QEvent* event);
70 bool navigationFocused();
71 void setNavigationFocused(
bool focused);
72 void unfocusWindows();
76 void setPinned(
bool pinned =
true);
79 void setConstrainToolbarToCenterX(
bool constrained);
81 bool eventFilter(QObject* originalDestination, QEvent* event)
override;
82 void addMenuInitializer(std::function<
void(VrMenu*)> f);
84 Q_INVOKABLE
bool isPointOnDesktopWindow(QVariant point);
85 QQuickItem* getDesktop();
86 QObject* getRootMenu();
97 Q_INVOKABLE QMessageBox::StandardButton messageBox(Icon icon,
const QString& title,
const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton);
98 Q_INVOKABLE ModalDialogListener* asyncMessageBox(Icon icon,
const QString& title,
const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton);
100 QQuickItem* createMessageBox(Icon icon,
const QString& title,
const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton);
102 Q_INVOKABLE
int waitForMessageBoxResult(QQuickItem* messageBox);
105 static QMessageBox::StandardButton critical(
void* ignored,
const QString& title,
const QString& text,
106 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
107 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
108 return critical(title, text, buttons, defaultButton);
111 static QMessageBox::StandardButton information(
void* ignored,
const QString& title,
const QString& text,
112 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
113 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
114 return information(title, text, buttons, defaultButton);
116 static ModalDialogListener* asyncCritical(
void* ignored,
const QString& title,
const QString& text,
117 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
118 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
119 return asyncCritical(title, text, buttons, defaultButton);
121 static ModalDialogListener* asyncInformation(
void* ignored,
const QString& title,
const QString& text,
122 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
123 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
124 return asyncInformation(title, text, buttons, defaultButton);
127 static QMessageBox::StandardButton question(
void* ignored,
const QString& title,
const QString& text,
128 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No,
129 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
130 return question(title, text, buttons, defaultButton);
133 static ModalDialogListener* asyncQuestion(
void* ignored,
const QString& title,
const QString& text,
134 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No,
135 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
136 return asyncQuestion(title, text, buttons, defaultButton);
139 static QMessageBox::StandardButton warning(
void* ignored,
const QString& title,
const QString& text,
140 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
141 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
142 return warning(title, text, buttons, defaultButton);
144 static ModalDialogListener* asyncWarning(
void* ignored,
const QString& title,
const QString& text,
145 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
146 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton) {
147 return asyncWarning(title, text, buttons, defaultButton);
150 static QMessageBox::StandardButton critical(
const QString& title,
const QString& text,
151 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
152 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
153 static QMessageBox::StandardButton information(
const QString& title,
const QString& text,
154 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
155 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
156 static ModalDialogListener* asyncCritical(
const QString& title,
const QString& text,
157 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
158 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
159 static ModalDialogListener *asyncInformation(
const QString& title,
const QString& text,
160 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
161 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
162 static QMessageBox::StandardButton question(
const QString& title,
const QString& text,
163 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No,
164 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
165 static ModalDialogListener* asyncQuestion (
const QString& title,
const QString& text,
166 QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No,
167 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
168 static QMessageBox::StandardButton warning(
const QString& title,
const QString& text,
169 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
170 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
171 static ModalDialogListener *asyncWarning(
const QString& title,
const QString& text,
172 QMessageBox::StandardButtons buttons = QMessageBox::Ok,
173 QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
175 Q_INVOKABLE QString fileOpenDialog(
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
176 Q_INVOKABLE ModalDialogListener* fileOpenDialogAsync(
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
178 Q_INVOKABLE QString fileSaveDialog(
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
179 Q_INVOKABLE ModalDialogListener* fileSaveDialogAsync(
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
181 Q_INVOKABLE QString existingDirectoryDialog(
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
182 Q_INVOKABLE ModalDialogListener* existingDirectoryDialogAsync(
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
184 Q_INVOKABLE QString assetOpenDialog(
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
185 Q_INVOKABLE ModalDialogListener* assetOpenDialogAsync(
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
188 static QString getOpenFileName(
void* ignored,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
189 static ModalDialogListener* getOpenFileNameAsync(
void* ignored,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
192 static QString getSaveFileName(
void* ignored,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
193 static ModalDialogListener* getSaveFileNameAsync(
void* ignored,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
195 static QString getExistingDirectory(
void* ignored,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
196 static ModalDialogListener* getExistingDirectoryAsync(
void* ignored,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
198 static QString getOpenAssetName(
void* ignored,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
199 static ModalDialogListener* getOpenAssetNameAsync(
void* ignored,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(), QString *selectedFilter = 0, QFileDialog::Options options = QFileDialog::Options());
201 Q_INVOKABLE QVariant inputDialog(
const Icon icon,
const QString& title,
const QString& label = QString(),
const QVariant& current = QVariant());
202 Q_INVOKABLE ModalDialogListener* inputDialogAsync(
const Icon icon,
const QString& title,
const QString& label = QString(),
const QVariant& current = QVariant());
203 Q_INVOKABLE QVariant customInputDialog(
const Icon icon,
const QString& title,
const QVariantMap& config);
204 Q_INVOKABLE ModalDialogListener* customInputDialogAsync(
const Icon icon,
const QString& title,
const QVariantMap& config);
205 QQuickItem* createInputDialog(
const Icon icon,
const QString& title,
const QString& label,
const QVariant& current);
206 QQuickItem* createCustomInputDialog(
const Icon icon,
const QString& title,
const QVariantMap& config);
207 QVariant waitForInputDialogResult(QQuickItem* inputDialog);
210 static QString getText(
void* ignored,
const QString & title,
const QString & label,
211 QLineEdit::EchoMode mode = QLineEdit::Normal,
const QString & text = QString(),
bool * ok = 0,
212 Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone) {
213 return getText(OffscreenUi::ICON_NONE, title, label, text, ok);
216 static QString getItem(
void *ignored,
const QString & title,
const QString & label,
const QStringList & items,
217 int current = 0,
bool editable =
true,
bool * ok = 0, Qt::WindowFlags flags = Qt::WindowFlags(),
218 Qt::InputMethodHints inputMethodHints = Qt::ImhNone) {
219 return getItem(OffscreenUi::ICON_NONE, title, label, items, current, editable, ok);
223 static ModalDialogListener* getTextAsync(
void* ignored,
const QString & title,
const QString & label,
224 QLineEdit::EchoMode mode = QLineEdit::Normal,
const QString & text = QString(),
bool * ok = 0,
225 Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone) {
226 return getTextAsync(OffscreenUi::ICON_NONE, title, label, text);
229 static ModalDialogListener* getItemAsync(
void *ignored,
const QString & title,
const QString & label,
const QStringList & items,
230 int current = 0,
bool editable =
true,
bool * ok = 0, Qt::WindowFlags flags = Qt::WindowFlags(),
231 Qt::InputMethodHints inputMethodHints = Qt::ImhNone) {
232 return getItemAsync(OffscreenUi::ICON_NONE, title, label, items, current, editable);
235 static QString getText(
const Icon icon,
const QString & title,
const QString & label,
const QString & text = QString(),
bool * ok = 0);
236 static QString getItem(
const Icon icon,
const QString & title,
const QString & label,
const QStringList & items,
int current = 0,
bool editable =
true,
bool * ok = 0);
237 static ModalDialogListener* getTextAsync(
const Icon icon,
const QString & title,
const QString & label,
const QString & text = QString());
238 static ModalDialogListener* getItemAsync(
const Icon icon,
const QString & title,
const QString & label,
const QStringList & items,
int current = 0,
bool editable =
true);
240 QList<QObject *> &getModalDialogListeners();
249 void keyboardFocusActive();
252 void removeModalDialog(QObject* modal);
260 void onRootContextCreated(QQmlContext* qmlContext)
override;
263 QString fileDialog(
const QVariantMap& properties);
264 ModalDialogListener *fileDialogAsync(
const QVariantMap &properties);
265 QString assetDialog(
const QVariantMap& properties);
266 ModalDialogListener* assetDialogAsync(
const QVariantMap& properties);
268 QQuickItem* _desktop {
nullptr };
269 QList<QObject*> _modalDialogListeners;
270 std::unordered_map<int, bool> _pressedKeys;
271 VrMenu* _vrMenu {
nullptr };
272 QQueue<std::function<void(VrMenu*)>> _queuedMenuInitializers;
Represents a 2D or 3D pointer to the scripting engine. Exposed as PointerEvent
Definition: PointerEvent.h:30