Added a new editing mode for drawing circles.

Thu, 03 Oct 2013 18:07:06 +0300

author
Santeri Piippo <crimsondusk64@gmail.com>
date
Thu, 03 Oct 2013 18:07:06 +0300
changeset 492
e964085e6913
parent 491
7d1b5ecd76c0
child 493
16766ac1bbd9

Added a new editing mode for drawing circles.

changelog.txt file | annotate | diff | comparison | revisions
icons/mode-circle.png file | annotate | diff | comparison | revisions
ldforge.qrc file | annotate | diff | comparison | revisions
src/actions.h file | annotate | diff | comparison | revisions
src/gldraw.cpp file | annotate | diff | comparison | revisions
src/gldraw.h file | annotate | diff | comparison | revisions
src/gui.cpp file | annotate | diff | comparison | revisions
src/gui_actions.cpp file | annotate | diff | comparison | revisions
ui/ldforge.ui file | annotate | diff | comparison | revisions
--- a/changelog.txt	Sun Sep 22 23:27:07 2013 +0300
+++ b/changelog.txt	Thu Oct 03 18:07:06 2013 +0300
@@ -9,6 +9,7 @@
 - Converted the configuration code to use QSettings, in practice this means the configuration file moved to
 	the registry under Windows and into ~/.config/LDForge under Linux. Unfortunately this means settings get
 	lost during transition from version 0.2 and 0.3.
+- Added a new editing mode for drawing circles.
 - Corrections to the primitive generator:
 	- Fixed: "Hi-Res" was not prepended to the names of 48/ primitives.
 	- Fixed: Checking the Hi-Res option would not allow segment values over 16.
Binary file icons/mode-circle.png has changed
--- a/ldforge.qrc	Sun Sep 22 23:27:07 2013 +0300
+++ b/ldforge.qrc	Thu Oct 03 18:07:06 2013 +0300
@@ -66,6 +66,7 @@
 	<file>./icons/line.png</file>
 	<file>./icons/mail.png</file>
 	<file>./icons/make-borders.png</file>
+	<file>./icons/mode-circle.png</file>
 	<file>./icons/mode-draw.png</file>
 	<file>./icons/mode-select.png</file>
 	<file>./icons/move-x-neg.png</file>
--- a/src/actions.h	Sun Sep 22 23:27:07 2013 +0300
+++ b/src/actions.h	Thu Oct 03 18:07:06 2013 +0300
@@ -58,6 +58,7 @@
 act (SelectByType)
 act (ModeDraw)
 act (ModeSelect)
+act (ModeCircle)
 act (SetDrawDepth)
 act (SetColor)
 act (Autocolor)
--- a/src/gldraw.cpp	Sun Sep 22 23:27:07 2013 +0300
+++ b/src/gldraw.cpp	Thu Oct 03 18:07:06 2013 +0300
@@ -50,6 +50,12 @@
 	{{  0, -1, 0 }, Z, Y, false,  true },
 };
 
+static const matrix g_circleDrawTransforms[3] = {
+	{ 2, 0, 0, 0, 1, 0, 0, 0, 2 },
+	{ 2, 0, 0, 0, 0, 2, 0, 1, 0 },
+	{ 0, 1, 0, 2, 0, 0, 0, 0, 2 },
+};
+
 cfg (String, gl_bgcolor, "#CCCCD9");
 cfg (String, gl_maincolor, "#707078");
 cfg (Float, gl_maincolor_alpha, 1.0);
