unsigned char *ChatLineModelItem::TextBoundaryFinderBuffer = (unsigned char *)malloc(512 * sizeof(HB_CharAttributes_Dummy));
int ChatLineModelItem::TextBoundaryFinderBufferSize = 512 * (sizeof(HB_CharAttributes_Dummy) / sizeof(unsigned char));
+struct ChatLineModelItemPrivate {
+ ChatLineModel::WrapList wrapList;
+};
+
ChatLineModelItem::ChatLineModelItem(const Message &msg)
- : MessageModelItem(msg)
+ : MessageModelItem(msg),
+ _data(new ChatLineModelItemPrivate)
{
QtUiStyle::StyledMessage m = QtUi::style()->styleMessage(msg);
_timestamp.formatList = m.timestamp.formatList;
_sender.formatList = m.sender.formatList;
_contents.formatList = m.contents.formatList;
-
- computeWrapList();
}
+ChatLineModelItem::~ChatLineModelItem() {
+ delete _data;
+}
QVariant ChatLineModelItem::data(int column, int role) const {
const ChatLinePart *part = 0;
case ChatLineModel::WrapListRole:
if(column != ChatLineModel::ContentsColumn)
return QVariant();
- return QVariant::fromValue<ChatLineModel::WrapList>(_wrapList);
+ if(_data->wrapList.isEmpty())
+ computeWrapList();
+ return QVariant::fromValue<ChatLineModel::WrapList>(_data->wrapList);
}
return MessageModelItem::data(column, role);
}
-void ChatLineModelItem::computeWrapList() {
+void ChatLineModelItem::computeWrapList() const {
if(_contents.plainText.isEmpty())
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, _contents.plainText);
QTextBoundaryFinder finder(QTextBoundaryFinder::Word, _contents.plainText.unicode(), _contents.plainText.length(), TextBoundaryFinderBuffer, TextBoundaryFinderBufferSize);
int idx;
Mode mode = SearchEnd;
ChatLineModel::Word word;
word.start = 0;
- int wordstartx = 0;
+ qreal wordstartx = 0;
QTextLayout layout(_contents.plainText);
QTextOption option;
mode = SearchStart;
continue;
}
- int wordendx = line.cursorToX(oldidx);
- int trailingendx = line.cursorToX(idx);
+ qreal wordendx = line.cursorToX(oldidx);
+ qreal trailingendx = line.cursorToX(idx);
word.width = wordendx - wordstartx;
word.trailing = trailingendx - wordendx;
wordstartx = trailingendx;
} while(finder.isAtBoundary() || (finder.position() == _contents.plainText.length()));
// A QVector needs less space than a QList
- _wrapList.resize(wplist.count());
+ _data->wrapList.resize(wplist.count());
for(int i = 0; i < wplist.count(); i++) {
- _wrapList[i] = wplist.at(i);
+ _data->wrapList[i] = wplist.at(i);
}
}