/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "ui/effects/animations.h" #include "ui/rp_widget.h" #include "base/unique_qptr.h" #include "base/timer.h" #include namespace style { struct EmojiSuggestions; } // namespace style namespace Main { class Session; } // namespace Main namespace Ui { class InnerDropdown; class InputField; } // namespace Ui namespace Ui::Text { class CustomEmoji; } // namespace Ui::Text namespace Ui::Emoji { class SuggestionsWidget; using SuggestionsQuery = std::variant; class SuggestionsController { public: struct Options { bool suggestExactFirstWord = true; bool suggestCustomEmoji = false; Fn)> allowCustomWithoutPremium; const style::EmojiSuggestions *st = nullptr; }; SuggestionsController( not_null outer, not_null field, not_null session, const Options &options); void raise(); void setReplaceCallback(Fn callback); static not_null Init( not_null outer, not_null field, not_null session) { return Init(outer, field, session, {}); } static not_null Init( not_null outer, not_null field, not_null session, const Options &options); private: void handleCursorPositionChange(); void handleTextChange(); void showWithQuery(SuggestionsQuery query); [[nodiscard]] SuggestionsQuery getEmojiQuery(); void suggestionsUpdated(bool visible); void updateGeometry(); void updateForceHidden(); void replaceCurrent( const QString &replacement, const QString &customEmojiData); bool fieldFilter(not_null event); bool outerFilter(not_null event); const style::EmojiSuggestions &_st; bool _shown = false; bool _forceHidden = false; int _queryStartPosition = 0; int _emojiQueryLength = 0; bool _ignoreCursorPositionChange = false; bool _textChangeAfterKeyPress = false; QPointer _field; const not_null _session; Fn _replaceCallback; base::unique_qptr _container; QPointer _suggestions; base::unique_qptr _fieldFilter; base::unique_qptr _outerFilter; base::Timer _showExactTimer; bool _keywordsRefreshed = false; SuggestionsQuery _lastShownQuery; Options _options; rpl::lifetime _lifetime; }; } // namespace Ui::Emoji