KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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-2024 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 <board.h>
27#include <kiplatform/ui.h>
28#include <widgets/wx_grid.h>
29#include "dialog_swap_layers.h"
30
31
32class LAYER_GRID_TABLE : public wxGridTableBase
33{
36
37public:
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 std::map<PCB_LAYER_ID, PCB_LAYER_ID>& aLayerMap ) :
71 DIALOG_SWAP_LAYERS_BASE( aParent ),
72 m_parent( aParent ),
73 m_layerMap( aLayerMap )
74{
77 m_grid->SetMinSize( FromDIP( m_grid->GetMinSize() ) );
78 m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + FromDIP( 4 ) );
79 m_grid->SetCellHighlightROPenWidth( 0 );
80 m_grid->SetUseNativeColLabels();
81
83
85}
86
87
89{
91}
92
93
95{
96 LSET enabledCopperLayers = LSET::AllCuMask( m_parent->GetBoard()->GetCopperLayerCount() );
97 int row = 0;
98
99 for( size_t layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
100 {
101 if( enabledCopperLayers.test( layer ) )
102 {
103 auto attr = new wxGridCellAttr;
104 attr->SetRenderer( new GRID_CELL_LAYER_RENDERER( m_parent ) );
105 attr->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_MENU ) );
106 attr->SetReadOnly();
107 m_grid->SetAttr( row, 0, attr );
108
109 attr = new wxGridCellAttr;
110 attr->SetRenderer( new GRID_CELL_LAYER_RENDERER( m_parent ) );
111 attr->SetEditor( new GRID_CELL_LAYER_SELECTOR( m_parent, LSET::AllNonCuMask() ) );
112 m_grid->SetAttr( row, 1, attr );
113
114 m_grid->GetTable()->SetValueAsLong( row, 0, (long) layer );
115 m_grid->GetTable()->SetValueAsLong( row, 1, (long) layer );
116
117 ++row;
118 }
119 }
120
121 return true;
122}
123
124
126{
128 return false;
129
130 LSET enabledCopperLayers = LSET::AllCuMask( m_parent->GetBoard()->GetCopperLayerCount() );
131 wxGridTableBase* table = m_grid->GetTable();
132 int row = 0;
133
134 for( int layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
135 {
136 if( enabledCopperLayers.test( layer ) )
137 {
138 int dest = table->GetValueAsLong( row++, 1 );
139
140 if( dest >= 0 && dest < PCB_LAYER_ID_COUNT && enabledCopperLayers.test( dest ) )
141 m_layerMap[ ToLAYER_ID( layer ) ] = ToLAYER_ID( dest );
142 }
143 }
144
145 return true;
146}
147
148
150{
151 // Account for scroll bars
153
154 m_grid->SetColSize( 0, std::max( FromDIP( 40 ), width / 2 ) );
155 m_grid->SetColSize( 1, std::max( FromDIP( 40 ), width - m_grid->GetColSize( 0 ) ) );
156}
157
158
159void DIALOG_SWAP_LAYERS::OnSize( wxSizeEvent& event )
160{
162
163 event.Skip();
164}
165
166
int GetCopperLayerCount() const
Definition: board.cpp:653
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
Class DIALOG_SWAP_LAYERS_BASE.
bool TransferDataToWindow() override
bool TransferDataFromWindow() override
std::map< PCB_LAYER_ID, PCB_LAYER_ID > & m_layerMap
PCB_BASE_EDIT_FRAME * m_parent
DIALOG_SWAP_LAYERS(PCB_BASE_EDIT_FRAME *aParent, std::map< PCB_LAYER_ID, PCB_LAYER_ID > &aArray)
void OnSize(wxSizeEvent &event) override
LAYER_GRID_TABLE * m_gridTable
void SetValue(int row, int col, const wxString &value) override
int m_layers[MAX_CU_LAYERS][2]
void SetValueAsLong(int row, int col, long value) override
int GetNumberRows() override
wxString GetValue(int row, int col) override
LAYER_GRID_TABLE(int layerCount)
wxString GetColLabelValue(int aCol) override
int GetNumberCols() override
long GetValueAsLong(int row, int col) override
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:575
static LSET AllNonCuMask()
Return a mask holding all layer minus CU layers.
Definition: lset.cpp:884
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:863
Common, abstract interface for edit frames.
BOARD * GetBoard() const
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:267
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:400
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:594
#define _(s)
#define MAX_CU_LAYERS
Definition: layer_ids.h:142
@ PCB_LAYER_ID_COUNT
Definition: layer_ids.h:137
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:1022
wxSize GetUnobscuredSize(const wxWindow *aWindow)
Tries to determine the size of the viewport of a scrollable widget (wxDataViewCtrl,...
Definition: gtk/ui.cpp:195