summaryrefslogtreecommitdiffstats
path: root/src/webenginequick/ui_delegates_manager.h
blob: 24dde656ca3605ee75ac4e3d9afcd5b5ddea9b7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#ifndef UI_DELEGATES_MANAGER_H
#define UI_DELEGATES_MANAGER_H

#include <QtCore/qcoreapplication.h> // Q_DECLARE_TR_FUNCTIONS
#include <QtCore/qobject.h>
#include <QtCore/qpoint.h>
#include <QtCore/qscopedpointer.h>
#include <QtCore/qsharedpointer.h>
#include <QtCore/qstring.h>
#include <QtCore/qstringlist.h>

// clang-format off
#define FOR_EACH_COMPONENT_TYPE(F, SEPARATOR) \
    F(Menu, menu) SEPARATOR \
    F(MenuItem, menuItem) SEPARATOR \
    F(MenuSeparator, menuSeparator) SEPARATOR \
    F(AlertDialog, alertDialog) SEPARATOR \
    F(ColorDialog, colorDialog) SEPARATOR \
    F(ConfirmDialog, confirmDialog) SEPARATOR \
    F(PromptDialog, promptDialog) SEPARATOR \
    F(FilePicker, filePicker) SEPARATOR \
    F(DirectoryPicker, directoryPicker) SEPARATOR \
    F(AuthenticationDialog, authenticationDialog) SEPARATOR \
    F(ToolTip, toolTip) SEPARATOR \
    F(TouchHandle, touchHandle) SEPARATOR \
    F(TouchSelectionMenu, touchSelectionMenu) SEPARATOR \
    F(AutofillPopup, autofillPopup) SEPARATOR

#define COMMA_SEPARATOR ,
#define SEMICOLON_SEPARATOR ;
#define ENUM_DECLARATION(TYPE, COMPONENT) \
    TYPE
#define MEMBER_DECLARATION(TYPE, COMPONENT) \
    QQmlComponent *COMPONENT##Component
// clang-format on

QT_BEGIN_NAMESPACE
class QEvent;
class QQmlComponent;
class QQmlContext;
class QQmlEngine;
class QQuickItem;
class QQuickWebEngineAction;
class QQuickWebEngineView;
QT_END_NAMESPACE

namespace QtWebEngineCore {
class AuthenticationDialogController;
class AutofillPopupController;
class ColorChooserController;
class FilePickerController;
class JavaScriptDialogController;
class TouchSelectionMenuController;

const char *defaultPropertyName(QObject *obj);

class UIDelegatesManager
{
    Q_DECLARE_TR_FUNCTIONS(UIDelegatesManager)
public:
    enum ComponentType {
        Invalid = -1,
        FOR_EACH_COMPONENT_TYPE(ENUM_DECLARATION, COMMA_SEPARATOR)
        ComponentTypeCount
    };

    UIDelegatesManager(QQuickWebEngineView *);
    virtual ~UIDelegatesManager();

    virtual bool initializeImportDirs(QStringList &dirs, QQmlEngine *engine);
    virtual void addMenuItem(QQuickWebEngineAction *action, QObject *menu,
                             bool checkable = false, bool checked = true);
    void addMenuSeparator(QObject *menu);
    virtual QObject *addMenu(QObject *parentMenu, const QString &title,
                             const QPoint &pos = QPoint());
    QQmlContext *creationContextForComponent(QQmlComponent *);
    void showColorDialog(QSharedPointer<ColorChooserController>);
    void showDialog(QSharedPointer<JavaScriptDialogController>);
    void showDialog(QSharedPointer<AuthenticationDialogController>);
    void showFilePicker(QSharedPointer<FilePickerController>);
    void showDirectoryPicker(QSharedPointer<FilePickerController>);
    virtual void showMenu(QObject *menu);
    void showToolTip(const QString &text);
    QQuickItem *createTouchHandle();
    void showTouchSelectionMenu(TouchSelectionMenuController *, const QRect &, const int spacing);
    void hideTouchSelectionMenu();
    void showAutofillPopup(QtWebEngineCore::AutofillPopupController *controller, QPointF pos,
                           int width, bool autoselectFirstSuggestion);
    void hideAutofillPopup();

private:
    bool ensureComponentLoaded(ComponentType);

    QQuickWebEngineView *m_view;
    QStringList m_importDirs;
    QScopedPointer<QObject> m_toolTip;
    QScopedPointer<QObject> m_touchSelectionMenu;
    QScopedPointer<QObject> m_autofillPopup;

    FOR_EACH_COMPONENT_TYPE(MEMBER_DECLARATION, SEMICOLON_SEPARATOR)

    Q_DISABLE_COPY(UIDelegatesManager)

};

class AutofillPopupEventFilter : public QObject
{
    Q_OBJECT

public:
    AutofillPopupEventFilter(QtWebEngineCore::AutofillPopupController *controller,
                             UIDelegatesManager *manager, QObject *parent)
        : QObject(parent), m_controller(controller), m_manager(manager)
    {
    }

protected:
    bool eventFilter(QObject *object, QEvent *event) override;

private:
    QtWebEngineCore::AutofillPopupController *m_controller;
    UIDelegatesManager *m_manager;
};

} // namespace QtWebEngineCore

#endif // UI_DELEGATES_MANAGER_H