Handle clicks on Webm stickers.

This commit is contained in:
John Preston 2022-01-20 16:27:26 +03:00
parent 63d15e4479
commit 219ffd2c48
4 changed files with 30 additions and 14 deletions

View File

@ -79,7 +79,11 @@ Gif::Gif(
, _data(document)
, _caption(st::minPhotoSize - st::msgPadding.left() - st::msgPadding.right())
, _downloadSize(Ui::FormatSizeText(_data->size)) {
setDocumentLinks(_data, realParent);
if (const auto info = _data->sticker(); info && info->set) {
_stickerLink = Sticker::ShowSetHandler(_data);
} else {
setDocumentLinks(_data, realParent);
}
setStatusSize(Ui::FileStatusSizeReady);
@ -269,7 +273,9 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
ensureDataMediaCreated();
const auto item = _parent->data();
const auto loaded = dataLoaded();
const auto displayLoading = item->isSending() || _data->displayLoading();
const auto sticker = _data->sticker();
const auto displayLoading = !sticker
&& (item->isSending() || _data->displayLoading());
const auto st = context.st;
const auto sti = context.imageStyle();
const auto stm = context.messageStyle();
@ -322,7 +328,9 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
}
updateStatusText();
const auto radial = isRadialAnimation()
|| (streamedForWaiting && streamedForWaiting->waitingShown());
|| (!sticker
&& streamedForWaiting
&& streamedForWaiting->waitingShown());
if (bubble) {
if (!_caption.isEmpty()) {
@ -479,7 +487,8 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
}
if (radial
|| (!streamingMode
|| (!sticker
&& !streamingMode
&& ((!loaded && !_data->loading()) || !autoplay))) {
const auto radialOpacity = (item->isSending() || _data->uploading())
? 1.
@ -557,9 +566,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
if (!unwrapped) {
drawCornerStatus(p, context, QPoint());
}
if (unwrapped) {
} else {
if (isRound) {
const auto mediaUnread = item->hasUnreadMediaFlag();
auto statusW = st::normalFont->width(_statusText) + 2 * st::msgDateImgPadding.x();
@ -850,7 +857,9 @@ TextState Gif::textState(QPoint point, StateRequest request) const {
}
if (QRect(usex + paintx, painty, usew, painth).contains(point)) {
ensureDataMediaCreated();
result.link = _data->uploading()
result.link = _data->sticker()
? _stickerLink
: _data->uploading()
? _cancell
: _realParent->isSending()
? nullptr

View File

@ -184,6 +184,7 @@ private:
std::unique_ptr<Streamed> _streamed;
mutable std::shared_ptr<Data::DocumentMedia> _dataMedia;
mutable std::unique_ptr<Image> _videoThumbnailFrame;
ClickHandlerPtr _stickerLink;
QString _downloadSize;

View File

@ -275,6 +275,15 @@ QPixmap Sticker::paintedPixmap(const PaintContext &context) const {
return QPixmap();
}
ClickHandlerPtr Sticker::ShowSetHandler(not_null<DocumentData*> document) {
return std::make_shared<LambdaClickHandler>([=](ClickContext context) {
const auto my = context.other.value<ClickHandlerContext>();
if (const auto window = my.sessionWindow.get()) {
StickerSetBox::Show(window, document);
}
});
}
void Sticker::refreshLink() {
if (_link) {
return;
@ -288,12 +297,7 @@ void Sticker::refreshLink() {
}
});
} else if (sticker && sticker->set) {
_link = std::make_shared<LambdaClickHandler>([document = _data](ClickContext context) {
const auto my = context.other.value<ClickHandlerContext>();
if (const auto window = my.sessionWindow.get()) {
StickerSetBox::Show(window, document);
}
});
_link = ShowSetHandler(_data);
} else if (sticker
&& (_data->dimensions.width() > kStickerSideSize
|| _data->dimensions.height() > kStickerSideSize)

View File

@ -80,6 +80,8 @@ public:
[[nodiscard]] static QSize Size();
[[nodiscard]] static QSize EmojiSize();
[[nodiscard]] static ClickHandlerPtr ShowSetHandler(
not_null<DocumentData*> document);
private:
[[nodiscard]] bool isEmojiSticker() const;