Overte C++ Documentation
OffscreenUi.h
1 //
2 // OffscreenUi.h
3 // interface/src/entities
4 //
5 // Created by Bradley Austin Davis on 2015-04-04
6 // Copyright 2015 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 #pragma once
12 #ifndef hifi_OffscreenUi_h
13 #define hifi_OffscreenUi_h
14 
15 #include <unordered_map>
16 #include <functional>
17 
18 #include <QtCore/QVariant>
19 #include <QtCore/QQueue>
20 #include <QtWidgets/QFileDialog>
21 #include <QtWidgets/QMessageBox>
22 #include <QtWidgets/QInputDialog>
23 
24 #include <DependencyManager.h>
25 
26 #include "ui/OffscreenQmlSurface.h"
27 #include "OffscreenQmlElement.h"
28 
29 class VrMenu;
30 
31 #define OFFSCREEN_VISIBILITY_PROPERTY "shown"
32 
33 class ModalDialogListener : public QObject {
34  Q_OBJECT
35  friend class OffscreenUi;
36 
37 public:
38  QQuickItem* getDialogItem() { return _dialog; };
39 
40 protected:
41  ModalDialogListener(QQuickItem* dialog);
42  virtual ~ModalDialogListener();
43  virtual QVariant waitForResult();
44 
45 signals:
46  void response(const QVariant& value);
47 
48 protected slots:
49  virtual void onDestroyed();
50 
51 protected:
52  QQuickItem* _dialog;
53  bool _finished { false };
54  QVariant _result;
55 };
56 
57 class OffscreenUi : public OffscreenQmlSurface, public Dependency {
58  Q_OBJECT
59 
60  friend class VrMenu;
61 public:
62  OffscreenUi();
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();
73 
74 
75  // Setting pinned to true will hide all overlay elements on the desktop that don't have a pinned flag
76  void setPinned(bool pinned = true);
77 
78  void togglePinned();
79  void setConstrainToolbarToCenterX(bool constrained);
80 
81  bool eventFilter(QObject* originalDestination, QEvent* event) override;
82  void addMenuInitializer(std::function<void(VrMenu*)> f);
83  QObject* getFlags();
84  Q_INVOKABLE bool isPointOnDesktopWindow(QVariant point);
85  QQuickItem* getDesktop();
86  QObject* getRootMenu();
87  enum Icon {
88  ICON_NONE = 0,
89  ICON_QUESTION,
90  ICON_INFORMATION,
91  ICON_WARNING,
92  ICON_CRITICAL,
93  ICON_PLACEMARK
94  };
95 
96  // Message box compatibility
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);
99  // Must be called from the main thread
100  QQuickItem* createMessageBox(Icon icon, const QString& title, const QString& text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton);
101  // Must be called from the main thread
102  Q_INVOKABLE int waitForMessageBoxResult(QQuickItem* messageBox);
103 
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);
109  }
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);
115  }
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);
120  }
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);
125  }
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);
131  }
132 
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);
137  }
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);
143  }
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);
148  }
149 
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);
174 
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());
177 
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());
180 
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());
183 
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());
186 
187  // Compatibility with QFileDialog::getOpenFileName
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());
190 
191  // Compatibility with QFileDialog::getSaveFileName
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());
194  // Compatibility with QFileDialog::getExistingDirectory
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());
197 
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());
200 
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);
208 
209  // Compatibility with QInputDialog::getText
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);
214  }
215  // Compatibility with QInputDialog::getItem
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);
220  }
221 
222  // Compatibility with QInputDialog::getText
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);
227  }
228  // Compatibility with QInputDialog::getItem
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);
233  }
234 
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);
239 
240  QList<QObject *> &getModalDialogListeners();
241 
242 signals:
243  void showDesktop();
244 // void response(QMessageBox::StandardButton response);
245 // void fileDialogResponse(QString response);
246 // void assetDialogResponse(QString response);
247 // void inputDialogResponse(QVariant response);
248  void desktopReady();
249  void keyboardFocusActive();
250 
251 public slots:
252  void removeModalDialog(QObject* modal);
253 
254 private slots:
255  void hoverBeginEvent(const PointerEvent& event);
256  void hoverEndEvent(const PointerEvent& event);
257  void handlePointerEvent(const PointerEvent& event);
258 
259 protected:
260  void onRootContextCreated(QQmlContext* qmlContext) override;
261 
262 private:
263  QString fileDialog(const QVariantMap& properties);
264  ModalDialogListener *fileDialogAsync(const QVariantMap &properties);
265  QString assetDialog(const QVariantMap& properties);
266  ModalDialogListener* assetDialogAsync(const QVariantMap& properties);
267 
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;
273 };
274 
275 #endif
Represents a 2D or 3D pointer to the scripting engine. Exposed as PointerEvent
Definition: PointerEvent.h:30