mirror of https://github.com/procxx/kepka.git
Improved service messages layout.
This commit is contained in:
parent
d98a6d3f82
commit
5c474aee27
|
@ -666,7 +666,7 @@ scrollDef: flatScroll {
|
||||||
}
|
}
|
||||||
|
|
||||||
msgRadius: 16px;
|
msgRadius: 16px;
|
||||||
serviceMsgRadius: 10px;
|
dateRadius: 10px;
|
||||||
buttonRadius: 3px;
|
buttonRadius: 3px;
|
||||||
|
|
||||||
scrollCountries: flatScroll(scrollDef) {
|
scrollCountries: flatScroll(scrollDef) {
|
||||||
|
|
|
@ -2112,12 +2112,12 @@ namespace {
|
||||||
::cornersMaskSmall[i]->setDevicePixelRatio(cRetinaFactor());
|
::cornersMaskSmall[i]->setDevicePixelRatio(cRetinaFactor());
|
||||||
}
|
}
|
||||||
prepareCorners(WhiteCorners, st::buttonRadius, st::white);
|
prepareCorners(WhiteCorners, st::buttonRadius, st::white);
|
||||||
prepareCorners(ServiceCorners, st::serviceMsgRadius, st::msgServiceBg);
|
prepareCorners(StickerCorners, st::dateRadius, st::msgServiceBg);
|
||||||
prepareCorners(ServiceSelectedCorners, st::serviceMsgRadius, st::msgServiceSelectBg);
|
prepareCorners(StickerSelectedCorners, st::dateRadius, st::msgServiceSelectBg);
|
||||||
prepareCorners(SelectedOverlaySmallCorners, st::buttonRadius, st::msgSelectOverlay);
|
prepareCorners(SelectedOverlaySmallCorners, st::buttonRadius, st::msgSelectOverlay);
|
||||||
prepareCorners(SelectedOverlayLargeCorners, st::msgRadius, st::msgSelectOverlay);
|
prepareCorners(SelectedOverlayLargeCorners, st::msgRadius, st::msgSelectOverlay);
|
||||||
prepareCorners(DateCorners, st::serviceMsgRadius, st::msgDateImgBg);
|
prepareCorners(DateCorners, st::dateRadius, st::msgDateImgBg);
|
||||||
prepareCorners(DateSelectedCorners, st::serviceMsgRadius, st::msgDateImgBgSelected);
|
prepareCorners(DateSelectedCorners, st::dateRadius, st::msgDateImgBgSelected);
|
||||||
prepareCorners(InShadowCorners, st::msgRadius, st::msgInShadow);
|
prepareCorners(InShadowCorners, st::msgRadius, st::msgInShadow);
|
||||||
prepareCorners(InSelectedShadowCorners, st::msgRadius, st::msgInShadowSelected);
|
prepareCorners(InSelectedShadowCorners, st::msgRadius, st::msgInShadowSelected);
|
||||||
prepareCorners(ForwardCorners, st::msgRadius, st::forwardBg);
|
prepareCorners(ForwardCorners, st::msgRadius, st::forwardBg);
|
||||||
|
@ -2768,8 +2768,8 @@ namespace {
|
||||||
uchar bsel = snap(qRound(((1. - alphaSel) * b + addSel) / alphaSel), 0, 0xFF);
|
uchar bsel = snap(qRound(((1. - alphaSel) * b + addSel) / alphaSel), 0, 0xFF);
|
||||||
_msgServiceSelectBg = style::color(r, g, b, qRound(alphaSel * 0xFF));
|
_msgServiceSelectBg = style::color(r, g, b, qRound(alphaSel * 0xFF));
|
||||||
|
|
||||||
prepareCorners(ServiceCorners, st::serviceMsgRadius, _msgServiceBg);
|
prepareCorners(StickerCorners, st::dateRadius, _msgServiceBg);
|
||||||
prepareCorners(ServiceSelectedCorners, st::serviceMsgRadius, _msgServiceSelectBg);
|
prepareCorners(StickerSelectedCorners, st::dateRadius, _msgServiceSelectBg);
|
||||||
|
|
||||||
uchar rScroll = uchar(componentsScroll[0]), gScroll = uchar(componentsScroll[1]), bScroll = uchar(componentsScroll[2]);
|
uchar rScroll = uchar(componentsScroll[0]), gScroll = uchar(componentsScroll[1]), bScroll = uchar(componentsScroll[2]);
|
||||||
_historyScrollBarColor = style::color(rScroll, gScroll, bScroll, qRound(st::historyScroll.barColor->c.alphaF() * 0xFF));
|
_historyScrollBarColor = style::color(rScroll, gScroll, bScroll, qRound(st::historyScroll.barColor->c.alphaF() * 0xFF));
|
||||||
|
|
|
@ -5043,7 +5043,7 @@ void HistorySticker::draw(Painter &p, const QRect &r, TextSelection selection, u
|
||||||
// Make the bottom of the rect at the same level as the bottom of the info rect.
|
// Make the bottom of the rect at the same level as the bottom of the info rect.
|
||||||
recty -= st::msgDateImgDelta;
|
recty -= st::msgDateImgDelta;
|
||||||
|
|
||||||
App::roundRect(p, rectx, recty, rectw, recth, selected ? App::msgServiceSelectBg() : App::msgServiceBg(), selected ? ServiceSelectedCorners : ServiceCorners);
|
App::roundRect(p, rectx, recty, rectw, recth, selected ? App::msgServiceSelectBg() : App::msgServiceBg(), selected ? StickerSelectedCorners : StickerCorners);
|
||||||
rectx += st::msgReplyPadding.left();
|
rectx += st::msgReplyPadding.left();
|
||||||
rectw -= st::msgReplyPadding.left() + st::msgReplyPadding.right();
|
rectw -= st::msgReplyPadding.left() + st::msgReplyPadding.right();
|
||||||
if (via) {
|
if (via) {
|
||||||
|
@ -6561,7 +6561,7 @@ void HistoryMessage::KeyboardStyle::repaint(const HistoryItem *item) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistoryMessage::KeyboardStyle::paintButtonBg(Painter &p, const QRect &rect, bool down, float64 howMuchOver) const {
|
void HistoryMessage::KeyboardStyle::paintButtonBg(Painter &p, const QRect &rect, bool down, float64 howMuchOver) const {
|
||||||
App::roundRect(p, rect, App::msgServiceBg(), ServiceCorners);
|
App::roundRect(p, rect, App::msgServiceBg(), StickerCorners);
|
||||||
if (down) {
|
if (down) {
|
||||||
howMuchOver = 1.;
|
howMuchOver = 1.;
|
||||||
}
|
}
|
||||||
|
@ -7289,7 +7289,7 @@ void HistoryMessage::drawInfo(Painter &p, int32 right, int32 bottom, int32 width
|
||||||
App::roundRect(p, dateX - st::msgDateImgPadding.x(), dateY - st::msgDateImgPadding.y(), dateW, dateH, selected ? st::msgDateImgBgSelected : st::msgDateImgBg, selected ? DateSelectedCorners : DateCorners);
|
App::roundRect(p, dateX - st::msgDateImgPadding.x(), dateY - st::msgDateImgPadding.y(), dateW, dateH, selected ? st::msgDateImgBgSelected : st::msgDateImgBg, selected ? DateSelectedCorners : DateCorners);
|
||||||
} else if (type == InfoDisplayOverBackground) {
|
} else if (type == InfoDisplayOverBackground) {
|
||||||
int32 dateW = infoW + 2 * st::msgDateImgPadding.x(), dateH = st::msgDateFont->height + 2 * st::msgDateImgPadding.y();
|
int32 dateW = infoW + 2 * st::msgDateImgPadding.x(), dateH = st::msgDateFont->height + 2 * st::msgDateImgPadding.y();
|
||||||
App::roundRect(p, dateX - st::msgDateImgPadding.x(), dateY - st::msgDateImgPadding.y(), dateW, dateH, selected ? App::msgServiceSelectBg() : App::msgServiceBg(), selected ? ServiceSelectedCorners : ServiceCorners);
|
App::roundRect(p, dateX - st::msgDateImgPadding.x(), dateY - st::msgDateImgPadding.y(), dateW, dateH, selected ? App::msgServiceSelectBg() : App::msgServiceBg(), selected ? StickerSelectedCorners : StickerCorners);
|
||||||
}
|
}
|
||||||
dateX += HistoryMessage::timeLeft();
|
dateX += HistoryMessage::timeLeft();
|
||||||
|
|
||||||
|
|
|
@ -45,3 +45,7 @@ membersInnerDropdown: InnerDropdown(defaultInnerDropdown) {
|
||||||
}
|
}
|
||||||
historyToDownBadgeFont: semiboldFont;
|
historyToDownBadgeFont: semiboldFont;
|
||||||
historyToDownBadgeSize: 22px;
|
historyToDownBadgeSize: 22px;
|
||||||
|
|
||||||
|
historyServiceMsgRadius: 12px;
|
||||||
|
historyServiceMsgInvertedRadius: 6px;
|
||||||
|
historyServiceMsgInvertedShrink: 4px;
|
||||||
|
|
|
@ -22,6 +22,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
||||||
#include "history/history_service_layout.h"
|
#include "history/history_service_layout.h"
|
||||||
|
|
||||||
#include "data/data_abstract_structure.h"
|
#include "data/data_abstract_structure.h"
|
||||||
|
#include "styles/style_history.h"
|
||||||
#include "mainwidget.h"
|
#include "mainwidget.h"
|
||||||
#include "lang.h"
|
#include "lang.h"
|
||||||
|
|
||||||
|
@ -58,14 +59,17 @@ void createCircleMasks() {
|
||||||
serviceMessageStyle.createIfNull();
|
serviceMessageStyle.createIfNull();
|
||||||
if (!serviceMessageStyle->circle[NormalMask].isNull()) return;
|
if (!serviceMessageStyle->circle[NormalMask].isNull()) return;
|
||||||
|
|
||||||
int size = st::serviceMsgRadius * 2;
|
int size = st::historyServiceMsgRadius * 2;
|
||||||
serviceMessageStyle->circle[NormalMask] = style::createCircleMask(size);
|
serviceMessageStyle->circle[NormalMask] = style::createCircleMask(size);
|
||||||
serviceMessageStyle->circle[InvertedMask] = style::createInvertedCircleMask(size);
|
int sizeInverted = st::historyServiceMsgInvertedRadius * 2;
|
||||||
|
serviceMessageStyle->circle[InvertedMask] = style::createInvertedCircleMask(sizeInverted);
|
||||||
}
|
}
|
||||||
|
|
||||||
QPixmap circleCorner(int corner) {
|
QPixmap circleCorner(int corner) {
|
||||||
if (serviceMessageStyle->corners[corner].isNull()) {
|
if (serviceMessageStyle->corners[corner].isNull()) {
|
||||||
int size = st::serviceMsgRadius * cIntRetinaFactor();
|
int maskType = corner / MaskMultiplier;
|
||||||
|
int radius = (maskType == NormalMask ? st::historyServiceMsgRadius : st::historyServiceMsgInvertedRadius);
|
||||||
|
int size = radius * cIntRetinaFactor();
|
||||||
|
|
||||||
int xoffset = 0, yoffset = 0;
|
int xoffset = 0, yoffset = 0;
|
||||||
if (corner & CornerRight) {
|
if (corner & CornerRight) {
|
||||||
|
@ -74,7 +78,6 @@ QPixmap circleCorner(int corner) {
|
||||||
if (corner & CornerBottom) {
|
if (corner & CornerBottom) {
|
||||||
yoffset = size;
|
yoffset = size;
|
||||||
}
|
}
|
||||||
int maskType = corner / MaskMultiplier;
|
|
||||||
auto part = QRect(xoffset, yoffset, size, size);
|
auto part = QRect(xoffset, yoffset, size, size);
|
||||||
auto result = style::colorizeImage(serviceMessageStyle->circle[maskType], App::msgServiceBg(), part);
|
auto result = style::colorizeImage(serviceMessageStyle->circle[maskType], App::msgServiceBg(), part);
|
||||||
result.setDevicePixelRatio(cRetinaFactor());
|
result.setDevicePixelRatio(cRetinaFactor());
|
||||||
|
@ -116,11 +119,22 @@ int paintBubbleSide(Painter &p, int x, int y, int width, SideStyle style, Corner
|
||||||
}
|
}
|
||||||
|
|
||||||
void paintBubblePart(Painter &p, int x, int y, int width, int height, SideStyle topStyle, SideStyle bottomStyle) {
|
void paintBubblePart(Painter &p, int x, int y, int width, int height, SideStyle topStyle, SideStyle bottomStyle) {
|
||||||
|
if (topStyle == SideStyle::Inverted || bottomStyle == SideStyle::Inverted) {
|
||||||
|
width -= st::historyServiceMsgInvertedShrink * 2;
|
||||||
|
x += st::historyServiceMsgInvertedShrink;
|
||||||
|
}
|
||||||
|
|
||||||
if (int skip = paintBubbleSide(p, x, y, width, topStyle, CornerTop)) {
|
if (int skip = paintBubbleSide(p, x, y, width, topStyle, CornerTop)) {
|
||||||
y += skip;
|
y += skip;
|
||||||
height -= skip;
|
height -= skip;
|
||||||
}
|
}
|
||||||
if (int skip = paintBubbleSide(p, x, y + height - st::serviceMsgRadius, width, bottomStyle, CornerBottom)) {
|
int bottomSize = 0;
|
||||||
|
if (bottomStyle == SideStyle::Rounded) {
|
||||||
|
bottomSize = st::historyServiceMsgRadius;
|
||||||
|
} else if (bottomStyle == SideStyle::Inverted) {
|
||||||
|
bottomSize = st::historyServiceMsgInvertedRadius;
|
||||||
|
}
|
||||||
|
if (int skip = paintBubbleSide(p, x, y + height - bottomSize, width, bottomStyle, CornerBottom)) {
|
||||||
height -= skip;
|
height -= skip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,7 +151,7 @@ void paintPreparedDate(Painter &p, const QString &dateText, int dateTextWidth, i
|
||||||
|
|
||||||
left += (w - dateTextWidth - st::msgServicePadding.left() - st::msgServicePadding.right()) / 2;
|
left += (w - dateTextWidth - st::msgServicePadding.left() - st::msgServicePadding.right()) / 2;
|
||||||
int height = st::msgServicePadding.top() + st::msgServiceFont->height + st::msgServicePadding.bottom();
|
int height = st::msgServicePadding.top() + st::msgServiceFont->height + st::msgServicePadding.bottom();
|
||||||
App::roundRect(p, left, y + st::msgServiceMargin.top(), dateTextWidth + st::msgServicePadding.left() + st::msgServicePadding.left(), height, App::msgServiceBg(), ServiceCorners);
|
ServiceMessagePainter::paintBubble(p, left, y + st::msgServiceMargin.top(), dateTextWidth + st::msgServicePadding.left() + st::msgServicePadding.left(), height);
|
||||||
|
|
||||||
p.setFont(st::msgServiceFont);
|
p.setFont(st::msgServiceFont);
|
||||||
p.setPen(st::msgServiceColor);
|
p.setPen(st::msgServiceColor);
|
||||||
|
@ -180,7 +194,7 @@ void ServiceMessagePainter::paint(Painter &p, const HistoryService *message, con
|
||||||
|
|
||||||
QRect trect(QRect(left, st::msgServiceMargin.top(), width, height).marginsAdded(-st::msgServicePadding));
|
QRect trect(QRect(left, st::msgServiceMargin.top(), width, height).marginsAdded(-st::msgServicePadding));
|
||||||
|
|
||||||
paintBubble(p, left, width, message->_text, trect);
|
paintComplexBubble(p, left, width, message->_text, trect);
|
||||||
|
|
||||||
if (width > message->maxWidth()) {
|
if (width > message->maxWidth()) {
|
||||||
left += (width - message->maxWidth()) / 2;
|
left += (width - message->maxWidth()) / 2;
|
||||||
|
@ -205,7 +219,13 @@ void ServiceMessagePainter::paintDate(Painter &p, const QString &dateText, int d
|
||||||
paintPreparedDate(p, dateText, dateTextWidth, y, w);
|
paintPreparedDate(p, dateText, dateTextWidth, y, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServiceMessagePainter::paintBubble(Painter &p, int left, int width, const Text &text, const QRect &textRect) {
|
void ServiceMessagePainter::paintBubble(Painter &p, int x, int y, int w, int h) {
|
||||||
|
createCircleMasks();
|
||||||
|
|
||||||
|
paintBubblePart(p, x, y, w, h, SideStyle::Rounded, SideStyle::Rounded);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ServiceMessagePainter::paintComplexBubble(Painter &p, int left, int width, const Text &text, const QRect &textRect) {
|
||||||
createCircleMasks();
|
createCircleMasks();
|
||||||
|
|
||||||
auto lineWidths = countLineWidths(text, textRect);
|
auto lineWidths = countLineWidths(text, textRect);
|
||||||
|
@ -258,7 +278,7 @@ QVector<int> ServiceMessagePainter::countLineWidths(const Text &text, const QRec
|
||||||
lineWidths.reserve(linesCount);
|
lineWidths.reserve(linesCount);
|
||||||
text.countLineWidths(textRect.width(), &lineWidths);
|
text.countLineWidths(textRect.width(), &lineWidths);
|
||||||
|
|
||||||
int minDelta = 4 * st::serviceMsgRadius;
|
int minDelta = 2 * (st::historyServiceMsgRadius + st::historyServiceMsgInvertedRadius - st::historyServiceMsgInvertedShrink);
|
||||||
for (int i = 0, count = lineWidths.size(); i < count; ++i) {
|
for (int i = 0, count = lineWidths.size(); i < count; ++i) {
|
||||||
int width = qMax(lineWidths.at(i), 0);
|
int width = qMax(lineWidths.at(i), 0);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
|
|
|
@ -40,8 +40,10 @@ public:
|
||||||
static void paintDate(Painter &p, const QDateTime &date, int y, int w);
|
static void paintDate(Painter &p, const QDateTime &date, int y, int w);
|
||||||
static void paintDate(Painter &p, const QString &dateText, int dateTextWidth, int y, int w);
|
static void paintDate(Painter &p, const QString &dateText, int dateTextWidth, int y, int w);
|
||||||
|
|
||||||
|
static void paintBubble(Painter &p, int x, int y, int w, int h);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void paintBubble(Painter &p, int left, int width, const Text &text, const QRect &textRect);
|
static void paintComplexBubble(Painter &p, int left, int width, const Text &text, const QRect &textRect);
|
||||||
static QVector<int> countLineWidths(const Text &text, const QRect &textRect);
|
static QVector<int> countLineWidths(const Text &text, const QRect &textRect);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -8525,7 +8525,7 @@ void HistoryWidget::paintEvent(QPaintEvent *e) {
|
||||||
style::font font(st::msgServiceFont);
|
style::font font(st::msgServiceFont);
|
||||||
int32 w = font->width(lang(lng_willbe_history)) + st::msgPadding.left() + st::msgPadding.right(), h = font->height + st::msgServicePadding.top() + st::msgServicePadding.bottom() + 2;
|
int32 w = font->width(lang(lng_willbe_history)) + st::msgPadding.left() + st::msgPadding.right(), h = font->height + st::msgServicePadding.top() + st::msgServicePadding.bottom() + 2;
|
||||||
QRect tr((width() - w) / 2, (height() - _field.height() - 2 * st::sendPadding - h) / 2, w, h);
|
QRect tr((width() - w) / 2, (height() - _field.height() - 2 * st::sendPadding - h) / 2, w, h);
|
||||||
App::roundRect(p, tr, App::msgServiceBg(), ServiceCorners);
|
HistoryLayout::ServiceMessagePainter::paintBubble(p, tr.x(), tr.y(), tr.width(), tr.height());
|
||||||
|
|
||||||
p.setPen(st::msgServiceColor->p);
|
p.setPen(st::msgServiceColor->p);
|
||||||
p.setFont(font->f);
|
p.setFont(font->f);
|
||||||
|
|
|
@ -33,8 +33,8 @@ enum RoundCorners {
|
||||||
LargeMaskCorners,
|
LargeMaskCorners,
|
||||||
|
|
||||||
WhiteCorners,
|
WhiteCorners,
|
||||||
ServiceCorners,
|
StickerCorners,
|
||||||
ServiceSelectedCorners,
|
StickerSelectedCorners,
|
||||||
SelectedOverlaySmallCorners,
|
SelectedOverlaySmallCorners,
|
||||||
SelectedOverlayLargeCorners,
|
SelectedOverlayLargeCorners,
|
||||||
DateCorners,
|
DateCorners,
|
||||||
|
|
Loading…
Reference in New Issue