diff --git a/ui/abstract_button.cpp b/ui/abstract_button.cpp index ec0dee0..61eac90 100644 --- a/ui/abstract_button.cpp +++ b/ui/abstract_button.cpp @@ -26,7 +26,9 @@ AbstractButton::AbstractButton(QWidget *parent) : RpWidget(parent) { } void AbstractButton::leaveEventHook(QEvent *e) { - if (_state & StateFlag::Down) return; + if (_state & StateFlag::Down) { + return; + } setOver(false, StateChangeSource::ByHover); return TWidget::leaveEventHook(e); @@ -48,12 +50,13 @@ void AbstractButton::checkIfOver(QPoint localPos) { void AbstractButton::mousePressEvent(QMouseEvent *e) { checkIfOver(e->pos()); - if (_acceptBoth || (e->buttons() & Qt::LeftButton)) { - if ((_state & StateFlag::Over) && !(_state & StateFlag::Down)) { - auto was = _state; - _state |= StateFlag::Down; - onStateChanged(was, StateChangeSource::ByPress); - + if (_state & StateFlag::Over) { + const auto set = setDown( + true, + StateChangeSource::ByPress, + e->modifiers(), + e->button()); + if (set) { e->accept(); } } @@ -68,21 +71,13 @@ void AbstractButton::mouseMoveEvent(QMouseEvent *e) { } void AbstractButton::mouseReleaseEvent(QMouseEvent *e) { - if (_state & StateFlag::Down) { - const auto was = _state; - _state &= ~State(StateFlag::Down); - - const auto weak = MakeWeak(this); - onStateChanged(was, StateChangeSource::ByPress); - if (!weak) { - return; - } - - if (was & StateFlag::Over) { - clicked(e->modifiers(), e->button()); - } else { - setOver(false, StateChangeSource::ByHover); - } + const auto set = setDown( + false, + StateChangeSource::ByPress, + e->modifiers(), + e->button()); + if (set) { + e->accept(); } } @@ -123,6 +118,36 @@ void AbstractButton::setOver(bool over, StateChangeSource source) { updateCursor(); } +bool AbstractButton::setDown( + bool down, + StateChangeSource source, + Qt::KeyboardModifiers modifiers, + Qt::MouseButton button) { + if (down + && !(_state & StateFlag::Down) + && (_acceptBoth || button == Qt::LeftButton)) { + auto was = _state; + _state |= StateFlag::Down; + onStateChanged(was, source); + return true; + } else if (!down && (_state & StateFlag::Down)) { + const auto was = _state; + _state &= ~State(StateFlag::Down); + + const auto weak = MakeWeak(this); + onStateChanged(was, source); + if (weak) { + if (was & StateFlag::Over) { + clicked(modifiers, button); + } else { + setOver(false, source); + } + } + return true; + } + return false; +} + void AbstractButton::updateCursor() { auto pointerCursor = _enablePointerCursor && (_state & StateFlag::Over); setCursor(pointerCursor ? style::cur_pointer : style::cur_default); diff --git a/ui/abstract_button.h b/ui/abstract_button.h index 820224a..2710de9 100644 --- a/ui/abstract_button.h +++ b/ui/abstract_button.h @@ -80,6 +80,11 @@ protected: ByHover = 0x02, }; void setOver(bool over, StateChangeSource source = StateChangeSource::ByUser); + bool setDown( + bool down, + StateChangeSource source, + Qt::KeyboardModifiers modifiers, + Qt::MouseButton button); virtual void onStateChanged(State was, StateChangeSource source) { } diff --git a/ui/platform/ui_platform_window_title.cpp b/ui/platform/ui_platform_window_title.cpp index 7da20ec..9add5af 100644 --- a/ui/platform/ui_platform_window_title.cpp +++ b/ui/platform/ui_platform_window_title.cpp @@ -35,6 +35,22 @@ void RemoveDuplicates(std::vector &v) { } // namespace +class TitleControls::Button final : public IconButton { +public: + using IconButton::IconButton; + + void setOver(bool over) { + IconButton::setOver(over, StateChangeSource::ByPress); + } + void setDown(bool down) { + IconButton::setDown( + down, + StateChangeSource::ByPress, + {}, + Qt::LeftButton); + } +}; + TitleControls::TitleControls( not_null parent, const style::WindowTitle &st, @@ -172,7 +188,47 @@ void TitleControls::raise() { _close->raise(); } -Ui::IconButton *TitleControls::controlWidget(Control control) const { +HitTestResult TitleControls::hitTest(QPoint point) const { + const auto test = [&](const object_ptr