@@ -532,7 +538,6 @@
 		
 		// If we're drawing, draw the vertices onto the screen.
 		if (editMode() == Draw) {
-			const short blipsize = 8;
 			int numverts = 4;
 			
 			if (!m_rectdraw)
@@ -579,21 +584,49 @@
 				paint.drawPolygon (poly, numverts);
 				
 				// Draw vertex blips
-				pen = m_thinBorderPen;
-				pen.setWidth (1);
-				paint.setPen (pen);
-				paint.setBrush (QColor (64, 192, 0));
-				
-				for (ushort i = 0; i < numverts; ++i) {
+				for (int i = 0; i < numverts; ++i) {
 					QPoint& blip = poly[i];
-					paint.drawEllipse (blip.x() - blipsize / 2, blip.y() - blipsize / 2,
-						blipsize, blipsize);
-					
+					drawBlip (paint, blip);
+
 					// Draw their coordinates
 					paint.drawText (blip.x(), blip.y() - 8, polyverts[i].stringRep (true));
 				}
 			}
 		}
+		elif (editMode() == CircleMode)
+		{	// If we have not specified the center point of the circle yet, preview it on the screen.
+			if (m_drawedVerts.size() == 0)
+				drawBlip (paint, coordconv3_2 (m_hoverpos));
+			else
+			{	QVector<vertex> verts;
+				const double dist = circleDrawDist();
+				const int segs = lores;
+				const double angleUnit = (2 * pi) / segs;
+				Axis relX, relY;
+				getRelativeAxes (relX, relY);
+
+				for (int i = 0; i < segs; ++i)
+				{	vertex v = g_origin;
+					v[relX] = m_drawedVerts[0][relX] + (cos (i * angleUnit) * dist);
+					v[relY] = m_drawedVerts[0][relY] + (sin (i * angleUnit) * dist);
+					verts << v;
+				}
+
+				QVector<QPoint> points;
+				for (const vertex& v : verts)
+				{	QPoint point = coordconv3_2 (v);
+					drawBlip (paint, point);
+					points << point;
+				}
+
+				QPen pen = m_thinBorderPen;
+				pen.setWidth (2);
+				pen.setColor (luma (m_bgcolor) < 40 ? Qt::white : Qt::black);
+				paint.setPen (pen);
+				paint.setBrush (Qt::NoBrush);
+				paint.drawPolygon (QPolygon (points));
+			}
+		}
 	}
 	
 	// Camera icons
@@ -668,6 +701,17 @@
 
 // =============================================================================
 // -----------------------------------------------------------------------------
+void GLRenderer::drawBlip (QPainter& paint, QPoint pos) const
+{	QPen pen = m_thinBorderPen;
+	const int blipsize = 8;
+	pen.setWidth (1);
+	paint.setPen (pen);
+	paint.setBrush (QColor (64, 192, 0));
+	paint.drawEllipse (pos.x() - blipsize / 2, pos.y() - blipsize / 2, blipsize, blipsize);
+}
+
+// =============================================================================
+// -----------------------------------------------------------------------------
 QColor GLRenderer::getTextPen () const {
 	return m_darkbg ? Qt::white : Qt::black;
 }
@@ -855,7 +899,16 @@
 			
 			addDrawnVertex (m_hoverpos);
 			break;
-		
+
+		case CircleMode:
+			if (m_drawedVerts.size() == 2)
+			{	endDraw (true);
+				return;
+			}
+
+			addDrawnVertex (m_hoverpos);
+			break;
+
 		case Select:
 			if (!drawOnly()) {
 				if (m_totalmove < 10)
@@ -898,7 +951,7 @@
 				closest = pos3d;
 				valid = true;
 				
-				/* If it's only 4 pixels away, I think we found our vertex now. */
+				// If it's only 4 pixels away, I think we found our vertex now.
 				if (distsq <= 16.0f) // 4.0f ** 2
 					break;
 			}
@@ -1175,6 +1228,7 @@
 		break;
 	
 	case Draw:
+	case CircleMode:
 		// Cannot draw into the free camera - use top instead.
 		if (m_camera == Free)
 			setCamera (Top);
@@ -1222,46 +1276,75 @@
 	// Clean the selection and create the object
 	List<vertex>& verts = m_drawedVerts;
 	LDObject* obj = null;
