X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatscene.cpp;fp=src%2Fqtui%2Fchatscene.cpp;h=80dde194b5ff8e1e4a333c508311c27d3ba14f2a;hp=1727514493ee072ad48d29ec06e4496d2fcbd3e1;hb=c1cf157116de7fc3da96203aa6f03c38c7ebb650;hpb=30b159cb876a9495de42e9a3e70ca050516f0805 diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 17275144..80dde194 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -34,9 +34,9 @@ #include #ifdef HAVE_WEBENGINE -# include +# include #elif defined HAVE_WEBKIT -# include +# include #endif #include "chatitem.h" @@ -58,29 +58,29 @@ const qreal minContentsWidth = 200; -ChatScene::ChatScene(QAbstractItemModel *model, QString idString, qreal width, ChatView *parent) - : QGraphicsScene(0, 0, width, 0, (QObject *)parent), - _chatView(parent), - _idString(std::move(idString)), - _model(model), - _singleBufferId(BufferId()), - _sceneRect(0, 0, width, 0), - _firstLineRow(-1), - _viewportHeight(0), - _markerLine(new MarkerLineItem(width)), - _markerLineVisible(false), - _markerLineValid(false), - _markerLineJumpPending(false), - _cutoffMode(CutoffRight), - _alwaysBracketSender(false), - _selectingItem(nullptr), - _selectionStart(-1), - _isSelecting(false), - _clickMode(NoClick), - _clickHandled(true), - _leftButtonPressed(false) +ChatScene::ChatScene(QAbstractItemModel* model, QString idString, qreal width, ChatView* parent) + : QGraphicsScene(0, 0, width, 0, (QObject*)parent) + , _chatView(parent) + , _idString(std::move(idString)) + , _model(model) + , _singleBufferId(BufferId()) + , _sceneRect(0, 0, width, 0) + , _firstLineRow(-1) + , _viewportHeight(0) + , _markerLine(new MarkerLineItem(width)) + , _markerLineVisible(false) + , _markerLineValid(false) + , _markerLineJumpPending(false) + , _cutoffMode(CutoffRight) + , _alwaysBracketSender(false) + , _selectingItem(nullptr) + , _selectionStart(-1) + , _isSelecting(false) + , _clickMode(NoClick) + , _clickHandled(true) + , _leftButtonPressed(false) { - auto *filter = qobject_cast(model); + auto* filter = qobject_cast(model); if (filter && filter->isSingleBufferFilter()) { _singleBufferId = filter->singleBufferId(); } @@ -114,12 +114,9 @@ ChatScene::ChatScene(QAbstractItemModel *model, QString idString, qreal width, C if (model->rowCount() > 0) rowsInserted(QModelIndex(), 0, model->rowCount() - 1); - connect(model, &QAbstractItemModel::rowsInserted, - this, &ChatScene::rowsInserted); - connect(model, &QAbstractItemModel::rowsAboutToBeRemoved, - this, &ChatScene::rowsAboutToBeRemoved); - connect(model, &QAbstractItemModel::rowsRemoved, - this, &ChatScene::rowsRemoved); + connect(model, &QAbstractItemModel::rowsInserted, this, &ChatScene::rowsInserted); + connect(model, &QAbstractItemModel::rowsAboutToBeRemoved, this, &ChatScene::rowsAboutToBeRemoved); + connect(model, &QAbstractItemModel::rowsRemoved, this, &ChatScene::rowsRemoved); connect(model, &QAbstractItemModel::dataChanged, this, &ChatScene::dataChanged); #if defined HAVE_WEBKIT || defined HAVE_WEBENGINE @@ -146,44 +143,39 @@ ChatScene::ChatScene(QAbstractItemModel *model, QString idString, qreal width, C setItemIndexMethod(QGraphicsScene::NoIndex); } - -ChatView *ChatScene::chatView() const +ChatView* ChatScene::chatView() const { return _chatView; } - -ColumnHandleItem *ChatScene::firstColumnHandle() const +ColumnHandleItem* ChatScene::firstColumnHandle() const { return _firstColHandle; } - -ColumnHandleItem *ChatScene::secondColumnHandle() const +ColumnHandleItem* ChatScene::secondColumnHandle() const { return _secondColHandle; } void ChatScene::resetColumnWidths() { - //make sure first column is at least 80 px wide, second 120 px - int firstColHandlePos = qMax(_defaultFirstColHandlePos, - 80); - int secondColHandlePos = qMax(_defaultSecondColHandlePos, - firstColHandlePos + 120); + // make sure first column is at least 80 px wide, second 120 px + int firstColHandlePos = qMax(_defaultFirstColHandlePos, 80); + int secondColHandlePos = qMax(_defaultSecondColHandlePos, firstColHandlePos + 120); _firstColHandle->setXPos(firstColHandlePos); _secondColHandle->setXPos(secondColHandlePos); } -ChatLine *ChatScene::chatLine(MsgId msgId, bool matchExact, bool ignoreDayChange) const +ChatLine* ChatScene::chatLine(MsgId msgId, bool matchExact, bool ignoreDayChange) const { if (!_lines.count()) return nullptr; - QList::ConstIterator start = _lines.begin(); - QList::ConstIterator end = _lines.end(); - QList::ConstIterator middle; + QList::ConstIterator start = _lines.begin(); + QList::ConstIterator end = _lines.end(); + QList::ConstIterator middle; auto n = int(end - start); int half; @@ -206,16 +198,16 @@ ChatLine *ChatScene::chatLine(MsgId msgId, bool matchExact, bool ignoreDayChange if (matchExact) return nullptr; - if (start == _lines.begin()) // not (yet?) in our scene + if (start == _lines.begin()) // not (yet?) in our scene return nullptr; // if we didn't find the exact msgId, take the next-lower one (this makes sense for lastSeen) - if (start == end) { // higher than last element + if (start == end) { // higher than last element if (!ignoreDayChange) return _lines.last(); - for (int i = _lines.count() -1; i >= 0; i--) { + for (int i = _lines.count() - 1; i >= 0; i--) { if (_lines.at(i)->msgType() != Message::DayChange) return _lines.at(i); } @@ -229,33 +221,29 @@ ChatLine *ChatScene::chatLine(MsgId msgId, bool matchExact, bool ignoreDayChange do { if ((*(--start))->msgType() != Message::DayChange) return *start; - } - while (start != _lines.begin()); + } while (start != _lines.begin()); return nullptr; } - -ChatItem *ChatScene::chatItemAt(const QPointF &scenePos) const +ChatItem* ChatScene::chatItemAt(const QPointF& scenePos) const { - foreach(QGraphicsItem *item, items(scenePos, Qt::IntersectsItemBoundingRect, Qt::AscendingOrder)) { - auto *line = qgraphicsitem_cast(item); + foreach (QGraphicsItem* item, items(scenePos, Qt::IntersectsItemBoundingRect, Qt::AscendingOrder)) { + auto* line = qgraphicsitem_cast(item); if (line) return line->itemAt(line->mapFromScene(scenePos)); } return nullptr; } - -bool ChatScene::containsBuffer(const BufferId &id) const +bool ChatScene::containsBuffer(const BufferId& id) const { - auto *filter = qobject_cast(model()); + auto* filter = qobject_cast(model()); if (filter) return filter->containsBuffer(id); else return false; } - void ChatScene::setMarkerLineVisible(bool visible) { _markerLineVisible = visible; @@ -265,7 +253,6 @@ void ChatScene::setMarkerLineVisible(bool visible) markerLine()->setVisible(false); } - void ChatScene::setMarkerLine(MsgId msgId) { if (!isSingleBufferScene()) @@ -275,7 +262,7 @@ void ChatScene::setMarkerLine(MsgId msgId) msgId = Client::markerLine(singleBufferId()); if (msgId.isValid()) { - ChatLine *line = chatLine(msgId, false, true); + ChatLine* line = chatLine(msgId, false, true); if (line) { markerLine()->setChatLine(line); // if this was the last line, we won't see it because it's outside the sceneRect @@ -301,7 +288,6 @@ void ChatScene::setMarkerLine(MsgId msgId) markerLine()->setVisible(false); } - void ChatScene::jumpToMarkerLine(bool requestBacklog) { if (!isSingleBufferScene()) @@ -326,28 +312,27 @@ void ChatScene::jumpToMarkerLine(bool requestBacklog) } } - -void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) +void ChatScene::rowsInserted(const QModelIndex& index, int start, int end) { Q_UNUSED(index); -// QModelIndex sidx = model()->index(start, 2); -// QModelIndex eidx = model()->index(end, 2); -// qDebug() << "rowsInserted:"; -// if(start > 0) { -// QModelIndex ssidx = model()->index(start - 1, 2); -// qDebug() << "Start--:" << start - 1 << ssidx.data(MessageModel::MsgIdRole).value() -// << ssidx.data(Qt::DisplayRole).toString(); -// } -// qDebug() << "Start:" << start << sidx.data(MessageModel::MsgIdRole).value() -// << sidx.data(Qt::DisplayRole).toString(); -// qDebug() << "End:" << end << eidx.data(MessageModel::MsgIdRole).value() -// << eidx.data(Qt::DisplayRole).toString(); -// if(end + 1 < model()->rowCount()) { -// QModelIndex eeidx = model()->index(end + 1, 2); -// qDebug() << "End++:" << end + 1 << eeidx.data(MessageModel::MsgIdRole).value() -// << eeidx.data(Qt::DisplayRole).toString(); -// } + // QModelIndex sidx = model()->index(start, 2); + // QModelIndex eidx = model()->index(end, 2); + // qDebug() << "rowsInserted:"; + // if(start > 0) { + // QModelIndex ssidx = model()->index(start - 1, 2); + // qDebug() << "Start--:" << start - 1 << ssidx.data(MessageModel::MsgIdRole).value() + // << ssidx.data(Qt::DisplayRole).toString(); + // } + // qDebug() << "Start:" << start << sidx.data(MessageModel::MsgIdRole).value() + // << sidx.data(Qt::DisplayRole).toString(); + // qDebug() << "End:" << end << eidx.data(MessageModel::MsgIdRole).value() + // << eidx.data(Qt::DisplayRole).toString(); + // if(end + 1 < model()->rowCount()) { + // QModelIndex eeidx = model()->index(end + 1, 2); + // qDebug() << "End++:" << end + 1 << eeidx.data(MessageModel::MsgIdRole).value() + // << eeidx.data(Qt::DisplayRole).toString(); + // } qreal h = 0; qreal y = 0; @@ -370,23 +355,17 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) if (atTop) { for (int i = end; i >= start; i--) { - auto *line = new ChatLine(i, model(), - width, - timestampWidth, senderWidth, contentsWidth, - senderPos, contentsPos); + auto* line = new ChatLine(i, model(), width, timestampWidth, senderWidth, contentsWidth, senderPos, contentsPos); h += line->height(); - line->setPos(0, y-h); + line->setPos(0, y - h); _lines.insert(start, line); addItem(line); } } else { for (int i = start; i <= end; i++) { - auto *line = new ChatLine(i, model(), - width, - timestampWidth, senderWidth, contentsWidth, - senderPos, contentsPos); - line->setPos(0, y+h); + auto* line = new ChatLine(i, model(), width, timestampWidth, senderWidth, contentsWidth, senderPos, contentsPos); + line->setPos(0, y + h); h += line->height(); _lines.insert(i, line); addItem(line); @@ -394,7 +373,7 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) } // update existing items - for (int i = end+1; i < _lines.count(); i++) { + for (int i = end + 1; i < _lines.count(); i++) { _lines[i]->setRow(i); } @@ -416,7 +395,7 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) // neither pre- or append means we have to do dirty work: move items... if (!(atTop || atBottom)) { - ChatLine *line = nullptr; + ChatLine* line = nullptr; for (int i = 0; i <= end; i++) { line = _lines.at(i); line->setPos(0, line->pos().y() - h); @@ -427,25 +406,23 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) // check if all went right Q_ASSERT(start == 0 || _lines.at(start - 1)->pos().y() + _lines.at(start - 1)->height() == _lines.at(start)->pos().y()); -// if(start != 0) { -// if(_lines.at(start - 1)->pos().y() + _lines.at(start - 1)->height() != _lines.at(start)->pos().y()) { -// qDebug() << "lines:" << _lines.count() << "start:" << start << "end:" << end; -// qDebug() << "line[start - 1]:" << _lines.at(start - 1)->pos().y() << "+" << _lines.at(start - 1)->height() << "=" << _lines.at(start - 1)->pos().y() + _lines.at(start - 1)->height(); -// qDebug() << "line[start]" << _lines.at(start)->pos().y(); -// qDebug() << "needed moving:" << !(atTop || atBottom) << moveTop << moveStart << moveEnd << offset; -// Q_ASSERT(false) -// } -// } + // if(start != 0) { + // if(_lines.at(start - 1)->pos().y() + _lines.at(start - 1)->height() != _lines.at(start)->pos().y()) { + // qDebug() << "lines:" << _lines.count() << "start:" << start << "end:" << end; + // qDebug() << "line[start - 1]:" << _lines.at(start - 1)->pos().y() << "+" << _lines.at(start - 1)->height() << "=" << + // _lines.at(start - 1)->pos().y() + _lines.at(start - 1)->height(); qDebug() << "line[start]" << _lines.at(start)->pos().y(); qDebug() + // << "needed moving:" << !(atTop || atBottom) << moveTop << moveStart << moveEnd << offset; Q_ASSERT(false) + // } + // } Q_ASSERT(end + 1 == _lines.count() || _lines.at(end)->pos().y() + _lines.at(end)->height() == _lines.at(end + 1)->pos().y()); -// if(end + 1 < _lines.count()) { -// if(_lines.at(end)->pos().y() + _lines.at(end)->height() != _lines.at(end + 1)->pos().y()) { -// qDebug() << "lines:" << _lines.count() << "start:" << start << "end:" << end; -// qDebug() << "line[end]:" << _lines.at(end)->pos().y() << "+" << _lines.at(end)->height() << "=" << _lines.at(end)->pos().y() + _lines.at(end)->height(); -// qDebug() << "line[end+1]" << _lines.at(end + 1)->pos().y(); -// qDebug() << "needed moving:" << !(atTop || atBottom) << moveTop << moveStart << moveEnd << offset; -// Q_ASSERT(false); -// } -// } + // if(end + 1 < _lines.count()) { + // if(_lines.at(end)->pos().y() + _lines.at(end)->height() != _lines.at(end + 1)->pos().y()) { + // qDebug() << "lines:" << _lines.count() << "start:" << start << "end:" << end; + // qDebug() << "line[end]:" << _lines.at(end)->pos().y() << "+" << _lines.at(end)->height() << "=" << _lines.at(end)->pos().y() + + // _lines.at(end)->height(); qDebug() << "line[end+1]" << _lines.at(end + 1)->pos().y(); qDebug() << "needed moving:" << !(atTop + // || atBottom) << moveTop << moveStart << moveEnd << offset; Q_ASSERT(false); + // } + // } if (!atBottom) { if (start < _firstLineRow) { @@ -467,12 +444,11 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) setMarkerLine(); } - -void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) +void ChatScene::rowsAboutToBeRemoved(const QModelIndex& parent, int start, int end) { Q_UNUSED(parent); - qreal h = 0; // total height of removed items; + qreal h = 0; // total height of removed items; bool atTop = (start == 0); bool atBottom = (end == _lines.count() - 1); @@ -485,7 +461,7 @@ void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int e } // remove items from scene - QList::iterator lineIter = _lines.begin() + start; + QList::iterator lineIter = _lines.begin() + start; int lineCount = start; while (lineIter != _lines.end() && lineCount <= end) { if ((*lineIter) == markerLine()->chatLine()) @@ -531,14 +507,15 @@ void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int e moveStart = start; offset = -offset; } - ChatLine *line = nullptr; + ChatLine* line = nullptr; for (int i = moveStart; i <= moveEnd; i++) { line = _lines.at(i); line->setPos(0, line->pos().y() + offset); } } - Q_ASSERT(start == 0 || start >= _lines.count() || _lines.at(start - 1)->pos().y() + _lines.at(start - 1)->height() == _lines.at(start)->pos().y()); + Q_ASSERT(start == 0 || start >= _lines.count() + || _lines.at(start - 1)->pos().y() + _lines.at(start - 1)->height() == _lines.at(start)->pos().y()); // update sceneRect // when searching for the first non-date-line we have to take into account that our @@ -554,50 +531,44 @@ void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int e needOffset = true; } firstLineIdx = model()->index(_firstLineRow, 0); - } - while ((Message::Type)(model()->data(firstLineIdx, MessageModel::TypeRole).toInt()) == Message::DayChange && _firstLineRow < numRows); + } while ((Message::Type)(model()->data(firstLineIdx, MessageModel::TypeRole).toInt()) == Message::DayChange && _firstLineRow < numRows); if (needOffset) _firstLineRow -= end - start + 1; updateSceneRect(); } - void ChatScene::rowsRemoved() { // move the marker line if necessary setMarkerLine(); } - -void ChatScene::dataChanged(const QModelIndex &tl, const QModelIndex &br) +void ChatScene::dataChanged(const QModelIndex& tl, const QModelIndex& br) { layout(tl.row(), br.row(), _sceneRect.width()); } - void ChatScene::updateForViewport(qreal width, qreal height) { _viewportHeight = height; setWidth(width); } - void ChatScene::setWidth(qreal width) { if (width == _sceneRect.width()) return; - layout(0, _lines.count()-1, width); + layout(0, _lines.count() - 1, width); } - void ChatScene::layout(int start, int end, qreal width) { // clock_t startT = clock(); // disabling the index while doing this complex updates is about // 2 to 10 times faster! - //setItemIndexMethod(QGraphicsScene::NoIndex); + // setItemIndexMethod(QGraphicsScene::NoIndex); if (end >= 0) { int row = end; @@ -609,7 +580,7 @@ void ChatScene::layout(int start, int end, qreal width) if (row >= 0) { // remaining items don't need geometry changes, but maybe repositioning? - ChatLine *line = _lines.at(row); + ChatLine* line = _lines.at(row); qreal offset = linePos - (line->scenePos().y() + line->height()); if (offset != 0) { while (row >= 0) { @@ -620,18 +591,17 @@ void ChatScene::layout(int start, int end, qreal width) } } - //setItemIndexMethod(QGraphicsScene::BspTreeIndex); + // setItemIndexMethod(QGraphicsScene::BspTreeIndex); updateSceneRect(width); setHandleXLimits(); setMarkerLine(); emit layoutChanged(); -// clock_t endT = clock(); -// qDebug() << "resized" << _lines.count() << "in" << (float)(endT - startT) / CLOCKS_PER_SEC << "sec"; + // clock_t endT = clock(); + // qDebug() << "resized" << _lines.count() << "in" << (float)(endT - startT) / CLOCKS_PER_SEC << "sec"; } - void ChatScene::firstHandlePositionChanged(qreal xpos) { if (_firstColHandlePos == xpos) @@ -647,10 +617,10 @@ void ChatScene::firstHandlePositionChanged(qreal xpos) // disabling the index while doing this complex updates is about // 2 to 10 times faster! - //setItemIndexMethod(QGraphicsScene::NoIndex); + // setItemIndexMethod(QGraphicsScene::NoIndex); - QList::iterator lineIter = _lines.end(); - QList::iterator lineIterBegin = _lines.begin(); + QList::iterator lineIter = _lines.end(); + QList::iterator lineIterBegin = _lines.begin(); qreal timestampWidth = firstColumnHandle()->sceneLeft(); qreal senderWidth = secondColumnHandle()->sceneLeft() - firstColumnHandle()->sceneRight(); QPointF senderPos(firstColumnHandle()->sceneRight(), 0); @@ -659,15 +629,14 @@ void ChatScene::firstHandlePositionChanged(qreal xpos) --lineIter; (*lineIter)->setFirstColumn(timestampWidth, senderWidth, senderPos); } - //setItemIndexMethod(QGraphicsScene::BspTreeIndex); + // setItemIndexMethod(QGraphicsScene::BspTreeIndex); setHandleXLimits(); -// clock_t endT = clock(); -// qDebug() << "resized" << _lines.count() << "in" << (float)(endT - startT) / CLOCKS_PER_SEC << "sec"; + // clock_t endT = clock(); + // qDebug() << "resized" << _lines.count() << "in" << (float)(endT - startT) / CLOCKS_PER_SEC << "sec"; } - void ChatScene::secondHandlePositionChanged(qreal xpos) { if (_secondColHandlePos == xpos) @@ -683,10 +652,10 @@ void ChatScene::secondHandlePositionChanged(qreal xpos) // disabling the index while doing this complex updates is about // 2 to 10 times faster! - //setItemIndexMethod(QGraphicsScene::NoIndex); + // setItemIndexMethod(QGraphicsScene::NoIndex); - QList::iterator lineIter = _lines.end(); - QList::iterator lineIterBegin = _lines.begin(); + QList::iterator lineIter = _lines.end(); + QList::iterator lineIterBegin = _lines.begin(); qreal linePos = _sceneRect.y() + _sceneRect.height(); qreal senderWidth = secondColumnHandle()->sceneLeft() - firstColumnHandle()->sceneRight(); qreal contentsWidth = _sceneRect.width() - secondColumnHandle()->sceneRight(); @@ -695,17 +664,16 @@ void ChatScene::secondHandlePositionChanged(qreal xpos) --lineIter; (*lineIter)->setSecondColumn(senderWidth, contentsWidth, contentsPos, linePos); } - //setItemIndexMethod(QGraphicsScene::BspTreeIndex); + // setItemIndexMethod(QGraphicsScene::BspTreeIndex); updateSceneRect(); setHandleXLimits(); emit layoutChanged(); -// clock_t endT = clock(); -// qDebug() << "resized" << _lines.count() << "in" << (float)(endT - startT) / CLOCKS_PER_SEC << "sec"; + // clock_t endT = clock(); + // qDebug() << "resized" << _lines.count() << "in" << (float)(endT - startT) / CLOCKS_PER_SEC << "sec"; } - void ChatScene::setHandleXLimits() { _firstColHandle->setXLimits(0, _secondColHandle->sceneLeft()); @@ -713,15 +681,14 @@ void ChatScene::setHandleXLimits() update(); } - -void ChatScene::setSelectingItem(ChatItem *item) +void ChatScene::setSelectingItem(ChatItem* item) { - if (_selectingItem) _selectingItem->clearSelection(); + if (_selectingItem) + _selectingItem->clearSelection(); _selectingItem = item; } - -void ChatScene::startGlobalSelection(ChatItem *item, const QPointF &itemPos) +void ChatScene::startGlobalSelection(ChatItem* item, const QPointF& itemPos) { _selectionStart = _selectionEnd = _firstSelectionRow = item->row(); _selectionStartCol = _selectionMinCol = item->column(); @@ -730,11 +697,11 @@ void ChatScene::startGlobalSelection(ChatItem *item, const QPointF &itemPos) updateSelection(item->mapToScene(itemPos)); } - -void ChatScene::updateSelection(const QPointF &pos) +void ChatScene::updateSelection(const QPointF& pos) { int curRow = rowByScenePos(pos); - if (curRow < 0) return; + if (curRow < 0) + return; auto curColumn = (int)columnByScenePos(pos); auto minColumn = (ChatLineModel::ColumnType)qMin(curColumn, _selectionStartCol); if (minColumn != _selectionMinCol) { @@ -754,11 +721,11 @@ void ChatScene::updateSelection(const QPointF &pos) _lines[l]->setSelected(false); } if (newend > _selectionEnd) { - for (int l = _selectionEnd+1; l <= newend; l++) + for (int l = _selectionEnd + 1; l <= newend; l++) _lines[l]->setSelected(true, minColumn); } if (newend < _selectionEnd) { - for (int l = newend+1; l <= _selectionEnd; l++) + for (int l = newend + 1; l <= _selectionEnd; l++) _lines[l]->setSelected(false); } @@ -777,10 +744,9 @@ void ChatScene::updateSelection(const QPointF &pos) } } - -bool ChatScene::isPosOverSelection(const QPointF &pos) const +bool ChatScene::isPosOverSelection(const QPointF& pos) const { - ChatItem *chatItem = chatItemAt(pos); + ChatItem* chatItem = chatItemAt(pos); if (!chatItem) return false; if (hasGlobalSelection()) { @@ -794,7 +760,6 @@ bool ChatScene::isPosOverSelection(const QPointF &pos) const return false; } - bool ChatScene::isScrollingAllowed() const { if (_isSelecting) @@ -805,10 +770,9 @@ bool ChatScene::isScrollingAllowed() const return true; } - /******** MOUSE HANDLING **************************************************************************/ -void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) +void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent* event) { QPointF pos = event->scenePos(); QMenu menu; @@ -818,7 +782,7 @@ void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) menu.addSeparator(); // item-specific options (select link etc) - ChatItem *item = chatItemAt(pos); + ChatItem* item = chatItemAt(pos); if (item) item->addActionsToMenu(&menu, item->mapFromScene(pos)); else @@ -827,8 +791,13 @@ void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) // If we have text selected, insert the Copy Selection as first item if (isPosOverSelection(pos)) { - QAction *sep = menu.insertSeparator(menu.actions().first()); - QAction *act = new Action(icon::get("edit-copy"), tr("Copy Selection"), &menu, this, [this]() { selectionToClipboard(); }, QKeySequence::Copy); + QAction* sep = menu.insertSeparator(menu.actions().first()); + QAction* act = new Action(icon::get("edit-copy"), + tr("Copy Selection"), + &menu, + this, + [this]() { selectionToClipboard(); }, + QKeySequence::Copy); menu.insertAction(sep, act); QString searchSelectionText = selection(); @@ -836,7 +805,7 @@ void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) searchSelectionText = searchSelectionText.left(_webSearchSelectionTextMaxVisible).append(QString::fromUtf8("…")); searchSelectionText = tr("Search '%1'").arg(searchSelectionText); - QAction *webSearchAction = new Action(icon::get("edit-find"), searchSelectionText, &menu, this, &ChatScene::webSearchOnSelection); + QAction* webSearchAction = new Action(icon::get("edit-find"), searchSelectionText, &menu, this, &ChatScene::webSearchOnSelection); menu.insertAction(sep, webSearchAction); } @@ -844,15 +813,14 @@ void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) menu.addAction(QtUi::actionCollection("General")->action("ToggleMenuBar")); // show column reset action if columns have been resized in this session or there is at least one very narrow column - if ((_firstColHandlePos != _defaultFirstColHandlePos) || (_secondColHandlePos != _defaultSecondColHandlePos) || - (_firstColHandlePos <= 10) || (_secondColHandlePos - _firstColHandlePos <= 10)) + if ((_firstColHandlePos != _defaultFirstColHandlePos) || (_secondColHandlePos != _defaultSecondColHandlePos) + || (_firstColHandlePos <= 10) || (_secondColHandlePos - _firstColHandlePos <= 10)) menu.addAction(new Action(tr("Reset Column Widths"), &menu, this, &ChatScene::resetColumnWidths)); menu.exec(event->screenPos()); } - -void ChatScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +void ChatScene::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { if (event->buttons() == Qt::LeftButton) { if (!_clickHandled && (event->scenePos() - _clickPos).toPoint().manhattanLength() >= QApplication::startDragDistance()) { @@ -878,8 +846,7 @@ void ChatScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) QGraphicsScene::mouseMoveEvent(event); } - -void ChatScene::mousePressEvent(QGraphicsSceneMouseEvent *event) +void ChatScene::mousePressEvent(QGraphicsSceneMouseEvent* event) { if (event->buttons() == Qt::LeftButton) { _leftButtonPressed = true; @@ -891,13 +858,17 @@ void ChatScene::mousePressEvent(QGraphicsSceneMouseEvent *event) if (_clickMode != NoClick && _clickTimer.isActive()) { switch (_clickMode) { case NoClick: - _clickMode = SingleClick; break; + _clickMode = SingleClick; + break; case SingleClick: - _clickMode = DoubleClick; break; + _clickMode = DoubleClick; + break; case DoubleClick: - _clickMode = TripleClick; break; + _clickMode = TripleClick; + break; case TripleClick: - _clickMode = DoubleClick; break; + _clickMode = DoubleClick; + break; case DragStartClick: break; } @@ -915,15 +886,13 @@ void ChatScene::mousePressEvent(QGraphicsSceneMouseEvent *event) QGraphicsScene::mousePressEvent(event); } - -void ChatScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) +void ChatScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) { // we check for doubleclick ourselves, so just call press handler mousePressEvent(event); } - -void ChatScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +void ChatScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { if (event->button() == Qt::LeftButton && _leftButtonPressed) { _leftButtonPressed = false; @@ -947,21 +916,19 @@ void ChatScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) QGraphicsScene::mouseReleaseEvent(event); } - void ChatScene::clickTimeout() { if (!_leftButtonPressed && _clickMode == SingleClick) handleClick(Qt::LeftButton, _clickPos); } - -void ChatScene::handleClick(Qt::MouseButton button, const QPointF &scenePos) +void ChatScene::handleClick(Qt::MouseButton button, const QPointF& scenePos) { if (button == Qt::LeftButton) { clearSelection(); // Now send click down to items - ChatItem *chatItem = chatItemAt(scenePos); + ChatItem* chatItem = chatItemAt(scenePos); if (chatItem) { chatItem->handleClick(chatItem->mapFromScene(scenePos), _clickMode); } @@ -969,18 +936,16 @@ void ChatScene::handleClick(Qt::MouseButton button, const QPointF &scenePos) } } - -void ChatScene::initiateDrag(QWidget *source) +void ChatScene::initiateDrag(QWidget* source) { - auto *drag = new QDrag(source); - auto *mimeData = new QMimeData; + auto* drag = new QDrag(source); + auto* mimeData = new QMimeData; mimeData->setText(selection()); drag->setMimeData(mimeData); drag->exec(Qt::CopyAction); } - /******** SELECTIONS ******************************************************************************/ void ChatScene::selectionToClipboard(QClipboard::Mode mode) @@ -991,8 +956,7 @@ void ChatScene::selectionToClipboard(QClipboard::Mode mode) stringToClipboard(selection(), mode); } - -void ChatScene::stringToClipboard(const QString &str_, QClipboard::Mode mode) +void ChatScene::stringToClipboard(const QString& str_, QClipboard::Mode mode) { QString str = str_; // remove trailing linefeeds @@ -1012,11 +976,10 @@ void ChatScene::stringToClipboard(const QString &str_, QClipboard::Mode mode) }; } - //!\brief Convert current selection to human-readable string. QString ChatScene::selection() const { - //TODO Make selection format configurable! + // TODO Make selection format configurable! if (hasGlobalSelection()) { int start = qMin(_selectionStart, _selectionEnd); int end = qMax(_selectionStart, _selectionEnd); @@ -1028,36 +991,34 @@ QString ChatScene::selection() const for (int l = start; l <= end; l++) { if (_selectionMinCol == ChatLineModel::TimestampColumn) { - ChatItem *item = _lines[l]->item(ChatLineModel::TimestampColumn); + ChatItem* item = _lines[l]->item(ChatLineModel::TimestampColumn); if (!_showSenderBrackets && !_timestampHasBrackets) { // Only re-add brackets if the current timestamp format does not include them // -and- sender brackets are disabled. Don't filter on Message::Plain as // timestamp brackets affect all types of messages. // Remove any spaces before and after, otherwise it may look weird. - result += QString("[%1] ").arg(item->data(MessageModel::DisplayRole) - .toString().trimmed()); - } else { + result += QString("[%1] ").arg(item->data(MessageModel::DisplayRole).toString().trimmed()); + } + else { result += item->data(MessageModel::DisplayRole).toString() + " "; } } if (_selectionMinCol <= ChatLineModel::SenderColumn) { - ChatItem *item = _lines[l]->item(ChatLineModel::SenderColumn); - if (!_showSenderBrackets && (_alwaysBracketSender - || item->chatLine()->msgType() == Message::Plain)) { + ChatItem* item = _lines[l]->item(ChatLineModel::SenderColumn); + if (!_showSenderBrackets && (_alwaysBracketSender || item->chatLine()->msgType() == Message::Plain)) { // Copying to plain-text. Re-add the sender brackets if they're normally hidden // for... // * Plain messages // * All messages in the Chat Monitor // // The Chat Monitor sets alwaysBracketSender() to true. - result += QString("<%1> ").arg(item->data(MessageModel::DisplayRole) - .toString()); - } else { + result += QString("<%1> ").arg(item->data(MessageModel::DisplayRole).toString()); + } + else { result += item->data(MessageModel::DisplayRole).toString() + " "; } } - result += _lines[l]->item(ChatLineModel::ContentsColumn) - ->data(MessageModel::DisplayRole).toString() + "\n"; + result += _lines[l]->item(ChatLineModel::ContentsColumn)->data(MessageModel::DisplayRole).toString() + "\n"; } return result; } @@ -1066,25 +1027,21 @@ QString ChatScene::selection() const return QString(); } - bool ChatScene::hasSelection() const { return hasGlobalSelection() || (selectingItem() && selectingItem()->hasSelection()); } - bool ChatScene::hasGlobalSelection() const { return _selectionStart >= 0; } - bool ChatScene::isGloballySelecting() const { return _isSelecting; } - void ChatScene::clearGlobalSelection() { if (hasGlobalSelection()) { @@ -1095,7 +1052,6 @@ void ChatScene::clearGlobalSelection() } } - void ChatScene::clearSelection() { clearGlobalSelection(); @@ -1103,7 +1059,6 @@ void ChatScene::clearSelection() selectingItem()->clearSelection(); } - /******** *************************************************************************************/ void ChatScene::webSearchOnSelection() @@ -1118,18 +1073,16 @@ void ChatScene::webSearchOnSelection() QDesktopServices::openUrl(url); } - /******** *************************************************************************************/ void ChatScene::requestBacklog() { - auto *filter = qobject_cast(model()); + auto* filter = qobject_cast(model()); if (filter) return filter->requestBacklog(); return; } - ChatLineModel::ColumnType ChatScene::columnByScenePos(qreal x) const { if (x < _firstColHandle->x()) @@ -1140,21 +1093,19 @@ ChatLineModel::ColumnType ChatScene::columnByScenePos(qreal x) const return ChatLineModel::ContentsColumn; } - int ChatScene::rowByScenePos(qreal y) const { - QList itemList = items(QPointF(0, y)); + QList itemList = items(QPointF(0, y)); // ChatLine should be at the bottom of the list - for (int i = itemList.count()-1; i >= 0; i--) { - auto *line = qgraphicsitem_cast(itemList.at(i)); + for (int i = itemList.count() - 1; i >= 0; i--) { + auto* line = qgraphicsitem_cast(itemList.at(i)); if (line) return line->row(); } return -1; } - void ChatScene::updateSceneRect(qreal width) { if (_lines.isEmpty()) { @@ -1182,8 +1133,8 @@ void ChatScene::updateSceneRect(qreal width) // the following call should be safe. If it crashes something went wrong during insert/remove if (_firstLineRow < _lines.count()) { - ChatLine *firstLine = _lines.at(_firstLineRow); - ChatLine *lastLine = _lines.last(); + ChatLine* firstLine = _lines.at(_firstLineRow); + ChatLine* lastLine = _lines.last(); updateSceneRect(QRectF(0, firstLine->pos().y(), width, lastLine->pos().y() + lastLine->height() - firstLine->pos().y())); } else { @@ -1192,20 +1143,18 @@ void ChatScene::updateSceneRect(qreal width) } } - -void ChatScene::updateSceneRect(const QRectF &rect) +void ChatScene::updateSceneRect(const QRectF& rect) { _sceneRect = rect; setSceneRect(rect); update(); } - // ======================================== // Webkit/WebEngine Only stuff // ======================================== #if defined HAVE_WEBKIT || defined HAVE_WEBENGINE -void ChatScene::loadWebPreview(ChatItem *parentItem, const QUrl &url, const QRectF &urlRect) +void ChatScene::loadWebPreview(ChatItem* parentItem, const QUrl& url, const QRectF& urlRect) { if (!_showWebPreview) return; @@ -1251,7 +1200,6 @@ void ChatScene::loadWebPreview(ChatItem *parentItem, const QUrl &url, const QRec // qDebug() << " new State:" << webPreview.previewState << webPreview.timer.isActive(); } - void ChatScene::webPreviewNextStep() { // qDebug() << Q_FUNC_INFO << webPreview.previewState; @@ -1303,13 +1251,12 @@ void ChatScene::webPreviewNextStep() // qDebug() << " new State:" << webPreview.previewState << webPreview.timer.isActive(); } - -void ChatScene::clearWebPreview(ChatItem *parentItem) +void ChatScene::clearWebPreview(ChatItem* parentItem) { // qDebug() << Q_FUNC_INFO << webPreview.previewState; switch (webPreview.previewState) { case WebPreview::NewPreview: - webPreview.previewState = WebPreview::NoPreview; // we haven't loaded anything yet + webPreview.previewState = WebPreview::NoPreview; // we haven't loaded anything yet break; case WebPreview::ShowPreview: if (parentItem == nullptr || webPreview.parentItem == parentItem) { @@ -1331,7 +1278,6 @@ void ChatScene::clearWebPreview(ChatItem *parentItem) // qDebug() << " new State:" << webPreview.previewState << webPreview.timer.isActive(); } - #endif // ======================================== @@ -1373,7 +1319,8 @@ void ChatScene::updateTimestampHasBrackets() // The default timestamp format string does not have brackets, no need to check. // If UiStyle::updateSystemTimestampFormat() has brackets added, change this, too. _timestampHasBrackets = false; - } else { + } + else { // Does the timestamp format contain brackets? For example: // Classic: "[hh:mm:ss]" // Modern: " hh:mm:ss"