lib_ui/ui/widgets/menu/menu.h

129 lines
3.4 KiB
C++

// 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 "styles/style_widgets.h"
#include <QtWidgets/QMenu>
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();
not_null<QAction*> addAction(base::unique_qptr<ItemBase> widget);
not_null<QAction*> addAction(
const QString &text,
Fn<void()> callback,
const style::icon *icon = nullptr,
const style::icon *iconOver = nullptr);
not_null<QAction*> addAction(
const QString &text,
std::unique_ptr<QMenu> submenu);
not_null<QAction*> addSeparator();
void clearActions();
void finishAnimating();
bool empty() const;
void clearSelection();
void setChildShown(bool shown) {
_childShown = shown;
}
void setShowSource(TriggeredSource source);
void setForceWidth(int forceWidth);
const std::vector<not_null<QAction*>> &actions() const;
void setActivatedCallback(Fn<void(const CallbackData &data)> callback) {
_activatedCallback = std::move(callback);
}
void setTriggeredCallback(Fn<void(const CallbackData &data)> callback) {
_triggeredCallback = std::move(callback);
}
void setKeyPressDelegate(Fn<bool(int key)> delegate) {
_keyPressDelegate = std::move(delegate);
}
void handleKeyPress(not_null<QKeyEvent*> e);
void setMouseMoveDelegate(Fn<void(QPoint globalPosition)> delegate) {
_mouseMoveDelegate = std::move(delegate);
}
void handleMouseMove(QPoint globalPosition);
void setMousePressDelegate(Fn<void(QPoint globalPosition)> delegate) {
_mousePressDelegate = std::move(delegate);
}
void handleMousePress(QPoint globalPosition);
void setMouseReleaseDelegate(Fn<void(QPoint globalPosition)> delegate) {
_mouseReleaseDelegate = std::move(delegate);
}
void handleMouseRelease(QPoint globalPosition);
rpl::producer<> resizesFromInner() 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<QAction*> addAction(
not_null<QAction*> action,
const style::icon *icon = nullptr,
const style::icon *iconOver = nullptr);
void setSelected(int selected);
void clearMouseSelection();
void itemPressed(TriggeredSource source);
ItemBase *findSelectedAction() const;
void resizeFromInner(int w, int h);
const style::Menu &_st;
Fn<void(const CallbackData &data)> _activatedCallback;
Fn<void(const CallbackData &data)> _triggeredCallback;
Fn<bool(int key)> _keyPressDelegate;
Fn<void(QPoint globalPosition)> _mouseMoveDelegate;
Fn<void(QPoint globalPosition)> _mousePressDelegate;
Fn<void(QPoint globalPosition)> _mouseReleaseDelegate;
QMenu *_wappedMenu = nullptr;
std::vector<not_null<QAction*>> _actions;
std::vector<base::unique_qptr<ItemBase>> _actionWidgets;
int _forceWidth = 0;
bool _mouseSelection = false;
int _selected = -1;
bool _childShown = false;
rpl::event_stream<> _resizesFromInner;
};
} // namespace Ui::Menu