From 6c62bbe6fb88eb58cbfc14919191bca0f350799b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 25 Nov 2024 11:25:43 +0300 Subject: [PATCH] Added right button for bots in dialogs list in filtered mode. --- .../dialogs/dialogs_inner_widget.cpp | 87 +++++++++++++------ .../dialogs/dialogs_inner_widget.h | 7 +- 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 363b0dfd6..d5572a026 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -1596,7 +1596,7 @@ void InnerWidget::clearIrrelevantState() { setHashtagPressed(-1); _hashtagDeleteSelected = _hashtagDeletePressed = false; _filteredSelected = -1; - setFilteredPressed(-1, false); + setFilteredPressed(-1, false, false); _peerSearchSelected = -1; setPeerSearchPressed(-1); _previewSelected = -1; @@ -1716,15 +1716,24 @@ void InnerWidget::selectByMouse(QPoint globalPosition) { if (filteredSelected < 0 || filteredSelected >= _filterResults.size()) { filteredSelected = -1; } + const auto mappedY = (filteredSelected >= 0) + ? mouseY - skip - _filterResults[filteredSelected].top + : 0; const auto selectedTopicJump = (filteredSelected >= 0) && _filterResults[filteredSelected].row->lookupIsInTopicJump( local.x(), - mouseY - skip - _filterResults[filteredSelected].top); + mappedY); + const auto selectedBotApp = (filteredSelected >= 0) + && lookupIsInBotAppButton( + _filterResults[filteredSelected].row, + QPoint(local.x(), mappedY)); if (_filteredSelected != filteredSelected - || _selectedTopicJump != selectedTopicJump) { + || _selectedTopicJump != selectedTopicJump + || _selectedBotApp != selectedBotApp) { updateSelectedRow(); _filteredSelected = filteredSelected; _selectedTopicJump = selectedTopicJump; + _selectedBotApp = selectedBotApp; updateSelectedRow(); } } @@ -1813,7 +1822,7 @@ void InnerWidget::mousePressEvent(QMouseEvent *e) { setCollapsedPressed(_collapsedSelected); setHashtagPressed(_hashtagSelected); _hashtagDeletePressed = _hashtagDeleteSelected; - setFilteredPressed(_filteredSelected, _selectedTopicJump); + setFilteredPressed(_filteredSelected, _selectedTopicJump, _selectedBotApp); setPeerSearchPressed(_peerSearchSelected); setPreviewPressed(_previewSelected); setSearchedPressed(_searchedSelected); @@ -1842,21 +1851,7 @@ void InnerWidget::mousePressEvent(QMouseEvent *e) { }; const auto origin = e->pos() - QPoint(0, dialogsOffset() + _pressed->top()); - if (_pressedBotApp && _pressedBotAppData) { - const auto size = _pressedBotAppData->bg.size() - / style::DevicePixelRatio(); - if (!_pressedBotAppData->ripple) { - const auto r = size.height() / 2; - _pressedBotAppData->ripple - = std::make_unique( - st::defaultRippleAnimation, - Ui::RippleAnimation::RoundRectMask(size, r), - updateCallback); - } - const auto shift = QPoint( - width() - size.width() - st::dialogRowOpenBotRight, - st::dialogRowOpenBotTop); - _pressedBotAppData->ripple->add(origin - shift); + if (addBotAppRipple(origin, updateCallback)) { } else if (_pressedTopicJump) { row->addTopicJumpRipple( origin, @@ -1883,7 +1878,8 @@ void InnerWidget::mousePressEvent(QMouseEvent *e) { const auto origin = e->pos() - QPoint(0, filteredOffset() + result.top); const auto updateCallback = [=] { repaintDialogRow(filterId, row); }; - if (_pressedTopicJump) { + if (addBotAppRipple(origin, updateCallback)) { + } else if (_pressedTopicJump) { row->addTopicJumpRipple( origin, _topicJumpCache.get(), @@ -1917,6 +1913,25 @@ void InnerWidget::mousePressEvent(QMouseEvent *e) { } } +bool InnerWidget::addBotAppRipple(QPoint origin, Fn updateCallback) { + if (!(_pressedBotApp && _pressedBotAppData)) { + return false; + } + const auto size = _pressedBotAppData->bg.size() + / style::DevicePixelRatio(); + if (!_pressedBotAppData->ripple) { + _pressedBotAppData->ripple = std::make_unique( + st::defaultRippleAnimation, + Ui::RippleAnimation::RoundRectMask(size, size.height() / 2), + updateCallback); + } + const auto shift = QPoint( + width() - size.width() - st::dialogRowOpenBotRight, + st::dialogRowOpenBotTop); + _pressedBotAppData->ripple->add(origin - shift); + return true; +} + const std::vector &InnerWidget::pinnedChatsOrder() const { const auto owner = &session().data(); return _savedSublists @@ -2197,7 +2212,7 @@ void InnerWidget::mousePressReleased( auto hashtagDeletePressed = _hashtagDeletePressed; _hashtagDeletePressed = false; auto filteredPressed = _filteredPressed; - setFilteredPressed(-1, false); + setFilteredPressed(-1, false, false); auto peerSearchPressed = _peerSearchPressed; setPeerSearchPressed(-1); auto previewPressed = _previewPressed; @@ -2231,8 +2246,11 @@ void InnerWidget::mousePressReleased( && searchedPressed == _searchedSelected) || (pressedMorePosts && pressedMorePosts == _selectedMorePosts)) { - if (pressedBotApp) { - if (const auto user = MaybeBotWithApp(pressed)) { + if (pressedBotApp && (pressed || filteredPressed >= 0)) { + const auto &row = pressed + ? pressed + : _filterResults[filteredPressed].row.get(); + if (const auto user = MaybeBotWithApp(row)) { _openBotMainAppRequests.fire(peerToUser(user->id)); } } else { @@ -2303,15 +2321,32 @@ void InnerWidget::setHashtagPressed(int pressed) { _hashtagPressed = pressed; } -void InnerWidget::setFilteredPressed(int pressed, bool pressedTopicJump) { +void InnerWidget::setFilteredPressed( + int pressed, + bool pressedTopicJump, + bool pressedBotApp) { if (_filteredPressed != pressed - || (pressed >= 0 && _pressedTopicJump != pressedTopicJump)) { + || (pressed >= 0 && _pressedTopicJump != pressedTopicJump) + || (pressed >= 0 && _pressedBotApp != pressedBotApp)) { if (base::in_range(_filteredPressed, 0, _filterResults.size())) { _filterResults[_filteredPressed].row->stopLastRipple(); } + if (_pressedBotAppData && _pressedBotAppData->ripple) { + _pressedBotAppData->ripple->lastStop(); + } _filteredPressed = pressed; - if (pressed >= 0 || !pressedTopicJump) { + if (pressed >= 0 || !pressedTopicJump || !pressedBotApp) { _pressedTopicJump = pressedTopicJump; + _pressedBotApp = pressedBotApp; + if (pressed >= 0 && pressedBotApp) { + const auto &row = _filterResults[pressed].row; + if (const auto history = row->history()) { + const auto it = _rightButtons.find(history->peer->id); + if (it != _rightButtons.end()) { + _pressedBotAppData = &(it->second); + } + } + } const auto history = pressedTopicJump ? _filterResults[pressed].row->history() : nullptr; diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h index a9c9a84b7..56defd4dd 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h @@ -292,7 +292,10 @@ private: void setPressed(Row *pressed, bool pressedTopicJump, bool pressedBotApp); void clearPressed(); void setHashtagPressed(int pressed); - void setFilteredPressed(int pressed, bool pressedTopicJump); + void setFilteredPressed( + int pressed, + bool pressedTopicJump, + bool pressedBotApp); void setPeerSearchPressed(int pressed); void setPreviewPressed(int pressed); void setSearchedPressed(int pressed); @@ -326,6 +329,8 @@ private: void updateRowCornerStatusShown(not_null history); void repaintDialogRowCornerStatus(not_null history); + bool addBotAppRipple(QPoint origin, Fn updateCallback); + void setupShortcuts(); RowDescriptor computeJump( const RowDescriptor &to,