136 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
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 "base/timer.h"
 | 
						|
#include "base/qt/qt_compare.h"
 | 
						|
#include "ui/rp_widget.h"
 | 
						|
#include "ui/effects/animations.h"
 | 
						|
#include "ui/text/text_custom_emoji.h"
 | 
						|
 | 
						|
namespace style {
 | 
						|
struct EmojiPan;
 | 
						|
struct TabbedSearch;
 | 
						|
} // namespace style
 | 
						|
 | 
						|
namespace anim {
 | 
						|
enum class type : uchar;
 | 
						|
} // namespace anim
 | 
						|
 | 
						|
namespace Ui {
 | 
						|
 | 
						|
class InputField;
 | 
						|
class IconButton;
 | 
						|
class CrossButton;
 | 
						|
class RpWidget;
 | 
						|
template <typename Widget>
 | 
						|
class FadeWrap;
 | 
						|
 | 
						|
struct EmojiGroup {
 | 
						|
	QString iconId;
 | 
						|
	std::vector<QString> emoticons;
 | 
						|
 | 
						|
	friend inline auto operator<=>(
 | 
						|
		const EmojiGroup &a,
 | 
						|
		const EmojiGroup &b) = default;
 | 
						|
};
 | 
						|
 | 
						|
struct SearchDescriptor {
 | 
						|
	const style::TabbedSearch &st;
 | 
						|
	rpl::producer<std::vector<EmojiGroup>> groups;
 | 
						|
	Text::CustomEmojiFactory customEmojiFactory;
 | 
						|
};
 | 
						|
 | 
						|
class SearchWithGroups final : public RpWidget {
 | 
						|
public:
 | 
						|
	SearchWithGroups(QWidget *parent, SearchDescriptor descriptor);
 | 
						|
 | 
						|
	[[nodiscard]] rpl::producer<> escapes() const;
 | 
						|
	[[nodiscard]] rpl::producer<std::vector<QString>> queryValue() const;
 | 
						|
	[[nodiscard]] auto debouncedQueryValue() const
 | 
						|
		-> rpl::producer<std::vector<QString>>;
 | 
						|
 | 
						|
	void cancel();
 | 
						|
	void setLoading(bool loading);
 | 
						|
	void stealFocus();
 | 
						|
	void returnFocus();
 | 
						|
 | 
						|
	[[nodiscard]] static int IconSizeOverride();
 | 
						|
 | 
						|
private:
 | 
						|
	int resizeGetHeight(int newWidth) override;
 | 
						|
	void wheelEvent(QWheelEvent *e) override;
 | 
						|
 | 
						|
	[[nodiscard]] int clampGroupsLeft(int width, int desiredLeft) const;
 | 
						|
	void moveGroupsBy(int width, int delta);
 | 
						|
	void moveGroupsTo(int width, int to);
 | 
						|
	void scrollGroupsToIcon(int iconLeft, int iconRight);
 | 
						|
	void scrollGroupsToStart();
 | 
						|
	void scrollGroupsTo(int left);
 | 
						|
 | 
						|
	[[nodiscard]] anim::type animated() const;
 | 
						|
	void initField();
 | 
						|
	void initGroups();
 | 
						|
	void initEdges();
 | 
						|
	void initButtons();
 | 
						|
 | 
						|
	void ensureRounding(int size, float64 rounding);
 | 
						|
 | 
						|
	const style::TabbedSearch &_st;
 | 
						|
	not_null<FadeWrap<IconButton>*> _search;
 | 
						|
	not_null<FadeWrap<IconButton>*> _back;
 | 
						|
	not_null<CrossButton*> _cancel;
 | 
						|
	not_null<InputField*> _field;
 | 
						|
	QPointer<QWidget> _focusTakenFrom;
 | 
						|
	not_null<FadeWrap<RpWidget>*> _groups;
 | 
						|
	not_null<RpWidget*> _fade;
 | 
						|
	rpl::variable<float64> _fadeOpacity = 0.;
 | 
						|
	int _fadeLeftStart = 0;
 | 
						|
 | 
						|
	rpl::variable<int> _fieldPlaceholderWidth;
 | 
						|
	rpl::variable<bool> _fieldEmpty = true;
 | 
						|
	Ui::Animations::Simple _groupsLeftAnimation;
 | 
						|
	int _groupsLeftTo = 0;
 | 
						|
 | 
						|
	QImage _rounding;
 | 
						|
 | 
						|
	rpl::variable<std::vector<QString>> _query;
 | 
						|
	rpl::variable<std::vector<QString>> _debouncedQuery;
 | 
						|
	rpl::variable<QString> _chosenGroup;
 | 
						|
	base::Timer _debounceTimer;
 | 
						|
	bool _inited = false;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
class TabbedSearch final {
 | 
						|
public:
 | 
						|
	TabbedSearch(
 | 
						|
		not_null<RpWidget*> parent,
 | 
						|
		const style::EmojiPan &st,
 | 
						|
		SearchDescriptor &&descriptor);
 | 
						|
 | 
						|
	[[nodiscard]] int height() const;
 | 
						|
	[[nodiscard]] QImage grab();
 | 
						|
 | 
						|
	[[nodiscard]] rpl::producer<> escapes() const;
 | 
						|
	[[nodiscard]] rpl::producer<std::vector<QString>> queryValue() const;
 | 
						|
	[[nodiscard]] auto debouncedQueryValue() const
 | 
						|
		->rpl::producer<std::vector<QString>>;
 | 
						|
 | 
						|
	void cancel();
 | 
						|
	void setLoading(bool loading);
 | 
						|
	void stealFocus();
 | 
						|
	void returnFocus();
 | 
						|
 | 
						|
private:
 | 
						|
	const style::EmojiPan &_st;
 | 
						|
	SearchWithGroups _search;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
} // namespace Ui
 |