From 1da9385fe27d201d61474138f5c8e36ba5466c6d Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 1 Apr 2019 14:35:32 +0400 Subject: [PATCH] Scroll suggestions by dragging. --- .../chat_helpers/emoji_suggestions_widget.cpp | 34 ++++++++++++++++--- .../chat_helpers/emoji_suggestions_widget.h | 3 ++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.cpp b/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.cpp index 08872c9d3..40b183168 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.cpp @@ -56,6 +56,7 @@ void SuggestionsWidget::showWithQuery(const QString &query, bool force) { _toggleAnimated.fire(false); } clearSelection(); + setPressed(-1); _rows = std::move(rows); resizeToRows(); update(); @@ -318,6 +319,9 @@ void SuggestionsWidget::setPressed(int pressed) { } if (_pressed != pressed) { _pressed = pressed; + if (_pressed >= 0) { + _mousePressPosition = QCursor::pos(); + } } } @@ -361,6 +365,24 @@ QPoint SuggestionsWidget::mapToInner(QPoint globalPosition) const { void SuggestionsWidget::mouseMoveEvent(QMouseEvent *e) { const auto globalPosition = e->globalPos(); + if (_dragScrollStart >= 0) { + const auto delta = (_mousePressPosition.x() - globalPosition.x()); + const auto scroll = snap( + _dragScrollStart + (rtl() ? -1 : 1) * delta, + 0, + _scrollMax); + if (_scroll != scroll) { + _scroll = scroll; + update(); + } + return; + } else if ((_pressed >= 0) + && (_scrollMax > 0) + && ((_mousePressPosition - globalPosition).manhattanLength() + >= QApplication::startDragDistance())) { + _dragScrollStart = _scroll; + _mousePressPosition = globalPosition; + } if (inner().contains(mapToInner(globalPosition))) { if (!_lastMousePosition) { _lastMousePosition = globalPosition; @@ -385,23 +407,25 @@ void SuggestionsWidget::selectByMouse(QPoint globalPosition) { void SuggestionsWidget::mousePressEvent(QMouseEvent *e) { selectByMouse(e->globalPos()); - if (_selected >= 0 && _selected < _rows.size()) { + if (_selected >= 0) { setPressed(_selected); } } void SuggestionsWidget::mouseReleaseEvent(QMouseEvent *e) { - if (_pressed >= 0 && _pressed < _rows.size()) { - auto pressed = _pressed; + if (_pressed >= 0) { + const auto pressed = _pressed; setPressed(-1); - if (pressed == _selected) { + if (_dragScrollStart >= 0) { + _dragScrollStart = -1; + } else if (pressed == _selected) { triggerRow(_rows[_selected]); } } } bool SuggestionsWidget::triggerSelectedRow() const { - if (_selected >= 0 && _selected < _rows.size()) { + if (_selected >= 0) { triggerRow(_rows[_selected]); return true; } diff --git a/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.h b/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.h index a9d705a76..aade21e9d 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.h +++ b/Telegram/SourceFiles/chat_helpers/emoji_suggestions_widget.h @@ -78,6 +78,9 @@ private: int _oneWidth = 0; QMargins _padding; + QPoint _mousePressPosition; + int _dragScrollStart = -1; + rpl::event_stream _toggleAnimated; rpl::event_stream _triggered;