100 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
	
		
			2.2 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/abstract_button.h"
 | 
						|
#include "base/timer.h"
 | 
						|
 | 
						|
namespace Ui {
 | 
						|
class LinkButton;
 | 
						|
} // namespace Ui
 | 
						|
 | 
						|
namespace Window {
 | 
						|
 | 
						|
class ConnectingWidget
 | 
						|
	: public Ui::AbstractButton
 | 
						|
	, private base::Subscriber {
 | 
						|
public:
 | 
						|
	ConnectingWidget(QWidget *parent);
 | 
						|
 | 
						|
	rpl::producer<float64> visibility() const;
 | 
						|
 | 
						|
	void finishAnimating();
 | 
						|
	void setForceHidden(bool hidden);
 | 
						|
	void setVisibleHook(bool visible) override;
 | 
						|
 | 
						|
	static base::unique_qptr<ConnectingWidget> CreateDefaultWidget(
 | 
						|
		Ui::RpWidget *parent,
 | 
						|
		rpl::producer<bool> shown);
 | 
						|
 | 
						|
protected:
 | 
						|
	void resizeEvent(QResizeEvent *e) override;
 | 
						|
	void paintEvent(QPaintEvent *e) override;
 | 
						|
 | 
						|
	void onStateChanged(State was, StateChangeSource source) override;
 | 
						|
 | 
						|
private:
 | 
						|
	class ProxyIcon;
 | 
						|
	struct State {
 | 
						|
		enum class Type {
 | 
						|
			Connected,
 | 
						|
			Connecting,
 | 
						|
			Waiting,
 | 
						|
		};
 | 
						|
		Type type = Type::Connected;
 | 
						|
		bool useProxy = false;
 | 
						|
		bool underCursor = false;
 | 
						|
		int waitTillRetry = 0;
 | 
						|
 | 
						|
		bool operator==(const State &other) const;
 | 
						|
 | 
						|
	};
 | 
						|
	struct Layout {
 | 
						|
		bool visible = false;
 | 
						|
		bool hasRetry = false;
 | 
						|
		bool proxyEnabled = false;
 | 
						|
		bool progressShown = false;
 | 
						|
		int contentWidth = 0;
 | 
						|
		QString text;
 | 
						|
		int textWidth = 0;
 | 
						|
 | 
						|
	};
 | 
						|
	void updateRetryGeometry();
 | 
						|
	void updateWidth();
 | 
						|
	void updateVisibility();
 | 
						|
	void refreshState();
 | 
						|
	void applyState(const State &state);
 | 
						|
	void changeVisibilityWithLayout(const Layout &layout);
 | 
						|
	void refreshRetryLink(bool hasRetry);
 | 
						|
	Layout computeLayout(const State &state) const;
 | 
						|
	void setLayout(const Layout &layout);
 | 
						|
	float64 currentVisibility() const;
 | 
						|
 | 
						|
	QRect innerRect() const;
 | 
						|
	QRect contentRect() const;
 | 
						|
	QRect textRect() const;
 | 
						|
 | 
						|
	base::Timer _refreshTimer;
 | 
						|
	State _state;
 | 
						|
	Layout _currentLayout;
 | 
						|
	TimeMs _connectingStartedAt = 0;
 | 
						|
	Animation _contentWidth;
 | 
						|
	Animation _visibility;
 | 
						|
	base::unique_qptr<Ui::LinkButton> _retry;
 | 
						|
	QPointer<Ui::RpWidget> _progress;
 | 
						|
	QPointer<ProxyIcon> _proxyIcon;
 | 
						|
	bool _forceHidden = false;
 | 
						|
	bool _realHidden = false;
 | 
						|
 | 
						|
	rpl::event_stream<float64> _visibilityValues;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
rpl::producer<bool> AdaptiveIsOneColumn();
 | 
						|
 | 
						|
} // namespace Window
 |