File indexing completed on 2024-04-14 05:24:22

0001 /*
0002     SPDX-FileCopyrightText: 2022 Michail Vourlakos <mvourlakos@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #ifndef CONTEXTMENULAYERQUICKITEM_H
0007 #define CONTEXTMENULAYERQUICKITEM_H
0008 
0009 // Qt
0010 #include <QEvent>
0011 #include <QMenu>
0012 #include <QMetaMethod>
0013 #include <QQuickItem>
0014 #include <QQuickView>
0015 #include <QPointer>
0016 #include <QMouseEvent>
0017 #include <QObject>
0018 
0019 // Plasma
0020 #include <Plasma>
0021 
0022 namespace Plasma {
0023 class Applet;
0024 class Containment;
0025 class Types;
0026 }
0027 
0028 namespace Latte {
0029 class View;
0030 }
0031 
0032 namespace Latte {
0033 
0034 class ContextMenuLayerQuickItem : public QQuickItem
0035 {
0036     Q_OBJECT
0037     Q_PROPERTY(bool menuIsShown READ menuIsShown NOTIFY menuChanged)
0038     Q_PROPERTY(QObject *view READ view WRITE setView NOTIFY viewChanged)
0039 
0040 public:
0041     ContextMenuLayerQuickItem(QQuickItem *parent = nullptr);
0042     ~ContextMenuLayerQuickItem() override;
0043 
0044     QObject *view() const;
0045     void setView(QObject *view);
0046 
0047     bool menuIsShown() const;
0048 
0049 signals:
0050     void menuChanged();
0051     void viewChanged();
0052 
0053 protected:
0054     void mousePressEvent(QMouseEvent *event) override;
0055     void mouseReleaseEvent(QMouseEvent *event) override;
0056 
0057 private slots:
0058     void onMenuAboutToHide();
0059 
0060 private:
0061     void addAppletActions(QMenu *desktopMenu, Plasma::Applet *applet, QEvent *event);
0062     void addContainmentActions(QMenu *desktopMenu, QEvent *event);
0063     void updateAppletContainsMethod();
0064 
0065     QPoint popUpRelevantToParent(const QRect &parentItem, const QRect popUpRect);
0066     QPoint popUpRelevantToGlobalPoint(const QRect &parentItem, const QRect popUpRect);
0067 
0068     QPoint popUpTopLeft(Plasma::Applet *applet, const QRect popUpRect);
0069 
0070     Plasma::Containment *containmentById(uint id);
0071 
0072 
0073 private:
0074     Plasma::Types::ItemStatus m_lastContainmentStatus;
0075 
0076     QPointer<QMenu> m_contextMenu;
0077     QMetaMethod m_appletContainsMethod;
0078     QQuickItem *m_appletContainsMethodItem{nullptr};
0079 
0080     Latte::View *m_latteView{nullptr};
0081 
0082     friend class Latte::View;
0083 };
0084 
0085 }
0086 
0087 #endif // DOCKMENUMANAGER_H