mirror of https://github.com/procxx/kepka.git
Add custom userpic rendering for Saved Messages.
This commit is contained in:
parent
1d85c8a6b6
commit
aebdc2fd94
|
@ -78,6 +78,87 @@ void EmptyUserpic::paintSquare(Painter &p, int x, int y, int outerWidth, int siz
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EmptyUserpic::PaintSavedMessages(
|
||||||
|
Painter &p,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int outerWidth,
|
||||||
|
int size) {
|
||||||
|
x = rtl() ? (outerWidth - x - size) : x;
|
||||||
|
|
||||||
|
PainterHighQualityEnabler hq(p);
|
||||||
|
p.setBrush(st::historyPeer4UserpicBg);
|
||||||
|
p.setPen(Qt::NoPen);
|
||||||
|
p.drawEllipse(x, y, size, size);
|
||||||
|
|
||||||
|
// |<----width----->|
|
||||||
|
//
|
||||||
|
// XXXXXXXXXXXXXXXXXX ---
|
||||||
|
// X X |
|
||||||
|
// X X |
|
||||||
|
// X X |
|
||||||
|
// X X height
|
||||||
|
// X XX X | ---
|
||||||
|
// X XX XX X | |
|
||||||
|
// X XX XX X | add
|
||||||
|
// X XX XX X | |
|
||||||
|
// XX XX --- ---
|
||||||
|
|
||||||
|
const auto thinkness = std::round(size * 0.055);
|
||||||
|
const auto increment = int(thinkness) % 2 + (size % 2);
|
||||||
|
const auto width = std::round(size * 0.15) * 2 + increment;
|
||||||
|
const auto height = std::round(size * 0.19) * 2 + increment;
|
||||||
|
const auto add = std::round(size * 0.064);
|
||||||
|
|
||||||
|
const auto left = x + (size - width) / 2;
|
||||||
|
const auto top = y + (size - height) / 2;
|
||||||
|
const auto right = left + width;
|
||||||
|
const auto bottom = top + height;
|
||||||
|
const auto middle = (left + right) / 2;
|
||||||
|
const auto half = (top + bottom) / 2;
|
||||||
|
|
||||||
|
p.setBrush(Qt::NoBrush);
|
||||||
|
auto pen = st::historyPeerUserpicFg->p;
|
||||||
|
pen.setWidthF(thinkness);
|
||||||
|
pen.setCapStyle(Qt::FlatCap);
|
||||||
|
|
||||||
|
{
|
||||||
|
// XXXXXXXXXXXXXXXXXX
|
||||||
|
// X X
|
||||||
|
// X X
|
||||||
|
// X X
|
||||||
|
// X X
|
||||||
|
// X X
|
||||||
|
|
||||||
|
pen.setJoinStyle(Qt::RoundJoin);
|
||||||
|
p.setPen(pen);
|
||||||
|
QPainterPath path;
|
||||||
|
path.moveTo(left, half);
|
||||||
|
path.lineTo(left, top);
|
||||||
|
path.lineTo(right, top);
|
||||||
|
path.lineTo(right, half);
|
||||||
|
p.drawPath(path);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
// X X
|
||||||
|
// X XX X
|
||||||
|
// X XX XX X
|
||||||
|
// X XX XX X
|
||||||
|
// X XX XX X
|
||||||
|
// XX XX
|
||||||
|
|
||||||
|
pen.setJoinStyle(Qt::MiterJoin);
|
||||||
|
p.setPen(pen);
|
||||||
|
QPainterPath path;
|
||||||
|
path.moveTo(left, half);
|
||||||
|
path.lineTo(left, bottom);
|
||||||
|
path.lineTo(middle, bottom - add);
|
||||||
|
path.lineTo(right, bottom);
|
||||||
|
path.lineTo(right, half);
|
||||||
|
p.drawPath(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StorageKey EmptyUserpic::uniqueKey() const {
|
StorageKey EmptyUserpic::uniqueKey() const {
|
||||||
auto first = 0xFFFFFFFF00000000ULL | anim::getPremultiplied(_color->c);
|
auto first = 0xFFFFFFFF00000000ULL | anim::getPremultiplied(_color->c);
|
||||||
auto second = uint64(0);
|
auto second = uint64(0);
|
||||||
|
|
|
@ -47,6 +47,13 @@ public:
|
||||||
QPixmap generate(int size);
|
QPixmap generate(int size);
|
||||||
StorageKey uniqueKey() const;
|
StorageKey uniqueKey() const;
|
||||||
|
|
||||||
|
static void PaintSavedMessages(
|
||||||
|
Painter &p,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int outerWidth,
|
||||||
|
int size);
|
||||||
|
|
||||||
~EmptyUserpic();
|
~EmptyUserpic();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -24,6 +24,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
|
||||||
#include "styles/style_history.h"
|
#include "styles/style_history.h"
|
||||||
#include "dialogs/dialogs_layout.h"
|
#include "dialogs/dialogs_layout.h"
|
||||||
#include "ui/effects/ripple_animation.h"
|
#include "ui/effects/ripple_animation.h"
|
||||||
|
#include "ui/empty_userpic.h"
|
||||||
#include "data/data_photo.h"
|
#include "data/data_photo.h"
|
||||||
#include "core/file_utilities.h"
|
#include "core/file_utilities.h"
|
||||||
#include "boxes/photo_crop_box.h"
|
#include "boxes/photo_crop_box.h"
|
||||||
|
@ -522,11 +523,20 @@ void UserpicButton::paintEvent(QPaintEvent *e) {
|
||||||
auto photoTop = photoPosition.y();
|
auto photoTop = photoPosition.y();
|
||||||
|
|
||||||
auto ms = getms();
|
auto ms = getms();
|
||||||
if (_a_appearance.animating(ms)) {
|
if (showSavedMessages()) {
|
||||||
p.drawPixmapLeft(photoPosition, width(), _oldUserpic);
|
Ui::EmptyUserpic::PaintSavedMessages(
|
||||||
p.setOpacity(_a_appearance.current());
|
p,
|
||||||
|
photoPosition.x(),
|
||||||
|
photoPosition.y(),
|
||||||
|
width(),
|
||||||
|
_st.photoSize);
|
||||||
|
} else {
|
||||||
|
if (_a_appearance.animating(ms)) {
|
||||||
|
p.drawPixmapLeft(photoPosition, width(), _oldUserpic);
|
||||||
|
p.setOpacity(_a_appearance.current());
|
||||||
|
}
|
||||||
|
p.drawPixmapLeft(photoPosition, width(), _userpic);
|
||||||
}
|
}
|
||||||
p.drawPixmapLeft(photoPosition, width(), _userpic);
|
|
||||||
|
|
||||||
if (_role == Role::ChangePhoto) {
|
if (_role == Role::ChangePhoto) {
|
||||||
auto over = isOver() || isDown();
|
auto over = isOver() || isDown();
|
||||||
|
@ -743,6 +753,17 @@ void UserpicButton::switchChangePhotoOverlay(bool enabled) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UserpicButton::showSavedMessagesOnSelf(bool enabled) {
|
||||||
|
if (_showSavedMessagesOnSelf != enabled) {
|
||||||
|
_showSavedMessagesOnSelf = enabled;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UserpicButton::showSavedMessages() const {
|
||||||
|
return _showSavedMessagesOnSelf && _peer && _peer->isSelf();
|
||||||
|
}
|
||||||
|
|
||||||
void UserpicButton::startChangeOverlayAnimation() {
|
void UserpicButton::startChangeOverlayAnimation() {
|
||||||
auto over = isOver() || isDown();
|
auto over = isOver() || isDown();
|
||||||
_changeOverlayShown.start(
|
_changeOverlayShown.start(
|
||||||
|
|
|
@ -170,6 +170,7 @@ public:
|
||||||
const style::UserpicButton &st);
|
const style::UserpicButton &st);
|
||||||
|
|
||||||
void switchChangePhotoOverlay(bool enabled);
|
void switchChangePhotoOverlay(bool enabled);
|
||||||
|
void showSavedMessagesOnSelf(bool enabled);
|
||||||
|
|
||||||
QImage takeResultImage() {
|
QImage takeResultImage() {
|
||||||
return std::move(_result);
|
return std::move(_result);
|
||||||
|
@ -199,6 +200,7 @@ private:
|
||||||
void updateCursorInChangeOverlay(QPoint localPos);
|
void updateCursorInChangeOverlay(QPoint localPos);
|
||||||
void setCursorInChangeOverlay(bool inOverlay);
|
void setCursorInChangeOverlay(bool inOverlay);
|
||||||
void updateCursor();
|
void updateCursor();
|
||||||
|
bool showSavedMessages() const;
|
||||||
|
|
||||||
void grabOldUserpic();
|
void grabOldUserpic();
|
||||||
void setClickHandlerByRole();
|
void setClickHandlerByRole();
|
||||||
|
@ -220,6 +222,7 @@ private:
|
||||||
Animation _a_appearance;
|
Animation _a_appearance;
|
||||||
QImage _result;
|
QImage _result;
|
||||||
|
|
||||||
|
bool _showSavedMessagesOnSelf = false;
|
||||||
bool _canOpenPhoto = false;
|
bool _canOpenPhoto = false;
|
||||||
bool _cursorInChangeOverlay = false;
|
bool _cursorInChangeOverlay = false;
|
||||||
bool _changeOverlayEnabled = false;
|
bool _changeOverlayEnabled = false;
|
||||||
|
|
Loading…
Reference in New Issue