Skip to content

Commit

Permalink
Preview custom emoji on long press from the panel.
Browse files Browse the repository at this point in the history
  • Loading branch information
john-preston committed Apr 9, 2024
1 parent 29dd574 commit 170ebb5
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 6 deletions.
49 changes: 43 additions & 6 deletions Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ For license and copyright information please follow this link:
#include "data/data_changes.h"
#include "data/data_channel.h"
#include "data/data_document.h"
#include "data/data_file_origin.h"
#include "data/data_peer_values.h"
#include "data/stickers/data_stickers.h"
#include "data/stickers/data_custom_emoji.h"
Expand All @@ -51,12 +52,15 @@ For license and copyright information please follow this link:
#include "styles/style_chat_helpers.h"
#include "styles/style_menu_icons.h"

#include <QtWidgets/QApplication>

namespace ChatHelpers {
namespace {

constexpr auto kCollapsedRows = 3;
constexpr auto kAppearDuration = 0.3;
constexpr auto kCustomSearchLimit = 256;
constexpr auto kColorPickerDelay = crl::time(500);

using Core::RecentEmojiId;
using Core::RecentEmojiDocument;
Expand Down Expand Up @@ -477,7 +481,8 @@ EmojiListWidget::EmojiListWidget(
, _overBg(st::emojiPanRadius, st().overBg)
, _collapsedBg(st::emojiPanExpand.height / 2, st().headerFg)
, _picker(this, st())
, _showPickerTimer([=] { showPicker(); }) {
, _showPickerTimer([=] { showPicker(); })
, _previewTimer([=] { showPreview(); }) {
setMouseTracking(true);
if (st().bg->c.alpha() > 0) {
setAttribute(Qt::WA_OpaquePaintEvent);
Expand Down Expand Up @@ -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() {
return SearchEmoji(_searchQuery, _searchEmoji);
}
Expand Down Expand Up @@ -1119,7 +1133,7 @@ void EmojiListWidget::fillRecentMenu(
const auto addAction = Ui::Menu::CreateAddActionCallback(menu);
const auto over = OverEmoji{ section, index };
const auto emoji = lookupOverEmoji(&over);
const auto custom = lookupCustomEmoji(index, section);
const auto custom = lookupCustomEmoji(&over);
if (custom && custom->sticker()) {
const auto sticker = custom->sticker();
const auto emoji = sticker->alt;
Expand Down Expand Up @@ -1492,6 +1506,11 @@ bool EmojiListWidget::checkPickerHide() {
return false;
}

DocumentData *EmojiListWidget::lookupCustomEmoji(
const OverEmoji *over) const {
return over ? lookupCustomEmoji(over->index, over->section) : nullptr;
}

DocumentData *EmojiListWidget::lookupCustomEmoji(
int index,
int section) const {
Expand Down Expand Up @@ -1594,13 +1613,19 @@ void EmojiListWidget::mousePressEvent(QMouseEvent *e) {
if (!Core::App().settings().hasChosenEmojiVariant(emoji)) {
showPicker();
} else {
_showPickerTimer.callOnce(500);
_previewTimer.cancel();
_showPickerTimer.callOnce(kColorPickerDelay);
}
} else if (lookupCustomEmoji(over)) {
_showPickerTimer.cancel();
_previewTimer.callOnce(QApplication::startDragTime());
}
}
}

void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) {
_previewTimer.cancel();

auto pressed = _pressed;
setPressed(v::null);
_lastMousePos = e->globalPos();
Expand All @@ -1625,7 +1650,10 @@ void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) {
_picker->hide();
}

if (v::is_null(_selected) || _selected != pressed) {
if (_previewShown) {
_previewShown = false;
return;
} else if (v::is_null(_selected) || _selected != pressed) {
return;
}

Expand All @@ -1644,7 +1672,7 @@ void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) {
return;
}
selectEmoji(lookupChosen(emoji, over));
} else if (const auto custom = lookupCustomEmoji(index, section)) {
} else if (const auto custom = lookupCustomEmoji(over)) {
selectCustom(lookupChosen(custom, over));
}
} else if (const auto set = std::get_if<OverSet>(&pressed)) {
Expand Down Expand Up @@ -2478,7 +2506,9 @@ bool EmojiListWidget::eventHook(QEvent *e) {

void EmojiListWidget::updateSelected() {
if (!v::is_null(_pressed) || !v::is_null(_pickerSelected)) {
return;
if (!_previewShown) {
return;
}
}

auto newSelected = OverState{ v::null };
Expand Down Expand Up @@ -2537,6 +2567,13 @@ void EmojiListWidget::setSelected(OverState newSelected) {
} else {
_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);
}
}
}
}

Expand Down
6 changes: 6 additions & 0 deletions Telegram/SourceFiles/chat_helpers/emoji_list_widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,8 @@ class EmojiListWidget final
int index);

[[nodiscard]] EmojiPtr lookupOverEmoji(const OverEmoji *over) const;
[[nodiscard]] DocumentData *lookupCustomEmoji(
const OverEmoji *over) const;
[[nodiscard]] DocumentData *lookupCustomEmoji(
int index,
int section) const;
Expand Down Expand Up @@ -371,6 +373,8 @@ class EmojiListWidget final
DocumentId documentId,
uint64 setId);

void showPreview();

void applyNextSearchQuery();

const std::shared_ptr<Show> _show;
Expand Down Expand Up @@ -440,6 +444,8 @@ class EmojiListWidget final

object_ptr<EmojiColorPicker> _picker;
base::Timer _showPickerTimer;
base::Timer _previewTimer;
bool _previewShown = false;

rpl::event_stream<EmojiChosen> _chosen;
rpl::event_stream<FileChosen> _customChosen;
Expand Down

0 comments on commit 170ebb5

Please sign in to comment.