X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdrawingview.cpp;h=8ad55628ced17fd993c289c2c58e524a490ea8b4;hb=b8bab716d9302fbb04d97679ee499eac781f1b22;hp=911ca677dd3b4269bde8f864038faba0ef518120;hpb=1d17841ed1d003060250dc2ef8dd6785fa02a07f;p=architektonas diff --git a/src/drawingview.cpp b/src/drawingview.cpp index 911ca67..8ad5562 100644 --- a/src/drawingview.cpp +++ b/src/drawingview.cpp @@ -159,12 +159,12 @@ void DrawingView::DrawBackground(Painter * painter) DrawSubGrid(painter, 0xB8ECFF, 0.125, start, size); if (Global::gridSpacing <= 0.25) - DrawSubGrid(painter, 0xDBDBFF, 0.25, start, size); + DrawSubGrid(painter, 0xE6E6FF, 0.25, start, size); if (Global::gridSpacing <= 0.5) - DrawSubGrid(painter, 0xDBDBFF, 0.5, start, size); + DrawSubGrid(painter, 0xE6E6FF, 0.5, start, size); - painter->SetPen(QPen(QColor(0xD2, 0xD2, 0xFF), 2.0, Qt::SolidLine)); + painter->SetPen(QPen(QColor(0xE0, 0xE0, 0xFF), 2.0, Qt::SolidLine)); for(double i=0; i<=w; i+=spacing) painter->DrawVLine(leftx + i); @@ -193,7 +193,6 @@ void DrawingView::DrawSubGrid(Painter * painter, uint32_t color, double step, Ve // void DrawingView::DeleteCurrentLayer(int layer) { -//printf("DrawingView::DeleteCurrentLayer(): currentLayer = %i\n", layer); VPVectorIter i = document.objects.begin(); while (i != document.objects.end()) @@ -230,7 +229,6 @@ void DrawingView::HandleLayerToggle(void) // void DrawingView::HandleLayerSwap(int layer1, int layer2) { -//printf("DrawingView: Swapping layers %i and %i.\n", layer1, layer2); HandleLayerSwap(layer1, layer2, document.objects); } @@ -253,42 +251,6 @@ void DrawingView::HandleLayerSwap(int layer1, int layer2, VPVector & v) } } -void DrawingView::HandlePenWidth(float width) -{ - for(VPVectorIter i=select.begin(); i!=select.end(); i++) - { - Object * obj = (Object *)(*i); - obj->thickness = width; - } - - supressSelected = true; - update(); -} - -void DrawingView::HandlePenStyle(int style) -{ - for(VPVectorIter i=select.begin(); i!=select.end(); i++) - { - Object * obj = (Object *)(*i); - obj->style = style; - } - - supressSelected = true; - update(); -} - -void DrawingView::HandlePenColor(uint32_t color) -{ - for(VPVectorIter i=select.begin(); i!=select.end(); i++) - { - Object * obj = (Object *)(*i); - obj->color = color; - } - - supressSelected = true; - update(); -} - void DrawingView::HandlePenStamp(QAction * action) { PenWidget * pw = (PenWidget *)action->parentWidget(); @@ -340,7 +302,6 @@ QPoint DrawingView::GetAdjustedClientPosition(int x, int y) void DrawingView::focusOutEvent(QFocusEvent * /*event*/) { -// printf("DrawingView::focusOutEvent()...\n"); // Make sure all modkeys being held are marked as released when the app // loses focus (N.B.: This only works because the app sets the focus policy // of this object to something other than Qt::NoFocus) @@ -355,9 +316,6 @@ void DrawingView::focusInEvent(QFocusEvent * /*event*/) setCursor(curMarker); else if (Global::penDropper) setCursor(curDropper); -//FocusOut already set this... -// else -// setCursor(Qt::ArrowCursor); } void DrawingView::paintEvent(QPaintEvent * /*event*/) @@ -387,16 +345,20 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/) // Do tool rendering, if any... if (Global::tool) { - painter.SetPen(QPen(QColor(200, 100, 0, 255), 1.0, Qt::DashLine)); - painter.DrawCrosshair(oldPoint); + if (Global::toolSuppressCrosshair == false) + { + painter.SetPen(QPen(QColor(200, 100, 0, 255), 1.0, Qt::DashLine)); + painter.DrawCrosshair(oldPoint); + } + ToolDraw(&painter); } // Do selection rectangle rendering, if any if (Global::selectionInProgress) { - painter.SetPen(QPen(QColor(255, 127, 0, 255))); - painter.SetBrush(QBrush(QColor(255, 127, 0, 100))); + painter.SetPen(QPen(QColor(0xFF, 0x7F, 0x00, 0xFF))); + painter.SetBrush(QBrush(QColor(0xFF, 0x7F, 0x00, 0x64))); painter.DrawRect(Global::selection); } @@ -686,6 +648,11 @@ Where is the text offset? It looks like it's drawing in the center, but obvious break; } + case OTPolyline: + { + break; + } + case OTContainer: { // Containers require recursive rendering... @@ -714,16 +681,45 @@ Where is the text offset? It looks like it's drawing in the center, but obvious } // -// This toggles the selection being hovered (typically, only 1 object) +// This toggles the selection being hovered (typically, only 1 object). We +// toggle because the CTRL key might be held, in which case, we want to +// deselect a selected object. // -void DrawingView::AddHoveredToSelection(void) +void DrawingView::HandleSelectionClick(VPVector & v) { - for(VPVectorIter i=document.objects.begin(); i!=document.objects.end(); i++) + if (ctrlDown) { - if (((Object *)(*i))->hovered) -// ((Object *)(*i))->selected = true; - ((Object *)(*i))->selected = !((Object *)(*i))->selected; + for(VPVectorIter i=v.begin(); i!=v.end(); i++) + { + Object * obj = (Object *)(*i); + + if (obj->hovered) + obj->selected = !obj->selected; + } + + return; + } + + for(VPVectorIter i=v.begin(); i!=v.end(); i++) + ((Object *)(*i))->selected = false; + + // Check if the hover changed, and if so, reset the selection stack + if (oldHover.size() != v.size()) + { + oldHover = v; + currentSelect = 0; + } + else + { + // Select next object in the stack under the cursor + currentSelect++; + + if (currentSelect >= v.size()) + currentSelect = 0; } + + dragged = (Object *)v[currentSelect]; + dragged->selected = true; } VPVector DrawingView::GetSelection(void) @@ -739,19 +735,46 @@ VPVector DrawingView::GetSelection(void) return v; } -VPVector DrawingView::GetHovered(void) +// +// When testing for hovered intersections, we need to be able to exclude some +// objects which have funky characteristics or handles; so we allow for that +// here. +// +VPVector DrawingView::GetHovered(bool exclude/*= false*/) { VPVector v; for(VPVectorIter i=document.objects.begin(); i!=document.objects.end(); i++) { - if (((Object *)(*i))->hovered) + Object * obj = (Object *)(*i); + + if (obj->hovered) + { + if (exclude + && ((obj->type == OTDimension) + || ((obj->type == OTCircle) && (obj->hitPoint[0] == true)) + || ((obj->type == OTArc) && (obj->hitPoint[0] == true)) + || (draggingObject && (obj == dragged)))) + continue; + v.push_back(*i); + } } return v; } +void DrawingView::MoveSelectedToLayer(int layer) +{ + for(VPVectorIter i=document.objects.begin(); i!=document.objects.end(); i++) + { + Object * obj = (Object *)(*i); + + if (obj->selected || obj->hovered) + obj->layer = layer; + } +} + void DrawingView::resizeEvent(QResizeEvent * /*event*/) { Global::screenSize = Vector(size().width(), size().height()); @@ -774,6 +797,8 @@ void DrawingView::ToolHandler(int mode, Point p) MirrorHandler(mode, p); else if (Global::tool == TTDimension) DimensionHandler(mode, p); + else if (Global::tool == TTDelete) + DeleteHandler(mode, p); else if (Global::tool == TTTriangulate) TriangulateHandler(mode, p); else if (Global::tool == TTTrim) @@ -917,7 +942,7 @@ void DrawingView::ToolDraw(Painter * painter) informativeText += " (Copy)"; } } - if (Global::tool == TTDimension) + else if (Global::tool == TTDimension) { if (Global::toolState == TSNone) { @@ -939,6 +964,48 @@ void DrawingView::ToolDraw(Painter * painter) informativeText = text.arg(absLength).arg(absAngle); } } + else if (Global::tool == TTTrim) + { + if (toolObj[0] != NULL) + { + // We're assuming ATM it's just a line... + painter->SetPen(0xAF0000, 3.0, LSSolid); + painter->DrawLine(toolPoint[0], toolPoint[1]); +// QString text = tr("Arc span: %1") + QChar(0x00B0); +// informativeText = text.arg(RADIANS_TO_DEGREES * span); + } + } + else if (Global::tool == TTParallel) + { + if (Global::toolState == TSPoint1) + { + painter->SetPen(0xFF00FF, 2.0, LSSolid); + painter->SetBrush(QBrush(Qt::NoBrush)); + + double length = Vector::Magnitude(toolObj[0]->p[0], toolPoint[0]); + bool inside = (length >= toolObj[0]->radius[0] ? false : true); + + for(int i=1; i<=Global::parallelNum; i++) + { + if (toolObj[0]->type == OTLine) + { + painter->DrawLine(toolObj[0]->p[0] + (toolPoint[0] * Global::parallelDist * (double)i), toolObj[0]->p[1] + (toolPoint[0] * Global::parallelDist * (double)i)); + } + else if ((toolObj[0]->type == OTCircle) || (toolObj[0]->type == OTArc)) + { + double radius = toolObj[0]->radius[0] + ((double)i * Global::parallelDist * (inside ? -1.0 : 1.0)); + + if (radius > 0) + { + if (toolObj[0]->type == OTCircle) + painter->DrawEllipse(toolObj[0]->p[0], radius, radius); + else + painter->DrawArc(toolObj[0]->p[0], radius, toolObj[0]->angle[0], toolObj[0]->angle[1]); + } + } + } + } + } } void DrawingView::LineHandler(int mode, Point p) @@ -946,6 +1013,19 @@ void DrawingView::LineHandler(int mode, Point p) switch (mode) { case ToolMouseDown: +/* toolObj[0] = NULL; + + // Check to see if we can do a circle tangent snap + if (numHovered == 1) + { + VPVector hover = GetHovered(); + Object * obj = (Object *)hover[0]; + + // Save for later if the object clicked was a circle (need to check that it wasn't the center clicked on, because that will fuck up connecting centers of circles with lines... and now we do! :-) + if ((obj->type == OTCircle) && (obj->hitPoint[0] == false)) + toolObj[0] = obj; + }*/ + if (Global::toolState == TSNone) toolPoint[0] = p; else @@ -957,7 +1037,54 @@ void DrawingView::LineHandler(int mode, Point p) if (Global::toolState == TSNone) toolPoint[0] = p; else + { toolPoint[1] = p; +/* bool isCircle = false; + + if (numHovered == 1) + { + VPVector hover = GetHovered(); + Object * obj = (Object *)hover[0]; + + if ((obj->type == OTCircle) && (obj->hitPoint[0] == false)) + { + isCircle = true; + toolObj[1] = obj; + } + } + + // Adjust initial point if it's on a circle (tangent point) + if (toolObj[0] != NULL) + { + if (isCircle) + { + Geometry::FindTangents(toolObj[0], toolObj[1]); + + if (Global::numIntersectPoints > 0) + { + toolPoint[0] = Global::intersectPoint[0]; + toolPoint[1] = Global::intersectPoint[1]; + } + } + else + { + Geometry::FindTangents(toolObj[0], p); + + if (Global::numIntersectPoints > 0) + toolPoint[0] = Global::intersectPoint[0]; + } + } + else + { + if (isCircle) + { + Geometry::FindTangents(toolObj[1], toolPoint[0]); + + if (Global::numIntersectPoints > 0) + toolPoint[1] = Global::intersectPoint[0]; + } + }*/ + } break; @@ -1408,7 +1535,7 @@ void DrawingView::DimensionHandler(int mode, Point p) } else { - Dimension * d = new Dimension(toolPoint[0], toolPoint[1], DTLinear); + Dimension * d = new Dimension(toolPoint[0], toolPoint[1], DTLinear, 0, Global::penWidth); d->layer = Global::activeLayer; document.objects.push_back(d); Global::toolState = TSNone; @@ -1416,7 +1543,37 @@ void DrawingView::DimensionHandler(int mode, Point p) } } -void DrawingView::TriangulateHandler(int mode, Point/*p*/) +void DrawingView::DeleteHandler(int mode, Point /*p*/) +{ + switch (mode) + { + case ToolMouseDown: + { + VPVector hovered = GetHovered(); + + RemoveHoveredObjects(document.objects); + DeleteContents(hovered); + } + break; + + case ToolMouseMove: + break; + + case ToolMouseUp: + break; + + case ToolKeyDown: + break; + + case ToolKeyUp: + break; + + case ToolCleanup: + break; + } +} + +void DrawingView::TriangulateHandler(int mode, Point /*p*/) { switch (mode) { @@ -1505,88 +1662,15 @@ void DrawingView::TriangulateHandler(int mode, Point/*p*/) void DrawingView::TrimHandler(int mode, Point p) { -/* -n.b.: this code is lifted straight out of the old oo code. needs to be updated. -*/ switch (mode) { case ToolMouseDown: { -#if 0 - Object * toTrim = doc->lastObjectHovered; - - if (toTrim == NULL) - return; - - Vector v(((Line *)toTrim)->position, ((Line *)toTrim)->endpoint); - - // Check to see which case we have... - // We're trimming point #1... - if (t == 0) - { - ((Line *)toTrim)->position = ((Line *)toTrim)->position + (v * u); - } - else if (u == 1.0) - { - ((Line *)toTrim)->endpoint = ((Line *)toTrim)->position + (v * t); - } - else - { - Point p1 = ((Line *)toTrim)->position + (v * t); - Point p2 = ((Line *)toTrim)->position + (v * u); - Point p3 = ((Line *)toTrim)->endpoint; - ((Line *)toTrim)->endpoint = p1; - Line * line = new Line(p2, p3); - emit ObjectReady(line); - } - - doc->lastObjectHovered = NULL; -#endif } break; case ToolMouseMove: { -#if 0 - Object * toTrim = doc->lastObjectHovered; - t = 0, u = 1.0; - - if (toTrim == NULL) - return; - - if (toTrim->type != OTLine) - return; - - double pointHoveredT = Geometry::ParameterOfLineAndPoint(((Line *)toTrim)->position, ((Line *)toTrim)->endpoint, point); - - std::vector::iterator i; - - for(i=doc->objects.begin(); i!=doc->objects.end(); i++) - { - // Can't trim against yourself... :-P - if (*i == toTrim) - continue; - - Object * trimAgainst = *i; - double t1;//, u1; - - if ((toTrim->type != OTLine) || (trimAgainst->type != OTLine)) - continue; - - int intersects = Geometry::Intersects((Line *)toTrim, (Line *)trimAgainst, &t1);//, &u1); - - if (intersects) - { - // Now what? We don't know which side to trim! - // ... now we do, we know which side of the Line we're on! - if ((t1 > t) && (t1 < pointHoveredT)) - t = t1; - - if ((t1 < u) && (t1 > pointHoveredT)) - u = t1; - } - } -#endif // Bail out if nothing hovered... if (numHovered != 1) { @@ -1606,6 +1690,7 @@ n.b.: this code is lifted straight out of the old oo code. needs to be updated. toolObj[0] = obj; double hoveredParam = Geometry::ParameterOfLineAndPoint(obj->p[0], obj->p[1], p); + double t = 0, u = 1.0; // Currently only deal with line against line trimming, can expand to // others as well (line/circle, circle/circle, line/arc, etc) @@ -1623,13 +1708,70 @@ n.b.: this code is lifted straight out of the old oo code. needs to be updated. if (Global::numIntersectParams > 0) { + // Skip endpoint-endpoint intersections + if ((Global::numIntersectParams == 2) + && (Global::intersectParam[0] == 0 + || Global::intersectParam[0] == 1.0) + && (Global::intersectParam[1] == 0 + || Global::intersectParam[1] == 1.0)) + continue; + // Mark the line segment somehow (the side the mouse is on) so that it can be drawn & trimmed when we hit ToolMouseDown. + if ((Global::intersectParam[0] > t) && (Global::intersectParam[0] < hoveredParam)) + t = Global::intersectParam[0]; + + if ((Global::intersectParam[0] < u) && (Global::intersectParam[0] > hoveredParam)) + u = Global::intersectParam[0]; } } + + toolParam[0] = t; + toolParam[1] = u; + toolPoint[0] = Geometry::GetPointForParameter(toolObj[0], t); + toolPoint[1] = Geometry::GetPointForParameter(toolObj[0], u); } break; case ToolMouseUp: + { + // Bail out if there's no object to trim + if (toolObj[0] == NULL) + return; + + Vector v(toolObj[0]->p[0], toolObj[0]->p[1]); + + // Check to see which case we have. + if ((toolParam[0] == 0) && (toolParam[1] == 1.0)) + { + // There was no intersection, so delete the object + toolObj[0]->selected = true; + DeleteSelectedObjects(document.objects); + } + else if (toolParam[0] == 0) + { + // We delete the end near point #1 + toolObj[0]->p[0] = toolObj[0]->p[0] + (v * toolParam[1]); + } + else if (toolParam[1] == 1.0) + { + // We delete the end near point #2 + toolObj[0]->p[1] = toolObj[0]->p[0] + (v * toolParam[0]); + } + else + { + // We delete the segment in between, and create a new line in the process + Point p1 = toolObj[0]->p[0] + (v * toolParam[0]); + Point p2 = toolObj[0]->p[0] + (v * toolParam[1]); + Point p3 = toolObj[0]->p[1]; + toolObj[0]->p[1] = p1; + Line * l = new Line(p2, p3, toolObj[0]->thickness, toolObj[0]->color, toolObj[0]->style); + document.objects.push_back(l); +// Global::toolState = TSNone; + } + + toolObj[0]->hitObject = toolObj[0]->hitPoint[0] = toolObj[0]->hitPoint[1] = false; + toolObj[0] = NULL; + } break; case ToolKeyDown: @@ -1643,14 +1785,85 @@ n.b.: this code is lifted straight out of the old oo code. needs to be updated. } } -void DrawingView::ParallelHandler(int mode, Point /*p*/) +void DrawingView::ParallelHandler(int mode, Point p) { switch (mode) { case ToolMouseDown: + if (numHovered == 1) + { + // New selection made... + VPVector hover = GetHovered(); + toolObj[0] = (Object *)hover[0]; + Global::toolState = TSNone; + } + else if ((numHovered == 0) && (toolObj[0] != NULL)) + { + double length = Vector::Magnitude(toolObj[0]->p[0], toolPoint[0]); + bool inside = (length >= toolObj[0]->radius[0] ? false : true); + + // Stamp out new parallel object(s)... + for(int i=1; i<=Global::parallelNum; i++) + { + if (toolObj[0]->type == OTLine) + { + Line * l = new Line(toolObj[0]->p[0] + (toolPoint[0] * Global::parallelDist * (double)i), toolObj[0]->p[1] + (toolPoint[0] * Global::parallelDist * (double)i), Global::penWidth, Global::penColor, Global::penStyle); + // Should probably have a user selection for this whether it goes into the selected objects layer or the global layer... + l->layer = toolObj[0]->layer; + document.objects.push_back(l); + } + else if (toolObj[0]->type == OTCircle) + { + double radius = toolObj[0]->radius[0] + ((double)i * Global::parallelDist * (inside ? -1.0 : 1.0)); + + if (radius > 0) + { + Circle * c = new Circle(toolObj[0]->p[0], radius, Global::penWidth, Global::penColor, Global::penStyle); + c->layer = toolObj[0]->layer; + document.objects.push_back(c); + } + } + else if (toolObj[0]->type == OTArc) + { + double radius = toolObj[0]->radius[0] + ((double)i * Global::parallelDist * (inside ? -1.0 : 1.0)); + + if (radius > 0) + { + Arc * a = new Arc(toolObj[0]->p[0], radius, toolObj[0]->angle[0], toolObj[0]->angle[1], Global::penWidth, Global::penColor, Global::penStyle); + a->layer = toolObj[0]->layer; + document.objects.push_back(a); + } + } + } + + // Then reset the state + toolObj[0]->selected = false; + toolObj[0] = NULL; + Global::toolState = TSNone; + } + break; case ToolMouseMove: + if ((numHovered == 0) && toolObj[0] != NULL) + Global::toolState = TSPoint1; + else + Global::toolState = TSNone; + + if (Global::toolState == TSPoint1) + { + // Figure out which side of the object we're on, and draw the preview on that side... + if (toolObj[0]->type == OTLine) + { + Vector normal = Geometry::GetNormalOfPointAndLine(p, (Line *)toolObj[0]); + toolPoint[0] = normal; + } + else if ((toolObj[0]->type == OTCircle) || (toolObj[0]->type == OTArc)) + { + toolPoint[0] = p; + } + } + break; case ToolMouseUp: @@ -1671,7 +1884,6 @@ void DrawingView::mousePressEvent(QMouseEvent * event) { if (event->button() == Qt::LeftButton) { -//printf("mousePressEvent::Qt::LeftButton numHovered=%li\n", numHovered); Vector point = Painter::QtToCartesianCoords(Vector(event->x(), event->y())); // Handle tool processing, if any @@ -1684,12 +1896,6 @@ void DrawingView::mousePressEvent(QMouseEvent * event) else if (Global::snapToGrid) point = SnapPointToGrid(point); - //Also, may want to figure out if hovering over a snap point on an - //object, snap to grid if not. - // Snap to object point if valid... -// if (Global::snapPointIsValid) -// point = Global::snapPoint; - ToolHandler(ToolMouseDown, point); return; } @@ -1697,49 +1903,41 @@ void DrawingView::mousePressEvent(QMouseEvent * event) // Clear the selection only if CTRL isn't being held on click if (!ctrlDown) ClearSelected(document.objects); -// ClearSelection(); - // If any objects are being hovered on click, add them to the selection - // & return + // If any objects are being hovered on click, deal with 'em if (numHovered > 0) { - AddHoveredToSelection(); - update(); // needed?? -// GetHovered(hover); // prolly needed VPVector hover2 = GetHovered(); dragged = (Object *)hover2[0]; - draggingObject = true; -//printf("mousePressEvent::numHovered > 0 (hover2[0]=$%llx, type=%s)\n", dragged, objName[dragged->type]); // Alert the pen widget -// Maybe do this with an eyedropper tool on the pen bar? [YES] -// emit ObjectSelected(dragged); if (Global::penDropper) { Global::penColor = dragged->color; Global::penWidth = dragged->thickness; Global::penStyle = dragged->style; emit ObjectSelected(dragged); - ClearSelected(document.objects); return; } - - if (Global::penStamp) + else if (Global::penStamp) { dragged->color = Global::penColor; dragged->thickness = Global::penWidth; dragged->style = Global::penStyle; return; } - - // See if anything is using just a straight click on a handle - if (HandleObjectClicked()) + // See if anything is using just a straight click on a custom + // object handle (like Dimension objects) + else if (HandleObjectClicked()) { - draggingObject = false; update(); return; } + draggingObject = true; + HandleSelectionClick(hover2); + update(); // needed?? + // Needed for grab & moving objects // We do it *after*... why? (doesn't seem to confer any advantage...) if (hoveringIntersection) @@ -1837,7 +2035,7 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event) // Do object hit testing... bool needUpdate = HitTestObjects(point); - VPVector hover2 = GetHovered(); + VPVector hover2 = GetHovered(true); // Exclude dimension objects and circle centers (probably need to add arc centers too) from hover (also dragged objects...) #if 0 { if (needUpdate) @@ -1851,9 +2049,9 @@ if (needUpdate) #endif // Check for multi-hover... - if (numHovered > 1) + if (hover2.size() > 1) { -//need to check for case where hover is over 2 circles and a 3rd's center... +//need to check for case where hover is over 2 circles and a 3rd's center (no longer a problem, I think)... Object * obj1 = (Object *)hover2[0], * obj2 = (Object *)hover2[1]; Geometry::Intersects(obj1, obj2); @@ -1892,7 +2090,7 @@ if (needUpdate) intersectionPoint = v1; } } - else if (numHovered == 1) + else if (hover2.size() == 1) { Object * obj = (Object *)hover2[0]; @@ -1900,7 +2098,6 @@ if (needUpdate) { /* Not sure that this is the best way to handle this, but it works(TM)... -Except when lines are overlapping, then it doesn't work... !!! FIX !!! */ Point midpoint = Geometry::Midpoint((Line *)obj); Vector v1 = Vector::Magnitude(midpoint, point); @@ -1914,6 +2111,30 @@ Except when lines are overlapping, then it doesn't work... !!! FIX !!! needUpdate = true; } } + else if (obj->type == OTCircle) + { + if ((draggingObject && (dragged->type == OTLine)) && (dragged->hitPoint[0] || dragged->hitPoint[1])) + { + Point p = (dragged->hitPoint[0] ? dragged->p[1] : dragged->p[0]); + Geometry::FindTangents(obj, p); + + if (Global::numIntersectPoints > 0) + { + hoveringIntersection = true; + intersectionPoint = Geometry::NearestTo(point, Global::intersectPoint[0], Global::intersectPoint[1]); + } + } + else if ((Global::tool == TTLine) && (Global::toolState == TSPoint2)) + { + Geometry::FindTangents(obj, toolPoint[0]); + + if (Global::numIntersectPoints > 0) + { + hoveringIntersection = true; + intersectionPoint = Geometry::NearestTo(point, Global::intersectPoint[0], Global::intersectPoint[1]); + } + } + } } // Handle object movement (left button down & over an object) @@ -1976,16 +2197,15 @@ void DrawingView::mouseReleaseEvent(QMouseEvent * event) return; } -// if (Global::selectionInProgress) - Global::selectionInProgress = false; - + Global::selectionInProgress = false; informativeText.clear(); + // Should we be doing this automagically? Hmm... // Clear our vectors // select.clear(); //// hover.clear(); - // Scoop 'em up (do we need to??? Seems we do, because keyboard movement uses it. Also, tools use it too. But we can move it out of here) + // Scoop 'em up (do we need to??? Seems we do, because keyboard movement uses it. Also, tools use it too. But we can move it out of here [where to???]) select = GetSelection(); draggingObject = false; @@ -2254,7 +2474,7 @@ void DrawingView::CheckObjectBounds(void) switch (obj->type) { case OTLine: - case OTDimension: + case OTDimension: // N.B.: We don't check this properly... { Line * l = (Line *)obj;