forked from blue/squawk
0.2.0 finalization
This commit is contained in:
parent
8a2658e4fc
commit
4d3ba6b11f
12 changed files with 194 additions and 179 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue