mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 22:54:01 +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 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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue