diff --git a/ui/toast/toast.h b/ui/toast/toast.h index 4094b7e..2152acc 100644 --- a/ui/toast/toast.h +++ b/ui/toast/toast.h @@ -8,6 +8,7 @@ #include "ui/effects/animations.h" #include "ui/text/text_entity.h" +#include "ui/click_handler.h" namespace Ui { namespace Toast { @@ -17,6 +18,8 @@ class Manager; class Widget; } // namespace internal +using ClickHandlerFilter = Fn; + inline constexpr auto kDefaultDuration = crl::time(1500); struct Config { TextWithEntities text; @@ -26,6 +29,7 @@ struct Config { int maxWidth = 0; int maxLines = 16; bool multiline = false; + ClickHandlerFilter filter; }; void SetDefaultParent(not_null parent); void Show(not_null parent, const Config &config); diff --git a/ui/toast/toast_widget.cpp b/ui/toast/toast_widget.cpp index 5181cf8..b88c72a 100644 --- a/ui/toast/toast_widget.cpp +++ b/ui/toast/toast_widget.cpp @@ -24,7 +24,8 @@ Widget::Widget(QWidget *parent, const Config &config) , _maxTextWidth(widthWithoutPadding(_maxWidth)) , _maxTextHeight( st::toastTextStyle.font->height * (_multiline ? config.maxLines : 1)) -, _text(_multiline ? widthWithoutPadding(config.minWidth) : QFIXED_MAX) { +, _text(_multiline ? widthWithoutPadding(config.minWidth) : QFIXED_MAX) +, _clickHandlerFilter(config.filter) { const auto toastOptions = TextParseOptions{ TextParseMultiline, _maxTextWidth, @@ -116,11 +117,14 @@ void Widget::mouseReleaseEvent(QMouseEvent *e) { return; } if (const auto handler = ClickHandler::unpressed()) { - handler->onClick({ e->button() }); + const auto button = e->button(); + if (!_clickHandlerFilter + || _clickHandlerFilter(handler, button)) { + ActivateClickHandler(this, handler, button); + } } } - } // namespace internal } // namespace Toast } // namespace Ui diff --git a/ui/toast/toast_widget.h b/ui/toast/toast_widget.h index a29d274..02c9276 100644 --- a/ui/toast/toast_widget.h +++ b/ui/toast/toast_widget.h @@ -49,6 +49,8 @@ private: int _textWidth = 0; Text::String _text; + ClickHandlerFilter _clickHandlerFilter; + }; } // namespace internal