mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-03 21:54:05 +02:00
Replaced single QuickActionContext in dialogs widget with flat map.
This commit is contained in:
parent
a21eb9d59e
commit
418dcedc4e
6 changed files with 75 additions and 44 deletions
|
@ -810,7 +810,6 @@ void InnerWidget::paintEvent(QPaintEvent *e) {
|
|||
const auto ms = crl::now();
|
||||
const auto childListShown = _childListShown.current();
|
||||
auto context = Ui::PaintContext{
|
||||
.quickActionContext = _quickActionContext,
|
||||
.st = _st,
|
||||
.topicJumpCache = _topicJumpCache.get(),
|
||||
.folder = _openedFolder,
|
||||
|
@ -839,6 +838,12 @@ void InnerWidget::paintEvent(QPaintEvent *e) {
|
|||
const auto expanding = forum
|
||||
&& (key.history()->peer->id == childListShown.peerId);
|
||||
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());
|
||||
|
||||
|
@ -4995,24 +5000,43 @@ rpl::producer<UserId> InnerWidget::openBotMainAppRequests() const {
|
|||
return _openBotMainAppRequests.events();
|
||||
}
|
||||
|
||||
void InnerWidget::setSwipeContextData(Ui::Controls::SwipeContextData data) {
|
||||
_quickActionContext.data = std::move(data);
|
||||
if (_quickActionContext.data.msgBareId) {
|
||||
void InnerWidget::setSwipeContextData(
|
||||
int64 key,
|
||||
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 kResetAnimateThreshold = 0.24;
|
||||
if (_quickActionContext.data.ratio > kStartAnimateThreshold) {
|
||||
if (_quickActionContext.icon
|
||||
&& !_quickActionContext.icon->frameIndex()
|
||||
&& !_quickActionContext.icon->animating()) {
|
||||
_quickActionContext.icon->animate(
|
||||
if (context->data.ratio > kStartAnimateThreshold) {
|
||||
if (context->icon
|
||||
&& !context->icon->frameIndex()
|
||||
&& !context->icon->animating()) {
|
||||
context->icon->animate(
|
||||
[=] { update(); },
|
||||
0,
|
||||
_quickActionContext.icon->framesCount());
|
||||
context->icon->framesCount());
|
||||
}
|
||||
} else if (_quickActionContext.data.ratio < kResetAnimateThreshold) {
|
||||
if (_quickActionContext.icon
|
||||
&& _quickActionContext.icon->frameIndex()) {
|
||||
_quickActionContext.icon->jumpTo(0, [=] { update(); });
|
||||
} else if (context->data.ratio < kResetAnimateThreshold) {
|
||||
if (context->icon
|
||||
&& context->icon->frameIndex()) {
|
||||
context->icon->jumpTo(0, [=] { update(); });
|
||||
}
|
||||
}
|
||||
update();
|
||||
|
@ -5038,23 +5062,25 @@ int64 InnerWidget::calcSwipeKey(int top) {
|
|||
void InnerWidget::prepareQuickAction(
|
||||
int64 key,
|
||||
Dialogs::Ui::QuickDialogAction action) {
|
||||
if (key) {
|
||||
const auto peer = session().data().peer(PeerId(key));
|
||||
auto name = ResolveQuickDialogLottieIconName(peer, action, _filterId);
|
||||
_quickActionLottieIcon = Lottie::MakeIcon({
|
||||
.name = std::move(name),
|
||||
.sizeOverride = Size(st::dialogsQuickActionSize),
|
||||
});
|
||||
_quickActionContext.icon = _quickActionLottieIcon.get();
|
||||
_quickActionContext.action = action;
|
||||
Expects(key != 0);
|
||||
|
||||
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 {
|
||||
if (_quickActionContext.icon) {
|
||||
_quickActionContext = {};
|
||||
}
|
||||
if (_quickActionLottieIcon) {
|
||||
_quickActionLottieIcon.reset();
|
||||
}
|
||||
context = it->second.get();
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
@ -216,7 +216,9 @@ public:
|
|||
|
||||
[[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);
|
||||
void prepareQuickAction(int64 key, Dialogs::Ui::QuickDialogAction);
|
||||
|
||||
|
@ -480,6 +482,8 @@ private:
|
|||
void saveChatsFilterScrollState(FilterId filterId);
|
||||
void restoreChatsFilterScrollState(FilterId filterId);
|
||||
|
||||
[[nodiscard]] Ui::QuickActionContext *ensureQuickAction(int64 key);
|
||||
|
||||
[[nodiscard]] bool lookupIsInBotAppButton(
|
||||
Row *row,
|
||||
QPoint localPosition);
|
||||
|
@ -623,8 +627,8 @@ private:
|
|||
rpl::event_stream<> _refreshHashtagsRequests;
|
||||
rpl::event_stream<UserId> _openBotMainAppRequests;
|
||||
|
||||
Dialogs::Ui::QuickActionContext _quickActionContext;
|
||||
std::unique_ptr<Lottie::Icon> _quickActionLottieIcon = nullptr;
|
||||
using QuickActionPtr = std::unique_ptr<Ui::QuickActionContext>;
|
||||
base::flat_map<int64, QuickActionPtr> _quickActions;
|
||||
|
||||
RowDescriptor _chatPreviewRow;
|
||||
bool _chatPreviewScheduled = false;
|
||||
|
|
|
@ -694,7 +694,7 @@ void Widget::setupSwipeBack() {
|
|||
&& _inner
|
||||
&& (Core::App().settings().quickDialogAction()
|
||||
!= Ui::QuickDialogAction::Disabled)) {
|
||||
_inner->setSwipeContextData(std::move(data));
|
||||
_inner->setSwipeContextData(data.msgBareId, std::move(data));
|
||||
} else {
|
||||
if (!_swipeBackData.callback) {
|
||||
_swipeBackData = Ui::Controls::SetupSwipeBack(
|
||||
|
@ -716,7 +716,7 @@ void Widget::setupSwipeBack() {
|
|||
_swipeBackData = {};
|
||||
}
|
||||
if (_inner) {
|
||||
_inner->setSwipeContextData({});
|
||||
_inner->setSwipeContextData(data.msgBareId, std::nullopt);
|
||||
_inner->update();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -395,10 +395,11 @@ void PaintRow(
|
|||
: context.currentBg;
|
||||
auto swipeTranslation = 0;
|
||||
if (history
|
||||
&& context.quickActionContext
|
||||
&& (history->peer->id.value
|
||||
== context.quickActionContext.data.msgBareId)) {
|
||||
if (context.quickActionContext.data.translation != 0) {
|
||||
swipeTranslation = context.quickActionContext.data.translation
|
||||
== context.quickActionContext->data.msgBareId)) {
|
||||
if (context.quickActionContext->data.translation != 0) {
|
||||
swipeTranslation = context.quickActionContext->data.translation
|
||||
* -2;
|
||||
}
|
||||
}
|
||||
|
@ -883,14 +884,14 @@ void PaintRow(
|
|||
p.setClipRegion(swipeActionRect);
|
||||
const auto labelType = ResolveQuickDialogLabel(
|
||||
history,
|
||||
context.quickActionContext.action,
|
||||
context.quickActionContext->action,
|
||||
context.filter);
|
||||
p.fillRect(swipeActionRect, ResolveQuickActionBg(labelType));
|
||||
if (context.quickActionContext.data.reachRatio) {
|
||||
if (context.quickActionContext->data.reachRatio) {
|
||||
p.setPen(Qt::NoPen);
|
||||
p.setBrush(ResolveQuickActionBgActive(labelType));
|
||||
const auto r = swipeTranslation
|
||||
* context.quickActionContext.data.reachRatio;
|
||||
* context.quickActionContext->data.reachRatio;
|
||||
const auto offset = st::dialogsQuickActionSize
|
||||
+ st::dialogsQuickActionSize / 2.;
|
||||
p.drawEllipse(QPointF(geometry.width() - offset, offset), r, r);
|
||||
|
@ -899,8 +900,8 @@ void PaintRow(
|
|||
- st::dialogsQuickActionSize) / 2;
|
||||
const auto topTranslation = iconOffset / 2.;
|
||||
p.translate(0, -topTranslation);
|
||||
if (context.quickActionContext.icon) {
|
||||
context.quickActionContext.icon->paint(
|
||||
if (context.quickActionContext->icon) {
|
||||
context.quickActionContext->icon->paint(
|
||||
p,
|
||||
rect::right(geometry)
|
||||
- iconOffset
|
||||
|
|
|
@ -55,7 +55,7 @@ struct TopicJumpCache {
|
|||
struct PaintContext {
|
||||
RightButton *rightButton = nullptr;
|
||||
std::vector<QImage*> *chatsFilterTags = nullptr;
|
||||
QuickActionContext quickActionContext;
|
||||
QuickActionContext *quickActionContext = nullptr;
|
||||
not_null<const style::DialogRow*> st;
|
||||
TopicJumpCache *topicJumpCache = nullptr;
|
||||
Data::Folder *folder = nullptr;
|
||||
|
|
|
@ -33,7 +33,7 @@ enum class QuickDialogActionLabel {
|
|||
|
||||
struct QuickActionContext {
|
||||
::Ui::Controls::SwipeContextData data;
|
||||
Lottie::Icon *icon = nullptr;
|
||||
std::unique_ptr<Lottie::Icon> icon;
|
||||
QuickDialogAction action;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue