X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fqtui%2Fchatscene.cpp;h=24394b9048b5fa8d4cfec974998fa9ab594aea97;hb=686544c12057dc9fc73f1ded2512717b4071b723;hp=9d1e04a2e9a097b31bdf7151b9b990aba3690680;hpb=b2c1179d290dc97f2c8497db9ed0c8adcc679ed7;p=quassel.git diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 9d1e04a2..24394b90 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -30,6 +30,7 @@ #include "chatline.h" #include "chatlinemodelitem.h" #include "chatscene.h" +#include "chatview.h" #include "client.h" #include "clientbacklogmanager.h" #include "columnhandleitem.h" @@ -555,7 +556,7 @@ bool ChatScene::isPosOverSelection(const QPointF &pos) const { if(hasGlobalSelection()) { int row = chatItem->row(); if(row >= qMin(_selectionStart, _selectionEnd) && row <= qMax(_selectionStart, _selectionEnd)) - return true; + return columnByScenePos(pos) >= _selectionMinCol; } else { return chatItem->isPosOverSelection(chatItem->mapFromScene(pos)); } @@ -577,11 +578,20 @@ void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { QPointF pos = event->scenePos(); QMenu menu; + // zoom actions and similar + chatView()->addActionsToMenu(&menu, pos); + menu.addSeparator(); + if(isPosOverSelection(pos)) menu.addAction(SmallIcon("edit-copy"), tr("Copy Selection"), this, SLOT(selectionToClipboard()), QKeySequence::Copy); + // item-specific options (select link etc) + ChatItem *item = chatItemAt(pos); + if(item) + item->addActionsToMenu(&menu, item->mapFromScene(pos)); + menu.exec(event->screenPos()); } @@ -661,7 +671,7 @@ void ChatScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { } void ChatScene::clickTimeout() { - if(!_leftButtonPressed && _clickMode == SingleClick) + if(!_leftButtonPressed && _clickMode == SingleClick && !_clickHandled) handleClick(Qt::LeftButton, _clickPos); } @@ -693,13 +703,17 @@ void ChatScene::selectionToClipboard(QClipboard::Mode mode) { if(!hasSelection()) return; + stringToClipboard(selection(), mode); +} + +void ChatScene::stringToClipboard(const QString &str, QClipboard::Mode mode) { switch(mode) { case QClipboard::Clipboard: - QApplication::clipboard()->setText(selection()); + QApplication::clipboard()->setText(str); break; case QClipboard::Selection: if(QApplication::clipboard()->supportsSelection()) - QApplication::clipboard()->setText(selection(), QClipboard::Selection); + QApplication::clipboard()->setText(str, QClipboard::Selection); break; default: break; @@ -766,7 +780,7 @@ void ChatScene::requestBacklog() { return; } -ChatLineModel::ColumnType ChatScene::columnByScenePos(qreal x) { +ChatLineModel::ColumnType ChatScene::columnByScenePos(qreal x) const { if(x < _firstColHandle->x()) return ChatLineModel::TimestampColumn; if(x < _secondColHandle->x()) @@ -775,7 +789,7 @@ ChatLineModel::ColumnType ChatScene::columnByScenePos(qreal x) { return ChatLineModel::ContentsColumn; } -int ChatScene::rowByScenePos(qreal y) { +int ChatScene::rowByScenePos(qreal y) const { // This is somewhat hacky... we look at the contents item that is at the given y position, since // it has the full height. From this item, we can then determine the row index and hence the ChatLine. // ChatItems cover their ChatLine, so we won't get to the latter directly.