From db0a3d91f37031e155cc8eac7cfdec9889f233ee Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Thu, 16 Apr 2015 21:57:27 -0500 Subject: [PATCH] Initial work on bringing sanity to insane codebase. Yup, we're chucking out the object oriented-ness from the code, as it really didn't add anything but a layer of obfuscation that needlessly made following/changing anything in the code a nightmare of parallel modification. No more! We drank the OO Kool-Aid years ago, and it's poison! --- architektonas.pro | 94 ++++++++++++----------- src/about.cpp | 2 + src/applicationwindow.cpp | 75 ++++++++++--------- src/applicationwindow.h | 3 +- src/drawingview.cpp | 154 +++++++++++++++++++++++++------------- src/drawingview.h | 18 ++--- src/fileio.cpp | 19 +++-- src/fileio.h | 6 +- src/global.cpp | 25 +++++++ src/global.h | 40 ++++++++++ src/painter.cpp | 5 +- src/structs.h | 64 ++++++++++++++++ 12 files changed, 348 insertions(+), 157 deletions(-) create mode 100644 src/global.cpp create mode 100644 src/global.h create mode 100644 src/structs.h diff --git a/architektonas.pro b/architektonas.pro index a16a8a8..f29891e 100644 --- a/architektonas.pro +++ b/architektonas.pro @@ -48,78 +48,84 @@ DEPENDPATH = \ HEADERS = \ src/about.h \ - src/action.h \ src/applicationwindow.h \ - src/arc.h \ src/baseunittab.h \ src/blockitemwidget.h \ src/blockwidget.h \ - src/circle.h \ - src/connection.h \ - src/container.h \ - src/dimension.h \ src/drawingview.h \ - src/drawarcaction.h \ - src/drawcircleaction.h \ - src/drawdimensionaction.h \ - src/drawlineaction.h \ - src/drawsplineaction.h \ - src/drawtextaction.h \ - src/ellipse.h \ src/fileio.h \ src/generaltab.h \ - src/geometry.h \ + src/global.h \ src/layerwidget.h \ src/layeritemwidget.h \ - src/line.h \ src/main.h \ - src/mirroraction.h \ src/mathconstants.h \ - src/object.h \ src/painter.h \ - src/rotateaction.h \ src/settingsdialog.h \ - src/spline.h \ - src/text.h \ - src/triangulateaction.h \ - src/trimaction.h \ + src/structs.h \ src/vector.h +# src/action.h \ +# src/arc.h \ +# src/circle.h \ +# src/connection.h \ +# src/container.h \ +# src/dimension.h \ +# src/drawarcaction.h \ +# src/drawcircleaction.h \ +# src/drawdimensionaction.h \ +# src/drawlineaction.h \ +# src/drawsplineaction.h \ +# src/drawtextaction.h \ +# src/ellipse.h \ +# src/geometry.h \ +# src/line.h \ +# src/mirroraction.h \ +# src/object.h \ +# src/rotateaction.h \ +# src/spline.h \ +# src/text.h \ +# src/triangulateaction.h \ +# src/trimaction.h \ + + SOURCES = \ src/about.cpp \ - src/action.cpp \ src/applicationwindow.cpp \ - src/arc.cpp \ src/baseunittab.cpp \ src/blockitemwidget.cpp \ src/blockwidget.cpp \ - src/circle.cpp \ - src/connection.cpp \ - src/container.cpp \ - src/dimension.cpp \ src/drawingview.cpp \ - src/drawarcaction.cpp \ - src/drawcircleaction.cpp \ - src/drawdimensionaction.cpp \ - src/drawlineaction.cpp \ - src/drawsplineaction.cpp \ - src/drawtextaction.cpp \ - src/ellipse.cpp \ src/fileio.cpp \ src/generaltab.cpp \ - src/geometry.cpp \ + src/global.cpp \ src/layerwidget.cpp \ src/layeritemwidget.cpp \ - src/line.cpp \ src/main.cpp \ - src/mirroraction.cpp \ - src/object.cpp \ src/painter.cpp \ - src/rotateaction.cpp \ src/settingsdialog.cpp \ - src/spline.cpp \ - src/text.cpp \ - src/triangulateaction.cpp \ - src/trimaction.cpp \ src/vector.cpp +# src/action.cpp \ +# src/arc.cpp \ +# src/circle.cpp \ +# src/connection.cpp \ +# src/container.cpp \ +# src/dimension.cpp \ +# src/drawarcaction.cpp \ +# src/drawcircleaction.cpp \ +# src/drawdimensionaction.cpp \ +# src/drawlineaction.cpp \ +# src/drawsplineaction.cpp \ +# src/drawtextaction.cpp \ +# src/ellipse.cpp \ +# src/geometry.cpp \ +# src/line.cpp \ +# src/mirroraction.cpp \ +# src/object.cpp \ +# src/rotateaction.cpp \ +# src/spline.cpp \ +# src/text.cpp \ +# src/triangulateaction.cpp \ +# src/trimaction.cpp \ + diff --git a/src/about.cpp b/src/about.cpp index f821b21..17b4f96 100644 --- a/src/about.cpp +++ b/src/about.cpp @@ -17,6 +17,8 @@ // #include "about.h" +//testing... #include "structs.h" + AboutWindow::AboutWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog) { diff --git a/src/applicationwindow.cpp b/src/applicationwindow.cpp index f2dc923..06ec68c 100644 --- a/src/applicationwindow.cpp +++ b/src/applicationwindow.cpp @@ -30,24 +30,25 @@ #include "about.h" #include "blockwidget.h" -#include "dimension.h" +//#include "dimension.h" #include "drawingview.h" -#include "drawarcaction.h" -#include "drawcircleaction.h" -#include "drawdimensionaction.h" -#include "drawlineaction.h" -#include "drawsplineaction.h" +//#include "drawarcaction.h" +//#include "drawcircleaction.h" +//#include "drawdimensionaction.h" +//#include "drawlineaction.h" +//#include "drawsplineaction.h" #include "fileio.h" #include "generaltab.h" -#include "geometry.h" +//#include "geometry.h" +#include "global.h" #include "layerwidget.h" -#include "line.h" -#include "mirroraction.h" +//#include "line.h" +//#include "mirroraction.h" #include "painter.h" -#include "rotateaction.h" +//#include "rotateaction.h" #include "settingsdialog.h" -#include "triangulateaction.h" -#include "trimaction.h" +//#include "triangulateaction.h" +//#include "trimaction.h" // Class variables @@ -95,7 +96,7 @@ ApplicationWindow::ApplicationWindow(): ReadSettings(); setUnifiedTitleAndToolBarOnMac(true); - Object::SetFont(new QFont("Verdana", 15, QFont::Bold)); + Global::font = new QFont("Verdana", 15, QFont::Bold); connect(lw, SIGNAL(LayerSelected(int)), drawing, SLOT(SetCurrentLayer(int))); } @@ -112,7 +113,8 @@ void ApplicationWindow::closeEvent(QCloseEvent * event) void ApplicationWindow::FileNew(void) { // Should warn the user if drawing hasn't been saved... - drawing->document.Clear(); +// drawing->document.Clear(); + drawing->document.objects.empty(); drawing->update(); documentName.clear(); setWindowTitle("Architektonas - Untitled"); @@ -140,7 +142,7 @@ void ApplicationWindow::FileOpen(void) return; } - Container container(Vector(0, 0)); + Container container;//(Vector(0, 0)); bool successful = FileIO::LoadAtnsFile(file, &container); fclose(file); @@ -214,19 +216,19 @@ void ApplicationWindow::FileSaveAs(void) void ApplicationWindow::SnapToGridTool(void) { - Object::SetSnapMode(snapToGridAct->isChecked()); + Global::snapToGrid = snapToGridAct->isChecked(); } void ApplicationWindow::FixAngle(void) { - Object::SetFixedAngle(fixAngleAct->isChecked()); + Global::fixedAngle = fixAngleAct->isChecked(); } void ApplicationWindow::FixLength(void) { - Object::SetFixedLength(fixLengthAct->isChecked()); + Global::fixedLength = fixLengthAct->isChecked(); } @@ -235,6 +237,7 @@ void ApplicationWindow::DeleteTool(void) { // For this tool, we check first to see if anything is selected. If so, we // delete those and *don't* select the delete tool. +#if 0 if (drawing->document.ItemsSelected() > 0) { drawing->document.DeleteSelectedItems(); @@ -242,6 +245,7 @@ void ApplicationWindow::DeleteTool(void) deleteAct->setChecked(false); return; } +#endif // Otherwise, toggle the state of the tool ClearUIToolStatesExcept(deleteAct); @@ -348,12 +352,12 @@ when zooming in, new origin will be (xCenter - origin.x) / 2, (yCenter - origin. // This just zooms leaving origin intact... should zoom in at the current // center! [DONE] Painter::zoom *= zoomFactor; - Object::gridSpacing = drawing->gridPixels / Painter::zoom; + Global::gridSpacing = drawing->gridPixels / Painter::zoom; drawing->UpdateGridBackground(); drawing->update(); - zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing)); - baseUnitInput->setText(QString("%1").arg(Object::gridSpacing)); + zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Global::gridSpacing)); + baseUnitInput->setText(QString("%1").arg(Global::gridSpacing)); } @@ -387,12 +391,12 @@ x 2 = (-426, -301) // This just zooms leaving origin intact... should zoom out at the current // center! [DONE] Painter::zoom /= zoomFactor; - Object::gridSpacing = drawing->gridPixels / Painter::zoom; + Global::gridSpacing = drawing->gridPixels / Painter::zoom; drawing->UpdateGridBackground(); drawing->update(); - zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing)); - baseUnitInput->setText(QString("%1").arg(Object::gridSpacing)); + zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Global::gridSpacing)); + baseUnitInput->setText(QString("%1").arg(Global::gridSpacing)); } @@ -435,17 +439,18 @@ void ApplicationWindow::ClearUIToolStatesExcept(QAction * exception) void ApplicationWindow::SetInternalToolStates(void) { - Object::SetDeleteActive(deleteAct->isChecked()); - Object::SetDimensionActive(addDimensionAct->isChecked()); + Global::deleteActive = deleteAct->isChecked(); + Global::dimensionActive = addDimensionAct->isChecked(); // We can be sure that if we've come here, then either an active tool is // being deactivated, or a new tool is being created. In either case, the // old tool needs to be deleted. +#if 0 if (drawing->toolAction) { delete drawing->toolAction; drawing->toolAction = NULL; - Object::ignoreClicks = false; + Global::ignoreClicks = false; } drawing->SetToolActive(addLineAct->isChecked() ? new DrawLineAction() : NULL); @@ -459,7 +464,8 @@ void ApplicationWindow::SetInternalToolStates(void) drawing->SetToolActive(triangulateAct->isChecked() ? new TriangulateAction() : NULL); if (drawing->toolAction) - Object::ignoreClicks = true; + Global::ignoreClicks = true; +#endif drawing->update(); } @@ -491,6 +497,7 @@ void ApplicationWindow::Settings(void) // void ApplicationWindow::HandleGrouping(void) { +#if 0 int itemsSelected = drawing->document.ItemsSelected(); // If nothing selected, do nothing @@ -539,6 +546,7 @@ else container->state = OSSelected; statusBar()->showMessage(QString(tr("Grouped %1 objects.")).arg(itemsSelected)); } +#endif drawing->update(); } @@ -546,6 +554,7 @@ else void ApplicationWindow::HandleConnection(void) { +#if 0 //double tt = Geometry::ParameterOfLineAndPoint(Vector(0, 0), Vector(10, 0), Vector(8, 2)); //printf("Parameter of point @ (8,2) of line (0,0), (10,0): %lf\n", tt); int itemsSelected = drawing->document.ItemsSelected(); @@ -608,6 +617,7 @@ printf(" -> intersects = %i, t=%lf, u=%lf\n", intersects, t, u); } } } +#endif } @@ -635,8 +645,8 @@ void ApplicationWindow::HandleGridSizeInBaseUnits(QString text) // drawing->gridSpacing = value; // Painter::zoom = drawing->gridPixels / drawing->gridSpacing; - Object::gridSpacing = value; - Painter::zoom = drawing->gridPixels / Object::gridSpacing; + Global::gridSpacing = value; + Painter::zoom = drawing->gridPixels / Global::gridSpacing; drawing->UpdateGridBackground(); drawing->update(); } @@ -652,10 +662,7 @@ void ApplicationWindow::HandleDimensionSize(QString text) if (!ok || value == 0) return; - drawing->document.ResizeAllDimensions(value); -// drawing->gridSpacing = value; -// Painter::zoom = drawing->gridPixels / drawing->gridSpacing; -// drawing->UpdateGridBackground(); +// drawing->document.ResizeAllDimensions(value); drawing->update(); } diff --git a/src/applicationwindow.h b/src/applicationwindow.h index 339744b..32ac8f6 100644 --- a/src/applicationwindow.h +++ b/src/applicationwindow.h @@ -5,8 +5,6 @@ // Forward declarations -//class EditWindow; -//class CharWindow; class AboutWindow; class DrawingView; class QLabel; @@ -107,3 +105,4 @@ class ApplicationWindow: public QMainWindow }; #endif // __APPLICATIONWINDOW_H__ + diff --git a/src/drawingview.cpp b/src/drawingview.cpp index 629999f..5fe3841 100644 --- a/src/drawingview.cpp +++ b/src/drawingview.cpp @@ -32,11 +32,12 @@ #include #include "mathconstants.h" -#include "arc.h" -#include "circle.h" -#include "dimension.h" -#include "geometry.h" -#include "line.h" +//#include "arc.h" +//#include "circle.h" +//#include "dimension.h" +//#include "geometry.h" +//#include "line.h" +#include "global.h" #include "painter.h" @@ -50,15 +51,17 @@ DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent), // The value in the settings file will override this. useAntialiasing(true), gridBackground(BACKGROUND_MAX_SIZE, BACKGROUND_MAX_SIZE), - scale(1.0), offsetX(-10), offsetY(-10), document(Vector(0, 0)), - gridPixels(0), collided(false), toolAction(NULL) + scale(1.0), offsetX(-10), offsetY(-10),// document(Vector(0, 0)), + gridPixels(0), collided(false)//, toolAction(NULL) { - document.isTopLevelContainer = true; +// document.isTopLevelContainer = true; +//wtf? doesn't work except in c++11??? document = { 0 }; setBackgroundRole(QPalette::Base); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - Object::gridSpacing = 12.0; // In base units (inch is default) + 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); document.Add(new Line(Vector(50, 40), Vector(10, 83), &document)); @@ -75,6 +78,7 @@ DrawingView::DrawingView(QWidget * parent/*= NULL*/): QWidget(parent), // Alternate way to do the above... line->SetDimensionOnLine(); #endif +#endif /* Here we set the grid size in pixels--12 in this case. Initially, we have our @@ -94,7 +98,7 @@ set to 1.0. SCREEN_ZOOM is set to 1.0/4.0.) Really, the 100% zoom level can be set at *any* zoom level, it's more of a convenience function than any measure of absolutes. Doing things that way we could rid ourselves of the whole SCREEN_ZOOM parameter and all the attendant -shittyness that comes with it. +shittiness that comes with it. However, it seems that SCREEN_ZOOM is used to make text and arrow sizes show up a certain way, which means we should probably create something else in those @@ -126,6 +130,7 @@ we do! :-) } +#if 0 void DrawingView::SetToolActive(Action * action) { if (action != NULL) @@ -136,6 +141,7 @@ void DrawingView::SetToolActive(Action * action) connect(toolAction, SIGNAL(NeedRefresh()), this, SLOT(HandleActionUpdate())); } } +#endif void DrawingView::SetGridSize(uint32_t size) @@ -160,7 +166,7 @@ void DrawingView::SetGridSize(uint32_t size) // Set up new BG brush & zoom level (pixels per base unit) // Painter::zoom = gridPixels / gridSpacing; - Painter::zoom = gridPixels / Object::gridSpacing; + Painter::zoom = gridPixels / Global::gridSpacing; UpdateGridBackground(); } @@ -248,8 +254,8 @@ void DrawingView::AddNewObjectToDocument(Object * object) { if (object) { - object->Reparent(&document); - document.Add(object); +// object->Reparent(&document); +// document.Add(object); update(); } //printf("DrawingView::AddNewObjectToDocument(). object=%08X\n", object); @@ -264,7 +270,7 @@ void DrawingView::HandleActionUpdate(void) void DrawingView::SetCurrentLayer(int layer) { - Object::currentLayer = layer; + Global::currentLayer = layer; //printf("DrawingView::CurrentLayer = %i\n", layer); } @@ -295,7 +301,7 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/) if (useAntialiasing) qtPainter.setRenderHint(QPainter::Antialiasing); - Object::SetViewportHeight(size().height()); + Global::viewportHeight = size().height(); // Draw coordinate axes painter.SetPen(QPen(Qt::blue, 1.0, Qt::DotLine)); @@ -303,21 +309,25 @@ void DrawingView::paintEvent(QPaintEvent * /*event*/) painter.DrawLine(-16384, 0, 16384, 0); // The top level document takes care of rendering for us... - document.Draw(&painter); +// document.Draw(&painter); +#if 0 if (toolAction) { painter.SetPen(QPen(QColor(200, 100, 0, 255), 1.0, Qt::DashLine)); painter.DrawCrosshair(oldPoint); toolAction->Draw(&painter); } +#endif - if (Object::selectionInProgress) +#if 1 + if (Global::selectionInProgress) { painter.SetPen(QPen(QColor(255, 127, 0, 255))); painter.SetBrush(QBrush(QColor(255, 127, 0, 100))); - painter.DrawRect(Object::selection); + painter.DrawRect(Global::selection); } +#endif } @@ -333,32 +343,37 @@ void DrawingView::mousePressEvent(QMouseEvent * event) if (event->button() == Qt::LeftButton) { Vector point = Painter::QtToCartesianCoords(Vector(event->x(), event->y())); - collided = document.Collided(point); +// collided = document.Collided(point); + collided = false; // Do an update if collided with at least *one* object in the document - if (collided) - update(); +// if (collided) +// update(); +#if 0 if (toolAction) { - if (Object::snapToGrid) - point = Object::SnapPointToGrid(point); + if (Global::snapToGrid) + point = Global::SnapPointToGrid(point); // We always snap to object points, and they take precendence over // grid points... - if (Object::snapPointIsValid) - point = Object::snapPoint; + if (Global::snapPointIsValid) + point = Global::snapPoint; toolAction->MouseDown(point); } +#endif +#if 1 // Didn't hit any object and not using a tool, so do a selection rectangle - if (!(collided || toolAction)) + if (!(collided))// || toolAction)) { - Object::selectionInProgress = true; - Object::selection.setTopLeft(QPointF(point.x, point.y)); - Object::selection.setBottomRight(QPointF(point.x, point.y)); + Global::selectionInProgress = true; + Global::selection.setTopLeft(QPointF(point.x, point.y)); + Global::selection.setBottomRight(QPointF(point.x, point.y)); } +#endif } else if (event->button() == Qt::MiddleButton) { @@ -373,9 +388,9 @@ 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)); + Global::selection.setBottomRight(QPointF(point.x, point.y)); // Only needs to be done here, as mouse down is always preceded by movement - Object::snapPointIsValid = false; + Global::snapPointIsValid = false; // Scrolling... if (event->buttons() & Qt::MiddleButton) @@ -394,21 +409,21 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event) return; } -#if 0 +#if 1 // Grid processing... (only snap here is left button is down) - if ((event->buttons() & Qt::LeftButton) && Object::snapToGrid) + if ((event->buttons() & Qt::LeftButton) && Global::snapToGrid) { - point = Object::SnapPointToGrid(point); + point = SnapPointToGrid(point); } // Snap points on objects always take precedence over the grid, whether // dragging an object or not... //thisnowok - if (Object::snapPointIsValid) + if (Global::snapPointIsValid) { // Uncommenting this causes the cursor to become unresponsive after the first // object is added. -// point = Object::snapPoint; +// point = Global::snapPoint; } #endif @@ -416,6 +431,7 @@ void DrawingView::mouseMoveEvent(QMouseEvent * event) //we should keep track of the last point here and only pass this down *if* the point //changed... +#if 0 // This returns true if we've moved over an object... if (document.PointerMoved(point)) { @@ -442,8 +458,8 @@ selected object last and thus fucks up the algorithm. Need to fix this... if (n == 1) { - Object::snapPoint = document.lastObjectHovered->GetPointAtParameter(t); - Object::snapPointIsValid = true; + Global::snapPoint = document.lastObjectHovered->GetPointAtParameter(t); + Global::snapPointIsValid = true; } } else if ((document.lastObjectHovered->type == OTCircle) && (document.penultimateObjectHovered->type == OTCircle)) @@ -453,8 +469,8 @@ selected object last and thus fucks up the algorithm. Need to fix this... if (n == 1) { - Object::snapPoint = p1; - Object::snapPointIsValid = true; + Global::snapPoint = p1; + Global::snapPointIsValid = true; } else if (n == 2) { @@ -462,11 +478,11 @@ selected object last and thus fucks up the algorithm. Need to fix this... double d2 = Vector(point, p2).Magnitude(); if (d1 < d2) - Object::snapPoint = p1; + Global::snapPoint = p1; else - Object::snapPoint = p2; + Global::snapPoint = p2; - Object::snapPointIsValid = true; + Global::snapPointIsValid = true; } } } @@ -478,22 +494,25 @@ selected object last and thus fucks up the algorithm. Need to fix this... if (toolAction) { - if (Object::snapToGrid) - point = Object::SnapPointToGrid(point); + if (Global::snapToGrid) + point = Global::SnapPointToGrid(point); // We always snap to object points, and they take precendence over // grid points... - if (Object::snapPointIsValid) - point = Object::snapPoint; + if (Global::snapPointIsValid) + point = Global::snapPoint; toolAction->MouseMoved(point); } +#endif // This is used to draw the tool crosshair... oldPoint = point; - if (document.NeedsUpdate() || Object::selectionInProgress || toolAction) +#if 1 + if (/*document.NeedsUpdate() ||*/ Global::selectionInProgress /*|| toolAction*/) update(); +#endif } @@ -501,7 +520,9 @@ void DrawingView::mouseReleaseEvent(QMouseEvent * event) { if (event->button() == Qt::LeftButton) { +#if 0 document.PointerReleased(); +#endif //We need to update especially if nothing collided and the state needs to change. !!! FIX !!! //could set it up to use the document's update function (assumes that all object updates @@ -510,13 +531,15 @@ void DrawingView::mouseReleaseEvent(QMouseEvent * event) // if (collided) update(); // Do an update if collided with at least *one* object in the document +#if 0 if (toolAction) toolAction->MouseReleased(); +#endif - if (Object::selectionInProgress) + if (Global::selectionInProgress) { // Select all the stuff inside of selection - Object::selectionInProgress = false; + Global::selectionInProgress = false; } } else if (event->button() == Qt::MiddleButton) @@ -548,24 +571,49 @@ void DrawingView::wheelEvent(QWheelEvent * event) Painter::zoom /= zoomFactor; } -// Object::gridSpacing = gridPixels / Painter::zoom; +#if 1 +// Global::gridSpacing = gridPixels / Painter::zoom; // UpdateGridBackground(); - SetGridSize(Object::gridSpacing * Painter::zoom); + SetGridSize(Global::gridSpacing * Painter::zoom); update(); -// zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing)); +// zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Global::gridSpacing)); +#endif } void DrawingView::keyPressEvent(QKeyEvent * event) { +#if 0 if (toolAction) toolAction->KeyDown(event->key()); +#endif } void DrawingView::keyReleaseEvent(QKeyEvent * event) { +#if 0 if (toolAction) toolAction->KeyReleased(event->key()); +#endif +} + +// +// This looks strange, but it's really quite simple: We want a point that's +// more than half-way to the next grid point to snap there while conversely we +// want a point that's less than half-way to to the next grid point then snap +// to the one before it. So we add half of the grid spacing to the point, then +// divide by it so that we can remove the fractional part, then multiply it +// back to get back to the correct answer. +// +Point DrawingView::SnapPointToGrid(Point point) +{ + point += Global::gridSpacing / 2.0; // *This* adds to Z!!! + point /= Global::gridSpacing; + 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!!! + point *= Global::gridSpacing; + return point; } diff --git a/src/drawingview.h b/src/drawingview.h index af0fa92..5cbd53b 100644 --- a/src/drawingview.h +++ b/src/drawingview.h @@ -3,8 +3,9 @@ #include #include -#include "action.h" -#include "container.h" +//#include "action.h" +//#include "container.h" +#include "structs.h" class DrawingView: public QWidget { @@ -14,10 +15,10 @@ class DrawingView: public QWidget DrawingView(QWidget * parent = NULL); public: -// void SetRotateToolActive(bool state = true); - void SetToolActive(Action * action); +// void SetToolActive(Action * action); void SetGridSize(uint32_t); void UpdateGridBackground(void); + Point SnapPointToGrid(Point); public slots: void AddNewObjectToDocument(Object *); @@ -50,18 +51,11 @@ class DrawingView: public QWidget uint32_t gridPixels; // Grid size in pixels private: bool collided; -//Should this go into Object's class variables??? -//maybe, maybe not... :-P -// bool rotateTool; -// double rx, ry; bool scrollDrag; Vector oldPoint; -// bool addLineTool; -// bool addCircleTool; -// bool addDimensionTool; public: - Action * toolAction; +// Action * toolAction; // public: // static Container document; diff --git a/src/fileio.cpp b/src/fileio.cpp index 931c513..27ed4f3 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -19,11 +19,12 @@ #include #include #include -#include "arc.h" -#include "circle.h" -#include "container.h" -#include "dimension.h" -#include "line.h" +//#include "arc.h" +//#include "circle.h" +//#include "container.h" +//#include "dimension.h" +//#include "line.h" +#include "structs.h" /* How to handle connected objects @@ -125,7 +126,7 @@ enum ObjectTypeFile { OTFContainer, OTFContainerEnd, OTFLine, OTFCircle, OTFArc, enumerates all objects within itself. */ fprintf(file, "ARCHITEKTONAS DRAWING V1.0\n"); -#if 1 +#if 0 object->Enumerate(file); fprintf(file, "END\n"); return true; @@ -149,7 +150,7 @@ enum ObjectTypeFile { OTFContainer, OTFContainerEnd, OTFLine, OTFCircle, OTFArc, add objects to it until an "endContainer" marker is found. This will require a stack to maintain the current Container. */ -#if 1 +#if 0 std::vector containerStack; Container * currentTopContainer = drawing;//new Container(Vector(0, 0)); Object * object; @@ -199,6 +200,7 @@ enum ObjectTypeFile { OTFContainer, OTFContainerEnd, OTFLine, OTFCircle, OTFArc, /*static*/ bool FileIO::GetObjectFromFile(FILE * file, Object * parent, Object ** object, int * objectType) { +#if 0 char buffer[256]; int foundLayer = 0; int num = fscanf(file, "%s", buffer); @@ -290,5 +292,8 @@ if (errno) (*object)->layer = foundLayer; return recognized; +#else + return false; +#endif } diff --git a/src/fileio.h b/src/fileio.h index a30ad48..d4fc9d5 100644 --- a/src/fileio.h +++ b/src/fileio.h @@ -2,9 +2,9 @@ #define __FILEIO_H__ #include - -class Container; -class Object; +#include "structs.h" +//class Container; +//class Object; // NB: The methods in this class are all static, so there's no need to // instantiate an object of this type to use its functions. diff --git a/src/global.cpp b/src/global.cpp new file mode 100644 index 0000000..5256953 --- /dev/null +++ b/src/global.cpp @@ -0,0 +1,25 @@ +// +// This page intentionally left (mostly) blank +// + +#include +#include "global.h" + +// Initialize static variables + +bool Global::fixedAngle = false; +bool Global::fixedLength = false; +QFont * Global::font = 0; +int Global::viewportHeight = 0; +bool Global::deleteActive = false; +bool Global::dimensionActive = false; +bool Global::snapToGrid = true; +//snapToPoints all well here? +bool Global::ignoreClicks = false; +bool Global::dontMove = false; +bool Global::selectionInProgress = false; +QRectF Global::selection; +double Global::gridSpacing; +int Global::currentLayer = 0; +Point Global::snapPoint; +bool Global::snapPointIsValid = false; diff --git a/src/global.h b/src/global.h new file mode 100644 index 0000000..33fcd7a --- /dev/null +++ b/src/global.h @@ -0,0 +1,40 @@ +#ifndef __GLOBALS_H__ +#define __GLOBALS_H__ + +// Global variable class. Note that all vars are class vars, so we don't have +// to do any instantiation shite. + +#include +#include "vector.h" + +class QFont; + +class Global +{ + public: + static double gridSpacing; + static bool selectionInProgress; + static QRectF selection; + static int currentLayer; + static QFont * font; + static Point snapPoint; + static bool snapPointIsValid; + + static bool fixedAngle; + static bool fixedLength; + static int viewportHeight; + static bool deleteActive; + static bool dimensionActive; + + static bool snapToGrid; + static bool ignoreClicks; + static bool dontMove; + + // Coming soon... + static Point origin; + static double zoom; + static Vector screenSize; +}; + +#endif // __GLOBALS_H__ + diff --git a/src/painter.cpp b/src/painter.cpp index 4213261..bdac361 100644 --- a/src/painter.cpp +++ b/src/painter.cpp @@ -15,7 +15,8 @@ #include "painter.h" #include "mathconstants.h" -#include "object.h" +//#include "object.h" +#include "global.h" // Set class variable defaults @@ -343,7 +344,7 @@ void Painter::DrawCrosshair(Vector point) void Painter::DrawInformativeText(QString text) { - painter->setFont(*Object::font); + painter->setFont(*Global::font); QRectF bounds = painter->boundingRect(QRectF(), Qt::AlignVCenter, text); bounds.moveTo(17.0, 17.0); QRectF textRect = bounds; diff --git a/src/structs.h b/src/structs.h new file mode 100644 index 0000000..b9f6e9b --- /dev/null +++ b/src/structs.h @@ -0,0 +1,64 @@ +#ifndef __STRUCTS_H__ +#define __STRUCTS_H__ + +#include +#include +#include +#include "vector.h" + +#define OBJECT_COMMON \ + int type; \ + uint32_t id; \ + int layer; \ + uint32_t color; \ + float thickness; + +struct Line { + OBJECT_COMMON; + Point p1; + Point p2; +}; + +struct Circle { + OBJECT_COMMON; + Point p1; + double radius; +}; + +struct Arc { + OBJECT_COMMON; + Point p1; + double radius; + double angle1; + double angle2; +}; + +struct Text { + OBJECT_COMMON; + Point p1; + std::string s; +}; + +struct Container { + OBJECT_COMMON; + Point p1; + std::vector objects; + double angle; + double scale; +}; + +struct Dimension { + OBJECT_COMMON; + int subtype; + Point p1; + Point p2; + double offset; +}; + +struct Object { + OBJECT_COMMON; +}; + + +#endif // __STRUCTS_H__ + -- 2.37.2