bool SelectTool::startCustomDragging(const QPoint &pos, bool selectedOnly ) { KivioCanvas* canvas = view()->canvasWidget(); KivioPage *pPage = canvas->activePage(); KivioStencil *pStencil; int colType; KoPoint pagePoint = canvas->mapFromScreen( pos ); // Figure out how big 4 pixels is in terms of points double threshold = view()->zoomHandler()->unzoomItY(4); pStencil = pPage->checkForStencil( &pagePoint, &colType, threshold, selectedOnly ); if( !pStencil || colType < kctCustom ) { return false; } if(pStencil->isSelected()) { // If we are clicking an already selected stencil, and the control // key down, then unselect this stencil if(m_controlKey) { pPage->unselectStencil(pStencil); } } else { // Clicking a new stencil, and the control key is not down if(!m_controlKey) { pPage->unselectAllStencils(); } pPage->selectStencil( pStencil ); } m_pCustomDraggingStencil = pStencil; // Set the mode m_mode = stmCustomDragging; m_customDragID = colType; m_customDragOrigPoint = pStencil->customIDPoint(m_customDragID); view()->canvasWidget()->setShowConnectorTargets(true); view()->canvasWidget()->repaint(); // Create a new painter object canvas->beginUnclippedSpawnerPainter(); m_firstTime = true; return true; }
/** * Tests if we can start resizing a stencil */ bool SelectTool::startResizing(const QPoint &pos) { KivioCanvas* canvas = view()->canvasWidget(); KoPoint pagePoint = canvas->mapFromScreen(pos); KivioSelectDragData *pData; double x = pagePoint.x(); double y = pagePoint.y(); // Search selected stencils to see if we have a resizing point KivioStencil *pStencil = canvas->activePage()->selectedStencils()->first(); while( pStencil ) { m_resizeHandle = isOverResizeHandle(pStencil, x, y); if( m_resizeHandle > 0 ) { switch( m_resizeHandle ) { case 1: // top left m_origPoint.setCoords(pStencil->x(), pStencil->y()); break; case 2: m_origPoint.setCoords((pStencil->x() + pStencil->w()) / 2.0, pStencil->y()); break; case 3: m_origPoint.setCoords(pStencil->x() + pStencil->w(), pStencil->y()); break; case 4: m_origPoint.setCoords(pStencil->x() + pStencil->w(), (pStencil->y() + pStencil->h()) / 2.0); break; case 5: m_origPoint.setCoords(pStencil->x() + pStencil->w(), pStencil->y() + pStencil->h()); break; case 6: m_origPoint.setCoords((pStencil->x() + pStencil->w()) / 2.0, pStencil->y() + pStencil->h()); break; case 7: m_origPoint.setCoords(pStencil->x(), pStencil->y() + pStencil->h()); break; case 8: m_origPoint.setCoords(pStencil->x(), (pStencil->y() + pStencil->h()) / 2.0); break; } m_lstOldGeometry.clear(); pData = new KivioSelectDragData; pData->rect = pStencil->rect(); m_lstOldGeometry.append(pData); m_pResizingStencil = pStencil; // Create a new painter object canvas->beginUnclippedSpawnerPainter(); m_firstTime = true; return true; } pStencil = canvas->activePage()->selectedStencils()->next(); } return false; }
/** * Tests if we can start dragging a stencil. */ bool SelectTool::startDragging(const QPoint &pos, bool onlySelected) { KivioCanvas* canvas = view()->canvasWidget(); KivioPage *pPage = canvas->activePage(); KivioStencil *pStencil; int colType; // Figure out how big 4 pixels is in terms of points double threshold = view()->zoomHandler()->unzoomItY(4); KoPoint pagePoint = canvas->mapFromScreen( pos ); pStencil = pPage->checkForStencil( &pagePoint, &colType, threshold, onlySelected ); if( !pStencil ) return false; canvas->setEnabled(false); if( pStencil->isSelected() ) { // If we are clicking an already selected stencil, and the control // key down, then unselect this stencil if( m_controlKey==true ) { pPage->unselectStencil( pStencil ); } // Otherwise, it means we are just moving } else { // Clicking a new stencil, and the control key is not down if( !m_controlKey ) pPage->unselectAllStencils(); pPage->selectStencil( pStencil ); // Update the auto guidelines view()->canvasWidget()->updateAutoGuideLines(); } // Create a new painter object canvas->beginUnclippedSpawnerPainter(); // Build the list of old geometry KivioSelectDragData *pData; m_lstOldGeometry.clear(); pStencil = canvas->activePage()->selectedStencils()->first(); while( pStencil ) { pData = new KivioSelectDragData; pData->rect = pStencil->rect(); m_lstOldGeometry.append(pData); pStencil = canvas->activePage()->selectedStencils()->next(); } m_selectedRect = view()->activePage()->getRectForAllSelectedStencils(); changeMouseCursor(pos); // Set the mode m_mode = stmDragging; m_firstTime = true; canvas->setEnabled(true); return true; }
void SelectTool::keyPress(QKeyEvent* e) { KivioCanvas* canvas = view()->canvasWidget(); canvas->setEnabled(false); // Create a new painter object canvas->beginUnclippedSpawnerPainter(); // Build the list of old geometry KivioSelectDragData *pData; m_lstOldGeometry.clear(); KivioStencil* pStencil = canvas->activePage()->selectedStencils()->first(); while( pStencil ) { pData = new KivioSelectDragData; pData->rect = pStencil->rect(); m_lstOldGeometry.append(pData); pStencil = canvas->activePage()->selectedStencils()->next(); } m_selectedRect = view()->activePage()->getRectForAllSelectedStencils(); // Set the mode m_mode = stmDragging; canvas->setEnabled(true); m_origPoint = m_selectedRect.topLeft(); KivioGridData gd = view()->doc()->grid(); bool ignoreGridGuides = e->state() & ShiftButton; double distX, distY; if(ignoreGridGuides || !view()->doc()->grid().isSnap) { distX = view()->zoomHandler()->unzoomItX(1); distY = view()->zoomHandler()->unzoomItY(1); } else { distX = gd.freq.width(); distY = gd.freq.height(); } switch(e->key()) { case Key_Left: continueDragging(canvas->mapToScreen(KoPoint(m_selectedRect.x() - distX, m_selectedRect.y())), ignoreGridGuides); break; case Key_Up: continueDragging(canvas->mapToScreen(KoPoint(m_selectedRect.x(), m_selectedRect.y() - distY)), ignoreGridGuides); break; case Key_Right: continueDragging(canvas->mapToScreen(KoPoint(m_selectedRect.x() + distX, m_selectedRect.y())), ignoreGridGuides); break; case Key_Down: continueDragging(canvas->mapToScreen(KoPoint(m_selectedRect.x(), m_selectedRect.y() + distY)), ignoreGridGuides); break; default: break; } endDragging(QPoint()); canvas->guideLines().repaintAfterSnapping(); canvas->setFocus(); }