Optimize online dot painting.

This commit is contained in:
John Preston 2019-06-17 16:33:28 +02:00
parent 034bee8fc3
commit 61c66994a2
3 changed files with 34 additions and 34 deletions

View File

@ -34,9 +34,9 @@ dialogsPhotoSize: 46px;
dialogsPhotoPadding: 12px; dialogsPhotoPadding: 12px;
dialogsPadding: point(10px, 8px); dialogsPadding: point(10px, 8px);
dialogsOnlineBadgeSizePadding: 4px; dialogsOnlineBadgeStroke: 2px;
dialogsOnlineBadgeSize: 8px; dialogsOnlineBadgeSize: 10px;
dialogsOnlineBadgeRightSkip: 2px; dialogsOnlineBadgeSkip: point(10px, 12px);
dialogsImportantBarHeight: 37px; dialogsImportantBarHeight: 37px;

View File

@ -181,21 +181,27 @@ InnerWidget::InnerWidget(
if (peerUpdate.peer->isSelf()) { if (peerUpdate.peer->isSelf()) {
return; return;
} }
const auto circleSize = st::dialogsOnlineBadgeSize const auto history = session().data().historyLoaded(peerUpdate.peer);
+ st::dialogsOnlineBadgeSizePadding; if (!history) {
return;
}
const auto size = st::dialogsOnlineBadgeSize;
const auto stroke = st::dialogsOnlineBadgeStroke;
const auto skip = st::dialogsOnlineBadgeSkip;
const auto edge = st::dialogsPadding.x() + st::dialogsPhotoSize;
const auto updateRect = QRect( const auto updateRect = QRect(
st::dialogsPadding.x() edge - skip.x() - size,
+ st::dialogsPhotoSize edge - skip.y() - size,
- st::dialogsOnlineBadgeRightSkip size,
- circleSize, size
st::dialogsPadding.y() ).marginsAdded(
+ st::dialogsPhotoSize { stroke, stroke, stroke, stroke }
- circleSize, ).translated(
circleSize, st::dialogsPadding
circleSize); );
updateDialogRow( updateDialogRow(
RowDescriptor( RowDescriptor(
session().data().history(peerUpdate.peer->id), history,
FullMsgId()), FullMsgId()),
updateRect, updateRect,
UpdateRowSection::Default | UpdateRowSection::Filtered); UpdateRowSection::Default | UpdateRowSection::Filtered);

View File

@ -260,37 +260,31 @@ void paintRow(
frame.setDevicePixelRatio(cRetinaFactor()); frame.setDevicePixelRatio(cRetinaFactor());
frame.fill(Qt::transparent); frame.fill(Qt::transparent);
{ {
const auto size = st::dialogsOnlineBadgeSize;
const auto paddingSize = st::dialogsOnlineBadgeSizePadding;
const auto circleSize = size + paddingSize;
const auto offset = size + paddingSize / 2;
const auto x = st::dialogsPadding.x() + st::dialogsPhotoSize - st::dialogsOnlineBadgeRightSkip - size;
const auto y = st::dialogsPadding.y() + st::dialogsPhotoSize - size;
Painter q(&frame); Painter q(&frame);
PainterHighQualityEnabler hq(q);
from->paintUserpicLeft( from->paintUserpicLeft(
q, q,
0, 0,
0, 0,
fullWidth, fullWidth,
st::dialogsPhotoSize); st::dialogsPhotoSize);
q.setPen(Qt::NoPen);
q.setBrush(Qt::transparent);
q.setCompositionMode(QPainter::CompositionMode_SourceOut);
q.drawEllipse(
x - circleSize,
y - circleSize,
circleSize,
circleSize);
PainterHighQualityEnabler hq(q);
q.setCompositionMode(QPainter::CompositionMode_Source);
const auto size = st::dialogsOnlineBadgeSize;
const auto stroke = st::dialogsOnlineBadgeStroke;
const auto skip = st::dialogsOnlineBadgeSkip;
const auto edge = st::dialogsPadding.x() + st::dialogsPhotoSize;
auto pen = QPen(Qt::transparent);
pen.setWidth(stroke);
q.setPen(pen);
q.setBrush(active q.setBrush(active
? st::dialogsOnlineBadgeFgActive ? st::dialogsOnlineBadgeFgActive
: st::dialogsOnlineBadgeFg); : st::dialogsOnlineBadgeFg);
q.setCompositionMode(QPainter::CompositionMode_Source);
q.drawEllipse( q.drawEllipse(
x - offset, edge - skip.x() - size,
y - offset, edge - skip.y() - size,
size, size,
size); size);
} }