Workaround the wordwrap issues with Qt
authorManuel Nickschas <sputnick@quassel-irc.org>
Mon, 14 Sep 2009 17:57:21 +0000 (19:57 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Mon, 14 Sep 2009 18:01:26 +0000 (20:01 +0200)
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.

src/qtui/chatitem.cpp
src/qtui/chatitem.h

index 8ff441c..e255d00 100644 (file)
@@ -438,6 +438,7 @@ qreal ContentsChatItem::setGeometryByWidth(qreal w) {
 }
 
 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
 
@@ -450,7 +451,23 @@ void ContentsChatItem::doLayout(QTextLayout *layout) const {
       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();
   }
index e94bda1..eb8a07e 100644 (file)
@@ -189,7 +189,7 @@ protected:
   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;