3 // Part of the Architektonas Project
4 // Originally part of QCad Community Edition by Andrew Mustun
5 // Extensively rewritten and refactored by James L. Hammons
6 // (C) 2010 Underground Software
8 // JLH = James L. Hammons <jlhamm@acm.org>
11 // --- ---------- -----------------------------------------------------------
12 // JLH 05/21/2010 Added this text. :-)
15 #include "rs_preview.h"
17 #include "rs_entitycontainer.h"
18 #include "graphicview.h"
19 #include "rs_information.h"
20 #include "paintinterface.h"
26 RS_Preview::RS_Preview(RS_EntityContainer * parent): RS_EntityContainer(parent),
29 settings.beginGroup("Appearance");
30 maxEntities = settings.value("MaxPreview", 100).toInt();
37 RS_Preview::~RS_Preview()
42 * Adds an entity to this preview and removes any attributes / layer
43 * connectsions before that.
45 void RS_Preview::addEntity(RS_Entity * entity)
47 if (entity == NULL || entity->isUndone())
50 // only border preview for complex entities:
51 //if ((entity->count() > maxEntities-count()) &&
53 bool addBorder = false;
55 if (entity->rtti() == RS2::EntityImage || entity->rtti() == RS2::EntityHatch
56 || entity->rtti() == RS2::EntityInsert)
62 if (entity->isContainer() && entity->rtti() != RS2::EntitySpline)
64 if (entity->countDeep() > maxEntities-countDeep())
71 Vector min = entity->getMin();
72 Vector max = entity->getMax();
74 RS_Line * l1 = new RS_Line(this, RS_LineData(Vector(min.x, min.y), Vector(max.x, min.y)));
75 RS_Line * l2 = new RS_Line(this, RS_LineData(Vector(max.x, min.y), Vector(max.x, max.y)));
76 RS_Line * l3 = new RS_Line(this, RS_LineData(Vector(max.x, max.y), Vector(min.x, max.y)));
77 RS_Line * l4 = new RS_Line(this, RS_LineData(Vector(min.x, max.y), Vector(min.x, min.y)));
79 RS_EntityContainer::addEntity(l1);
80 RS_EntityContainer::addEntity(l2);
81 RS_EntityContainer::addEntity(l3);
82 RS_EntityContainer::addEntity(l4);
89 entity->setLayer(NULL);
90 entity->setSelected(false);
91 entity->reparent(this);
92 entity->setPen(RS_Pen(RS_Color(255, 255, 255), RS2::Width00, RS2::SolidLine));
93 RS_EntityContainer::addEntity(entity);
98 * Clones the given entity and adds the clone to the preview.
100 void RS_Preview::addCloneOf(RS_Entity * entity)
105 RS_Entity * clone = entity->clone();
110 * Adds all entities from 'container' to the preview (unselected).
112 void RS_Preview::addAllFrom(RS_EntityContainer & container)
116 for(RS_Entity * e=container.firstEntity(); e!=NULL; e=container.nextEntity())
120 RS_Entity * clone = e->clone();
121 clone->setSelected(false);
122 clone->reparent(this);
124 c += clone->countDeep();
126 // clone might be NULL after this point
132 * Adds all selected entities from 'container' to the preview (unselected).
134 void RS_Preview::addSelectionFrom(RS_EntityContainer & container)
138 for(RS_Entity * e=container.firstEntity(); e!=NULL; e=container.nextEntity())
140 if (e->isSelected() && c < maxEntities)
142 RS_Entity * clone = e->clone();
143 clone->setSelected(false);
144 clone->reparent(this);
146 c += clone->countDeep();
148 // clone might be NULL after this point
154 * Adds all entities in the given range and those which have endpoints in the
155 * given range to the preview.
157 void RS_Preview::addStretchablesFrom(RS_EntityContainer & container, const Vector & v1,
162 for(RS_Entity * e=container.firstEntity(); e!=NULL; e=container.nextEntity())
164 if (e->isVisible() && e->rtti() != RS2::EntityHatch && (e->isInWindow(v1, v2)
165 || e->hasEndpointsWithinWindow(v1, v2)) && c < maxEntities)
167 RS_Entity * clone = e->clone();
168 //clone->setSelected(false);
169 clone->reparent(this);
171 c += clone->countDeep();
173 // clone might be NULL after this point
178 void RS_Preview::SetOffset(Vector v)
183 Vector RS_Preview::Offset(void)
188 void RS_Preview::SetVisible(bool visibility/*= true*/)
190 visible = visibility;
193 bool RS_Preview::Visible(void)
198 void RS_Preview::Draw(GraphicView * view, PaintInterface * painter)
203 painter->setPen(RS_Pen(RS_Color(60, 255, 80), RS2::Width00, RS2::SolidLine));
204 painter->setOffset(offset);
206 // We have to traverse the container ourselves, because RS_Container::draw()
207 // uses drawEntity() instead of drawEntityPlain()...
208 for(RS_Entity * e=firstEntity(RS2::ResolveNone); e!=NULL; e=nextEntity(RS2::ResolveNone))
209 view->drawEntityPlain(e);
211 painter->setOffset(Vector(0, 0));