16 #include <QApplication>
17 #include <QContextMenuEvent>
20 #include <QGraphicsPixmapItem>
21 #include <QGraphicsPolygonItem>
22 #include <QGraphicsScene>
24 #include <QMouseEvent>
36 connect (
this, SIGNAL (
signalDraggedDigFile (QString)), &mainWindow, SLOT (slotFileOpenDraggedDigFile (QString)));
37 connect (
this, SIGNAL (
signalDraggedImage (QImage)), &mainWindow, SLOT (slotFileImportDraggedImage (QImage)));
38 connect (
this, SIGNAL (
signalDraggedImageUrl (QUrl)), &mainWindow, SLOT (slotFileImportDraggedImageUrl (QUrl)));
39 connect (
this, SIGNAL (
signalKeyPress (Qt::Key,
bool)), &mainWindow, SLOT (slotKeyPress (Qt::Key,
bool)));
40 connect (
this, SIGNAL (
signalMouseMove(QPointF)), &mainWindow, SLOT (slotMouseMove (QPointF)));
41 connect (
this, SIGNAL (
signalMousePress (QPointF)), &mainWindow, SLOT (slotMousePress (QPointF)));
42 connect (
this, SIGNAL (
signalMouseRelease (QPointF)), &mainWindow, SLOT (slotMouseRelease (QPointF)));
43 connect (
this, SIGNAL (
signalViewZoomIn ()), &mainWindow, SLOT (slotViewZoomInFromWheelEvent ()));
44 connect (
this, SIGNAL (
signalViewZoomOut ()), &mainWindow, SLOT (slotViewZoomOutFromWheelEvent ()));
46 setMouseTracking (
true);
47 setAcceptDrops (
true);
49 setRenderHints(QPainter::Antialiasing);
50 setBackgroundBrush (QBrush (QColor (Qt::gray)));
51 verticalScrollBar()->setCursor (QCursor (Qt::ArrowCursor));
52 horizontalScrollBar()->setCursor (QCursor (Qt::ArrowCursor));
55 setWhatsThis (tr (
"Main Window\n\n"
56 "After an image file is imported, or an Engauge Document opened, an image appears in this area. "
57 "Points are added to the image.\n\n"
58 "If the image is a graph with two axes and one or more curves, then three axis points must be "
59 "created along those axes. Just put two axis points on one axis and a third axis point on the other "
60 "axis, as far apart as possible for higher accuracy. Then curve points can be added along the curves.\n\n"
61 "If the image is a map with a scale to define length, then two axis points must be "
62 "created at either end of the scale. Then curve points can be added.\n\n"
63 "Zooming the image in or out is performed using any of several methods:\n"
64 "1) rotating the mouse wheel when the cursor is outside of the image\n"
65 "2) pressing the minus or plus keys\n"
66 "3) selecting a new zoom setting from the View/Zoom menu"));
76 <<
" selectedCount=" << scene()->selectedItems().count();
79 const QList<QGraphicsItem*> &items = scene()->selectedItems();
82 if (pointIdentifiers.count() > 0) {
99 QGraphicsView::contextMenuEvent (event);
104 LOG4CPP_INFO_S ((*
mainCat)) <<
"GraphicsView::dragEnterEvent " << (
event->mimeData ()->hasUrls () ?
"urls" :
"non-urls");
106 if (event->mimeData ()->hasImage () ||
107 event->mimeData ()->hasUrls ()) {
108 event->acceptProposedAction();
116 if (event->mimeData ()->hasImage () ||
117 event->mimeData ()->hasUrls ()) {
118 event->acceptProposedAction();
127 QList<QUrl> urlList =
event->mimeData ()->urls ();
129 const QString MIME_FORMAT_TEXT_PLAIN (
"text/plain");
130 QString textPlain (event->mimeData()->data (MIME_FORMAT_TEXT_PLAIN));
133 if (event->mimeData ()->hasUrls () &&
134 urlList.count () > 0) {
135 urlFirst = urlList.at (0);
139 if (event->mimeData()->hasImage()) {
140 image = qvariant_cast<QImage> (event->mimeData ()->imageData ());
143 if (handleDropEvent (textPlain,
144 event->mimeData ()->hasUrls (),
146 event->mimeData ()->hasImage (),
149 event->acceptProposedAction();
154 QGraphicsView::dropEvent (event);
158 bool GraphicsView::handleDropEvent (
const QString &possibleDigFileName,
160 const QUrl &urlFirst,
164 bool willAccept =
false;
171 QUrl url (possibleDigFileName);
175 }
else if (hasImage) {
185 LOG4CPP_INFO_S ((*
mainCat)) <<
"GraphicsView::handleDropEvent url=" << urlFirst.toString ().toLatin1 ().data ();
193 bool GraphicsView::inBounds (
const QPointF &posScreen)
195 QRectF boundingRect = scene()->sceneRect();
197 return 0 <= posScreen.x () &&
198 0 <= posScreen.y () &&
199 posScreen.x () < boundingRect.width() &&
200 posScreen.y () < boundingRect.height();
208 Qt::Key key = static_cast<Qt::Key> (event->key());
210 bool atLeastOneSelectedItem = (scene ()->selectedItems ().count () > 0);
212 if (key == Qt::Key_Down ||
213 key == Qt::Key_Left ||
214 key == Qt::Key_Right ||
222 QGraphicsView::keyPressEvent (event);
232 QPointF posScreen = mapToScene (event->pos ());
234 if (!inBounds (posScreen)) {
237 posScreen = QPointF (-1.0, -1.0);
242 QGraphicsView::mouseMoveEvent (event);
249 QPointF posScreen = mapToScene (event->pos ());
251 if (!inBounds (posScreen)) {
254 posScreen = QPointF (-1.0, -1.0);
259 QGraphicsView::mousePressEvent (event);
266 QPointF posScreen = mapToScene (event->pos ());
268 if (!inBounds (posScreen)) {
271 posScreen = QPointF (-1.0, -1.0);
277 int bitFlag = (unsigned (event->buttons ()) & Qt::RightButton);
278 bool isRightClick = (bitFlag != 0);
286 QGraphicsView::mouseReleaseEvent (event);
289 QStringList GraphicsView::pointIdentifiersFromSelection (
const QList<QGraphicsItem*> &items)
const
293 QStringList pointIdentifiers;
295 QList<QGraphicsItem*>::const_iterator itr;
296 for (itr = items.begin(); itr != items.end(); itr++) {
298 QGraphicsItem *item = *itr;
303 pointIdentifiers << pointIdentifier;
306 return pointIdentifiers;
312 QString emptyDigFileName;
315 if (!urlText.contains (
"http")) {
316 url = QUrl::fromLocalFile (urlText);
318 bool hasImage =
false;
321 handleDropEvent (emptyDigFileName,
330 const int ANGLE_THRESHOLD = 15;
331 const int DELTAS_PER_DEGREE = 8;
333 QPoint numDegrees =
event->angleDelta() / DELTAS_PER_DEGREE;
336 <<
" degrees=" << numDegrees.y()
337 <<
" phase=" <<
event->phase();
343 if ((event->modifiers() & Qt::ControlModifier) != 0) {
345 if (numDegrees.y() >= ANGLE_THRESHOLD) {
350 }
else if (numDegrees.y() <= -ANGLE_THRESHOLD) {
363 QGraphicsView::wheelEvent (event);