forked from blue/squawk
edit icon next to the message showing if the message was edited and what was there a first
This commit is contained in:
parent
3f1fba4de2
commit
5f925217fc
@ -42,6 +42,7 @@ MessageDelegate::MessageDelegate(QObject* parent):
|
|||||||
buttons(new std::map<QString, FeedButton*>()),
|
buttons(new std::map<QString, FeedButton*>()),
|
||||||
bars(new std::map<QString, QProgressBar*>()),
|
bars(new std::map<QString, QProgressBar*>()),
|
||||||
statusIcons(new std::map<QString, QLabel*>()),
|
statusIcons(new std::map<QString, QLabel*>()),
|
||||||
|
pencilIcons(new std::map<QString, QLabel*>()),
|
||||||
bodies(new std::map<QString, QLabel*>()),
|
bodies(new std::map<QString, QLabel*>()),
|
||||||
previews(new std::map<QString, Preview*>()),
|
previews(new std::map<QString, Preview*>()),
|
||||||
idsToKeep(new std::set<QString>()),
|
idsToKeep(new std::set<QString>()),
|
||||||
@ -68,6 +69,10 @@ MessageDelegate::~MessageDelegate()
|
|||||||
delete pair.second;
|
delete pair.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const std::pair<const QString, QLabel*>& pair: *pencilIcons){
|
||||||
|
delete pair.second;
|
||||||
|
}
|
||||||
|
|
||||||
for (const std::pair<const QString, QLabel*>& pair: *bodies){
|
for (const std::pair<const QString, QLabel*>& pair: *bodies){
|
||||||
delete pair.second;
|
delete pair.second;
|
||||||
}
|
}
|
||||||
@ -76,6 +81,8 @@ MessageDelegate::~MessageDelegate()
|
|||||||
delete pair.second;
|
delete pair.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete statusIcons;
|
||||||
|
delete pencilIcons;
|
||||||
delete idsToKeep;
|
delete idsToKeep;
|
||||||
delete buttons;
|
delete buttons;
|
||||||
delete bars;
|
delete bars;
|
||||||
@ -128,6 +135,18 @@ void MessageDelegate::paint(QPainter* painter, const QStyleOptionViewItem& optio
|
|||||||
if (senderSize.width() > messageSize.width()) {
|
if (senderSize.width() > messageSize.width()) {
|
||||||
messageSize.setWidth(senderSize.width());
|
messageSize.setWidth(senderSize.width());
|
||||||
}
|
}
|
||||||
|
QSize dateSize = dateMetrics.boundingRect(messageRect, 0, data.date.toLocalTime().toString()).size();
|
||||||
|
int addition = 0;
|
||||||
|
|
||||||
|
if (data.correction.corrected) {
|
||||||
|
addition += margin + statusIconSize;
|
||||||
|
}
|
||||||
|
if (data.sentByMe) {
|
||||||
|
addition += margin + statusIconSize;
|
||||||
|
}
|
||||||
|
if (dateSize.width() + addition > messageSize.width()) {
|
||||||
|
messageSize.setWidth(dateSize.width() + addition);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
messageSize.setWidth(opt.rect.width());
|
messageSize.setWidth(opt.rect.width());
|
||||||
}
|
}
|
||||||
@ -170,6 +189,7 @@ void MessageDelegate::paint(QPainter* painter, const QStyleOptionViewItem& optio
|
|||||||
painter->restore();
|
painter->restore();
|
||||||
|
|
||||||
int messageLeft = INT16_MAX;
|
int messageLeft = INT16_MAX;
|
||||||
|
int messageRight = opt.rect.x() + messageSize.width();
|
||||||
QWidget* vp = static_cast<QWidget*>(painter->device());
|
QWidget* vp = static_cast<QWidget*>(painter->device());
|
||||||
if (data.text.size() > 0) {
|
if (data.text.size() > 0) {
|
||||||
QLabel* body = getBody(data);
|
QLabel* body = getBody(data);
|
||||||
@ -192,18 +212,35 @@ void MessageDelegate::paint(QPainter* painter, const QStyleOptionViewItem& optio
|
|||||||
q.setAlpha(180);
|
q.setAlpha(180);
|
||||||
painter->setPen(q);
|
painter->setPen(q);
|
||||||
painter->drawText(opt.rect, opt.displayAlignment, data.date.toLocalTime().toString(), &rect);
|
painter->drawText(opt.rect, opt.displayAlignment, data.date.toLocalTime().toString(), &rect);
|
||||||
|
int currentY = opt.rect.y();
|
||||||
if (data.sentByMe) {
|
if (data.sentByMe) {
|
||||||
if (messageLeft > rect.x() - statusIconSize - margin) {
|
|
||||||
messageLeft = rect.x() - statusIconSize - margin;
|
|
||||||
}
|
|
||||||
QLabel* statusIcon = getStatusIcon(data);
|
QLabel* statusIcon = getStatusIcon(data);
|
||||||
|
|
||||||
statusIcon->setParent(vp);
|
statusIcon->setParent(vp);
|
||||||
statusIcon->move(messageLeft, opt.rect.y());
|
statusIcon->move(opt.rect.topRight().x() - messageSize.width(), currentY);
|
||||||
statusIcon->show();
|
statusIcon->show();
|
||||||
|
|
||||||
opt.rect.adjust(0, statusIconSize + textMargin, 0, 0);
|
opt.rect.adjust(0, statusIconSize + textMargin, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data.correction.corrected) {
|
||||||
|
QLabel* pencilIcon = getPencilIcon(data);
|
||||||
|
|
||||||
|
pencilIcon->setParent(vp);
|
||||||
|
if (data.sentByMe) {
|
||||||
|
pencilIcon->move(opt.rect.topRight().x() - messageSize.width() + statusIconSize + margin, currentY);
|
||||||
|
} else {
|
||||||
|
pencilIcon->move(messageRight - statusIconSize - margin, currentY);
|
||||||
|
}
|
||||||
|
pencilIcon->show();
|
||||||
|
} else {
|
||||||
|
std::map<QString, QLabel*>::const_iterator itr = pencilIcons->find(data.id);
|
||||||
|
if (itr != pencilIcons->end()) {
|
||||||
|
delete itr->second;
|
||||||
|
pencilIcons->erase(itr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
painter->restore();
|
painter->restore();
|
||||||
|
|
||||||
if (clearingWidgets) {
|
if (clearingWidgets) {
|
||||||
@ -439,6 +476,26 @@ QLabel * MessageDelegate::getStatusIcon(const Models::FeedItem& data) const
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QLabel * MessageDelegate::getPencilIcon(const Models::FeedItem& data) const
|
||||||
|
{
|
||||||
|
std::map<QString, QLabel*>::const_iterator itr = pencilIcons->find(data.id);
|
||||||
|
QLabel* result = 0;
|
||||||
|
|
||||||
|
if (itr != pencilIcons->end()) {
|
||||||
|
result = itr->second;
|
||||||
|
} else {
|
||||||
|
result = new QLabel();
|
||||||
|
QIcon icon = Shared::icon("edit-rename");
|
||||||
|
result->setPixmap(icon.pixmap(statusIconSize));
|
||||||
|
pencilIcons->insert(std::make_pair(data.id, result));
|
||||||
|
}
|
||||||
|
|
||||||
|
result->setToolTip("Last time edited: " + data.correction.lastCorrection.toLocalTime().toString()
|
||||||
|
+ "\nOriginal message: " + data.correction.original);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
QLabel * MessageDelegate::getBody(const Models::FeedItem& data) const
|
QLabel * MessageDelegate::getBody(const Models::FeedItem& data) const
|
||||||
{
|
{
|
||||||
std::map<QString, QLabel*>::const_iterator itr = bodies->find(data.id);
|
std::map<QString, QLabel*>::const_iterator itr = bodies->find(data.id);
|
||||||
@ -486,6 +543,7 @@ void MessageDelegate::endClearWidgets()
|
|||||||
removeElements(buttons, idsToKeep);
|
removeElements(buttons, idsToKeep);
|
||||||
removeElements(bars, idsToKeep);
|
removeElements(bars, idsToKeep);
|
||||||
removeElements(statusIcons, idsToKeep);
|
removeElements(statusIcons, idsToKeep);
|
||||||
|
removeElements(pencilIcons, idsToKeep);
|
||||||
removeElements(bodies, idsToKeep);
|
removeElements(bodies, idsToKeep);
|
||||||
removeElements(previews, idsToKeep);
|
removeElements(previews, idsToKeep);
|
||||||
|
|
||||||
|
@ -68,6 +68,7 @@ protected:
|
|||||||
QPushButton* getButton(const Models::FeedItem& data) const;
|
QPushButton* getButton(const Models::FeedItem& data) const;
|
||||||
QProgressBar* getBar(const Models::FeedItem& data) const;
|
QProgressBar* getBar(const Models::FeedItem& data) const;
|
||||||
QLabel* getStatusIcon(const Models::FeedItem& data) const;
|
QLabel* getStatusIcon(const Models::FeedItem& data) const;
|
||||||
|
QLabel* getPencilIcon(const Models::FeedItem& data) const;
|
||||||
QLabel* getBody(const Models::FeedItem& data) const;
|
QLabel* getBody(const Models::FeedItem& data) const;
|
||||||
void clearHelperWidget(const Models::FeedItem& data) const;
|
void clearHelperWidget(const Models::FeedItem& data) const;
|
||||||
|
|
||||||
@ -93,6 +94,7 @@ private:
|
|||||||
std::map<QString, FeedButton*>* buttons;
|
std::map<QString, FeedButton*>* buttons;
|
||||||
std::map<QString, QProgressBar*>* bars;
|
std::map<QString, QProgressBar*>* bars;
|
||||||
std::map<QString, QLabel*>* statusIcons;
|
std::map<QString, QLabel*>* statusIcons;
|
||||||
|
std::map<QString, QLabel*>* pencilIcons;
|
||||||
std::map<QString, QLabel*>* bodies;
|
std::map<QString, QLabel*>* bodies;
|
||||||
std::map<QString, Preview*>* previews;
|
std::map<QString, Preview*>* previews;
|
||||||
std::set<QString>* idsToKeep;
|
std::set<QString>* idsToKeep;
|
||||||
|
@ -262,7 +262,7 @@ QVariant Models::MessageFeed::data(const QModelIndex& index, int role) const
|
|||||||
answer = static_cast<unsigned int>(msg->getState());
|
answer = static_cast<unsigned int>(msg->getState());
|
||||||
break;
|
break;
|
||||||
case Correction:
|
case Correction:
|
||||||
answer = msg->getEdited();
|
answer.setValue(fillCorrection(*msg));;
|
||||||
break;
|
break;
|
||||||
case SentByMe:
|
case SentByMe:
|
||||||
answer = sentByMe(*msg);
|
answer = sentByMe(*msg);
|
||||||
@ -311,7 +311,7 @@ QVariant Models::MessageFeed::data(const QModelIndex& index, int role) const
|
|||||||
item.date = msg->getTime();
|
item.date = msg->getTime();
|
||||||
item.state = msg->getState();
|
item.state = msg->getState();
|
||||||
item.error = msg->getErrorText();
|
item.error = msg->getErrorText();
|
||||||
item.correction = msg->getEdited();
|
item.correction = fillCorrection(*msg);
|
||||||
|
|
||||||
QString body = msg->getBody();
|
QString body = msg->getBody();
|
||||||
if (body != msg->getOutOfBandUrl()) {
|
if (body != msg->getOutOfBandUrl()) {
|
||||||
@ -480,6 +480,14 @@ Models::Attachment Models::MessageFeed::fillAttach(const Shared::Message& msg) c
|
|||||||
return att;
|
return att;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Models::Edition Models::MessageFeed::fillCorrection(const Shared::Message& msg) const
|
||||||
|
{
|
||||||
|
::Models::Edition ed({msg.getEdited(), msg.getOriginalBody(), msg.getLastModified()});
|
||||||
|
|
||||||
|
return ed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Models::MessageFeed::downloadAttachment(const QString& messageId)
|
void Models::MessageFeed::downloadAttachment(const QString& messageId)
|
||||||
{
|
{
|
||||||
bool notify = false;
|
bool notify = false;
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
namespace Models {
|
namespace Models {
|
||||||
class Element;
|
class Element;
|
||||||
struct Attachment;
|
struct Attachment;
|
||||||
|
struct Edition;
|
||||||
|
|
||||||
class MessageFeed : public QAbstractListModel
|
class MessageFeed : public QAbstractListModel
|
||||||
{
|
{
|
||||||
@ -106,6 +107,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
bool sentByMe(const Shared::Message& msg) const;
|
bool sentByMe(const Shared::Message& msg) const;
|
||||||
Attachment fillAttach(const Shared::Message& msg) const;
|
Attachment fillAttach(const Shared::Message& msg) const;
|
||||||
|
Edition fillCorrection(const Shared::Message& msg) const;
|
||||||
QModelIndex modelIndexById(const QString& id) const;
|
QModelIndex modelIndexById(const QString& id) const;
|
||||||
QModelIndex modelIndexByTime(const QString& id, const QDateTime& time) const;
|
QModelIndex modelIndexByTime(const QString& id, const QDateTime& time) const;
|
||||||
std::set<MessageRoles> detectChanges(const Shared::Message& msg, const QMap<QString, QVariant>& data) const;
|
std::set<MessageRoles> detectChanges(const Shared::Message& msg, const QMap<QString, QVariant>& data) const;
|
||||||
@ -180,6 +182,12 @@ struct Attachment {
|
|||||||
QString error;
|
QString error;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Edition {
|
||||||
|
bool corrected;
|
||||||
|
QString original;
|
||||||
|
QDateTime lastCorrection;
|
||||||
|
};
|
||||||
|
|
||||||
struct FeedItem {
|
struct FeedItem {
|
||||||
QString id;
|
QString id;
|
||||||
QString text;
|
QString text;
|
||||||
@ -187,7 +195,7 @@ struct FeedItem {
|
|||||||
QString avatar;
|
QString avatar;
|
||||||
QString error;
|
QString error;
|
||||||
bool sentByMe;
|
bool sentByMe;
|
||||||
bool correction;
|
Edition correction;
|
||||||
QDateTime date;
|
QDateTime date;
|
||||||
Shared::Message::State state;
|
Shared::Message::State state;
|
||||||
Attachment attach;
|
Attachment attach;
|
||||||
@ -195,6 +203,7 @@ struct FeedItem {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(Models::Attachment);
|
Q_DECLARE_METATYPE(Models::Attachment);
|
||||||
|
Q_DECLARE_METATYPE(Models::Edition);
|
||||||
Q_DECLARE_METATYPE(Models::FeedItem);
|
Q_DECLARE_METATYPE(Models::FeedItem);
|
||||||
|
|
||||||
#endif // MESSAGEFEED_H
|
#endif // MESSAGEFEED_H
|
||||||
|
Loading…
Reference in New Issue
Block a user