X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdrawingview.cpp;h=23c1d49100ad95f26a55aeb7e1a441a1a8875d0b;hb=d549bfdc8c872b966b9d787c00e5e8027366093c;hp=0d62be16552d6eafc26e70268b8b085faa6b2ace;hpb=7b7c8ec7d7f5379e09a8b7392f465f41639b0c79;p=architektonas diff --git a/src/drawingview.cpp b/src/drawingview.cpp index 0d62be1..23c1d49 100644 --- a/src/drawingview.cpp +++ b/src/drawingview.cpp @@ -35,6 +35,7 @@ #include "circle.h" #include "dimension.h" #include "drawcircleaction.h" +#include "drawdimensionaction.h" #include "drawlineaction.h" #include "line.h" #include "painter.h" @@ -46,9 +47,14 @@ DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent), gridBackground(256, 256), scale(1.0), offsetX(-10), offsetY(-10), document(Vector(0, 0)), - gridSpacing(32.0), collided(false), rotateTool(false), rx(150.0), ry(150.0), - scrollDrag(false), addLineTool(false), toolAction(NULL) +// gridSpacing(32.0), collided(false), rotateTool(false), rx(150.0), ry(150.0), + gridSpacing(12.0), collided(false), rotateTool(false), rx(150.0), ry(150.0), + scrollDrag(false), addLineTool(false), addCircleTool(false), + addDimensionTool(false), +// selectionInProgress(false), + toolAction(NULL) { + document.isTopLevelContainer = true; setBackgroundRole(QPalette::Base); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -66,7 +72,7 @@ DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent), document.Add(new Arc(Vector(300, 300), 32, PI / 4.0, PI * 1.3, &document)), document.Add(new Arc(Vector(200, 200), 60, PI / 2.0, PI * 1.5, &document)); #if 1 - Dimension * dimension = new Dimension(Vector(0, 0), Vector(0, 0), &document); + Dimension * dimension = new Dimension(Vector(0, 0), Vector(0, 0), DTLinear, &document); line->SetDimensionOnLine(dimension); document.Add(dimension); #else @@ -91,7 +97,7 @@ DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent), pmp.fillRect(192, 128, 64, 64, Qt::darkGray); #else pmp.fillRect(0, 0, 256, 256, QColor(240, 240, 240)); - pmp.setPen(QPen(QColor(190, 190, 255), 2.0, Qt::SolidLine)); + pmp.setPen(QPen(QColor(210, 210, 255), 2.0, Qt::SolidLine)); for(int i=0; i<255; i+=12) pmp.drawLine(i, 0, i, 255); for(int i=0; i<255; i+=12) @@ -101,58 +107,54 @@ DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent), UpdateGridBackground(); } + void DrawingView::SetRotateToolActive(bool state/*= true*/) { rotateTool = state; update(); } + void DrawingView::SetAddLineToolActive(bool state/*= true*/) { - if (state)// && toolAction == NULL) + if (state) { - if (toolAction) - delete toolAction; - - addCircleTool = false; toolAction = new DrawLineAction(); connect(toolAction, SIGNAL(ObjectReady(Object *)), this, SLOT(AddNewObjectToDocument(Object *))); } - else if (!state && addLineTool && toolAction) - { - delete toolAction; - toolAction = NULL; - } - addLineTool = state; update(); //printf("DrawingView::SetAddLineToolActive(). toolAction=%08X\n", toolAction); } + void DrawingView::SetAddCircleToolActive(bool state/*= true*/) { - if (state)// && toolAction == NULL) + if (state) { - if (toolAction) - delete toolAction; - - addLineTool = false; toolAction = new DrawCircleAction(); connect(toolAction, SIGNAL(ObjectReady(Object *)), this, SLOT(AddNewObjectToDocument(Object *))); } - else if (!state && addCircleTool && toolAction) + + update(); +} + + +void DrawingView::SetAddDimensionToolActive(bool state/*= true*/) +{ + if (state) { - delete toolAction; - toolAction = NULL; + toolAction = new DrawDimensionAction(); + connect(toolAction, SIGNAL(ObjectReady(Object *)), this, + SLOT(AddNewObjectToDocument(Object *))); } - addCircleTool = state; update(); -//printf("DrawingView::SetAddCircleToolActive(). toolAction=%08X\n", toolAction); } + void DrawingView::UpdateGridBackground(void) { #if 0 @@ -178,6 +180,7 @@ setPalette(pal); Vector pixmapOrigin = Painter::CartesianToQtCoords(Vector()); int x = (int)pixmapOrigin.x; int y = (int)pixmapOrigin.y; + // Use mod arithmetic to grab the correct swatch of background // Problem with mod 128: Negative numbers screw it up... [FIXED] x = (x < 0 ? 0 : BG_BRUSH_SPAN - 1) - (x % BG_BRUSH_SPAN); y = (y < 0 ? 0 : BG_BRUSH_SPAN - 1) - (y % BG_BRUSH_SPAN); @@ -192,6 +195,7 @@ setPalette(pal); #endif } + void DrawingView::AddNewObjectToDocument(Object * object) { if (object) @@ -203,6 +207,7 @@ void DrawingView::AddNewObjectToDocument(Object * object) //printf("DrawingView::AddNewObjectToDocument(). object=%08X\n", object); } + QPoint DrawingView::GetAdjustedMousePosition(QMouseEvent * event) { // This is undoing the transform, e.g. going from client coords to local coords. @@ -211,6 +216,7 @@ QPoint DrawingView::GetAdjustedMousePosition(QMouseEvent * event) return QPoint(offsetX + event->x(), offsetY + (size().height() - event->y())); } + QPoint DrawingView::GetAdjustedClientPosition(int x, int y) { // VOODOO ALERT (ON Y COMPONENT!!!!) (eh?) @@ -219,6 +225,7 @@ QPoint DrawingView::GetAdjustedClientPosition(int x, int y) return QPoint(-offsetX + x, (size().height() - (-offsetY + y)) * +1.0); } + void DrawingView::paintEvent(QPaintEvent * /*event*/) { QPainter qtPainter(this); @@ -240,7 +247,8 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/) painter.DrawLine(-16384, 0, 16384, 0); // Draw supplemental (tool related) points - +// NOTE that this can be done as an action! +// In that case, we would need access to the document... if (rotateTool) { painter.SetPen(QPen(QColor(0, 200, 0), 2.0, Qt::SolidLine)); @@ -264,19 +272,29 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/) painter.drawLine(-16384, (int)y, 16384, (int)y); #endif - painter.SetPen(QPen(Qt::black, 1.0, Qt::SolidLine)); - - for(double x=0; xDraw(&painter); + + if (Object::selectionInProgress) + { +// painter.SetPen(QPen(Qt::green, 1.0, Qt::SolidLine)); + painter.SetPen(QPen(QColor(255, 127, 0, 255))); +// painter.SetBrush(QBrush(Qt::NoBrush)); + painter.SetBrush(QBrush(QColor(255, 127, 0, 100))); + painter.DrawRect(Object::selection); + } } + void DrawingView::mousePressEvent(QMouseEvent * event) { if (event->button() == Qt::LeftButton) @@ -289,6 +307,14 @@ void DrawingView::mousePressEvent(QMouseEvent * event) if (toolAction) toolAction->MouseDown(point); + + // Didn't hit any object and not using a tool, so do a selection rectangle + if (!(collided || toolAction)) + { + Object::selectionInProgress = true; + Object::selection.setTopLeft(QPointF(point.x, point.y)); + Object::selection.setBottomRight(QPointF(point.x, point.y)); + } } else if (event->button() == Qt::MiddleButton) { @@ -299,9 +325,11 @@ void DrawingView::mousePressEvent(QMouseEvent * event) } } + void DrawingView::mouseMoveEvent(QMouseEvent * event) { Vector point = Painter::QtToCartesianCoords(Vector(event->x(), event->y())); + Object::selection.setBottomRight(QPointF(point.x, point.y)); if (event->buttons() & Qt::MiddleButton) { @@ -331,6 +359,10 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event) { point += gridSpacing / 2.0; // *This* adds to Z!!! point /= gridSpacing; +//200% is ok, gridSpacing = 6 in this case... +//won't run into problems until gridSpacing = 1.5 (zoom = 800%) +//run into problems with this approach: when zoom level is 200% this truncates to +//integers, which is *not* what's wanted here... point.x = floor(point.x);//need to fix this for negative numbers... point.y = floor(point.y); point.z = 0; // Make *sure* Z doesn't go anywhere!!! @@ -341,7 +373,7 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event) //changed... document.PointerMoved(point); - if (document.NeedsUpdate()) + if (document.NeedsUpdate() || Object::selectionInProgress) update(); if (toolAction) @@ -351,6 +383,7 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event) } } + void DrawingView::mouseReleaseEvent(QMouseEvent * event) { if (event->button() == Qt::LeftButton) @@ -366,6 +399,12 @@ void DrawingView::mouseReleaseEvent(QMouseEvent * event) if (toolAction) toolAction->MouseReleased(); + + if (Object::selectionInProgress) + { + // Select all the stuff inside of selection + Object::selectionInProgress = false; + } } else if (event->button() == Qt::MiddleButton) { @@ -373,3 +412,4 @@ void DrawingView::mouseReleaseEvent(QMouseEvent * event) setCursor(Qt::ArrowCursor); } } +