165 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
	
		
			4.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 "ui/rp_widget.h"
 | 
						|
#include "ui/round_rect.h"
 | 
						|
#include "ui/wrap/fade_wrap.h"
 | 
						|
#include "ui/effects/animations.h"
 | 
						|
#include "ui/effects/numbers_animation.h"
 | 
						|
#include "info/info_wrap_widget.h"
 | 
						|
 | 
						|
namespace style {
 | 
						|
struct InfoTopBar;
 | 
						|
} // namespace style
 | 
						|
 | 
						|
namespace Window {
 | 
						|
class SessionNavigation;
 | 
						|
} // namespace Window
 | 
						|
 | 
						|
namespace Ui {
 | 
						|
class IconButton;
 | 
						|
class FlatLabel;
 | 
						|
class InputField;
 | 
						|
class SearchFieldController;
 | 
						|
class LabelWithNumbers;
 | 
						|
} // namespace Ui
 | 
						|
 | 
						|
namespace Info {
 | 
						|
 | 
						|
class Key;
 | 
						|
class Section;
 | 
						|
 | 
						|
class TopBar : public Ui::RpWidget {
 | 
						|
public:
 | 
						|
	TopBar(
 | 
						|
		QWidget *parent,
 | 
						|
		not_null<Window::SessionNavigation*> navigation,
 | 
						|
		const style::InfoTopBar &st,
 | 
						|
		SelectedItems &&items);
 | 
						|
 | 
						|
	auto backRequest() const {
 | 
						|
		return _backClicks.events();
 | 
						|
	}
 | 
						|
 | 
						|
	void setTitle(rpl::producer<QString> &&title);
 | 
						|
	void enableBackButton();
 | 
						|
	void highlight();
 | 
						|
 | 
						|
	template <typename ButtonWidget>
 | 
						|
	ButtonWidget *addButton(base::unique_qptr<ButtonWidget> button) {
 | 
						|
		auto result = button.get();
 | 
						|
		pushButton(std::move(button));
 | 
						|
		return result;
 | 
						|
	}
 | 
						|
 | 
						|
	template <typename ButtonWidget>
 | 
						|
	ButtonWidget *addButtonWithVisibility(
 | 
						|
			base::unique_qptr<ButtonWidget> button,
 | 
						|
			rpl::producer<bool> shown) {
 | 
						|
		auto result = button.get();
 | 
						|
		forceButtonVisibility(
 | 
						|
			pushButton(std::move(button)),
 | 
						|
			std::move(shown));
 | 
						|
		return result;
 | 
						|
	}
 | 
						|
 | 
						|
	void createSearchView(
 | 
						|
		not_null<Ui::SearchFieldController*> controller,
 | 
						|
		rpl::producer<bool> &&shown,
 | 
						|
		bool startsFocused);
 | 
						|
	bool focusSearchField();
 | 
						|
 | 
						|
	void setSelectedItems(SelectedItems &&items);
 | 
						|
	SelectedItems takeSelectedItems();
 | 
						|
 | 
						|
	[[nodiscard]] auto selectionActionRequests() const
 | 
						|
		-> rpl::producer<SelectionAction>;
 | 
						|
 | 
						|
	void finishAnimating() {
 | 
						|
		updateControlsVisibility(anim::type::instant);
 | 
						|
	}
 | 
						|
 | 
						|
	void showSearch();
 | 
						|
 | 
						|
protected:
 | 
						|
	int resizeGetHeight(int newWidth) override;
 | 
						|
	void paintEvent(QPaintEvent *e) override;
 | 
						|
 | 
						|
private:
 | 
						|
	void updateControlsGeometry(int newWidth);
 | 
						|
	void updateDefaultControlsGeometry(int newWidth);
 | 
						|
	void updateSelectionControlsGeometry(int newWidth);
 | 
						|
	Ui::FadeWrap<Ui::RpWidget> *pushButton(
 | 
						|
		base::unique_qptr<Ui::RpWidget> button);
 | 
						|
	void forceButtonVisibility(
 | 
						|
		Ui::FadeWrap<Ui::RpWidget> *button,
 | 
						|
		rpl::producer<bool> shown);
 | 
						|
	void removeButton(not_null<Ui::RpWidget*> button);
 | 
						|
	void startHighlightAnimation();
 | 
						|
	void updateControlsVisibility(anim::type animated);
 | 
						|
 | 
						|
	bool selectionMode() const;
 | 
						|
	bool searchMode() const;
 | 
						|
	Ui::StringWithNumbers generateSelectedText() const;
 | 
						|
	[[nodiscard]] bool computeCanDelete() const;
 | 
						|
	[[nodiscard]] bool computeCanForward() const;
 | 
						|
	void updateSelectionState();
 | 
						|
	void createSelectionControls();
 | 
						|
 | 
						|
	void performForward();
 | 
						|
	void performDelete();
 | 
						|
 | 
						|
	void setSearchField(
 | 
						|
		base::unique_qptr<Ui::InputField> field,
 | 
						|
		rpl::producer<bool> &&shown,
 | 
						|
		bool startsFocused);
 | 
						|
	void clearSearchField();
 | 
						|
	void createSearchView(
 | 
						|
		not_null<Ui::InputField*> field,
 | 
						|
		rpl::producer<bool> &&shown,
 | 
						|
		bool startsFocused);
 | 
						|
 | 
						|
	template <typename Callback>
 | 
						|
	void registerUpdateControlCallback(QObject *guard, Callback &&callback);
 | 
						|
 | 
						|
	template <typename Widget, typename IsVisible>
 | 
						|
	void registerToggleControlCallback(Widget *widget, IsVisible &&callback);
 | 
						|
 | 
						|
	const not_null<Window::SessionNavigation*> _navigation;
 | 
						|
 | 
						|
	const style::InfoTopBar &_st;
 | 
						|
	std::optional<Ui::RoundRect> _roundRect;
 | 
						|
	Ui::Animations::Simple _a_highlight;
 | 
						|
	bool _highlight = false;
 | 
						|
	QPointer<Ui::FadeWrap<Ui::IconButton>> _back;
 | 
						|
	std::vector<base::unique_qptr<Ui::RpWidget>> _buttons;
 | 
						|
	QPointer<Ui::FadeWrap<Ui::FlatLabel>> _title;
 | 
						|
 | 
						|
	bool _searchModeEnabled = false;
 | 
						|
	bool _searchModeAvailable = false;
 | 
						|
	base::unique_qptr<Ui::RpWidget> _searchView;
 | 
						|
	QPointer<Ui::InputField> _searchField;
 | 
						|
 | 
						|
	rpl::event_stream<> _backClicks;
 | 
						|
 | 
						|
	SelectedItems _selectedItems;
 | 
						|
	bool _canDelete = false;
 | 
						|
	bool _canForward = false;
 | 
						|
	QPointer<Ui::FadeWrap<Ui::IconButton>> _cancelSelection;
 | 
						|
	QPointer<Ui::FadeWrap<Ui::LabelWithNumbers>> _selectionText;
 | 
						|
	QPointer<Ui::FadeWrap<Ui::IconButton>> _forward;
 | 
						|
	QPointer<Ui::FadeWrap<Ui::IconButton>> _delete;
 | 
						|
	rpl::event_stream<SelectionAction> _selectionActionRequests;
 | 
						|
 | 
						|
	using UpdateCallback = Fn<bool(anim::type)>;
 | 
						|
	std::map<QObject*, UpdateCallback> _updateControlCallbacks;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
} // namespace Info
 |