KiCad PCB EDA Suite
panel_setup_text_and_graphics.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-2021 KiCad Developers, see change_log.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 <base_units.h>
25 #include <pcb_edit_frame.h>
26 #include <board_design_settings.h>
27 #include <widgets/wx_grid.h>
28 #include <grid_tricks.h>
30 
31 #include <wx/treebook.h>
32 
33 
34 // Columns of layer classes grid
35 enum
36 {
43 };
44 
45 enum
46 {
47  ROW_SILK = 0,
53 
55 };
56 
57 
59  PCB_EDIT_FRAME* aFrame ) :
60  PANEL_SETUP_TEXT_AND_GRAPHICS_BASE( aParent->GetTreebook() ),
61  m_arrowLength( aFrame, m_lblArrowLength, m_dimensionArrowLength, m_arrowLengthUnits ),
62  m_extensionOffset( aFrame, m_lblExtensionOffset, m_dimensionExtensionOffset,
63  m_dimensionExtensionOffsetUnits )
64 {
65  m_Parent = aParent;
66  m_Frame = aFrame;
68 
69  m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
70 
71  // Work around a bug in wxWidgets where it fails to recalculate the grid height
72  // after changing the default row size
73  m_grid->AppendRows( 1 );
74  m_grid->DeleteRows( m_grid->GetNumberRows() - 1, 1 );
75 
76  // Gives a suitable size to m_grid columns
77  // The default wxWidget col size is not very good
78  // Calculate a min best size to handle longest usual numeric values:
79  int min_best_width = m_grid->GetTextExtent( "555,555555 mils" ).x;
80 
81  for( int i = 0; i < m_grid->GetNumberCols(); ++i )
82  {
83  // We calculate the column min size only from texts sizes, not using the initial col width
84  // as this initial width is sometimes strange depending on the language (wxGrid bug?)
85  int min_width = m_grid->GetVisibleWidth( i, true, true, false );
86 
87  m_grid->SetColMinimalWidth( i, min_width );
88 
89  // We use a "best size" >= min_best_width
90  m_grid->SetColSize( i, std::max( min_width, min_best_width ) );
91  }
92 
93  m_grid->PushEventHandler( new GRID_TRICKS( m_grid ) );
94 }
95 
96 
98 {
99  // destroy GRID_TRICKS before m_grid.
100  m_grid->PopEventHandler( true );
101 }
102 
103 
105 {
106  wxColour disabledColour = wxSystemSettings::GetColour( wxSYS_COLOUR_BACKGROUND );
107 
108 #define SET_MILS_CELL( row, col, val ) \
109  m_grid->SetCellValue( row, col, StringFromValue( m_Frame->GetUserUnits(), val, true ) )
110 
111 #define DISABLE_CELL( row, col ) \
112  m_grid->SetReadOnly( row, col ); m_grid->SetCellBackgroundColour( row, col, disabledColour );
113 
114  for( int i = 0; i < ROW_COUNT; ++i )
115  {
117 
118  if( i == ROW_EDGES || i == ROW_COURTYARD )
119  {
125  }
126  else
127  {
131  m_grid->SetCellValue( i, COL_TEXT_ITALIC, m_BrdSettings->m_TextItalic[ i ] ? "1" : "" );
132  m_grid->SetCellValue( i, COL_TEXT_UPRIGHT, m_BrdSettings->m_TextUpright[ i ] ? "1" : "" );
133 
134  auto attr = new wxGridCellAttr;
135  attr->SetRenderer( new wxGridCellBoolRenderer() );
136  attr->SetReadOnly(); // not really; we delegate interactivity to GRID_TRICKS
137  attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
138  m_grid->SetAttr( i, COL_TEXT_ITALIC, attr );
139 
140  attr = new wxGridCellAttr;
141  attr->SetRenderer( new wxGridCellBoolRenderer() );
142  attr->SetReadOnly(); // not really; we delegate interactivity to GRID_TRICKS
143  attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
144  m_grid->SetAttr( i, COL_TEXT_UPRIGHT, attr );
145  }
146  }
147 
148  // Work around an issue where wxWidgets doesn't calculate the row width on its own
149  for( int col = 0; col < m_grid->GetNumberCols(); col++ )
150  m_grid->SetColMinimalWidth( col, m_grid->GetVisibleWidth( col, true, true, false ) );
151 
152  m_grid->SetRowLabelSize( m_grid->GetVisibleWidth( -1, true, true, true ) );
153 
154  Layout();
155 
156  wxASSERT_MSG( m_BrdSettings->m_DimensionPrecision <= 4, "Unhandled dimension precision!" );
157 
158  int mode = static_cast<int>( m_BrdSettings->m_DimensionUnitsMode );
159  m_dimensionUnits->SetSelection( mode );
160 
161  int format = static_cast<int>( m_BrdSettings->m_DimensionUnitsFormat );
162  m_dimensionUnitsFormat->SetSelection( format );
163 
166 
167  int position = static_cast<int>( m_BrdSettings->m_DimensionTextPosition );
168  m_dimensionTextPositionMode->SetSelection( position );
169 
173 
174  return true;
175 }
176 
177 
179 {
180  return ValueFromString( m_Frame->GetUserUnits(), m_grid->GetCellValue( aRow, aCol ) );
181 }
182 
183 
185 {
186  if( !m_grid->CommitPendingChanges() )
187  return false;
188 
189  for( int i = 0; i < ROW_COUNT; ++i )
190  {
192 
193  if( i == ROW_EDGES || i == ROW_COURTYARD )
194  continue;
195 
196  m_BrdSettings->m_TextSize[ i ] = wxSize( getGridValue( i, COL_TEXT_WIDTH ),
200  wxGridCellBoolEditor::IsTrueValue( m_grid->GetCellValue( i, COL_TEXT_ITALIC ) );
202  wxGridCellBoolEditor::IsTrueValue( m_grid->GetCellValue( i, COL_TEXT_UPRIGHT ) );
203  }
204 
205  // These are all stored in project file, not board, so no need for OnModify()
206 
207  int mode = m_dimensionUnits->GetSelection();
208  m_BrdSettings->m_DimensionUnitsMode = static_cast<DIM_UNITS_MODE>( mode );
209  int format = m_dimensionUnitsFormat->GetSelection();
210  m_BrdSettings->m_DimensionUnitsFormat = static_cast<DIM_UNITS_FORMAT>( format );
213  int position = m_dimensionTextPositionMode->GetSelection();
214  m_BrdSettings->m_DimensionTextPosition = static_cast<DIM_TEXT_POSITION>( position );
218 
219  return true;
220 }
221 
222 
224 {
225  if( !m_grid->CommitPendingChanges() )
226  return;
227 
228  BOARD_DESIGN_SETTINGS* savedSettings = m_BrdSettings;
229 
230  m_BrdSettings = &aBoard->GetDesignSettings();
232 
233  m_BrdSettings = savedSettings;
234 }
Implementation of conversion functions that require both schematic and board internal units.
Class PANEL_SETUP_TEXT_AND_GRAPHICS_BASE.
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Definition: grid_tricks.h:55
int m_DimensionPrecision
Number of digits after the decimal.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:589
DIM_TEXT_POSITION m_DimensionTextPosition
DIM_UNITS_MODE m_DimensionUnitsMode
int GetVisibleWidth(int aCol, bool aHeader=true, bool aContents=false, bool aKeep=true)
Calculates the specified column based on the actual size of the text on screen.
Definition: wx_grid.cpp:246
wxSize m_TextSize[LAYER_CLASS_COUNT]
int m_TextThickness[LAYER_CLASS_COUNT]
long long int ValueFromString(EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType)
Function ValueFromString converts aTextValue in aUnits to internal units used by the application.
Definition: base_units.cpp:416
#define DISABLE_CELL(row, col)
bool m_TextItalic[LAYER_CLASS_COUNT]
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:190
PANEL_SETUP_TEXT_AND_GRAPHICS(PAGED_DIALOG *aParent, PCB_EDIT_FRAME *aFrame)
int m_LineThickness[LAYER_CLASS_COUNT]
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:190
virtual void SetValue(int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
The main frame for Pcbnew.
virtual long long int GetValue()
Return the current value in Internal Units.
DIM_UNITS_FORMAT m_DimensionUnitsFormat
#define SET_MILS_CELL(row, col, val)
BOARD * GetBoard() const
bool m_TextUpright[LAYER_CLASS_COUNT]
EDA_UNITS GetUserUnits() const
Return the user units currently in use.
Container for design settings for a BOARD object.