KiCad PCB EDA Suite
view_group.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2013 CERN
5 * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
6 * @author Maciej Suminski <[email protected]>
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, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 *
25 */
26
34#include <set>
35#include <core/kicad_algo.h>
36#include <view/view_group.h>
37#include <view/view.h>
38#include <painter.h>
40#include <layer_ids.h>
41
42using namespace KIGFX;
43
44VIEW_GROUP::VIEW_GROUP( VIEW* aView ) :
45 VIEW_ITEM(),
46 m_layer( LAYER_SELECT_OVERLAY )
47{
48}
49
50
52{
53 // VIEW_ITEM destructor removes the object from its parent view
54}
55
56
58{
59 m_groupItems.push_back( aItem );
60}
61
62
64{
66}
67
68
70{
71 m_groupItems.clear();
72}
73
74
75unsigned int VIEW_GROUP::GetSize() const
76{
77 return m_groupItems.size();
78}
79
80
81VIEW_ITEM *VIEW_GROUP::GetItem( unsigned int idx ) const
82{
83 return m_groupItems[idx];
84}
85
86
88{
89 BOX2I bb;
90
91 if( !m_groupItems.size() )
92 {
93 bb.SetMaximum();
94 }
95 else
96 {
97 bb = m_groupItems[0]->ViewBBox();
98
99 for( VIEW_ITEM* item : m_groupItems )
100 bb.Merge( item->ViewBBox() );
101 }
102
103 return bb;
104}
105
106
107void VIEW_GROUP::ViewDraw( int aLayer, VIEW* aView ) const
108{
109 KIGFX::GAL* gal = aView->GetGAL();
110 PAINTER* painter = aView->GetPainter();
111 bool isSelection = m_layer == LAYER_SELECT_OVERLAY;
112
113 const std::vector<VIEW_ITEM*> drawList = updateDrawList();
114
115 std::map<int, std::vector<VIEW_ITEM*>> layer_item_map;
116
117 // Build a list of layers used by the items in the group
118 for( VIEW_ITEM* item : drawList )
119 {
120 int item_layers[VIEW::VIEW_MAX_LAYERS], item_layers_count;
121 item->ViewGetLayers( item_layers, item_layers_count );
122
123 for( int i = 0; i < item_layers_count; i++ )
124 {
125 wxCHECK2_MSG( item_layers[i] <= LAYER_ID_COUNT, continue, wxT( "Invalid item layer" ) );
126 layer_item_map[ item_layers[i] ].push_back( item );
127 }
128 }
129
130 int layers[VIEW::VIEW_MAX_LAYERS] = { 0 };
131 int layers_count = 0;
132
133 for( const std::pair<const int, std::vector<VIEW_ITEM*>>& entry : layer_item_map )
134 layers[ layers_count++ ] = entry.first;
135
136 aView->SortLayers( layers, layers_count );
137
138 // Now draw the layers in sorted order
139
140 gal->PushDepth();
141
142 for( int i = 0; i < layers_count; i++ )
143 {
144 int layer = layers[i];
145
146 if( IsZoneFillLayer( layer ) )
147 layer = layer - LAYER_ZONE_START;
148
149 bool draw = aView->IsLayerVisible( layer );
150
151 if( isSelection )
152 {
153 switch( layer )
154 {
155 case LAYER_PADS_TH:
158 case LAYER_PAD_FR:
159 case LAYER_PAD_BK:
160 draw = true;
161 break;
162 default:
163 break;
164 }
165 }
166
167 if( draw )
168 {
169 gal->AdvanceDepth();
170
171 for( VIEW_ITEM* item : layer_item_map[ layers[i] ] )
172 {
173 if( !painter->Draw( item, layers[i] ) )
174 item->ViewDraw( layers[i], aView ); // Alternative drawing method
175 }
176 }
177 }
178
179 gal->PopDepth();
180}
181
182
183void VIEW_GROUP::ViewGetLayers( int aLayers[], int& aCount ) const
184{
185 // Everything is displayed on a single layer
186 aLayers[0] = m_layer;
187 aCount = 1;
188}
189
190
192{
193 for( unsigned int i = 0 ; i < GetSize(); i++ )
194 delete GetItem( i );
195
196 Clear();
197}
198
199
200const std::vector<VIEW_ITEM*> VIEW_GROUP::updateDrawList() const
201{
202 return m_groupItems;
203}
204
205
206/*void VIEW_GROUP::ItemsSetVisibility( bool aVisible )
207{
208 for(unsigned int i = 0 ; i < GetSize(); i++)
209 GetItem(i)->ViewSetVisible( aVisible );
210}
211
212
213void VIEW_GROUP::ItemsViewUpdate( VIEW_ITEM::VIEW_UPDATE_FLAGS aFlags )
214{
215 for(unsigned int i = 0 ; i < GetSize(); i++)
216 GetItem(i)->ViewUpdate( aFlags );
217}*/
void SetMaximum()
Definition: box2.h:63
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition: box2.h:588
Abstract interface for drawing on a 2D-surface.
void AdvanceDepth()
Change the current depth to deeper, so it is possible to draw objects right beneath other.
void PushDepth()
Store current drawing depth on the depth stack.
void PopDepth()
Restore previously stored drawing depth for the depth stack.
Contains all the knowledge about how to draw graphical object onto any particular output device.
Definition: painter.h:58
virtual bool Draw(const VIEW_ITEM *aItem, int aLayer)=0
Takes an instance of VIEW_ITEM and passes it to a function that knows how to draw the item.
virtual void Clear()
Remove all the stored items from the group.
Definition: view_group.cpp:69
virtual unsigned int GetSize() const
Return the number of stored items.
Definition: view_group.cpp:75
virtual void ViewDraw(int aLayer, VIEW *aView) const override
Draw all the stored items in the group on the given layer.
Definition: view_group.cpp:107
virtual VIEW_ITEM * GetItem(unsigned int aIdx) const
Definition: view_group.cpp:81
void FreeItems()
Free all the items that were added to the group.
Definition: view_group.cpp:191
virtual void ViewGetLayers(int aLayers[], int &aCount) const override
Return all the layers used by the stored items.
Definition: view_group.cpp:183
std::vector< VIEW_ITEM * > m_groupItems
Definition: view_group.h:113
virtual void Remove(VIEW_ITEM *aItem)
Remove an item from the group.
Definition: view_group.cpp:63
virtual ~VIEW_GROUP()
Definition: view_group.cpp:51
virtual void Add(VIEW_ITEM *aItem)
Add an item to the group.
Definition: view_group.cpp:57
virtual const std::vector< VIEW_ITEM * > updateDrawList() const
Definition: view_group.cpp:200
virtual const BOX2I ViewBBox() const override
Return the bounding box for all stored items covering all its layers.
Definition: view_group.cpp:87
An abstract base class for deriving all objects that can be added to a VIEW.
Definition: view_item.h:77
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:69
void SortLayers(int aLayers[], int &aCount) const
Change the order of given layer ids, so after sorting the order corresponds to layers rendering order...
Definition: view.cpp:648
GAL * GetGAL() const
Return the #GAL this view is using to draw graphical primitives.
Definition: view.h:195
static constexpr int VIEW_MAX_LAYERS
Rendering order modifier for layers that are marked as top layers.
Definition: view.h:727
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
Definition: view.h:410
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:213
#define LAYER_ID_COUNT
Must update this if you add any enums after GerbView!
Definition: layer_ids.h:451
@ LAYER_PAD_FR
smd pads, front layer
Definition: layer_ids.h:202
@ LAYER_PAD_PLATEDHOLES
to draw pad holes (plated)
Definition: layer_ids.h:214
@ LAYER_ZONE_START
Virtual layers for stacking zones and tracks on a given copper layer.
Definition: layer_ids.h:253
@ LAYER_PAD_BK
smd pads, back layer
Definition: layer_ids.h:203
@ LAYER_PADS_TH
multilayer pads, usually with holes
Definition: layer_ids.h:213
@ LAYER_SELECT_OVERLAY
currently selected items overlay
Definition: layer_ids.h:219
@ LAYER_PAD_HOLEWALLS
Definition: layer_ids.h:233
bool IsZoneFillLayer(int aLayer)
Definition: layer_ids.h:997
The Cairo implementation of the graphics abstraction layer.
Definition: color4d.cpp:246
void delete_matching(_Container &__c, _Value __value)
Covers for the horrifically named std::remove and std::remove_if (neither of which remove anything).
Definition: kicad_algo.h:164