Show one-letter words again
[quassel.git] / src / qtui / chatlinemodelitem.cpp
index 343fb99..824e9da 100644 (file)
@@ -52,6 +52,16 @@ ChatLineModelItem::ChatLineModelItem(const Message &msg)
     _styledMsg.setFlags(msg.flags() |= Message::ServerMsg);
 }
 
+bool ChatLineModelItem::setData(int column, const QVariant &value, int role) {
+  switch(role) {
+    case MessageModel::FlagsRole:
+      _styledMsg.setFlags((Message::Flags)value.toUInt());
+      return true;
+    default:
+      return MessageModelItem::setData(column, value, role);
+  }
+}
+
 QVariant ChatLineModelItem::data(int column, int role) const {
   if(role == ChatLineModel::MsgLabelRole)
     return messageLabel();
@@ -146,21 +156,17 @@ QVariant ChatLineModelItem::backgroundBrush(UiStyle::FormatType subelement, bool
 }
 
 void ChatLineModelItem::computeWrapList() const {
-  int length = _styledMsg.plainContents().length();
+  QString text = _styledMsg.plainContents();
+  int length = text.length();
   if(!length)
     return;
 
-  enum Mode { SearchStart, SearchEnd };
-
   QList<ChatLineModel::Word> wplist;  // use a temp list which we'll later copy into a QVector for efficiency
-  QTextBoundaryFinder finder(QTextBoundaryFinder::Word, _styledMsg.plainContents().unicode(), length,
+  QTextBoundaryFinder finder(QTextBoundaryFinder::Line, _styledMsg.plainContents().unicode(), length,
                               TextBoundaryFinderBuffer, TextBoundaryFinderBufferSize);
 
   int idx;
   int oldidx = 0;
-  bool wordStart = false;
-  bool wordEnd = false;
-  Mode mode = SearchEnd;
   ChatLineModel::Word word;
   word.start = 0;
   qreal wordstartx = 0;
@@ -176,27 +182,21 @@ void ChatLineModelItem::computeWrapList() const {
   line.setNumColumns(length);
   layout.endLayout();
 
-  do {
-    idx = finder.toNextBoundary();
-    if(idx < 0) {
-      idx = length;
-      wordStart = false;
-      wordEnd = false;
-      mode = SearchStart;
-    } else {
-      wordStart = finder.boundaryReasons().testFlag(QTextBoundaryFinder::StartWord);
-      wordEnd = finder.boundaryReasons().testFlag(QTextBoundaryFinder::EndWord);
-    }
+  while((idx = finder.toNextBoundary()) >= 0 && idx <= length) {
+    if(idx < length)
+      idx++;  // the boundary is *before* the actual character
 
-    //if(flg) qDebug() << idx << mode << wordStart << wordEnd << contents->plainText.left(idx) << contents->plainText.mid(idx);
-
-    if(mode == SearchEnd || (!wordStart && wordEnd)) {
-      if(wordStart || !wordEnd) continue;
-      oldidx = idx;
-      mode = SearchStart;
+    if(idx == oldidx)
       continue;
+
+    word.start = oldidx;
+    int wordend = idx;
+    for(; wordend > word.start; wordend--) {
+      if(!text.at(wordend-1).isSpace())
+        break;
     }
-    qreal wordendx = line.cursorToX(oldidx);
+
+    qreal wordendx = line.cursorToX(wordend);
     qreal trailingendx = line.cursorToX(idx);
     word.endX = wordendx;
     word.width = wordendx - wordstartx;
@@ -204,13 +204,8 @@ void ChatLineModelItem::computeWrapList() const {
     wordstartx = trailingendx;
     wplist.append(word);
 
-    if(wordStart) {
-      word.start = idx;
-      mode = SearchEnd;
-    }
-    // the part " || (finder.position() == contents->plainText.length())" shouldn't be necessary
-    // but in rare and indeterministic cases Qt states that the end of the text is not a boundary o_O
-  } while(finder.isAtBoundary() || (finder.position() == length));
+    oldidx = idx;
+  }
 
   // A QVector needs less space than a QList
   _wrapList.resize(wplist.count());