X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.cpp;h=9e7e1eb687f41cf14d2e2e0fd1702b659bd99130;hb=e7494078ad676d9fd14fab0396f51608a3ad46dc;hp=0900c7e2168caed9997bc98a4a492ff910be4fba;hpb=9ce9c0ab3ac6f4bda4e3a70bf13a9c07d2debfe6;p=quassel.git diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index 0900c7e2..9e7e1eb6 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -165,6 +165,13 @@ QString ChatItem::selection() const { return QString(); } +void ChatItem::setSelection(SelectionMode mode, qint16 start, qint16 end) { + _selectionMode = mode; + _selectionStart = start; + _selectionEnd = end; + update(); +} + void ChatItem::setFullSelection() { if(_selectionMode != FullSelection) { _selectionMode = FullSelection; @@ -173,8 +180,10 @@ void ChatItem::setFullSelection() { } void ChatItem::clearSelection() { - _selectionMode = NoSelection; - update(); + if(_selectionMode != NoSelection) { + _selectionMode = NoSelection; + update(); + } } void ChatItem::continueSelecting(const QPointF &pos) { @@ -187,7 +196,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,7 +252,8 @@ 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 @@ -271,23 +281,18 @@ void ChatItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { } void ChatItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { - if(event->buttons() == Qt::LeftButton) { + if(event->buttons() == Qt::LeftButton) event->accept(); - } else { + else event->ignore(); - } } void ChatItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if(_selectionMode != NoSelection && !event->buttons() & Qt::LeftButton) { - _selectionEnd = posToCursor(event->pos()); - QString selection - = data(MessageModel::DisplayRole).toString().mid(qMin(_selectionStart, _selectionEnd), qAbs(_selectionStart - _selectionEnd)); - chatScene()->putToClipboard(selection); + chatScene()->selectionToClipboard(QClipboard::Selection); event->accept(); - } else { + } else event->ignore(); - } } // ************************************************************ @@ -474,21 +479,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: @@ -498,17 +497,33 @@ void ContentsChatItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { break; } } + } else if(clickMode == ChatScene::DoubleClick) { + chatScene()->setSelectingItem(this); + setSelectionMode(PartialSelection); + Clickable click = privateData()->currentClickable; + if(click.isValid()) { + setSelectionStart(click.start); + setSelectionEnd(click.start + click.length); + } else { + // find word boundary + QString str = data(ChatLineModel::DisplayRole).toString(); + qint16 cursor = posToCursor(pos); + qint16 start = str.lastIndexOf(QRegExp("\\W"), cursor) + 1; + qint16 end = qMin(str.indexOf(QRegExp("\\W"), cursor), str.length()); + if(end < 0) end = str.length(); + setSelectionStart(start); + setSelectionEnd(end); + } + update(); + } else if(clickMode == ChatScene::TripleClick) { + setSelection(PartialSelection, 0, data(ChatLineModel::DisplayRole).toString().length()); } - 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,10 +540,10 @@ 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 + // onClickable = true; //FIXME disabled for now } if(onClickable) { setCursor(Qt::PointingHandCursor); @@ -542,6 +557,7 @@ void ContentsChatItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { event->accept(); } +/* void ContentsChatItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { qint16 idx = posToCursor(event->pos()); for(int i = 0; i < privateData()->clickables.count(); i++) { @@ -564,6 +580,7 @@ void ContentsChatItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { } } } +*/ void ContentsChatItem::showWebPreview(const Clickable &click) { #ifndef HAVE_WEBKIT