#pragma once #include #include #include #include #include #include #include #include #include "binaryninjaapi.h" #include "action.h" #include "viewframe.h" class BINARYNINJAUIAPI ContextMenuManager { QWidget* m_parent; QPointer m_menu; MenuInstance* m_instance; public: ContextMenuManager(): m_parent(nullptr), m_menu(nullptr), m_instance(nullptr) { } ContextMenuManager(QWidget* parent); ~ContextMenuManager(); QMenu* create(); MenuInstance* show(View* view); MenuInstance* show(Menu* source, UIActionHandler* handler); bool isActive() { return !m_menu.isNull(); } }; class BINARYNINJAUIAPI MenuHelper: public QLabel { Q_OBJECT QPalette::ColorRole m_backgroundRole; QPalette::ColorRole m_foregroundRole; QPalette::ColorRole m_activeForegroundRole; protected: Menu m_menu; ContextMenuManager m_contextMenuManager; QTimer* m_timer; public: MenuHelper() { } MenuHelper(QWidget* parent); void setBackgroundColorRole(QPalette::ColorRole role = QPalette::Highlight); void setForegroundColorRole(QPalette::ColorRole role = QPalette::WindowText); void setActiveForegroundColorRole(QPalette::ColorRole role = QPalette::HighlightedText); Q_SIGNALS: void clicked(); protected Q_SLOTS: virtual void showMenu() = 0; private Q_SLOTS: void underMouseTimerEvent(); protected: void enterEvent(QEvent* event) override; void leaveEvent(QEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; };