ctrlDown(false),
gridBackground(BACKGROUND_MAX_SIZE, BACKGROUND_MAX_SIZE),
scale(1.0), offsetX(-10), offsetY(-10), document(true),
- gridPixels(0), collided(false), hoveringIntersection(false)
+ gridPixels(0), collided(false), hoveringIntersection(false),
+ dragged(NULL), draggingObject(false)
{
//wtf? doesn't work except in c++11??? document = { 0 };
setBackgroundRole(QPalette::Base);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Global::gridSpacing = 12.0; // In base units (inch is default)
-
#if 0
Line * line = new Line(Vector(5, 5), Vector(50, 40), &document);
document.Add(line);
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.
+ //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;
}
AddHoveredToSelection();
update(); // needed??
GetHovered(hover); // prolly needed
+ dragged = (Object *)hover[0];
+ draggingObject = true;
// Needed for grab & moving objects
// We do it *after*... why? (doesn't seem to confer any advantage...)
return;
}
- // Handle object movement (left button down & over an object)
- if ((event->buttons() & Qt::LeftButton) && numHovered && !Global::tool)
- {
- if (hoveringIntersection)
- point = intersectionPoint;
- else if (Global::snapToGrid)
- point = SnapPointToGrid(point);
-
- HandleObjectMovement(point);
- update();
- oldPoint = point;
- return;
- }
-
// Do object hit testing...
bool needUpdate = HitTestObjects(point);
+ GetHovered(hover);
// Check for multi-hover...
if (numHovered > 1)
{
- GetHovered(hover);
- Geometry::Intersects((Object *)hover[0], (Object *)hover[1]);
+//need to check for case where hover is over 2 circles and a 3rd's center...
+ Object * obj1 = (Object *)hover[0], * obj2 = (Object *)hover[1];
+
+ Geometry::Intersects(obj1, obj2);
int numIntersecting = Global::numIntersectParams;
double t = Global::intersectParam[0];
double u = Global::intersectParam[1];
if (numIntersecting > 0)
{
- Vector v1 = Geometry::GetPointForParameter((Object *)hover[0], t);
- Vector v2 = Geometry::GetPointForParameter((Object *)hover[1], u);
+ Vector v1 = Geometry::GetPointForParameter(obj1, t);
+ Vector v2 = Geometry::GetPointForParameter(obj2, u);
QString text = tr("Intersection t=%1 (%3, %4), u=%2 (%5, %6)");
informativeText = text.arg(t).arg(u).arg(v1.x).arg(v1.y).arg(v2.x).arg(v2.y);
}
}
-//this doesn't work down here for some reason... :-P
-//could be because the object being moved is part of the intersection, and this is screwing things up. In which case, we need to exclude the moving object somehow from the hit test function...
-#if 0
// Handle object movement (left button down & over an object)
- if ((event->buttons() & Qt::LeftButton) && numHovered && !Global::tool)
+ if ((event->buttons() & Qt::LeftButton) && draggingObject && !Global::tool)
{
if (hoveringIntersection)
point = intersectionPoint;
+ else if (hoverPointValid)
+ point = hoverPoint;
else if (Global::snapToGrid)
point = SnapPointToGrid(point);
oldPoint = point;
return;
}
-#endif
// Do tool handling, if any are active...
if (Global::tool)
{
if (hoveringIntersection)
point = intersectionPoint;
+ else if (hoverPointValid)
+ point = hoverPoint;
else if (Global::snapToGrid)
point = SnapPointToGrid(point);
{
if (((Object *)(*i))->selected)
select.push_back(*i);
-
-//hmm, this is no good, too late to do any good :-P
-// if ((*i)->hovered)
-// hover.push_back(*i);
}
+
+ draggingObject = false;
}
else if (event->button() == Qt::MiddleButton)
{
update();
}
+
+ if (select.size() > 0)
+ {
+ if (event->key() == Qt::Key_Up)
+ {
+ TranslateObjects(select, Point(0, +1.0));
+ update();
+ }
+ else if (event->key() == Qt::Key_Down)
+ {
+ TranslateObjects(select, Point(0, -1.0));
+ update();
+ }
+ else if (event->key() == Qt::Key_Right)
+ {
+ TranslateObjects(select, Point(+1.0, 0));
+ update();
+ }
+ else if (event->key() == Qt::Key_Left)
+ {
+ TranslateObjects(select, Point(-1.0, 0));
+ update();
+ }
+ }
}
std::vector<void *>::iterator i;
numHovered = 0;
bool needUpdate = false;
+ hoverPointValid = false;
for(i=document.objects.begin(); i!=document.objects.end(); i++)
{
Object * obj = (Object *)(*i);
+ // If we're seeing the object we're dragging, skip it
+ if (draggingObject && (obj == dragged))
+ continue;
+
if (HitTest(obj, point))
needUpdate = true;
-#if 0
- switch (obj->type)
- {
- case OTLine:
- {
- 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)
- distance = v1.Magnitude();
- else if (t > 1.0)
- distance = v2.Magnitude();
- else
- // distance = ?Det?(ls, v1) / |ls|
- distance = fabs((lineSegment.x * v1.y - v1.x * lineSegment.y)
- / lineSegment.Magnitude());
-
- if ((v1.Magnitude() * Global::zoom) < 8.0)
- obj->hitPoint[0] = true;
- else if ((v2.Magnitude() * Global::zoom) < 8.0)
- obj->hitPoint[1] = true;
- else if ((distance * Global::zoom) < 5.0)
- obj->hitObject = true;
-
- obj->hovered = (obj->hitPoint[0] || obj->hitPoint[1] || obj->hitObject ? true : false);
-
- if ((oldHP0 != obj->hitPoint[0]) || (oldHP1 != obj->hitPoint[1]) || (oldHO != obj->hitObject))
- needUpdate = true;
-
- break;
- }
- case OTCircle:
- {
- 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;
- }
- case OTArc:
- {
- bool oldHP0 = obj->hitPoint[0], oldHP1 = obj->hitPoint[1], oldHP2 = obj->hitPoint[2], oldHO = obj->hitObject;
- obj->hitPoint[0] = obj->hitPoint[1] = obj->hitPoint[2] = obj->hitObject = false;
- double length = Vector::Magnitude(obj->p[0], point);
- double angle = Vector::Angle(obj->p[0], point);
-
- // Make sure we get the angle in the correct spot
- if (angle < obj->angle[0])
- angle += TAU;
-
- // Get the span that we're pointing at...
- double span = angle - obj->angle[0];
-
- // N.B.: Still need to hit test the arc start & arc span handles...
- double spanAngle = obj->angle[0] + obj->angle[1];
- Point handle1 = obj->p[0] + (Vector(cos(obj->angle[0]), sin(obj->angle[0])) * obj->radius[0]);
- Point handle2 = obj->p[0] + (Vector(cos(spanAngle), sin(spanAngle)) * obj->radius[0]);
- double length2 = Vector::Magnitude(point, handle1);
- double length3 = Vector::Magnitude(point, handle2);
-
- if ((length * Global::zoom) < 8.0)
- obj->hitPoint[0] = true;
- else if ((length2 * Global::zoom) < 8.0)
- obj->hitPoint[1] = true;
- else if ((length3 * Global::zoom) < 8.0)
- obj->hitPoint[2] = true;
- else if (((fabs(length - obj->radius[0]) * Global::zoom) < 2.0) && (span < obj->angle[1]))
- obj->hitObject = true;
-
- obj->hovered = (obj->hitPoint[0] || obj->hitPoint[1] || obj->hitPoint[2] || obj->hitObject ? true : false);
-
- if ((oldHP0 != obj->hitPoint[0]) || (oldHP1 != obj->hitPoint[1]) || (oldHP2 != obj->hitPoint[2]) || (oldHO != obj->hitObject))
- needUpdate = true;
-
- break;
- }
- case OTContainer:
- {
- // Containers must be recursively tested...
- Container * c = (Container *)obj;
- std::vector<void *>::iterator i;
-
- for(i=c->objects.begin(); i!=c->objects.end(); i++)
- {
-
- }
- }
- default:
- break;
- }
-#endif
if (obj->hovered)
{
/ lineSegment.Magnitude());
if ((v1.Magnitude() * Global::zoom) < 8.0)
+ {
obj->hitPoint[0] = true;
+ hoverPoint = obj->p[0];
+ hoverPointValid = true;
+ }
else if ((v2.Magnitude() * Global::zoom) < 8.0)
+ {
obj->hitPoint[1] = true;
+ hoverPoint = obj->p[1];
+ hoverPointValid = true;
+ }
else if ((distance * Global::zoom) < 5.0)
obj->hitObject = true;
{
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];
+// Object * obj = (Object *)hover[0];
+ Object * obj = dragged;
//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"));