X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdrawingview.cpp;h=9acf00cd7e29fb1878b4c9c04a9c7d856c3fe68a;hb=5d8c9e52606315fbfe857f2715b8f051b4f97491;hp=911ca677dd3b4269bde8f864038faba0ef518120;hpb=742d2aa9bb46bce4f690474fa22f5980e175e55e;p=architektonas diff --git a/src/drawingview.cpp b/src/drawingview.cpp index 911ca67..9acf00c 100644 --- a/src/drawingview.cpp +++ b/src/drawingview.cpp @@ -686,6 +686,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... @@ -739,14 +744,30 @@ 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; @@ -946,6 +967,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 +991,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; @@ -1506,7 +1587,8 @@ 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. +N.B.: this code is lifted straight out of the old oo code. needs to be updated. + Also: trim tool should ignore snap. */ switch (mode) { @@ -1837,7 +1919,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 +1933,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 +1974,7 @@ if (needUpdate) intersectionPoint = v1; } } - else if (numHovered == 1) + else if (hover2.size() == 1) { Object * obj = (Object *)hover2[0]; @@ -1900,7 +1982,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 +1995,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) @@ -2254,7 +2359,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;