-void ChatScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
- if(event->buttons() == Qt::LeftButton) {
- if(!_clickHandled && (event->scenePos() - _clickPos).toPoint().manhattanLength() >= QApplication::startDragDistance()) {
- if(_clickTimer.isActive()) _clickTimer.stop();
- if(_clickMode == SingleClick && isPosOverSelection(_clickPos))
- initiateDrag(event->widget());
- else {
- _clickMode = DragStartClick;
- handleClick(Qt::LeftButton, _clickPos);
- }
- _clickMode = NoClick;
- }
- if(_isSelecting) {
- updateSelection(event->scenePos());
- emit mouseMoveWhileSelecting(event->scenePos());
- event->accept();
- } else if(_clickHandled)
- QGraphicsScene::mouseMoveEvent(event);
- } else
- QGraphicsScene::mouseMoveEvent(event);
-}
-
-void ChatScene::mousePressEvent(QGraphicsSceneMouseEvent *event) {
- if(event->buttons() == Qt::LeftButton) {
- _leftButtonPressed = true;
- _clickHandled = false;
- if(!isPosOverSelection(event->scenePos())) {
- // immediately clear selection if clicked outside; otherwise, wait for potential drag
- clearSelection();
- }
- if(_clickMode != NoClick && _clickTimer.isActive()) {
- _clickMode = (ClickMode)(_clickMode == TripleClick ? DoubleClick : _clickMode + 1);
- handleClick(Qt::LeftButton, event->scenePos());
- } else {
- _clickMode = SingleClick;
- _clickPos = event->scenePos();
- }
- _clickTimer.start();
- } else if(event->buttons() == Qt::RightButton) {
- handleClick(Qt::RightButton, event->scenePos());
- }
- if(event->type() == QEvent::GraphicsSceneMouseDoubleClick)
- QGraphicsScene::mouseDoubleClickEvent(event);
- else
- QGraphicsScene::mousePressEvent(event);
-}
-
-void ChatScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) {
- // we check for doubleclick ourselves, so just call press handler
- mousePressEvent(event);
-}
-
-void ChatScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
- if(!event->buttons() & Qt::LeftButton) {
- _leftButtonPressed = false;
- if(_clickMode != NoClick) {
- clearSelection();
- event->accept();
- if(!_clickTimer.isActive())
- handleClick(Qt::LeftButton, _clickPos);
- } else {
- // no click -> drag or selection move
- if(isGloballySelecting()) {
- putToClipboard(selection());
- _isSelecting = false;
- event->accept();
- return;
- }
+void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
+{
+ QPointF pos = event->scenePos();
+ QMenu menu;
+
+ // zoom actions and similar
+ chatView()->addActionsToMenu(&menu, pos);
+ menu.addSeparator();
+
+ // item-specific options (select link etc)
+ ChatItem *item = chatItemAt(pos);
+ if (item)
+ item->addActionsToMenu(&menu, item->mapFromScene(pos));
+ else
+ // no item -> default scene actions
+ GraphicalUi::contextMenuActionProvider()->addActions(&menu, filter(), BufferId());
+
+ // 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);
+ menu.insertAction(sep, act);
+
+ QString searchSelectionText = selection();
+ if (searchSelectionText.length() > _webSearchSelectionTextMaxVisible)
+ 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);
+ menu.insertAction(sep, webSearchAction);
+ }
+
+ if (QtUi::mainWindow()->menuBar()->isHidden())
+ 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))
+ menu.addAction(new Action(tr("Reset Column Widths"), &menu, this, &ChatScene::resetColumnWidths));
+
+ menu.exec(event->screenPos());
+}
+
+
+void ChatScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (event->buttons() == Qt::LeftButton) {
+ if (!_clickHandled && (event->scenePos() - _clickPos).toPoint().manhattanLength() >= QApplication::startDragDistance()) {
+ if (_clickTimer.isActive())
+ _clickTimer.stop();
+ if (_clickMode == SingleClick && isPosOverSelection(_clickPos))
+ initiateDrag(event->widget());
+ else {
+ _clickMode = DragStartClick;
+ handleClick(Qt::LeftButton, _clickPos);
+ }
+ _clickMode = NoClick;
+ }
+ if (_isSelecting) {
+ updateSelection(event->scenePos());
+ emit mouseMoveWhileSelecting(event->scenePos());
+ event->accept();
+ }
+ else if (_clickHandled && _clickMode < DoubleClick)
+ QGraphicsScene::mouseMoveEvent(event);
+ }
+ else
+ QGraphicsScene::mouseMoveEvent(event);
+}
+
+
+void ChatScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (event->buttons() == Qt::LeftButton) {
+ _leftButtonPressed = true;
+ _clickHandled = false;
+ if (!isPosOverSelection(event->scenePos())) {
+ // immediately clear selection if clicked outside; otherwise, wait for potential drag
+ clearSelection();
+ }
+ if (_clickMode != NoClick && _clickTimer.isActive()) {
+ switch (_clickMode) {
+ case NoClick:
+ _clickMode = SingleClick; break;
+ case SingleClick:
+ _clickMode = DoubleClick; break;
+ case DoubleClick:
+ _clickMode = TripleClick; break;
+ case TripleClick:
+ _clickMode = DoubleClick; break;
+ case DragStartClick:
+ break;
+ }
+ handleClick(Qt::LeftButton, _clickPos);
+ }
+ else {
+ _clickMode = SingleClick;
+ _clickPos = event->scenePos();
+ }
+ _clickTimer.start();