X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdrawingview.cpp;h=0ef95dd7edece441097e24590038ed8fe4d550ab;hb=ccac11461956c9c0cc9756f8963436b5d88dfbb7;hp=ca063c51d548070b1a000158d15b0d53e9fdcf7e;hpb=3f1e5ba1d42ab40edf75cf05df16b0e25d0821cb;p=architektonas diff --git a/src/drawingview.cpp b/src/drawingview.cpp index ca063c5..0ef95dd 100644 --- a/src/drawingview.cpp +++ b/src/drawingview.cpp @@ -607,7 +607,14 @@ void DrawingView::RenderObjects(Painter * painter, std::vector & v, int case OTText: { Text * t = (Text *)obj; - painter->DrawTextObject(t->p[0], t->s.c_str(), scaledThickness); + + if (t->measured == false) + { + t->extents = painter->MeasureTextObject(t->s.c_str(), scaledThickness); + t->measured = true; + } + + painter->DrawTextObject(t->p[0], t->s.c_str(), scaledThickness, t->angle[0]); break; } case OTSpline: @@ -1601,12 +1608,14 @@ Rect DrawingView::GetObjectExtents(Object * obj) rect = Rect(obj->p[0], obj->p[1]); break; } + case OTCircle: { rect = Rect(obj->p[0], obj->p[0]); rect.Expand(obj->radius[0]); break; } + case OTArc: { Arc * a = (Arc *)obj; @@ -1643,9 +1652,16 @@ Rect DrawingView::GetObjectExtents(Object * obj) rect *= a->radius[0]; rect.Translate(a->p[0]); + break; + } + case OTText: + { + Text * t = (Text *)obj; + rect = Rect(t->p[0], Point(t->p[0].x + t->extents.Width(), t->p[0].y - t->extents.Height())); break; } + case OTContainer: { Container * c = (Container *)obj; @@ -1656,6 +1672,7 @@ Rect DrawingView::GetObjectExtents(Object * obj) for(; i!=c->objects.end(); i++) rect |= GetObjectExtents((Object *)*i); } + default: break; } @@ -1685,6 +1702,7 @@ void DrawingView::CheckObjectBounds(void) break; } + case OTCircle: { Circle * c = (Circle *)obj; @@ -1694,6 +1712,7 @@ void DrawingView::CheckObjectBounds(void) break; } + case OTArc: { Arc * a = (Arc *)obj; @@ -1759,6 +1778,18 @@ void DrawingView::CheckObjectBounds(void) break; } + + case OTText: + { + Text * t = (Text *)obj; + Rect r(obj->p[0], Point(t->p[0].x + t->extents.Width(), t->p[0].y - t->extents.Height())); + + if (Global::selection.contains(r.l, r.t) && Global::selection.contains(r.r, r.b)) + t->selected = true; + + break; + } + default: break; } @@ -1843,6 +1874,7 @@ bool DrawingView::HitTest(Object * obj, Point point) break; } + case OTCircle: { bool oldHP = obj->hitPoint[0], oldHO = obj->hitObject; @@ -1850,7 +1882,11 @@ bool DrawingView::HitTest(Object * obj, Point point) double length = Vector::Magnitude(obj->p[0], point); if ((length * Global::zoom) < 8.0) + { obj->hitPoint[0] = true; + hoverPoint = obj->p[0]; + hoverPointValid = true; + } else if ((fabs(length - obj->radius[0]) * Global::zoom) < 2.0) obj->hitObject = true; @@ -1861,6 +1897,7 @@ bool DrawingView::HitTest(Object * obj, Point point) break; } + case OTArc: { bool oldHP0 = obj->hitPoint[0], oldHP1 = obj->hitPoint[1], oldHP2 = obj->hitPoint[2], oldHO = obj->hitObject; @@ -1883,7 +1920,11 @@ bool DrawingView::HitTest(Object * obj, Point point) double length3 = Vector::Magnitude(point, handle2); if ((length * Global::zoom) < 8.0) + { obj->hitPoint[0] = true; + hoverPoint = obj->p[0]; + hoverPointValid = true; + } else if ((length2 * Global::zoom) < 8.0) { obj->hitPoint[1] = true; @@ -1906,6 +1947,7 @@ bool DrawingView::HitTest(Object * obj, Point point) break; } + case OTDimension: { bool oldHP0 = obj->hitPoint[0], oldHP1 = obj->hitPoint[1], oldHP2 = obj->hitPoint[2], oldHP3 = obj->hitPoint[3], oldHP4 = obj->hitPoint[4], oldHO = obj->hitObject; @@ -1959,9 +2001,29 @@ bool DrawingView::HitTest(Object * obj, Point point) if ((oldHP0 != obj->hitPoint[0]) || (oldHP1 != obj->hitPoint[1]) || (oldHP2 != obj->hitPoint[2]) || (oldHP3 != obj->hitPoint[3]) || (oldHP4 != obj->hitPoint[4]) || (oldHO != obj->hitObject)) needUpdate = true; + break; + } + + case OTText: + { + Text * t = (Text *)obj; + bool oldHO = obj->hitObject; + obj->hitObject = false; + + Rect r(obj->p[0], Point(obj->p[0].x + t->extents.Width(), obj->p[0].y - t->extents.Height())); +//printf("Text: p=<%lf, %lf>, w/h=%lf, %lf [lrtb=%lf, %lf, %lf, %lf]\n", obj->p[0].x, obj->p[0].y, t->extents.Width(), t->extents.Height(), t->extents.l, t->extents.r, t->extents.t, t->extents.b); + + if (r.Contains(point)) + obj->hitObject = true; + + obj->hovered = (obj->hitObject ? true : false); + + if (oldHO != obj->hitObject) + needUpdate = true; break; } + case OTContainer: { // Containers must be recursively tested... @@ -1986,6 +2048,7 @@ bool DrawingView::HitTest(Object * obj, Point point) break; } + default: break; } @@ -2159,6 +2222,12 @@ void DrawingView::HandleObjectMovement(Point point) break; + case OTText: + if (obj->hitObject) + obj->p[0] += delta; + + break; + case OTContainer: // This is shitty, but works for now until I can code up something // nicer :-)