X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdrawingview.cpp;h=8ad55628ced17fd993c289c2c58e524a490ea8b4;hb=b8bab716d9302fbb04d97679ee499eac781f1b22;hp=4ae021c6da555d0091cda947e9296638efb3e9c4;hpb=fce575a51ba1f26418869c20e63b9f388e118ab6;p=architektonas diff --git a/src/drawingview.cpp b/src/drawingview.cpp index 4ae021c..8ad5562 100644 --- a/src/drawingview.cpp +++ b/src/drawingview.cpp @@ -193,7 +193,6 @@ void DrawingView::DrawSubGrid(Painter * painter, uint32_t color, double step, Ve // void DrawingView::DeleteCurrentLayer(int layer) { -//printf("DrawingView::DeleteCurrentLayer(): currentLayer = %i\n", layer); VPVectorIter i = document.objects.begin(); while (i != document.objects.end()) @@ -230,7 +229,6 @@ void DrawingView::HandleLayerToggle(void) // void DrawingView::HandleLayerSwap(int layer1, int layer2) { -//printf("DrawingView: Swapping layers %i and %i.\n", layer1, layer2); HandleLayerSwap(layer1, layer2, document.objects); } @@ -253,42 +251,6 @@ void DrawingView::HandleLayerSwap(int layer1, int layer2, VPVector & v) } } -void DrawingView::HandlePenWidth(float width) -{ - for(VPVectorIter i=select.begin(); i!=select.end(); i++) - { - Object * obj = (Object *)(*i); - obj->thickness = width; - } - - supressSelected = true; - update(); -} - -void DrawingView::HandlePenStyle(int style) -{ - for(VPVectorIter i=select.begin(); i!=select.end(); i++) - { - Object * obj = (Object *)(*i); - obj->style = style; - } - - supressSelected = true; - update(); -} - -void DrawingView::HandlePenColor(uint32_t color) -{ - for(VPVectorIter i=select.begin(); i!=select.end(); i++) - { - Object * obj = (Object *)(*i); - obj->color = color; - } - - supressSelected = true; - update(); -} - void DrawingView::HandlePenStamp(QAction * action) { PenWidget * pw = (PenWidget *)action->parentWidget(); @@ -340,7 +302,6 @@ QPoint DrawingView::GetAdjustedClientPosition(int x, int y) void DrawingView::focusOutEvent(QFocusEvent * /*event*/) { -// printf("DrawingView::focusOutEvent()...\n"); // Make sure all modkeys being held are marked as released when the app // loses focus (N.B.: This only works because the app sets the focus policy // of this object to something other than Qt::NoFocus) @@ -355,9 +316,6 @@ void DrawingView::focusInEvent(QFocusEvent * /*event*/) setCursor(curMarker); else if (Global::penDropper) setCursor(curDropper); -//FocusOut already set this... -// else -// setCursor(Qt::ArrowCursor); } void DrawingView::paintEvent(QPaintEvent * /*event*/) @@ -399,8 +357,8 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/) // Do selection rectangle rendering, if any if (Global::selectionInProgress) { - painter.SetPen(QPen(QColor(255, 127, 0, 255))); - painter.SetBrush(QBrush(QColor(255, 127, 0, 100))); + painter.SetPen(QPen(QColor(0xFF, 0x7F, 0x00, 0xFF))); + painter.SetBrush(QBrush(QColor(0xFF, 0x7F, 0x00, 0x64))); painter.DrawRect(Global::selection); } @@ -723,16 +681,45 @@ Where is the text offset? It looks like it's drawing in the center, but obvious } // -// This toggles the selection being hovered (typically, only 1 object) +// This toggles the selection being hovered (typically, only 1 object). We +// toggle because the CTRL key might be held, in which case, we want to +// deselect a selected object. // -void DrawingView::AddHoveredToSelection(void) +void DrawingView::HandleSelectionClick(VPVector & v) { - for(VPVectorIter i=document.objects.begin(); i!=document.objects.end(); i++) + if (ctrlDown) { - if (((Object *)(*i))->hovered) -// ((Object *)(*i))->selected = true; - ((Object *)(*i))->selected = !((Object *)(*i))->selected; + for(VPVectorIter i=v.begin(); i!=v.end(); i++) + { + Object * obj = (Object *)(*i); + + if (obj->hovered) + obj->selected = !obj->selected; + } + + return; + } + + for(VPVectorIter i=v.begin(); i!=v.end(); i++) + ((Object *)(*i))->selected = false; + + // Check if the hover changed, and if so, reset the selection stack + if (oldHover.size() != v.size()) + { + oldHover = v; + currentSelect = 0; + } + else + { + // Select next object in the stack under the cursor + currentSelect++; + + if (currentSelect >= v.size()) + currentSelect = 0; } + + dragged = (Object *)v[currentSelect]; + dragged->selected = true; } VPVector DrawingView::GetSelection(void) @@ -990,6 +977,34 @@ void DrawingView::ToolDraw(Painter * painter) } else if (Global::tool == TTParallel) { + if (Global::toolState == TSPoint1) + { + painter->SetPen(0xFF00FF, 2.0, LSSolid); + painter->SetBrush(QBrush(Qt::NoBrush)); + + double length = Vector::Magnitude(toolObj[0]->p[0], toolPoint[0]); + bool inside = (length >= toolObj[0]->radius[0] ? false : true); + + for(int i=1; i<=Global::parallelNum; i++) + { + if (toolObj[0]->type == OTLine) + { + painter->DrawLine(toolObj[0]->p[0] + (toolPoint[0] * Global::parallelDist * (double)i), toolObj[0]->p[1] + (toolPoint[0] * Global::parallelDist * (double)i)); + } + else if ((toolObj[0]->type == OTCircle) || (toolObj[0]->type == OTArc)) + { + double radius = toolObj[0]->radius[0] + ((double)i * Global::parallelDist * (inside ? -1.0 : 1.0)); + + if (radius > 0) + { + if (toolObj[0]->type == OTCircle) + painter->DrawEllipse(toolObj[0]->p[0], radius, radius); + else + painter->DrawArc(toolObj[0]->p[0], radius, toolObj[0]->angle[0], toolObj[0]->angle[1]); + } + } + } + } } } @@ -1770,14 +1785,85 @@ void DrawingView::TrimHandler(int mode, Point p) } } -void DrawingView::ParallelHandler(int mode, Point /*p*/) +void DrawingView::ParallelHandler(int mode, Point p) { switch (mode) { case ToolMouseDown: + if (numHovered == 1) + { + // New selection made... + VPVector hover = GetHovered(); + toolObj[0] = (Object *)hover[0]; + Global::toolState = TSNone; + } + else if ((numHovered == 0) && (toolObj[0] != NULL)) + { + double length = Vector::Magnitude(toolObj[0]->p[0], toolPoint[0]); + bool inside = (length >= toolObj[0]->radius[0] ? false : true); + + // Stamp out new parallel object(s)... + for(int i=1; i<=Global::parallelNum; i++) + { + if (toolObj[0]->type == OTLine) + { + Line * l = new Line(toolObj[0]->p[0] + (toolPoint[0] * Global::parallelDist * (double)i), toolObj[0]->p[1] + (toolPoint[0] * Global::parallelDist * (double)i), Global::penWidth, Global::penColor, Global::penStyle); + // Should probably have a user selection for this whether it goes into the selected objects layer or the global layer... + l->layer = toolObj[0]->layer; + document.objects.push_back(l); + } + else if (toolObj[0]->type == OTCircle) + { + double radius = toolObj[0]->radius[0] + ((double)i * Global::parallelDist * (inside ? -1.0 : 1.0)); + + if (radius > 0) + { + Circle * c = new Circle(toolObj[0]->p[0], radius, Global::penWidth, Global::penColor, Global::penStyle); + c->layer = toolObj[0]->layer; + document.objects.push_back(c); + } + } + else if (toolObj[0]->type == OTArc) + { + double radius = toolObj[0]->radius[0] + ((double)i * Global::parallelDist * (inside ? -1.0 : 1.0)); + + if (radius > 0) + { + Arc * a = new Arc(toolObj[0]->p[0], radius, toolObj[0]->angle[0], toolObj[0]->angle[1], Global::penWidth, Global::penColor, Global::penStyle); + a->layer = toolObj[0]->layer; + document.objects.push_back(a); + } + } + } + + // Then reset the state + toolObj[0]->selected = false; + toolObj[0] = NULL; + Global::toolState = TSNone; + } + break; case ToolMouseMove: + if ((numHovered == 0) && toolObj[0] != NULL) + Global::toolState = TSPoint1; + else + Global::toolState = TSNone; + + if (Global::toolState == TSPoint1) + { + // Figure out which side of the object we're on, and draw the preview on that side... + if (toolObj[0]->type == OTLine) + { + Vector normal = Geometry::GetNormalOfPointAndLine(p, (Line *)toolObj[0]); + toolPoint[0] = normal; + } + else if ((toolObj[0]->type == OTCircle) || (toolObj[0]->type == OTArc)) + { + toolPoint[0] = p; + } + } + break; case ToolMouseUp: @@ -1798,7 +1884,6 @@ void DrawingView::mousePressEvent(QMouseEvent * event) { if (event->button() == Qt::LeftButton) { -//printf("mousePressEvent::Qt::LeftButton numHovered=%li\n", numHovered); Vector point = Painter::QtToCartesianCoords(Vector(event->x(), event->y())); // Handle tool processing, if any @@ -1819,17 +1904,11 @@ void DrawingView::mousePressEvent(QMouseEvent * event) if (!ctrlDown) ClearSelected(document.objects); - // If any objects are being hovered on click, add them to the selection - // & return + // If any objects are being hovered on click, deal with 'em if (numHovered > 0) { - AddHoveredToSelection(); - update(); // needed?? -// GetHovered(hover); // prolly needed VPVector hover2 = GetHovered(); dragged = (Object *)hover2[0]; - draggingObject = true; -//printf("mousePressEvent::numHovered > 0 (hover2[0]=$%llx, type=%s)\n", dragged, objName[dragged->type]); // Alert the pen widget if (Global::penDropper) @@ -1838,26 +1917,27 @@ void DrawingView::mousePressEvent(QMouseEvent * event) Global::penWidth = dragged->thickness; Global::penStyle = dragged->style; emit ObjectSelected(dragged); - ClearSelected(document.objects); return; } - - if (Global::penStamp) + else if (Global::penStamp) { dragged->color = Global::penColor; dragged->thickness = Global::penWidth; dragged->style = Global::penStyle; return; } - - // See if anything is using just a straight click on a handle - if (HandleObjectClicked()) + // See if anything is using just a straight click on a custom + // object handle (like Dimension objects) + else if (HandleObjectClicked()) { - draggingObject = false; update(); return; } + draggingObject = true; + HandleSelectionClick(hover2); + update(); // needed?? + // Needed for grab & moving objects // We do it *after*... why? (doesn't seem to confer any advantage...) if (hoveringIntersection)