KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sel_layer.cpp
Go to the documentation of this file.
1
5/*
6 * This program source code file is part of KiCad, a free EDA CAD application.
7 *
8 * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
9 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
10 *
11 * This program is free software: you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the
13 * Free Software Foundation, either version 3 of the License, or (at your
14 * option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program. If not, see <http://www.gnu.org/licenses/>.
23 */
24
25#include <wx/bitmap.h>
26
27#include <kiplatform/ui.h>
28#include <confirm.h>
29#include <lset.h>
30#include <board.h>
31#include <pgm_base.h>
32#include <project.h>
33#include <pcb_base_frame.h>
36#include <layer_pairs.h>
39#include <router/router_tool.h>
42#include <tools/pcb_actions.h>
46#include <widgets/wx_grid.h>
49
50
51// Column position by function:
52#define SELECT_COLNUM 0
53#define COLOR_COLNUM 1
54#define LAYERNAME_COLNUM 2
55#define LAYER_HK_COLUMN 3
56
57
59{
60}
61
63{
64 if( m_boardFrame )
65 {
66 return m_boardFrame->GetColorSettings()->GetColor( aLayer );
67 }
68 else
69 {
70 FOOTPRINT_EDITOR_SETTINGS* cfg = GetAppSettings<FOOTPRINT_EDITOR_SETTINGS>( "fpedit" );
72
73 return current->GetColor( aLayer );
74 }
75}
76
77wxString PCB_LAYER_PRESENTATION::getLayerName( int aLayer ) const
78{
79 if( m_boardFrame )
80 return m_boardFrame->GetBoard()->GetLayerName( ToLAYER_ID( aLayer ) );
81 else
82 return BOARD::GetStandardLayerName( ToLAYER_ID( aLayer ) );
83}
84
86{
88}
89
91{
92 const wxString layerAName = getLayerName( aPair.GetLayerA() );
93 const wxString layerBName = getLayerName( aPair.GetLayerB() );
94
95 return layerAName + wxT( " / " ) + layerBName;
96}
97
98
103{
104public:
105 PCB_ONE_LAYER_SELECTOR( PCB_BASE_FRAME* aParent, PCB_LAYER_ID aDefaultLayer,
106 LSET aNotAllowedLayersMask, bool aHideCheckBoxes = false );
108
110
111private:
112 // Event handlers
113 void OnLeftGridCellClick( wxGridEvent& aEvent ) override;
114 void OnRightGridCellClick( wxGridEvent& aEvent ) override;
115 void OnMouseMove( wxUpdateUIEvent& aEvent ) override;
116
117 // Will close the dialog on ESC key
118 void onCharHook( wxKeyEvent& event );
119
120 wxString getLayerHotKey( PCB_LAYER_ID aLayer ) const
121 {
122 int code = PCB_ACTIONS::LayerIDToAction( aLayer )->GetHotKey();
123 return AddHotkeyName( wxS( "" ), code, IS_COMMENT );
124 }
125
126 void buildList();
127
131 std::vector<PCB_LAYER_ID> m_layersIdLeftColumn;
132 std::vector<PCB_LAYER_ID> m_layersIdRightColumn;
133};
134
135
137 LSET aNotAllowedLayersMask, bool aHideCheckBoxes ) :
138 DIALOG_LAYER_SELECTION_BASE( aParent ), m_layerPresentation( aParent )
139{
140 m_useCalculatedSize = true;
141
142 m_layerSelected = aDefaultLayer;
143 m_notAllowedLayersMask = aNotAllowedLayersMask;
144
145 m_leftGridLayers->SetCellHighlightPenWidth( 0 );
146 m_rightGridLayers->SetCellHighlightPenWidth( 0 );
147 m_leftGridLayers->SetColFormatBool( SELECT_COLNUM );
148 m_rightGridLayers->SetColFormatBool( SELECT_COLNUM );
149
150 m_leftGridLayers->AppendCols( 1 );
151
152 buildList();
153
154 if( aHideCheckBoxes )
155 {
158 }
159
160 Connect( wxEVT_CHAR_HOOK, wxKeyEventHandler( PCB_ONE_LAYER_SELECTOR::onCharHook ) );
161
162 Layout();
163 GetSizer()->SetSizeHints( this );
164 SetFocus();
165}
166
167
169{
170 Disconnect( wxEVT_CHAR_HOOK, wxKeyEventHandler( PCB_ONE_LAYER_SELECTOR::onCharHook ) );
171}
172
173
174void PCB_ONE_LAYER_SELECTOR::OnMouseMove( wxUpdateUIEvent& aEvent )
175{
179
180 wxPoint mouse_pos = KIPLATFORM::UI::GetMousePosition();
181 wxPoint left_pos = m_leftGridLayers->ScreenToClient( mouse_pos );
182 wxPoint right_pos = m_rightGridLayers->ScreenToClient( mouse_pos );
183
184 if( m_leftGridLayers->HitTest( left_pos ) == wxHT_WINDOW_INSIDE )
185 {
186 int row = m_leftGridLayers->YToRow( left_pos.y );
187
188 if( row != wxNOT_FOUND && row < static_cast<int>( m_layersIdLeftColumn.size() ) )
189 {
191 m_leftGridLayers->SelectBlock( row, LAYERNAME_COLNUM, row, LAYER_HK_COLUMN );
192 return;
193 }
194 }
195
196 if( m_rightGridLayers->HitTest( right_pos ) == wxHT_WINDOW_INSIDE )
197 {
198 int row = m_rightGridLayers->YToRow( right_pos.y );
199
200 if( row == wxNOT_FOUND || row >= static_cast<int>( m_layersIdRightColumn.size() ) )
201 return;
202
204 m_rightGridLayers->SelectBlock( row, LAYERNAME_COLNUM, row, LAYERNAME_COLNUM );
205 }
206}
207
208
209void PCB_ONE_LAYER_SELECTOR::onCharHook( wxKeyEvent& event )
210{
211 if( event.GetKeyCode() == WXK_ESCAPE )
212 Close();
213}
214
215
217{
219 int left_row = 0;
220 int right_row = 0;
221 wxString layername;
222
224 {
225 if( m_notAllowedLayersMask[layerid] )
226 continue;
227
228 wxColour fg = m_layerPresentation.getLayerColor( layerid ).ToColour();
229 wxColour color( wxColour::AlphaBlend( fg.Red(), bg.Red(), fg.Alpha() / 255.0 ),
230 wxColour::AlphaBlend( fg.Green(), bg.Green(), fg.Alpha() / 255.0 ),
231 wxColour::AlphaBlend( fg.Blue(), bg.Blue(), fg.Alpha() / 255.0 ) );
232
233 layername = wxT( " " ) + m_layerPresentation.getLayerName( layerid );
234
235 if( IsCopperLayer( layerid ) )
236 {
237 if( left_row )
238 m_leftGridLayers->AppendRows( 1 );
239
240 m_leftGridLayers->SetCellBackgroundColour( left_row, COLOR_COLNUM, color );
241 m_leftGridLayers->SetCellValue( left_row, LAYERNAME_COLNUM, layername );
242 m_leftGridLayers->SetCellValue( left_row, LAYER_HK_COLUMN, getLayerHotKey( layerid ) );
243
244 if( m_layerSelected == layerid )
245 m_leftGridLayers->SetCellValue( left_row, SELECT_COLNUM, wxT( "1" ) );
246
247 m_layersIdLeftColumn.push_back( layerid );
248 left_row++;
249 }
250 else
251 {
252 if( right_row )
253 m_rightGridLayers->AppendRows( 1 );
254
255 m_rightGridLayers->SetCellBackgroundColour( right_row, COLOR_COLNUM, color );
256 m_rightGridLayers->SetCellValue( right_row, LAYERNAME_COLNUM, layername );
257
258 if( m_layerSelected == layerid )
259 m_rightGridLayers->SetCellValue( right_row, SELECT_COLNUM, wxT( "1" ) );
260
261 m_layersIdRightColumn.push_back( layerid );
262 right_row++;
263 }
264 }
265
266 // Show only populated lists:
267 if( left_row <= 0 )
268 m_leftGridLayers->Show( false );
269
270 if( right_row <= 0 )
271 m_rightGridLayers->Show( false );
272
273 // Now fix min grid column size (it also sets a minimal size)
274 m_leftGridLayers->AutoSizeColumns();
275 m_rightGridLayers->AutoSizeColumns();
276}
277
278
280{
281 m_layerSelected = m_layersIdLeftColumn[event.GetRow()];
282
283 if( IsQuasiModal() )
284 EndQuasiModal( 1 );
285 else
286 EndDialog( 1 );
287}
288
289
291{
292 m_layerSelected = m_layersIdRightColumn[event.GetRow()];
293
294 if( IsQuasiModal() )
295 EndQuasiModal( 2 );
296 else
297 EndDialog( 2 );
298}
299
300
302 const LSET& aNotAllowedLayersMask,
303 wxPoint aDlgPosition )
304{
305 PCB_ONE_LAYER_SELECTOR dlg( this, aDefaultLayer, aNotAllowedLayersMask, true );
306
307 if( aDlgPosition != wxDefaultPosition )
308 {
309 wxSize dlgSize = dlg.GetSize();
310 aDlgPosition.x -= dlgSize.x / 2;
311 aDlgPosition.y -= dlgSize.y / 2;
312 dlg.SetPosition( aDlgPosition );
313 }
314
315 if( dlg.ShowModal() != wxID_CANCEL )
316 return ToLAYER_ID( dlg.GetLayerSelection() );
317 else
318 return UNDEFINED_LAYER;
319}
320
321
327{
328 enum class COLNUMS
329 {
330 ENABLED,
331 SWATCH,
333 USERNAME,
334 };
335
336public:
338 LAYER_PAIR_SETTINGS& aLayerPairSettings ) :
339 m_layerPresentation( aPresentation ), m_grid( aGrid ),
340 m_layerPairSettings( aLayerPairSettings )
341 {
342 wxASSERT_MSG( m_grid.GetNumberRows() == 0, "Grid should be empty at controller start" );
343
346
347 m_grid.Bind( wxEVT_GRID_CELL_CHANGED,
348 [this]( wxGridEvent& aEvent )
349 {
350 const int col = aEvent.GetCol();
351 const int row = aEvent.GetRow();
352 if( col == (int) COLNUMS::USERNAME )
353 {
354 onUserNameChanged( row, m_grid.GetCellValue( row, col ) );
355 }
356 else if( col == (int) COLNUMS::ENABLED )
357 {
358 onEnableChanged( row, m_grid.GetCellValue( row, col ) == wxS( "1" ) );
359 }
360 } );
361
362 m_grid.Bind( wxEVT_GRID_CELL_LEFT_DCLICK,
363 [&]( wxGridEvent& aEvent )
364 {
365 const int row = aEvent.GetRow();
366 const int col = aEvent.GetCol();
367
368 if( col == (int) COLNUMS::LAYERNAMES || col == (int) COLNUMS::SWATCH )
369 {
370 onPairActivated( row );
371 }
372 } );
373
375 std::make_unique<WX_GRID_AUTOSIZER>( m_grid,
377 { (int) COLNUMS::LAYERNAMES, 72 },
378 { (int) COLNUMS::USERNAME, 72 },
379 },
380 (int) COLNUMS::USERNAME );
381 }
382
383 void OnLayerPairAdded( const LAYER_PAIR& aLayerPair )
384 {
385 LAYER_PAIR_INFO layerPairInfo{ aLayerPair, true, std::nullopt };
386
387 const bool added = m_layerPairSettings.AddLayerPair( layerPairInfo );
388
389 if( added )
390 {
391 m_grid.AppendRows( 1 );
392 fillRowFromLayerPair( m_grid.GetNumberRows() - 1, layerPairInfo );
393 }
394 }
395
397 {
399 [&]( int row )
400 {
401 const LAYER_PAIR_INFO& layerPairInfo = m_layerPairSettings.GetLayerPairs()[row];
402
403 if( m_layerPairSettings.RemoveLayerPair( layerPairInfo.GetLayerPair() ) )
404 m_grid.DeleteRows( row );
405 } );
406 }
407
408private:
410 {
411 m_grid.UseNativeColHeader( true );
412
413 m_grid.SetCellHighlightPenWidth( 0 );
414 m_grid.SetColFormatBool( (int) COLNUMS::ENABLED );
415
416 m_grid.SetSelectionMode( wxGrid::wxGridSelectionModes::wxGridSelectRows );
417
418 m_grid.AutoSizeColumn( (int) COLNUMS::USERNAME );
419 }
420
422 {
423 std::span<const LAYER_PAIR_INFO> storePairs = m_layerPairSettings.GetLayerPairs();
424
425 m_grid.AppendRows( storePairs.size() );
426
427 int row = 0;
428 for( const LAYER_PAIR_INFO& layerPairInfo : storePairs )
429 {
430 fillRowFromLayerPair( row, layerPairInfo );
431 row++;
432 }
433 }
434
435 void fillRowFromLayerPair( int aRow, const LAYER_PAIR_INFO& aLayerPairInfo )
436 {
437 wxASSERT_MSG( aRow < m_grid.GetNumberRows(), "Row index out of bounds" );
438
439 const LAYER_PAIR& layerPair = aLayerPairInfo.GetLayerPair();
440
441 const wxString layerNames = m_layerPresentation.getLayerPairName( layerPair );
442
443 m_grid.SetCellValue( aRow, (int) COLNUMS::LAYERNAMES, layerNames );
444
445 const std::optional<wxString> userName = aLayerPairInfo.GetName();
446 if( userName )
447 {
448 m_grid.SetCellValue( aRow, (int) COLNUMS::USERNAME, *userName );
449 }
450
451 m_grid.SetCellValue( aRow, (int) COLNUMS::ENABLED,
452 aLayerPairInfo.IsEnabled() ? wxT( "1" ) : wxT( "0" ) );
453
454 // Set the color swatch
455 std::unique_ptr<wxBitmap>& swatch =
457 layerPair.GetLayerA(), layerPair.GetLayerB(), KiIconScale( &m_grid ) ) );
458
459 m_grid.SetCellRenderer( aRow, (int) COLNUMS::SWATCH,
460 new GRID_CELL_ICON_RENDERER( *swatch ) );
461
462 m_grid.SetReadOnly( aRow, (int) COLNUMS::SWATCH );
463 m_grid.SetReadOnly( aRow, (int) COLNUMS::LAYERNAMES );
464 }
465
466 void onUserNameChanged( int aRow, const wxString& aNewValue )
467 {
469 changedPair.SetName( aNewValue );
470 }
471
472 void onEnableChanged( int aRow, bool aNewValue )
473 {
475 changedPair.SetEnabled( aNewValue );
476 }
477
478 void onPairActivated( int aRow )
479 {
480 const LAYER_PAIR_INFO& layerPairInfo = m_layerPairSettings.GetLayerPairs()[aRow];
481 const LAYER_PAIR& layerPair = layerPairInfo.GetLayerPair();
482
484 }
485
489
490 // Lifetime managment of the swatches
491 std::vector<std::unique_ptr<wxBitmap>> m_swatches;
492
493 std::unique_ptr<WX_GRID_AUTOSIZER> m_autosizer;
494};
495
496
502{
504 {
505 SELECT = 0,
506 COLOR = 1,
507 LAYERNAME = 2,
508 };
509
510public:
511 COPPER_LAYERS_PAIR_SELECTION_UI( wxGrid& aLeftGrid, wxGrid& aRightGrid,
512 PCB_LAYER_PRESENTATION& aPresentation,
513 LAYER_PAIR_SETTINGS& aLayerPairSettings ) :
514 m_layerPresentation( aPresentation ), m_layerPairSettings( aLayerPairSettings ),
515 m_leftGrid( aLeftGrid ), m_rightGrid( aRightGrid )
516 {
519
521 {
522 if( IsCopperLayer( layerId ) )
523 m_layersId.push_back( layerId );
524 }
525
528
529 m_leftGrid.Bind( wxEVT_GRID_CELL_LEFT_CLICK,
530 [this]( wxGridEvent& aEvent )
531 {
532 onLeftGridRowSelected( aEvent.GetRow() );
533 } );
534
535 m_rightGrid.Bind( wxEVT_GRID_CELL_LEFT_CLICK,
536 [this]( wxGridEvent& aEvent )
537 {
538 onRightGridRowSelected( aEvent.GetRow() );
539 } );
540
541 m_layerPairSettings.Bind( PCB_CURRENT_LAYER_PAIR_CHANGED,
542 [this]( wxCommandEvent& aEvent )
543 {
546 rowForLayer( newPair.GetLayerB() ) );
547 } );
548 }
549
550private:
551 void configureGrid( wxGrid& aGrid )
552 {
553 aGrid.SetCellHighlightPenWidth( 0 );
554 aGrid.SetColFormatBool( (int) CU_LAYER_COLNUMS::SELECT );
555 }
556
557 void fillLayerGrid( wxGrid& aGrid )
558 {
560
561 aGrid.AppendRows( m_layersId.size() - 1 );
562
563 int row = 0;
564 for( const PCB_LAYER_ID& layerId : m_layersId )
565 {
566 const wxColour fg = m_layerPresentation.getLayerColor( layerId ).ToColour();
567 const wxColour color( wxColour::AlphaBlend( fg.Red(), bg.Red(), fg.Alpha() / 255.0 ),
568 wxColour::AlphaBlend( fg.Green(), bg.Green(), fg.Alpha() / 255.0 ),
569 wxColour::AlphaBlend( fg.Blue(), bg.Blue(), fg.Alpha() / 255.0 ) );
570
571 const wxString layerName = wxT( " " ) + m_layerPresentation.getLayerName( layerId );
572
573 aGrid.SetCellBackgroundColour( row, (int) CU_LAYER_COLNUMS::COLOR, color );
574 aGrid.SetCellValue( row, (int) CU_LAYER_COLNUMS::LAYERNAME, layerName );
575
576 row++;
577 };
578
579 // Now fix min grid layer name column size (it also sets a minimal size)
580 aGrid.AutoSizeColumn( (int) CU_LAYER_COLNUMS::LAYERNAME );
581 }
582
583 PCB_LAYER_ID layerForRow( int aRow ) { return m_layersId.at( aRow ); }
584
585 int rowForLayer( PCB_LAYER_ID aLayerId )
586 {
587 for( unsigned i = 0; i < m_layersId.size(); ++i )
588 {
589 if( m_layersId[i] == aLayerId )
590 return i;
591 }
592
593 wxASSERT_MSG( false, wxString::Format( "Unknown layer in grid: %d", aLayerId ) );
594 return 0;
595 }
596
597 void onLeftGridRowSelected( int aRow )
598 {
599 LAYER_PAIR newPair{
600 layerForRow( aRow ),
602 };
605 }
606
607 void onRightGridRowSelected( int aRow )
608 {
609 LAYER_PAIR newPair{
611 layerForRow( aRow ),
612 };
615 }
616
623 void setCurrentSelection( int aLeftRow, int aRightRow )
624 {
625 const auto selectGridRow = []( wxGrid& aGrid, int aRow, bool aSelect )
626 {
627 // At start, there is no old row
628 if( aRow < 0 )
629 return;
630
631 const wxString val = aSelect ? wxT( "1" ) : wxEmptyString;
632 aGrid.SetCellValue( aRow, (int) CU_LAYER_COLNUMS::SELECT, val );
633 aGrid.SetGridCursor( aRow, (int) CU_LAYER_COLNUMS::COLOR );
634 };
635
636 if( m_leftCurrRow != aLeftRow )
637 {
638 selectGridRow( m_leftGrid, m_leftCurrRow, false );
639 selectGridRow( m_leftGrid, aLeftRow, true );
640 m_leftCurrRow = aLeftRow;
641 }
642
643 if( m_rightCurrRow != aRightRow )
644 {
645 selectGridRow( m_rightGrid, m_rightCurrRow, false );
646 selectGridRow( m_rightGrid, aRightRow, true );
647 m_rightCurrRow = aRightRow;
648 }
649 }
650
653 std::vector<PCB_LAYER_ID> m_layersId;
654 wxGrid& m_leftGrid;
655 wxGrid& m_rightGrid;
656
659};
660
661
669{
670public:
672 LAYER_PAIR_SETTINGS& aBoardSettings ) :
674 m_boardPairSettings( aBoardSettings ), m_dialogPairSettings( aBoardSettings ),
675 m_layerPresentation( &aParent ),
679 {
680 m_addToPresetsButton->SetBitmap( KiBitmapBundle( BITMAPS::right ) );
681 m_deleteRowButton->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
682
683 m_addToPresetsButton->Bind( wxEVT_BUTTON,
684 [this]( wxCommandEvent& aEvent )
685 {
688 } );
689
690 m_deleteRowButton->Bind( wxEVT_BUTTON,
691 [this]( wxCommandEvent& aEvent )
692 {
694 } );
695
696 SetFocus();
697
698 GetSizer()->SetSizeHints( this );
699 Center();
700 }
701
702 bool TransferDataToWindow() override
703 {
704 m_presetsGrid->Freeze();
705 m_leftGridLayers->Freeze();
706 m_rightGridLayers->Freeze();
707
709
710 m_rightGridLayers->Thaw();
711 m_leftGridLayers->Thaw();
712 m_presetsGrid->Thaw();
713 return true;
714 }
715
717 {
718 // Pull out the dialog's stored pairs
719 std::span<const LAYER_PAIR_INFO> storePairs = m_dialogPairSettings.GetLayerPairs();
720
723
724 return true;
725 }
726
727private:
728 // The BOARD's pair store to be updated
730 // A local copy while we modify it
732 // Information about the layer presentation (colors, etc)
734 // UI controllers
737};
738
739
741{
742 LAYER_PAIR_SETTINGS* const boardSettings = frame()->GetLayerPairSettings();
743
744 if( !boardSettings )
745 {
746 // Should only be used for suitable frame types with layer pairs
747 wxASSERT_MSG( false, "Could not access layer pair settings" );
748 return 0;
749 }
750
751 SELECT_COPPER_LAYERS_PAIR_DIALOG dlg( *frame(), *boardSettings );
752
753 if( dlg.ShowModal() == wxID_OK )
754 {
755 const LAYER_PAIR layerPair = boardSettings->GetCurrentLayerPair();
756
757 // select the same layer for both layers is allowed (normal in some boards)
758 // but could be a mistake. So display an info message
759 if( layerPair.GetLayerA() == layerPair.GetLayerB() )
760 {
761 DisplayInfoMessage( frame(), _( "Warning: top and bottom layers are same." ) );
762 }
763 }
764
765 return 0;
766}
int color
Definition: DXF_plotter.cpp:63
int KiIconScale(wxWindow *aWindow)
Return the automatic scale factor that would be used for a given window by KiScaledBitmap and KiScale...
Definition: bitmap.cpp:122
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition: bitmap.cpp:110
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:236
static wxString GetStandardLayerName(PCB_LAYER_ID aLayerId)
Return an "English Standard" name of a PCB layer when given aLayerNumber.
Definition: board.h:839
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:680
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:907
Color settings are a bit different than most of the settings objects in that there can be more than o...
COLOR4D GetColor(int aLayer) const
Class that manages the UI for the copper layer pair presets list based on an injected layer pair stor...
Definition: sel_layer.cpp:327
void onPairActivated(int aRow)
Definition: sel_layer.cpp:478
void onUserNameChanged(int aRow, const wxString &aNewValue)
Definition: sel_layer.cpp:466
std::vector< std::unique_ptr< wxBitmap > > m_swatches
Definition: sel_layer.cpp:491
COPPER_LAYERS_PAIR_PRESETS_UI(WX_GRID &aGrid, PCB_LAYER_PRESENTATION &aPresentation, LAYER_PAIR_SETTINGS &aLayerPairSettings)
Definition: sel_layer.cpp:337
LAYER_PAIR_SETTINGS & m_layerPairSettings
Definition: sel_layer.cpp:488
void OnLayerPairAdded(const LAYER_PAIR &aLayerPair)
Definition: sel_layer.cpp:383
void fillRowFromLayerPair(int aRow, const LAYER_PAIR_INFO &aLayerPairInfo)
Definition: sel_layer.cpp:435
void onEnableChanged(int aRow, bool aNewValue)
Definition: sel_layer.cpp:472
std::unique_ptr< WX_GRID_AUTOSIZER > m_autosizer
Definition: sel_layer.cpp:493
PCB_LAYER_PRESENTATION & m_layerPresentation
Definition: sel_layer.cpp:486
Class that manages the UI for the copper layer pair selection (left and right grids).
Definition: sel_layer.cpp:502
void setCurrentSelection(int aLeftRow, int aRightRow)
Set the current layer selection.
Definition: sel_layer.cpp:623
void onRightGridRowSelected(int aRow)
Definition: sel_layer.cpp:607
COPPER_LAYERS_PAIR_SELECTION_UI(wxGrid &aLeftGrid, wxGrid &aRightGrid, PCB_LAYER_PRESENTATION &aPresentation, LAYER_PAIR_SETTINGS &aLayerPairSettings)
Definition: sel_layer.cpp:511
PCB_LAYER_PRESENTATION & m_layerPresentation
Definition: sel_layer.cpp:651
void configureGrid(wxGrid &aGrid)
Definition: sel_layer.cpp:551
void fillLayerGrid(wxGrid &aGrid)
Definition: sel_layer.cpp:557
int rowForLayer(PCB_LAYER_ID aLayerId)
Definition: sel_layer.cpp:585
LAYER_PAIR_SETTINGS & m_layerPairSettings
Definition: sel_layer.cpp:652
PCB_LAYER_ID layerForRow(int aRow)
Definition: sel_layer.cpp:583
std::vector< PCB_LAYER_ID > m_layersId
Definition: sel_layer.cpp:653
void onLeftGridRowSelected(int aRow)
Definition: sel_layer.cpp:597
Class DIALOG_COPPER_LAYER_PAIR_SELECTION_BASE.
Class DIALOG_LAYER_SELECTION_BASE.
bool IsQuasiModal() const
Definition: dialog_shim.h:86
bool m_useCalculatedSize
Definition: dialog_shim.h:240
void EndQuasiModal(int retCode)
void SetPosition(const wxPoint &aNewPosition)
Force the position of the dialog to a new position.
int ShowModal() override
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
wxColour ToColour() const
Definition: color4d.cpp:220
All information about a layer pair as stored in the layer pair store.
const LAYER_PAIR & GetLayerPair() const
void SetName(const wxString &aNewName)
const std::optional< wxString > & GetName() const
void SetEnabled(bool aNewEnabled)
Management class for layer pairs in a PCB.
Definition: layer_pairs.h:47
bool AddLayerPair(LAYER_PAIR_INFO aPair)
Definition: layer_pairs.cpp:78
std::span< const LAYER_PAIR_INFO > GetLayerPairs() const
Returns a span of all stored layer pairs.
void SetCurrentLayerPair(const LAYER_PAIR &aPair)
Set the "active" layer pair.
void SetLayerPairs(std::span< const LAYER_PAIR_INFO > aPairs)
Replace the stored layer pairs with the given list.
bool RemoveLayerPair(const LAYER_PAIR &aPair)
Remove the matching layer pair from the store, if present.
const LAYER_PAIR & GetCurrentLayerPair() const
Definition: layer_pairs.h:87
PCB_LAYER_ID GetLayerA() const
PCB_LAYER_ID GetLayerB() const
static std::unique_ptr< wxBitmap > CreateLayerPairIcon(const KIGFX::COLOR4D &aBgColor, const KIGFX::COLOR4D &aTopColor, const KIGFX::COLOR4D &aBottomColor, int aScale)
Create a layer pair "side-by-side swatch" icon.
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
Definition: lseq.h:47
LSET is a set of PCB_LAYER_IDs.
Definition: lset.h:37
LSEQ UIOrder() const
Return the copper, technical and user layers in the order shown in layer widget.
Definition: lset.cpp:733
static TOOL_ACTION * LayerIDToAction(PCB_LAYER_ID aLayerID)
Translate a layer ID into the action that switches to that layer.
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
BOARD * GetBoard() const
PCB_LAYER_ID SelectOneLayer(PCB_LAYER_ID aDefaultLayer, const LSET &aNotAllowedLayersMask=LSET(), wxPoint aDlgPosition=wxDefaultPosition)
Show the dialog box for a layer selection.
Definition: sel_layer.cpp:301
virtual COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
Class that manages the presentation of PCB layers in a PCB frame.
wxString getLayerName(int aLayer) const override
Definition: sel_layer.cpp:77
PCB_LAYER_PRESENTATION(PCB_BASE_FRAME *aFrame)
Definition: sel_layer.cpp:58
LSEQ getOrderedEnabledLayers() const
Definition: sel_layer.cpp:85
COLOR4D getLayerColor(int aLayer) const override
Definition: sel_layer.cpp:62
wxString getLayerPairName(const LAYER_PAIR &aPair) const
Definition: sel_layer.cpp:90
Display a PCB layers list in a dialog to select one layer from this list.
Definition: sel_layer.cpp:103
void OnLeftGridCellClick(wxGridEvent &aEvent) override
Definition: sel_layer.cpp:279
PCB_LAYER_PRESENTATION m_layerPresentation
Definition: sel_layer.cpp:128
void OnRightGridCellClick(wxGridEvent &aEvent) override
Definition: sel_layer.cpp:290
void onCharHook(wxKeyEvent &event)
Definition: sel_layer.cpp:209
std::vector< PCB_LAYER_ID > m_layersIdLeftColumn
Definition: sel_layer.cpp:131
std::vector< PCB_LAYER_ID > m_layersIdRightColumn
Definition: sel_layer.cpp:132
void OnMouseMove(wxUpdateUIEvent &aEvent) override
Definition: sel_layer.cpp:174
PCB_LAYER_ID m_layerSelected
Definition: sel_layer.cpp:129
PCB_ONE_LAYER_SELECTOR(PCB_BASE_FRAME *aParent, PCB_LAYER_ID aDefaultLayer, LSET aNotAllowedLayersMask, bool aHideCheckBoxes=false)
Definition: sel_layer.cpp:136
wxString getLayerHotKey(PCB_LAYER_ID aLayer) const
Definition: sel_layer.cpp:120
T * frame() const
int SelectCopperLayerPair(const TOOL_EVENT &aEvent)
Definition: sel_layer.cpp:740
Display a pair PCB copper layers list in a dialog to select a layer pair from these lists.
Definition: sel_layer.cpp:669
bool TransferDataToWindow() override
Definition: sel_layer.cpp:702
PCB_LAYER_PRESENTATION m_layerPresentation
Definition: sel_layer.cpp:733
LAYER_PAIR_SETTINGS & m_boardPairSettings
Definition: sel_layer.cpp:729
SELECT_COPPER_LAYERS_PAIR_DIALOG(PCB_BASE_FRAME &aParent, LAYER_PAIR_SETTINGS &aBoardSettings)
Definition: sel_layer.cpp:671
COPPER_LAYERS_PAIR_PRESETS_UI m_presetsGridController
Definition: sel_layer.cpp:736
COPPER_LAYERS_PAIR_SELECTION_UI m_pairSelectionController
Definition: sel_layer.cpp:735
bool TransferDataFromWindow() override
Definition: sel_layer.cpp:716
LAYER_PAIR_SETTINGS m_dialogPairSettings
Definition: sel_layer.cpp:731
void SetBitmap(const wxBitmapBundle &aBmp)
int GetHotKey() const
Return the hotkey keycode which initiates the action.
Definition: tool_action.h:348
Generic, UI-independent tool event.
Definition: tool_event.h:168
std::map< int, int > COL_MIN_WIDTHS
Map of column indices to minimum widths.
void OnDeleteRows(const std::function< void(int row)> &aDeleter)
Handles a row deletion event.
Definition: wx_grid.cpp:704
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:222
This file is part of the common library.
#define _(s)
wxString AddHotkeyName(const wxString &aText, int aHotKey, HOTKEY_ACTION_TYPE aStyle)
@ IS_COMMENT
Definition: hotkeys_basic.h:82
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition: layer_ids.h:665
@ LAYER_PCB_BACKGROUND
PCB background color.
Definition: layer_ids.h:280
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:744
wxPoint GetMousePosition()
Returns the mouse position in screen coordinates.
Definition: wxgtk/ui.cpp:683
see class PGM_BASE
#define LAYER_HK_COLUMN
Definition: sel_layer.cpp:55
#define LAYERNAME_COLNUM
Definition: sel_layer.cpp:54
#define SELECT_COLNUM
Definition: sel_layer.cpp:52
#define COLOR_COLNUM
Definition: sel_layer.cpp:53
#define DEFAULT_THEME
COLOR_SETTINGS * GetColorSettings(const wxString &aName)