forked from blue/squawk
initial attempt to paint buttons in the messagefeed
This commit is contained in:
parent
ff4124d1f0
commit
00ffbac6b0
8 changed files with 156 additions and 18 deletions
|
@ -40,7 +40,9 @@ Models::MessageFeed::MessageFeed(const Element* ri, QObject* parent):
|
|||
indexById(storage.get<id>()),
|
||||
indexByTime(storage.get<time>()),
|
||||
rosterItem(ri),
|
||||
syncState(incomplete)
|
||||
syncState(incomplete),
|
||||
uploads(),
|
||||
downloads()
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -138,11 +140,8 @@ QVariant Models::MessageFeed::data(const QModelIndex& index, int role) const
|
|||
}
|
||||
}
|
||||
break;
|
||||
case Attach: {
|
||||
::Models::Attach att;
|
||||
|
||||
answer.setValue(att);
|
||||
}
|
||||
case Attach:
|
||||
answer.setValue(fillAttach(*msg));
|
||||
break;
|
||||
case Bulk: {
|
||||
FeedItem item;
|
||||
|
@ -171,6 +170,7 @@ QVariant Models::MessageFeed::data(const QModelIndex& index, int role) const
|
|||
if (item.avatar.size() == 0) {
|
||||
item.avatar = Shared::iconPath("user", true);
|
||||
}
|
||||
item.attach = fillAttach(*msg);
|
||||
answer.setValue(item);
|
||||
}
|
||||
break;
|
||||
|
@ -246,3 +246,39 @@ bool Models::MessageFeed::sentByMe(const Shared::Message& msg) const
|
|||
return msg.getOutgoing();
|
||||
}
|
||||
}
|
||||
|
||||
Models::Attachment Models::MessageFeed::fillAttach(const Shared::Message& msg) const
|
||||
{
|
||||
::Models::Attachment att;
|
||||
|
||||
att.localPath = msg.getAttachPath();
|
||||
att.remotePath = msg.getOutOfBandUrl();
|
||||
|
||||
if (att.remotePath.size() == 0) {
|
||||
if (att.localPath.size() == 0) {
|
||||
att.state = none;
|
||||
} else {
|
||||
Progress::const_iterator itr = uploads.find(msg.getId());
|
||||
if (itr == uploads.end()) {
|
||||
att.state = local;
|
||||
} else {
|
||||
att.state = uploading;
|
||||
att.progress = itr->second;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (att.localPath.size() == 0) {
|
||||
Progress::const_iterator itr = downloads.find(msg.getId());
|
||||
if (itr == downloads.end()) {
|
||||
att.state = remote;
|
||||
} else {
|
||||
att.state = downloading;
|
||||
att.progress = itr->second;
|
||||
}
|
||||
} else {
|
||||
att.state = ready;
|
||||
}
|
||||
}
|
||||
|
||||
return att;
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
|
||||
namespace Models {
|
||||
class Element;
|
||||
struct Attachment;
|
||||
|
||||
class MessageFeed : public QAbstractListModel
|
||||
{
|
||||
|
@ -63,6 +64,7 @@ signals:
|
|||
|
||||
protected:
|
||||
bool sentByMe(const Shared::Message& msg) const;
|
||||
Attachment fillAttach(const Shared::Message& msg) const;
|
||||
|
||||
public:
|
||||
enum MessageRoles {
|
||||
|
@ -120,21 +122,27 @@ private:
|
|||
const Element* rosterItem;
|
||||
SyncState syncState;
|
||||
|
||||
typedef std::map<QString, qreal> Progress;
|
||||
Progress uploads;
|
||||
Progress downloads;
|
||||
|
||||
static const QHash<int, QByteArray> roles;
|
||||
};
|
||||
|
||||
enum Attachment {
|
||||
enum AttachmentType {
|
||||
none,
|
||||
remote,
|
||||
local,
|
||||
downloading,
|
||||
uploading,
|
||||
ready
|
||||
};
|
||||
|
||||
struct Attach {
|
||||
Attachment state;
|
||||
struct Attachment {
|
||||
AttachmentType state;
|
||||
qreal progress;
|
||||
QString localPath;
|
||||
QString remotePath;
|
||||
};
|
||||
|
||||
struct FeedItem {
|
||||
|
@ -145,11 +153,11 @@ struct FeedItem {
|
|||
bool correction;
|
||||
QDateTime date;
|
||||
Shared::Message::State state;
|
||||
Attach attach;
|
||||
Attachment attach;
|
||||
};
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(Models::Attach);
|
||||
Q_DECLARE_METATYPE(Models::Attachment);
|
||||
Q_DECLARE_METATYPE(Models::FeedItem);
|
||||
|
||||
#endif // MESSAGEFEED_H
|
||||
|
|
|
@ -191,7 +191,7 @@ bool FeedView::tryToCalculateGeometriesWithNoScrollbars(const QStyleOptionViewIt
|
|||
|
||||
void FeedView::paintEvent(QPaintEvent* event)
|
||||
{
|
||||
qDebug() << "paint" << event->rect();
|
||||
//qDebug() << "paint" << event->rect();
|
||||
const QAbstractItemModel* m = model();
|
||||
QWidget* vp = viewport();
|
||||
QRect zone = event->rect().translated(0, -vo);
|
||||
|
|
|
@ -33,12 +33,24 @@ nickFont(),
|
|||
dateFont(),
|
||||
bodyMetrics(bodyFont),
|
||||
nickMetrics(nickFont),
|
||||
dateMetrics(dateFont)
|
||||
dateMetrics(dateFont),
|
||||
downloadButton(new QPushButton()),
|
||||
uploadButton(new QPushButton())
|
||||
{
|
||||
downloadButton->setText(tr("Download"));
|
||||
uploadButton->setText(tr("Retry"));
|
||||
|
||||
//this is done for the buttons to calculate their acual size for we are going to use them further
|
||||
downloadButton->setAttribute(Qt::WA_DontShowOnScreen);
|
||||
uploadButton->setAttribute(Qt::WA_DontShowOnScreen);
|
||||
downloadButton->show();
|
||||
uploadButton->show();
|
||||
}
|
||||
|
||||
MessageDelegate::~MessageDelegate()
|
||||
{
|
||||
delete uploadButton;
|
||||
delete downloadButton;
|
||||
}
|
||||
|
||||
void MessageDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
|
||||
|
@ -89,7 +101,38 @@ void MessageDelegate::paint(QPainter* painter, const QStyleOptionViewItem& optio
|
|||
painter->setFont(nickFont);
|
||||
painter->drawText(opt.rect, opt.displayAlignment, data.sender, &rect);
|
||||
|
||||
|
||||
opt.rect.adjust(0, rect.height(), 0, 0);
|
||||
painter->save();
|
||||
switch (data.attach.state) {
|
||||
case Models::none:
|
||||
break;
|
||||
case Models::uploading:
|
||||
case Models::downloading:
|
||||
break;
|
||||
case Models::remote:
|
||||
if (data.sentByMe) {
|
||||
painter->translate(option.rect.width() - avatarHeight - margin * 2 - downloadButton->width(), opt.rect.top());
|
||||
} else {
|
||||
painter->translate(opt.rect.topLeft());
|
||||
}
|
||||
downloadButton->render(painter, QPoint(), QRegion(), QWidget::DrawChildren);
|
||||
opt.rect.adjust(0, downloadButton->height(), 0, 0);
|
||||
break;
|
||||
case Models::local:
|
||||
if (data.sentByMe) {
|
||||
painter->translate(option.rect.width() - avatarHeight - margin * 2 - uploadButton->width(), opt.rect.top());
|
||||
} else {
|
||||
painter->translate(opt.rect.topLeft());
|
||||
}
|
||||
uploadButton->render(painter, QPoint(), QRegion(), QWidget::DrawChildren);
|
||||
opt.rect.adjust(0, uploadButton->height(), 0, 0);
|
||||
break;
|
||||
case Models::ready:
|
||||
break;
|
||||
}
|
||||
painter->restore();
|
||||
|
||||
painter->setFont(bodyFont);
|
||||
painter->drawText(opt.rect, opt.displayAlignment | Qt::TextWordWrap, data.text, &rect);
|
||||
|
||||
|
@ -108,8 +151,24 @@ QSize MessageDelegate::sizeHint(const QStyleOptionViewItem& option, const QModel
|
|||
QRect messageRect = option.rect.adjusted(0, margin / 2, -(avatarHeight + 3 * margin), -margin / 2);
|
||||
QStyleOptionViewItem opt = option;
|
||||
opt.rect = messageRect;
|
||||
QVariant va = index.data(Models::MessageFeed::Attach);
|
||||
Models::Attachment attach = qvariant_cast<Models::Attachment>(va);
|
||||
QSize messageSize = bodyMetrics.boundingRect(messageRect, Qt::TextWordWrap, index.data(Models::MessageFeed::Text).toString()).size();
|
||||
|
||||
switch (attach.state) {
|
||||
case Models::none:
|
||||
break;
|
||||
case Models::uploading:
|
||||
case Models::downloading:
|
||||
break;
|
||||
case Models::remote:
|
||||
case Models::local:
|
||||
messageSize.rheight() += downloadButton->height();
|
||||
break;
|
||||
case Models::ready:
|
||||
break;
|
||||
}
|
||||
|
||||
messageSize.rheight() += nickMetrics.lineSpacing();
|
||||
messageSize.rheight() += dateMetrics.height();
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <QStyledItemDelegate>
|
||||
#include <QFont>
|
||||
#include <QFontMetrics>
|
||||
#include <QPushButton>
|
||||
|
||||
#include "shared/icons.h"
|
||||
|
||||
|
@ -46,6 +47,9 @@ private:
|
|||
QFontMetrics bodyMetrics;
|
||||
QFontMetrics nickMetrics;
|
||||
QFontMetrics dateMetrics;
|
||||
|
||||
QPushButton* downloadButton;
|
||||
QPushButton* uploadButton;
|
||||
};
|
||||
|
||||
#endif // MESSAGEDELEGATE_H
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue