| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- 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
- */
- #include "window/window_history_hider.h"
- #include "lang/lang_keys.h"
- #include "ui/widgets/buttons.h"
- #include "ui/widgets/shadow.h"
- #include "ui/cached_round_corners.h"
- #include "mainwidget.h"
- #include "styles/style_layers.h"
- #include "styles/style_chat.h"
- namespace Window {
- HistoryHider::HistoryHider(QWidget *parent, const QString &text)
- : RpWidget(parent)
- , _text(text) {
- Lang::Updated(
- ) | rpl::start_with_next([=] {
- refreshLang();
- }, lifetime());
- _chooseWidth = st::historyForwardChooseFont->width(_text);
- resizeEvent(0);
- _a_opacity.start([=] { update(); }, 0., 1., st::boxDuration);
- }
- HistoryHider::~HistoryHider() = default;
- void HistoryHider::refreshLang() {
- InvokeQueued(this, [this] { updateControlsGeometry(); });
- }
- void HistoryHider::paintEvent(QPaintEvent *e) {
- auto p = QPainter(this);
- auto opacity = _a_opacity.value(_hiding ? 0. : 1.);
- if (opacity == 0.) {
- if (_hiding) {
- _hidden.fire({});
- }
- return;
- }
- p.setOpacity(opacity);
- p.fillRect(rect(), st::layerBg);
- p.setFont(st::historyForwardChooseFont);
- auto w = st::historyForwardChooseMargins.left() + _chooseWidth + st::historyForwardChooseMargins.right();
- auto h = st::historyForwardChooseMargins.top() + st::historyForwardChooseFont->height + st::historyForwardChooseMargins.bottom();
- Ui::FillRoundRect(p, (width() - w) / 2, (height() - h) / 2, w, h, st::historyForwardChooseBg, Ui::ForwardCorners);
- p.setPen(st::historyForwardChooseFg);
- p.drawText(_box, _text, QTextOption(style::al_center));
- }
- void HistoryHider::keyPressEvent(QKeyEvent *e) {
- if (e->key() == Qt::Key_Escape) {
- startHide();
- }
- }
- void HistoryHider::mousePressEvent(QMouseEvent *e) {
- if (e->button() == Qt::LeftButton) {
- if (!_box.contains(e->pos())) {
- startHide();
- }
- }
- }
- void HistoryHider::startHide() {
- if (_hiding) return;
- _hiding = true;
- _a_opacity.start([=] { animationCallback(); }, 1., 0., st::boxDuration);
- }
- void HistoryHider::animationCallback() {
- update();
- if (!_a_opacity.animating() && _hiding) {
- crl::on_main(this, [=] { _hidden.fire({}); });
- }
- }
- rpl::producer<> HistoryHider::hidden() const {
- return _hidden.events();
- }
- void HistoryHider::resizeEvent(QResizeEvent *e) {
- updateControlsGeometry();
- }
- void HistoryHider::updateControlsGeometry() {
- auto w = st::boxWidth;
- auto h = st::boxPadding.top() + st::boxPadding.bottom();
- h += st::historyForwardChooseFont->height;
- _box = QRect((width() - w) / 2, (height() - h) / 2, w, h);
- }
- } // namespace Window
|