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( wxT( "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 ] ? wxT( "1" ) : wxEmptyString );
152  m_grid->SetCellValue( i, COL_TEXT_UPRIGHT, m_BrdSettings->m_TextUpright[ i ] ? wxT( "1" ) : wxEmptyString );
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,
177  wxT( "Unhandled dimension precision!" ) );
178 
179  int mode = static_cast<int>( m_BrdSettings->m_DimensionUnitsMode );
180  m_dimensionUnits->SetSelection( mode );
181 
182  int format = static_cast<int>( m_BrdSettings->m_DimensionUnitsFormat );
183  m_dimensionUnitsFormat->SetSelection( format );
184 
187 
188  int position = static_cast<int>( m_BrdSettings->m_DimensionTextPosition );
189  m_dimensionTextPositionMode->SetSelection( position );
190 
194 
195  return true;
196 }
197 
198 
200 {
201  return ValueFromString( m_Frame->GetUserUnits(), m_grid->GetCellValue( aRow, aCol ) );
202 }
203 
204 
206 {
207  if( !m_grid->CommitPendingChanges() )
208  return false;
209 
210  for( int i = 0; i < ROW_COUNT; ++i )
211  {
213 
214  if( i == ROW_EDGES || i == ROW_COURTYARD )
215  continue;
216 
217  m_BrdSettings->m_TextSize[ i ] = wxSize( getGridValue( i, COL_TEXT_WIDTH ),
221  wxGridCellBoolEditor::IsTrueValue( m_grid->GetCellValue( i, COL_TEXT_ITALIC ) );
223  wxGridCellBoolEditor::IsTrueValue( m_grid->GetCellValue( i, COL_TEXT_UPRIGHT ) );
224  }
225 
226  // These are all stored in project file, not board, so no need for OnModify()
227 
228  int mode = m_dimensionUnits->GetSelection();
229  m_BrdSettings->m_DimensionUnitsMode = static_cast<DIM_UNITS_MODE>( mode );
230  int format = m_dimensionUnitsFormat->GetSelection();
231  m_BrdSettings->m_DimensionUnitsFormat = static_cast<DIM_UNITS_FORMAT>( format );
234  int position = m_dimensionTextPositionMode->GetSelection();
235  m_BrdSettings->m_DimensionTextPosition = static_cast<DIM_TEXT_POSITION>( position );
239 
240  return true;
241 }
242 
243 
245 {
246  if( !m_grid->CommitPendingChanges() )
247  return;
248 
249  BOARD_DESIGN_SETTINGS* savedSettings = m_BrdSettings;
250 
251  m_BrdSettings = &aBoard->GetDesignSettings();
253 
254  m_BrdSettings = savedSettings;
255 }
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:282
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:411
#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:226
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
The main frame for Pcbnew.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
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.