KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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) 2024 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 <view/view_item.h>
39#include <gal/painter.h>
41#include <layer_ids.h>
42
43using namespace KIGFX;
44
46 VIEW_ITEM(),
47 m_layer( LAYER_SELECT_OVERLAY )
48{
49}
50
51
53{
54 // VIEW_ITEM destructor removes the object from its parent view
55}
56
57
59{
60 m_groupItems.push_back( aItem );
61}
62
63
65{
67}
68
69
71{
72 m_groupItems.clear();
73}
74
75
76unsigned int VIEW_GROUP::GetSize() const
77{
78 return m_groupItems.size();
79}
80
81
82VIEW_ITEM *VIEW_GROUP::GetItem( unsigned int idx ) const
83{
84 return m_groupItems[idx];
85}
86
87
89{
90 BOX2I bb;
91
92 if( !m_groupItems.size() )
93 {
94 bb.SetMaximum();
95 }
96 else
97 {
98 bb = m_groupItems[0]->ViewBBox();
99
100 for( VIEW_ITEM* item : m_groupItems )
101 bb.Merge( item->ViewBBox() );
102 }
103
104 return bb;
105}
106
107
108void VIEW_GROUP::ViewDraw( int aLayer, VIEW* aView ) const
109{
110 KIGFX::GAL* gal = aView->GetGAL();
111 PAINTER* painter = aView->GetPainter();
112 bool isSelection = m_layer == LAYER_SELECT_OVERLAY;
113
114 const std::vector<VIEW_ITEM*> drawList = updateDrawList();
115 constexpr double HIDE = std::numeric_limits<double>::max();
116
117 std::map<int, std::vector<VIEW_ITEM*>> layer_item_map;
118
119 // Build a list of layers used by the items in the group
120 for( VIEW_ITEM* item : drawList )
121 {
122 if( aView->IsHiddenOnOverlay( item ) )
123 continue;
124
125 std::vector<int> layers = item->ViewGetLayers();
126
127 for( auto layer : layers )
128 {
129 wxCHECK2_MSG( layer <= LAYER_ID_COUNT, continue, wxT( "Invalid item layer" ) );
130 layer_item_map[ layer ].push_back( item );
131 }
132 }
133
134 if( layer_item_map.empty() )
135 return;
136
137 std::vector<int> layers;
138 layers.reserve( layer_item_map.size() );
139
140 for( const std::pair<const int, std::vector<VIEW_ITEM*>>& entry : layer_item_map )
141 layers.push_back( entry.first );
142
143 aView->SortLayers( layers );
144
145 // Now draw the layers in sorted order
146
148
149 for( int layer : layers )
150 {
151 bool draw = aView->IsLayerVisible( layer );
152
153 if( IsZoneFillLayer( layer ) )
154 {
155 // The visibility of solid areas must follow the visiblility of the zone layer
156 int zone_main_layer = layer - LAYER_ZONE_START;
157 draw = aView->IsLayerVisible( zone_main_layer );
158 }
159
160 if( isSelection )
161 {
162 switch( layer )
163 {
166 draw = true;
167 break;
168
169 default:
170 break;
171 }
172 }
173
174 if( draw )
175 {
176 gal->AdvanceDepth();
177
178 for( VIEW_ITEM* item : layer_item_map[ layer ] )
179 {
180 // Ignore LOD scale for selected items, but don't ignore things explicitly
181 // hidden.
182 if( item->ViewGetLOD( layer, aView ) == HIDE )
183 continue;
184
185 if( !painter->Draw( item, layer ) )
186 item->ViewDraw( layer, aView ); // Alternative drawing method
187 }
188 }
189 }
190}
191
192
193std::vector<int> VIEW_GROUP::ViewGetLayers() const
194{
195 // Everything is displayed on a single layer
196 return { m_layer };
197}
198
199
201{
202 for( unsigned int i = 0 ; i < GetSize(); i++ )
203 delete GetItem( i );
204
205 Clear();
206}
207
208
209const std::vector<VIEW_ITEM*> VIEW_GROUP::updateDrawList() const
210{
211 return m_groupItems;
212}
213
214
215/*void VIEW_GROUP::ItemsSetVisibility( bool aVisible )
216{
217 for(unsigned int i = 0 ; i < GetSize(); i++)
218 GetItem(i)->ViewSetVisible( aVisible );
219}
220
221
222void VIEW_GROUP::ItemsViewUpdate( VIEW_ITEM::VIEW_UPDATE_FLAGS aFlags )
223{
224 for(unsigned int i = 0 ; i < GetSize(); i++)
225 GetItem(i)->ViewUpdate( aFlags );
226}*/
constexpr void SetMaximum()
Definition: box2.h:80
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition: box2.h:658
Attribute save/restore for GAL attributes.
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.
Contains all the knowledge about how to draw graphical object onto any particular output device.
Definition: painter.h:59
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:70
virtual unsigned int GetSize() const
Return the number of stored items.
Definition: view_group.cpp:76
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:108
virtual VIEW_ITEM * GetItem(unsigned int aIdx) const
Definition: view_group.cpp:82
void FreeItems()
Free all the items that were added to the group.
Definition: view_group.cpp:200
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
Definition: view_group.cpp:193
std::vector< VIEW_ITEM * > m_groupItems
Definition: view_group.h:109
virtual void Remove(VIEW_ITEM *aItem)
Remove an item from the group.
Definition: view_group.cpp:64
VIEW_GROUP(VIEW *aView=nullptr)
Definition: view_group.cpp:45
virtual ~VIEW_GROUP()
Definition: view_group.cpp:52
virtual void Add(VIEW_ITEM *aItem)
Add an item to the group.
Definition: view_group.cpp:58
virtual const std::vector< VIEW_ITEM * > updateDrawList() const
Definition: view_group.cpp:209
virtual const BOX2I ViewBBox() const override
Return the bounding box for all stored items covering all its layers.
Definition: view_group.cpp:88
An abstract base class for deriving all objects that can be added to a VIEW.
Definition: view_item.h:84
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
void SortLayers(std::vector< int > aLayers) const
Change the order of given layer ids, so after sorting the order corresponds to layers rendering order...
Definition: view.cpp:662
GAL * GetGAL() const
Return the #GAL this view is using to draw graphical primitives.
Definition: view.h:199
bool IsHiddenOnOverlay(const VIEW_ITEM *aItem) const
Definition: view.cpp:1647
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
Definition: view.h:419
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:217
#define LAYER_ID_COUNT
Must update this if you add any enums after GerbView!
Definition: layer_ids.h:481
@ LAYER_PAD_PLATEDHOLES
to draw pad holes (plated)
Definition: layer_ids.h:215
@ LAYER_ZONE_START
Virtual layers for stacking zones and tracks on a given copper layer.
Definition: layer_ids.h:257
@ LAYER_SELECT_OVERLAY
currently selected items overlay
Definition: layer_ids.h:220
@ LAYER_PAD_HOLEWALLS
Definition: layer_ids.h:234
bool IsZoneFillLayer(int aLayer)
Definition: layer_ids.h:727
The Cairo implementation of the graphics abstraction layer.
Definition: color4d.cpp:247
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:165