0.2.0 finalization

This commit is contained in:
Blue 2022-01-09 17:32:23 +03:00
parent 8a2658e4fc
commit 4d3ba6b11f
Signed by untrusted user: blue
GPG key ID: 9B203B252A63EE38
12 changed files with 194 additions and 179 deletions

View file

@ -43,6 +43,7 @@ FeedView::FeedView(QWidget* parent):
QAbstractItemView(parent),
hints(),
vo(0),
elementMargin(0),
specialDelegate(false),
specialModel(false),
clearWidgetsMode(false),
@ -106,7 +107,7 @@ QRect FeedView::visualRect(const QModelIndex& index) const
} else {
const Hint& hint = hints.at(row);
const QWidget* vp = viewport();
return QRect(0, vp->height() - hint.height - hint.offset + vo, vp->width(), hint.height);
return QRect(hint.x, vp->height() - hint.height - hint.offset + vo, hint.width, hint.height);
}
}
@ -198,7 +199,7 @@ void FeedView::updateGeometries()
option.rect.setWidth(layoutBounds.width());
hints.clear();
uint32_t previousOffset = 0;
uint32_t previousOffset = elementMargin;
QDateTime lastDate;
for (int i = 0, size = m->rowCount(); i < size; ++i) {
QModelIndex index = m->index(i, 0, rootIndex());
@ -206,19 +207,32 @@ void FeedView::updateGeometries()
if (i > 0) {
if (currentDate.daysTo(lastDate) > 0) {
previousOffset += dividerMetrics.height() + dateDeviderMargin * 2;
} else {
previousOffset += elementMargin;
}
}
lastDate = currentDate;
int height = itemDelegate(index)->sizeHint(option, index).height();
QSize messageSize = itemDelegate(index)->sizeHint(option, index);
uint32_t offsetX(0);
if (specialDelegate) {
if (index.data(Models::MessageFeed::SentByMe).toBool()) {
offsetX = layoutBounds.width() - messageSize.width() - MessageDelegate::avatarHeight - MessageDelegate::margin * 2;
} else {
offsetX = MessageDelegate::avatarHeight + MessageDelegate::margin * 2;
}
}
hints.emplace_back(Hint({
false,
previousOffset,
static_cast<uint32_t>(height)
static_cast<uint32_t>(messageSize.height()),
static_cast<uint32_t>(messageSize.width()),
offsetX
}));
previousOffset += height;
previousOffset += messageSize.height();
}
int totalHeight = previousOffset - layoutBounds.height();
int totalHeight = previousOffset - layoutBounds.height() + dividerMetrics.height() + dateDeviderMargin * 2;
if (modelState != Models::MessageFeed::complete) {
totalHeight += progressSize;
}
@ -240,7 +254,7 @@ void FeedView::updateGeometries()
bool FeedView::tryToCalculateGeometriesWithNoScrollbars(const QStyleOptionViewItem& option, const QAbstractItemModel* m, uint32_t totalHeight)
{
uint32_t previousOffset = 0;
uint32_t previousOffset = elementMargin;
bool success = true;
QDateTime lastDate;
for (int i = 0, size = m->rowCount(); i < size; ++i) {
@ -249,21 +263,39 @@ bool FeedView::tryToCalculateGeometriesWithNoScrollbars(const QStyleOptionViewIt
if (i > 0) {
if (currentDate.daysTo(lastDate) > 0) {
previousOffset += dateDeviderMargin * 2 + dividerMetrics.height();
} else {
previousOffset += elementMargin;
}
}
lastDate = currentDate;
int height = itemDelegate(index)->sizeHint(option, index).height();
QSize messageSize = itemDelegate(index)->sizeHint(option, index);
if (previousOffset + height > totalHeight) {
if (previousOffset + messageSize.height() + elementMargin > totalHeight) {
success = false;
break;
}
uint32_t offsetX(0);
if (specialDelegate) {
if (index.data(Models::MessageFeed::SentByMe).toBool()) {
offsetX = option.rect.width() - messageSize.width() - MessageDelegate::avatarHeight - MessageDelegate::margin * 2;
} else {
offsetX = MessageDelegate::avatarHeight + MessageDelegate::margin * 2;
}
}
hints.emplace_back(Hint({
false,
previousOffset,
static_cast<uint32_t>(height)
static_cast<uint32_t>(messageSize.height()),
static_cast<uint32_t>(messageSize.width()),
offsetX
}));
previousOffset += height;
previousOffset += messageSize.height();
}
previousOffset += dateDeviderMargin * 2 + dividerMetrics.height();
if (previousOffset > totalHeight) {
success = false;
}
return success;
@ -336,7 +368,7 @@ void FeedView::paintEvent(QPaintEvent* event)
lastDate = currentDate;
}
if (!lastDate.isNull() && inZone) { //if after drawing all messages there is still space
drawDateDevider(option.rect.bottom(), lastDate, painter);
drawDateDevider(option.rect.top() - dateDeviderMargin * 2 - dividerMetrics.height(), lastDate, painter);
}
if (clearWidgetsMode && specialDelegate) {
@ -423,10 +455,12 @@ void FeedView::setItemDelegate(QAbstractItemDelegate* delegate)
MessageDelegate* del = dynamic_cast<MessageDelegate*>(delegate);
if (del) {
specialDelegate = true;
elementMargin = MessageDelegate::margin;
connect(del, &MessageDelegate::buttonPushed, this, &FeedView::onMessageButtonPushed);
connect(del, &MessageDelegate::invalidPath, this, &FeedView::onMessageInvalidPath);
} else {
specialDelegate = false;
elementMargin = 0;
}
}