mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-18 15:17:07 +02:00
Preview custom emoji on long press from the panel.
This commit is contained in:
parent
29dd574e22
commit
170ebb57c6
2 changed files with 49 additions and 6 deletions
Telegram/SourceFiles/chat_helpers
|
@ -34,6 +34,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
#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"
|
||||
|
@ -51,12 +52,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
#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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)) {
|
||||
|
@ -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 };
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -287,6 +287,8 @@ private:
|
|||
int index);
|
||||
|
||||
[[nodiscard]] EmojiPtr lookupOverEmoji(const OverEmoji *over) const;
|
||||
[[nodiscard]] DocumentData *lookupCustomEmoji(
|
||||
const OverEmoji *over) const;
|
||||
[[nodiscard]] DocumentData *lookupCustomEmoji(
|
||||
int index,
|
||||
int section) const;
|
||||
|
@ -371,6 +373,8 @@ private:
|
|||
DocumentId documentId,
|
||||
uint64 setId);
|
||||
|
||||
void showPreview();
|
||||
|
||||
void applyNextSearchQuery();
|
||||
|
||||
const std::shared_ptr<Show> _show;
|
||||
|
@ -440,6 +444,8 @@ private:
|
|||
|
||||
object_ptr<EmojiColorPicker> _picker;
|
||||
base::Timer _showPickerTimer;
|
||||
base::Timer _previewTimer;
|
||||
bool _previewShown = false;
|
||||
|
||||
rpl::event_stream<EmojiChosen> _chosen;
|
||||
rpl::event_stream<FileChosen> _customChosen;
|
||||
|
|
Loading…
Add table
Reference in a new issue