Replaced single QuickActionContext in dialogs widget with flat map.

This commit is contained in:
23rd 2025-03-18 11:33:56 +03:00
parent a21eb9d59e
commit 418dcedc4e
6 changed files with 75 additions and 44 deletions

View file

@ -810,7 +810,6 @@ void InnerWidget::paintEvent(QPaintEvent *e) {
const auto ms = crl::now(); const auto ms = crl::now();
const auto childListShown = _childListShown.current(); const auto childListShown = _childListShown.current();
auto context = Ui::PaintContext{ auto context = Ui::PaintContext{
.quickActionContext = _quickActionContext,
.st = _st, .st = _st,
.topicJumpCache = _topicJumpCache.get(), .topicJumpCache = _topicJumpCache.get(),
.folder = _openedFolder, .folder = _openedFolder,
@ -839,6 +838,12 @@ void InnerWidget::paintEvent(QPaintEvent *e) {
const auto expanding = forum const auto expanding = forum
&& (key.history()->peer->id == childListShown.peerId); && (key.history()->peer->id == childListShown.peerId);
context.rightButton = maybeCacheRightButton(row); context.rightButton = maybeCacheRightButton(row);
if (key.history()) {
const auto it = _quickActions.find(key.history()->peer->id.value);
if (it != _quickActions.end()) {
context.quickActionContext = it->second.get();
}
}
context.st = (forum ? &st::forumDialogRow : _st.get()); context.st = (forum ? &st::forumDialogRow : _st.get());
@ -4995,24 +5000,43 @@ rpl::producer<UserId> InnerWidget::openBotMainAppRequests() const {
return _openBotMainAppRequests.events(); return _openBotMainAppRequests.events();
} }
void InnerWidget::setSwipeContextData(Ui::Controls::SwipeContextData data) { void InnerWidget::setSwipeContextData(
_quickActionContext.data = std::move(data); int64 key,
if (_quickActionContext.data.msgBareId) { std::optional<Ui::Controls::SwipeContextData> data) {
if (!key) {
return;
}
if (!data) {
_quickActions.remove(key);
return;
}
const auto it = _quickActions.find(key);
auto context = (Ui::QuickActionContext*)(nullptr);
if (it == _quickActions.end()) {
context = _quickActions.emplace(
key,
std::make_unique<Ui::QuickActionContext>()).first->second.get();
} else {
context = it->second.get();
}
context->data = base::take(*data);
if (context->data.msgBareId) {
constexpr auto kStartAnimateThreshold = 0.32; constexpr auto kStartAnimateThreshold = 0.32;
constexpr auto kResetAnimateThreshold = 0.24; constexpr auto kResetAnimateThreshold = 0.24;
if (_quickActionContext.data.ratio > kStartAnimateThreshold) { if (context->data.ratio > kStartAnimateThreshold) {
if (_quickActionContext.icon if (context->icon
&& !_quickActionContext.icon->frameIndex() && !context->icon->frameIndex()
&& !_quickActionContext.icon->animating()) { && !context->icon->animating()) {
_quickActionContext.icon->animate( context->icon->animate(
[=] { update(); }, [=] { update(); },
0, 0,
_quickActionContext.icon->framesCount()); context->icon->framesCount());
} }
} else if (_quickActionContext.data.ratio < kResetAnimateThreshold) { } else if (context->data.ratio < kResetAnimateThreshold) {
if (_quickActionContext.icon if (context->icon
&& _quickActionContext.icon->frameIndex()) { && context->icon->frameIndex()) {
_quickActionContext.icon->jumpTo(0, [=] { update(); }); context->icon->jumpTo(0, [=] { update(); });
} }
} }
update(); update();
@ -5038,23 +5062,25 @@ int64 InnerWidget::calcSwipeKey(int top) {
void InnerWidget::prepareQuickAction( void InnerWidget::prepareQuickAction(
int64 key, int64 key,
Dialogs::Ui::QuickDialogAction action) { Dialogs::Ui::QuickDialogAction action) {
if (key) { Expects(key != 0);
const auto peer = session().data().peer(PeerId(key));
auto name = ResolveQuickDialogLottieIconName(peer, action, _filterId); const auto it = _quickActions.find(key);
_quickActionLottieIcon = Lottie::MakeIcon({ auto context = (Ui::QuickActionContext*)(nullptr);
.name = std::move(name), if (it == _quickActions.end()) {
.sizeOverride = Size(st::dialogsQuickActionSize), context = _quickActions.emplace(
}); key,
_quickActionContext.icon = _quickActionLottieIcon.get(); std::make_unique<Ui::QuickActionContext>()).first->second.get();
_quickActionContext.action = action;
} else { } else {
if (_quickActionContext.icon) { context = it->second.get();
_quickActionContext = {};
}
if (_quickActionLottieIcon) {
_quickActionLottieIcon.reset();
}
} }
const auto peer = session().data().peer(PeerId(key));
auto name = ResolveQuickDialogLottieIconName(peer, action, _filterId);
context->icon = Lottie::MakeIcon({
.name = std::move(name),
.sizeOverride = Size(st::dialogsSwipeActionSize),
});
context->action = action;
} }
} // namespace Dialogs } // namespace Dialogs

View file

@ -216,7 +216,9 @@ public:
[[nodiscard]] rpl::producer<UserId> openBotMainAppRequests() const; [[nodiscard]] rpl::producer<UserId> openBotMainAppRequests() const;
void setSwipeContextData(Ui::Controls::SwipeContextData data); void setSwipeContextData(
int64 key,
std::optional<Ui::Controls::SwipeContextData> data);
[[nodiscard]] int64 calcSwipeKey(int top); [[nodiscard]] int64 calcSwipeKey(int top);
void prepareQuickAction(int64 key, Dialogs::Ui::QuickDialogAction); void prepareQuickAction(int64 key, Dialogs::Ui::QuickDialogAction);
@ -480,6 +482,8 @@ private:
void saveChatsFilterScrollState(FilterId filterId); void saveChatsFilterScrollState(FilterId filterId);
void restoreChatsFilterScrollState(FilterId filterId); void restoreChatsFilterScrollState(FilterId filterId);
[[nodiscard]] Ui::QuickActionContext *ensureQuickAction(int64 key);
[[nodiscard]] bool lookupIsInBotAppButton( [[nodiscard]] bool lookupIsInBotAppButton(
Row *row, Row *row,
QPoint localPosition); QPoint localPosition);
@ -623,8 +627,8 @@ private:
rpl::event_stream<> _refreshHashtagsRequests; rpl::event_stream<> _refreshHashtagsRequests;
rpl::event_stream<UserId> _openBotMainAppRequests; rpl::event_stream<UserId> _openBotMainAppRequests;
Dialogs::Ui::QuickActionContext _quickActionContext; using QuickActionPtr = std::unique_ptr<Ui::QuickActionContext>;
std::unique_ptr<Lottie::Icon> _quickActionLottieIcon = nullptr; base::flat_map<int64, QuickActionPtr> _quickActions;
RowDescriptor _chatPreviewRow; RowDescriptor _chatPreviewRow;
bool _chatPreviewScheduled = false; bool _chatPreviewScheduled = false;

View file

@ -694,7 +694,7 @@ void Widget::setupSwipeBack() {
&& _inner && _inner
&& (Core::App().settings().quickDialogAction() && (Core::App().settings().quickDialogAction()
!= Ui::QuickDialogAction::Disabled)) { != Ui::QuickDialogAction::Disabled)) {
_inner->setSwipeContextData(std::move(data)); _inner->setSwipeContextData(data.msgBareId, std::move(data));
} else { } else {
if (!_swipeBackData.callback) { if (!_swipeBackData.callback) {
_swipeBackData = Ui::Controls::SetupSwipeBack( _swipeBackData = Ui::Controls::SetupSwipeBack(
@ -716,7 +716,7 @@ void Widget::setupSwipeBack() {
_swipeBackData = {}; _swipeBackData = {};
} }
if (_inner) { if (_inner) {
_inner->setSwipeContextData({}); _inner->setSwipeContextData(data.msgBareId, std::nullopt);
_inner->update(); _inner->update();
} }
} }

View file

@ -395,10 +395,11 @@ void PaintRow(
: context.currentBg; : context.currentBg;
auto swipeTranslation = 0; auto swipeTranslation = 0;
if (history if (history
&& context.quickActionContext
&& (history->peer->id.value && (history->peer->id.value
== context.quickActionContext.data.msgBareId)) { == context.quickActionContext->data.msgBareId)) {
if (context.quickActionContext.data.translation != 0) { if (context.quickActionContext->data.translation != 0) {
swipeTranslation = context.quickActionContext.data.translation swipeTranslation = context.quickActionContext->data.translation
* -2; * -2;
} }
} }
@ -883,14 +884,14 @@ void PaintRow(
p.setClipRegion(swipeActionRect); p.setClipRegion(swipeActionRect);
const auto labelType = ResolveQuickDialogLabel( const auto labelType = ResolveQuickDialogLabel(
history, history,
context.quickActionContext.action, context.quickActionContext->action,
context.filter); context.filter);
p.fillRect(swipeActionRect, ResolveQuickActionBg(labelType)); p.fillRect(swipeActionRect, ResolveQuickActionBg(labelType));
if (context.quickActionContext.data.reachRatio) { if (context.quickActionContext->data.reachRatio) {
p.setPen(Qt::NoPen); p.setPen(Qt::NoPen);
p.setBrush(ResolveQuickActionBgActive(labelType)); p.setBrush(ResolveQuickActionBgActive(labelType));
const auto r = swipeTranslation const auto r = swipeTranslation
* context.quickActionContext.data.reachRatio; * context.quickActionContext->data.reachRatio;
const auto offset = st::dialogsQuickActionSize const auto offset = st::dialogsQuickActionSize
+ st::dialogsQuickActionSize / 2.; + st::dialogsQuickActionSize / 2.;
p.drawEllipse(QPointF(geometry.width() - offset, offset), r, r); p.drawEllipse(QPointF(geometry.width() - offset, offset), r, r);
@ -899,8 +900,8 @@ void PaintRow(
- st::dialogsQuickActionSize) / 2; - st::dialogsQuickActionSize) / 2;
const auto topTranslation = iconOffset / 2.; const auto topTranslation = iconOffset / 2.;
p.translate(0, -topTranslation); p.translate(0, -topTranslation);
if (context.quickActionContext.icon) { if (context.quickActionContext->icon) {
context.quickActionContext.icon->paint( context.quickActionContext->icon->paint(
p, p,
rect::right(geometry) rect::right(geometry)
- iconOffset - iconOffset

View file

@ -55,7 +55,7 @@ struct TopicJumpCache {
struct PaintContext { struct PaintContext {
RightButton *rightButton = nullptr; RightButton *rightButton = nullptr;
std::vector<QImage*> *chatsFilterTags = nullptr; std::vector<QImage*> *chatsFilterTags = nullptr;
QuickActionContext quickActionContext; QuickActionContext *quickActionContext = nullptr;
not_null<const style::DialogRow*> st; not_null<const style::DialogRow*> st;
TopicJumpCache *topicJumpCache = nullptr; TopicJumpCache *topicJumpCache = nullptr;
Data::Folder *folder = nullptr; Data::Folder *folder = nullptr;

View file

@ -33,7 +33,7 @@ enum class QuickDialogActionLabel {
struct QuickActionContext { struct QuickActionContext {
::Ui::Controls::SwipeContextData data; ::Ui::Controls::SwipeContextData data;
Lottie::Icon *icon = nullptr; std::unique_ptr<Lottie::Icon> icon;
QuickDialogAction action; QuickDialogAction action;
}; };