1 /*
2 This file is part of Telegram Desktop,
3 the official desktop application for the Telegram messaging service.
4 
5 For license and copyright information please follow this link:
6 https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
7 */
8 #pragma once
9 
10 #include "boxes/abstract_box.h"
11 
12 namespace Ui {
13 
14 class InformBox;
15 class ConfirmBox : public Ui::BoxContent, public ClickHandlerHost {
16 public:
17 
18 	using ConfirmedCallback = std::variant<
19 		v::null_t,
20 		FnMut<void()>,
21 		FnMut<void(Fn<void()>)>>;
22 
23 	ConfirmBox(
24 		QWidget*,
25 		const QString &text,
26 		ConfirmedCallback confirmedCallback = FnMut<void()>(),
27 		FnMut<void()> cancelledCallback = FnMut<void()>());
28 	ConfirmBox(
29 		QWidget*,
30 		const QString &text,
31 		const QString &confirmText,
32 		ConfirmedCallback confirmedCallback = FnMut<void()>(),
33 		FnMut<void()> cancelledCallback = FnMut<void()>());
34 	ConfirmBox(
35 		QWidget*,
36 		const QString &text,
37 		const QString &confirmText,
38 		const style::RoundButton &confirmStyle,
39 		ConfirmedCallback confirmedCallback = FnMut<void()>(),
40 		FnMut<void()> cancelledCallback = FnMut<void()>());
41 	ConfirmBox(
42 		QWidget*,
43 		const QString &text,
44 		const QString &confirmText,
45 		const QString &cancelText,
46 		ConfirmedCallback confirmedCallback = FnMut<void()>(),
47 		FnMut<void()> cancelledCallback = FnMut<void()>());
48 	ConfirmBox(
49 		QWidget*,
50 		const QString &text,
51 		const QString &confirmText,
52 		const style::RoundButton &confirmStyle,
53 		const QString &cancelText,
54 		ConfirmedCallback confirmedCallback = FnMut<void()>(),
55 		FnMut<void()> cancelledCallback = FnMut<void()>());
56 	ConfirmBox(
57 		QWidget*,
58 		const TextWithEntities &text,
59 		const QString &confirmText,
60 		ConfirmedCallback confirmedCallback = v::null,
61 		FnMut<void()> cancelledCallback = nullptr);
62 
63 	void updateLink();
64 
65 	// If strict cancel is set the cancelledCallback is only called
66 	// if the cancel button was pressed.
setStrictCancel(bool strictCancel)67 	void setStrictCancel(bool strictCancel) {
68 		_strictCancel = strictCancel;
69 	}
70 
71 	void setMaxLineCount(int count);
72 
73 	// ClickHandlerHost interface
74 	void clickHandlerActiveChanged(
75 		const ClickHandlerPtr &p,
76 		bool active) override;
77 	void clickHandlerPressedChanged(
78 		const ClickHandlerPtr &p,
79 		bool pressed) override;
80 
81 protected:
82 	void prepare() override;
83 
84 	void keyPressEvent(QKeyEvent *e) override;
85 	void paintEvent(QPaintEvent *e) override;
86 	void mouseMoveEvent(QMouseEvent *e) override;
87 	void mousePressEvent(QMouseEvent *e) override;
88 	void mouseReleaseEvent(QMouseEvent *e) override;
89 	void leaveEventHook(QEvent *e) override;
90 
91 private:
92 	struct InformBoxTag {
93 	};
94 	ConfirmBox(
95 		const InformBoxTag &,
96 		const QString &text,
97 		const QString &doneText,
98 		Fn<void()> closedCallback);
99 	ConfirmBox(
100 		const InformBoxTag &,
101 		const TextWithEntities &text,
102 		const QString &doneText,
103 		Fn<void()> closedCallback);
104 	FnMut<void()> generateInformCallback(Fn<void()> closedCallback);
105 	friend class InformBox;
106 
107 	void confirmed();
108 	void init(const QString &text);
109 	void init(const TextWithEntities &text);
110 	void textUpdated();
111 	void updateHover();
112 
113 	QString _confirmText;
114 	QString _cancelText;
115 	const style::RoundButton &_confirmStyle;
116 	bool _informative = false;
117 
118 	Ui::Text::String _text;
119 	int _textWidth = 0;
120 	int _textHeight = 0;
121 	int _maxLineCount = 16;
122 
123 	QPoint _lastMousePos;
124 
125 	bool _confirmed = false;
126 	bool _cancelled = false;
127 	bool _strictCancel = false;
128 	ConfirmBox::ConfirmedCallback _confirmedCallback;
129 	FnMut<void()> _cancelledCallback;
130 
131 };
132 
133 class InformBox : public ConfirmBox {
134 public:
135 	InformBox(
136 		QWidget*,
137 		const QString &text,
138 		Fn<void()> closedCallback = nullptr);
139 	InformBox(
140 		QWidget*,
141 		const QString &text,
142 		const QString &doneText,
143 		Fn<void()> closedCallback = nullptr);
144 	InformBox(
145 		QWidget*,
146 		const TextWithEntities &text,
147 		Fn<void()> closedCallback = nullptr);
148 	InformBox(
149 		QWidget*,
150 		const TextWithEntities &text,
151 		const QString &doneText,
152 		Fn<void()> closedCallback = nullptr);
153 
154 };
155 
156 class ConfirmDontWarnBox : public Ui::BoxContent {
157 public:
158 	ConfirmDontWarnBox(
159 		QWidget*,
160 		rpl::producer<TextWithEntities> text,
161 		const QString &checkbox,
162 		rpl::producer<QString> confirm,
163 		FnMut<void(bool)> callback);
164 
165 protected:
166 	void prepare() override;
167 
168 private:
169 	not_null<Ui::RpWidget*> setupContent(
170 		rpl::producer<TextWithEntities> text,
171 		const QString &checkbox,
172 		FnMut<void(bool)> callback);
173 
174 	rpl::producer<QString> _confirm;
175 	FnMut<void()> _callback;
176 	not_null<Ui::RpWidget*> _content;
177 
178 };
179 
180 } // namespace Ui
181