Preview custom emoji on long press from the panel.

This commit is contained in:
John Preston 2024-04-09 12:10:55 +04:00
parent 29dd574e22
commit 170ebb57c6
2 changed files with 49 additions and 6 deletions

View file

@ -34,6 +34,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_changes.h" #include "data/data_changes.h"
#include "data/data_channel.h" #include "data/data_channel.h"
#include "data/data_document.h" #include "data/data_document.h"
#include "data/data_file_origin.h"
#include "data/data_peer_values.h" #include "data/data_peer_values.h"
#include "data/stickers/data_stickers.h" #include "data/stickers/data_stickers.h"
#include "data/stickers/data_custom_emoji.h" #include "data/stickers/data_custom_emoji.h"
@ -51,12 +52,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "styles/style_chat_helpers.h" #include "styles/style_chat_helpers.h"
#include "styles/style_menu_icons.h" #include "styles/style_menu_icons.h"
#include <QtWidgets/QApplication>
namespace ChatHelpers { namespace ChatHelpers {
namespace { namespace {
constexpr auto kCollapsedRows = 3; constexpr auto kCollapsedRows = 3;
constexpr auto kAppearDuration = 0.3; constexpr auto kAppearDuration = 0.3;
constexpr auto kCustomSearchLimit = 256; constexpr auto kCustomSearchLimit = 256;
constexpr auto kColorPickerDelay = crl::time(500);
using Core::RecentEmojiId; using Core::RecentEmojiId;
using Core::RecentEmojiDocument; using Core::RecentEmojiDocument;
@ -477,7 +481,8 @@ EmojiListWidget::EmojiListWidget(
, _overBg(st::emojiPanRadius, st().overBg) , _overBg(st::emojiPanRadius, st().overBg)
, _collapsedBg(st::emojiPanExpand.height / 2, st().headerFg) , _collapsedBg(st::emojiPanExpand.height / 2, st().headerFg)
, _picker(this, st()) , _picker(this, st())
, _showPickerTimer([=] { showPicker(); }) { , _showPickerTimer([=] { showPicker(); })
, _previewTimer([=] { showPreview(); }) {
setMouseTracking(true); setMouseTracking(true);
if (st().bg->c.alpha() > 0) { if (st().bg->c.alpha() > 0) {
setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_OpaquePaintEvent);
@ -624,6 +629,15 @@ void EmojiListWidget::applyNextSearchQuery() {
} }
} }
void EmojiListWidget::showPreview() {
if (const auto over = std::get_if<OverEmoji>(&_pressed)) {
if (const auto custom = lookupCustomEmoji(over)) {
_show->showMediaPreview(custom->stickerSetOrigin(), custom);
_previewShown = true;
}
}
}
std::vector<EmojiPtr> EmojiListWidget::collectPlainSearchResults() { std::vector<EmojiPtr> EmojiListWidget::collectPlainSearchResults() {
return SearchEmoji(_searchQuery, _searchEmoji); return SearchEmoji(_searchQuery, _searchEmoji);
} }
@ -1119,7 +1133,7 @@ void EmojiListWidget::fillRecentMenu(
const auto addAction = Ui::Menu::CreateAddActionCallback(menu); const auto addAction = Ui::Menu::CreateAddActionCallback(menu);
const auto over = OverEmoji{ section, index }; const auto over = OverEmoji{ section, index };
const auto emoji = lookupOverEmoji(&over); const auto emoji = lookupOverEmoji(&over);
const auto custom = lookupCustomEmoji(index, section); const auto custom = lookupCustomEmoji(&over);
if (custom && custom->sticker()) { if (custom && custom->sticker()) {
const auto sticker = custom->sticker(); const auto sticker = custom->sticker();
const auto emoji = sticker->alt; const auto emoji = sticker->alt;
@ -1492,6 +1506,11 @@ bool EmojiListWidget::checkPickerHide() {
return false; return false;
} }
DocumentData *EmojiListWidget::lookupCustomEmoji(
const OverEmoji *over) const {
return over ? lookupCustomEmoji(over->index, over->section) : nullptr;
}
DocumentData *EmojiListWidget::lookupCustomEmoji( DocumentData *EmojiListWidget::lookupCustomEmoji(
int index, int index,
int section) const { int section) const {
@ -1594,13 +1613,19 @@ void EmojiListWidget::mousePressEvent(QMouseEvent *e) {
if (!Core::App().settings().hasChosenEmojiVariant(emoji)) { if (!Core::App().settings().hasChosenEmojiVariant(emoji)) {
showPicker(); showPicker();
} else { } else {
_showPickerTimer.callOnce(500); _previewTimer.cancel();
_showPickerTimer.callOnce(kColorPickerDelay);
} }
} else if (lookupCustomEmoji(over)) {
_showPickerTimer.cancel();
_previewTimer.callOnce(QApplication::startDragTime());
} }
} }
} }
void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) { void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) {
_previewTimer.cancel();
auto pressed = _pressed; auto pressed = _pressed;
setPressed(v::null); setPressed(v::null);
_lastMousePos = e->globalPos(); _lastMousePos = e->globalPos();
@ -1625,7 +1650,10 @@ void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) {
_picker->hide(); _picker->hide();
} }
if (v::is_null(_selected) || _selected != pressed) { if (_previewShown) {
_previewShown = false;
return;
} else if (v::is_null(_selected) || _selected != pressed) {
return; return;
} }
@ -1644,7 +1672,7 @@ void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) {
return; return;
} }
selectEmoji(lookupChosen(emoji, over)); selectEmoji(lookupChosen(emoji, over));
} else if (const auto custom = lookupCustomEmoji(index, section)) { } else if (const auto custom = lookupCustomEmoji(over)) {
selectCustom(lookupChosen(custom, over)); selectCustom(lookupChosen(custom, over));
} }
} else if (const auto set = std::get_if<OverSet>(&pressed)) { } else if (const auto set = std::get_if<OverSet>(&pressed)) {
@ -2478,7 +2506,9 @@ bool EmojiListWidget::eventHook(QEvent *e) {
void EmojiListWidget::updateSelected() { void EmojiListWidget::updateSelected() {
if (!v::is_null(_pressed) || !v::is_null(_pickerSelected)) { if (!v::is_null(_pressed) || !v::is_null(_pickerSelected)) {
return; if (!_previewShown) {
return;
}
} }
auto newSelected = OverState{ v::null }; auto newSelected = OverState{ v::null };
@ -2537,6 +2567,13 @@ void EmojiListWidget::setSelected(OverState newSelected) {
} else { } else {
_picker->showAnimated(); _picker->showAnimated();
} }
} else if (_previewShown && _pressed != _selected) {
if (const auto over = std::get_if<OverEmoji>(&_selected)) {
if (const auto custom = lookupCustomEmoji(over)) {
_pressed = _selected;
_show->showMediaPreview(custom->stickerSetOrigin(), custom);
}
}
} }
} }

