X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.cpp;h=13cae26fb9295e2c79622294264964b17aa13e8d;hb=880b9a0d6241db964712921a20ebf8cd187daec2;hp=495a97ef434b2a0a376721e6db47d9f29160bca2;hpb=176d22d49934223b9279719ac5d9e7c03e530d40;p=quassel.git diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index 495a97ef..13cae26f 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -32,17 +32,13 @@ #include "qtui.h" #include "qtuistyle.h" -ChatItem::ChatItem(const qreal &width, const qreal &height, const QPointF &pos, ChatLineModel::ColumnType col, QGraphicsItem *parent) +ChatItem::ChatItem(const qreal &width, const qreal &height, const QPointF &pos, QGraphicsItem *parent) : QGraphicsItem(parent), _data(0), _boundingRect(0, 0, width, height), - _fontMetrics(0), _selectionMode(NoSelection), _selectionStart(-1) { - const QAbstractItemModel *model_ = model(); - QModelIndex index = model_->index(row(), col); - _fontMetrics = QtUi::style()->fontMetrics(model_->data(index, ChatLineModel::FormatRole).value().at(0).second); setAcceptHoverEvents(true); setZValue(20); setPos(pos); @@ -185,17 +181,21 @@ QList ChatItem::findWords(const QString &searchWord, Qt::CaseSensitivity searchIdx = plainText.indexOf(searchWord, searchIdx + 1, caseSensitive); } - if(!hasLayout()) + bool hadLayout = hasLayout(); + if(!hadLayout) updateLayout(); foreach(int idx, indexList) { QTextLine line = layout()->lineForTextPosition(idx); qreal x = line.cursorToX(idx); qreal width = line.cursorToX(idx + searchWord.count()) - x; - qreal height = fontMetrics()->lineSpacing(); + qreal height = line.height(); qreal y = height * line.lineNumber(); resultList << QRectF(x, y, width, height); } + + if(!hadLayout) + clearLayout(); return resultList; } @@ -250,8 +250,12 @@ void ChatItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { // ContentsChatItem // ************************************************************ ContentsChatItem::ContentsChatItem(const qreal &width, const QPointF &pos, QGraphicsItem *parent) - : ChatItem(0, 0, pos, column(), parent) + : ChatItem(0, 0, pos, parent) { + const QAbstractItemModel *model_ = model(); + QModelIndex index = model_->index(row(), column()); + _fontMetrics = QtUi::style()->fontMetrics(model_->data(index, ChatLineModel::FormatRole).value().at(0).second); + setGeometryByWidth(width); } @@ -454,10 +458,7 @@ ContentsChatItem::WrapColumnFinder::WrapColumnFinder(ChatItem *_item) wrapList(item->data(ChatLineModel::WrapListRole).value()), wordidx(0), lineCount(0), - choppedTrailing(0), - lastwrapcol(0), - lastwrappos(0), - width(0) + choppedTrailing(0) { } @@ -476,25 +477,41 @@ qint16 ContentsChatItem::WrapColumnFinder::nextWrapColumn() { qint16 end = wrapList.count() - 1; // check if the whole line fits - if(wrapList.at(end).endX <= targetWidth || start == end) + if(wrapList.at(end).endX <= targetWidth) // || start == end) return -1; + // check if we have a very long word that needs inter word wrap + if(wrapList.at(start).endX > targetWidth) { + if(!line.isValid()) { + layout = item->createLayout(QTextOption::NoWrap); + layout->beginLayout(); + line = layout->createLine(); + layout->endLayout(); + } + return line.xToCursor(targetWidth, QTextLine::CursorOnCharacter); + } + while(true) { - if(start == end) { - wordidx = start; - if(wordidx > 0) { - const ChatLineModel::Word &prevWord = wrapList.at(wordidx - 1); - choppedTrailing += prevWord.trailing - (targetWidth - prevWord.endX); - } + if(start + 1 == end) { + wordidx = end; + const ChatLineModel::Word &lastWord = wrapList.at(start); // the last word we were able to squeeze in + + // both cases should be cought preliminary + Q_ASSERT(lastWord.endX <= targetWidth); // ensure that "start" really fits in + Q_ASSERT(end < wrapList.count()); // ensure that start isn't the last word + + choppedTrailing += lastWord.trailing - (targetWidth - lastWord.endX); return wrapList.at(wordidx).start; } + qint16 pivot = (end + start) / 2; - if(wrapList.at(pivot).endX > targetWidth && wordidx != pivot) { + if(wrapList.at(pivot).endX > targetWidth) { end = pivot; } else { - start = pivot + 1; + start = pivot; } } + Q_ASSERT(false); return -1; }