void LevelMoverTool::onRelease(int row, int col) { m_validPos = false; m_range.lx = 0; m_range.ly = 0; setToolCursor(getViewer(), ToolCursor::CURSOR_ARROW); refreshCellsArea(); if (m_lastPos != m_startPos) TUndoManager::manager()->add(m_undo); m_undo = 0; }
void LevelMoverTool::onClick(const QMouseEvent *e) { QPoint pos = e->pos(); int row = getViewer()->yToRow(pos.y()); int col = getViewer()->xToColumn(pos.x()); m_qualifiers = 0; if (Preferences::instance()->getDragCellsBehaviour() == 1) m_qualifiers |= CellsMover::eMoveColumns; if (e->modifiers() & Qt::ControlModifier) m_qualifiers |= CellsMover::eCopyCells; if (e->modifiers() & Qt::ShiftModifier) m_qualifiers |= CellsMover::eInsertCells; if (e->modifiers() & Qt::AltModifier) m_qualifiers |= CellsMover::eOverwriteCells; int cursorType = ToolCursor::CURSOR_ARROW; if (m_qualifiers & CellsMover::eCopyCells) cursorType = ToolCursor::SplineEditorCursorAdd; setToolCursor(getViewer(), cursorType); int r0, c0, r1, c1; getViewer()->getCellSelection()->getSelectedCells(r0, c0, r1, c1); m_validPos = true; m_undo = new LevelMoverUndo(); CellsMover *cellsMover = m_undo->getCellsMover(); cellsMover->start(r0, c0, r1, c1, m_qualifiers); m_undo->m_columnsChanges.resize(c1 - c0 + 1, 0); m_moved = true; if (m_qualifiers & CellsMover::eCopyCells) { if (m_qualifiers & CellsMover::eInsertCells) { cellsMover->moveCells(); m_moved = true; } else m_moved = false; } m_columnsMoved = false; int colCount = c1 - c0 + 1; int rowCount = r1 - r0 + 1; m_range.lx = colCount; m_range.ly = rowCount; m_startPos.x = c0; m_startPos.y = r0; m_lastPos = m_aimedPos = m_startPos; m_grabOffset = m_startPos - TPoint(col, row); TXsheet *xsh = getViewer()->getXsheet(); // move m_validPos = true; m_lastPos = m_startPos; m_undo->getCellsMover()->m_uffa = 0; }
void UBBoardView::mouseReleaseEvent (QMouseEvent *event) { UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool (); scene ()->setToolCursor (currentTool); setToolCursor (currentTool); // first propagate device release to the scene if (scene ()) scene ()->inputDeviceRelease (); if (currentTool == UBStylusTool::Selector) { QGraphicsView::mouseReleaseEvent (event); } else if (currentTool == UBStylusTool::Text) { if (mRubberBand) mRubberBand->hide (); if (scene () && mRubberBand && mIsCreatingTextZone) { QRect rubberRect = mRubberBand->geometry (); UBGraphicsTextItem* textItem = scene ()->addText ("", mapToScene (rubberRect.topLeft ())); event->accept (); UBDrawingController::drawingController ()->setStylusTool (UBStylusTool::Selector); textItem->setSelected (true); } else { QGraphicsView::mouseReleaseEvent (event); } mIsCreatingTextZone = false; } else if (currentTool == UBStylusTool::Capture) { if (mRubberBand) mRubberBand->hide (); if (scene () && mRubberBand && mIsCreatingSceneGrabZone && mRubberBand->geometry ().width () > 16) { QRect rect = mRubberBand->geometry (); QPointF sceneTopLeft = mapToScene (rect.topLeft ()); QPointF sceneBottomRight = mapToScene (rect.bottomRight ()); QRectF sceneRect (sceneTopLeft, sceneBottomRight); mController->grabScene (sceneRect); event->accept (); } else { QGraphicsView::mouseReleaseEvent (event); } mIsCreatingSceneGrabZone = false; } else { if (mPendingStylusReleaseEvent || mMouseButtonIsPressed) { event->accept (); } } mMouseButtonIsPressed = false; mPendingStylusReleaseEvent = false; mTabletStylusIsPressed = false; }
/*! If middle button is pressed pan the image. Update current mouse position. */ void ImageViewer::mouseMoveEvent(QMouseEvent *event) { if (!m_image) return; QPoint curQPos = event->pos() * getDevPixRatio(); TPoint curPos = TPoint(curQPos.x(), curQPos.y()); if (m_visualSettings.m_defineLoadbox && m_flipbook) { if (m_mouseButton == Qt::LeftButton) updateLoadbox(curPos); else if (m_mouseButton == Qt::MidButton) panQt(curQPos - m_pos); else updateCursor(curPos); update(); event->ignore(); m_pos = curQPos; return; } // setting the cursors if (!m_isColorModel) { // when the histogram window is opened, switch to the RGB picker tool if (m_isHistogramEnable && m_histogramPopup->isVisible()) setToolCursor(this, ToolCursor::PickerRGB); else setCursor(Qt::ArrowCursor); } if (m_visualSettings.m_doCompare && m_mouseButton == Qt::NoButton) { if (fabs(curPos.x - width() * m_compareSettings.m_compareX) < 20) setToolCursor(this, ToolCursor::ScaleHCursor); else if (fabs((height() - curPos.y) - height() * m_compareSettings.m_compareY) < 20) setToolCursor(this, ToolCursor::ScaleVCursor); } if (m_compareSettings.m_dragCompareX || m_compareSettings.m_dragCompareY) dragCompare(curQPos - m_pos); else if (m_mouseButton == Qt::MidButton) panQt(curQPos - m_pos); m_pos = curQPos; // pick the color if the histogram popup is opened if (m_isHistogramEnable && m_histogramPopup->isVisible() && !m_isColorModel) { // Rect Pick if (m_mouseButton == Qt::LeftButton && (event->modifiers() & Qt::ControlModifier)) { if (!m_rectRGBPick && !m_visualSettings.m_defineLoadbox && (abs(m_pos.x() - m_pressedMousePos.x) > 10 || abs(m_pos.y() - m_pressedMousePos.y) > 10) && !(m_compareSettings.m_dragCompareX || m_compareSettings.m_dragCompareY) && m_flipbook) m_rectRGBPick = true; if (m_rectRGBPick) { update(); rectPickColor(); } } update(); pickColor(event); return; } if (m_mouseButton == Qt::LeftButton && !m_isColorModel && (event->modifiers() & Qt::AltModifier)) { if (!m_draggingZoomSelection && !m_visualSettings.m_defineLoadbox && (abs(m_pos.x() - m_pressedMousePos.x) > 10 || abs(m_pos.y() - m_pressedMousePos.y) > 10) && !(m_compareSettings.m_dragCompareX || m_compareSettings.m_dragCompareY) && m_flipbook) m_draggingZoomSelection = true; if (m_draggingZoomSelection) update(); } else m_draggingZoomSelection = false; if (m_isColorModel && m_mouseButton == Qt::LeftButton) { event->ignore(); } }
void UBBoardView::tabletEvent (QTabletEvent * event) { if (!mUseHighResTabletEvent) { event->setAccepted (false); return; } UBDrawingController *dc = UBDrawingController::drawingController (); QPointF tabletPos = UBGeometryUtils::pointConstrainedInRect (event->hiResGlobalPos () - mapToGlobal (QPoint (0, 0)), rect ()); UBStylusTool::Enum currentTool = (UBStylusTool::Enum)dc->stylusTool (); if (event->type () == QEvent::TabletPress || event->type () == QEvent::TabletEnterProximity) { if (event->pointerType () == QTabletEvent::Eraser) { dc->setStylusTool (UBStylusTool::Eraser); mUsingTabletEraser = true; } else { if (mUsingTabletEraser && currentTool == UBStylusTool::Eraser) { dc->setStylusTool (dc->latestDrawingTool ()); } mUsingTabletEraser = false; } } // if event are not Pen events, we drop the tablet stuff and route everything through mouse event if (currentTool != UBStylusTool::Pen && currentTool != UBStylusTool::Line && currentTool != UBStylusTool::Marker && !mMarkerPressureSensitive) { event->setAccepted (false); return; } QPointF scenePos = viewportTransform ().inverted ().map (tabletPos); qreal pressure = 1.0; if (((currentTool == UBStylusTool::Pen || currentTool == UBStylusTool::Line) && mPenPressureSensitive) || (currentTool == UBStylusTool::Marker && mMarkerPressureSensitive)) { pressure = event->pressure (); } bool acceptEvent = true; switch (event->type ()) { case QEvent::TabletPress: { mTabletStylusIsPressed = true; scene ()->inputDevicePress (scenePos, pressure); break; } case QEvent::TabletMove: { if (mTabletStylusIsPressed) { scene ()->inputDeviceMove (scenePos, pressure); } acceptEvent = false; // rerouted to mouse move break; } case QEvent::TabletRelease: { UBStylusTool::Enum currentTool = (UBStylusTool::Enum)dc->stylusTool (); scene ()->setToolCursor (currentTool); setToolCursor (currentTool); scene ()->inputDeviceRelease (); mPendingStylusReleaseEvent = false; mTabletStylusIsPressed = false; mMouseButtonIsPressed = false; break; } default: { //NOOP - avoid compiler warning } } // ignore mouse press and mouse move tablet event so that it is rerouted to mouse events, // documented in QTabletEvent Class Reference: /* The event handler QWidget::tabletEvent() receives all three types of tablet events. Qt will first send a tabletEvent then, if it is not accepted, it will send a mouse event. */ // // This is a workaround to the fact that tablet event are not delivered to child widget (like palettes) // event->setAccepted (acceptEvent); }