1 /*
2 **********************************************************************************
3 **
4 ** This file was created for the LibreCAD project (librecad.org), a 2D CAD program.
5 **
6 ** Copyright (C) 2015 ravas (github.com/r-a-v-a-s)
7 **
8 ** This program is free software; you can redistribute it and/or
9 ** modify it under the terms of the GNU General Public License
10 ** as published by the Free Software Foundation; either version 2
11 ** of the License, or (at your option) any later version.
12 **
13 ** This program is distributed in the hope that it will be useful,
14 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ** GNU General Public License for more details.
17 **
18 ** You should have received a copy of the GNU General Public License
19 ** along with this program; if not, write to the Free Software
20 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 **
22 **********************************************************************************
23 */
24 
25 // This file was first published at: github.com/r-a-v-a-s/LibreCAD.git
26 
27 // lc_actionfactory is a rewrite of qg_actionfactory; some copied content remains.
28 // qg_actionfactory contributors:
29 // Andrew Mustun, Claude Sylvain, R. van Twisk, Dongxu Li, Rallaz, Armin Stebich, ravas, korhadris
30 
31 #include "lc_actionfactory.h"
32 #include "lc_actiongroupmanager.h"
33 #include <QAction>
34 #include <QActionGroup>
35 
LC_ActionFactory(QObject * parent,QObject * a_handler)36 LC_ActionFactory::LC_ActionFactory(QObject* parent, QObject* a_handler)
37     : QObject(parent)
38     , using_theme(false)
39     , main_window(parent)
40     , action_handler(a_handler)
41 {
42 }
43 
fillActionContainer(QMap<QString,QAction * > & a_map,LC_ActionGroupManager * agm)44 void LC_ActionFactory::fillActionContainer(QMap<QString, QAction*>& a_map, LC_ActionGroupManager* agm)
45 {
46     QAction* action;
47 
48     // <[~ Zoom ~]>
49 
50     action = new QAction(tr("Zoom &Panning"), agm->other);
51     action->setIcon(QIcon(":/icons/zoom_pan.svg"));
52     connect(action, SIGNAL(triggered()),
53     action_handler, SLOT(slotZoomPan()));
54     action->setObjectName("ZoomPan");
55     a_map["ZoomPan"] = action;
56 
57     // <[~ Select ~]>
58 
59     action = new QAction(tr("Select Entity"), agm->select);
60     action->setIcon(QIcon(":/icons/select_entity.svg"));
61     connect(action, SIGNAL(triggered()),
62     action_handler, SLOT(slotSelectSingle()));
63     action->setObjectName("SelectSingle");
64     a_map["SelectSingle"] = action;
65 
66     action = new QAction(tr("Select Window"), agm->select);
67     action->setIcon(QIcon(":/icons/select_window.svg"));
68     connect(action, SIGNAL(triggered()),
69     action_handler, SLOT(slotSelectWindow()));
70     action->setObjectName("SelectWindow");
71     a_map["SelectWindow"] = action;
72 
73     action = new QAction(tr("Deselect Window"), agm->select);
74     action->setIcon(QIcon(":/icons/deselect_window.svg"));
75     connect(action, SIGNAL(triggered()),
76     action_handler, SLOT(slotDeselectWindow()));
77     action->setObjectName("DeselectWindow");
78     a_map["DeselectWindow"] = action;
79 
80     action = new QAction(tr("(De-)Select &Contour"), agm->select);
81     action->setIcon(QIcon(":/icons/deselect_contour.svg"));
82     connect(action, SIGNAL(triggered()),
83     action_handler, SLOT(slotSelectContour()));
84     action->setObjectName("SelectContour");
85     a_map["SelectContour"] = action;
86 
87     action = new QAction(tr("Select Intersected Entities"), agm->select);
88     action->setIcon(QIcon(":/icons/select_intersected_entities.svg"));
89     connect(action, SIGNAL(triggered()),
90     action_handler, SLOT(slotSelectIntersected()));
91     action->setObjectName("SelectIntersected");
92     a_map["SelectIntersected"] = action;
93 
94     action = new QAction(tr("Deselect Intersected Entities"), agm->select);
95     action->setIcon(QIcon(":/icons/deselect_intersected_entities.svg"));
96     connect(action, SIGNAL(triggered()),
97     action_handler, SLOT(slotDeselectIntersected()));
98     action->setObjectName("DeselectIntersected");
99     a_map["DeselectIntersected"] = action;
100 
101     action = new QAction(tr("(De-)Select Layer"), agm->select);
102     action->setIcon(QIcon(":/icons/deselect_layer.svg"));
103     connect(action, SIGNAL(triggered()),
104     action_handler, SLOT(slotSelectLayer()));
105     action->setObjectName("SelectLayer");
106     a_map["SelectLayer"] = action;
107 
108     // <[~ Draw ~]>
109 
110     action = new QAction(tr("&Points"), agm->other);
111     action->setIcon(QIcon(":/icons/points.svg"));
112 
113     connect(action, SIGNAL(triggered()),
114     action_handler, SLOT(slotDrawPoint()));
115     action->setObjectName("DrawPoint");
116     a_map["DrawPoint"] = action;
117 
118     // <[~ Line ~]>
119 
120     action = new QAction(tr("&2 Points"), agm->line);
121     action->setIcon(QIcon(":/icons/line_2p.svg"));
122     connect(action, SIGNAL(triggered()),
123     action_handler, SLOT(slotDrawLine()));
124     action->setObjectName("DrawLine");
125     a_map["DrawLine"] = action;
126 
127     action = new QAction(tr("&Angle"), agm->line);
128     action->setIcon(QIcon(":/icons/line_angle.svg"));
129     connect(action, SIGNAL(triggered()),
130     action_handler, SLOT(slotDrawLineAngle()));
131     action->setObjectName("DrawLineAngle");
132     a_map["DrawLineAngle"] = action;
133 
134     action = new QAction(tr("&Horizontal"), agm->line);
135     action->setIcon(QIcon(":/icons/line_horizontal.svg"));
136     connect(action, SIGNAL(triggered()),
137     action_handler, SLOT(slotDrawLineHorizontal()));
138     action->setObjectName("DrawLineHorizontal");
139     a_map["DrawLineHorizontal"] = action;
140 
141     action = new QAction(tr("Vertical"), agm->line);
142     action->setIcon(QIcon(":/icons/line_vertical.svg"));
143     connect(action, SIGNAL(triggered()),
144     action_handler, SLOT(slotDrawLineVertical()));
145     action->setObjectName("DrawLineVertical");
146     a_map["DrawLineVertical"] = action;
147 
148 //    action = new QAction(tr("Vertical"), agm->line);
149 //    connect(action, SIGNAL(triggered()),
150 //    action_handler, SLOT(slotDrawLineHorVert()));
151 //    action->setObjectName("DrawLineHorVert");
152 //    a_map["DrawLineHorVert"] = action;
153 
154     action = new QAction(tr("&Freehand Line"), agm->line);
155     action->setIcon(QIcon(":/icons/line_freehand.svg"));
156     connect(action, SIGNAL(triggered()),
157     action_handler, SLOT(slotDrawLineFree()));
158     action->setObjectName("DrawLineFree");
159     a_map["DrawLineFree"] = action;
160 
161     action = new QAction(tr("&Parallel"), agm->line);
162     action->setIcon(QIcon(":/icons/line_parallel.svg"));
163     connect(action, SIGNAL(triggered()),
164     action_handler, SLOT(slotDrawLineParallel()));
165     action->setObjectName("DrawLineParallel");
166     a_map["DrawLineParallel"] = action;
167 
168     action = new QAction(tr("Parallel through point"), agm->line);
169     action->setIcon(QIcon(":/icons/line_parallel_p.svg"));
170     connect(action, SIGNAL(triggered()),
171     action_handler, SLOT(slotDrawLineParallelThrough()));
172     action->setObjectName("DrawLineParallelThrough");
173     a_map["DrawLineParallelThrough"] = action;
174 
175     action = new QAction(tr("Rectangle"), agm->line);
176     action->setIcon(QIcon(":/icons/line_rectangle.svg"));
177     connect(action, SIGNAL(triggered()),
178     action_handler, SLOT(slotDrawLineRectangle()));
179     action->setObjectName("DrawLineRectangle");
180     a_map["DrawLineRectangle"] = action;
181 
182     action = new QAction(tr("Bisector"), agm->line);
183     action->setIcon(QIcon(":/icons/line_bisector.svg"));
184     connect(action, SIGNAL(triggered()),
185     action_handler, SLOT(slotDrawLineBisector()));
186     action->setObjectName("DrawLineBisector");
187     a_map["DrawLineBisector"] = action;
188 
189     action = new QAction(tr("Tangent (P,C)"), agm->line);
190     action->setIcon(QIcon(":/icons/line_tangent_pc.svg"));
191     connect(action, SIGNAL(triggered()),
192     action_handler, SLOT(slotDrawLineTangent1()));
193     action->setObjectName("DrawLineTangent1");
194     a_map["DrawLineTangent1"] = action;
195 
196     action = new QAction(tr("Tangent (C,C)"), agm->line);
197     action->setIcon(QIcon(":/icons/line_tangent_cc.svg"));
198     connect(action, SIGNAL(triggered()),
199     action_handler, SLOT(slotDrawLineTangent2()));
200     action->setObjectName("DrawLineTangent2");
201     a_map["DrawLineTangent2"] = action;
202 
203     action = new QAction(tr("Tangent &Orthogonal"), agm->line);
204     action->setIcon(QIcon(":/icons/line_tangent_perpendicular.svg"));
205     connect(action, SIGNAL(triggered()),
206     action_handler, SLOT(slotDrawLineOrthTan()));
207     action->setObjectName("DrawLineOrthTan");
208     a_map["DrawLineOrthTan"] = action;
209 
210     action = new QAction(tr("Orthogonal"), agm->line);
211     action->setIcon(QIcon(":/icons/line_perpendicular.svg"));
212     connect(action, SIGNAL(triggered()),
213     action_handler, SLOT(slotDrawLineOrthogonal()));
214     action->setObjectName("DrawLineOrthogonal");
215     a_map["DrawLineOrthogonal"] = action;
216 
217     action = new QAction(tr("Relative angle"), agm->line);
218     action->setIcon(QIcon(":/icons/line_relative_angle.svg"));
219     connect(action, SIGNAL(triggered()),
220     action_handler, SLOT(slotDrawLineRelAngle()));
221     action->setObjectName("DrawLineRelAngle");
222     a_map["DrawLineRelAngle"] = action;
223 
224     action = new QAction(tr("Pol&ygon (Cen,Cor)"), agm->line);
225     action->setIcon(QIcon(":/icons/line_polygon_cen_cor.svg"));
226     connect(action, SIGNAL(triggered()),
227     action_handler, SLOT(slotDrawLinePolygon()));
228     action->setObjectName("DrawLinePolygonCenCor");
229     a_map["DrawLinePolygonCenCor"] = action;
230 
231     action = new QAction(tr("Pol&ygon (Cen,Tan)"), agm->line);  //20161223 added by txmy
232     action->setIcon(QIcon(":/icons/line_polygon_cen_tan.svg"));
233     connect(action, SIGNAL(triggered()),
234     action_handler, SLOT(slotDrawLinePolygon3()));
235     action->setObjectName("DrawLinePolygonCenTan");
236     a_map["DrawLinePolygonCenTan"] = action;
237 
238     action = new QAction(tr("Polygo&n (Cor,Cor)"), agm->line);
239     action->setIcon(QIcon(":/icons/line_polygon_cor_cor.svg"));
240     connect(action, SIGNAL(triggered()),
241     action_handler, SLOT(slotDrawLinePolygon2()));
242     action->setObjectName("DrawLinePolygonCorCor");
243     a_map["DrawLinePolygonCorCor"] = action;
244 
245     // <[~ Circle ~]>
246 
247     action = new QAction(tr("Center, &Point"), agm->circle);
248     action->setIcon(QIcon(":/icons/circle_center_point.svg"));
249     connect(action, SIGNAL(triggered()), action_handler, SLOT(slotDrawCircle()));
250     action->setObjectName("DrawCircle");
251     a_map["DrawCircle"] = action;
252 
253     action = new QAction(tr("Center, &Radius"), agm->circle);
254     action->setIcon(QIcon(":/icons/circle_center_radius.svg"));
255     connect(action, SIGNAL(triggered()),
256     action_handler, SLOT(slotDrawCircleCR()));
257     action->setObjectName("DrawCircleCR");
258     a_map["DrawCircleCR"] = action;
259 
260     action = new QAction(tr("2 Points"), agm->circle);
261     action->setIcon(QIcon(":/icons/circle_2_points.svg"));
262     connect(action, SIGNAL(triggered()),
263     action_handler, SLOT(slotDrawCircle2P()));
264     action->setObjectName("DrawCircle2P");
265     a_map["DrawCircle2P"] = action;
266 
267     action = new QAction(tr("2 Points, Radius"), agm->circle);
268     action->setIcon(QIcon(":/icons/circle_2_points_radius.svg"));
269     connect(action, SIGNAL(triggered()),
270     action_handler, SLOT(slotDrawCircle2PR()));
271     action->setObjectName("DrawCircle2PR");
272     a_map["DrawCircle2PR"] = action;
273 
274     action = new QAction(tr("3 Points"), agm->circle);
275     action->setIcon(QIcon(":/icons/circle_3_points.svg"));
276     connect(action, SIGNAL(triggered()),
277     action_handler, SLOT(slotDrawCircle3P()));
278     action->setObjectName("DrawCircle3P");
279     a_map["DrawCircle3P"] = action;
280 
281     action = new QAction(tr("&Concentric"), agm->circle);
282     action->setIcon(QIcon(":/icons/circle_concentric.svg"));
283     action->setCheckable(true);
284     connect(action, SIGNAL(triggered()),
285     action_handler, SLOT(slotDrawCircleParallel()));
286     action->setObjectName("DrawCircleParallel");
287     a_map["DrawCircleParallel"] = action;
288 
289     action = new QAction(tr("Circle &Inscribed"), agm->circle);
290     action->setIcon(QIcon(":/icons/circle_inscribed.svg"));
291     connect(action, SIGNAL(triggered()),
292     action_handler, SLOT(slotDrawCircleInscribe()));
293     action->setObjectName("DrawCircleInscribe");
294     a_map["DrawCircleInscribe"] = action;
295 
296     action = new QAction(tr("Tangential 2 Circles, Radius",  "circle tangential with two circles, and given radius"), agm->circle);
297     action->setIcon(QIcon(":/icons/circle_tangential_2circles_radius.svg"));
298     connect(action, SIGNAL(triggered()),
299     action_handler, SLOT(slotDrawCircleTan2()));
300     action->setObjectName("DrawCircleTan2");
301     a_map["DrawCircleTan2"] = action;
302 
303     action = new QAction(tr("Tangential 2 Circles, 1 Point"), agm->circle);
304     action->setIcon(QIcon(":/icons/circle_tangential_2circles_point.svg"));
305     connect(action, SIGNAL(triggered()),
306     action_handler, SLOT(slotDrawCircleTan2_1P()));
307     action->setObjectName("DrawCircleTan2_1P");
308     a_map["DrawCircleTan2_1P"] = action;
309 
310     action = new QAction(tr("Tangential &3 Circles"), agm->circle);
311     action->setIcon(QIcon(":/icons/circle_tangential_3entities.svg"));
312     connect(action, SIGNAL(triggered()),
313     action_handler, SLOT(slotDrawCircleTan3()));
314     action->setObjectName("DrawCircleTan3");
315     a_map["DrawCircleTan3"] = action;
316 
317     action = new QAction(tr("Tangential, 2 P&oints"), agm->circle);
318     action->setIcon(QIcon(":/icons/circle_tangential_2points.svg"));
319     connect(action, SIGNAL(triggered()),
320     action_handler, SLOT(slotDrawCircleTan1_2P()));
321     action->setObjectName("DrawCircleTan1_2P");
322     a_map["DrawCircleTan1_2P"] = action;
323 
324     // <[~ Arc ~]>
325 
326     action = new QAction(tr("&Center, Point, Angles"), agm->curve);
327     action->setIcon(QIcon(":/icons/arc_center_point_angle.svg"));
328     action->setCheckable(true);
329     connect(action, SIGNAL(triggered()),
330     action_handler, SLOT(slotDrawArc()));
331     action->setObjectName("DrawArc");
332     a_map["DrawArc"] = action;
333 
334     action = new QAction(tr("&3 Points"), agm->curve);
335     action->setIcon(QIcon(":/icons/arc_3_points.svg"));
336     action->setCheckable(true);
337     connect(action, SIGNAL(triggered()),
338     action_handler, SLOT(slotDrawArc3P()));
339     action->setObjectName("DrawArc3P");
340     a_map["DrawArc3P"] = action;
341 
342     action = new QAction(tr("&Concentric"), agm->curve);
343     action->setIcon(QIcon(":/icons/arc_concentric.svg"));
344     action->setCheckable(true);
345     connect(action, SIGNAL(triggered()),
346     action_handler, SLOT(slotDrawArcParallel()));
347     action->setObjectName("DrawArcParallel");
348     a_map["DrawArcParallel"] = action;
349 
350     action = new QAction(tr("Arc &Tangential"), agm->curve);
351     action->setIcon(QIcon(":/icons/arc_continuation.svg"));
352     action->setCheckable(true);
353     connect(action, SIGNAL(triggered()),
354     action_handler, SLOT(slotDrawArcTangential()));
355     action->setObjectName("DrawArcTangential");
356     a_map["DrawArcTangential"] = action;
357 
358     // <[~ Ellipse ~]>
359 
360     action = new QAction(tr("&Ellipse (Axis)"), agm->ellipse);
361     action->setIcon(QIcon(":/icons/ellipse_axis.svg"));
362     connect(action, SIGNAL(triggered()),
363     action_handler, SLOT(slotDrawEllipseAxis()));
364     action->setObjectName("DrawEllipseAxis");
365     a_map["DrawEllipseAxis"] = action;
366 
367     action = new QAction(tr("Ellipse &Arc (Axis)"), agm->ellipse);
368     action->setIcon(QIcon(":/icons/ellipse_arc_axis.svg"));
369     connect(action, SIGNAL(triggered()),
370     action_handler, SLOT(slotDrawEllipseArcAxis()));
371     action->setObjectName("DrawEllipseArcAxis");
372     a_map["DrawEllipseArcAxis"] = action;
373 
374     action = new QAction(tr("Ellipse &Foci Point"), agm->ellipse);
375     action->setIcon(QIcon(":/icons/ellipse_foci_point.svg"));
376     connect(action, SIGNAL(triggered()),
377     action_handler, SLOT(slotDrawEllipseFociPoint()));
378     action->setObjectName("DrawEllipseFociPoint");
379     a_map["DrawEllipseFociPoint"] = action;
380 
381     action = new QAction(tr("Ellipse &4 Point"), agm->ellipse);
382     action->setIcon(QIcon(":/icons/ellipse_4_points.svg"));
383     connect(action, SIGNAL(triggered()),
384     action_handler, SLOT(slotDrawEllipse4Points()));
385     action->setObjectName("DrawEllipse4Points");
386     a_map["DrawEllipse4Points"] = action;
387 
388     action = new QAction(tr("Ellipse Center and &3 Points"), agm->ellipse);
389     action->setIcon(QIcon(":/icons/ellipse_center_3_points.svg"));
390     connect(action, SIGNAL(triggered()),
391     action_handler, SLOT(slotDrawEllipseCenter3Points()));
392     action->setObjectName("DrawEllipseCenter3Points");
393     a_map["DrawEllipseCenter3Points"] = action;
394 
395     action = new QAction(tr("Ellipse &Inscribed"), agm->ellipse);
396     action->setIcon(QIcon(":/icons/ellipse_inscribed.svg"));
397     connect(action, SIGNAL(triggered()),
398     action_handler, SLOT(slotDrawEllipseInscribe()));
399     action->setObjectName("DrawEllipseInscribe");
400     a_map["DrawEllipseInscribe"] = action;
401 
402     // <[~ Spline ~]>
403 
404     action = new QAction(tr("&Spline"), agm->curve);
405     action->setIcon(QIcon(":/icons/spline.svg"));
406     connect(action, SIGNAL(triggered()),
407     action_handler, SLOT(slotDrawSpline()));
408     action->setObjectName("DrawSpline");
409     a_map["DrawSpline"] = action;
410 
411     action = new QAction(tr("&Spline through points"), agm->curve);
412     action->setIcon(QIcon(":/icons/spline_points.svg"));
413     connect(action, SIGNAL(triggered()),
414     action_handler, SLOT(slotDrawSplinePoints()));
415     action->setObjectName("DrawSplinePoints");
416     a_map["DrawSplinePoints"] = action;
417 
418     // <[~ Polyline ~]>
419 
420     action = new QAction(tr("&Polyline"), agm->polyline);
421     action->setIcon(QIcon(":/icons/polylines_polyline.svg"));
422     connect(action, SIGNAL(triggered()),
423     action_handler, SLOT(slotDrawPolyline()));
424     action->setObjectName("DrawPolyline");
425     a_map["DrawPolyline"] = action;
426 
427     action = new QAction(tr("&Add node"), agm->polyline);
428     action->setShortcut(QKeySequence());
429     action->setIcon(QIcon(":/icons/insert_node.svg"));
430     connect(action, SIGNAL(triggered()),
431     action_handler, SLOT(slotPolylineAdd()));
432     action->setObjectName("PolylineAdd");
433     a_map["PolylineAdd"] = action;
434 
435     action = new QAction(tr("A&ppend node"), agm->polyline);
436     action->setShortcut(QKeySequence());
437     action->setIcon(QIcon(":/icons/append_node.svg"));
438     connect(action, SIGNAL(triggered()),
439     action_handler, SLOT(slotPolylineAppend()));
440     action->setObjectName("PolylineAppend");
441     a_map["PolylineAppend"] = action;
442 
443     action = new QAction(tr("&Delete node"), agm->polyline);
444     action->setShortcut(QKeySequence());
445     action->setIcon(QIcon(":/icons/delete_node.svg"));
446     connect(action, SIGNAL(triggered()),
447     action_handler, SLOT(slotPolylineDel()));
448     action->setObjectName("PolylineDel");
449     a_map["PolylineDel"] = action;
450 
451     action = new QAction(tr("Delete &between two nodes"), agm->polyline);
452     action->setShortcut(QKeySequence());
453     action->setIcon(QIcon(":/icons/delete_between_nodes.svg"));
454     connect(action, SIGNAL(triggered()),
455     action_handler, SLOT(slotPolylineDelBetween()));
456     action->setObjectName("PolylineDelBetween");
457     a_map["PolylineDelBetween"] = action;
458 
459     action = new QAction(tr("&Trim segments"), agm->polyline);
460     action->setShortcut(QKeySequence());
461     action->setIcon(QIcon(":/icons/trim.svg"));
462     connect(action, SIGNAL(triggered()),
463     action_handler, SLOT(slotPolylineTrim()));
464     action->setObjectName("PolylineTrim");
465     a_map["PolylineTrim"] = action;
466 
467     action = new QAction(tr("Create &Equidistant Polylines"), agm->polyline);
468     action->setIcon(QIcon(":/icons/create_equidistant_polyline.svg"));
469     connect(action, SIGNAL(triggered()),
470     action_handler, SLOT(slotPolylineEquidistant()));
471     action->setObjectName("PolylineEquidistant");
472     a_map["PolylineEquidistant"] = action;
473 
474     action = new QAction(tr("Create Polyline from Existing &Segments"), agm->polyline);
475     action->setIcon(QIcon(":/icons/create_polyline_from_existing_segments.svg"));
476     connect(action, SIGNAL(triggered()),
477     action_handler, SLOT(slotPolylineSegment()));
478     action->setObjectName("PolylineSegment");
479     a_map["PolylineSegment"] = action;
480 
481     // <[~ Misc ~]>
482 
483     action = new QAction(QIcon(":/icons/text.svg"), tr("&MText"), agm->other);
484     connect(action, SIGNAL(triggered()),
485     action_handler, SLOT(slotDrawMText()));
486     action->setObjectName("DrawMText");
487     a_map["DrawMText"] = action;
488 
489     action = new QAction(tr("&Text"), agm->other);
490     action->setIcon(QIcon(":/icons/text.svg"));
491     connect(action, SIGNAL(triggered()),
492     action_handler, SLOT(slotDrawText()));
493     action->setObjectName("DrawText");
494     a_map["DrawText"] = action;
495 
496     action = new QAction(tr("&Hatch"), agm->other);
497     action->setIcon(QIcon(":/icons/hatch.svg"));
498     connect(action, SIGNAL(triggered()),
499     action_handler, SLOT(slotDrawHatch()));
500     action->setObjectName("DrawHatch");
501     a_map["DrawHatch"] = action;
502 
503     action = new QAction(tr("Insert &Image"), agm->other);
504     action->setIcon(QIcon(":/icons/camera.svg"));
505     connect(action, SIGNAL(triggered()),
506     action_handler, SLOT(slotDrawImage()));
507     action->setObjectName("DrawImage");
508     a_map["DrawImage"] = action;
509 
510     // <[~ Dimension ~]>
511 
512     action = new QAction(tr("&Aligned"), agm->dimension);
513     action->setIcon(QIcon(":/icons/dim_aligned.svg"));
514     connect(action, SIGNAL(triggered()),
515     action_handler, SLOT(slotDimAligned()));
516     action->setObjectName("DimAligned");
517     a_map["DimAligned"] = action;
518 
519     action = new QAction(tr("&Linear"), agm->dimension);
520     action->setIcon(QIcon(":/icons/dim_linear.svg"));
521     connect(action, SIGNAL(triggered()),
522     action_handler, SLOT(slotDimLinear()));
523     action->setObjectName("DimLinear");
524     a_map["DimLinear"] = action;
525 
526     action = new QAction(tr("&Horizontal"), agm->dimension);
527     action->setIcon(QIcon(":/icons/dim_horizontal.svg"));
528     connect(action, SIGNAL(triggered()),
529     action_handler, SLOT(slotDimLinearHor()));
530     action->setObjectName("DimLinearHor");
531     a_map["DimLinearHor"] = action;
532 
533     action = new QAction(tr("&Vertical"), agm->dimension);
534     action->setIcon(QIcon(":/icons/dim_vertical.svg"));
535     connect(action, SIGNAL(triggered()),
536     action_handler, SLOT(slotDimLinearVer()));
537     action->setObjectName("DimLinearVer");
538     a_map["DimLinearVer"] = action;
539 
540     action = new QAction(tr("&Radial"), agm->dimension);
541     action->setIcon(QIcon(":/icons/dim_radial.svg"));
542     connect(action, SIGNAL(triggered()),
543     action_handler, SLOT(slotDimRadial()));
544     action->setObjectName("DimRadial");
545     a_map["DimRadial"] = action;
546 
547     action = new QAction(tr("&Diametric"), agm->dimension);
548     action->setIcon(QIcon(":/icons/dim_diametric.svg"));
549     connect(action, SIGNAL(triggered()),
550     action_handler, SLOT(slotDimDiametric()));
551     action->setObjectName("DimDiametric");
552     a_map["DimDiametric"] = action;
553 
554     action = new QAction(tr("&Angular"), agm->dimension);
555     action->setIcon(QIcon(":/icons/dim_angular.svg"));
556     connect(action, SIGNAL(triggered()),
557     action_handler, SLOT(slotDimAngular()));
558     action->setObjectName("DimAngular");
559     a_map["DimAngular"] = action;
560 
561     action = new QAction(tr("&Leader"), agm->dimension);
562     action->setIcon(QIcon(":/icons/dim_leader.svg"));
563     connect(action, SIGNAL(triggered()),
564     action_handler, SLOT(slotDimLeader()));
565     action->setObjectName("DimLeader");
566     a_map["DimLeader"] = action;
567 
568     // <[~ Modify ~]>
569 
570     action = new QAction(tr("&Attributes"), agm->modify);
571     action->setIcon(QIcon(":/icons/attributes.svg"));
572     connect(action, SIGNAL(triggered()),
573     action_handler, SLOT(slotModifyAttributes()));
574     action->setObjectName("ModifyAttributes");
575     action->setData("modifyattr, attr, ma");
576     a_map["ModifyAttributes"] = action;
577 
578     action = new QAction(tr("&Delete"), agm->modify);
579     action->setIcon(QIcon(":/icons/delete.svg"));
580     connect(action, SIGNAL(triggered()),
581     action_handler, SLOT(slotModifyDelete()));
582     action->setObjectName("ModifyDelete");
583     a_map["ModifyDelete"] = action;
584 
585     action = new QAction(tr("Delete Freehand"), agm->modify);
586     connect(action, SIGNAL(triggered()),
587     action_handler, SLOT(slotModifyDeleteFree()));
588     action->setObjectName("ModifyDeleteFree");
589     a_map["ModifyDeleteFree"] = action;
590 
591     action = new QAction(tr("&Move / Copy"), agm->modify);
592     action->setIcon(QIcon(":/icons/move_copy.svg"));
593     connect(action, SIGNAL(triggered()),
594     action_handler, SLOT(slotModifyMove()));
595     action->setObjectName("ModifyMove");
596     action->setData("move, mv");
597     a_map["ModifyMove"] = action;
598 
599     action = new QAction(tr("Re&vert direction"), agm->modify);
600     action->setIcon(QIcon(":/icons/revert_direction.svg"));
601     action->setShortcut(QKeySequence(tr("Ctrl+R")));
602     connect(action, SIGNAL(triggered()), action_handler, SLOT(slotModifyRevertDirection()));
603     action->setObjectName("ModifyRevertDirection");
604     action->setData("revert, rev");
605     a_map["ModifyRevertDirection"] = action;
606 
607     action = new QAction(tr("&Rotate"), agm->modify);
608     action->setIcon(QIcon(":/icons/rotate.svg"));
609     connect(action, SIGNAL(triggered()),
610     action_handler, SLOT(slotModifyRotate()));
611     action->setObjectName("ModifyRotate");
612     action->setData("rotate, ro");
613     a_map["ModifyRotate"] = action;
614 
615     action = new QAction(tr("&Scale"), agm->modify);
616     action->setIcon(QIcon(":/icons/scale.svg"));
617     connect(action, SIGNAL(triggered()),
618     action_handler, SLOT(slotModifyScale()));
619     action->setObjectName("ModifyScale");
620     action->setData("scale, sz");
621     a_map["ModifyScale"] = action;
622 
623     action = new QAction(tr("&Mirror"), agm->modify);
624     action->setIcon(QIcon(":/icons/mirror.svg"));
625     connect(action, SIGNAL(triggered()),
626     action_handler, SLOT(slotModifyMirror()));
627     action->setObjectName("ModifyMirror");
628     action->setData("mirror, mi");
629     a_map["ModifyMirror"] = action;
630 
631     action = new QAction(tr("Mo&ve and Rotate"), agm->modify);
632     action->setIcon(QIcon(":/icons/move_rotate.svg"));
633     connect(action, SIGNAL(triggered()),
634     action_handler, SLOT(slotModifyMoveRotate()));
635     action->setObjectName("ModifyMoveRotate");
636     a_map["ModifyMoveRotate"] = action;
637 
638     action = new QAction(tr("Rotate T&wo"), agm->modify);
639     action->setIcon(QIcon(":/icons/rotate2.svg"));
640     connect(action, SIGNAL(triggered()),
641     action_handler, SLOT(slotModifyRotate2()));
642     action->setObjectName("ModifyRotate2");
643     a_map["ModifyRotate2"] = action;
644 
645     action = new QAction(tr("&Properties"), agm->modify);
646     action->setIcon(QIcon(":/icons/properties.svg"));
647     connect(action, SIGNAL(triggered()),
648     action_handler, SLOT(slotModifyEntity()));
649     action->setObjectName("ModifyEntity");
650     action->setData("properties, prop");
651     a_map["ModifyEntity"] = action;
652 
653     action = new QAction(tr("&Trim"), agm->modify);
654     action->setIcon(QIcon(":/icons/trim.svg"));
655     connect(action, SIGNAL(triggered()),
656     action_handler, SLOT(slotModifyTrim()));
657     action->setObjectName("ModifyTrim");
658     action->setData("trim, tm");
659     a_map["ModifyTrim"] = action;
660 
661     action = new QAction(tr("Tr&im Two"), agm->modify);
662     action->setIcon(QIcon(":/icons/trim2.svg"));
663     connect(action, SIGNAL(triggered()),
664     action_handler, SLOT(slotModifyTrim2()));
665     action->setObjectName("ModifyTrim2");
666     action->setData("trim2, tm2");
667     a_map["ModifyTrim2"] = action;
668 
669     action = new QAction(tr("&Lengthen"), agm->modify);
670     action->setIcon(QIcon(":/icons/trim_value.svg"));
671     connect(action, SIGNAL(triggered()),
672     action_handler, SLOT(slotModifyTrimAmount()));
673     action->setObjectName("ModifyTrimAmount");
674     action->setData("lengthen, le");
675     a_map["ModifyTrimAmount"] = action;
676 
677     action = new QAction(tr("O&ffset"),agm->modify);
678     action->setIcon(QIcon(":/icons/offset.svg"));
679     connect(action, SIGNAL(triggered()),
680     action_handler, SLOT(slotModifyOffset()));
681     action->setObjectName("ModifyOffset");
682     action->setData("offset, o");
683     a_map["ModifyOffset"] = action;
684 
685     action = new QAction(tr("&Divide"), agm->modify);
686     action->setIcon(QIcon(":/icons/divide.svg"));
687     connect(action, SIGNAL(triggered()),
688     action_handler, SLOT(slotModifyCut()));
689     action->setObjectName("ModifyCut");
690     action->setData("divide, cut, div");
691     a_map["ModifyCut"] = action;
692 
693     action = new QAction(tr("&Stretch"), agm->modify);
694     action->setIcon(QIcon(":/icons/stretch.svg"));
695     connect(action, SIGNAL(triggered()),
696     action_handler, SLOT(slotModifyStretch()));
697     action->setObjectName("ModifyStretch");
698     action->setData("stretch, ss");
699     a_map["ModifyStretch"] = action;
700 
701     action = new QAction(tr("&Bevel"), agm->modify);
702     action->setIcon(QIcon(":/icons/bevel.svg"));
703     connect(action, SIGNAL(triggered()),
704     action_handler, SLOT(slotModifyBevel()));
705     action->setObjectName("ModifyBevel");
706     action->setData("bevel, bev, ch");
707     a_map["ModifyBevel"] = action;
708 
709     action = new QAction(tr("&Fillet"), agm->modify);
710     action->setIcon(QIcon(":/icons/fillet.svg"));
711     connect(action, SIGNAL(triggered()),
712     action_handler, SLOT(slotModifyRound()));
713     action->setObjectName("ModifyRound");
714     action->setData("fillet, fi");
715     a_map["ModifyRound"] = action;
716 
717     action = new QAction(tr("&Explode Text into Letters"), agm->modify);
718     action->setIcon(QIcon(":/icons/explode_text_to_letters.svg"));
719     connect(action, SIGNAL(triggered()),
720     action_handler, SLOT(slotModifyExplodeText()));
721     action->setObjectName("ModifyExplodeText");
722     a_map["ModifyExplodeText"] = action;
723 
724     action = new QAction(tr("Ex&plode"), agm->modify);
725     action->setIcon(QIcon(":/icons/explode.svg"));
726     connect(action, SIGNAL(triggered()),
727     action_handler, SLOT(slotBlocksExplode()));
728     action->setObjectName("BlocksExplode");
729     a_map["BlocksExplode"] = action;
730 
731     // <[~ Info ~]>
732 
733     action = new QAction(tr("Point inside contour"), agm->info);
734     connect(action, SIGNAL(triggered()),
735     action_handler, SLOT(slotInfoInside()));
736     action->setObjectName("InfoInside");
737     a_map["InfoInside"] = action;
738 
739     action = new QAction(tr("&Distance Point to Point"), agm->info);
740     action->setIcon(QIcon(":/icons/distance_point_to_point.svg"));
741     connect(action, SIGNAL(triggered()),
742     action_handler, SLOT(slotInfoDist()));
743     action->setObjectName("InfoDist");
744     a_map["InfoDist"] = action;
745 
746     action = new QAction(tr("&Distance Entity to Point"), agm->info);
747     action->setIcon(QIcon(":/icons/distance_point_to_entity.svg"));
748     connect(action, SIGNAL(triggered()),
749     action_handler, SLOT(slotInfoDist2()));
750     action->setObjectName("InfoDist2");
751     a_map["InfoDist2"] = action;
752 
753     action = new QAction(tr("An&gle between two lines"), agm->info);
754     action->setIcon(QIcon(":/icons/angle_line_to_line.svg"));
755     connect(action, SIGNAL(triggered()),
756     action_handler, SLOT(slotInfoAngle()));
757     action->setObjectName("InfoAngle");
758     a_map["InfoAngle"] = action;
759 
760     action = new QAction(tr("&Total length of selected entities"), agm->info);
761     action->setIcon(QIcon(":/icons/total_length_selected_entities.svg"));
762     connect(action, SIGNAL(triggered()),
763     action_handler, SLOT(slotInfoTotalLength()));
764     action->setObjectName("InfoTotalLength");
765     a_map["InfoTotalLength"] = action;
766 
767     action = new QAction(tr("Polygonal &Area"), agm->info);
768     action->setIcon(QIcon(":/icons/polygonal_area.svg"));
769     connect(action, SIGNAL(triggered()),
770     action_handler, SLOT(slotInfoArea()));
771     action->setObjectName("InfoArea");
772     a_map["InfoArea"] = action;
773 
774     foreach (QAction* value, a_map)
775     {
776         value->setCheckable(true);
777     }
778 
779     // =============================
780     // <[~ not checkable actions ~]>
781     // =============================
782 
783 
784     // <[~ Order ~]>
785 
786     action = new QAction(tr("move to bottom"), agm->modify);
787     action->setShortcut(QKeySequence(Qt::Key_End));
788     action->setIcon(QIcon(":/icons/downmost.svg"));
789     connect(action, SIGNAL(triggered()),
790     action_handler, SLOT(slotOrderBottom()));
791     action->setObjectName("OrderBottom");
792     a_map["OrderBottom"] = action;
793 
794     action = new QAction(tr("lower after entity"), agm->modify);
795     action->setShortcut(QKeySequence(Qt::Key_PageDown));
796     action->setIcon(QIcon(":/icons/down.svg"));
797     connect(action, SIGNAL(triggered()),
798     action_handler, SLOT(slotOrderLower()));
799     action->setObjectName("OrderLower");
800     a_map["OrderLower"] = action;
801 
802     action = new QAction(tr("raise over entity"), agm->modify);
803     action->setShortcut(QKeySequence(Qt::Key_PageUp));
804     action->setIcon(QIcon(":/icons/up.svg"));
805     connect(action, SIGNAL(triggered()),
806     action_handler, SLOT(slotOrderRaise()));
807     action->setObjectName("OrderRaise");
808     a_map["OrderRaise"] = action;
809 
810     action = new QAction(tr("move to top"), agm->modify);
811     action->setShortcut(QKeySequence(Qt::Key_Home));
812     action->setIcon(QIcon(":/icons/upmost.svg"));
813     connect(action, SIGNAL(triggered()),
814     action_handler, SLOT(slotOrderTop()));
815     action->setObjectName("OrderTop");
816     a_map["OrderTop"] = action;
817 
818     // <[~ Layer ~]>
819 
820     action = new QAction(tr("&Show all"), agm->layer);
821     action->setIcon(QIcon(":/ui/visibleblock.png"));
822     connect(action, SIGNAL(triggered()),
823             action_handler, SLOT(slotLayersDefreezeAll()));
824     action->setObjectName("LayersDefreezeAll");
825     a_map["LayersDefreezeAll"] = action;
826 
827     action = new QAction(tr("&Hide all"), agm->layer);
828     action->setIcon(QIcon(":/ui/hiddenblock.png"));
829     connect(action, SIGNAL(triggered()),
830     action_handler, SLOT(slotLayersFreezeAll()));
831     action->setObjectName("LayersFreezeAll");
832     a_map["LayersFreezeAll"] = action;
833 
834     action = new QAction(tr("&Unlock all"), agm->layer);
835     action->setIcon(QIcon(":/ui/unlockedlayer.png"));
836     connect(action, SIGNAL(triggered()),
837             action_handler, SLOT(slotLayersUnlockAll()));
838     action->setObjectName("LayersUnlockAll");
839     a_map["LayersUnlockAll"] = action;
840 
841     action = new QAction(tr("&Lock all"), agm->layer);
842     action->setIcon(QIcon(":/ui/lockedlayer.png"));
843     connect(action, SIGNAL(triggered()),
844     action_handler, SLOT(slotLayersLockAll()));
845     action->setObjectName("LayersLockAll");
846     a_map["LayersLockAll"] = action;
847 
848     action = new QAction(tr("&Add Layer"), agm->layer);
849     action->setIcon(QIcon(":/icons/add.svg"));
850     connect(action, SIGNAL(triggered()),
851     action_handler, SLOT(slotLayersAdd()));
852     action->setObjectName("LayersAdd");
853     a_map["LayersAdd"] = action;
854 
855     action = new QAction(tr("&Remove Layer"), agm->layer);
856     action->setIcon(QIcon(":/icons/remove.svg"));
857     connect(action, SIGNAL(triggered()),
858     action_handler, SLOT(slotLayersRemove()));
859     action->setObjectName("LayersRemove");
860     a_map["LayersRemove"] = action;
861 
862     action = new QAction(tr("&Edit Layer"), agm->layer);
863     action->setIcon(QIcon(":/icons/attributes.svg"));
864     connect(action, SIGNAL(triggered()),
865     action_handler, SLOT(slotLayersEdit()));
866     action->setObjectName("LayersEdit");
867     a_map["LayersEdit"] = action;
868 
869     action = new QAction(tr("Toggle Layer Loc&k"), agm->layer);
870     action->setIcon(QIcon(":/icons/locked.svg"));
871     connect(action, SIGNAL(triggered()),
872     action_handler, SLOT(slotLayersToggleLock()));
873     action->setObjectName("LayersToggleLock");
874     a_map["LayersToggleLock"] = action;
875 
876     action = new QAction(tr("&Toggle Layer Visibility"), agm->layer);
877     action->setIcon(QIcon(":/icons/visible.svg"));
878     connect(action, SIGNAL(triggered()),
879     action_handler, SLOT(slotLayersToggleView()));
880     action->setObjectName("LayersToggleView");
881     a_map["LayersToggleView"] = action;
882 
883     action = new QAction(tr("Toggle Layer &Print"), agm->layer);
884     action->setIcon(QIcon(":/icons/print.svg"));
885     connect(action, SIGNAL(triggered()), action_handler,
886             SLOT(slotLayersTogglePrint()));
887     action->setObjectName("LayersTogglePrint");
888     a_map["LayersTogglePrint"] = action;
889 
890     action = new QAction(tr("Toggle &Construction Layer"), agm->layer);
891     action->setIcon(QIcon(":/icons/construction_layer.svg"));
892     connect(action, SIGNAL(triggered()),
893             action_handler, SLOT(slotLayersToggleConstruction()));
894     action->setObjectName("LayersToggleConstruction");
895     a_map["LayersToggleConstruction"] = action;
896 
897     // <[~ Block ~]>
898 
899     action = new QAction(tr("&Show all"), agm->block);
900     action->setIcon(QIcon(":/ui/blockdefreeze.png"));
901     connect(action, SIGNAL(triggered()),
902     action_handler, SLOT(slotBlocksDefreezeAll()));
903     action->setObjectName("BlocksDefreezeAll");
904     a_map["BlocksDefreezeAll"] = action;
905 
906     action= new QAction(tr("&Hide all"), agm->block);
907     action->setIcon(QIcon(":/ui/blockfreeze.png"));
908     connect(action, SIGNAL(triggered()),
909     action_handler, SLOT(slotBlocksFreezeAll()));
910     action->setObjectName("BlocksFreezeAll");
911     a_map["BlocksFreezeAll"] = action;
912 
913     action = new QAction(tr("&Add Block"), agm->block);
914     action->setIcon(QIcon(":/icons/add.svg"));
915     connect(action, SIGNAL(triggered()),
916     action_handler, SLOT(slotBlocksAdd()));
917     action->setObjectName("BlocksAdd");
918     a_map["BlocksAdd"] = action;
919 
920     action = new QAction(tr("&Remove Block"), agm->block);
921     action->setIcon(QIcon(":/icons/remove.svg"));
922     connect(action, SIGNAL(triggered()),
923     action_handler, SLOT(slotBlocksRemove()));
924     action->setObjectName("BlocksRemove");
925     a_map["BlocksRemove"] = action;
926 
927     action = new QAction(tr("&Rename Block"), agm->block);
928     action->setIcon(QIcon(":/icons/rename_active_block.svg"));
929     connect(action, SIGNAL(triggered()),
930     action_handler, SLOT(slotBlocksAttributes()));
931     action->setObjectName("BlocksAttributes");
932     a_map["BlocksAttributes"] = action;
933 
934     action = new QAction(tr("&Edit Block"), agm->block);
935     action->setIcon(QIcon(":/icons/properties.svg"));
936     connect(action, SIGNAL(triggered()),
937     action_handler, SLOT(slotBlocksEdit()));
938     action->setObjectName("BlocksEdit");
939     a_map["BlocksEdit"] = action;
940 
941     action = new QAction( tr("&Save Block"), agm->block);
942     action->setIcon(QIcon(":/icons/save.svg"));
943     connect(action, SIGNAL(triggered()),
944     action_handler, SLOT(slotBlocksSave()));
945     action->setObjectName("BlocksSave");
946     a_map["BlocksSave"] = action;
947 
948     action = new QAction(tr("&Insert Block"), agm->block);
949     action->setIcon(QIcon(":/icons/insert_active_block.svg"));
950     connect(action, SIGNAL(triggered()),
951     action_handler, SLOT(slotBlocksInsert()));
952     action->setObjectName("BlocksInsert");
953     a_map["BlocksInsert"] = action;
954 
955     action = new QAction(tr("Toggle Block &Visibility"), agm->block);
956     action->setIcon(QIcon(":/ui/layertoggle.png"));
957     connect(action, SIGNAL(triggered()),
958     action_handler, SLOT(slotBlocksToggleView()));
959     action->setObjectName("BlocksToggleView");
960     a_map["BlocksToggleView"] = action;
961 
962     action = new QAction(tr("&Create Block"), agm->block);
963     action->setIcon(QIcon(":/icons/create_block.svg"));
964     connect(action, SIGNAL(triggered()),
965     action_handler, SLOT(slotBlocksCreate()));
966     action->setObjectName("BlocksCreate");
967     a_map["BlocksCreate"] = action;
968 
969     // <[~ Options ~]>
970 
971     action = new QAction(tr("&Application Preferences"), agm->options);
972     action->setIcon(QIcon(":/icons/settings.svg"));
973     connect(action, SIGNAL(triggered()),
974     main_window, SLOT(slotOptionsGeneral()));
975     action->setMenuRole(QAction::NoRole);
976     action->setObjectName("OptionsGeneral");
977     a_map["OptionsGeneral"] = action;
978 
979     action = new QAction(tr("Current &Drawing Preferences"), agm->options);
980     action->setIcon(QIcon(":/icons/drawing_settings.svg"));
981     action->setShortcut(QKeySequence::Preferences);
982     connect(action, SIGNAL(triggered()),
983     action_handler, SLOT(slotOptionsDrawing()));
984     action->setObjectName("OptionsDrawing");
985     a_map["OptionsDrawing"] = action;
986 
987     action = new QAction(tr("Widget Options"), agm->options);
988     action->setObjectName("WidgetOptions");
989     a_map["WidgetOptions"] = action;
990     connect(action, SIGNAL(triggered()),
991             main_window, SLOT(widgetOptionsDialog()));
992 
993     action = new QAction(tr("Device Options"), agm->options);
994     action->setObjectName("DeviceOptions");
995     a_map["DeviceOptions"] = action;
996     connect(action, SIGNAL(triggered()),
997             main_window, SLOT(showDeviceOptions()));
998 
999     // <[~ Modify ~]>
1000 
1001     action = new QAction(tr("&Delete selected"), agm->edit);
1002     action->setIcon(QIcon(":/icons/delete.svg"));
1003     action->setShortcuts(QList<QKeySequence>() << QKeySequence::Delete << QKeySequence(Qt::Key_Backspace));
1004     connect(action, SIGNAL(triggered()),
1005     action_handler, SLOT(slotModifyDeleteQuick()));
1006     action->setObjectName("ModifyDeleteQuick");
1007     a_map["ModifyDeleteQuick"] = action;
1008 
1009     action = new QAction(tr("Select &All"), agm->select);
1010     action->setShortcut(QKeySequence::SelectAll);
1011     action->setIcon(QIcon(":/icons/select_all.svg"));
1012     connect(action, SIGNAL(triggered()),
1013     action_handler, SLOT(slotSelectAll()));
1014     action->setObjectName("SelectAll");
1015     a_map["SelectAll"] = action;
1016 
1017     // <[~ Select ~]>
1018 
1019     action = new QAction(tr("Deselect &all"), agm->select);
1020     // RVT April 29, 2011 - Added esc key to de-select all entities
1021     action->setShortcuts(QList<QKeySequence>() << QKeySequence(tr("Ctrl+K")));
1022     action->setIcon(QIcon(":/icons/deselect_all.svg"));
1023     connect(action, SIGNAL(triggered()),
1024     action_handler, SLOT(slotDeselectAll()));
1025     action->setObjectName("DeselectAll");
1026     a_map["DeselectAll"] = action;
1027 
1028     action = new QAction(tr("Invert Selection"), agm->select);
1029     action->setIcon(QIcon(":/icons/select_inverted.svg"));
1030     connect(action, SIGNAL(triggered()),
1031     action_handler, SLOT(slotSelectInvert()));
1032     action->setObjectName("SelectInvert");
1033     a_map["SelectInvert"] = action;
1034 
1035     // <[~ Misc ~]>
1036 
1037     action = new QAction(tr("Export as CA&M/plain SVG..."), agm->file);
1038     connect(action, SIGNAL(triggered()), action_handler, SLOT(slotFileExportMakerCam()));
1039     action->setObjectName("FileExportMakerCam");
1040     a_map["FileExportMakerCam"] = action;
1041 
1042 //    action = new QAction(tr("Regenerate Dimension Entities"), disable_group);
1043 //    connect(action, SIGNAL(triggered()), action_handler, SLOT(slotToolRegenerateDimensions()));
1044 //    action->setObjectName("ToolRegenerateDimensions");
1045 //    a_map["ToolRegenerateDimensions"] = action;
1046 
1047 
1048     // ===========================
1049     // <[~ Main Window Actions ~]>
1050     // ===========================
1051 
1052 
1053     action = new QAction(tr("&Export as image"), agm->file);
1054     action->setIcon(QIcon(":/icons/export.svg"));
1055     connect(action, SIGNAL( triggered()), main_window, SLOT(slotFileExport()));
1056     action->setObjectName("FileExport");
1057     a_map["FileExport"] = action;
1058 
1059     action = new QAction(tr("&Close"), agm->file);
1060     action->setIcon(QIcon(":/icons/close.svg"));
1061     action->setShortcut(QKeySequence::Close);
1062     action->setShortcutContext(Qt::WidgetShortcut);
1063     action->setObjectName("FileClose");
1064     a_map["FileClose"] = action;
1065 
1066 	action = new QAction(tr("Close All"), agm->file);
1067 	action->setIcon(QIcon(":/icons/close_all.svg"));
1068 	QKeySequence shortcut = QKeySequence::Close;
1069 	action->setShortcut(QKeySequence("Shift+" + shortcut.toString()));
1070 	connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileCloseAll()));
1071 	action->setObjectName("FileCloseAll");
1072 	a_map["FileCloseAll"] = action;
1073 
1074     action = new QAction(tr("Export as PDF"), agm->file);
1075     action->setIcon(QIcon(":/icons/export_pdf.svg"));
1076     connect(action, SIGNAL(triggered()), main_window, SLOT(slotFilePrintPDF()));
1077     action->setObjectName("FilePrintPDF");
1078     a_map["FilePrintPDF"] = action;
1079 
1080     action = new QAction(tr("&Block"), agm->file);
1081     action->setIcon(QIcon(":/icons/insert_active_block.svg"));
1082     connect(action, SIGNAL(triggered()), main_window, SLOT(slotImportBlock()));
1083     action->setObjectName("BlocksImport");
1084     a_map["BlocksImport"] = action;
1085 
1086     // <[~ View ~]>
1087 
1088     action = new QAction(tr("&Fullscreen"), agm->view);
1089     #if defined(Q_OS_LINUX)
1090         action->setShortcut(QKeySequence("F11"));
1091     #else
1092         action->setShortcut(QKeySequence::FullScreen);
1093     #endif
1094     action->setCheckable(true);
1095     connect(action, SIGNAL(toggled(bool)), main_window, SLOT(toggleFullscreen(bool)));
1096     action->setObjectName("Fullscreen");
1097     a_map["Fullscreen"] = action;
1098 
1099     action = new QAction(tr("&Grid"), agm->view);
1100     action->setIcon(QIcon(":/icons/grid.svg"));
1101     action->setShortcut(QKeySequence(tr("Ctrl+G", "Toggle Grid")));
1102     action->setCheckable(true);
1103     action->setChecked(true);
1104     connect(main_window, SIGNAL(gridChanged(bool)), action, SLOT(setChecked(bool)));
1105     connect(action, SIGNAL(toggled(bool)), main_window, SLOT(slotViewGrid(bool)));
1106     action->setObjectName("ViewGrid");
1107     a_map["ViewGrid"] = action;
1108 
1109     action = new QAction(tr("&Draft"), agm->view);
1110     action->setIcon(QIcon(":/icons/draft.svg"));
1111     action->setCheckable(true);
1112     action->setShortcut(QKeySequence(tr("Ctrl+D", "Toggle Draft Mode")));
1113     connect(action, SIGNAL(toggled(bool)), main_window, SLOT(slotViewDraft(bool)));
1114     connect(main_window, SIGNAL(draftChanged(bool)), action, SLOT(setChecked(bool)));
1115     action->setObjectName("ViewDraft");
1116     a_map["ViewDraft"] = action;
1117 
1118     action = new QAction(tr("&Statusbar"), agm->view);
1119     action->setCheckable(true);
1120     action->setChecked(true);
1121     action->setShortcut(QKeySequence(tr("Ctrl+I", "Hide Statusbar")));
1122     connect(action, SIGNAL(toggled(bool)), main_window, SLOT(slotViewStatusBar(bool)));
1123     action->setObjectName("ViewStatusBar");
1124     a_map["ViewStatusBar"] = action;
1125 
1126     action = new QAction(tr("Focus on &Command Line"), agm->view);
1127     action->setIcon(QIcon(":/main/editclear.png"));
1128     QList<QKeySequence> commandLineShortcuts;
1129     commandLineShortcuts<<QKeySequence(Qt::CTRL + Qt::Key_M)<<QKeySequence(Qt::Key_Colon)<<QKeySequence(Qt::Key_Space);
1130     action->setShortcuts(commandLineShortcuts);
1131     connect(action, SIGNAL(triggered()), main_window, SLOT(slotFocusCommandLine()));
1132     action->setObjectName("FocusCommand");
1133     a_map["FocusCommand"] = action;
1134 
1135     action = new QAction(tr("Left"), agm->widgets);
1136     action->setIcon(QIcon(":/icons/dockwidgets_left"));
1137     connect(action, SIGNAL(toggled(bool)),
1138             main_window, SLOT(toggleLeftDockArea(bool)));
1139     action->setCheckable(true);
1140     action->setChecked(false);
1141     action->setObjectName("LeftDockAreaToggle");
1142     a_map["LeftDockAreaToggle"] = action;
1143 
1144     action = new QAction(tr("Right"), agm->widgets);
1145     action->setIcon(QIcon(":/icons/dockwidgets_right"));
1146     connect(action, SIGNAL(toggled(bool)),
1147             main_window, SLOT(toggleRightDockArea(bool)));
1148     action->setCheckable(true);
1149     action->setChecked(true);
1150     action->setObjectName("RightDockAreaToggle");
1151     a_map["RightDockAreaToggle"] = action;
1152 
1153     action = new QAction(tr("Top"), agm->widgets);
1154     action->setIcon(QIcon(":/icons/dockwidgets_top"));
1155     connect(action, SIGNAL(toggled(bool)),
1156             main_window, SLOT(toggleTopDockArea(bool)));
1157     action->setCheckable(true);
1158     action->setChecked(false);
1159     action->setObjectName("TopDockAreaToggle");
1160     a_map["TopDockAreaToggle"] = action;
1161 
1162     action = new QAction(tr("Bottom"), agm->widgets);
1163     action->setIcon(QIcon(":/icons/dockwidgets_bottom"));
1164     connect(action, SIGNAL(toggled(bool)),
1165             main_window, SLOT(toggleBottomDockArea(bool)));
1166     action->setCheckable(true);
1167     action->setChecked(false);
1168     action->setObjectName("BottomDockAreaToggle");
1169     a_map["BottomDockAreaToggle"] = action;
1170 
1171     action = new QAction(tr("Floating"), agm->widgets);
1172     action->setIcon(QIcon(":/icons/dockwidgets_floating"));
1173     connect(action, SIGNAL(toggled(bool)),
1174             main_window, SLOT(toggleFloatingDockwidgets(bool)));
1175     action->setCheckable(true);
1176     action->setChecked(false);
1177     action->setObjectName("FloatingDockwidgetsToggle");
1178     a_map["FloatingDockwidgetsToggle"] = action;
1179 
1180     action = new QAction(tr("Reload Style Sheet"), agm->options);
1181     action->setShortcut(QKeySequence("Ctrl+T"));
1182     connect(action, SIGNAL(triggered()),
1183             main_window, SLOT(reloadStyleSheet()));
1184     action->setObjectName("ReloadStyleSheet");
1185     a_map["ReloadStyleSheet"] = action;
1186 
1187     action = new QAction(tr("Menu Creator"), agm->widgets);
1188     action->setIcon(QIcon(":/icons/create_menu.svg"));
1189     connect(action, SIGNAL(triggered()),
1190             main_window, SLOT(invokeMenuCreator()));
1191     action->setObjectName("InvokeMenuCreator");
1192     a_map["InvokeMenuCreator"] = action;
1193 
1194     action = new QAction(tr("Toolbar Creator"), agm->widgets);
1195     action->setIcon(QIcon(":/icons/create_toolbar.svg"));
1196     connect(action, SIGNAL(triggered()),
1197             main_window, SLOT(invokeToolbarCreator()));
1198     action->setObjectName("InvokeToolbarCreator");
1199     a_map["InvokeToolbarCreator"] = action;
1200 
1201     commonActions(a_map, agm);
1202 }
1203 
commonActions(QMap<QString,QAction * > & a_map,LC_ActionGroupManager * agm)1204 void LC_ActionFactory::commonActions(QMap<QString, QAction*>& a_map, LC_ActionGroupManager* agm)
1205 {
1206     QAction* action;
1207 
1208     // <[~ Edit ~]>
1209 
1210     action = new QAction(tr("&Selection pointer"), agm->edit);
1211     if (using_theme)
1212         action->setIcon(QIcon::fromTheme("go-previous-view", QIcon(":/icons/cursor.svg")));
1213     else
1214         action->setIcon(QIcon(":/icons/cursor.svg"));
1215     connect(action, SIGNAL(triggered()),
1216     action_handler, SLOT(slotEditKillAllActions()));
1217     action->setObjectName("EditKillAllActions");
1218     a_map["EditKillAllActions"] = action;
1219 
1220     action = new QAction(tr("&Undo"), agm->edit);
1221     if (using_theme)
1222         action->setIcon(QIcon::fromTheme("edit-undo", QIcon(":/icons/undo.svg")));
1223     else
1224         action->setIcon(QIcon(":/icons/undo.svg"));
1225     action->setShortcut(QKeySequence::Undo);
1226     connect(action, SIGNAL(triggered()),
1227     action_handler, SLOT(slotEditUndo()));
1228     action->setObjectName("EditUndo");
1229     a_map["EditUndo"] = action;
1230 
1231     action = new QAction(tr("&Redo"), agm->edit);
1232     if (using_theme)
1233         action->setIcon(QIcon::fromTheme("edit-redo", QIcon(":/icons/redo.svg")));
1234     else
1235         action->setIcon(QIcon(":/icons/redo.svg"));
1236     action->setShortcut(QKeySequence::Redo);
1237     connect(action, SIGNAL(triggered()),
1238     action_handler, SLOT(slotEditRedo()));
1239     action->setObjectName("EditRedo");
1240     a_map["EditRedo"] = action;
1241 
1242     action = new QAction(tr("Cu&t"), agm->edit);
1243     if (using_theme)
1244         action->setIcon(QIcon::fromTheme("edit-cut", QIcon(":/icons/cut.svg")));
1245     else
1246         action->setIcon(QIcon(":/icons/cut.svg"));
1247     action->setShortcut(QKeySequence::Cut);
1248     connect(action, SIGNAL(triggered()),
1249     action_handler, SLOT(slotEditCut()));
1250     action->setObjectName("EditCut");
1251     a_map["EditCut"] = action;
1252 
1253     action = new QAction(tr("&Copy"), agm->edit);
1254     if (using_theme)
1255         action->setIcon(QIcon::fromTheme("edit-copy", QIcon(":/icons/copy.svg")));
1256     else
1257         action->setIcon(QIcon(":/icons/copy.svg"));
1258     action->setShortcut(QKeySequence::Copy);
1259     connect(action, SIGNAL(triggered()),
1260     action_handler, SLOT(slotEditCopy()));
1261     action->setObjectName("EditCopy");
1262     a_map["EditCopy"] = action;
1263 
1264     action = new QAction(tr("&Paste"), agm->edit);
1265     if (using_theme)
1266         action->setIcon(QIcon::fromTheme("edit-paste", QIcon(":/icons/paste.svg")));
1267     else
1268         action->setIcon(QIcon(":/icons/paste.svg"));
1269     action->setShortcut(QKeySequence::Paste);
1270     connect(action, SIGNAL(triggered()),
1271     action_handler, SLOT(slotEditPaste()));
1272     action->setObjectName("EditPaste");
1273     a_map["EditPaste"] = action;
1274 
1275     // <[~ Zoom ~]>
1276 
1277     action = new QAction(tr("Zoom &In"), agm->view);
1278     if (using_theme)
1279         action->setIcon(QIcon::fromTheme("zoom-in", QIcon(":/icons/zoom_in.svg")));
1280     else
1281         action->setIcon(QIcon(":/icons/zoom_in.svg"));
1282     action->setShortcut(QKeySequence::ZoomIn);
1283     connect(action, SIGNAL(triggered()), action_handler, SLOT(slotZoomIn()));
1284     action->setObjectName("ZoomIn");
1285     a_map["ZoomIn"] = action;
1286 
1287     action = new QAction(tr("Zoom &Out"), agm->view);
1288     if (using_theme)
1289         action->setIcon(QIcon::fromTheme("zoom-out", QIcon(":/icons/zoom_out.svg")));
1290     else
1291         action->setIcon(QIcon(":/icons/zoom_out.svg"));
1292     action->setShortcut(QKeySequence::ZoomOut);
1293     connect(action, SIGNAL(triggered()), action_handler, SLOT(slotZoomOut()));
1294     action->setObjectName("ZoomOut");
1295     a_map["ZoomOut"] = action;
1296 
1297     action = new QAction(tr("&Auto Zoom"), agm->view);
1298     if (using_theme)
1299         action->setIcon(QIcon::fromTheme("zoom-fit-best", QIcon(":/icons/zoom_auto.svg")));
1300     else
1301         action->setIcon(QIcon(":/icons/zoom_auto.svg"));
1302     connect(action, SIGNAL(triggered()), action_handler, SLOT(slotZoomAuto()));
1303     action->setObjectName("ZoomAuto");
1304     a_map["ZoomAuto"] = action;
1305 
1306     action = new QAction(tr("Previous &View"), agm->view);
1307     if (using_theme)
1308         action->setIcon(QIcon::fromTheme("zoom-previous", QIcon(":/icons/zoom_previous.svg")));
1309     else
1310         action->setIcon(QIcon(":/icons/zoom_previous.svg"));
1311     connect(action, SIGNAL(triggered()),
1312     action_handler, SLOT(slotZoomPrevious()));
1313     action->setEnabled(false);
1314     action->setObjectName("ZoomPrevious");
1315     a_map["ZoomPrevious"] = action;
1316 
1317     action = new QAction(tr("&Redraw"), agm->view);
1318     if (using_theme)
1319         action->setIcon(QIcon::fromTheme("view-refresh", QIcon(":/icons/redraw.svg")));
1320     else
1321         action->setIcon(QIcon(":/icons/redraw.svg"));
1322     action->setShortcut(QKeySequence::Refresh);
1323     connect(action, SIGNAL(triggered()),
1324     action_handler, SLOT(slotZoomRedraw()));
1325     action->setObjectName("ZoomRedraw");
1326     a_map["ZoomRedraw"] = action;
1327 
1328     action = new QAction(tr("&Window Zoom"), agm->other);
1329     action->setCheckable(true);
1330     if (using_theme)
1331         action->setIcon(QIcon::fromTheme("zoom-select", QIcon(":/icons/zoom_window.svg")));
1332     else
1333         action->setIcon(QIcon(":/icons/zoom_window.svg"));
1334     connect(action, SIGNAL(triggered()), action_handler, SLOT(slotZoomWindow()));
1335     action->setObjectName("ZoomWindow");
1336     a_map["ZoomWindow"] = action;
1337 
1338     // <[~ File ~]>
1339 
1340     action = new QAction(tr("&New"), agm->file);
1341     if (using_theme)
1342         action->setIcon(QIcon::fromTheme("document-new", QIcon(":/icons/new.svg")));
1343     else
1344         action->setIcon(QIcon(":/icons/new.svg"));
1345     action->setShortcut(QKeySequence::New);
1346     connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileNewNew()));
1347     action->setObjectName("FileNew");
1348     a_map["FileNew"] = action;
1349 
1350     action = new QAction(tr("New From &Template"), agm->file);
1351     if (using_theme)
1352         action->setIcon(QIcon::fromTheme("document-new", QIcon(":/icons/new_from_template.svg")));
1353     else
1354         action->setIcon(QIcon(":/icons/new_from_template.svg"));
1355     connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileNewTemplate()));
1356     action->setObjectName("FileNewTemplate");
1357     a_map["FileNewTemplate"] = action;
1358 
1359     action = new QAction(tr("&Open..."), agm->file);
1360     if (using_theme)
1361         action->setIcon(QIcon::fromTheme("document-open", QIcon(":/icons/open.svg")));
1362     else
1363         action->setIcon(QIcon(":/icons/open.svg"));
1364     action->setShortcut(QKeySequence::Open);
1365     connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileOpen()));
1366     action->setObjectName("FileOpen");
1367     a_map["FileOpen"] = action;
1368 
1369     action = new QAction(tr("&Save"), agm->file);
1370     if (using_theme)
1371         action->setIcon(QIcon::fromTheme("document-save", QIcon(":/icons/save.svg")));
1372     else
1373         action->setIcon(QIcon(":/icons/save.svg"));
1374     action->setShortcut(QKeySequence::Save);
1375     connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileSave()));
1376     action->setObjectName("FileSave");
1377     a_map["FileSave"] = action;
1378 
1379     action = new QAction(tr("Save &as..."), agm->file);
1380     if (using_theme)
1381         action->setIcon(QIcon::fromTheme("document-save-as", QIcon(":/icons/save_as.svg")));
1382     else
1383         action->setIcon(QIcon(":/icons/save_as.svg"));
1384     action->setShortcut(QKeySequence::SaveAs);
1385     connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileSaveAs()));
1386     action->setObjectName("FileSaveAs");
1387     a_map["FileSaveAs"] = action;
1388 
1389 	action = new QAction(tr("Save A&ll..."), agm->file);
1390 	action->setIcon(QIcon(":/icons/save_all.svg"));
1391 	QKeySequence shortcut = QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S);
1392 	// only define this shortcut for platforms not already using it for save as
1393 	if (shortcut != QKeySequence::SaveAs)
1394 		action->setShortcut(shortcut);
1395 	connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileSaveAll()));
1396 	action->setObjectName("FileSaveAll");
1397 	a_map["FileSaveAll"] = action;
1398 
1399     action = new QAction(tr("&Print..."), agm->file);
1400     if (using_theme)
1401         action->setIcon(QIcon::fromTheme("document-print", QIcon(":/icons/print.svg")));
1402     else
1403         action->setIcon(QIcon(":/icons/print.svg"));
1404     action->setShortcut(QKeySequence::Print);
1405     connect(action, SIGNAL(triggered()), main_window, SLOT(slotFilePrint()));
1406     connect(main_window, SIGNAL(printPreviewChanged(bool)), action, SLOT(setChecked(bool)));
1407     action->setObjectName("FilePrint");
1408     a_map["FilePrint"] = action;
1409 
1410     action = new QAction(tr("Print Pre&view"), agm->file);
1411     if (using_theme)
1412         action->setIcon(QIcon::fromTheme("document-print-preview", QIcon(":/icons/print_preview.svg")));
1413     else
1414         action->setIcon(QIcon(":/icons/print_preview.svg"));
1415     action->setCheckable(true);
1416     connect(action, SIGNAL(triggered(bool)), main_window, SLOT(slotFilePrintPreview(bool)));
1417     connect(main_window, SIGNAL(printPreviewChanged(bool)), action, SLOT(setChecked(bool)));
1418     action->setObjectName("FilePrintPreview");
1419     a_map["FilePrintPreview"] = action;
1420 
1421     action = new QAction(tr("&Quit"), agm->file);
1422     if (using_theme)
1423         action->setIcon(QIcon::fromTheme("application-exit", QIcon(":/icons/quit.svg")));
1424     else
1425         action->setIcon(QIcon(":/icons/quit.svg"));
1426     action->setShortcut(QKeySequence::Quit);
1427     connect(action, SIGNAL(triggered()), main_window, SLOT(slotFileQuit()));
1428     action->setObjectName("FileQuit");
1429     a_map["FileQuit"] = action;
1430 }
1431