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