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 #include "passport/passport_form_row.h"
9 
10 #include "ui/wrap/fade_wrap.h"
11 #include "ui/text_options.h"
12 #include "styles/style_boxes.h"
13 #include "styles/style_passport.h"
14 
15 namespace Passport {
16 
FormRow(QWidget * parent,const QString & title,const QString & description)17 FormRow::FormRow(
18 	QWidget *parent,
19 	const QString &title,
20 	const QString &description)
21 : RippleButton(parent, st::passportRowRipple)
22 , _title(
23 	st::semiboldTextStyle,
24 	title,
25 	Ui::NameTextOptions(),
26 	st::boxWideWidth / 2)
27 , _description(
28 	st::defaultTextStyle,
29 	description,
30 	Ui::NameTextOptions(),
31 	st::boxWideWidth / 2) {
32 }
33 
setReady(bool ready)34 void FormRow::setReady(bool ready) {
35 	_ready = ready;
36 	resizeToWidth(width());
37 	update();
38 }
39 
resizeGetHeight(int newWidth)40 int FormRow::resizeGetHeight(int newWidth) {
41 	const auto availableWidth = countAvailableWidth(newWidth);
42 	_titleHeight = _title.countHeight(availableWidth);
43 	_descriptionHeight = _description.countHeight(availableWidth);
44 	const auto result = st::passportRowPadding.top()
45 		+ _titleHeight
46 		+ st::passportRowSkip
47 		+ _descriptionHeight
48 		+ st::passportRowPadding.bottom();
49 	return result;
50 }
51 
countAvailableWidth(int newWidth) const52 int FormRow::countAvailableWidth(int newWidth) const {
53 	return newWidth
54 		- st::passportRowPadding.left()
55 		- st::passportRowPadding.right()
56 		- (_ready ? st::passportRowReadyIcon : st::passportRowEmptyIcon).width();
57 }
58 
countAvailableWidth() const59 int FormRow::countAvailableWidth() const {
60 	return countAvailableWidth(width());
61 }
62 
paintEvent(QPaintEvent * e)63 void FormRow::paintEvent(QPaintEvent *e) {
64 	Painter p(this);
65 
66 	const auto ms = getms();
67 	paintRipple(p, 0, 0, ms);
68 
69 	const auto left = st::passportRowPadding.left();
70 	const auto availableWidth = countAvailableWidth();
71 	auto top = st::passportRowPadding.top();
72 
73 	p.setPen(st::passportRowTitleFg);
74 	_title.drawLeft(p, left, top, availableWidth, width());
75 	top += _titleHeight + st::passportRowSkip;
76 
77 	p.setPen(st::passportRowDescriptionFg);
78 	_description.drawLeft(p, left, top, availableWidth, width());
79 	top += _descriptionHeight + st::passportRowPadding.bottom();
80 
81 	const auto &icon = _ready
82 		? st::passportRowReadyIcon
83 		: st::passportRowEmptyIcon;
84 	icon.paint(
85 		p,
86 		width() - st::passportRowPadding.right() - icon.width(),
87 		(height() - icon.height()) / 2,
88 		width());
89 }
90 
91 } // namespace Passport
92