diff -r ab77deb851fa -r 8d98ee0dc917 src/editmodes/drawMode.cc --- a/src/editmodes/drawMode.cc Tue Mar 03 16:50:39 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -/* - * LDForge: LDraw parts authoring CAD - * Copyright (C) 2013 - 2015 Teemu 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 . - */ - -#include -#include -#include "drawMode.h" -#include "../ldObject.h" -#include "../glRenderer.h" -#include "../miscallenous.h" - -DrawMode::DrawMode (GLRenderer* renderer) : - Super (renderer) {} - -EditModeType DrawMode::type() const -{ - return EditModeType::Draw; -} - -void DrawMode::render (QPainter& painter) const -{ - QVector poly; - QFontMetrics metrics = QFontMetrics (QFont()); - - for (Vertex const& vert : m_drawedVerts) - poly << vert; - - // Draw the cursor vertex as the last one in the list. - if (poly.size() < 4) - poly << getCursorVertex(); - - renderPolygon (painter, poly, true, true); -} - -bool DrawMode::preAddVertex (Vertex const& pos) -{ - // If we picked an already-existing vertex, stop drawing - for (Vertex& vert : m_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 we have 4 verts, stop drawing. - if (m_drawedVerts.size() >= 4) - { - endDraw(); - return true; - } - - addDrawnVertex (getCursorVertex()); - return true; - } - - return false; -} - -void DrawMode::endDraw() -{ - // Clean the selection and create the object - QList& verts = m_drawedVerts; - LDObjectList objs; - - switch (verts.size()) - { - case 1: - return; - - case 2: - { - // 2 verts - make a line - LDLinePtr obj = LDSpawn (verts[0], verts[1]); - obj->setColor (EdgeColor()); - objs << obj; - break; - } - - case 3: - case 4: - { - LDObjectPtr obj = (verts.size() == 3) ? - static_cast (LDSpawn()) : - static_cast (LDSpawn()); - - obj->setColor (MainColor()); - - for (int i = 0; i < verts.size(); ++i) - obj->setVertex (i, verts[i]); - - objs << obj; - break; - } - } - - finishDraw (objs); -} - -template -_Type IntervalClamp (_Type a, _Type interval) -{ - _Type remainder = a % interval; - - if (remainder >= float (interval / 2)) - a += interval; - - a -= remainder; - return a; -} - -Vertex DrawMode::getCursorVertex() const -{ - Vertex result = renderer()->position3D(); - - if (renderer()->keyboardModifiers() & Qt::ControlModifier - and not m_drawedVerts.isEmpty()) - { - Vertex const& v0 = m_drawedVerts.last(); - Vertex const& v1 = result; - Axis relX, relY; - - renderer()->getRelativeAxes (relX, relY); - QLineF ln (v0[relX], v0[relY], v1[relX], v1[relY]); - ln.setAngle (IntervalClamp (ln.angle(), 45)); - result.setCoordinate (relX, Grid::Snap (ln.x2(), Grid::Coordinate)); - result.setCoordinate (relY, Grid::Snap (ln.y2(), Grid::Coordinate)); - } - - return result; -}