View file

@ -287,6 +287,8 @@ private:
int index); int index);
[[nodiscard]] EmojiPtr lookupOverEmoji(const OverEmoji *over) const; [[nodiscard]] EmojiPtr lookupOverEmoji(const OverEmoji *over) const;
[[nodiscard]] DocumentData *lookupCustomEmoji(
const OverEmoji *over) const;
[[nodiscard]] DocumentData *lookupCustomEmoji( [[nodiscard]] DocumentData *lookupCustomEmoji(
int index, int index,
int section) const; int section) const;
@ -371,6 +373,8 @@ private:
DocumentId documentId, DocumentId documentId,
uint64 setId); uint64 setId);
void showPreview();
void applyNextSearchQuery(); void applyNextSearchQuery();
const std::shared_ptr<Show> _show; const std::shared_ptr<Show> _show;
@ -440,6 +444,8 @@ private:
object_ptr<EmojiColorPicker> _picker; object_ptr<EmojiColorPicker> _picker;
base::Timer _showPickerTimer; base::Timer _showPickerTimer;
base::Timer _previewTimer;
bool _previewShown = false;
rpl::event_stream<EmojiChosen> _chosen; rpl::event_stream<EmojiChosen> _chosen;
rpl::event_stream<FileChosen> _customChosen; rpl::event_stream<FileChosen> _customChosen;