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:72
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:104
long GetValueAsLong(int row, int col) override
void adjustGridColumns(int aWidth)
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:504
Class DIALOG_SWAP_LAYERS_BASE.
#define MAX_CU_LAYERS
Definition: layer_ids.h:147
#define _(s)
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:190
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.
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:65
int GetCopperLayerCount() const
Definition: board.cpp:455
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