forked from blue/squawk
initial attempt to paint buttons in the messagefeed
This commit is contained in:
parent
ff4124d1f0
commit
00ffbac6b0
@ -375,6 +375,10 @@ void Core::RosterItem::flushMessagesToArchive(bool finished, const QString& firs
|
||||
archiveState = complete;
|
||||
archive->setFromTheBeginning(true);
|
||||
}
|
||||
if (added == 0 && wasEmpty) {
|
||||
archiveState = empty;
|
||||
break;
|
||||
}
|
||||
if (requestedCount != -1) {
|
||||
QString before;
|
||||
if (responseCache.size() > 0) {
|
||||
|
@ -36,7 +36,8 @@ Shared::Message::Message(Shared::Message::Type p_type):
|
||||
errorText(),
|
||||
originalMessage(),
|
||||
lastModified(),
|
||||
stanzaId()
|
||||
stanzaId(),
|
||||
attachPath()
|
||||
{}
|
||||
|
||||
Shared::Message::Message():
|
||||
@ -56,7 +57,8 @@ Shared::Message::Message():
|
||||
errorText(),
|
||||
originalMessage(),
|
||||
lastModified(),
|
||||
stanzaId()
|
||||
stanzaId(),
|
||||
attachPath()
|
||||
{}
|
||||
|
||||
QString Shared::Message::getBody() const
|
||||
@ -311,6 +313,7 @@ void Shared::Message::serialize(QDataStream& data) const
|
||||
data << lastModified;
|
||||
}
|
||||
data << stanzaId;
|
||||
data << attachPath;
|
||||
}
|
||||
|
||||
void Shared::Message::deserialize(QDataStream& data)
|
||||
@ -341,6 +344,7 @@ void Shared::Message::deserialize(QDataStream& data)
|
||||
data >> lastModified;
|
||||
}
|
||||
data >> stanzaId;
|
||||
data >> attachPath;
|
||||
}
|
||||
|
||||
bool Shared::Message::change(const QMap<QString, QVariant>& data)
|
||||
@ -350,6 +354,16 @@ bool Shared::Message::change(const QMap<QString, QVariant>& data)
|
||||
setState(static_cast<State>(itr.value().toUInt()));
|
||||
}
|
||||
|
||||
itr = data.find("outOfBandUrl");
|
||||
if (itr != data.end()) {
|
||||
setOutOfBandUrl(itr.value().toString());
|
||||
}
|
||||
|
||||
itr = data.find("attachPath");
|
||||
if (itr != data.end()) {
|
||||
setAttachPath(itr.value().toString());
|
||||
}
|
||||
|
||||
if (state == State::error) {
|
||||
itr = data.find("errorText");
|
||||
if (itr != data.end()) {
|
||||
@ -432,3 +446,13 @@ QString Shared::Message::getStanzaId() const
|
||||
{
|
||||
return stanzaId;
|
||||
}
|
||||
|
||||
QString Shared::Message::getAttachPath() const
|
||||
{
|
||||
return attachPath;
|
||||
}
|
||||
|
||||
void Shared::Message::setAttachPath(const QString& path)
|
||||
{
|
||||
attachPath = path;
|
||||
}
|
||||
|
@ -16,15 +16,15 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef SHAPER_MESSAGE_H
|
||||
#define SHAPER_MESSAGE_H
|
||||
|
||||
#include <QString>
|
||||
#include <QDateTime>
|
||||
#include <QVariant>
|
||||
#include <QMap>
|
||||
#include <QDataStream>
|
||||
|
||||
#ifndef SHAPER_MESSAGE_H
|
||||
#define SHAPER_MESSAGE_H
|
||||
|
||||
namespace Shared {
|
||||
|
||||
/**
|
||||
@ -72,6 +72,7 @@ public:
|
||||
void setErrorText(const QString& err);
|
||||
bool change(const QMap<QString, QVariant>& data);
|
||||
void setStanzaId(const QString& sid);
|
||||
void setAttachPath(const QString& path);
|
||||
|
||||
QString getFrom() const;
|
||||
QString getFromJid() const;
|
||||
@ -100,6 +101,7 @@ public:
|
||||
QDateTime getLastModified() const;
|
||||
QString getOriginalBody() const;
|
||||
QString getStanzaId() const;
|
||||
QString getAttachPath() const;
|
||||
|
||||
void serialize(QDataStream& data) const;
|
||||
void deserialize(QDataStream& data);
|
||||
@ -123,6 +125,7 @@ private:
|
||||
QString originalMessage;
|
||||
QDateTime lastModified;
|
||||
QString stanzaId;
|
||||
QString attachPath;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -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…
Reference in New Issue
Block a user