some warnings fixed, new way of drawing avatars in message line

This commit is contained in:
Blue 2022-01-05 22:29:34 +03:00
parent e27ae1a82f
commit 7130e674c4
Signed by untrusted user: blue
GPG key ID: 9B203B252A63EE38
7 changed files with 65 additions and 16 deletions

View file

@ -31,6 +31,10 @@ constexpr int approximateSingleMessageHeight = 20;
constexpr int progressSize = 70;
constexpr int dateDeviderMargin = 10;
constexpr int avatarHeight = 50;
constexpr int margin = 6;
constexpr int halfMargin = 3;
const std::set<int> FeedView::geometryChangingRoles = {
Models::MessageFeed::Attach,
Models::MessageFeed::Text,
@ -334,6 +338,20 @@ void FeedView::paintEvent(QPaintEvent* event)
drawDateDevider(option.rect.bottom(), lastDate, painter);
}
lastDate = currentDate;
if ((option.rect.y() < 1) || (index.row() == m->rowCount() - 1)) {
drawAvatar(index, option, painter);
} else {
QString mySender = index.data(Models::MessageFeed::Sender).toString();
QModelIndex prevIndex = m->index(index.row() + 1, 0, rootIndex());
if (
(prevIndex.data(Models::MessageFeed::Sender).toString() != mySender) ||
(prevIndex.data(Models::MessageFeed::Date).toDateTime().daysTo(currentDate) != 0)
) {
drawAvatar(index, option, painter);
}
}
}
if (!lastDate.isNull() && inZone) { //if after drawing all messages there is still space
drawDateDevider(option.rect.bottom(), lastDate, painter);
@ -344,10 +362,6 @@ void FeedView::paintEvent(QPaintEvent* event)
del->endClearWidgets();
clearWidgetsMode = false;
}
if (event->rect().height() == vp->height()) {
// draw the blurred drop shadow...
}
}
void FeedView::drawDateDevider(int top, const QDateTime& date, QPainter& painter)
@ -360,6 +374,40 @@ void FeedView::drawDateDevider(int top, const QDateTime& date, QPainter& painter
painter.restore();
}
void FeedView::drawAvatar(const QModelIndex& index, const QStyleOptionViewItem& option, QPainter& painter)
{
int currentRow = index.row();
int y = option.rect.y();
bool firstAttempt = true;
QString mySender = index.data(Models::MessageFeed::Sender).toString();
QDateTime currentDate = index.data(Models::MessageFeed::Date).toDateTime();
QIcon icon(index.data(Models::MessageFeed::Avatar).toString());
while (y < 0 && currentRow > 0) {
QRect rect;
if (firstAttempt) {
firstAttempt = false;
rect = option.rect;
} else {
QModelIndex ci = model()->index(currentRow, 0, rootIndex());
if (
(ci.data(Models::MessageFeed::Sender).toString() != mySender) ||
(ci.data(Models::MessageFeed::Date).toDateTime().daysTo(currentDate) != 0)
) {
break;
}
rect = visualRect(ci);
}
y = std::min(0, rect.bottom() - margin - avatarHeight);
--currentRow;
}
if (index.data(Models::MessageFeed::SentByMe).toBool()) {
painter.drawPixmap(option.rect.width() - avatarHeight - margin, y + halfMargin, icon.pixmap(avatarHeight, avatarHeight));
} else {
painter.drawPixmap(margin, y + halfMargin, icon.pixmap(avatarHeight, avatarHeight));
}
}
void FeedView::verticalScrollbarValueChanged(int value)
{
vo = verticalScrollBar()->maximum() - value;