ChatItem::ChatItem(ChatLineModel::ColumnType col, QAbstractItemModel *model, QGraphicsItem *parent)
: QGraphicsItem(parent),
_fontMetrics(0),
- _layoutData(0),
_selectionMode(NoSelection),
- _selectionStart(-1)
+ _selectionStart(-1),
+ _layout(0)
{
Q_ASSERT(model);
QModelIndex index = model->index(row(), col);
}
ChatItem::~ChatItem() {
- delete _layoutData;
+ delete _layout;
}
QVariant ChatItem::data(int role) const {
return layout;
}
-void ChatItem::setLayout(QTextLayout *layout) {
- if(!_layoutData)
- _layoutData = new LayoutData;
- _layoutData->layout = layout;
-}
-
void ChatItem::updateLayout() {
if(!haveLayout())
setLayout(createLayout(QTextOption::WrapAnywhere, Qt::AlignLeft));
layout()->endLayout();
}
-void ChatItem::clearLayoutData() {
- delete _layoutData;
- _layoutData = 0;
+void ChatItem::clearLayout() {
+ delete _layout;
+ _layout = 0;
}
// NOTE: This is not the most time-efficient implementation, but it saves space by not caching unnecessary data
}
void ChatItem::clearSelection() {
- if(_selectionMode != NoSelection) {
- _selectionMode = NoSelection;
- update();
- }
+ _selectionMode = NoSelection;
+ update();
}
void ChatItem::continueSelecting(const QPointF &pos) {
return resultList;
}
-
void ChatItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
if(event->buttons() == Qt::LeftButton) {
- if(_selectionMode == NoSelection) {
- chatScene()->setSelectingItem(this); // removes earlier selection if exists
- _selectionStart = _selectionEnd = posToCursor(event->pos());
- //_selectionMode = PartialSelection;
- } else {
- chatScene()->setSelectingItem(0);
- _selectionMode = NoSelection;
- update();
- }
+ chatScene()->setSelectingItem(this);
+ _selectionStart = _selectionEnd = posToCursor(event->pos());
+ _selectionMode = NoSelection; // will be set to PartialSelection by mouseMoveEvent
+ update();
event->accept();
} else {
event->ignore();
qint16 end = posToCursor(event->pos());
if(end != _selectionEnd) {
_selectionEnd = end;
- if(_selectionStart != _selectionEnd) _selectionMode = PartialSelection;
- else _selectionMode = NoSelection;
+ _selectionMode = (_selectionStart != _selectionEnd ? PartialSelection : NoSelection);
update();
}
} else {
}
}
-void ChatItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) {
- // FIXME dirty and fast hack to make http:// urls klickable
-
- QRegExp regex("\\b([hf]t{1,2}ps?://[^\\s]+)\\b");
- QString str = data(ChatLineModel::DisplayRole).toString();
- int idx = posToCursor(event->pos());
- int mi = 0;
- do {
- mi = regex.indexIn(str, mi);
- if(mi < 0) break;
- if(idx >= mi && idx < mi + regex.matchedLength()) {
- QDesktopServices::openUrl(QUrl(regex.capturedTexts()[1]));
- break;
- }
- mi += regex.matchedLength();
- } while(mi >= 0);
- event->accept();
-}
-
-void ChatItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) {
- //qDebug() << (void*)this << "entering";
- event->ignore();
-}
-
-void ChatItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) {
- //qDebug() << (void*)this << "leaving";
- event->ignore();
-}
-
-void ChatItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) {
- //qDebug() << (void*)this << event->pos();
- event->ignore();
-}
-
/*************************************************************************************************/
/*************************************************************************************************/
/*************************************************************************************************/
+ContentsChatItem::ContentsChatItem(QAbstractItemModel *model, QGraphicsItem *parent) : ChatItem(column(), model, parent),
+ _layoutData(0)
+{
+
+}
+
+ContentsChatItem::~ContentsChatItem() {
+ delete _layoutData;
+}
+
qreal ContentsChatItem::computeHeight() {
int lines = 1;
WrapColumnFinder finder(this);
return lines * fontMetrics()->lineSpacing();
}
+void ContentsChatItem::setLayout(QTextLayout *layout) {
+ if(!_layoutData)
+ _layoutData = new LayoutData;
+ _layoutData->layout = layout;
+}
+
+void ContentsChatItem::clearLayout() {
+ delete _layoutData;
+ _layoutData = 0;
+}
+
void ContentsChatItem::updateLayout() {
if(!haveLayout()) setLayout(createLayout(QTextOption::WrapAnywhere));
layout()->endLayout();
}
+void ContentsChatItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) {
+ // FIXME dirty and fast hack to make http:// urls klickable
+
+ QRegExp regex("\\b([hf]t{1,2}ps?://[^\\s]+)\\b");
+ QString str = data(ChatLineModel::DisplayRole).toString();
+ int idx = posToCursor(event->pos());
+ int mi = 0;
+ do {
+ mi = regex.indexIn(str, mi);
+ if(mi < 0) break;
+ if(idx >= mi && idx < mi + regex.matchedLength()) {
+ QDesktopServices::openUrl(QUrl(regex.capturedTexts()[1]));
+ break;
+ }
+ mi += regex.matchedLength();
+ } while(mi >= 0);
+ event->accept();
+}
+
+void ContentsChatItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) {
+ //qDebug() << (void*)this << "entering";
+ event->ignore();
+}
+
+void ContentsChatItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) {
+ //qDebug() << (void*)this << "leaving";
+ event->ignore();
+}
+
+void ContentsChatItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) {
+ //qDebug() << (void*)this << event->pos();
+ event->ignore();
+}
/*************************************************************************************************/