// Part of the Architektonas Project
// Originally part of QCad Community Edition by Andrew Mustun
// Extensively rewritten and refactored by James L. Hammons
-// (C) 2010 Underground Software
+// Portions copyright (C) 2001-2003 RibbonSoft
+// Copyright (C) 2010 Underground Software
+// See the README and GPLv2 files for licensing and warranty information
//
// JLH = James L. Hammons <jlhamm@acm.org>
//
#include "rs_snapper.h"
#include "rs_dialogfactory.h"
-#include "rs_entitycontainer.h"
#include "drawing.h"
-#include "rs_graphicview.h"
+#include "rs_entitycontainer.h"
+#include "graphicview.h"
#include "rs_grid.h"
#include "rs_information.h"
+#include "paintinterface.h"
#include "settings.h"
/**
* Constructor.
*/
-RS_Snapper::RS_Snapper(RS_EntityContainer & c, RS_GraphicView & gv):
+RS_Snapper::RS_Snapper(RS_EntityContainer & c, GraphicView & gv):
container(&c), graphicView(&gv), finished(false)
{
init();
}
+RS_Snapper::RS_Snapper(void):
+ container(NULL), graphicView(NULL), finished(false)
+{
+ init();
+}
+
/**
* Destructor.
*/
*/
void RS_Snapper::init()
{
- snapMode = graphicView->getDefaultSnapMode();
- snapRes = graphicView->getSnapRestriction();
+ if (graphicView)
+ {
+ snapMode = graphicView->getDefaultSnapMode();
+ snapRes = graphicView->getSnapRestriction();
+ }
+
keyEntity = NULL;
snapSpot = Vector(false);
snapCoord = Vector(false);
finished = true;
}
+//bleh
+void RS_Snapper::SetContainer(RS_EntityContainer * c)
+{
+ container = c;
+}
+
+//bleh
+void RS_Snapper::SetGraphicView(GraphicView * v)
+{
+ graphicView = v;
+}
+
/**
- * @return Pointer to the entity which was the key entity for the
- * last successful snapping action. If the snap mode is "end point"
- * the key entity is the entity whos end point was caught.
- * If the snap mode didn't require an entity (e.g. free, grid) this
- * method will return NULL.
+ * @return Pointer to the entity which was the key entity for the last
+ * successful snapping action. If the snap mode is "end point" the key entity
+ * is the entity whos end point was caught. If the snap mode didn't require an
+ * entity (e.g. free, grid) this method will return NULL.
*/
RS_Entity * RS_Snapper::getKeyEntity()
{
this->snapRes = snapRes;
}
+RS2::SnapMode RS_Snapper::getSnapMode(void)
+{
+ return snapMode;
+}
+
+RS2::SnapRestriction RS_Snapper::getSnapRestriction(void)
+{
+ return snapRes;
+}
+
/**
-* Sets the snap range in pixels for catchEntity().
-*
-* @see catchEntity()
-*/
+ * Sets the snap range in pixels for catchEntity().
+ *
+ * @see catchEntity()
+ */
void RS_Snapper::setSnapRange(int r)
{
snapRange = r;
Vector RS_Snapper::snapPoint(QMouseEvent * e)
{
RS_DEBUG->print("RS_Snapper::snapPoint");
-
- deleteSnapper();
snapSpot = Vector(false);
- if (e == NULL)
+ if (!e)
{
RS_DEBUG->print(RS_Debug::D_WARNING, "RS_Snapper::snapPoint: event is NULL");
return snapSpot;
break;
}
- // handle snap restrictions that can be activated in addition
- // to the ones above:
+ // Handle snap restrictions that can be activated in addition to the ones above:
switch (snapRes)
{
case RS2::RestrictOrthogonal:
break;
}
-#warning "!!! THIS IS WHERE THE SNAPPER IS BEING DRAWN... !!!"
- drawSnapper();
-
- if (RS_DIALOGFACTORY != NULL)
+ if (RS_DIALOGFACTORY)
RS_DIALOGFACTORY->updateCoordinateWidget(snapCoord, snapCoord - graphicView->getRelativeZero());
RS_DEBUG->print("RS_Snapper::snapPoint: OK");
Vector RS_Snapper::snapEndpoint(Vector coord)
{
Vector vec(false);
+ vec = container->getNearestEndpoint(coord, NULL);
- vec = container->getNearestEndpoint(coord, NULL/*, &keyEntity*/);
return vec;
}
RS_DEBUG->print("RS_Snapper::snapGrid 001");
- if (grid != NULL)
+ if (grid)
{
RS_DEBUG->print("RS_Snapper::snapGrid 002");
Vector * pts = grid->getPoints();
{
Vector vec(false);
vec = container->getNearestPointOnEntity(coord, true, NULL, &keyEntity);
+
return vec;
}
Vector RS_Snapper::snapCenter(Vector coord)
{
Vector vec(false);
-
vec = container->getNearestCenter(coord, NULL);
+
return vec;
}
Vector RS_Snapper::snapMiddle(Vector coord)
{
Vector vec(false);
-
vec = container->getNearestMiddle(coord, NULL);
+
return vec;
}
Vector RS_Snapper::snapDist(Vector coord)
{
Vector vec(false);
-
vec = container->getNearestDist(distance, coord, NULL);
+
return vec;
}
Vector RS_Snapper::snapIntersection(Vector coord)
{
Vector vec(false);
-
vec = container->getNearestIntersection(coord, NULL);
+
return vec;
}
Vector RS_Snapper::restrictHorizontal(Vector coord)
{
Vector rz = graphicView->getRelativeZero();
- Vector ret = Vector(coord.x, rz.y);
- return ret;
+
+ return Vector(coord.x, rz.y);
}
/**
Vector RS_Snapper::restrictVertical(Vector coord)
{
Vector rz = graphicView->getRelativeZero();
- Vector ret = Vector(rz.x, coord.y);
- return ret;
+
+ return Vector(rz.x, coord.y);
}
/**
* container
* @return Pointer to the entity or NULL.
*/
-RS_Entity * RS_Snapper::catchEntity(const Vector& pos, RS2::ResolveLevel level)
+RS_Entity * RS_Snapper::catchEntity(const Vector & pos, RS2::ResolveLevel level)
{
RS_DEBUG->print("RS_Snapper::catchEntity");
int idx = -1;
- if (entity != NULL && entity->getParent() != NULL)
+ if (entity && entity->getParent())
idx = entity->getParent()->findEntity(entity);
- if (entity != NULL && dist <= graphicView->toGraphDX(snapRange))
+ if (entity && dist <= graphicView->toGraphDX(snapRange))
{
// highlight:
RS_DEBUG->print("RS_Snapper::catchEntity: found: %d", idx);
}
RS_DEBUG->print("RS_Snapper::catchEntity: OK");
- }
+}
/**
* Catches an entity which is close to the mouse cursor.
/**
* Suspends this snapper while another action takes place.
*/
-void RS_Snapper::suspend()
+/*virtual*/ void RS_Snapper::suspend()
{
- deleteSnapper();
+#warning "!!! This may need to have SetVisibility() called !!!"
+// deleteSnapper();
snapSpot = snapCoord = Vector(false);
}
/**
* Resumes this snapper after it has been suspended.
*/
-void RS_Snapper::resume()
+/*virtual*/ void RS_Snapper::resume()
{
- drawSnapper();
+#warning "!!! This may need to have SetVisibility() called !!!"
+// drawSnapper();
}
/**
- * Hides the snapper options. Default implementation does nothing.
+ * Hides the snapper options.
*/
-void RS_Snapper::hideOptions()
+/*virtual*/ void RS_Snapper::hideOptions()
{
- if (snapMode == RS2::SnapDist)
- if (RS_DIALOGFACTORY!=NULL)
- RS_DIALOGFACTORY->requestSnapDistOptions(distance, false);
+ if (snapMode == RS2::SnapDist && RS_DIALOGFACTORY)
+ RS_DIALOGFACTORY->requestSnapDistOptions(distance, false);
}
/**
- * Shows the snapper options. Default implementation does nothing.
+ * Shows the snapper options.
*/
-void RS_Snapper::showOptions()
+/*virtual*/ void RS_Snapper::showOptions()
{
- if (snapMode == RS2::SnapDist)
- if (RS_DIALOGFACTORY != NULL)
- RS_DIALOGFACTORY->requestSnapDistOptions(distance, true);
+ if (snapMode == RS2::SnapDist && RS_DIALOGFACTORY)
+ RS_DIALOGFACTORY->requestSnapDistOptions(distance, true);
}
-/**
- * Draws the snapper on the screen.
- */
-void RS_Snapper::drawSnapper()
+void RS_Snapper::SetVisible(bool visibility/*= true*/)
{
- if (!visible)
- xorSnapper();
+ visible = visibility;
}
-/**
- * Deletes the snapper from the screen.
- */
-void RS_Snapper::deleteSnapper()
+bool RS_Snapper::Visible(void)
{
- if (visible)
- {
- xorSnapper();
- snapSpot = Vector(false);
- snapCoord = Vector(false);
- }
+ return visible;
}
-/**
- * Draws / deletes the current snapper spot.
- */
-void RS_Snapper::xorSnapper()
+/*
+We need to figure out how to kick the GraphicView out of this class. Perhaps we
+need to move the toGuiX/Y() functions into another class as static functions.
+Further inspection seems to rule this out as they are pretty well coupled to the
+GraphicView class... What to do?
+*/
+void RS_Snapper::Draw(GraphicView * view, PaintInterface * painter)
{
-//Not completely true...
-//#warning "!!! xorSnapper() not working AT ALL !!!"
-#if 0
- if (!finished && snapSpot.valid)
- {
- RS_Painter * painter = graphicView->createDirectPainter();
- painter->setPreviewMode();
-
- if (snapCoord.valid)
- {
- // snap point
- painter->drawCircle(graphicView->toGui(snapCoord), 4);
-
- // crosshairs:
- if (showCrosshairs == true)
- {
- painter->setPen(RS_Pen(RS_Color(0, 255, 255), RS2::Width00, RS2::DashLine));
- painter->drawLine(Vector(0, graphicView->toGuiY(snapCoord.y)),
- Vector(graphicView->getWidth(), graphicView->toGuiY(snapCoord.y)));
- painter->drawLine(Vector(graphicView->toGuiX(snapCoord.x), 0),
- Vector(graphicView->toGuiX(snapCoord.x), graphicView->getHeight()));
- }
- }
-
- if (snapCoord.valid && snapCoord != snapSpot)
- {
- painter->drawLine(graphicView->toGui(snapSpot) + Vector(-5, 0),
- graphicView->toGui(snapSpot) + Vector(-1, 4));
- painter->drawLine(graphicView->toGui(snapSpot) + Vector(0, 5),
- graphicView->toGui(snapSpot) + Vector(4, 1));
- painter->drawLine(graphicView->toGui(snapSpot) + Vector(5, 0),
- graphicView->toGui(snapSpot) + Vector(1, -4));
- painter->drawLine(graphicView->toGui(snapSpot) + Vector(0, -5),
- graphicView->toGui(snapSpot) + Vector(-4, -1));
- }
-
- graphicView->destroyPainter();
- visible = !visible;
- }
-#else
- if (finished || !snapSpot.valid || graphicView == NULL)
+ if (finished || !snapSpot.valid || !snapCoord.valid)
return;
- graphicView->SetSnapperDraw(true);
- graphicView->SetSnapperVars(snapSpot, snapCoord, showCrosshairs);
-//Apparently, this gets hit anyway by the preview code...
-// graphicView->redraw();
+//hm, I don't like graphicView kicking around in here, especially since it now
+//lives inside GraphicView... How to !!! FIX !!!?
+//We'll pass it in for now...
+// if (snapCoord.valid)
+// {
+ // Snap point (need to make sure the brush is NULL!)
+// painter->setPen(RS_Pen(RS_Color(0, 127, 255), RS2::Width00, RS2::DashLine));
+ painter->setPen(RS_Pen(RS_Color(255, 127, 0), RS2::Width00, RS2::DashLine));
+ painter->drawCircle(view->toGui(snapCoord), 4);
+
+ // Crosshairs
+ if (showCrosshairs)
+ {
+ painter->setPen(RS_Pen(RS_Color(0, 255, 255), RS2::Width00, RS2::DashLine));
+ painter->drawLine(Vector(0, view->toGuiY(snapCoord.y)),
+ Vector(view->getWidth(), view->toGuiY(snapCoord.y)));
+ painter->drawLine(Vector(view->toGuiX(snapCoord.x), 0),
+ Vector(view->toGuiX(snapCoord.x), view->getHeight()));
+ }
+// }
- visible = !visible;
-#endif
+ if (/*snapCoord.valid &&*/ snapCoord != snapSpot)
+ {
+ painter->drawLine(view->toGui(snapSpot) + Vector(-5, 0),
+ view->toGui(snapSpot) + Vector(-1, 4));
+ painter->drawLine(view->toGui(snapSpot) + Vector(0, 5),
+ view->toGui(snapSpot) + Vector(4, 1));
+ painter->drawLine(view->toGui(snapSpot) + Vector(5, 0),
+ view->toGui(snapSpot) + Vector(1, -4));
+ painter->drawLine(view->toGui(snapSpot) + Vector(0, -5),
+ view->toGui(snapSpot) + Vector(-4, -1));
+ }
}