forked from blue/squawk
segfault fix when trying to send something but the history isn't loaded yet, icon and for attached files which are not previewed
This commit is contained in:
parent
ce047db787
commit
b7b70bc198
@ -112,6 +112,8 @@ Shared::Global::Global():
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const QSize defaultIconFileInfoHeight(50, 50);
|
||||||
Shared::Global::FileInfo Shared::Global::getFileInfo(const QString& path)
|
Shared::Global::FileInfo Shared::Global::getFileInfo(const QString& path)
|
||||||
{
|
{
|
||||||
std::map<QString, FileInfo>::const_iterator itr = instance->fileCache.find(path);
|
std::map<QString, FileInfo>::const_iterator itr = instance->fileCache.find(path);
|
||||||
@ -131,6 +133,8 @@ Shared::Global::FileInfo Shared::Global::getFileInfo(const QString& path)
|
|||||||
p = FileInfo::Preview::picture;
|
p = FileInfo::Preview::picture;
|
||||||
QImage img(path);
|
QImage img(path);
|
||||||
size = img.size();
|
size = img.size();
|
||||||
|
} else {
|
||||||
|
size = defaultIconFileInfoHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
itr = instance->fileCache.insert(std::make_pair(path, FileInfo({info.fileName(), size, type, p}))).first;
|
itr = instance->fileCache.insert(std::make_pair(path, FileInfo({info.fileName(), size, type, p}))).first;
|
||||||
|
@ -532,20 +532,23 @@ QModelIndex Models::MessageFeed::modelIndexById(const QString& id) const
|
|||||||
|
|
||||||
QModelIndex Models::MessageFeed::modelIndexByTime(const QString& id, const QDateTime& time) const
|
QModelIndex Models::MessageFeed::modelIndexByTime(const QString& id, const QDateTime& time) const
|
||||||
{
|
{
|
||||||
StorageByTime::const_iterator tItr = indexByTime.upper_bound(time);
|
if (indexByTime.size() > 0) {
|
||||||
StorageByTime::const_iterator tBeg = indexByTime.begin();
|
StorageByTime::const_iterator tItr = indexByTime.upper_bound(time);
|
||||||
bool found = false;
|
StorageByTime::const_iterator tBeg = indexByTime.begin();
|
||||||
while (tItr != tBeg) {
|
StorageByTime::const_iterator tEnd = indexByTime.end();
|
||||||
if (id == (*tItr)->getId()) {
|
bool found = false;
|
||||||
found = true;
|
while (tItr != tBeg) {
|
||||||
break;
|
if (tItr != tEnd && id == (*tItr)->getId()) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
--tItr;
|
||||||
}
|
}
|
||||||
--tItr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found || id == (*tItr)->getId()) {
|
if (found && tItr != tEnd && id == (*tItr)->getId()) {
|
||||||
int position = indexByTime.rank(tItr);
|
int position = indexByTime.rank(tItr);
|
||||||
return createIndex(position, 0, *tItr);
|
return createIndex(position, 0, *tItr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return QModelIndex();
|
return QModelIndex();
|
||||||
|
@ -307,25 +307,48 @@ void MessageDelegate::paintBar(QProgressBar* bar, QPainter* painter, bool sentBy
|
|||||||
void MessageDelegate::paintPreview(const Models::FeedItem& data, QPainter* painter, QStyleOptionViewItem& option) const
|
void MessageDelegate::paintPreview(const Models::FeedItem& data, QPainter* painter, QStyleOptionViewItem& option) const
|
||||||
{
|
{
|
||||||
Shared::Global::FileInfo info = Shared::Global::getFileInfo(data.attach.localPath);
|
Shared::Global::FileInfo info = Shared::Global::getFileInfo(data.attach.localPath);
|
||||||
if (info.preview == Shared::Global::FileInfo::Preview::picture) {
|
QSize size = constrainAttachSize(info.size, option.rect.size());
|
||||||
QSize size = constrainAttachSize(info.size, option.rect.size());
|
|
||||||
|
|
||||||
QPoint start;
|
QPoint start;
|
||||||
if (data.sentByMe) {
|
if (data.sentByMe) {
|
||||||
start = {option.rect.width() - size.width(), option.rect.top()};
|
start = {option.rect.width() - size.width(), option.rect.top()};
|
||||||
start.rx() += margin;
|
start.rx() += margin;
|
||||||
} else {
|
} else {
|
||||||
start = option.rect.topLeft();
|
start = option.rect.topLeft();
|
||||||
}
|
|
||||||
QImage img(data.attach.localPath);
|
|
||||||
if (img.isNull()) {
|
|
||||||
emit invalidPath(data.id);
|
|
||||||
} else {
|
|
||||||
painter->drawImage(QRect(start, size), img);
|
|
||||||
}
|
|
||||||
|
|
||||||
option.rect.adjust(0, size.height() + textMargin, 0, 0);
|
|
||||||
}
|
}
|
||||||
|
QRect rect(start, size);
|
||||||
|
switch (info.preview) {
|
||||||
|
case Shared::Global::FileInfo::Preview::picture: {
|
||||||
|
QImage img(data.attach.localPath);
|
||||||
|
if (img.isNull()) {
|
||||||
|
emit invalidPath(data.id);
|
||||||
|
} else {
|
||||||
|
painter->drawImage(rect, img);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: {
|
||||||
|
QIcon icon = QIcon::fromTheme(info.mime.iconName());
|
||||||
|
|
||||||
|
painter->save();
|
||||||
|
|
||||||
|
painter->setFont(bodyFont);
|
||||||
|
int labelWidth = option.rect.width() - size.width() - margin;
|
||||||
|
QString elidedName = bodyMetrics.elidedText(info.name, Qt::ElideMiddle, labelWidth);
|
||||||
|
QSize nameSize = bodyMetrics.boundingRect(QRect(start, QSize(labelWidth, 0)), 0, elidedName).size();
|
||||||
|
if (data.sentByMe) {
|
||||||
|
start.rx() -= nameSize.width() + margin;
|
||||||
|
}
|
||||||
|
painter->drawPixmap({start, size}, icon.pixmap(info.size));
|
||||||
|
start.rx() += size.width() + margin;
|
||||||
|
start.ry() += nameSize.height() + (size.height() - nameSize.height()) / 2;
|
||||||
|
painter->drawText(start, elidedName);
|
||||||
|
|
||||||
|
painter->restore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
option.rect.adjust(0, size.height() + textMargin, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
QPushButton * MessageDelegate::getButton(const Models::FeedItem& data) const
|
QPushButton * MessageDelegate::getButton(const Models::FeedItem& data) const
|
||||||
|
Loading…
Reference in New Issue
Block a user