8 #include "EngaugeAssert.h" 9 #include "GraphicsItemsExtractor.h" 10 #include "GraphicsItemType.h" 11 #include "GraphicsView.h" 12 #include "LoadFileInfo.h" 14 #include "MainWindow.h" 16 #include <QApplication> 17 #include <QContextMenuEvent> 20 #include <QGraphicsPixmapItem> 21 #include <QGraphicsPolygonItem> 22 #include <QGraphicsScene> 24 #include <QMouseEvent> 26 #include "QtToString.h" 28 extern const QString AXIS_CURVE_NAME;
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"));
69 GraphicsView::~GraphicsView()
75 LOG4CPP_INFO_S ((*mainCat)) <<
"GraphicsView::contextMenuEvent" 76 <<
" selectedCount=" << scene()->selectedItems().count();
79 const QList<QGraphicsItem*> &items = scene()->selectedItems();
82 if (pointIdentifiers.count() > 0) {
91 AXIS_POINTS) && pointIdentifiers.count() == 1) {
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();
114 LOG4CPP_INFO_S ((*mainCat)) <<
"GraphicsView::dragMoveEvent";
116 if (event->mimeData ()->hasImage () ||
117 event->mimeData ()->hasUrls ()) {
118 event->acceptProposedAction();
124 const QString MIME_FORMAT_TEXT_PLAIN (
"text/plain");
127 QList<QUrl> urlList =
event->mimeData ()->urls ();
129 QTextStream str (&urls);
130 QList<QUrl>::const_iterator itr;
131 for (itr = urlList.begin (); itr != urlList.end (); itr++) {
133 str <<
" url=" << url.toString () <<
" ";
136 QString textPlain (event->mimeData()->data (MIME_FORMAT_TEXT_PLAIN));
138 LOG4CPP_INFO_S ((*mainCat)) <<
"GraphicsView::dropEvent" 139 <<
" formats=(" <<
event->mimeData()->formats().join (
", ").toLatin1().data() <<
")" 140 <<
" hasUrls=" << (
event->mimeData()->hasUrls() ?
"yes" :
"no")
141 <<
" urlCount=" << urlList.count()
142 <<
" urls=(" << urls.toLatin1().data() <<
")" 143 <<
" text=" << textPlain.toLatin1().data()
144 <<
" hasImage=" << (
event->mimeData()->hasImage() ?
"yes" :
"no");
149 LOG4CPP_INFO_S ((*mainCat)) <<
"QGraphicsView::dropEvent dig file";
150 QUrl url (textPlain);
152 event->acceptProposedAction();
154 }
else if (event->mimeData ()->hasImage ()) {
157 QImage image = qvariant_cast<QImage> (
event->mimeData ()->imageData ());
158 LOG4CPP_INFO_S ((*mainCat)) <<
"GraphicsView::dropEvent image";
161 }
else if (event->mimeData ()->hasUrls () &&
162 urlList.count () > 0) {
166 QUrl url = urlList.at(0);
167 LOG4CPP_INFO_S ((*mainCat)) <<
"GraphicsView::dropEvent url=" << url.toString ().toLatin1 ().data ();
169 event->acceptProposedAction();
173 LOG4CPP_INFO_S ((*mainCat)) <<
"GraphicsView::dropEvent dropped";
174 QGraphicsView::dropEvent (event);
179 bool GraphicsView::inBounds (
const QPointF &posScreen)
181 QRectF boundingRect = scene()->sceneRect();
183 return 0 <= posScreen.x () &&
184 0 <= posScreen.y () &&
185 posScreen.x () < boundingRect.width() &&
186 posScreen.y () < boundingRect.height();
191 LOG4CPP_DEBUG_S ((*mainCat)) <<
"GraphicsView::keyPressEvent";
194 Qt::Key key = (Qt::Key) event->key();
196 bool atLeastOneSelectedItem = (scene ()->selectedItems ().count () > 0);
198 if (key == Qt::Key_Down ||
199 key == Qt::Key_Left ||
200 key == Qt::Key_Right ||
208 QGraphicsView::keyPressEvent (event);
218 QPointF posScreen = mapToScene (event->pos ());
220 if (!inBounds (posScreen)) {
223 posScreen = QPointF (-1.0, -1.0);
228 QGraphicsView::mouseMoveEvent (event);
233 LOG4CPP_DEBUG_S ((*mainCat)) <<
"GraphicsView::mousePressEvent";
235 QPointF posScreen = mapToScene (event->pos ());
237 if (!inBounds (posScreen)) {
240 posScreen = QPointF (-1.0, -1.0);
245 QGraphicsView::mousePressEvent (event);
250 LOG4CPP_DEBUG_S ((*mainCat)) <<
"GraphicsView::mouseReleaseEvent signalMouseRelease";
252 QPointF posScreen = mapToScene (event->pos ());
254 if (!inBounds (posScreen)) {
257 posScreen = QPointF (-1.0, -1.0);
263 int bitFlag = (
event->buttons () & Qt::RightButton);
264 bool isRightClick = (bitFlag != 0);
272 QGraphicsView::mouseReleaseEvent (event);
275 QStringList GraphicsView::pointIdentifiersFromSelection (
const QList<QGraphicsItem*> &items)
const 279 QStringList pointIdentifiers;
281 QList<QGraphicsItem*>::const_iterator itr;
282 for (itr = items.begin(); itr != items.end(); itr++) {
284 QGraphicsItem *item = *itr;
285 GraphicsItemType type = (GraphicsItemType) item->data (DATA_KEY_GRAPHICS_ITEM_TYPE).toInt ();
286 ENGAUGE_ASSERT (type == GRAPHICS_ITEM_TYPE_POINT);
288 QString pointIdentifier = item->data (DATA_KEY_IDENTIFIER).toString ();
289 pointIdentifiers << pointIdentifier;
292 return pointIdentifiers;
297 const int ANGLE_THRESHOLD = 15;
298 const int DELTAS_PER_DEGREE = 8;
300 QPoint numDegrees =
event->angleDelta() / DELTAS_PER_DEGREE;
302 LOG4CPP_INFO_S ((*mainCat)) <<
"MainWindow::wheelEvent" 303 <<
" degrees=" << numDegrees.y()
304 <<
" phase=" <<
event->phase();
310 if ((event->modifiers() & Qt::ControlModifier) != 0) {
312 if (numDegrees.y() >= ANGLE_THRESHOLD) {
317 }
else if (numDegrees.y() <= -ANGLE_THRESHOLD) {
330 QGraphicsView::wheelEvent (event);
void signalMouseMove(QPointF)
Send mouse move to MainWindow for eventual display of cursor coordinates in StatusBar.
Returns information about files.
virtual void keyPressEvent(QKeyEvent *event)
Intercept key press events to handle left/right/up/down moving.
bool loadsAsDigFile(const QString &urlString) const
Returns true if specified file name can be loaded as a DIG file.
virtual void wheelEvent(QWheelEvent *event)
Convert wheel events into zoom in/out.
virtual void dragMoveEvent(QDragMoveEvent *event)
Intercept mouse move event to support drag-and-drop.
virtual void dropEvent(QDropEvent *event)
Intercept mouse drop event to support drag-and-drop. This initiates asynchronous loading of the dragg...
virtual void contextMenuEvent(QContextMenuEvent *event)
Intercept context event to support point editing.
virtual void mouseMoveEvent(QMouseEvent *event)
Intercept mouse move events to populate the current cursor position in StatusBar. ...
GraphicsView(QGraphicsScene *scene, MainWindow &mainWindow)
Single constructor.
void signalMousePress(QPointF)
Send mouse press to MainWindow for creating one or more Points.
void signalKeyPress(Qt::Key, bool atLeastOneSelectedItem)
Send keypress to MainWindow for eventual processing by DigitizeStateAbstractBase subclasses.
virtual void mousePressEvent(QMouseEvent *event)
Intercept mouse press events to create one or more Points.
void signalDraggedImage(QImage)
Send dragged image to MainWindow for import. This typically comes from dragging a file...
void signalViewZoomIn()
Send wheel event to MainWindow for zooming in.
void signalDraggedDigFile(QString)
Send dragged dig file to MainWindow for import. This comes from dragging an engauge dig file...
void signalMouseRelease(QPointF)
Send mouse release to MainWindow for moving Points.
void signalContextMenuEventAxis(QString pointIdentifier)
Send right click on axis point to MainWindow for editing.
void signalContextMenuEventGraph(QStringList pointIdentifiers)
Send right click on graph point(s) to MainWindow for editing.
virtual void dragEnterEvent(QDragEnterEvent *event)
Intercept mouse drag event to support drag-and-drop.
virtual void mouseReleaseEvent(QMouseEvent *event)
Intercept mouse release events to move one or more Points.
void signalDraggedImageUrl(QUrl)
Send dragged url to MainWindow for import. This typically comes from dragging an image from a browser...
void signalViewZoomOut()
Send wheel event to MainWindow for zooming out.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...