KiCad PCB EDA Suite
dialog_swap_layers.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) 2018 KiCad Developers, see AUTHORS.txt for contributors.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you may find one here:
18  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19  * or you may search the http://www.gnu.org website for the version 2 license,
20  * or you may write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 #include <pcb_base_edit_frame.h>
25 #include <grid_layer_box_helpers.h>
26 #include <view/view.h>
27 #include <widgets/wx_grid.h>
28 #include <board.h>
29 #include "dialog_swap_layers.h"
30 
31 
32 class LAYER_GRID_TABLE : public wxGridTableBase
33 {
36 
37 public:
38  LAYER_GRID_TABLE( int layerCount ) : m_layerCount( layerCount )
39  { }
40 
41  int GetNumberRows() override { return m_layerCount; }
42  int GetNumberCols() override { return 2; }
43 
44  wxString GetColLabelValue( int aCol ) override
45  {
46  switch( aCol )
47  {
48  case 0: return _( "Move items on:" );
49  case 1: return _( "To layer:" );
50  default: return wxEmptyString;
51  }
52  }
53 
54  wxString GetValue( int row, int col ) override { return "undefined"; }
55  void SetValue( int row, int col, const wxString& value ) override { }
56 
57  long GetValueAsLong( int row, int col ) override
58  {
59  return m_layers[ row ][ col ];
60  }
61 
62  void SetValueAsLong( int row, int col, long value ) override
63  {
64  m_layers[ row ][ col ] = value;
65  }
66 };
67 
68 
70  DIALOG_SWAP_LAYERS_BASE( aParent ),
71  m_parent( aParent ),
72  m_layerDestinations( aArray )
73 {
76  m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
77  m_grid->SetCellHighlightROPenWidth( 0 );
78 
79  m_sdbSizerOK->SetDefault();
80 
82 }
83 
84 
86 {
88 }
89 
90 
92 {
93  LSET enabledCopperLayers = LSET::AllCuMask( m_parent->GetBoard()->GetCopperLayerCount() );
94  int row = 0;
95 
96  for( size_t layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
97  {
98  if( enabledCopperLayers.test( layer ) )
99  {
100  auto attr = new wxGridCellAttr;
101  attr->SetRenderer( new GRID_CELL_LAYER_RENDERER( m_parent ) );
102  attr->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_MENU ) );
103  attr->SetReadOnly();
104  m_grid->SetAttr( row, 0, attr );
105 
106  attr = new wxGridCellAttr;
107  attr->SetRenderer( new GRID_CELL_LAYER_RENDERER( m_parent ) );
108  attr->SetEditor( new GRID_CELL_LAYER_SELECTOR( m_parent, LSET::AllNonCuMask() ) );
109  m_grid->SetAttr( row, 1, attr );
110 
111  m_grid->GetTable()->SetValueAsLong( row, 0, (long) layer );
112  m_grid->GetTable()->SetValueAsLong( row, 1, (long) layer );
113 
114  ++row;
115  }
116  }
117 
118  return true;
119 }
120 
121 
123 {
124  if( !m_grid->CommitPendingChanges() )
125  return false;
126 
127  LSET enabledCopperLayers = LSET::AllCuMask( m_parent->GetBoard()->GetCopperLayerCount() );
128  wxGridTableBase* table = m_grid->GetTable();
129  int row = 0;
130 
131  for( size_t layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
132  {
133  if( enabledCopperLayers.test( layer ) )
134  m_layerDestinations[ layer ] = (PCB_LAYER_ID) table->GetValueAsLong( row++, 1 );
135  else
136  m_layerDestinations[ layer ] = (PCB_LAYER_ID) layer;
137  }
138 
139  return true;
140 }
141 
142 
144 {
145  // Account for scroll bars
146  aWidth -= ( m_grid->GetSize().x - m_grid->GetClientSize().x );
147 
148  m_grid->SetColSize( 0, aWidth / 2 );
149  m_grid->SetColSize( 1, aWidth - m_grid->GetColSize( 0 ) );
150 }
151 
152 
153 void DIALOG_SWAP_LAYERS::OnSize( wxSizeEvent& event )
154 {
155  adjustGridColumns( event.GetSize().GetX() );
156 
157  event.Skip();
158 }
159 
160 
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:750
int GetNumberCols() override
PCB_LAYER_ID * m_layerDestinations
void SetValue(int row, int col, const wxString &value) override
wxString GetColLabelValue(int aCol) override
static LSET AllNonCuMask()
Return a mask holding all layer minus CU layers.
Definition: lset.cpp:773
int m_layers[MAX_CU_LAYERS][2]
LAYER_GRID_TABLE(int layerCount)
void SetTable(wxGridTableBase *table, bool aTakeOwnership=false)
Hide wxGrid's SetTable() method with one which doesn't mess up the grid column widths when setting th...
Definition: wx_grid.cpp:65
wxString GetValue(int row, int col) override
int GetNumberRows() override
void DestroyTable(wxGridTableBase *aTable)
Work-around for a bug in wxGrid which crashes when deleting the table if the cell edit control was no...
Definition: wx_grid.cpp:97
long GetValueAsLong(int row, int col) override
void adjustGridColumns(int aWidth)
PCB_LAYER_ID
A quick note on layer IDs:
LSET is a set of PCB_LAYER_IDs.
Class DIALOG_SWAP_LAYERS_BASE.
#define _(s)
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:180
DIALOG_SWAP_LAYERS(PCB_BASE_EDIT_FRAME *aParent, PCB_LAYER_ID *aArray)
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
Common, abstract interface for edit frames.
int GetCopperLayerCount() const
Definition: board.cpp:453
bool TransferDataFromWindow() override
BOARD * GetBoard() const
void OnSize(wxSizeEvent &event) override
PCB_BASE_EDIT_FRAME * m_parent
bool TransferDataToWindow() override
LAYER_GRID_TABLE * m_gridTable
void SetValueAsLong(int row, int col, long value) override