KiCad PCB EDA Suite
Loading...
Searching...
No Matches
gerbview_layer_widget.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) 2004-2010 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
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, see <https://www.gnu.org/licenses/>.
20 */
21
22#include <wx/checkbox.h>
23#include <wx/filedlg.h>
25#include <bitmaps.h>
26#include <gerbview.h>
28#include <gerbview_frame.h>
30#include <core/arraydim.h>
31#include <lset.h>
32#include <view/view.h>
33#include <gerbview_painter.h>
36#include <tool/tool_manager.h>
38
39#include "layer_widget.h"
42#include "dcode_selection_box.h"
43
44
45GERBER_LAYER_WIDGET::GERBER_LAYER_WIDGET( GERBVIEW_FRAME* aParent, wxWindow* aFocusOwner ) :
46 LAYER_WIDGET( aParent, aFocusOwner ),
47 m_frame( aParent )
48{
50
52
53 // Update default tabs labels for GerbView
55
56 // handle the popup menu over the layer window.
57 m_LayerScrolledWindow->Connect( wxEVT_RIGHT_DOWN,
58 wxMouseEventHandler( GERBER_LAYER_WIDGET::onRightDownLayers ),
59 nullptr, this );
60
61 // since Popupmenu() calls this->ProcessEvent() we must call this->Connect()
62 // and not m_LayerScrolledWindow->Connect()
63 Connect( ID_LAYER_MANAGER_START, ID_LAYER_MANAGER_END, wxEVT_COMMAND_MENU_SELECTED,
64 wxCommandEventHandler( GERBER_LAYER_WIDGET::onPopupSelection ), nullptr, this );
65}
66
67
72
73
75{
76 m_notebook->SetPageText( 0, _( "Layers" ) );
77 m_notebook->SetPageText( 1, _( "Items" ) );
78}
79
80
82{
83 std::vector<int>render_layers{ LAYER_DCODES, LAYER_NEGATIVE_OBJECTS, LAYER_GERBVIEW_GRID,
86
87 for( int layer: render_layers )
88 {
89 int row = findRenderRow( layer );
90
91 if( row < 0 )
92 continue;
93
94 COLOR4D color = GetRenderColor( row );
95
96 if( color != COLOR4D::UNSPECIFIED )
97 aColorSettings->SetColor( layer, color );
98 }
99
100 for( int layer = GERBVIEW_LAYER_ID_START; layer < GERBVIEW_LAYER_ID_START + GERBER_DRAWLAYERS_COUNT; layer++ )
101 {
102 int row = findLayerRow( layer - GERBVIEW_LAYER_ID_START );
103
104 if( row < 0 ) // Not existing in layer list
105 continue;
106
107 COLOR4D color = GetLayerColor( row );
108
109 if( color != COLOR4D::UNSPECIFIED )
110 aColorSettings->SetColor( layer, color );
111 }
112}
113
114
116{
118
119 // Fixed "Rendering" tab rows within the LAYER_WIDGET, only the initial color
120 // is changed before appending to the LAYER_WIDGET. This is an automatic variable
121 // not a static variable, change the color & state after copying from code to renderRows
122 // on the stack.
123 LAYER_WIDGET::ROW renderRows[7] = {
124
125#define RR LAYER_WIDGET::ROW // Render Row abbreviation to reduce source width
126
127 RR( _( "DCodes" ), LAYER_DCODES, WHITE,
128 _( "Show DCodes identification" ) ),
129 RR( _( "Negative Objects" ), LAYER_NEGATIVE_OBJECTS, DARKGRAY,
130 _( "Show negative objects in this color" ) ),
131 RR(),
132 RR( _( "Grid" ), LAYER_GERBVIEW_GRID, WHITE,
133 _( "Show the (x,y) grid dots" ) ),
134 RR( _( "Drawing Sheet" ), LAYER_GERBVIEW_DRAWINGSHEET, DARKRED,
135 _( "Show drawing sheet border and title block") ),
136 RR( _( "Page Limits" ), LAYER_GERBVIEW_PAGE_LIMITS, WHITE,
137 _( "Show drawing sheet page limits" ) ),
138 RR( _( "Background" ), LAYER_GERBVIEW_BACKGROUND, BLACK,
139 _( "PCB Background" ), true, false )
140 };
141
142 for( unsigned row = 0; row < arrayDim( renderRows ); ++row )
143 {
144 if( renderRows[row].color != COLOR4D::UNSPECIFIED ) // does this row show a color?
145 renderRows[row].color = m_frame->GetVisibleElementColor( renderRows[row].id );
146
147 if( renderRows[row].id ) // if not the separator
148 renderRows[row].state = m_frame->IsElementVisible( renderRows[row].id );
149 }
150
151 AppendRenderRows( renderRows, arrayDim(renderRows) );
152}
153
154
156{
157 // Remember: menu text is capitalized (see our rules_for_capitalization_in_Kicad_UI.txt)
158 KIUI::AddMenuItem( aMenu, ID_SHOW_ALL_LAYERS, _( "Show All Layers" ),
160
161 KIUI::AddMenuItem( aMenu, ID_SHOW_NO_LAYERS_BUT_ACTIVE, _( "Hide All Layers But Active" ),
163
165 _( "Always Hide All Layers But Active" ),
167
168 KIUI::AddMenuItem( aMenu, ID_SHOW_NO_LAYERS, _( "Hide All Layers" ),
170
171 aMenu->AppendSeparator();
172
173 KIUI::AddMenuItem( aMenu, ID_SORT_GBR_LAYERS_X2, _( "Sort Layers if X2 Mode" ),
175
176 KIUI::AddMenuItem( aMenu, ID_SORT_GBR_LAYERS_FILE_EXT, _( "Sort Layers by File Extension" ),
178
179 aMenu->AppendSeparator();
180
182 _( "Layers Display Parameters: Offset and Rotation" ),
184
185 aMenu->AppendSeparator();
186
187 KIUI::AddMenuItem( aMenu, ID_LAYER_MOVE_UP, _( "Move Current Layer Up" ),
189
190 KIUI::AddMenuItem( aMenu, ID_LAYER_MOVE_DOWN, _( "Move Current Layer Down" ),
192
193 KIUI::AddMenuItem( aMenu, ID_LAYER_DELETE, _( "Clear Current Layer..." ),
195}
196
197
198void GERBER_LAYER_WIDGET::onRightDownLayers( wxMouseEvent& event )
199{
200 wxMenu menu;
201
202 AddRightClickMenuItems( &menu );
203 PopupMenu( &menu );
204
205 passOnFocus();
206}
207
208
209void GERBER_LAYER_WIDGET::onPopupSelection( wxCommandEvent& event )
210{
211 int layer;
212 int rowCount;
213 int menuId = event.GetId();
214 bool visible = (menuId == ID_SHOW_ALL_LAYERS) ? true : false;
215 LSET visibleLayers;
216 bool force_active_layer_visible;
217
218 switch( menuId )
219 {
224 // Set the display layers options. Sorting layers has no effect to these options
226 force_active_layer_visible = ( menuId == ID_SHOW_NO_LAYERS_BUT_ACTIVE ||
228
229 // Update icons and check boxes
230 rowCount = GetLayerRowCount();
231
232 for( int row = 0; row < rowCount; ++row )
233 {
234 wxCheckBox* cb = (wxCheckBox*) getLayerComp( row, COLUMN_COLOR_LYR_CB );
235 layer = getDecodedId( cb->GetId() );
236 bool loc_visible = visible;
237
238 if( force_active_layer_visible && (layer == m_frame->GetActiveLayer() ) )
239 loc_visible = true;
240
241 cb->SetValue( loc_visible );
242 visibleLayers[ layer ] = loc_visible;
243 }
244
245 m_frame->SetVisibleLayers( visibleLayers );
246 m_frame->GetCanvas()->Refresh();
247 break;
248
250 m_frame->SortLayersByX2Attributes();
251 break;
252
254 m_frame->SortLayersByFileExtension();
255 break;
256
258 m_frame->SetLayerDrawPrms();
259 break;
260
261 case ID_LAYER_MOVE_UP:
262 m_frame->GetToolManager()->RunAction( GERBVIEW_ACTIONS::moveLayerUp );
263 break;
264
266 m_frame->GetToolManager()->RunAction( GERBVIEW_ACTIONS::moveLayerDown );
267 break;
268
269 case ID_LAYER_DELETE:
270 m_frame->Erase_Current_DrawLayer( false );
271
272 break;
273 }
274}
275
277{
279 return false;
280
281 // postprocess after active layer selection ensure active layer visible
282 wxCommandEvent event;
284 onPopupSelection( event );
285 return true;
286}
287
288
290{
292
293 Freeze();
294
295 for( int layer = 0; layer < GERBER_DRAWLAYERS_COUNT; ++layer )
296 {
297 // Don't show inactive layers
298 if ( GetImagesList()->GetGbrImage(layer) == nullptr )
299 continue;
300
301 int aRow = findLayerRow( layer );
302 bool visible = true;
303 COLOR4D color = m_frame->GetLayerColor( GERBER_DRAW_LAYER( layer ) );
304 wxString msg = GetImagesList()->GetDisplayName( layer,
305 /* include layer number */ false,
306 /* Get the full name */ true );
307
308 if( m_frame->GetCanvas() )
309 visible = m_frame->GetCanvas()->GetView()->IsLayerVisible( GERBER_DRAW_LAYER( layer ) );
310 else
311 visible = m_frame->IsLayerVisible( layer );
312
313 if( aRow >= 0 )
314 {
315 updateLayerRow( findLayerRow( layer ), msg );
316 SetLayerVisible( layer, visible );
317 }
318 else
319 {
320 AppendLayerRow( LAYER_WIDGET::ROW( msg, layer, color, wxEmptyString, visible, true ) );
321 }
322 }
323
325 Thaw();
326}
327
328
330{
331 AddRightClickMenuItems( &aMenu );
332}
333
334
335void GERBER_LAYER_WIDGET::OnLayerColorChange( int aLayer, const COLOR4D& aColor )
336{
337 // NOTE: Active layer in GerbView is stored as 0-indexed, but layer color is
338 // stored according to the GERBER_DRAW_LAYER() offset.
339 m_frame->SetLayerColor( GERBER_DRAW_LAYER( aLayer ), aColor );
340
341 KIGFX::VIEW* view = m_frame->GetCanvas()->GetView();
342 COLOR_SETTINGS* color_settings = m_frame->GetColorSettings();
343 color_settings->SetColor( aLayer, aColor );
344
345 view->GetPainter()->GetSettings()->LoadColors( color_settings );
346 view->UpdateLayerColor( GERBER_DRAW_LAYER( aLayer ) );
347
348 m_frame->GetCanvas()->Refresh();
349}
350
351
353{
354 // the layer change from the GERBER_LAYER_WIDGET can be denied by returning
355 // false from this function.
356 int layer = m_frame->GetActiveLayer();
357
358 m_frame->SetActiveLayer( aLayer, false );
359 m_frame->syncLayerBox();
360
361 if( layer != m_frame->GetActiveLayer() )
362 {
363 if( ! OnLayerSelected() )
364 {
365 auto settings = static_cast<KIGFX::GERBVIEW_PAINTER*>
366 ( m_frame->GetCanvas()->GetView()->GetPainter() )->GetSettings();
367 int dcodeSelected = m_frame->m_DCodeSelector->GetSelectedDCodeId();
368 settings->m_dcodeHighlightValue = dcodeSelected;
369 m_frame->GetCanvas()->GetView()->UpdateAllItems( KIGFX::COLOR );
370 m_frame->GetCanvas()->Refresh();
371 }
372 }
373
374 return true;
375}
376
377
378void GERBER_LAYER_WIDGET::OnLayerVisible( int aLayer, bool isVisible, bool isFinal )
379{
380 LSET visibleLayers = m_frame->GetVisibleLayers();
381
382 visibleLayers[ aLayer ] = isVisible;
383
384 m_frame->SetVisibleLayers( visibleLayers );
385
386 if( isFinal )
387 m_frame->GetCanvas()->Refresh();
388}
389
390
392{
393 m_frame->SetVisibleElementColor( aId, aColor );
394
395 auto view = m_frame->GetCanvas()->GetView();
396
397 COLOR_SETTINGS* color_settings = m_frame->GetColorSettings();
398 color_settings->SetColor( aId, aColor );
399
400 view->GetPainter()->GetSettings()->LoadColors( color_settings );
401 view->UpdateLayerColor( aId );
402 view->MarkTargetDirty( KIGFX::TARGET_NONCACHED );
403 view->UpdateAllItems( KIGFX::COLOR );
404 m_frame->GetCanvas()->Refresh();
405}
406
407
408void GERBER_LAYER_WIDGET::OnRenderEnable( int aId, bool isEnabled )
409{
410 m_frame->SetElementVisibility( aId, isEnabled );
411
412 if( m_frame->GetCanvas() )
413 {
414 if( aId == LAYER_GERBVIEW_GRID )
415 {
416 m_frame->GetCanvas()->GetGAL()->SetGridVisibility( m_frame->IsGridVisible() );
417 m_frame->GetCanvas()->GetView()->MarkTargetDirty( KIGFX::TARGET_NONCACHED );
418 }
419 else
420 {
421 m_frame->GetCanvas()->GetView()->SetLayerVisible( aId, isEnabled );
422 }
423 }
424
425 m_frame->GetCanvas()->Refresh();
426}
#define RR
Render Row abbreviation to reduce source width.
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition arraydim.h:27
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition bitmap.cpp:100
@ show_all_layers
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:398
Color settings are a bit different than most of the settings objects in that there can be more than o...
void SetColor(int aLayer, const COLOR4D &aColor)
GERBER_FILE_IMAGE_LIST is a helper class to handle a list of GERBER_FILE_IMAGE files which are loaded...
static GERBER_FILE_IMAGE_LIST & GetImagesList()
const wxString GetDisplayName(int aIdx, bool aNameOnly=false, bool aFullName=false)
Get the display name for the layer at aIdx.
GERBER_FILE_IMAGE_LIST * GetImagesList()
void OnRenderEnable(int aId, bool isEnabled) override
Notify client code whenever the user changes an rendering enable in one of the rendering checkboxes.
void onPopupSelection(wxCommandEvent &event)
bool OnLayerSelect(int aLayer) override
Notify client code whenever the user selects a different layer.
void OnLayerRightClick(wxMenu &aMenu) override
Notify client code about a layer being right-clicked.
void onRightDownLayers(wxMouseEvent &event)
Put up a popup menu for the layer panel.
void OnLayerVisible(int aLayer, bool isVisible, bool isFinal) override
Notify client code about a layer visibility change.
void CollectCurrentColorSettings(COLOR_SETTINGS *aColorSettings)
Collect the current color settings and put it in aColorSettings.
void SetLayersManagerTabsText()
Update the layer manager tabs labels.
void AddRightClickMenuItems(wxMenu *aMenu)
Add menu items to a menu that should be shown when right-clicking the Gerber layer widget.
bool OnLayerSelected()
Ensure the active layer is visible, and other layers not visible when m_alwaysShowActiveLayer is true...
GERBER_LAYER_WIDGET(GERBVIEW_FRAME *aParent, wxWindow *aFocusOwner)
void OnLayerColorChange(int aLayer, const COLOR4D &aColor) override
Notify client code about a layer color change.
void OnRenderColorChange(int aId, const COLOR4D &aColor) override
Notify client code whenever the user changes a rendering color.
void ReFillRender()
Rebuild Render for instance after the config is read.
void ReFill()
Rebuild Render for instance after the config is read.
static TOOL_ACTION moveLayerUp
static TOOL_ACTION moveLayerDown
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
Methods for drawing GerbView specific items.
virtual GERBVIEW_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
virtual void LoadColors(const COLOR_SETTINGS *aSettings)
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:63
void UpdateLayerColor(int aLayer)
Apply the new coloring scheme held by RENDER_SETTINGS in case that it has changed.
Definition view.cpp:823
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition view.h:225
static int getDecodedId(int aControlId)
Decode aControlId to original un-encoded value.
void AppendRenderRows(const ROW *aRowsArray, int aRowCount)
Append new rows in the render portion of the widget.
LAYER_WIDGET(wxWindow *aParent, wxWindow *aFocusOwner, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL)
int GetLayerRowCount() const
Return the number of rows in the layer tab.
void passOnFocus()
Give away the keyboard focus up to the main parent window.
COLOR4D GetRenderColor(int aRow) const
Return the color of the Render ROW in position aRow.
void updateLayerRow(int aRow, const wxString &aName)
int findLayerRow(int aLayer) const
Return the row index that aLayer resides in, or -1 if not found.
int findRenderRow(int aId) const
void SetLayerVisible(int aLayer, bool isVisible)
Set aLayer visible or not.
void ClearLayerRows()
Empty out the layer rows.
wxWindow * getLayerComp(int aRow, int aColumn) const
Return the component within the m_LayersFlexGridSizer at aRow and aCol or NULL if these parameters ar...
void AppendLayerRow(const ROW &aRow)
Append a new row in the layer portion of the widget.
void ClearRenderRows()
Empty out the render rows.
COLOR4D GetLayerColor(int aLayer) const
Return the color of the layer ROW associated with aLayer id.
wxNotebook * m_notebook
wxScrolledWindow * m_LayerScrolledWindow
LSET is a set of PCB_LAYER_IDs.
Definition lset.h:37
@ WHITE
Definition color4d.h:44
@ DARKGRAY
Definition color4d.h:42
@ DARKRED
Definition color4d.h:49
@ BLACK
Definition color4d.h:40
#define _(s)
@ LAYER_GERBVIEW_DRAWINGSHEET
Definition layer_ids.h:532
@ GERBVIEW_LAYER_ID_START
Definition layer_ids.h:522
@ LAYER_GERBVIEW_BACKGROUND
Definition layer_ids.h:531
@ LAYER_DCODES
Definition layer_ids.h:527
@ LAYER_NEGATIVE_OBJECTS
Definition layer_ids.h:528
@ LAYER_GERBVIEW_PAGE_LIMITS
Definition layer_ids.h:533
@ LAYER_GERBVIEW_GRID
Definition layer_ids.h:529
#define GERBER_DRAWLAYERS_COUNT
Number of draw layers in Gerbview.
Definition layer_ids.h:517
#define GERBER_DRAW_LAYER(x)
Definition layer_ids.h:538
#define COLUMN_COLOR_LYR_CB
@ COLOR
Color has changed.
Definition view_item.h:50
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
Definition definitions.h:34
KICOMMON_API wxMenuItem * AddMenuItem(wxMenu *aMenu, int aId, const wxString &aText, const wxBitmapBundle &aImage, wxItemKind aType=wxITEM_NORMAL)
Create and insert a menu item with an icon into aMenu.
Provide all the data needed to add a row to a LAYER_WIDGET.
COLOR4D color
COLOR4D::UNSPECIFIED if none.
bool state
initial wxCheckBox state