diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp index 9a86cca75..28802c811 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_chat_participants.h" #include "apiwrap.h" #include "base/unixtime.h" +#include "base/qt/qt_key_modifiers.h" #include "boxes/peer_list_box.h" #include "data/components/recent_peers.h" #include "data/components/top_peers.h" @@ -940,6 +941,16 @@ void Suggestions::setupChats() { _topPeerChosen.fire(_controller->session().data().peer(peerId)); }, _topPeers->lifetime()); + _topPeers->pressed() | rpl::start_with_next([=](uint64 peerIdRaw) { + handlePressForChatPreview(PeerId(peerIdRaw), [=] { + _topPeers->cancelPress(); + }); + }, _topPeers->lifetime()); + + _topPeers->pressCancelled() | rpl::start_with_next([=] { + _controller->cancelScheduledPreview(); + }, _topPeers->lifetime()); + _topPeers->showMenuRequests( ) | rpl::start_with_next([=](const ShowTopPeerMenuRequest &request) { const auto weak = Ui::MakeWeak(this); @@ -983,6 +994,24 @@ void Suggestions::setupChats() { _chatsScroll->setVisible(_tab.current() == Tab::Chats); } +void Suggestions::handlePressForChatPreview( + PeerId id, + Fn cancelPress) { + const auto callback = crl::guard(this, [=](bool shown) { + if (shown) { + cancelPress(); + } + }); + const auto row = RowDescriptor( + _controller->session().data().history(id), + FullMsgId()); + if (base::IsAltPressed()) { + _controller->showChatPreview(row, callback); + } else { + _controller->scheduleChatPreview(row, callback); + } +} + void Suggestions::setupChannels() { _myChannelsCount.value() | rpl::start_with_next([=](int count) { _myChannels->toggle(count > 0, anim::type::instant); diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.h b/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.h index 27b9b527f..16e07d15b 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.h @@ -122,6 +122,8 @@ private: void startSlideAnimation(); void finishShow(); + void handlePressForChatPreview(PeerId id, Fn cancelPress); + const not_null _controller; const std::unique_ptr _tabs; diff --git a/Telegram/SourceFiles/dialogs/ui/top_peers_strip.cpp b/Telegram/SourceFiles/dialogs/ui/top_peers_strip.cpp index 40e758ad2..48ec56696 100644 --- a/Telegram/SourceFiles/dialogs/ui/top_peers_strip.cpp +++ b/Telegram/SourceFiles/dialogs/ui/top_peers_strip.cpp @@ -286,6 +286,8 @@ void TopPeersStrip::stripMousePressEvent(QMouseEvent *e) { entry.ripple->add(e->pos() - QPoint( x + st::topPeersMargin.left(), y + st::topPeersMargin.top())); + + _presses.fire_copy(entry.id); } } @@ -304,6 +306,7 @@ void TopPeersStrip::stripMouseMoveEvent(QMouseEvent *e) { if (!_dragging && _mouseDownPosition) { if ((*_lastMousePosition - *_mouseDownPosition).manhattanLength() >= QApplication::startDragDistance()) { + _pressCancelled.fire({}); if (!_expandAnimation.animating()) { _dragging = true; _startDraggingLeft = _scrollLeft; @@ -371,6 +374,8 @@ void TopPeersStrip::subscribeUserpic(Entry &entry) { } void TopPeersStrip::stripMouseReleaseEvent(QMouseEvent *e) { + _pressCancelled.fire({}); + _lastMousePosition = e->globalPos(); const auto guard = gsl::finally([&] { _mouseDownPosition = std::nullopt; @@ -428,6 +433,29 @@ rpl::producer TopPeersStrip::clicks() const { return _clicks.events(); } +rpl::producer TopPeersStrip::pressed() const { + return _presses.events(); +} + +rpl::producer<> TopPeersStrip::pressCancelled() const { + return _pressCancelled.events(); +} + +void TopPeersStrip::cancelPress() { + const auto pressed = std::exchange(_pressed, -1); + if (pressed >= 0) { + Assert(pressed < _entries.size()); + auto &entry = _entries[pressed]; + if (entry.ripple) { + entry.ripple->lastStop(); + } + } + if (finishDragging()) { + return; + } + _mouseDownPosition = std::nullopt; +} + auto TopPeersStrip::showMenuRequests() const -> rpl::producer { return _showMenuRequests.events(); diff --git a/Telegram/SourceFiles/dialogs/ui/top_peers_strip.h b/Telegram/SourceFiles/dialogs/ui/top_peers_strip.h index 23db15d1f..4dddd2890 100644 --- a/Telegram/SourceFiles/dialogs/ui/top_peers_strip.h +++ b/Telegram/SourceFiles/dialogs/ui/top_peers_strip.h @@ -50,6 +50,8 @@ public: [[nodiscard]] bool empty() const; [[nodiscard]] rpl::producer emptyValue() const; [[nodiscard]] rpl::producer clicks() const; + [[nodiscard]] rpl::producer pressed() const; + [[nodiscard]] rpl::producer<> pressCancelled() const; [[nodiscard]] auto showMenuRequests() const -> rpl::producer; [[nodiscard]] auto scrollToRequests() const @@ -61,6 +63,7 @@ public: bool selectByKeyboard(Qt::Key direction); void deselectByKeyboard(); bool chooseRow(); + void cancelPress(); uint64 updateFromParentDrag(QPoint globalPosition); void dragLeft(); @@ -114,6 +117,8 @@ private: rpl::variable _toggleExpanded = nullptr; rpl::event_stream _clicks; + rpl::event_stream _presses; + rpl::event_stream<> _pressCancelled; rpl::event_stream _showMenuRequests; rpl::event_stream> _verticalScrollEvents; diff --git a/Telegram/SourceFiles/window/window_chat_preview.cpp b/Telegram/SourceFiles/window/window_chat_preview.cpp index 24a71c3bc..60ce98bf6 100644 --- a/Telegram/SourceFiles/window/window_chat_preview.cpp +++ b/Telegram/SourceFiles/window/window_chat_preview.cpp @@ -110,7 +110,7 @@ bool ChatPreviewManager::schedule( cancelScheduled(); _menu = nullptr; }); - } else { + } else if (!row.key.history()) { return false; } _scheduled = std::move(row);