| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- // 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
- //
- #include "ui/widgets/menu/menu_item_base.h"
- namespace Ui::Menu {
- ItemBase::ItemBase(
- not_null<RpWidget*> parent,
- const style::Menu &st)
- : RippleButton(parent, st.ripple) {
- }
- void ItemBase::setSelected(
- bool selected,
- TriggeredSource source) {
- if (selected && !isEnabled()) {
- return;
- }
- if (_selected.current() != selected) {
- setMouseTracking(!selected);
- _lastTriggeredSource = source;
- _selected = selected;
- update();
- }
- }
- bool ItemBase::isSelected() const {
- return _selected.current();
- }
- rpl::producer<CallbackData> ItemBase::selects() const {
- return _selected.changes(
- ) | rpl::map([=](bool selected) -> CallbackData {
- return { action(), y(), _lastTriggeredSource, _index, selected };
- });
- }
- TriggeredSource ItemBase::lastTriggeredSource() const {
- return _lastTriggeredSource;
- }
- int ItemBase::index() const {
- return _index;
- }
- void ItemBase::setIndex(int index) {
- _index = index;
- }
- void ItemBase::setClicked(TriggeredSource source) {
- if (isEnabled()) {
- _lastTriggeredSource = source;
- _clicks.fire({});
- }
- }
- rpl::producer<CallbackData> ItemBase::clicks() const {
- return rpl::merge(
- AbstractButton::clicks() | rpl::to_empty,
- _clicks.events()
- ) | rpl::filter([=] {
- return isEnabled() && !AbstractButton::isDisabled();
- }) | rpl::map([=]() -> CallbackData {
- return { action(), y(), _lastTriggeredSource, _index, true };
- });
- }
- rpl::producer<int> ItemBase::minWidthValue() const {
- return _minWidth.value();
- }
- int ItemBase::minWidth() const {
- return _minWidth.current();
- }
- void ItemBase::initResizeHook(rpl::producer<QSize> &&size) {
- std::move(
- size
- ) | rpl::start_with_next([=](QSize s) {
- resize(s.width(), contentHeight());
- }, lifetime());
- }
- void ItemBase::setMinWidth(int w) {
- _minWidth = w;
- }
- void ItemBase::finishAnimating() {
- RippleButton::finishAnimating();
- }
- void ItemBase::enableMouseSelecting() {
- enableMouseSelecting(this);
- }
- void ItemBase::enableMouseSelecting(not_null<RpWidget*> widget) {
- widget->events(
- ) | rpl::start_with_next([=](not_null<QEvent*> e) {
- const auto type = e->type();
- if (((type == QEvent::Leave)
- || (type == QEvent::Enter)
- || (type == QEvent::MouseMove)) && action()->isEnabled()) {
- setSelected(e->type() != QEvent::Leave);
- } else if ((type == QEvent::MouseButtonRelease)
- && isEnabled()
- && isSelected()) {
- const auto point = mapFromGlobal(QCursor::pos());
- if (!rect().contains(point)) {
- setSelected(false);
- }
- }
- }, lifetime());
- }
- } // namespace Ui::Menu
|