-	
-	if (m_rectdraw) {
-		LDQuad* quad = new LDQuad;
-		
-		// Copy the vertices from m_rectverts
-		updateRectVerts();
-		
-		for (int i = 0; i < quad->vertices(); ++i)
-			quad->setVertex (i, m_rectverts[i]);
-		
-		quad->setColor (maincolor);
-		obj = quad;
-	} else {
-		switch (verts.size()) {
-		case 1:
-			// 1 vertex - add a vertex object
-			obj = new LDVertex;
-			static_cast<LDVertex*> (obj)->pos = verts[0];
-			obj->setColor (maincolor);
-			break;
-		
-		case 2:
-			// 2 verts - make a line
-			obj = new LDLine (verts[0], verts[1]);
-			obj->setColor (edgecolor);
-			break;
+
+	switch (editMode())
+	{	case Draw:
+		if (m_rectdraw) {
+			LDQuad* quad = new LDQuad;
+			
+			// Copy the vertices from m_rectverts
+			updateRectVerts();
+			
+			for (int i = 0; i < quad->vertices(); ++i)
+				quad->setVertex (i, m_rectverts[i]);
+			
+			quad->setColor (maincolor);
+			obj = quad;
+		} else {
+			switch (verts.size()) {
+			case 1:
+				// 1 vertex - add a vertex object
+				obj = new LDVertex;
+				static_cast<LDVertex*> (obj)->pos = verts[0];
+				obj->setColor (maincolor);
+				break;
 			
-		case 3:
-		case 4:
-			obj = (verts.size() == 3) ?
-				static_cast<LDObject*> (new LDTriangle) :
-				static_cast<LDObject*> (new LDQuad);
-			
-			obj->setColor (maincolor);
-			for (ushort i = 0; i < obj->vertices(); ++i)
-				obj->setVertex (i, verts[i]);
-			break;
+			case 2:
+				// 2 verts - make a line
+				obj = new LDLine (verts[0], verts[1]);
+				obj->setColor (edgecolor);
+				break;
+				
+			case 3:
+			case 4:
+				obj = (verts.size() == 3) ?
+					static_cast<LDObject*> (new LDTriangle) :
+					static_cast<LDObject*> (new LDQuad);
+				
+				obj->setColor (maincolor);
+				for (ushort i = 0; i < obj->vertices(); ++i)
+					obj->setVertex (i, verts[i]);
+				break;
+			}
 		}
+		break;
+
+		case CircleMode:
+		{	const staticCameraMeta* cam = &g_staticCameras[m_camera];
+			const double dist = circleDrawDist();
+
+			matrix transform = g_circleDrawTransforms[camera() % 3];
+			for (int i = 0; i < 9; ++i)
+			{	if (transform[i] == 2)
+					transform[i] = dist;
+				elif (transform[i] == 1 && camera() >= 3)
+					transform[i] = -1;
+			}
+
+			LDSubfile* ref = new LDSubfile;
+			ref->setFileInfo (findLoadedFile ("4-4edge.dat"));
+			ref->setTransform (transform);
+			ref->setPosition (m_drawedVerts[0]);
+			ref->setColor (maincolor);
+			obj = ref;
+		}
+		break;
+
+		case Select:
+		assert (false);
+		return;
 	}
-	
+
 	if (obj) {
 		g_win->beginAction (null);
 		file()->addObject (obj);
@@ -1276,6 +1359,27 @@
 
 // =============================================================================
 // -----------------------------------------------------------------------------
+double GLRenderer::circleDrawDist() const
+{	assert (m_drawedVerts.size() >= 1);
+	const vertex& v1 = (m_drawedVerts.size() == 2) ? m_drawedVerts[1] : m_hoverpos;
+	Axis relX, relY;
+	getRelativeAxes (relX, relY);
+
+	const double dx = m_drawedVerts[0][relX] - v1[relX];
+	const double dy = m_drawedVerts[0][relY] - v1[relY];
+	return sqrt ((dx * dx) + (dy * dy));
+}
+
+// =============================================================================
+// -----------------------------------------------------------------------------
+void GLRenderer::getRelativeAxes (Axis& relX, Axis& relY) const
+{	const staticCameraMeta* cam = &g_staticCameras[m_camera];
+	relX = cam->axisX;
+	relY = cam->axisY;
+}
+
+// =============================================================================
+// -----------------------------------------------------------------------------
 static List<vertex> getVertices (LDObject* obj) {
 	List<vertex> verts;
 	
--- a/src/gldraw.h	Sun Sep 22 23:27:07 2013 +0300
+++ b/src/gldraw.h	Thu Oct 03 18:07:06 2013 +0300
@@ -34,7 +34,8 @@
 
 enum EditMode {
 	Select,
-	Draw
+	Draw,
+	CircleMode,
 };
 
 // Meta for overlays
@@ -150,12 +151,16 @@
 	void           compileVertex (const vertex& vrt);                      // Compile a single vertex to a list
 	vertex         coordconv2_3 (const QPoint& pos2d, bool snap) const;    // Convert a 2D point to a 3D point
 	QPoint         coordconv3_2 (const vertex& pos3d) const;               // Convert a 3D point to a 2D point
-	LDOverlay* findOverlayObject (Camera cam);
+	LDOverlay*     findOverlayObject (Camera cam);
 	void           updateRectVerts();
 	void           pick (uint mouseX, uint mouseY);                        // Perform object selection
 	void           setObjectColor (LDObject* obj, const ListType list);    // Set the color to an object list
 	QColor         getTextPen() const;                                     // Determine which color to draw text with
-	
+	void           getRelativeAxes (Axis& relX, Axis& relY) const;
+
+	void           drawBlip (QPainter& paint, QPoint pos) const;
+	double         circleDrawDist() const;
+
 private slots:
 	void           slot_toolTipTimer();
 };
--- a/src/gui.cpp	Sun Sep 22 23:27:07 2013 +0300
+++ b/src/gui.cpp	Thu Oct 03 18:07:06 2013 +0300
@@ -64,11 +64,6 @@
 #define act(N) extern_cfg (KeySequence, key_##N);
 #include "actions.h"
 
-const char* g_modeActionNames[] = {
-	"modeSelect",
-	"modeDraw",
-};
-
 // =============================================================================
 // -----------------------------------------------------------------------------
 ForgeWindow::ForgeWindow() {
@@ -606,6 +601,7 @@
 	contextMenu->addAction (ACTION (ClearOverlay));
 	contextMenu->addAction (ACTION (ModeSelect));
 	contextMenu->addAction (ACTION (ModeDraw));
+	contextMenu->addAction (ACTION (ModeCircle));
 	
 	if (R()->camera() != GL::Free) {
 		contextMenu->addSeparator();
@@ -644,6 +640,7 @@
 	const EditMode mode = R()->editMode();
 	ACTION (ModeSelect)->setChecked (mode == Select);
 	ACTION (ModeDraw)->setChecked (mode == Draw);
+	ACTION (ModeCircle)->setChecked (mode == CircleMode);
 }
 
 // =============================================================================
--- a/src/gui_actions.cpp	Sun Sep 22 23:27:07 2013 +0300
+++ b/src/gui_actions.cpp	Thu Oct 03 18:07:06 2013 +0300
@@ -520,6 +520,12 @@
 
 // =============================================================================
 // -----------------------------------------------------------------------------
+DEFINE_ACTION (ModeCircle, CTRL (3))
+{	g_win->R()->setEditMode (CircleMode);
+}
+
+// =============================================================================
+// -----------------------------------------------------------------------------
 DEFINE_ACTION (SetDrawDepth, 0) {
 	if (g_win->R()->camera() == GL::Free)
 		return;
--- a/ui/ldforge.ui	Sun Sep 22 23:27:07 2013 +0300
+++ b/ui/ldforge.ui	Thu Oct 03 18:07:06 2013 +0300
@@ -14,7 +14,7 @@
    <string/>
   </property>
   <property name="windowIcon">
-   <iconset resource="../../ldforge.qrc">
+   <iconset resource="../ldforge.qrc">
     <normaloff>:/icons/ldforge.png</normaloff>:/icons/ldforge.png</iconset>
   </property>
   <widget class="QWidget" name="centralwidget">
@@ -70,7 +70,7 @@
      <x>0</x>
      <y>0</y>
      <width>900</width>
-     <height>22</height>
+     <height>26</height>
     </rect>
    </property>
    <widget class="QMenu" name="menuFile">
@@ -82,7 +82,7 @@
       <string>Open Recent...</string>
      </property>
      <property name="icon">
-      <iconset resource="../../ldforge.qrc">
+      <iconset resource="../ldforge.qrc">
        <normaloff>:/icons/open-recent.png</normaloff>:/icons/open-recent.png</iconset>
      </property>
     </widget>
@@ -395,6 +395,7 @@
    </attribute>
    <addaction name="actionModeSelect"/>
    <addaction name="actionModeDraw"/>
+   <addaction name="actionModeCircle"/>
   </widget>
   <widget class="QToolBar" name="colorToolbar">
    <property name="windowTitle">
@@ -409,7 +410,7 @@
   </widget>
   <action name="actionNew">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/brick.png</normaloff>:/icons/brick.png</iconset>
    </property>
    <property name="text">
@@ -424,7 +425,7 @@
   </action>
   <action name="actionOpen">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/file-open.png</normaloff>:/icons/file-open.png</iconset>
    </property>
    <property name="text">
@@ -439,7 +440,7 @@
   </action>
   <action name="actionSave">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/file-save.png</normaloff>:/icons/file-save.png</iconset>
    </property>
    <property name="text">
@@ -454,7 +455,7 @@
   </action>
   <action name="actionSaveAs">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/file-save-as.png</normaloff>:/icons/file-save-as.png</iconset>
    </property>
    <property name="text">
@@ -466,7 +467,7 @@
   </action>
   <action name="actionInsertFrom">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/file-import.png</normaloff>:/icons/file-import.png</iconset>
    </property>
    <property name="text">
@@ -475,7 +476,7 @@
   </action>
   <action name="actionExportTo">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/file-export.png</normaloff>:/icons/file-export.png</iconset>
    </property>
    <property name="text">
@@ -484,7 +485,7 @@
   </action>
   <action name="actionSettings">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/settings.png</normaloff>:/icons/settings.png</iconset>
    </property>
    <property name="text">
@@ -499,7 +500,7 @@
   </action>
   <action name="actionSetLDrawPath">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/settings.png</normaloff>:/icons/settings.png</iconset>
    </property>
    <property name="text">
@@ -511,7 +512,7 @@
   </action>
   <action name="actionScanPrimitives">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/radial.png</normaloff>:/icons/radial.png</iconset>
    </property>
    <property name="text">
@@ -523,7 +524,7 @@
   </action>
   <action name="actionExit">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/exit.png</normaloff>:/icons/exit.png</iconset>
    </property>
    <property name="text">
@@ -546,7 +547,7 @@
     <bool>true</bool>
    </property>
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/axes.png</normaloff>:/icons/axes.png</iconset>
    </property>
    <property name="text">
@@ -558,7 +559,7 @@
     <bool>true</bool>
    </property>
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/wireframe.png</normaloff>:/icons/wireframe.png</iconset>
    </property>
    <property name="text">
@@ -570,7 +571,7 @@
     <bool>true</bool>
    </property>
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/bfc-view.png</normaloff>:/icons/bfc-view.png</iconset>
    </property>
    <property name="text">
@@ -579,7 +580,7 @@
   </action>
   <action name="actionSetOverlay">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/overlay.png</normaloff>:/icons/overlay.png</iconset>
    </property>
    <property name="text">
@@ -588,7 +589,7 @@
   </action>
   <action name="actionClearOverlay">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/overlay-clear.png</normaloff>:/icons/overlay-clear.png</iconset>
    </property>
    <property name="text">
@@ -597,7 +598,7 @@
   </action>
   <action name="actionScreenshot">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/screencap.png</normaloff>:/icons/screencap.png</iconset>
    </property>
    <property name="text">
@@ -611,7 +612,7 @@
   </action>
   <action name="actionNewLine">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/add-line.png</normaloff>:/icons/add-line.png</iconset>
    </property>
    <property name="text">
@@ -620,7 +621,7 @@
   </action>
   <action name="actionNewSubfile">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/add-subfile.png</normaloff>:/icons/add-subfile.png</iconset>
    </property>
    <property name="text">
@@ -629,7 +630,7 @@
   </action>
   <action name="actionNewTriangle">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/add-triangle.png</normaloff>:/icons/add-triangle.png</iconset>
    </property>
    <property name="text">
@@ -638,7 +639,7 @@
   </action>
   <action name="actionNewQuad">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/add-quad.png</normaloff>:/icons/add-quad.png</iconset>
    </property>
    <property name="text">
@@ -647,7 +648,7 @@
   </action>
   <action name="actionNewCLine">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/add-condline.png</normaloff>:/icons/add-condline.png</iconset>
    </property>
    <property name="text">
@@ -656,7 +657,7 @@
   </action>
   <action name="actionNewComment">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/add-comment.png</normaloff>:/icons/add-comment.png</iconset>
    </property>
    <property name="text">
@@ -665,7 +666,7 @@
   </action>
   <action name="actionNewBFC">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/add-bfc.png</normaloff>:/icons/add-bfc.png</iconset>
    </property>
    <property name="text">
@@ -674,7 +675,7 @@
   </action>
   <action name="actionNewVertex">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/add-vertex.png</normaloff>:/icons/add-vertex.png</iconset>
    </property>
    <property name="text">
@@ -683,7 +684,7 @@
   </action>
   <action name="actionUndo">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/undo.png</normaloff>:/icons/undo.png</iconset>
    </property>
    <property name="text">
@@ -695,7 +696,7 @@
   </action>
   <action name="actionRedo">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/redo.png</normaloff>:/icons/redo.png</iconset>
    </property>
    <property name="text">
@@ -707,7 +708,7 @@
   </action>
   <action name="actionCut">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/cut.png</normaloff>:/icons/cut.png</iconset>
    </property>
    <property name="text">
@@ -719,7 +720,7 @@
   </action>
   <action name="actionCopy">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/copy.png</normaloff>:/icons/copy.png</iconset>
    </property>
    <property name="text">
@@ -734,7 +735,7 @@
   </action>
   <action name="actionPaste">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/paste.png</normaloff>:/icons/paste.png</iconset>
    </property>
    <property name="text">
@@ -746,7 +747,7 @@
   </action>
   <action name="actionDelete">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/delete.png</normaloff>:/icons/delete.png</iconset>
    </property>
    <property name="text">
@@ -758,7 +759,7 @@
   </action>
   <action name="actionSelectAll">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/select-all.png</normaloff>:/icons/select-all.png</iconset>
    </property>
    <property name="text">
@@ -767,7 +768,7 @@
   </action>
   <action name="actionSelectByColor">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/select-color.png</normaloff>:/icons/select-color.png</iconset>
    </property>
    <property name="text">
@@ -776,7 +777,7 @@
   </action>
   <action name="actionSelectByType">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/select-type.png</normaloff>:/icons/select-type.png</iconset>
    </property>
    <property name="text">
@@ -791,7 +792,7 @@
     <bool>true</bool>
    </property>
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/mode-select.png</normaloff>:/icons/mode-select.png</iconset>
    </property>
    <property name="text">
@@ -803,7 +804,7 @@
     <bool>true</bool>
    </property>
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/mode-draw.png</normaloff>:/icons/mode-draw.png</iconset>
    </property>
    <property name="text">
@@ -817,7 +818,7 @@
   </action>
   <action name="actionSetColor">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/palette.png</normaloff>:/icons/palette.png</iconset>
    </property>
    <property name="text">
@@ -829,7 +830,7 @@
   </action>
   <action name="actionAutocolor">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/autocolor.png</normaloff>:/icons/autocolor.png</iconset>
    </property>
    <property name="text">
@@ -841,7 +842,7 @@
   </action>
   <action name="actionUncolorize">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/uncolorize.png</normaloff>:/icons/uncolorize.png</iconset>
    </property>
    <property name="text">
@@ -853,7 +854,7 @@
   </action>
   <action name="actionInline">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/inline.png</normaloff>:/icons/inline.png</iconset>
    </property>
    <property name="text">
@@ -865,7 +866,7 @@
   </action>
   <action name="actionInlineDeep">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/inline-deep.png</normaloff>:/icons/inline-deep.png</iconset>
    </property>
    <property name="text">
@@ -877,7 +878,7 @@
   </action>
   <action name="actionInvert">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/invert.png</normaloff>:/icons/invert.png</iconset>
    </property>
    <property name="text">
@@ -886,7 +887,7 @@
   </action>
   <action name="actionMakePrimitive">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/radial.png</normaloff>:/icons/radial.png</iconset>
    </property>
    <property name="text">
@@ -895,7 +896,7 @@
   </action>
   <action name="actionSplitQuads">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/quad-split.png</normaloff>:/icons/quad-split.png</iconset>
    </property>
    <property name="text">
@@ -907,7 +908,7 @@
   </action>
   <action name="actionEditRaw">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/set-contents.png</normaloff>:/icons/set-contents.png</iconset>
    </property>
    <property name="text">
@@ -919,7 +920,7 @@
   </action>
   <action name="actionBorders">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/make-borders.png</normaloff>:/icons/make-borders.png</iconset>
    </property>
    <property name="text">
@@ -931,7 +932,7 @@
   </action>
   <action name="actionCornerVerts">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/corner-verts.png</normaloff>:/icons/corner-verts.png</iconset>
    </property>
    <property name="text">
@@ -943,7 +944,7 @@
   </action>
   <action name="actionRoundCoordinates">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/round-coords.png</normaloff>:/icons/round-coords.png</iconset>
    </property>
    <property name="text">
@@ -955,7 +956,7 @@
   </action>
   <action name="actionVisibility">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/visibility.png</normaloff>:/icons/visibility.png</iconset>
    </property>
    <property name="text">
@@ -967,7 +968,7 @@
   </action>
   <action name="actionReplaceCoords">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/replace-coords.png</normaloff>:/icons/replace-coords.png</iconset>
    </property>
    <property name="text">
@@ -979,7 +980,7 @@
   </action>
   <action name="actionFlip">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/flip.png</normaloff>:/icons/flip.png</iconset>
    </property>
    <property name="text">
@@ -999,7 +1000,7 @@
   </action>
   <action name="actionYtruder">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/ytruder.png</normaloff>:/icons/ytruder.png</iconset>
    </property>
    <property name="text">
@@ -1011,7 +1012,7 @@
   </action>
   <action name="actionRectifier">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/rectifier.png</normaloff>:/icons/rectifier.png</iconset>
    </property>
    <property name="text">
@@ -1023,7 +1024,7 @@
   </action>
   <action name="actionIntersector">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/intersector.png</normaloff>:/icons/intersector.png</iconset>
    </property>
    <property name="text">
@@ -1035,7 +1036,7 @@
   </action>
   <action name="actionIsecalc">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/isecalc.png</normaloff>:/icons/isecalc.png</iconset>
    </property>
    <property name="text">
@@ -1047,7 +1048,7 @@
   </action>
   <action name="actionCoverer">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/coverer.png</normaloff>:/icons/coverer.png</iconset>
    </property>
    <property name="text">
@@ -1067,7 +1068,7 @@
     <bool>false</bool>
    </property>
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/help.png</normaloff>:/icons/help.png</iconset>
    </property>
    <property name="text">
@@ -1076,7 +1077,7 @@
   </action>
   <action name="actionAbout">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/ldforge.png</normaloff>:/icons/ldforge.png</iconset>
    </property>
    <property name="text">
@@ -1093,7 +1094,7 @@
     <bool>true</bool>
    </property>
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/grid-coarse.png</normaloff>:/icons/grid-coarse.png</iconset>
    </property>
    <property name="text">
@@ -1108,7 +1109,7 @@
     <bool>true</bool>
    </property>
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/grid-medium.png</normaloff>:/icons/grid-medium.png</iconset>
    </property>
    <property name="text">
@@ -1120,7 +1121,7 @@
     <bool>true</bool>
    </property>
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/grid-fine.png</normaloff>:/icons/grid-fine.png</iconset>
    </property>
    <property name="text">
@@ -1134,7 +1135,7 @@
   </action>
   <action name="actionMoveUp">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/arrow-up.png</normaloff>:/icons/arrow-up.png</iconset>
    </property>
    <property name="text">
@@ -1143,7 +1144,7 @@
   </action>
   <action name="actionMoveDown">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/arrow-down.png</normaloff>:/icons/arrow-down.png</iconset>
    </property>
    <property name="text">
@@ -1152,7 +1153,7 @@
   </action>
   <action name="actionMoveXNeg">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/move-x-neg.png</normaloff>:/icons/move-x-neg.png</iconset>
    </property>
    <property name="text">
@@ -1161,7 +1162,7 @@
   </action>
   <action name="actionMoveXPos">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/move-x-pos.png</normaloff>:/icons/move-x-pos.png</iconset>
    </property>
    <property name="text">
@@ -1170,7 +1171,7 @@
   </action>
   <action name="actionMoveYNeg">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/move-y-neg.png</normaloff>:/icons/move-y-neg.png</iconset>
    </property>
    <property name="text">
@@ -1179,7 +1180,7 @@
   </action>
   <action name="actionMoveYPos">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/move-y-pos.png</normaloff>:/icons/move-y-pos.png</iconset>
    </property>
    <property name="text">
@@ -1188,7 +1189,7 @@
   </action>
   <action name="actionMoveZNeg">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/move-z-neg.png</normaloff>:/icons/move-z-neg.png</iconset>
    </property>
    <property name="text">
@@ -1197,7 +1198,7 @@
   </action>
   <action name="actionMoveZPos">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/move-z-pos.png</normaloff>:/icons/move-z-pos.png</iconset>
    </property>
    <property name="text">
@@ -1256,7 +1257,7 @@
   </action>
   <action name="actionNewFile">
    <property name="icon">
-    <iconset resource="../../ldforge.qrc">
+    <iconset resource="../ldforge.qrc">
      <normaloff>:/icons/file-new.png</normaloff>:/icons/file-new.png</iconset>
    </property>
    <property name="text">
@@ -1278,9 +1279,21 @@
     <string>Go to Line...</string>
    </property>
   </action>
+  <action name="actionModeCircle">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="../ldforge.qrc">
+     <normaloff>:/icons/mode-circle.png</normaloff>:/icons/mode-circle.png</iconset>
+   </property>
+   <property name="text">
+    <string>Circle Mode</string>
+   </property>
+  </action>
  </widget>
  <resources>
-  <include location="../../ldforge.qrc"/>
+  <include location="../ldforge.qrc"/>
  </resources>
  <connections/>
 </ui>

mercurial