From 689aed7258efd03226c939f5e8eb5aa9a9cd6e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Gro=C3=9F?= Date: Thu, 2 Aug 2018 17:50:00 +0200 Subject: [PATCH] Show Emoji replacement tooltip on hover When using the mouse, hovering over a emoji causes the corresponding replacement text to appear in a tooltip. This feature is disabled, if the option "Suggest emoji replacements" is disabled. This closes #3739, closes #743 and closes #4211. --- .../chat_helpers/emoji_list_widget.cpp | 29 +++++++++++++++++++ .../chat_helpers/emoji_list_widget.h | 7 ++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp index d60b11c14..857c3f326 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.cpp @@ -11,6 +11,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_chat_helpers.h" #include "ui/widgets/shadow.h" #include "lang/lang_keys.h" +#include "emoji_suggestions_data.h" +#include "emoji_suggestions_helper.h" +#include "facades.h" namespace ChatHelpers { @@ -667,6 +670,28 @@ Ui::Emoji::Section EmojiListWidget::currentSection(int yOffset) const { return static_cast
(sectionInfoByOffset(yOffset).section); } +QString EmojiListWidget::tooltipText() const { + const auto &replacements = Ui::Emoji::internal::GetAllReplacements(); + const auto section = (_selected / MatrixRowShift); + const auto sel = _selected % MatrixRowShift; + if (_selected >= 0 && section < kEmojiSectionCount && sel < _emoji[section].size()) { + const auto emoji = _emoji[section][sel]; + const auto text = emoji->text(); + // find the replacement belonging to the emoji + const auto it = ranges::find_if(replacements, [&text](auto &one) { + return text == Ui::Emoji::QStringFromUTF16(one.emoji); + }); + if (it != replacements.end()) { + return Ui::Emoji::QStringFromUTF16(it->replacement); + } + } + return ""; +} + +QPoint EmojiListWidget::tooltipPos() const { + return _lastMousePos; +} + TabbedSelector::InnerFooter *EmojiListWidget::getFooter() const { return _footer; } @@ -729,6 +754,10 @@ void EmojiListWidget::setSelected(int newSelected) { _selected = newSelected; updateSelected(); + if (_selected >= 0 && Global::SuggestEmoji()) { + Ui::Tooltip::Show(1000, this); + } + setCursor((_selected >= 0) ? style::cur_pointer : style::cur_default); if (_selected >= 0 && !_picker->isHidden()) { if (_selected != _pickerSel) { diff --git a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h index b25ec0165..6de33fc9a 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h +++ b/Telegram/SourceFiles/chat_helpers/emoji_list_widget.h @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "chat_helpers/tabbed_selector.h" +#include "ui/widgets/tooltip.h" namespace Window { class Controller; @@ -74,7 +75,7 @@ private: }; -class EmojiListWidget : public TabbedSelector::Inner { +class EmojiListWidget : public TabbedSelector::Inner, public Ui::AbstractTooltipShower { Q_OBJECT public: @@ -89,6 +90,10 @@ public: void showEmojiSection(Section section); Section currentSection(int yOffset) const; + // Ui::AbstractTooltipShower interface. + QString tooltipText() const override; + QPoint tooltipPos() const override; + public slots: void onShowPicker(); void onPickerHidden();