This is a real fugly workaround for Qt bug 238249. As long as it makes Quassel wrap words correctly,
I'm willing to live with it though.
There's still some pathological cases where we still get it wrong (long URLs with real narrow columns,
apparently), but meh.
Closes #579, closes #704.
}
void ContentsChatItem::doLayout(QTextLayout *layout) const {
}
void ContentsChatItem::doLayout(QTextLayout *layout) const {
+ // QString t = data(Qt::DisplayRole).toString(); bool d = t.contains("protien");
ChatLineModel::WrapList wrapList = data(ChatLineModel::WrapListRole).value<ChatLineModel::WrapList>();
if(!wrapList.count()) return; // empty chatitem
ChatLineModel::WrapList wrapList = data(ChatLineModel::WrapListRole).value<ChatLineModel::WrapList>();
if(!wrapList.count()) return; // empty chatitem
break;
int col = finder.nextWrapColumn(width());
break;
int col = finder.nextWrapColumn(width());
- line.setNumColumns(col >= 0 ? col - line.textStart() : layout->text().length());
+ if(col < 0)
+ col = layout->text().length();
+ int num = col - line.textStart();
+
+ line.setNumColumns(num);
+
+ // Sometimes, setNumColumns will create a line that's too long (cf. Qt bug 238249)
+ // We verify this and try setting the width again, making it shorter each time until the lengths match.
+ // Dead fugly, but seems to work…
+ for(int i = line.textLength()-1; line.textLength() > num; i--) {
+ line.setNumColumns(i);
+ }
+ if(num != line.textLength()) {
+ qWarning() << "WARNING: Layout engine couldn't workaround Qt bug 238249, please report!";
+ // qDebug() << num << line.textLength() << t.mid(line.textStart(), line.textLength()) << t.mid(line.textStart() + line.textLength());
+ }
+
line.setPosition(QPointF(0, h));
h += fontMetrics()->lineSpacing();
}
line.setPosition(QPointF(0, h));
h += fontMetrics()->lineSpacing();
}
virtual QVector<QTextLayout::FormatRange> additionalFormats() const;
virtual inline void initLayout(QTextLayout *layout) const {
virtual QVector<QTextLayout::FormatRange> additionalFormats() const;
virtual inline void initLayout(QTextLayout *layout) const {
- initLayoutHelper(layout, QTextOption::WrapAnywhere);
+ initLayoutHelper(layout, QTextOption::WrapAtWordBoundaryOrAnywhere);
doLayout(layout);
}
virtual void doLayout(QTextLayout *layout) const;
doLayout(layout);
}
virtual void doLayout(QTextLayout *layout) const;