3 // Originally part of QCad Community Edition by Andrew Mustun
4 // Extensively rewritten and refactored by James L. Hammons
5 // (C) 2010 Underground Software
7 // JLH = James L. Hammons <jlhamm@acm.org>
10 // --- ---------- -----------------------------------------------------------
11 // JLH 05/21/2010 Added this text. :-)
14 #include "rs_preview.h"
16 #include "rs_entitycontainer.h"
17 #include "rs_graphicview.h"
18 #include "rs_information.h"
24 RS_Preview::RS_Preview(RS_EntityContainer * parent): RS_EntityContainer(parent)
26 settings.beginGroup("Appearance");
27 maxEntities = settings.value("MaxPreview", 100).toInt();
34 RS_Preview::~RS_Preview()
39 * Adds an entity to this preview and removes any attributes / layer
40 * connectsions before that.
42 void RS_Preview::addEntity(RS_Entity * entity)
44 if (entity == NULL || entity->isUndone())
47 // only border preview for complex entities:
48 //if ((entity->count() > maxEntities-count()) &&
50 bool addBorder = false;
52 if (entity->rtti() == RS2::EntityImage || entity->rtti() == RS2::EntityHatch
53 || entity->rtti() == RS2::EntityInsert)
59 if (entity->isContainer() && entity->rtti() != RS2::EntitySpline)
61 if (entity->countDeep() > maxEntities-countDeep())
68 Vector min = entity->getMin();
69 Vector max = entity->getMax();
71 RS_Line * l1 = new RS_Line(this, RS_LineData(Vector(min.x, min.y), Vector(max.x, min.y)));
72 RS_Line * l2 = new RS_Line(this, RS_LineData(Vector(max.x, min.y), Vector(max.x, max.y)));
73 RS_Line * l3 = new RS_Line(this, RS_LineData(Vector(max.x, max.y), Vector(min.x, max.y)));
74 RS_Line * l4 = new RS_Line(this, RS_LineData(Vector(min.x, max.y), Vector(min.x, min.y)));
76 RS_EntityContainer::addEntity(l1);
77 RS_EntityContainer::addEntity(l2);
78 RS_EntityContainer::addEntity(l3);
79 RS_EntityContainer::addEntity(l4);
86 entity->setLayer(NULL);
87 entity->setSelected(false);
88 entity->reparent(this);
89 entity->setPen(RS_Pen(RS_Color(255, 255, 255), RS2::Width00, RS2::SolidLine));
90 RS_EntityContainer::addEntity(entity);
95 * Clones the given entity and adds the clone to the preview.
97 void RS_Preview::addCloneOf(RS_Entity* entity)
102 RS_Entity * clone = entity->clone();
107 * Adds all entities from 'container' to the preview (unselected).
109 void RS_Preview::addAllFrom(RS_EntityContainer & container)
113 for(RS_Entity * e=container.firstEntity(); e!=NULL; e=container.nextEntity())
117 RS_Entity * clone = e->clone();
118 clone->setSelected(false);
119 clone->reparent(this);
121 c += clone->countDeep();
123 // clone might be NULL after this point
129 * Adds all selected entities from 'container' to the preview (unselected).
131 void RS_Preview::addSelectionFrom(RS_EntityContainer & container)
135 for(RS_Entity * e=container.firstEntity(); e!=NULL; e=container.nextEntity())
137 if (e->isSelected() && c < maxEntities)
139 RS_Entity * clone = e->clone();
140 clone->setSelected(false);
141 clone->reparent(this);
143 c += clone->countDeep();
145 // clone might be NULL after this point
151 * Adds all entities in the given range and those which have endpoints
152 * in the given range to the preview.
154 void RS_Preview::addStretchablesFrom(RS_EntityContainer & container, const Vector & v1,
159 for(RS_Entity * e=container.firstEntity(); e!=NULL; e=container.nextEntity())
161 if (e->isVisible() && e->rtti() != RS2::EntityHatch && (e->isInWindow(v1, v2)
162 || e->hasEndpointsWithinWindow(v1, v2)) && c < maxEntities)
164 RS_Entity * clone = e->clone();
165 //clone->setSelected(false);
166 clone->reparent(this);
168 c += clone->countDeep();
170 // clone might be NULL after this point