src/editmodes/drawmode.cc

changeset 830
a741a0b9df49
parent 829
bb903e89e23c
child 831
3cd913bf0c48
--- a/src/editmodes/drawmode.cc	Sat Jul 05 01:45:32 2014 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,286 +0,0 @@
-/*
- *  LDForge: LDraw parts authoring CAD
- *  Copyright (C) 2013, 2014 Santeri Piippo
- *
- *  This program is free software: you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <QPainter>
-#include <QMouseEvent>
-#include "drawmode.h"
-#include "../ldObject.h"
-#include "../glRenderer.h"
-
-CFGENTRY (Bool, drawLineLengths, true)
-CFGENTRY (Bool, drawAngles, false)
-
-DrawMode::DrawMode (GLRenderer* renderer) :
-	Super (renderer),
-	_rectdraw (false) {}
-
-EditModeType DrawMode::type() const
-{
-	return EditModeType::Draw;
-}
-
-void DrawMode::render (QPainter& painter) const
-{
-	QPoint poly[4];
-	Vertex poly3d[4];
-	int numverts = 4;
-	QFontMetrics metrics = QFontMetrics (QFont());
-
-	// Calculate polygon data
-	if (not _rectdraw)
-	{
-		numverts = _drawedVerts.size() + 1;
-		int i = 0;
-
-		for (Vertex const& vert : _drawedVerts)
-			poly3d[i++] = vert;
-
-		// Draw the cursor vertex as the last one in the list.
-		if (numverts <= 4)
-			poly3d[i] = renderer()->position3D();
-		else
-			numverts = 4;
-	}
-	else
-	{
-		// Get vertex information from m_rectverts
-		if (_drawedVerts.size() > 0)
-			for (int i = 0; i < numverts; ++i)
-				poly3d[i] = _rectverts[i];
-		else
-			poly3d[0] = renderer()->position3D();
-	}
-
-	// Convert to 2D
-	for (int i = 0; i < numverts; ++i)
-		poly[i] = renderer()->coordconv3_2 (poly3d[i]);
-
-	if (numverts > 0)
-	{
-		// Draw the polygon-to-be
-		painter.setBrush (_polybrush);
-		painter.drawPolygon (poly, numverts);
-
-		// Draw vertex blips
-		for (int i = 0; i < numverts; ++i)
-		{
-			QPoint& blip = poly[i];
-			painter.setPen (renderer()->linePen());
-			renderer()->drawBlip (painter, blip);
-
-			// Draw their coordinates
-			painter.setPen (renderer()->textPen());
-			painter.drawText (blip.x(), blip.y() - 8, poly3d[i].toString (true));
-		}
-
-		// Draw line lenghts and angle info if appropriate
-		if (numverts >= 2)
-		{
-			int numlines = (_drawedVerts.size() == 1) ? 1 : _drawedVerts.size() + 1;
-			painter.setPen (renderer()->textPen());
-
-			for (int i = 0; i < numlines; ++i)
-			{
-				const int j = (i + 1 < numverts) ? i + 1 : 0;
-				const int h = (i - 1 >= 0) ? i - 1 : numverts - 1;
-
-				if (cfg::drawLineLengths)
-				{
-					const QString label = QString::number ((poly3d[j] - poly3d[i]).length());
-					QPoint origin = QLineF (poly[i], poly[j]).pointAt (0.5).toPoint();
-					painter.drawText (origin, label);
-				}
-
-				if (cfg::drawAngles)
-				{
-					QLineF l0 (poly[h], poly[i]),
-						l1 (poly[i], poly[j]);
-
-					double angle = 180 - l0.angleTo (l1);
-
-					if (angle < 0)
-						angle = 180 - l1.angleTo (l0);
-
-					QString label = QString::number (angle) + QString::fromUtf8 (QByteArray ("\302\260"));
-					QPoint pos = poly[i];
-					pos.setY (pos.y() + metrics.height());
-
-					painter.drawText (pos, label);
-				}
-			}
-		}
-	}
-}
-
-bool DrawMode::preAddVertex (Vertex const& pos)
-{
-	// If we picked an already-existing vertex, stop drawing
-	for (Vertex& vert : _drawedVerts)
-	{
-		if (vert == pos)
-		{
-			endDraw();
-			return true;
-		}
-	}
-
-	return false;
-}
-
-bool DrawMode::mouseReleased (MouseEventData const& data)
-{
-	if (Super::mouseReleased (data))
-		return true;
-
-	if (data.releasedButtons & Qt::LeftButton)
-	{
-		if (_rectdraw)
-		{
-			if (_drawedVerts.size() == 2)
-			{
-				endDraw();
-				return true;
-			}
-		}
-		else
-		{
-			// If we have 4 verts, stop drawing.
-			if (_drawedVerts.size() >= 4)
-			{
-				endDraw();
-				return true;
-			}
-
-			if (_drawedVerts.isEmpty())
-			{
-				_rectdraw = (data.ev->modifiers() & Qt::ShiftModifier);
-				updateRectVerts();
-			}
-		}
-
-		addDrawnVertex (renderer()->position3D());
-		return true;
-	}
-
-	return false;
-}
-
-//
-// Update rect vertices when the mouse moves since the 3d position likely has changed
-//
-bool DrawMode::mouseMoved (QMouseEvent*)
-{
-	updateRectVerts();
-	return false;
-}
-
-void DrawMode::updateRectVerts()
-{
-	if (not _rectdraw)
-		return;
-
-	if (_drawedVerts.isEmpty())
-	{
-		for (int i = 0; i < 4; ++i)
-			_rectverts[i] = renderer()->position3D();
-
-		return;
-	}
-
-	Vertex v0 = _drawedVerts[0],
-		   v1 = (_drawedVerts.size() >= 2) ? _drawedVerts[1] : renderer()->position3D();
-
-	const Axis localx = renderer()->getCameraAxis (false),
-			   localy = renderer()->getCameraAxis (true),
-			   localz = (Axis) (3 - localx - localy);
-
-	for (int i = 0; i < 4; ++i)
-		_rectverts[i].setCoordinate (localz, renderer()->getDepthValue());
-
-	_rectverts[0].setCoordinate (localx, v0[localx]);
-	_rectverts[0].setCoordinate (localy, v0[localy]);
-	_rectverts[1].setCoordinate (localx, v1[localx]);
-	_rectverts[1].setCoordinate (localy, v0[localy]);
-	_rectverts[2].setCoordinate (localx, v1[localx]);
-	_rectverts[2].setCoordinate (localy, v1[localy]);
-	_rectverts[3].setCoordinate (localx, v0[localx]);
-	_rectverts[3].setCoordinate (localy, v1[localy]);
-}
-
-void DrawMode::endDraw()
-{
-	// Clean the selection and create the object
-	QList<Vertex>& verts = _drawedVerts;
-	LDObjectList objs;
-
-	if (_rectdraw)
-	{
-		LDQuadPtr quad (spawn<LDQuad>());
-
-		updateRectVerts();
-
-		for (int i = 0; i < quad->numVertices(); ++i)
-			quad->setVertex (i, _rectverts[i]);
-
-		quad->setColor (maincolor());
-		objs << quad;
-	}
-	else
-	{
-		switch (verts.size())
-		{
-			case 1:
-			{
-				// 1 vertex - add a vertex object
-				LDVertexPtr obj = spawn<LDVertex>();
-				obj->pos = verts[0];
-				obj->setColor (maincolor());
-				objs << obj;
-				break;
-			}
-
-			case 2:
-			{
-				// 2 verts - make a line
-				LDLinePtr obj = spawn<LDLine> (verts[0], verts[1]);
-				obj->setColor (edgecolor());
-				objs << obj;
-				break;
-			}
-
-			case 3:
-			case 4:
-			{
-				LDObjectPtr obj = (verts.size() == 3) ?
-					static_cast<LDObjectPtr> (spawn<LDTriangle>()) :
-					static_cast<LDObjectPtr> (spawn<LDQuad>());
-
-				obj->setColor (maincolor());
-
-				for (int i = 0; i < verts.size(); ++i)
-					obj->setVertex (i, verts[i]);
-
-				objs << obj;
-				break;
-			}
-		}
-	}
-
-	finishDraw (objs);
-	_rectdraw = false;
-}

mercurial