mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2026-07-25 23:12:10 +00:00
3d6b1feee0
Related commit: 29ca797b3b.
138 lines
3.4 KiB
C++
138 lines
3.4 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
|
|
*/
|
|
#include "profile/profile_back_button.h"
|
|
|
|
#include "ui/text/text.h"
|
|
#include "styles/style_widgets.h"
|
|
#include "styles/style_window.h"
|
|
#include "styles/style_profile.h"
|
|
#include "styles/style_info.h"
|
|
#include "styles/style_chat.h"
|
|
#include "styles/style_dialogs.h"
|
|
|
|
#include <QGraphicsOpacityEffect>
|
|
|
|
namespace Profile {
|
|
|
|
BackButton::BackButton(QWidget *parent) : Ui::AbstractButton(parent) {
|
|
setCursor(style::cur_pointer);
|
|
}
|
|
|
|
void BackButton::setText(const QString &text) {
|
|
_text.setText(st::semiboldTextStyle, text);
|
|
_cachedWidth = -1;
|
|
update();
|
|
}
|
|
|
|
void BackButton::setSubtext(const QString &subtext) {
|
|
_subtext.setText(st::defaultTextStyle, subtext);
|
|
_cachedWidth = -1;
|
|
update();
|
|
}
|
|
|
|
void BackButton::setWidget(not_null<Ui::RpWidget*> widget) {
|
|
_widget = widget;
|
|
_widget->setParent(this);
|
|
_widget->show();
|
|
_widget->move(
|
|
st::historyAdminLogTopBarLeft + st::historyAdminLogTopBarUserpicSkip,
|
|
(st::profileTopBarHeight - _widget->height()) / 2);
|
|
_cachedWidth = -1;
|
|
update();
|
|
}
|
|
|
|
void BackButton::setOpacity(float64 opacity) {
|
|
_opacity = opacity;
|
|
if (_widget) {
|
|
if (opacity < 1.) {
|
|
if (!_opacityEffect) {
|
|
_opacityEffect = Ui::CreateChild<QGraphicsOpacityEffect>(
|
|
_widget);
|
|
_widget->setGraphicsEffect(_opacityEffect);
|
|
}
|
|
_opacityEffect->setOpacity(opacity);
|
|
} else {
|
|
_widget->setGraphicsEffect(nullptr);
|
|
_opacityEffect = nullptr;
|
|
}
|
|
}
|
|
update();
|
|
}
|
|
|
|
int BackButton::resizeGetHeight(int newWidth) {
|
|
_cachedWidth = -1;
|
|
return st::profileTopBarHeight;
|
|
}
|
|
|
|
void BackButton::updateCache() {
|
|
if (_cachedWidth == width()) {
|
|
return;
|
|
}
|
|
_cachedWidth = width();
|
|
const auto widgetWidth = _widget
|
|
? _widget->width() + st::historyAdminLogTopBarUserpicSkip
|
|
: 0;
|
|
const auto availableWidth = width()
|
|
- st::historyAdminLogTopBarLeft
|
|
- widgetWidth;
|
|
_elisionWidth = availableWidth;
|
|
}
|
|
|
|
void BackButton::paintEvent(QPaintEvent *e) {
|
|
updateCache();
|
|
|
|
auto p = QPainter(this);
|
|
|
|
p.fillRect(e->rect(), st::profileBg);
|
|
st::topBarBack.paint(
|
|
p,
|
|
st::historyAdminLogTopBarLeft,
|
|
(st::topBarHeight - st::topBarBack.height()) / 2,
|
|
width());
|
|
p.setOpacity(_opacity);
|
|
|
|
const auto textHeight = st::semiboldFont->height;
|
|
const auto subtextHeight = st::dialogsTextFont->height;
|
|
const auto totalHeight = _subtext.isEmpty()
|
|
? textHeight
|
|
: textHeight + subtextHeight;
|
|
const auto startY = (height() - totalHeight) / 2 - st::lineWidth;
|
|
const auto widgetWidth = _widget
|
|
? _widget->width() + st::historyAdminLogTopBarUserpicSkip
|
|
: 0;
|
|
const auto textX = st::historyAdminLogTopBarLeft + widgetWidth;
|
|
|
|
const auto context = Ui::Text::PaintContext{
|
|
.position = QPoint{ textX, startY },
|
|
.outerWidth = width(),
|
|
.availableWidth = _elisionWidth,
|
|
.elisionLines = 1,
|
|
};
|
|
p.setPen(st::dialogsNameFg);
|
|
_text.draw(p, context);
|
|
|
|
if (!_subtext.isEmpty()) {
|
|
const auto subtextContext = Ui::Text::PaintContext{
|
|
.position = { textX, startY + textHeight + st::lineWidth * 2 },
|
|
.outerWidth = width(),
|
|
.availableWidth = _elisionWidth,
|
|
.elisionLines = 1,
|
|
};
|
|
p.setPen(st::historyStatusFg);
|
|
_subtext.draw(p, subtextContext);
|
|
}
|
|
}
|
|
|
|
void BackButton::onStateChanged(State was, StateChangeSource source) {
|
|
if (isDown() && !(was & StateFlag::Down)) {
|
|
clicked(Qt::KeyboardModifiers(), Qt::LeftButton);
|
|
}
|
|
}
|
|
|
|
} // namespace Profile
|