X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdrawingview.cpp;h=4ae021c6da555d0091cda947e9296638efb3e9c4;hb=fce575a51ba1f26418869c20e63b9f388e118ab6;hp=9acf00cd7e29fb1878b4c9c04a9c7d856c3fe68a;hpb=5d8c9e52606315fbfe857f2715b8f051b4f97491;p=architektonas diff --git a/src/drawingview.cpp b/src/drawingview.cpp index 9acf00c..4ae021c 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); @@ -387,8 +387,12 @@ 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); } @@ -773,6 +777,17 @@ VPVector DrawingView::GetHovered(bool exclude/*= false*/) 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()); @@ -795,6 +810,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) @@ -938,7 +955,7 @@ void DrawingView::ToolDraw(Painter * painter) informativeText += " (Copy)"; } } - if (Global::tool == TTDimension) + else if (Global::tool == TTDimension) { if (Global::toolState == TSNone) { @@ -960,6 +977,20 @@ 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) + { + } } void DrawingView::LineHandler(int mode, Point p) @@ -1489,7 +1520,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; @@ -1497,7 +1528,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) { @@ -1586,89 +1647,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. - Also: trim tool should ignore snap. -*/ 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) { @@ -1688,6 +1675,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) @@ -1705,13 +1693,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: @@ -1766,12 +1811,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; } @@ -1779,7 +1818,6 @@ 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 @@ -1794,8 +1832,6 @@ void DrawingView::mousePressEvent(QMouseEvent * event) //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; @@ -2081,16 +2117,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;