// This file is part of Desktop App Toolkit, // a set of libraries for developing nice desktop applications. // // For license and copyright information please follow this link: // https://github.com/desktop-app/legal/blob/master/LEGAL // #pragma once #include "base/unique_qptr.h" #include "ui/rp_widget.h" #include "ui/widgets/menu/menu_common.h" #include namespace Ui { struct ScrollToRequest; } // namespace Ui namespace style { struct Menu; struct MenuSeparator; } // namespace style namespace st { extern const style::Menu &defaultMenu; } // namespace st namespace Ui::Menu { class ItemBase; class RippleAnimation; class Menu : public RpWidget { public: Menu(QWidget *parent, const style::Menu &st = st::defaultMenu); Menu(QWidget *parent, QMenu *menu, const style::Menu &st = st::defaultMenu); ~Menu(); [[nodiscard]] const style::Menu &st() const { return _st; } not_null addAction(base::unique_qptr widget); not_null addAction( const QString &text, Fn callback, const style::icon *icon = nullptr, const style::icon *iconOver = nullptr); not_null addAction( const QString &text, std::unique_ptr submenu, const style::icon *icon = nullptr, const style::icon *iconOver = nullptr); not_null addSeparator( const style::MenuSeparator *st = nullptr); not_null insertAction( int position, base::unique_qptr widget); void clearActions(); void finishAnimating(); bool empty() const; void clearSelection(); void setChildShownAction(QAction *action) { _childShownAction = action; } void setShowSource(TriggeredSource source); void setForceWidth(int forceWidth); const std::vector> &actions() const; void setActivatedCallback(Fn callback) { _activatedCallback = std::move(callback); } void setTriggeredCallback(Fn callback) { _triggeredCallback = std::move(callback); } [[nodiscard]] ItemBase *findSelectedAction() const; void setKeyPressDelegate(Fn delegate) { _keyPressDelegate = std::move(delegate); } void handleKeyPress(not_null e); void setMouseMoveDelegate(Fn delegate) { _mouseMoveDelegate = std::move(delegate); } void handleMouseMove(QPoint globalPosition); void setMousePressDelegate(Fn delegate) { _mousePressDelegate = std::move(delegate); } void handleMousePress(QPoint globalPosition); void setMouseReleaseDelegate(Fn delegate) { _mouseReleaseDelegate = std::move(delegate); } void handleMouseRelease(QPoint globalPosition); [[nodiscard]] rpl::producer<> resizesFromInner() const; [[nodiscard]] rpl::producer scrollToRequests() const; protected: void keyPressEvent(QKeyEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; private: void updateSelected(QPoint globalPosition); void init(); not_null addAction( not_null action, const style::icon *icon = nullptr, const style::icon *iconOver = nullptr); void setSelected(int selected, bool isMouseSelection); void clearMouseSelection(); void itemPressed(TriggeredSource source); void resizeFromInner(int w, int h); const style::Menu &_st; Fn _activatedCallback; Fn _triggeredCallback; Fn _keyPressDelegate; Fn _mouseMoveDelegate; Fn _mousePressDelegate; Fn _mouseReleaseDelegate; QMenu *_wappedMenu = nullptr; std::vector> _actions; std::vector> _actionWidgets; int _forceWidth = 0; bool _lastSelectedByMouse = false; QPointer _childShownAction; rpl::event_stream<> _resizesFromInner; rpl::event_stream _scrollToRequests; }; } // namespace Ui::Menu