00001 #include "selecttool.h"
00002 #include "pdfscene.h"
00003 #include <QGraphicsView>
00004
00005 SelectTool::SelectTool(PDFScene* scene) :
00006 Tool(scene),
00007 rubberBand(NULL),
00008 resizing(NULL),
00009 dragging(NULL)
00010 {
00011 QPen dashPen(Qt::black);
00012 QVector<qreal> dashes;
00013 dashes << 2 << 2;
00014 dashPen.setDashPattern(dashes);
00015 rubberBand = scene->addRect(0, 0, 10, 10, dashPen);
00016 rubberBand->setVisible(false);
00017 }
00018
00019 void SelectTool::activate()
00020 {
00021 scene->setTool(this);
00022 foreach(QGraphicsView* view, scene->views())
00023 {
00024 view->setDragMode(QGraphicsView::NoDrag);
00025 view->viewport()->setCursor(Qt::ArrowCursor);
00026 }
00027 emit activated();
00028 }
00029
00030 void SelectTool::mousePressEvent ( QGraphicsSceneMouseEvent * ev)
00031 {
00032 QPointF pos = ev->scenePos();
00033 QList<QGraphicsItem *> itemsHere = scene->items(pos);
00034 dragging = NULL;
00035 resizing = NULL;
00036 if (itemsHere.count() > 0 && itemsHere[0]->type() > QGraphicsItem::UserType)
00037 {
00038
00039
00042 Rectangle* item = (Rectangle*)itemsHere[0];
00043 if (item->isSelected())
00044 {
00045
00046 resizingHandle = item->handleAt(ev->scenePos());
00047 qDebug("pressed handle %d", resizingHandle);
00048 resizing = (resizingHandle == Rectangle::RH_NONE ? NULL : item);
00049
00050
00051 }
00052 else
00053 {
00054 foreach(QGraphicsItem* i, scene->selectedItems())
00055 i->setSelected(false);
00056 item->setSelected(true);
00057 }
00058 if (!resizing)
00059 {
00060 dragging = item;
00061 foreach(QGraphicsItem* i, scene->selectedItems())
00062 if (i->type() > QGraphicsItem::UserType)
00063 ((Rectangle*)i)->buttonDown(ev->scenePos());
00064 }
00065 }
00066 else
00067 {
00068 rubberBand->setVisible(true);
00069 rubberBand->setZValue(1.0);
00070 rubberBand->setRect(QRectF(ev->scenePos(), QSize(0, 0)));
00071 }
00072 }
00073
00074 void SelectTool::mouseMoveEvent ( QGraphicsSceneMouseEvent * ev)
00075 {
00076 if (ev->buttons())
00077 {
00078 if (resizing)
00079 resizing->resize(resizingHandle, ev->scenePos());
00080 else if (dragging)
00081 {
00082 foreach(QGraphicsItem* i, scene->selectedItems())
00083 if (i->type() > QGraphicsItem::UserType)
00084 {
00085 Rectangle* rect = (Rectangle*)i;
00086 QPointF rectPos = ev->scenePos();
00087
00088
00089 rectPos -= rect->buttonDownPos();
00090 rect->setPos(rectPos);
00091 }
00092 }
00093 else
00094 {
00095 QRectF rect = rubberBand->rect();
00096 rect.setBottomRight(ev->scenePos());
00097 rubberBand->setRect(rect);
00098 }
00099 }
00100 }
00101
00102 void SelectTool::mouseReleaseEvent ( QGraphicsSceneMouseEvent * ev )
00103 {
00104
00105 if (!ev->isAccepted())
00106 {
00107 rubberBand->setVisible(false);
00108 if (resizing)
00109 {
00110 resizing->resizeDone();
00111 resizing = NULL;
00112 }
00113 else if (!dragging)
00114 {
00115 QPainterPath rect;
00116 rect.addRect(rubberBand->rect());
00117 scene->setSelectionArea(rect);
00118 foreach(QGraphicsItem* i, scene->selectedItems())
00119 if (i->type() < QGraphicsItem::UserType)
00120 i->setSelected(false);
00121 qDebug("selected %d items", scene->selectedItems().count());
00122 }
00123 dragging = NULL;
00124 }
00125 emit selectionChanged();
00126 }
00127
00128 void SelectTool::mouseLeftClickEvent ( QGraphicsSceneMouseEvent * ev)
00129 {
00130 QPointF pos = ev->scenePos();
00131
00132 QList<QGraphicsItem *> itemsHere = scene->items(pos);
00133
00134
00135 foreach(QGraphicsItem* i, scene->selectedItems())
00136 i->setSelected(false);
00137 if (itemsHere.count() > 0)
00138 {
00139 QGraphicsItem* item = itemsHere[0];
00140 if (item->type() > QGraphicsItem::UserType)
00141 {
00142 item->setSelected(true);
00143 QRectF bounds = item->boundingRect();
00144 qDebug("first item found at location is of type %d; selected? %d; bounds %d, %d %d x %d pos %lf, %lf",
00145 item->type(), item->isSelected(), (int)bounds.x(),
00146 (int)bounds.y(), (int)bounds.width(), (int)bounds.height(),
00147 item->scenePos().x(), item->scenePos().y());
00148 }
00149 else if (item->type() == QGraphicsTextItem::Type)
00150 {
00151 item->setSelected(true);
00152 }
00153 else
00154 qDebug("not including item of type %d", item->type());
00155
00156 }
00157
00158
00159 ev->accept();
00160 }