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>
26#include <kiplatform/ui.h>
27#include <widgets/wx_grid.h>
28#include "dialog_swap_layers.h"
29
30
31class LAYER_GRID_TABLE : public wxGridTableBase
32{
35
36public:
37 LAYER_GRID_TABLE( int layerCount ) : m_layerCount( layerCount )
38 { }
39
40 int GetNumberRows() override { return m_layerCount; }
41 int GetNumberCols() override { return 2; }
42
43 wxString GetColLabelValue( int aCol ) override
44 {
45 switch( aCol )
46 {
47 case 0: return _( "Move items on:" );
48 case 1: return _( "To layer:" );
49 default: return wxEmptyString;
50 }
51 }
52
53 wxString GetValue( int row, int col ) override { return "undefined"; }
54 void SetValue( int row, int col, const wxString& value ) override { }
55
56 long GetValueAsLong( int row, int col ) override
57 {
58 return m_layers[ row ][ col ];
59 }
60
61 void SetValueAsLong( int row, int col, long value ) override
62 {
63 m_layers[ row ][ col ] = value;
64 }
65};
66
67
69 std::map<PCB_LAYER_ID, PCB_LAYER_ID>& aLayerMap ) :
70 DIALOG_SWAP_LAYERS_BASE( aParent ),
71 m_parent( aParent ),
72 m_layerMap( aLayerMap )
73{
76 m_grid->SetMinSize( FromDIP( m_grid->GetMinSize() ) );
77 m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + FromDIP( 4 ) );
78 m_grid->SetCellHighlightROPenWidth( 0 );
79 m_grid->SetUseNativeColLabels();
80
82
84}
85
86
88{
90}
91
92
94{
95 LSET enabledCopperLayers = LSET::AllCuMask( m_parent->GetBoard()->GetCopperLayerCount() );
96 int row = 0;
97
98 for( size_t layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
99 {
100 if( enabledCopperLayers.test( layer ) )
101 {
102 auto attr = new wxGridCellAttr;
103 attr->SetRenderer( new GRID_CELL_LAYER_RENDERER( m_parent ) );
104 attr->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_MENU ) );
105 attr->SetReadOnly();
106 m_grid->SetAttr( row, 0, attr );
107
108 attr = new wxGridCellAttr;
109 attr->SetRenderer( new GRID_CELL_LAYER_RENDERER( m_parent ) );
110 attr->SetEditor( new GRID_CELL_LAYER_SELECTOR( m_parent, LSET::AllNonCuMask() ) );
111 m_grid->SetAttr( row, 1, attr );
112
113 m_grid->GetTable()->SetValueAsLong( row, 0, (long) layer );
114 m_grid->GetTable()->SetValueAsLong( row, 1, (long) layer );
115
116 ++row;
117 }
118 }
119
120 return true;
121}
122
123
125{
127 return false;
128
129 LSET enabledCopperLayers = LSET::AllCuMask( m_parent->GetBoard()->GetCopperLayerCount() );
130 wxGridTableBase* table = m_grid->GetTable();
131 int row = 0;
132
133 for( int layer = 0; layer < PCB_LAYER_ID_COUNT; ++layer )
134 {
135 if( enabledCopperLayers.test( layer ) )
136 {
137 int dest = table->GetValueAsLong( row++, 1 );
138
139 if( dest >= 0 && dest < PCB_LAYER_ID_COUNT && enabledCopperLayers.test( dest ) )
140 m_layerMap[ ToLAYER_ID( layer ) ] = ToLAYER_ID( dest );
141 }
142 }
143
144 return true;
145}
146
147
149{
150 // Account for scroll bars
152
153 m_grid->SetColSize( 0, std::max( FromDIP( 40 ), width / 2 ) );
154 m_grid->SetColSize( 1, std::max( FromDIP( 40 ), width - m_grid->GetColSize( 0 ) ) );
155}
156
157
158void DIALOG_SWAP_LAYERS::OnSize( wxSizeEvent& event )
159{
161
162 event.Skip();
163}
164
165
int GetCopperLayerCount() const
Definition: board.cpp:665
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:573
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:156
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:268
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:462
#define _(s)
#define MAX_CU_LAYERS
Definition: layer_ids.h:141
@ PCB_LAYER_ID_COUNT
Definition: layer_ids.h:138
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