105 lines
3.4 KiB
C++
105 lines
3.4 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop version of Telegram messaging app, see https://telegram.org
|
|
|
|
Telegram Desktop is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
It is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
In addition, as a special exception, the copyright holders give permission
|
|
to link the code of portions of this program with the OpenSSL library.
|
|
|
|
Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
|
|
Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
|
|
*/
|
|
#include "profile/profile_cover_drop_area.h"
|
|
|
|
#include "styles/style_profile.h"
|
|
|
|
namespace Profile {
|
|
|
|
CoverDropArea::CoverDropArea(QWidget *parent, const QString &title, const QString &subtitle) : TWidget(parent)
|
|
, _title(title)
|
|
, _subtitle(subtitle)
|
|
, _titleWidth(st::profileDropAreaTitleFont->width(_title))
|
|
, _subtitleWidth(st::profileDropAreaSubtitleFont->width(_subtitle)) {
|
|
}
|
|
|
|
void CoverDropArea::showAnimated() {
|
|
show();
|
|
_hiding = false;
|
|
setupAnimation();
|
|
}
|
|
|
|
void CoverDropArea::hideAnimated(HideFinishCallback &&callback) {
|
|
_hideFinishCallback = std::move(callback);
|
|
_hiding = true;
|
|
setupAnimation();
|
|
}
|
|
|
|
void CoverDropArea::paintEvent(QPaintEvent *e) {
|
|
Painter p(this);
|
|
|
|
if (_a_appearance.animating(getms())) {
|
|
p.setOpacity(_a_appearance.current());
|
|
p.drawPixmap(0, 0, _cache);
|
|
return;
|
|
}
|
|
|
|
if (!_cache.isNull()) {
|
|
_cache = QPixmap();
|
|
if (_hiding) {
|
|
hide();
|
|
if (_hideFinishCallback) {
|
|
_hideFinishCallback(this);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
p.fillRect(e->rect(), st::profileDropAreaBg);
|
|
|
|
if (width() < st::profileDropAreaPadding.left() + st::profileDropAreaPadding.right()) return;
|
|
if (height() < st::profileDropAreaPadding.top() + st::profileDropAreaPadding.bottom()) return;
|
|
|
|
auto border = st::profileDropAreaBorderWidth;
|
|
auto &borderFg = st::profileDropAreaBorderFg;
|
|
auto inner = rect().marginsRemoved(st::profileDropAreaPadding);
|
|
p.fillRect(inner.x(), inner.y(), inner.width(), border, borderFg);
|
|
p.fillRect(inner.x(), inner.y() + inner.height() - border, inner.width(), border, borderFg);
|
|
p.fillRect(inner.x(), inner.y() + border, border, inner.height() - 2 * border, borderFg);
|
|
p.fillRect(inner.x() + inner.width() - border, inner.y() + border, border, inner.height() - 2 * border, borderFg);
|
|
|
|
int titleLeft = inner.x() + (inner.width() - _titleWidth) / 2;
|
|
int titleTop = inner.y() + st::profileDropAreaTitleTop + st::profileDropAreaTitleFont->ascent;
|
|
p.setFont(st::profileDropAreaTitleFont);
|
|
p.setPen(st::profileDropAreaFg);
|
|
p.drawText(titleLeft, titleTop, _title);
|
|
|
|
int subtitleLeft = inner.x() + (inner.width() - _subtitleWidth) / 2;
|
|
int subtitleTop = inner.y() + st::profileDropAreaSubtitleTop + st::profileDropAreaSubtitleFont->ascent;
|
|
p.setFont(st::profileDropAreaSubtitleFont);
|
|
p.setPen(st::profileDropAreaFg);
|
|
p.drawText(subtitleLeft, subtitleTop, _subtitle);
|
|
}
|
|
|
|
void CoverDropArea::setupAnimation() {
|
|
if (_cache.isNull()) {
|
|
_cache = Ui::GrabWidget(this);
|
|
}
|
|
auto from = _hiding ? 1. : 0., to = _hiding ? 0. : 1.;
|
|
_a_appearance.start(
|
|
[this] { update(); },
|
|
from,
|
|
to,
|
|
st::profileDropAreaDuration);
|
|
}
|
|
|
|
} // namespace Profile
|