1 /*
2     SPDX-FileCopyrightText: 2018 Michail Vourlakos <mvourlakos@gmail.com>
3     SPDX-License-Identifier: GPL-2.0-or-later
4 */
5 
6 #ifndef CONTEXTMENU_H
7 #define CONTEXTMENU_H
8 
9 // Qt
10 #include <QEvent>
11 #include <QMenu>
12 #include <QMetaMethod>
13 #include <QQuickItem>
14 #include <QQuickView>
15 #include <QPointer>
16 #include <QMouseEvent>
17 #include <QObject>
18 
19 namespace Plasma {
20 class Applet;
21 class Containment;
22 }
23 
24 namespace Latte {
25 class View;
26 }
27 
28 namespace Latte {
29 namespace ViewPart {
30 
31 class ContextMenu : public QObject
32 {
33     Q_OBJECT
34 
35 public:
36     ContextMenu(Latte::View *view);
37     ~ContextMenu() override;
38 
39     QMenu *menu();
40 
41     bool mousePressEvent(QMouseEvent *event);
42     bool mousePressEventForContainmentMenu(QQuickView *view, QMouseEvent *event);
43 
44 signals:
45     void menuChanged();
46 
47 private slots:
48     void menuAboutToHide();
49 
50 private:
51     void addAppletActions(QMenu *desktopMenu, Plasma::Applet *applet, QEvent *event);
52     void addContainmentActions(QMenu *desktopMenu, QEvent *event);
53     void updateAppletContainsMethod();
54 
55     QPoint popUpRelevantToParent(const QRect &parentItem, const QRect popUpRect);
56     QPoint popUpRelevantToGlobalPoint(const QRect &parentItem, const QRect popUpRect);
57 
58     QPoint popUpTopLeft(Plasma::Applet *applet, const QRect popUpRect);
59 
60     Plasma::Containment *containmentById(uint id);
61 
62 
63 private:
64     QPointer<QMenu> m_contextMenu;
65     QMetaMethod m_appletContainsMethod;
66     QQuickItem *m_appletContainsMethodItem{nullptr};
67 
68     Latte::View *m_latteView;
69 
70     friend class Latte::View;
71 };
72 
73 }
74 }
75 
76 #endif // DOCKMENUMANAGER_H
77