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);
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.
virtual void wheelEvent(QWheelEvent *event)
Convert wheel events into zoom in/out.
#define LOG4CPP_INFO_S(logger)
Unique identifier for QGraphicsItem object
virtual void dragMoveEvent(QDragMoveEvent *event)
Intercept mouse move event to support drag-and-drop.
GraphicsItemType
Runtime type identification (RTTI) for QGraphicsItem objects.
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...
log4cpp::Category * mainCat
bool loadsAsDigFile(const QString &urlString) const
Returns true if specified file name can be loaded as a DIG 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.
void slotDropRegression(QString)
Receive drag and drop regression test url.
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...
const QString AXIS_CURVE_NAME
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS) define ENGAUGE...
#define LOG4CPP_DEBUG_S(logger)