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  m_Frame->Bind( UNITS_CHANGED, &PANEL_SETUP_TEXT_AND_GRAPHICS::onUnitsChanged, this );
96 }
97 
98 
100 {
101  // destroy GRID_TRICKS before m_grid.
102  m_grid->PopEventHandler( true );
103 
104  m_Frame->Unbind( UNITS_CHANGED, &PANEL_SETUP_TEXT_AND_GRAPHICS::onUnitsChanged, this );
105 }
106 
107 
108 void PANEL_SETUP_TEXT_AND_GRAPHICS::onUnitsChanged( wxCommandEvent& aEvent )
109 {
110  BOARD_DESIGN_SETTINGS tempBDS( nullptr, "dummy" );
112 
113  m_BrdSettings = &tempBDS; // No, address of stack var does not escape function
114 
117 
118  m_BrdSettings = saveBDS;
119 
120  aEvent.Skip();
121 }
122 
123 
125 {
126  wxColour disabledColour = wxSystemSettings::GetColour( wxSYS_COLOUR_BACKGROUND );
127 
128 #define SET_MILS_CELL( row, col, val ) \
129  m_grid->SetCellValue( row, col, StringFromValue( m_Frame->GetUserUnits(), val, true ) )
130 
131 #define DISABLE_CELL( row, col ) \
132  m_grid->SetReadOnly( row, col ); m_grid->SetCellBackgroundColour( row, col, disabledColour );
133 
134  for( int i = 0; i < ROW_COUNT; ++i )
135  {
137 
138  if( i == ROW_EDGES || i == ROW_COURTYARD )
139  {
145  }
146  else
147  {
151  m_grid->SetCellValue( i, COL_TEXT_ITALIC, m_BrdSettings->m_TextItalic[ i ] ? "1" : "" );
152  m_grid->SetCellValue( i, COL_TEXT_UPRIGHT, m_BrdSettings->m_TextUpright[ i ] ? "1" : "" );
153 
154  auto attr = new wxGridCellAttr;
155  attr->SetRenderer( new wxGridCellBoolRenderer() );
156  attr->SetReadOnly(); // not really; we delegate interactivity to GRID_TRICKS
157  attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
158  m_grid->SetAttr( i, COL_TEXT_ITALIC, attr );
159 
160  attr = new wxGridCellAttr;
161  attr->SetRenderer( new wxGridCellBoolRenderer() );
162  attr->SetReadOnly(); // not really; we delegate interactivity to GRID_TRICKS
163  attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
164  m_grid->SetAttr( i, COL_TEXT_UPRIGHT, attr );
165  }
166  }
167 
168  // Work around an issue where wxWidgets doesn't calculate the row width on its own
169  for( int col = 0; col < m_grid->GetNumberCols(); col++ )
170  m_grid->SetColMinimalWidth( col, m_grid->GetVisibleWidth( col, true, true, false ) );
171 
172  m_grid->SetRowLabelSize( m_grid->GetVisibleWidth( -1, true, true, true ) );
173 
174  Layout();
175 
176  wxASSERT_MSG( m_BrdSettings->m_DimensionPrecision <= 4, "Unhandled dimension precision!" );
177 
178  int mode = static_cast<int>( m_BrdSettings->m_DimensionUnitsMode );
179  m_dimensionUnits->SetSelection( mode );
180 
181  int format = static_cast<int>( m_BrdSettings->m_DimensionUnitsFormat );
182  m_dimensionUnitsFormat->SetSelection( format );
183 
186 
187  int position = static_cast<int>( m_BrdSettings->m_DimensionTextPosition );
188  m_dimensionTextPositionMode->SetSelection( position );
189 
193 
194  return true;
195 }
196 
197 
199 {
200  return ValueFromString( m_Frame->GetUserUnits(), m_grid->GetCellValue( aRow, aCol ) );
201 }
202 
203 
205 {
206  if( !m_grid->CommitPendingChanges() )
207  return false;
208 
209  for( int i = 0; i < ROW_COUNT; ++i )
210  {
212 
213  if( i == ROW_EDGES || i == ROW_COURTYARD )
214  continue;
215 
216  m_BrdSettings->m_TextSize[ i ] = wxSize( getGridValue( i, COL_TEXT_WIDTH ),
220  wxGridCellBoolEditor::IsTrueValue( m_grid->GetCellValue( i, COL_TEXT_ITALIC ) );
222  wxGridCellBoolEditor::IsTrueValue( m_grid->GetCellValue( i, COL_TEXT_UPRIGHT ) );
223  }
224 
225  // These are all stored in project file, not board, so no need for OnModify()
226 
227  int mode = m_dimensionUnits->GetSelection();
228  m_BrdSettings->m_DimensionUnitsMode = static_cast<DIM_UNITS_MODE>( mode );
229  int format = m_dimensionUnitsFormat->GetSelection();
230  m_BrdSettings->m_DimensionUnitsFormat = static_cast<DIM_UNITS_FORMAT>( format );
233  int position = m_dimensionTextPositionMode->GetSelection();
234  m_BrdSettings->m_DimensionTextPosition = static_cast<DIM_TEXT_POSITION>( position );
238 
239  return true;
240 }
241 
242 
244 {
245  if( !m_grid->CommitPendingChanges() )
246  return;
247 
248  BOARD_DESIGN_SETTINGS* savedSettings = m_BrdSettings;
249 
250  m_BrdSettings = &aBoard->GetDesignSettings();
252 
253  m_BrdSettings = savedSettings;
254 }
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:590
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:191
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
void onUnitsChanged(wxCommandEvent &aEvent)
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.