X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatscene.cpp;h=9d1e04a2e9a097b31bdf7151b9b990aba3690680;hp=313d80eb3c2806266e8ecb3fcccd17e2cb102c28;hb=b2c1179d290dc97f2c8497db9ed0c8adcc679ed7;hpb=f64ded9b73ed4eb09d3e2c14cddc0ead1e269185 diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 313d80eb..9d1e04a2 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,7 @@ #include "client.h" #include "clientbacklogmanager.h" #include "columnhandleitem.h" +#include "iconloader.h" #include "messagefilter.h" #include "qtui.h" #include "qtuistyle.h" @@ -107,6 +109,10 @@ ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, qreal w _clickTimer.setSingleShot(true); connect(&_clickTimer, SIGNAL(timeout()), SLOT(clickTimeout())); + _clickTimer.setInterval(QApplication::doubleClickInterval()); + _clickTimer.setSingleShot(true); + connect(&_clickTimer, SIGNAL(timeout()), SLOT(clickTimeout())); + setItemIndexMethod(QGraphicsScene::NoIndex); } @@ -567,6 +573,19 @@ bool ChatScene::isScrollingAllowed() const { /******** MOUSE HANDLING **************************************************************************/ +void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { + QPointF pos = event->scenePos(); + QMenu menu; + + if(isPosOverSelection(pos)) + menu.addAction(SmallIcon("edit-copy"), tr("Copy Selection"), + this, SLOT(selectionToClipboard()), + QKeySequence::Copy); + + menu.exec(event->screenPos()); + +} + void ChatScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if(event->buttons() == Qt::LeftButton) { if(!_clickHandled && (event->scenePos() - _clickPos).toPoint().manhattanLength() >= QApplication::startDragDistance()) { @@ -623,14 +642,15 @@ void ChatScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if(!event->buttons() & Qt::LeftButton) { _leftButtonPressed = false; if(_clickMode != NoClick) { - clearSelection(); + if(_clickMode == SingleClick) + clearSelection(); event->accept(); if(!_clickTimer.isActive()) handleClick(Qt::LeftButton, _clickPos); } else { // no click -> drag or selection move if(isGloballySelecting()) { - putToClipboard(selection()); + selectionToClipboard(QClipboard::Selection); _isSelecting = false; event->accept(); return; @@ -655,9 +675,6 @@ void ChatScene::handleClick(Qt::MouseButton button, const QPointF &scenePos) { chatItem->handleClick(chatItem->mapFromScene(scenePos), _clickMode); } _clickHandled = true; - } else if(button == Qt::RightButton) { - // TODO: context menu - } } @@ -672,14 +689,21 @@ void ChatScene::initiateDrag(QWidget *source) { /******** SELECTIONS ******************************************************************************/ -void ChatScene::putToClipboard(const QString &selection) { - // TODO Configure clipboards -# ifdef Q_WS_X11 - QApplication::clipboard()->setText(selection, QClipboard::Selection); -# endif -//# else - QApplication::clipboard()->setText(selection); -//# endif +void ChatScene::selectionToClipboard(QClipboard::Mode mode) { + if(!hasSelection()) + return; + + switch(mode) { + case QClipboard::Clipboard: + QApplication::clipboard()->setText(selection()); + break; + case QClipboard::Selection: + if(QApplication::clipboard()->supportsSelection()) + QApplication::clipboard()->setText(selection(), QClipboard::Selection); + break; + default: + break; + }; } //!\brief Convert current selection to human-readable string. @@ -706,6 +730,18 @@ 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()) { for(int l = qMin(_selectionStart, _selectionEnd); l <= qMax(_selectionStart, _selectionEnd); l++)