Fréchet View  1.6.0
A Tool for Exploring Fréchet Distance Algorithms
baseview.cpp
Go to the documentation of this file.
1 
2 #include <baseview.h>
3 
4 #include <QtPrintSupport/qtprintsupportglobal.h>
5 #include <QPrinter>
6 #include <QPrintDialog>
7 #include <QPrinterInfo>
8 #include <QtOpenGL>
9 #include <QSvgGenerator>
10 #include <iostream>
11 
12 #include <qmath.h>
13 #include <frechet/view/baseview.h>
14 #include <poly/types.h>
15 #include <numeric.h>
16 
17 #undef USE_GLWIDGET
18 
19 using namespace frechet;
20 using namespace view;
21 
27 const QStringList BaseView::OUTPUT_FILTERS = QStringList()
28  << "Portable Document Files (*.pdf)"
29  << "Vector Graphics (*.svg)"
30  << "Any files (*)";
31 
32 const QPen BaseView::PEN_SELECT(QColor(0,144,0,180), 2.0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
33 
34 //#if QT_CONFIG(wheelevent)
36  : QGraphicsView(), view(v)
37 { // grab gestures
38  grabGesture(Qt::PanGesture);
39  grabGesture(Qt::PinchGesture);
40 }
41 
42 bool GraphicsView::event(QEvent* event)
43 {
44  switch(event->type())
45  {
46  case QEvent::Gesture:
47  return gestureEvent(static_cast<QGestureEvent*>(event));
48 
49  case QEvent::HoverEnter:
50  case QEvent::HoverLeave:
51  case QEvent::MouseButtonPress:
52  case QEvent::GraphicsSceneMousePress:
53  std::cout << "break" << std::endl;
54  break;
55 
56 
57  }
58 // if (event->type() == QEvent::NativeGesture)
59 // return nativeGestureEvent(static_cast<QNativeGestureEvent*>(event));
60  return QGraphicsView::event(event);
61 }
62 
63 void GraphicsView::mousePressEvent(QMouseEvent *event)
64 {
65  QGraphicsView::mousePressEvent(event);
66 }
67 
68 void GraphicsView::mouseMoveEvent(QMouseEvent *event)
69 {
71  QGraphicsView::mouseMoveEvent(event);
72 }
73 
74 void GraphicsView::wheelEvent(QWheelEvent* event)
75 {
76  if (event->modifiers() & Qt::ControlModifier) {
77  // Ctrl-Wheel = Scroll
78  QGraphicsView::wheelEvent(event);
79  }
80  else {
81  // Zoom
82  if (event->delta() > 0)
84  else
86  event->accept();
87  }
88 }
89 
90 void GraphicsView::keyPressEvent(QKeyEvent* event)
91 {
92  switch(event->key())
93  {
94  case Qt::Key_Plus: view->zoomIn(); break;
95  case Qt::Key_Minus: view->zoomOut(); break;
96  case Qt::Key_Insert:
97  case Qt::Key_0: view->resetView(); break;
98 
99  case Qt::Key_Left:
100  case Qt::Key_4: singleStep(horizontalScrollBar(),-1); break;
101  case Qt::Key_Right:
102  case Qt::Key_6: singleStep(horizontalScrollBar(),+1); break;
103  case Qt::Key_Up:
104  case Qt::Key_8: singleStep(verticalScrollBar(),-1); break;
105  case Qt::Key_Down:
106  case Qt::Key_2: singleStep(verticalScrollBar(),+1); break;
107 
108  case Qt::Key_PageUp:
109  case Qt::Key_9: pageStep(verticalScrollBar(),-1); break;
110  case Qt::Key_PageDown:
111  case Qt::Key_3: pageStep(verticalScrollBar(),+1); break;
112  }
113 }
114 
115 bool GraphicsView::gestureEvent(QGestureEvent* event)
116 {
117  QGesture* gest;
118  if (gest = event->gesture(Qt::PanGesture)) {
119  QPanGesture* pan = static_cast<QPanGesture*>(gest);
120  QPointF delta = pan->delta();
121 
122  singleStep(horizontalScrollBar(), delta.x());
123  singleStep(verticalScrollBar(), delta.y());
124  return true;
125  }
126 
127  if (gest = event->gesture(Qt::PinchGesture))
128  {
129  QPinchGesture* pinch = static_cast<QPinchGesture *>(gest);
130  QPointF center = pinch->centerPoint();
131  double scale = pinch->scaleFactor(); // relative to 1.0
132 
133  if (scale > 1.0)
134  view->zoomIn(scale);
135  if (scale < 1.0)
136  view->zoomOut(1.0/scale);
137  // TODO regard Center Point !
138 
139  switch(pinch->state())
140  {
141  case Qt::GestureStarted:
142  rot0 = view->rotation();
143  //fall-through intended
144  case Qt::GestureUpdated:
145  case Qt::GestureFinished:
146  double angle = pinch->rotationAngle();
147  view->setRotation(rot0-angle);
148  break;
149  }
150 
151  return true;
152  }
153 
154  return false;
155 }
156 
157 
158 void frechet::view::singleStep(QAbstractSlider* bar, double factor)
159 {
160  bar->setValue(bar->value() + round(factor*bar->singleStep()));
161 }
162 
163 void frechet::view::pageStep(QAbstractSlider* bar, double factor)
164 {
165  bar->setValue(bar->value() + round(factor*bar->pageStep()));
166 }
167 //#endif
168 
169 
170 BaseView::BaseView(QWidget *parent, QString title, bool showRotate)
171  : QFrame(parent)
172 {
173  isFlipped = false;
174  zoomStepMouse = 6;
175  zoomStepDefault = 1;
176 
177  //setFrameStyle(Sunken | StyledPanel);
178  graphicsView = new GraphicsView(this);
179  graphicsView->setRenderHint(QPainter::Antialiasing, true);
180  graphicsView->setDragMode(QGraphicsView::ScrollHandDrag);
181  graphicsView->setOptimizationFlags(QGraphicsView::DontSavePainterState);
182 #ifdef USE_GLWIDGET
183  /* QGraphicsView can be connected to q OpenGL widget.
184  * Turns out, however, that performance becomes desastrous, compared to normal QWidget.
185  * (Q: isn't OpenGL not already part of the default graphics stack?)
186  */
187  graphicsView->setViewport(
188 // new QGLWidget(QGLFormat(QGL::SampleBuffers | QGL::DirectRendering))
189  new QOpenGLWidget);
190  graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
191 #else
192  graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
193 #endif
194  graphicsView->setTransformationAnchor(QGraphicsView::AnchorViewCenter);
195  scene = new QGraphicsScene(graphicsView);
196  graphicsView->setScene(scene);
197 
198  int size = 20;//style()->pixelMetric(QStyle::PM_ToolBarIconSize);
199  QSize iconSize(size, size);
200 /*
201  double dpiRatio = devicePixelRatioF();
202  int physdpi = physicalDpiX();
203  int logdpi = logicalDpiX();
204 */
205  QToolButton *zoomInIcon = new QToolButton;
206  zoomInIcon->setAutoRepeat(true);
207  zoomInIcon->setAutoRepeatInterval(33);
208  zoomInIcon->setAutoRepeatDelay(0);
209  zoomInIcon->setIcon(QPixmap(":/awesome/search-plus.svg"));
210  zoomInIcon->setIconSize(iconSize);
211  QToolButton *zoomOutIcon = new QToolButton;
212  zoomOutIcon->setAutoRepeat(true);
213  zoomOutIcon->setAutoRepeatInterval(33);
214  zoomOutIcon->setAutoRepeatDelay(0);
215  zoomOutIcon->setIcon(QPixmap(":/awesome/search-minus.svg"));
216  zoomOutIcon->setIconSize(iconSize);
217  zoomSlider = new QSlider;
218  zoomSlider->setTickPosition(QSlider::NoTicks);
219  zoomSlider->setMinimum(0);
220  zoomSlider->setMaximum(300);
221  zoomSlider->setValue(0);
222 
223  zoomStepMouse = 6;
224  zoomStepDefault = 1;
225 
226 
227  // Zoom slider layout
228  QVBoxLayout *zoomSliderLayout = new QVBoxLayout;
229  zoomSliderLayout->addWidget(zoomInIcon);
230  zoomSliderLayout->addWidget(zoomSlider);
231  zoomSliderLayout->addWidget(zoomOutIcon);
232 
233  QToolButton *rotateLeftIcon = new QToolButton;
234  rotateLeftIcon->setIcon(QPixmap(":/awesome/reply.svg"));
235  rotateLeftIcon->setIconSize(iconSize);
236  QToolButton *rotateRightIcon = new QToolButton;
237  rotateRightIcon->setIcon(QPixmap(":/awesome/reply-right.svg"));
238  rotateRightIcon->setIconSize(iconSize);
239  rotateSlider = new QSlider;
240  rotateSlider->setOrientation(Qt::Horizontal);
241  rotateSlider->setMinimum(-360);
242  rotateSlider->setMaximum(360);
244  rotateSlider->setTickPosition(QSlider::NoTicks);
245 
246  // Rotate slider layout
247  QHBoxLayout *rotateSliderLayout = new QHBoxLayout;
248  rotateSliderLayout->addWidget(rotateLeftIcon);
249  rotateSliderLayout->addWidget(rotateSlider);
250  rotateSliderLayout->addWidget(rotateRightIcon);
251 
252  resetButton = new QToolButton;
253  //resetButton->setText(tr("0"));
254  resetButton->setIcon(QPixmap(":/awesome/circle.svg"));
255  resetButton->setIconSize(iconSize);
256  resetButton->setEnabled(false);
257 
258  if (!showRotate) {
259  rotateLeftIcon->setVisible(false);
260  rotateRightIcon->setVisible(false);
261  rotateSlider->setVisible(false);
262  }
263 
264 #ifndef QT_NO_OPENGL
265 // openGlButton->setEnabled(QGLFormat::hasOpenGL());
266 #else
267 // openGlButton->setEnabled(false);
268 #endif
269  QGridLayout *topLayout = new QGridLayout;
270 // topLayout->addLayout(labelLayout, 0, 0);
271  topLayout->addWidget(graphicsView, 1, 0);
272  topLayout->addLayout(zoomSliderLayout, 1, 1);
273  topLayout->addLayout(rotateSliderLayout, 2, 0);
274  if (showRotate)
275  topLayout->addWidget(resetButton, 2, 1);
276  else
277  zoomSliderLayout->addWidget(resetButton);
278  setLayout(topLayout);
279 
280  // Drag Mode
281  //graphicsView->setDragMode(QGraphicsView::ScrollHandDrag);
282  graphicsView->setInteractive(false);
283  // Antialiasing
284  graphicsView->setRenderHint(QPainter::Antialiasing, true);
285 
286  connect(resetButton, SIGNAL(clicked()), this, SLOT(resetView()));
287  connect(zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix()));
288  connect(rotateSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix()));
289  connect(graphicsView->verticalScrollBar(), SIGNAL(valueChanged(int)),
290  this, SLOT(setResetButtonEnabled()));
291  connect(graphicsView->horizontalScrollBar(), SIGNAL(valueChanged(int)),
292  this, SLOT(setResetButtonEnabled()));
293  connect(rotateLeftIcon, SIGNAL(clicked()), this, SLOT(rotateLeft()));
294  connect(rotateRightIcon, SIGNAL(clicked()), this, SLOT(rotateRight()));
295  connect(zoomInIcon, SIGNAL(clicked()), this, SLOT(zoomIn()));
296  connect(zoomOutIcon, SIGNAL(clicked()), this, SLOT(zoomOut()));
297 
298  setupMatrix();
299  selected_item = nullptr;
300 }
301 
302 QGraphicsView *BaseView::view() const
303 {
304  return static_cast<QGraphicsView *>(graphicsView);
305 }
306 
308 {
309  zoomSlider->setValue(0);
310  rotateSlider->setValue(0);
311  setupMatrix();
312  graphicsView->ensureVisible(QRectF(0, 0, 0, 0));
313 
314  resetButton->setEnabled(false);
315 }
316 
318 {
319  resetButton->setEnabled(true);
320 }
321 
322 void BaseView::flipVertical(bool flip)
323 {
324  isFlipped = flip;
325  setupMatrix();
326 }
334 void BaseView::mouseMoveEvent(QMouseEvent *event)
335 {
336  // Map coordinates to QGraphicsScene
337  QPoint pv = event->pos(); // relative to QGraphicsView
338  QPointF ps = graphicsView->mapToScene(pv);
339 
340  // Find all close items
341  static const int HOVER_DIST = 8;
342  QList<QGraphicsItem *> items = graphicsView->items(pv.x()-HOVER_DIST, pv.y()-HOVER_DIST,
343  2*HOVER_DIST, 2*HOVER_DIST,
344  Qt::IntersectsItemShape);
345  // Qt::IntersectsItemBoundingRect
346  for(QGraphicsItem* item : items)
347  {
348  GraphicsHoverLineItem* hover_item = dynamic_cast<GraphicsHoverLineItem*> (item);
349  if (hover_item && (hover_item->loc != GraphicsHoverLineItem::None)) // && hover_item->is_close_to(ps,HOVER_DIST))
350  {
351  if (hover_item != selected_item)
352  segmentSelected(selected_item=hover_item);
353  return;
354  }
355  }
356  if (selected_item)
358 }
359 
360 QPoint BaseView::mapSceneToGlobal(QPointF ps) const
361 {
362  // GraphicsView to Viewport coordinates
363  QPoint pv = graphicsView->mapFromScene(ps);
364  // Viewport to Widget coordinates
365  return graphicsView->mapToGlobal(pv);
366 }
367 
368 void BaseView::resizeEvent(QResizeEvent *event)
369 {
370  QFrame::resizeEvent(event);
371  setupMatrix();
372 }
373 
375 {
376  double zoomScale = qPow(2.0, zoomSlider->value() / 50.0);
377 
378  QMatrix matrix = baseMatrix();
379  matrix.scale(zoomScale, zoomScale);
380  matrix.rotate(rotateSlider->value());
381 
382  graphicsView->setMatrix(matrix);
384 }
385 
387 {
388  // fits the scene rect into the widget
389  QRectF sceneRect = scene->sceneRect();
390  QRect widgetRect = graphicsView->viewport()->rect();
391 
392  double scale = std::min( widgetRect.width() / sceneRect.width(),
393  widgetRect.height() / sceneRect.height());
394  QPointF offset = sceneRect.topLeft() - widgetRect.topLeft();
395 
396  // Note: transformation anchor is at the center of the view
397  return QMatrix(scale,0, 0,isFlipped ? -scale:+scale, offset.rx()/2, offset.ry()/2);
398 }
399 
401 {
402 //#if QT_CONFIG(printdialog)
403  QPrinter printer(QPrinterInfo::defaultPrinter());
404  // Note: default ctor crashed on Windows.
405  QPrintDialog dialog(&printer, this);
406  if (dialog.exec() == QDialog::Accepted) {
407  QPainter painter(&printer);
408  render(&painter);
409  }
410 //#endif
411 }
412 
414 {
415  QSettings settings;
416  QFileDialog fdlg;
417 
418  fdlg.restoreState(settings.value("filedialog.saveas").toByteArray());
419  fdlg.setAcceptMode(QFileDialog::AcceptSave);
420  fdlg.setFileMode(QFileDialog::AnyFile);
421  fdlg.setNameFilters(OUTPUT_FILTERS);
422  fdlg.setDirectory(settings.value("filedialog.saveas.dir").toString());
423 // fdlg.setHistory(history);
424  QStringList fileNames;
425  if (fdlg.exec() == QDialog::Accepted) {
426  fileNames = fdlg.selectedFiles();
427  if (!fileNames.isEmpty()) {
428  QString file = fileNames.first();
429  QString suffix = QFileInfo(file).suffix().toLower();
430  QString filter = fdlg.selectedNameFilter();
431 
432  if (suffix=="pdf")
433  saveAsPdf(file);
434  else if ((suffix=="svg") || (filter=="svg"))
435  saveAsSvg(file);
436  else
437  saveAsPdf(file);
438  }
439  }
440 
441  settings.setValue("filedialog.saveas",fdlg.saveState());
442  settings.setValue("filedialog.saveas.dir",fdlg.directory().absolutePath());
443 }
444 
445 void BaseView::saveAsPdf(QString file)
446 {
447  QPrinter printer;
448  // Note: default ctor crashes on Windows in debug mode.
449  // Release mode seems to work.
450  printer.setOutputFormat(QPrinter::PdfFormat);
451  //printer.setPaperSize(QPrinter::A4); // ?
452  printer.setOutputFileName(file);
453 
454  QPainter painter(&printer);
455  render(&painter);
456 }
457 
461 void BaseView::saveAsSvg(QString file)
462 {
463  QSvgGenerator generator;
464  QSizeF size = graphicsView->sceneRect().size();
465  generator.setFileName(file);
466  generator.setSize(QSize(size.width(),size.height()));
467  //generator.setViewBox(graphicsView->sceneRect());
468  generator.setTitle(windowTitle());
469  generator.setDescription("Created by "
470  +QApplication::applicationDisplayName()+" "
471  +QApplication::applicationVersion());
472 
473  QPainter painter;
474  painter.begin(&generator);
475  render(&painter,
476  QRectF(QPointF(0,0),size));
477 }
478 
479 void BaseView::render(QPainter* painter, QRectF target)
480 {
481  // map sceneRect to view coordinates
482  QRectF r = scene->sceneRect();
483  QPoint topLeft = graphicsView->mapFromScene(r.topLeft());
484  QPoint botRight = graphicsView->mapFromScene(r.bottomRight());
485 
486  QRect source;
487  source.setCoords(std::min(topLeft.x(),botRight.x()),
488  std::min(topLeft.y(),botRight.y()),
489  std::max(topLeft.x(),botRight.x()),
490  std::max(topLeft.y(),botRight.y()));
491  // avoid rendering invisible (unused) items.
492  // they will be re-created on demand
493  dropUnusedItems();
494  graphicsView->render(painter,target,source);
495 }
496 
497 
498 
499 
500 void BaseView::zoomIn(int level)
501 {
502  if (level <= 0) level = zoomStepDefault;
503  zoomSlider->setValue(zoomSlider->value() + level);
504 }
505 
506 void BaseView::zoomOut(int level)
507 {
508  if (level <= 0) level = zoomStepDefault;
509  zoomSlider->setValue(zoomSlider->value() - level);
510 }
511 
512 void BaseView::saveSettings(QSettings& settings, QString group)
513 {
514  settings.beginGroup(group);
515 
516  int zoom = zoomSlider->value();
517  int rot = rotateSlider->value();
518  int scroll_h = graphicsView->horizontalScrollBar()->value();
519  int scroll_v = graphicsView->verticalScrollBar()->value();
520 
521  int max_h = graphicsView->horizontalScrollBar()->maximum();
522  int max_v = graphicsView->verticalScrollBar()->maximum();
523 
524  settings.setValue("zoom", zoom);
525  settings.setValue("rotate", rot);
526 
527  settings.setValue("scroll.horiz", scroll_h);
528  settings.setValue("scroll.vert", scroll_v);
529 
530  settings.endGroup();
531 }
532 
533 void BaseView::restoreSettings(QSettings& settings, QString group)
534 {
535  settings.beginGroup(group);
536 
537  int zoom = settings.value("zoom",0).toInt();
538  int rot = settings.value("rotate",ROTATE_DEFAULT_VALUE).toInt();
539  int scroll_h = settings.value("scroll.horiz",0).toInt();
540  int scroll_v = settings.value("scroll.vert",0).toInt();
541 
542  zoomSlider->setValue(zoom);
543  rotateSlider->setValue(rot);
544 
545  int max_h = graphicsView->horizontalScrollBar()->maximum();
546  int max_v = graphicsView->verticalScrollBar()->maximum();
547 
548  graphicsView->horizontalScrollBar()->setValue(scroll_h);
549  graphicsView->verticalScrollBar()->setValue(scroll_v);
550 
551  settings.endGroup();
552 
553  setupMatrix();
554 }
555 
556 void BaseView::rotateLeft(double angle)
557 {
558  setRotation(rotation()-angle);
559 }
560 
561 void BaseView::rotateRight(double angle)
562 {
563  setRotation(rotation()+angle);
564 }
565 
566 int BaseView::rotation() const {
567  return rotateSlider->value();
568 }
569 
570 void BaseView::setRotation(double angle) {
571  while (angle > 306) angle -= 360;
572  while (angle < -360) angle += 360;
573 
574  if (rotateSlider->isVisible())
575  rotateSlider->setValue(round(angle));
576 }
577 
578 
579 void BaseView::setPenWidth(QGraphicsItem* item, double width)
580 {
581  QAbstractGraphicsShapeItem* shape = dynamic_cast<QAbstractGraphicsShapeItem*>(item);
582  if (shape) {
583  QPen pen = shape->pen();
584  if (pen.widthF() != width) {
585  pen.setWidthF(width);
586  shape->setPen(pen);
587  }
588  }
589  QGraphicsLineItem* line = dynamic_cast<QGraphicsLineItem*>(item);
590  if (line) {
591  QPen pen = line->pen();
592  if (pen.widthF() != width) {
593  pen.setWidthF(width);
594  line->setPen(pen);
595  }
596  }
597 
598  for(const auto& i : item->childItems())
599  setPenWidth(i,width);
600 }
601 
602 bool equals(QPointF a, QPointF b) {
603  // Note that QPointF::operator== compares with tolerance.
604  // We don't.
605  return (a.x()==b.x()) && (a.y()==b.y());
606 }
607 
608 void BaseView::addLine(QPainterPath& ppath, const QLineF& line)
609 {
610  if (equals(line.p1(),line.p2())) {
611  Q_ASSERT(false);
612  // this indicates most likely a broken homeomorphism
613  // (though this is not the best place to decide)
614  addPoint(ppath, line.p1());
615  }
616  else {
617  ppath.moveTo(line.p1());
618  ppath.lineTo(line.p2());
619  }
620 }
621 
622 void BaseView::addPolygon(QPainterPath &ppath, const QPolygonF &poly)
623 {
624  switch(poly.size())
625  {
626  case 0: break;
627  case 1: {
628  //Q_ASSERT(false);
629  // this indicates most likely a broken homeomorphism
630  // (though this is not the best place to decide)
631  addLine(ppath,QLineF(poly[0], poly[0]+QPointF(1e-9,1e-9))); }
632  break;
633  case 2: addLine(ppath,QLineF(poly[0],poly[1])); break;
634  default: ppath.addPolygon(poly); break;
635  }
636 }
637 
638 void BaseView::addPoint(QPainterPath &ppath, const QPointF &point, double diameter)
639 {
640  ppath.addEllipse(point, diameter,diameter);
641 }
642 
643 double normalizedValue(QAbstractSlider* slider)
644 {
645  int min = slider->minimum();
646  int max = slider->maximum();
647  int val = slider->value();
648 
649  return (double)(val-min) / (max-min);
650 }
651 
652 void setNormalizedValue(QAbstractSlider* slider, double nval)
653 {
654  int min = slider->minimum();
655  int max = slider->maximum();
656  int val = min + nval*(max-min);
657 
658  slider->setValue(val);
659 }
660 
662  Location aloc, int aa, int bb,
663  QGraphicsItemGroup* group)
664 : QGraphicsLineItem(line,group), loc(aloc), a(aa), b(bb)
665 {
666  group->addToGroup(this);
667 }
668 
669 void GraphicsHoverLineItem::update(int aa, int bb) {
670  const_cast<int&>(a) = aa;
671  const_cast<int&>(b)=bb;
672 }
673 
674 bool GraphicsHoverLineItem::is_close_to(QPointF scene_pos, int distance) const
675 {
676  QPointF q = mapFromScene(scene_pos);
677  double dist;
678  if (line().length()==0.0)
679  dist = numeric::euclidean_distance<double>(line().p1(),q);
680  else
681  dist = numeric::euclidean_segment_distance<double>(line(),q);
682  return dist <= distance;
683 }
684 
685 
void singleStep(QAbstractSlider *, double factor)
perform a single step on a slider
Definition: baseview.cpp:158
base class for view widgets.
Definition: baseview.h:79
GraphicsView(BaseView *view)
default constructor
Definition: baseview.cpp:35
void saveAs()
save the contents of the graphics scene to disk (as PDF, or SVG)
Definition: baseview.cpp:413
void zoomIn(int level=-1)
zoom in; connected to the zomm controls
Definition: baseview.cpp:500
used for segments that are not mouse sensitive
Definition: baseview.h:243
void saveAsPdf(QString file)
save content of scene to a PDF file
Definition: baseview.cpp:445
void resetView()
reset zoom to default
Definition: baseview.cpp:307
void mouseMoveEvent(QMouseEvent *event)
Definition: baseview.cpp:68
bool event(QEvent *) override
Definition: baseview.cpp:42
static int distance(int a, int b, int n)
Definition: poly_utils.cpp:210
BaseView(QWidget *parent=0, QString title="", bool showRotate=true)
constructore with parent and title
Definition: baseview.cpp:170
int rot0
initial rotation angle
Definition: baseview.h:44
void keyPressEvent(QKeyEvent *) override
Definition: baseview.cpp:90
bool gestureEvent(QGestureEvent *)
Definition: baseview.cpp:115
QGraphicsView * view() const
Definition: baseview.cpp:302
int zoomStepMouse
zoom step for mouse wheel
Definition: baseview.h:178
global definitions for all algorithms.
void zoomOut(int level=-1)
connected to the zomm controls
Definition: baseview.cpp:506
bool is_close_to(QPointF scene_pos, int distance) const
check if the mouse is close to the line segment
Definition: baseview.cpp:674
double normalizedValue(QAbstractSlider *slider)
Definition: baseview.cpp:643
void wheelEvent(QWheelEvent *) override
Definition: baseview.cpp:74
void pageStep(QAbstractSlider *, double factor)
perform a page step on a slider
Definition: baseview.cpp:163
QSlider * rotateSlider
the slider control for rotate
Definition: baseview.h:187
void rotateLeft(double angle=10)
rotate the scene to the left
Definition: baseview.cpp:556
static void addPolygon(QPainterPath &ppath, const QPolygonF &poly)
add a polygon curve segment to a QPainterPath
Definition: baseview.cpp:622
bool isFlipped
true if the scene should be flipped vertically
Definition: baseview.h:176
void setupMatrix()
set up transformation matrix to account for zoom,rotate,scroll
Definition: baseview.cpp:374
const Location loc
location on screen
Definition: baseview.h:251
static const int ROTATE_DEFAULT_VALUE
what this?
Definition: baseview.h:168
QPoint mapSceneToGlobal(QPointF p) const
map scene coordinates to window coordinate
Definition: baseview.cpp:360
bool equals(QPointF a, QPointF b)
Definition: baseview.cpp:602
void setNormalizedValue(QAbstractSlider *slider, double nval)
update slider with a normalized value
Definition: baseview.cpp:652
QGraphicsScene * scene
scene that is displayed by graphicsView
Definition: baseview.h:174
static const QPen PEN_SELECT
pen for drawing selected polygon segment
Definition: baseview.h:163
GraphicsHoverLineItem * selected_item
the currently selected mouse sensitve polyon segment (or nullptr)
Definition: baseview.h:189
a QGraphicsLitem that can handle mouse hover events. It is used to highlight mouse sensitve polygon s...
Definition: baseview.h:239
void update(int a, int b)
update identifiers
Definition: baseview.cpp:669
void resizeEvent(QResizeEvent *) override
handles window resizes; adjusts controls to new window size
Definition: baseview.cpp:368
void flipVertical(bool flip)
flip graphics scene vertically
Definition: baseview.cpp:322
static void addPoint(QPainterPath &ppath, const QPointF &point, double diameter=1.0)
add a dot to a QPainterPath
Definition: baseview.cpp:638
void mouseMoveEvent(QMouseEvent *event)
handles a mouse move event and detects mouse sensitve polygon segments
Definition: baseview.cpp:334
void setRotation(double angle)
update rotation angle
Definition: baseview.cpp:570
const int a
parameters loc,a, and b identify a segment.
Definition: baseview.h:257
virtual void segmentSelected(GraphicsHoverLineItem *item)
called when the mouse hovers over a polygon segment; implemented by derived classes.
Definition: baseview.h:97
void rotateRight(double angle=10)
rotate the scene to the right
Definition: baseview.cpp:561
double min(double a, double b)
minimum function with checks for NAN
Definition: numeric.h:222
virtual void restoreSettings(QSettings &settings, QString group)
load view settings to application prefs
Definition: baseview.cpp:533
BaseView * view
parent widget
Definition: baseview.h:42
QGraphicsView * graphicsView
the embedded QGraphicsView
Definition: baseview.h:172
void print()
print the contents of the graphics scene
Definition: baseview.cpp:400
QToolButton * resetButton
the reset button
Definition: baseview.h:183
void mousePressEvent(QMouseEvent *event) override
Definition: baseview.cpp:63
void saveAsSvg(QString file)
save content of scene to an SVG file
Definition: baseview.cpp:461
virtual void saveSettings(QSettings &settings, QString group)
store view settings to application prefs
Definition: baseview.cpp:512
virtual void render(QPainter *painter, QRectF target=QRectF())
render the scene into a QPainter used for printing and saving to disk
Definition: baseview.cpp:479
void setResetButtonEnabled()
enabled reset button
Definition: baseview.cpp:317
QSlider * zoomSlider
the slider control for zoom
Definition: baseview.h:185
GraphicsHoverLineItem(QLineF line, Location loc, int a, int b, QGraphicsItemGroup *group)
default constructor
Definition: baseview.cpp:661
virtual void dropUnusedItems()
clean up graphics scene items after free-space is modified implemented by FreeSpaceView.
Definition: baseview.h:203
friend class GraphicsView
Definition: baseview.h:165
Location
location of the polygon segment
Definition: baseview.h:243
int zoomStepDefault
default zoom step
Definition: baseview.h:180
double max(double a, double b)
maximum function with checks for NAN
Definition: numeric.h:233
static void setPenWidth(QGraphicsItem *item, double width)
update the pen width of a graphics item
Definition: baseview.cpp:579
static const QStringList OUTPUT_FILTERS
file name filters for save dialog
Definition: baseview.h:170
static void addLine(QPainterPath &ppath, const QLineF &line)
add a line segment to a QPainterPath
Definition: baseview.cpp:608