From f64ded9b73ed4eb09d3e2c14cddc0ead1e269185 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Fri, 14 Nov 2008 16:05:20 +0100 Subject: [PATCH] Use handleClick() rather than mouseReleaseEvent() for handling URL clicks This finishes the mouse event handling overhaul (except for marking-by double/triple clicks). Saves us a couple event handlers, and we don't need to check for drags in ChatItem anymore. --- src/qtui/chatitem.cpp | 32 ++++++++++++++------------------ src/qtui/chatitem.h | 7 ++----- src/qtui/chatscene.cpp | 4 +++- src/qtui/chatscene.h | 3 ++- 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index 0900c7e2..53bee456 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -187,7 +187,7 @@ bool ChatItem::isPosOverSelection(const QPointF &pos) const { if(_selectionMode == FullSelection) return true; if(_selectionMode == PartialSelection) { - int cursor = posToCursor(pos); qDebug() << cursor << _selectionStart << _selectionEnd; + int cursor = posToCursor(pos); return cursor >= qMin(_selectionStart, _selectionEnd) && cursor <= qMax(_selectionStart, _selectionEnd); } return false; @@ -243,11 +243,17 @@ QList ChatItem::findWords(const QString &searchWord, Qt::CaseSensitivity } void ChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clickMode) { - if(clickMode == ChatScene::SingleClick) { + // single clicks are already handled by the scene (for clearing the selection) + if(clickMode == ChatScene::DragStartClick) { chatScene()->setSelectingItem(this); _selectionStart = _selectionEnd = posToCursor(pos); _selectionMode = NoSelection; // will be set to PartialSelection by mouseMoveEvent update(); + } else if(clickMode == ChatScene::DoubleClick) { + //_selectionMode = PartialSelection; + + } else if(clickMode == ChatScene::TripleClick) { + } } @@ -474,21 +480,15 @@ void ContentsChatItem::endHoverMode() { } } -void ContentsChatItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { - privateData()->hasDragged = false; - ChatItem::mousePressEvent(event); -} - -void ContentsChatItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { - if(!event->buttons() && !privateData()->hasDragged) { - // got a click +void ContentsChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clickMode) { + if(clickMode == ChatScene::SingleClick) { Clickable click = privateData()->currentClickable; if(click.isValid()) { QString str = data(ChatLineModel::DisplayRole).toString().mid(click.start, click.length); switch(click.type) { case Clickable::Url: - if(!str.contains("://")) - str = "http://" + str; + if(!str.contains("://")) + str = "http://" + str; QDesktopServices::openUrl(QUrl::fromEncoded(str.toAscii())); break; case Clickable::Channel: @@ -499,16 +499,12 @@ void ContentsChatItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { } } } - ChatItem::mouseReleaseEvent(event); + ChatItem::handleClick(pos, clickMode); } void ContentsChatItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { // mouse move events always mean we're not hovering anymore... endHoverMode(); - // also, check if we have dragged the mouse - if(hasPrivateData() && !privateData()->hasDragged && event->buttons() & Qt::LeftButton - && (event->buttonDownScreenPos(Qt::LeftButton) - event->screenPos()).manhattanLength() >= QApplication::startDragDistance()) - privateData()->hasDragged = true; ChatItem::mouseMoveEvent(event); } @@ -525,7 +521,7 @@ void ContentsChatItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { if(idx >= click.start && idx < click.start + click.length) { if(click.type == Clickable::Url) { onClickable = true; - showWebPreview(click); + showWebPreview(click); } else if(click.type == Clickable::Channel) { // TODO: don't make clickable if it's our own name //onClickable = true; //FIXME disabled for now diff --git a/src/qtui/chatitem.h b/src/qtui/chatitem.h index 6c080036..0710b6af 100644 --- a/src/qtui/chatitem.h +++ b/src/qtui/chatitem.h @@ -172,13 +172,11 @@ public: protected: virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); - virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); - virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event); virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); - + virtual void handleClick(const QPointF &pos, ChatScene::ClickMode clickMode); virtual QVector additionalFormats() const; @@ -225,10 +223,9 @@ struct ContentsChatItemPrivate : ChatItemPrivate { ContentsChatItem *contentsItem; QList clickables; ContentsChatItem::Clickable currentClickable; - bool hasDragged; ContentsChatItemPrivate(QTextLayout *l, const QList &c, ContentsChatItem *parent) - : ChatItemPrivate(l), contentsItem(parent), clickables(c), hasDragged(false) {} + : ChatItemPrivate(l), contentsItem(parent), clickables(c) {} }; //inlines regarding ContentsChatItemPrivate diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 9a3bca66..313d80eb 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -573,8 +573,10 @@ void ChatScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if(_clickTimer.isActive()) _clickTimer.stop(); if(_clickMode == SingleClick && isPosOverSelection(_clickPos)) initiateDrag(event->widget()); - else + else { + _clickMode = DragStartClick; handleClick(Qt::LeftButton, _clickPos); + } _clickMode = NoClick; } if(_isSelecting) { diff --git a/src/qtui/chatscene.h b/src/qtui/chatscene.h index 852a8d1c..7ef50d92 100644 --- a/src/qtui/chatscene.h +++ b/src/qtui/chatscene.h @@ -63,7 +63,8 @@ public: NoClick, SingleClick, DoubleClick, - TripleClick + TripleClick, + DragStartClick }; ChatScene(QAbstractItemModel *model, const QString &idString, qreal width, ChatView *parent); -- 2.20.1