painter.SetBrush(QBrush(QColor(255, 127, 0, 100)));
painter.DrawRect(Global::selection);
}
+
+ if (!informativeText.isEmpty())
+ painter.DrawInformativeText(informativeText);
}
switch (obj->type)
{
case OTLine:
- {
- Line * l = (Line *)obj;
- painter->DrawLine(l->p[0], l->p[1]);
+ painter->DrawLine(obj->p[0], obj->p[1]);
- if (l->hitPoint[0])
- painter->DrawHandle(l->p[0]);
+ if (obj->hitPoint[0])
+ painter->DrawHandle(obj->p[0]);
- if (l->hitPoint[1])
- painter->DrawHandle(l->p[1]);
+ if (obj->hitPoint[1])
+ painter->DrawHandle(obj->p[1]);
break;
- }
case OTCircle:
- {
- Circle * ci = (Circle *)obj;
painter->SetBrush(QBrush(Qt::NoBrush));
- painter->DrawEllipse(ci->p[0], ci->radius[0], ci->radius[0]);
+ painter->DrawEllipse(obj->p[0], obj->radius[0], obj->radius[0]);
+
+ if (obj->hitPoint[0])
+ painter->DrawHandle(obj->p[0]);
+
break;
- }
case OTArc:
- {
- Arc * a = (Arc *)obj;
- painter->DrawArc(a->p[0], a->radius[0], a->angle[0], a->angle[1]);
+ painter->DrawArc(obj->p[0], obj->radius[0], obj->angle[0], obj->angle[1]);
break;
- }
case OTDimension:
{
Dimension * d = (Dimension *)obj;
{
if (Global::tool == TTLine)
LineHandler(mode, p);
+ else if (Global::tool == TTCircle)
+ CircleHandler(mode, p);
else if (Global::tool == TTRotate)
RotateHandler(mode, p);
}
double absAngle = v.Angle() * RADIANS_TO_DEGREES;
double absLength = v.Magnitude();
QString text = tr("Length: %1 in.\n") + QChar(0x2221) + tr(": %2");
- text = text.arg(absLength).arg(absAngle);
- painter->DrawInformativeText(text);
+ informativeText = text.arg(absLength).arg(absAngle);
+ }
+ }
+ else if (Global::tool == TTCircle)
+ {
+ if (Global::toolState == TSNone)
+ {
+ painter->DrawHandle(toolPoint[0]);
+ }
+ else if ((Global::toolState == TSPoint2) && shiftDown)
+ {
+ painter->DrawHandle(toolPoint[1]);
+ }
+ else
+ {
+ double length = Vector::Magnitude(toolPoint[0], toolPoint[1]);
+// painter->DrawLine(toolPoint[0], toolPoint[1]);
+// painter->DrawHandle(toolPoint[1]);
+ painter->SetBrush(QBrush(Qt::NoBrush));
+ painter->DrawEllipse(toolPoint[0], length, length);
+ QString text = tr("Radius: %1 in.");//\n") + QChar(0x2221) + tr(": %2");
+ informativeText = text.arg(length);//.arg(absAngle);
}
}
else if (Global::tool == TTRotate)
double absAngle = (Vector(toolPoint[1] - toolPoint[0]).Angle()) * RADIANS_TO_DEGREES;
QString text = QChar(0x2221) + QObject::tr(": %1");
- text = text.arg(absAngle);
+ informativeText = text.arg(absAngle);
if (ctrlDown)
- text += " (Copy)";
+ informativeText += " (Copy)";
- painter->DrawInformativeText(text);
+// painter->DrawInformativeText(text);
}
}
}
}
+void DrawingView::CircleHandler(int mode, Point p)
+{
+ switch (mode)
+ {
+ case ToolMouseDown:
+ if (Global::toolState == TSNone)
+ toolPoint[0] = p;
+ else
+ toolPoint[1] = p;
+
+ break;
+ case ToolMouseMove:
+ if (Global::toolState == TSNone)
+ toolPoint[0] = p;
+ else
+ toolPoint[1] = p;
+
+ break;
+ case ToolMouseUp:
+ if (Global::toolState == TSNone)
+ {
+ Global::toolState = TSPoint2;
+ // Prevent spurious line from drawing...
+ toolPoint[1] = toolPoint[0];
+ }
+ else if ((Global::toolState == TSPoint2) && shiftDown)
+ {
+ // Key override is telling us to make a new line, not continue the
+ // previous one.
+ toolPoint[0] = toolPoint[1];
+ }
+ else
+ {
+ double length = Vector::Magnitude(toolPoint[0], toolPoint[1]);
+ Circle * c = new Circle(toolPoint[0], length);
+ document.objects.push_back(c);
+ toolPoint[0] = toolPoint[1];
+ Global::toolState = TSNone;
+ }
+ }
+}
+
+
void DrawingView::RotateHandler(int mode, Point p)
{
switch (mode)
if (obj.type == OTArc)
{
-//printf("Obj2->angle[0] = %f, obj.angle[0] = %f, angle = %f\n", obj2->angle[0], obj.angle[0], angle);
obj2->angle[0] = obj.angle[0] + angle;
if (obj2->angle[0] > PI_TIMES_2)
GetHovered(hover); // prolly needed
// Needed for grab & moving objects
+ // We do it *after*... why? (doesn't seem to confer any advantage...)
if (Global::snapToGrid)
oldPoint = SnapPointToGrid(point);
// Handle object movement (left button down & over an object)
if ((event->buttons() & Qt::LeftButton) && numHovered && !Global::tool)
{
+ if (Global::snapToGrid)
+ point = SnapPointToGrid(point);
+
HandleObjectMovement(point);
update();
oldPoint = point;
if (Global::selectionInProgress)
Global::selectionInProgress = false;
-// Should be we do this automagically? Hmm...
+ informativeText.clear();
+// Should we be doing this automagically? Hmm...
// Clear our vectors
select.clear();
hover.clear();
select.push_back(*i);
//hmm, this is no good, too late to do any good :-P
-// if ((*i)->hovered)
-// hover.push_back(*i);
-// }
+// if ((*i)->hovered)
+// hover.push_back(*i);
}
}
else if (event->button() == Qt::MiddleButton)
Global::zoom /= zoomFactor;
}
-#if 1
// Global::gridSpacing = gridPixels / Painter::zoom;
// UpdateGridBackground();
SetGridSize(Global::gridSpacing * Global::zoom);
update();
// zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Global::gridSpacing));
-#endif
}
}
}
+
//
// This looks strange, but it's really quite simple: We want a point that's
// more than half-way to the next grid point to snap there while conversely we
{
case OTLine:
{
- Line * l = (Line *)obj;
- bool oldHP0 = l->hitPoint[0], oldHP1 = l->hitPoint[1], oldHO = l->hitObject;
- l->hitPoint[0] = l->hitPoint[1] = l->hitObject = false;
- Vector lineSegment = l->p[1] - l->p[0];
- Vector v1 = point - l->p[0];
- Vector v2 = point - l->p[1];
- double t = Geometry::ParameterOfLineAndPoint(l->p[0], l->p[1], point);
+ bool oldHP0 = obj->hitPoint[0], oldHP1 = obj->hitPoint[1], oldHO = obj->hitObject;
+ obj->hitPoint[0] = obj->hitPoint[1] = obj->hitObject = false;
+ Vector lineSegment = obj->p[1] - obj->p[0];
+ Vector v1 = point - obj->p[0];
+ Vector v2 = point - obj->p[1];
+ double t = Geometry::ParameterOfLineAndPoint(obj->p[0], obj->p[1], point);
double distance;
if (t < 0.0)
/ lineSegment.Magnitude());
if ((v1.Magnitude() * Global::zoom) < 8.0)
- {
- l->hitPoint[0] = true;
-// snapPoint = l->p1;
-// snapPointIsValid = true;
- }
+ obj->hitPoint[0] = true;
else if ((v2.Magnitude() * Global::zoom) < 8.0)
- {
- l->hitPoint[1] = true;
-// snapPoint = l->p2;
-// snapPointIsValid = true;
- }
+ obj->hitPoint[1] = true;
else if ((distance * Global::zoom) < 5.0)
- l->hitObject = true;
+ obj->hitObject = true;
-// bool oldHovered = l->hovered;
- l->hovered = (l->hitPoint[0] || l->hitPoint[1] || l->hitObject ? true : false);
-// l->hovered = l->hitObject;
+ obj->hovered = (obj->hitPoint[0] || obj->hitPoint[1] || obj->hitObject ? true : false);
-// if (oldHovered != l->hovered)
- if ((oldHP0 != l->hitPoint[0]) || (oldHP1 != l->hitPoint[1]) || (oldHO != l->hitObject))
+ if ((oldHP0 != obj->hitPoint[0]) || (oldHP1 != obj->hitPoint[1]) || (oldHO != obj->hitObject))
needUpdate = true;
break;
}
case OTCircle:
{
- Circle * c = (Circle *)obj;
+ bool oldHP = obj->hitPoint[0], oldHO = obj->hitObject;
+ obj->hitPoint[0] = obj->hitObject = false;
+ double length = Vector::Magnitude(obj->p[0], point);
+ if ((length * Global::zoom) < 8.0)
+ obj->hitPoint[0] = true;
+ else if ((fabs(length - obj->radius[0]) * Global::zoom) < 2.0)
+ obj->hitObject = true;
+
+ obj->hovered = (obj->hitPoint[0] || obj->hitObject ? true : false);
+
+ if ((oldHP != obj->hitPoint[0]) || (oldHO != obj->hitObject))
+ needUpdate = true;
break;
}
void DrawingView::HandleObjectMovement(Point point)
{
- if (Global::snapToGrid)
- point = SnapPointToGrid(point);
-
Point delta = point - oldPoint;
+//printf("HOM: old = (%f,%f), new = (%f, %f), delta = (%f, %f)\n", oldPoint.x, oldPoint.y, point.x, point.y, delta.x, delta.y);
Object * obj = (Object *)hover[0];
//printf("Object type = %i (size=%i), ", obj->type, hover.size());
//printf("Object (%X) move: hp1=%s, hp2=%s, hl=%s\n", obj, (obj->hitPoint[0] ? "true" : "false"), (obj->hitPoint[1] ? "true" : "false"), (obj->hitObject ? "true" : "false"));
switch (obj->type)
{
case OTLine:
- {
- Line * l = (Line *)obj;
+ if (obj->hitPoint[0])
+ obj->p[0] = point;
+ else if (obj->hitPoint[1])
+ obj->p[1] = point;
+ else if (obj->hitObject)
+ {
+ obj->p[0] += delta;
+ obj->p[1] += delta;
+ }
- if (l->hitPoint[0])
- l->p[0] = point;
- else if (l->hitPoint[1])
- l->p[1] = point;
- else if (l->hitObject)
+ break;
+ case OTCircle:
+ if (obj->hitPoint[0])
+ obj->p[0] = point;
+ else if (obj->hitObject)
{
- l->p[0] += delta;
- l->p[1] += delta;
+//this doesn't work. we need to save this on mouse down for this to work correctly!
+// double oldRadius = obj->radius[0];
+ obj->radius[0] = Vector::Magnitude(obj->p[0], point);
+
+ QString text = QObject::tr("Radius: %1");//\nScale: %2%");
+ informativeText = text.arg(obj->radius[0], 0, 'd', 4);//.arg(obj->radius[0] / oldRadius * 100.0, 0, 'd', 0);
}
break;
- }
default:
break;
}