From 1bcef63d3dae40cd749bd190409509aecc0ef365 Mon Sep 17 00:00:00 2001 From: Ivan Pelipenko Date: Tue, 15 Sep 2020 16:18:36 +0300 Subject: [PATCH] Graphic tracing improvements --- libs/graphic/graphic.cpp | 61 +++++++++++++++++----------------------- libs/graphic/graphic.h | 5 +++- 2 files changed, 30 insertions(+), 36 deletions(-) diff --git a/libs/graphic/graphic.cpp b/libs/graphic/graphic.cpp index 2d0954b..7a6b00b 100644 --- a/libs/graphic/graphic.cpp +++ b/libs/graphic/graphic.cpp @@ -110,7 +110,7 @@ Graphic::Graphic(QWidget * parent): QFrame(parent), canvas(0), line_x_min(this), text_color = palette().color(QPalette::WindowText); grid_pen = QPen(palette().color(QPalette::Disabled, QPalette::WindowText), 0., Qt::DotLine); graphics.append(GraphicType()); - curGraphic = 0; + curGraphic = curTrace = 0; selpen = palette().color(QPalette::WindowText); selpen.setStyle(Qt::DashLine); back_color = palette().color(QPalette::Base); @@ -1156,44 +1156,35 @@ void Graphic::drawGuides() { QPointF rpos = canvas2real(apos); QString str; str = pointCoords(rpos) + fp_size; + auto trace_func = [&](bool on_x, double cursor) { + if (curTrace >= 0 && curTrace < graphics.size()) { + if (graphics[curTrace].visible) { + QPolygonF & pol(pause_ ? graphics[curTrace].polyline_pause : graphics[curTrace].polyline); + double min_dist = -1, dist = 0.; + int index = -1; + for (int i = 0; i < pol.size(); ++i) { + if (!selrect.contains(pol[i])) continue; + dist = qAbs((on_x ? pol[i].x() : pol[i].y()) - cursor); + if (min_dist > dist || min_dist < 0) { + min_dist = dist; + index = i; + } + } + if (index >= 0) { + rpos = pol[index]; + apos = real2canvas(rpos).toPoint(); + str = pointCoords(pol[index]) + fp_size; + emit graphicTraceEvent(curTrace, rpos); + } + } + } + }; switch (floating_axis_type) { case TraceX: - if (curGraphic >= 0 && curGraphic < graphics.size()) { - QPolygonF & pol(pause_ ? graphics[curGraphic].polyline_pause : graphics[curGraphic].polyline); - double cursor = rpos.x(), min_dist = -1, dist = 0.; - int index = -1; - for (int i = 0; i < pol.size(); ++i) { - dist = qAbs(pol[i].x() - cursor); - if (min_dist > dist || min_dist < 0) { - min_dist = dist; - index = i; - } - } - if (index >= 0) { - rpos = pol[index]; - apos = real2canvas(rpos).toPoint(); - str = pointCoords(pol[index]) + fp_size; - } - } + trace_func(true, rpos.x()); break; case TraceY: - if (curGraphic >= 0 && curGraphic < graphics.size()) { - QPolygonF & pol(pause_ ? graphics[curGraphic].polyline_pause : graphics[curGraphic].polyline); - double cursor = rpos.y(), min_dist = -1, dist = 0.; - int index = -1; - for (int i = 0; i < pol.size(); ++i) { - dist = qAbs(pol[i].y() - cursor); - if (min_dist > dist || min_dist < 0) { - min_dist = dist; - index = i; - } - } - if (index >= 0) { - rpos = pol[index]; - apos = real2canvas(rpos).toPoint(); - str = pointCoords(pol[index]) + fp_size; - } - } + trace_func(false, rpos.y()); break; default: break; } diff --git a/libs/graphic/graphic.h b/libs/graphic/graphic.h index 609ad7a..25d0800 100644 --- a/libs/graphic/graphic.h +++ b/libs/graphic/graphic.h @@ -182,6 +182,7 @@ public: bool gesturesNavigation() const {return gestures;} bool isAutofitted() const {return isFit;} int currentGraphic() const {return curGraphic;} + int currentTraceGraphic() const {return curTrace;} int graphicsCount() const {return graphics.size();} Graphic::Buttons buttons() const {return buttons_;} Graphic::Alignment buttonsPosition() const {return align;} @@ -317,6 +318,7 @@ public slots: void update(bool force = false); void updateGraphics() {findGraphicsRect(); update();} void setCurrentGraphic(int arg) {if (arg < 0 || arg >= graphics.size()) return; curGraphic = arg;} + void setTraceGraphic(int arg) {if (arg < 0 || arg >= graphics.size()) return; curTrace = arg;} void setGraphicsCount(int arg, bool update = true); void removeGraphic(int arg, bool update = true); @@ -371,7 +373,7 @@ protected: QPen grid_pen, selpen; QColor back_color, text_color; QVector graphics; - int curGraphic; + int curGraphic, curTrace; GraphicAction curaction, prevaction; QRectF grect, selrect, limit_, def_rect; QRect margins_; @@ -437,6 +439,7 @@ signals: void graphicMousePressEvent(QPointF point, int buttons); void graphicMouseReleaseEvent(QPointF point, int buttons); void graphicWheelEvent(QPointF point, int delta); + void graphicTraceEvent(int graphic, QPointF point); void closeRequest(QWidget * ); void cleared(); void visualRectChanged();