| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626 |
- #include "drawtool.h"
- #include "GraphicsEllipseItem.h"
- #include "GraphicsTextItem.h"
- #include "GraphicsLineItem.h"
- #include "GraphicsTriangleItem.h"
- #define PI 3.14
- QList<DrawTool*> DrawTool::c_tools;
- QPointF DrawTool::c_down;
- QPointF DrawTool::c_last;
- quint32 DrawTool::c_nDownFlags;
- DrawBaseShape DrawTool::c_drawShape = selection;
- static SelectTool selectTool;
- static PenPathTool penPathTool(penPath);
- static LineTool lineTool(line);
- static ImageTool imageTool(image);
- static RectTool rectTool(rectangle);
- static RectTool triangleTool(triangle);
- static RectTool roundRectTool(roundrect);
- static RectTool ellipseTool(ellipse);
- static RotationTool rotationTool;
- static ArrowItem arrowTool(arrowLine);
- enum SelectMode
- {
- none,
- netSelect,
- move, //移动
- size, //改变大小
- rotate //反转
- };
- SelectMode selectMode = none;
- SizeHandleRect::Direction nDragHandle = SizeHandleRect::None;
- static void setCursor(QGraphicsScene * scene , const QCursor & cursor )
- {
- QList<QGraphicsView*> views = scene->views();
- if ( views.count() > 0 ){
- QGraphicsView * view = views.first();
- view->setCursor(cursor);
- }
- }
- DrawTool::DrawTool(DrawBaseShape shape)
- {
- m_drawShape = shape ;
- c_tools.push_back(this);
- }
- void DrawTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- c_down = event->scenePos();
- c_last = event->scenePos();
- }
- void DrawTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- c_last = event->scenePos();
- }
- void DrawTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- if (event->scenePos() == c_down)
- c_drawShape = selection;
- setCursor(scene,Qt::ArrowCursor);
- }
- DrawTool *DrawTool::findTool(DrawBaseShape drawShape)
- {
- QList<DrawTool*>::const_iterator iter = c_tools.constBegin();
- for ( ; iter != c_tools.constEnd() ; ++iter ){
- if ((*iter)->m_drawShape == drawShape )
- return (*iter);
- }
- return 0;
- }
- SelectTool::SelectTool()
- :DrawTool(selection)
- {
- m_lastSize.setHeight(0);
- m_lastSize.setWidth(0);
- dashRect = 0;
- dashLine = 0;
- m_hoverSizer = false;
- }
- void SelectTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- DrawTool::mousePressEvent(event,scene);
- if (!m_hoverSizer)
- scene->mouseEvent(event);
- selectMode = none;
- QList<QGraphicsItem *> items = scene->selectedItems();
- GraphicsItem *item = 0;
- if ( items.count() == 1 )
- {
- item = qgraphicsitem_cast<GraphicsItem*>(items.first());
- }
- if ( item != 0 &&
- item->type() !=GraphicsItem::UserType+3){
- nDragHandle = item->hitTest(event->scenePos());
- if ( nDragHandle !=SizeHandleRect::None)
- selectMode = size;
- else
- selectMode = move;
- }
- if( selectMode == none ){
- selectMode = netSelect;
- QList<QGraphicsView*> views = scene->views();
- if ( views.count() > 0 ){
- QGraphicsView * view = views.first();
- view->setDragMode(QGraphicsView::RubberBandDrag);
- }
- }
- if ( selectMode == move && items.count() == 1 ){
- if (dashRect ){
- scene->removeItem(dashRect);
- delete dashRect;
- dashRect = 0;
- }
- if (dashLine ) {
- scene->removeItem(dashLine);
- delete dashLine;
- dashLine = 0;
- }
- item->setPos(item->mapToScene(item->boundingRect().topLeft()));
- item->resetShape();
- dashRect = new QGraphicsPathItem(item->shape());
- dashRect->setPen(Qt::DashLine);
- dashRect->setPos(item->pos());
- //dashRect->setTransformOriginPoint(item->transformOriginPoint());
- dashRect->setTransform(item->transform());
- dashRect->setRotation(item->rotation());
- scene->addItem(dashRect);
- dashLine = new QGraphicsLineItem();
- dashLine->setPos(item->pos());
- dashLine->setPen(Qt::DashLine);
- scene->addItem(dashLine);
- }
- }
- void SelectTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- DrawTool::mouseMoveEvent(event,scene);
- bool isGroup = false;
- QList<QGraphicsItem *> items = scene->selectedItems();
- GraphicsItem * item = 0;
- if ( items.count() == 1 )
- {
- item = qgraphicsitem_cast<GraphicsItem*>(items.first());
- if ( item != 0 ){
- if(item->type() ==GraphicsItem::UserType+3)
- {
- scene->mouseEvent(event);
- scene->update();
- return;
- }
- if ( nDragHandle != SizeHandleRect::None && selectMode == size ){
- item->resizeTo(nDragHandle,c_last);
- }
- else if(nDragHandle == SizeHandleRect::None && selectMode == selection ){
- SizeHandleRect::Direction handle = item->hitTest(event->scenePos());
- if ( handle != SizeHandleRect::None){
- setCursor(scene,item->getCursor(handle));
- m_hoverSizer = true;
- }else{
- setCursor(scene,Qt::ArrowCursor);
- m_hoverSizer = false;
- }
- }
- }
- QGraphicsItemGroup *item1 = qgraphicsitem_cast<QGraphicsItemGroup*>(items.first());
- if ( item1 != NULL ){
- isGroup = true;
- }
- }
- if ( selectMode == move ){
- if ( dashRect )
- {
- dashRect->setPos(c_last);
- dashLine->setLine(QLineF(dashLine->mapFromItem(item,item->boundingRect().topLeft()),
- dashLine->mapFromScene(c_last)));
- }
- }
- else if ((selectMode != size && items.count() > 0) || isGroup )
- {
- scene->mouseEvent(event);
- }
- scene->update();
- }
- void SelectTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- DrawTool::mouseReleaseEvent(event,scene);
- QList<QGraphicsItem *> items = scene->selectedItems();
- if ( items.count() == 1 ){
- GraphicsItem * item = qgraphicsitem_cast<GraphicsItem*>(items.first());
- if ( item != 0 )
- {
- if(selectMode == move && c_last != c_down ){
- item->setPos(c_last);
- }
- item->resetArrow();
- }
- }
- if (selectMode == netSelect ){
- QList<QGraphicsView*> views = scene->views();
- if ( views.count() > 0 ){
- QGraphicsView * view = views.first();
- view->setDragMode(QGraphicsView::NoDrag);
- }
- }
- if (dashRect ){
- scene->removeItem(dashRect);
- delete dashRect;
- dashRect = 0;
- scene->removeItem(dashLine);
- delete dashLine;
- dashLine = 0;
- }
- selectMode = none;
- nDragHandle = SizeHandleRect::None;
- m_hoverSizer = false;
- scene->mouseEvent(event);
- }
- RotationTool::RotationTool()
- :DrawTool(rotation)
- {
- lastAngle == 0;
- dashRect = 0;
- }
- void RotationTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- DrawTool::mousePressEvent(event,scene);
- QList<QGraphicsItem *> items = scene->selectedItems();
- if ( items.count() == 1 ){
- GraphicsItem * item = qgraphicsitem_cast<GraphicsItem*>(items.first());
- if ( item != 0 ){
- nDragHandle = item->hitTest(event->scenePos());
- if ( nDragHandle !=SizeHandleRect::None)
- {
- QPointF origin = item->mapToScene(item->boundingRect().center());
- qreal len_y = c_last.y() - origin.y();
- qreal len_x = c_last.x() - origin.x();
- qreal angle = atan2(len_y,len_x)*180/PI;
- lastAngle = angle;
- selectMode = rotate;
- if (dashRect ){
- scene->removeItem(dashRect);
- delete dashRect;
- dashRect = 0;
- }
- dashRect = new QGraphicsPathItem(item->shape());
- dashRect->setPen(Qt::DashLine);
- dashRect->setPos(item->pos());
- dashRect->setTransformOriginPoint(item->transformOriginPoint());
- dashRect->setTransform(item->transform());
- dashRect->setRotation(item->rotation());
- scene->addItem(dashRect);
- setCursor(scene,QCursor(QPixmap(":/new/prefix1/images/rotation.ico")));
- }
- else{
- scene->clearSelection();
- c_drawShape = selection;
- }
- }
- }
- }
- void RotationTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- DrawTool::mouseMoveEvent(event,scene);
- QList<QGraphicsItem *> items = scene->selectedItems();
- if ( items.count() == 1 ){
- GraphicsItem * item = qgraphicsitem_cast<GraphicsItem*>(items.first());
- if ( item != 0 && nDragHandle !=SizeHandleRect::None && selectMode == rotate ){
- QPointF origin = item->mapToScene(item->boundingRect().center());
- qreal len_y = c_last.y() - origin.y();
- qreal len_x = c_last.x() - origin.x();
- qreal angle = atan2(len_y,len_x)*180/PI;
- angle = item->rotation() + int(angle - lastAngle) ;
- if ( angle > 360 )
- angle -= 360;
- if ( dashRect ){
- dashRect->setRotation( angle );
- scene->update();
- }
- setCursor(scene,QCursor(QPixmap(":/new/prefix1/images/rotation.ico")));
- }
- else if ( item )
- {
- SizeHandleRect::Direction handle = item->hitTest(event->scenePos());
- if ( handle != SizeHandleRect::None)
- setCursor(scene,QCursor(QPixmap(":/new/prefix1/images/rotation.ico")));
- else
- setCursor(scene,Qt::ArrowCursor);
- }
- }
- }
- void RotationTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- DrawTool::mouseReleaseEvent(event,scene);
- QList<QGraphicsItem *> items = scene->selectedItems();
- if ( items.count() == 1 ){
- GraphicsItem * item = qgraphicsitem_cast<GraphicsItem*>(items.first());
- if ( item != 0 && nDragHandle !=SizeHandleRect::None && selectMode == rotate ){
- QPointF origin = item->mapToScene(item->boundingRect().center());
- QPointF delta = c_last - origin ;
- qreal len_y = c_last.y() - origin.y();
- qreal len_x = c_last.x() - origin.x();
- qreal angle = atan2(len_y,len_x)*180/PI;
- angle = item->rotation() + int(angle - lastAngle) ;
- if ( angle > 360 )
- angle -= 360;
- item->setRotation( angle );
- }
- }
- setCursor(scene,Qt::ArrowCursor);
- selectMode = none;
- nDragHandle = SizeHandleRect::None;
- lastAngle = 0;
- if (dashRect ){
- scene->removeItem(dashRect);
- delete dashRect;
- dashRect = 0;
- }
- qDebug() << " RotationTool release:" <<event->scenePos();
- }
- /*************************************ImageTool*******************/
- ImageTool::ImageTool(DrawBaseShape drawShape)
- :DrawTool(drawShape)
- {
- }
- void ImageTool::setPicture(QString path )
- {
- _imgPath =path;
- }
- void ImageTool::mousePressEvent(QGraphicsSceneMouseEvent * event , MainPaintScene * scene )
- {
- DrawTool::mousePressEvent(event,scene);
- scene->clearSelection();
- QPixmap pixmap;
- bool ok= pixmap.load(_imgPath);
- if(! ok)
- return;
- switch ( c_drawShape ){
- case image:
- item = new GraphicsPixmapItem(pixmap,NULL);
- break;
- }
- if ( item == 0) return;
- item->setPos(event->scenePos());
- scene->addItem(item);
- item->setSelected(true);
- selectMode = size;
- nDragHandle = SizeHandleRect::RightBottom;
- }
- void ImageTool::mouseMoveEvent(QGraphicsSceneMouseEvent * event , MainPaintScene * scene )
- {
- setCursor(scene,Qt::CrossCursor);
- selectTool.mouseMoveEvent(event,scene);
- }
- void ImageTool::mouseReleaseEvent(QGraphicsSceneMouseEvent * event , MainPaintScene * scene )
- {
- if ( event->scenePos() == c_down ){
- if ( item != 0)
- scene->removeItem(item);
- selectTool.mousePressEvent(event,scene);
- }
- selectTool.mouseReleaseEvent(event,scene);
- }
- /*************************************RectTool*******************/
- RectTool::RectTool(DrawBaseShape drawShape)
- :DrawTool(drawShape)
- {
- }
- void RectTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- DrawTool::mousePressEvent(event,scene);
- scene->clearSelection();
- bool isSquare =false;
- if (event->button() == Qt::LeftButton)
- {
- if (QApplication::keyboardModifiers()== Qt::ControlModifier)
- {
- isSquare =true;
- }
- }
- switch ( c_drawShape ){
- case rectangle:
- item = new GraphicsRectItem(QRect(0,0,0,0),NULL);
- item->setPen(Qt::NoPen);
- break;
- case ellipse:
- item = new GraphicsEllipseItem(QRect(0,0,0,0),NULL);
- item->setPen(Qt::NoPen);
- break;
- case triangle:
- item = new GraphicsTriangleItem(QRect(0,0,0,0),NULL);
- item->setPen(Qt::NoPen);
- break;
- }
- if ( item == 0) return;
- if(isSquare)
- item->setIsSquare();
- item->setBorderColor(_mColor);
- item->setPos(event->scenePos());
- scene->addItem(item);
- item->setSelected(true);
- selectMode = size;
- nDragHandle = SizeHandleRect::RightBottom;
- }
- void RectTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- setCursor(scene,Qt::CrossCursor);
- selectTool.mouseMoveEvent(event,scene);
- }
- void RectTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- if ( event->scenePos() == c_down ){
- if (item != 0)
- scene->removeItem(item);
- selectTool.mousePressEvent(event,scene);
- }
- selectTool.mouseReleaseEvent(event,scene);
- }
- /////////****************PenPath************/////////////////////
- PenPathTool::PenPathTool(DrawBaseShape drawShape)
- :DrawTool(drawShape)
- {
- _path =nullptr;
- }
- void PenPathTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- DrawTool::mousePressEvent(event,scene);
- scene->clearSelection();
- switch ( c_drawShape ){
- case penPath:
- SafeDelete(_path);
- _path = new QPainterPath;
- _path->moveTo(event->scenePos());
- item = new QGraphicsPathItem(*_path,nullptr);
- item->setFlag(QGraphicsItem::ItemIsMovable, true);
- item->setFlag(QGraphicsItem::ItemIsSelectable, true);
- break;
- }
- if ( item == 0) return;
- isDrawing =true;
- scene->addItem(item);
- QPen pen_bak=item->pen();
- pen_bak.setWidth(9);
- pen_bak.setColor(_mColor);
- item->setPen(pen_bak);
- }
- void PenPathTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- if(isDrawing)
- {
- QPixmap pixmap(":/new/prefix1/images/ic_sidebar_pencil.png");
- //定义大小
- QSize picSize(8, 8);
- //缩放图片,按比例
- QPixmap scaledPixmap = pixmap.scaled(picSize, Qt::KeepAspectRatio);
- //设置样式
- QCursor cursor(scaledPixmap, -1, -1);
- setCursor(scene,cursor);
- _path->lineTo(event->scenePos());
- item->setPath(*_path);
- }
- }
- void PenPathTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- isDrawing=false;
- }
- /////////****************LineTool************/////////////////////
- LineTool::LineTool(DrawBaseShape drawShape)
- :DrawTool(drawShape)
- {
- item =nullptr;
- }
- void LineTool::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- DrawTool::mousePressEvent(event,scene);
- scene->clearSelection();
- switch ( c_drawShape ){
- case line:
- item = new GraphicsLineItem(QLineF(event->scenePos(),
- event->scenePos()));
- item->setFlag(QGraphicsItem::ItemIsMovable, true);
- item->setFlag(QGraphicsItem::ItemIsSelectable, true);
- break;
- }
- if ( item == 0) return;
- isDrawing =true;
- // 设置画笔
- QPen pen = item->pen();
- pen.setColor(_mColor);
- pen.setWidth(4);
- item->setPen(pen);
- scene->addItem(item);
- }
- void LineTool::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- if(isDrawing)
- {
- QLineF newLine(item->line().p1(), event->scenePos());
- item->setLine(newLine);
- }
- }
- void LineTool::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- isDrawing=false;
- }
- /////////****************ArrowItem************/////////////////////
- ArrowItem::ArrowItem(DrawBaseShape drawShape)
- :DrawTool(drawShape)
- {
- }
- void ArrowItem::mousePressEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- DrawTool::mousePressEvent(event,scene);
- scene->clearSelection();
- switch ( c_drawShape ){
- case arrowLine:
- item = new GraphicsArrowItem();
- item->setFlag(QGraphicsItem::ItemIsMovable, true);
- item->setFlag(QGraphicsItem::ItemIsSelectable, true);
- item->endPos= event->scenePos();
- item->startPos= event->scenePos();
- break;
- }
- if ( item == 0) return;
- isDrawing =true;
- item->setBorderColor(_mColor);
- scene->addItem(item);
- }
- void ArrowItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- if(isDrawing)
- {
- item->endPos= event->scenePos();
- scene->update();
- }
- }
- void ArrowItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event, MainPaintScene *scene)
- {
- isDrawing=false;
- }
|