]> Shamusworld >> Repos - architektonas/blobdiff - src/drawingview.cpp
Fixed add Line tool to respect keyboard override, slight cleanup to code.
[architektonas] / src / drawingview.cpp
index 957aaf87a56d27b70fb622fccfb45ad07b990d3d..d5dd3a4d8d392c8668ab0302aad6270991d11bab 100644 (file)
@@ -39,6 +39,8 @@
 
 #define BACKGROUND_MAX_SIZE    512
 
+enum { ToolMouseDown, ToolMouseMove, ToolMouseUp };
+
 // Class variable
 //Container DrawingView::document(Vector(0, 0));
 
@@ -334,6 +336,13 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/)
                painter.DrawCrosshair(oldPoint);
                toolAction->Draw(&painter);
        }
+#else
+       if (Global::tool)
+       {
+               painter.SetPen(QPen(QColor(200, 100, 0, 255), 1.0, Qt::DashLine));
+               painter.DrawCrosshair(oldPoint);
+               ToolDraw(&painter);
+       }
 #endif
 
 #if 1
@@ -595,6 +604,73 @@ void DrawingView::resizeEvent(QResizeEvent * /*event*/)
 }
 
 
+void DrawingView::ToolMouse(int mode, Point p)
+{
+       if (Global::tool == TTLine)
+               LineHandler(mode, p);
+}
+
+
+void DrawingView::ToolDraw(Painter * painter)
+{
+       if (Global::tool == TTLine)
+       {
+               if (Global::toolState == TSNone)
+               {
+                       painter->DrawHandle(toolPoint[0]);
+               }
+               else if ((Global::toolState == TSPoint2) && shiftDown)
+               {
+                       painter->DrawHandle(toolPoint[1]);
+               }
+               else
+               {
+                       painter->DrawLine(toolPoint[0], toolPoint[1]);
+                       painter->DrawHandle(toolPoint[1]);
+               }
+       }
+}
+
+
+void DrawingView::LineHandler(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)
+               {
+                       toolPoint[0] = toolPoint[1];
+               }
+               else
+               {
+                       Line * l = new Line(toolPoint[0], toolPoint[1]);
+                       document.objects.push_back(l);
+                       toolPoint[0] = toolPoint[1];
+               }
+       }
+}
+
+
 void DrawingView::mousePressEvent(QMouseEvent * event)
 {
        if (event->button() == Qt::LeftButton)
@@ -626,6 +702,16 @@ void DrawingView::mousePressEvent(QMouseEvent * event)
 #else
                if (Global::tool)
                {
+                       if (Global::snapToGrid)
+                               point = SnapPointToGrid(point);
+
+                       // Snap to object point if valid...
+                       
+
+//                     ToolMouseDown(point);
+                       ToolMouse(ToolMouseDown, point);
+                       //Also, may want to figure out if hovering over a snap point on an object,
+                       //snap to grid if not.
                        return;
                }
 #endif
@@ -682,7 +768,12 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event)
 
 #if 1
        // Grid processing... (only snap here is left button is down)
-       if ((event->buttons() & Qt::LeftButton) && Global::snapToGrid)
+       // Umm, WHY??
+       // well, it causes problems with selecting lines that aren't close to a grid line!
+       // THAT'S WHY!
+       // But even still, this is a bad approach, we need to not just do this for every
+       // case because it's WRONG to do it that way! !!! FIX !!!
+       if (/*(event->buttons() & Qt::LeftButton) &&*/ Global::snapToGrid)
        {
                point = SnapPointToGrid(point);
        }
@@ -885,7 +976,9 @@ selected object last and thus fucks up the algorithm. Need to fix this...
 
                toolAction->MouseMoved(point);
        }
+#else
 #endif
+
        bool needUpdate = false;
 
        // Don't do this kind of checking unless we're not doing a selection rectangle!
@@ -967,6 +1060,14 @@ selected object last and thus fucks up the algorithm. Need to fix this...
        }
 //printf("MouseMove: numHovered = %i\n", numHovered);
 
+       // Tool handling...
+       if (Global::tool)
+       {
+               // Need to do snapping, etc. as well
+//             ToolMouseMove(point);
+               ToolMouse(ToolMouseMove, point);
+       }
+
        // This is used to draw the tool crosshair...
        oldPoint = point;
 
@@ -994,6 +1095,14 @@ void DrawingView::mouseReleaseEvent(QMouseEvent * event)
 #if 0
                if (toolAction)
                        toolAction->MouseReleased();
+#else
+               if (Global::tool)
+               {
+                       Vector point = Painter::QtToCartesianCoords(Vector(event->x(), event->y()));
+//                     ToolMouseUp(point);
+                       ToolMouse(ToolMouseUp, point);
+                       return;
+               }
 #endif
 
                if (Global::selectionInProgress)
@@ -1064,10 +1173,16 @@ void DrawingView::keyPressEvent(QKeyEvent * event)
        if (toolAction)
                toolAction->KeyDown(event->key());
 #endif
+       bool oldShift = shiftDown;
+       bool oldCtrl = ctrlDown;
+
        if (event->key() == Qt::Key_Shift)
                shiftDown = true;
        else if (event->key() == Qt::Key_Control)
                ctrlDown = true;
+
+       if ((oldShift != shiftDown) || (oldCtrl != ctrlDown))
+               update();
 }
 
 
@@ -1077,10 +1192,16 @@ void DrawingView::keyReleaseEvent(QKeyEvent * event)
        if (toolAction)
                toolAction->KeyReleased(event->key());
 #endif
+       bool oldShift = shiftDown;
+       bool oldCtrl = ctrlDown;
+
        if (event->key() == Qt::Key_Shift)
                shiftDown = false;
        else if (event->key() == Qt::Key_Control)
                ctrlDown = false;
+
+       if ((oldShift != shiftDown) || (oldCtrl != ctrlDown))
+               update();
 }
 
 //