void SelectTool::endCustomDragging(const QPoint&) { KivioCanvas* canvas = view()->canvasWidget(); m_pCustomDraggingStencil->setHidden(false); KivioCustomDragCommand* cmd = new KivioCustomDragCommand(i18n("Move Connector Point"), view()->activePage(), m_pCustomDraggingStencil, m_customDragID, m_customDragOrigPoint, m_pCustomDraggingStencil->customIDPoint(m_customDragID)); view()->doc()->addCommand(cmd); m_customDragID = 0; KivioStencil *pStencil = canvas->activePage()->selectedStencils()->first(); while( pStencil ) { if(pStencil->type() == kstConnector) { pStencil->searchForConnections(view()->activePage(), view()->zoomHandler()->unzoomItY(4)); } pStencil = canvas->activePage()->selectedStencils()->next(); } canvas->endUnclippedSpawnerPainter(); canvas->setShowConnectorTargets(false); canvas->repaint(); }
void ConnectorTool::continueRubberBanding( QMouseEvent *e ) { KivioCanvas* canvas = view()->canvasWidget(); KivioPage* pPage = view()->activePage(); bool hit = false; KoPoint endPoint = pPage->snapToTarget(canvas->mapFromScreen(e->pos()), 8.0, hit); if(!hit) { endPoint = canvas->snapToGridAndGuides(endPoint); } m_pDragData->x = endPoint.x(); m_pDragData->y = endPoint.y(); if(m_type == StraightConnector) { KivioStraightConnector* connector = static_cast<KivioStraightConnector*>(m_pStencil); connector->setEndPoint(endPoint.x(), endPoint.y()); m_pDragData->id = kctCustom + 2; } else { Kivio::PolyLineConnector* connector = static_cast<Kivio::PolyLineConnector*>(m_pStencil); m_pDragData->id = kctCustom + connector->pointCount(); } m_pStencil->customDrag(m_pDragData); m_pStencil->updateGeometry(); canvas->repaint(); }
/** * Tests if we should start rubber banding (always returns true). */ bool SelectTool::startRubberBanding(const QPoint &pos) { KivioCanvas* canvas = view()->canvasWidget(); // We didn't find a stencil, so unselect everything if we aren't holding the control key down if( !m_controlKey ) canvas->activePage()->unselectAllStencils(); canvas->startRectDraw( pos, KivioCanvas::Rubber ); canvas->repaint(); return true; }
void SelectTool::continueCustomDragging(const QPoint &pos) { KivioCanvas* canvas = view()->canvasWidget(); KoPoint pagePoint = canvas->mapFromScreen(pos); bool hit = false; if(m_pCustomDraggingStencil->type() == kstConnector){ pagePoint = canvas->activePage()->snapToTarget(pagePoint, 8.0, hit); } if(!hit) { pagePoint = canvas->snapToGridAndGuides( pagePoint ); } KivioCustomDragData data; data.page = canvas->activePage(); data.dx = pagePoint.x() - m_lastPoint.x(); data.dy = pagePoint.y() - m_lastPoint.y(); data.x = pagePoint.x(); data.y = pagePoint.y(); data.id = m_customDragID; data.scale = view()->zoomHandler()->zoomedResolutionY(); if(m_pCustomDraggingStencil->type() != kstConnector){ // Undraw the old stencils if(!m_firstTime) { canvas->drawStencilXOR(m_pCustomDraggingStencil); } else { m_pCustomDraggingStencil->setHidden(true); canvas->repaint(); m_firstTime = false; } } // Custom dragging can only occur on one stencil if( m_pCustomDraggingStencil ) m_pCustomDraggingStencil->customDrag( &data ); // Draw the stencils if(m_pCustomDraggingStencil->type() != kstConnector){ canvas->drawStencilXOR(m_pCustomDraggingStencil); } else { view()->canvasWidget()->repaint(); } view()->updateToolBars(); }
void SMLConnector::continueRubberBanding( QMouseEvent *e ) { KivioCanvas* canvas = view()->canvasWidget(); KoPoint endPoint = canvas->mapFromScreen( e->pos() ); endPoint = canvas->snapToGrid(endPoint); m_pStencil->setStartPoint(endPoint.x(), endPoint.y()); m_pDragData->x = endPoint.x(); m_pDragData->y = endPoint.y(); m_pDragData->id = kctCustom + 1; m_pStencil->customDrag(m_pDragData); m_pStencil->updateGeometry(); canvas->repaint(); }
/** * Tests if we should start rubber banding (always returns true). */ bool SMLConnector::startRubberBanding( QMouseEvent *e ) { KivioDoc* doc = view()->doc(); KivioPage* pPage = view()->activePage(); KivioCanvas* canvas = view()->canvasWidget(); startPoint = canvas->snapToGrid(canvas->mapFromScreen( e->pos() )); // Create the stencil KivioStencilSpawner* ss = doc->findInternalStencilSpawner("SML Connector"); if (!ss) { kdDebug(43000) << "SMLTool: Failed to find StencilSpawner!" << endl; return false; } startPoint = canvas->snapToGrid(canvas->mapFromScreen( e->pos() )); // Create the stencil m_pStencil = (KivioSMLConnector*)ss->newStencil("basic_line"); m_pStencil->setTextFont(doc->defaultFont()); // Unselect everything, add the stencil to the page, and select it pPage->unselectAllStencils(); pPage->addStencil(m_pStencil); pPage->selectStencil(m_pStencil); // Get drag info ready m_pDragData = new KivioCustomDragData(); m_pDragData->page = pPage; m_pDragData->x = startPoint.x(); m_pDragData->y = startPoint.y(); m_pDragData->id = kctCustom + 2; m_pStencil->setStartPoint(startPoint.x() + 10.0f, startPoint.y() + 10.0f); m_pStencil->setEndPoint(startPoint.x(), startPoint.y()); m_pStencil->customDrag(m_pDragData); canvas->repaint(); canvas->setCursor(*m_pConnectorCursor2); return true; }
/** * Tests if we should start rubber banding (always returns true). */ bool ConnectorTool::startRubberBanding( QMouseEvent *e ) { KivioCanvas* canvas = view()->canvasWidget(); KivioDoc* doc = view()->doc(); KivioPage* pPage = canvas->activePage(); QString spawnerId; if(m_type == StraightConnector) { spawnerId = "Dave Marotti - Straight Connector"; } else { spawnerId = "Internal - PolyLine Connector"; } KivioStencilSpawner* ss = doc->findInternalStencilSpawner(spawnerId); if(!ss) { kdDebug(43000) << "ConnectorTool: Failed to find StencilSpawner!" << endl; return false; } // Create the stencil m_pStencil = static_cast<Kivio1DStencil*>(ss->newStencil()); bool hit = false; startPoint = pPage->snapToTarget(canvas->mapFromScreen(e->pos()), 8.0, hit); if(!hit) { startPoint = canvas->snapToGrid(startPoint); } if(!m_pStencil) { return false; } m_pStencil->setTextFont(doc->defaultFont()); // Unselect everything, add the stencil to the page, and select it pPage->unselectAllStencils(); pPage->addStencil(m_pStencil); pPage->selectStencil(m_pStencil); // Get drag info ready m_pDragData = new KivioCustomDragData(); m_pDragData->page = pPage; m_pDragData->x = startPoint.x(); m_pDragData->y = startPoint.y(); if(m_type == StraightConnector) { KivioStraightConnector* connector = static_cast<KivioStraightConnector*>(m_pStencil); m_pDragData->id = kctCustom + 2; connector->setStartPoint(startPoint.x(), startPoint.y()); connector->setEndPoint(startPoint.x() + 10.0, startPoint.y() + 10.0); } else { Kivio::PolyLineConnector* connector = static_cast<Kivio::PolyLineConnector*>(m_pStencil); m_pDragData->id = kctCustom + 1; connector->addPoint(startPoint); connector->addPoint(startPoint); } m_pStencil->customDrag(m_pDragData); canvas->repaint(); canvas->setCursor(*m_pConnectorCursor2); return true; }
void SelectTool::continueResizing(const QPoint &pos, bool ignoreGridGuides) { KivioCanvas* canvas = view()->canvasWidget(); KoPoint pagePoint = canvas->mapFromScreen(pos); if(!ignoreGridGuides) { pagePoint = canvas->snapToGridAndGuides( pagePoint ); } KivioSelectDragData *pData = m_lstOldGeometry.first(); /* QWMatrix m; double w2 = m_pResizingStencil->w() / 2.0; double h2 = m_pResizingStencil->h() / 2.0; m.translate(m_pResizingStencil->x(), m_pResizingStencil->y()); m.translate(m_pResizingStencil->pinPoint().x(), m_pResizingStencil->pinPoint().y()); m.rotate(-m_pResizingStencil->rotation()); m.translate(-m_pResizingStencil->pinPoint().x(), -m_pResizingStencil->pinPoint().y()); m.translate(-m_pResizingStencil->x(), -m_pResizingStencil->y()); m.invert(); double x = pagePoint.x() * m.m11() + pagePoint.y() * m.m21() + m.dx(); double y = pagePoint.x() * m.m12() + pagePoint.y() * m.m22() + m.dy();*/ if( !pData ) { kdDebug(43000) << "SelectTool::continueResizing() - Original geometry not found" << endl; return; } double dx = pagePoint.x() - m_origPoint.x(); double dy = pagePoint.y() - m_origPoint.y(); if((dx > 0) || (dy > 0) || (dx < 0) || (dy < 0)) { // Do we really need to redraw? // Undraw the old outline if(!m_firstTime) { canvas->drawStencilXOR( m_pResizingStencil ); } else { m_pResizingStencil->setHidden(true); canvas->repaint(); m_firstTime = false; } double sx = pData->rect.x(); double sy = pData->rect.y(); double sw = pData->rect.width(); double sh = pData->rect.height(); double ratio = sw / sh; switch( m_resizeHandle ) { case 1: // top left if( m_pResizingStencil->protection()->testBit( kpWidth )==false && m_pResizingStencil->protection()->testBit( kpHeight )==false ) { if((dx > dy) && (dx != 0)) { dy = dx / ratio; } else { dx = dy * ratio; } m_pResizingStencil->setX( sx + dx ); m_pResizingStencil->setW( sw - dx ); m_pResizingStencil->setY( sy + dy ); m_pResizingStencil->setH( sh - dy ); } break; case 2: // top if( m_pResizingStencil->protection()->testBit( kpHeight )==false ) { m_pResizingStencil->setY( sy + dy ); m_pResizingStencil->setH( sh - dy ); } break; case 3: // top right if( m_pResizingStencil->protection()->testBit( kpHeight )==false && m_pResizingStencil->protection()->testBit( kpWidth )==false ) { if((dx > dy) && (dx != 0)) { dy = -(dx / ratio); } else { dx = -(dy * ratio); } m_pResizingStencil->setY( sy + dy ); m_pResizingStencil->setH( sh - dy ); m_pResizingStencil->setW( sw + dx ); } break; case 4: // right if( m_pResizingStencil->protection()->testBit( kpWidth )==false ) { // see old kivio source when snaptogrid gets implemented //setX( SnapToGrid(sx+sw+dx)-sx ) m_pResizingStencil->setW( sw + dx ); } break; case 5: // bottom right if( m_pResizingStencil->protection()->testBit( kpWidth )==false && m_pResizingStencil->protection()->testBit( kpHeight )==false ) { if((dx > dy) && (dx != 0)) { dy = dx / ratio; } else { dx = dy * ratio; } m_pResizingStencil->setW( sw + dx ); m_pResizingStencil->setH( sh + dy ); } break; case 6: // bottom if( m_pResizingStencil->protection()->testBit( kpHeight )==false ) { m_pResizingStencil->setH( sh + dy ); } break; case 7: // bottom left if( m_pResizingStencil->protection()->testBit( kpWidth )==false && m_pResizingStencil->protection()->testBit( kpHeight )==false ) { if((dx > dy) && (dx != 0)) { dy = -(dx / ratio); } else { dx = -(dy * ratio); } m_pResizingStencil->setX( sx + dx ); m_pResizingStencil->setW( sw - dx ); m_pResizingStencil->setH( sh + dy ); } break; case 8: // left if( m_pResizingStencil->protection()->testBit( kpWidth )==false ) { KoPoint pinPoint = m_pResizingStencil->pinPoint(); m_pResizingStencil->setPinPoint(KoPoint(pinPoint.x() - (dx / 2.0), pinPoint.y())); m_pResizingStencil->setX( sx + dx ); m_pResizingStencil->setW( sw - dx ); } break; default: kdDebug(43000) << "SelectTool::continueResizing() - unknown resize handle: " << m_resizeHandle << endl; break; } canvas->drawStencilXOR( m_pResizingStencil ); view()->updateToolBars(); } }
/** * Continues the dragging process of a stencil (moving) * * How does this work? Initially we create a list of all the original * geometry of all the selected stencils. We use that to calculate delta * movements and snap them to the grid. */ void SelectTool::continueDragging(const QPoint &pos, bool ignoreGridGuides) { KivioCanvas* canvas = view()->canvasWidget(); KoPoint pagePoint = canvas->mapFromScreen( pos ); double dx = pagePoint.x() - m_origPoint.x(); double dy = pagePoint.y() - m_origPoint.y(); bool snappedX; bool snappedY; double newX, newY; // Undraw the old stencils if(!m_firstTime) { canvas->drawSelectedStencilsXOR(); } else { canvas->activePage()->setPaintSelected(false); canvas->repaint(); m_firstTime = false; } // Translate to the new position KoPoint p; newX = m_selectedRect.x() + dx; newY = m_selectedRect.y() + dy; if(!ignoreGridGuides) { // First attempt a snap-to-grid p.setCoords(newX, newY); p = canvas->snapToGrid(p); newX = p.x(); newY = p.y(); // Now the guides override the grid so we attempt to snap to them // The bottom p.setCoords(m_selectedRect.x() + dx + m_selectedRect.width(), m_selectedRect.y() + dy + m_selectedRect.height()); p = canvas->snapToGuides(p, snappedX, snappedY); if(snappedX) { newX = p.x() - m_selectedRect.width(); } if(snappedY) { newY = p.y() - m_selectedRect.height(); } // The middle p.setCoords(m_selectedRect.x() + dx + (m_selectedRect.width() / 2.0), m_selectedRect.y() + dy + (m_selectedRect.height() / 2.0)); p = canvas->snapToGuides(p, snappedX, snappedY); if(snappedX) { newX = p.x() - (m_selectedRect.width() / 2.0); } if(snappedY) { newY = p.y() - (m_selectedRect.height() / 2.0); } // The top p.setCoords(m_selectedRect.x() + dx, m_selectedRect.y() + dy); p = canvas->snapToGuides(p, snappedX, snappedY); if(snappedX) { newX = p.x(); } if(snappedY) { newY = p.y(); } } dx = newX - m_selectedRect.x(); dy = newY - m_selectedRect.y(); KivioSelectDragData *pData; KivioStencil *pStencil = canvas->activePage()->selectedStencils()->first(); pData = m_lstOldGeometry.first(); while( pStencil && pData ) { newX = pData->rect.x() + dx; newY = pData->rect.y() + dy; if( pStencil->protection()->at( kpX ) == false ) { pStencil->setX(newX); } if( pStencil->protection()->at( kpY ) == false ) { pStencil->setY(newY); } pData = m_lstOldGeometry.next(); pStencil = canvas->activePage()->selectedStencils()->next(); } // Draw the stencils canvas->drawSelectedStencilsXOR(); view()->updateToolBars(); }