21#include <wx/tokenzr.h>
23#include <wx/settings.h>
25#include <wx/textentry.h>
44 wxGridCellAttr::wxAttrKind aKind )
46 wxGridCellAttr* attr = aInputAttr;
48 if( wxGridCellAttrProvider* provider = GetAttrProvider() )
50 wxGridCellAttr* providerAttr = provider->GetAttr( aRow, aCol, aKind );
54 attr =
new wxGridCellAttr;
55 attr->SetKind( wxGridCellAttr::Merged );
59 attr->MergeWith( aInputAttr );
63 attr->MergeWith( providerAttr );
64 providerAttr->DecRef();
72#define MIN_GRIDCELL_MARGIN FromDIP( 2 )
78 aEntry->SetMargins( 0, 0 );
84#if defined( __WXMSW__ ) || defined( __WXGTK__ )
91 const std::vector<int>& aRowHeights,
int aMaxRows )
96 int rowsHeight = aHeaderHeight;
97 int count = std::min( aMaxRows, (
int) aRowHeights.size() );
99 for(
int row = 0; row < count; ++row )
100 rowsHeight += aRowHeights[row];
102 return std::min( aMinHeight, rowsHeight );
110 std::vector<int> rowHeights;
111 rowHeights.reserve( GetNumberRows() );
113 int allRowsHeight = GetColLabelSize();
115 for(
int row = 0; row < GetNumberRows(); ++row )
117 rowHeights.push_back( GetRowSize( row ) );
118 allRowsHeight += rowHeights.back();
124 rowHeights, aMinRows ) ) );
126 aDialog->SetMinSize( wxDefaultSize );
127 aDialog->InvalidateBestSize();
128 aDialog->SetMinSize( aDialog->GetBestSize() );
131 int grow = allRowsHeight - GetSize().y;
134 aDialog->SetSize( aDialog->GetSize().x, aDialog->GetSize().y + grow );
140 KIGFX::COLOR4D bg = wxSystemSettings::GetColour( wxSYS_COLOUR_FRAMEBK );
141 KIGFX::COLOR4D fg = wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER );
152 wxDCBrushChanger SetBrush( dc, *wxTRANSPARENT_BRUSH );
155 rect.SetTop( rect.GetTop() + 1 );
156 rect.SetLeft( rect.GetLeft() + 1 );
157 rect.SetBottom( rect.GetBottom() - 1 );
158 rect.SetRight( rect.GetRight() - 1 );
159 dc.DrawRectangle( rect );
169 wxDCBrushChanger SetBrush( dc, *wxTRANSPARENT_BRUSH );
172 rect.SetTop( rect.GetTop() + 1 );
173 rect.SetLeft( rect.GetLeft() );
174 rect.SetBottom( rect.GetBottom() - 1 );
175 rect.SetRight( rect.GetRight() - 1 );
176 dc.DrawRectangle( rect );
186 wxDCBrushChanger SetBrush( dc, *wxTRANSPARENT_BRUSH );
189 rect.SetTop( rect.GetTop() + 1 );
190 rect.SetLeft( rect.GetLeft() + 1 );
191 rect.SetBottom( rect.GetBottom() - 1 );
192 rect.SetRight( rect.GetRight() );
193 dc.DrawRectangle( rect );
206 wxGridCellAttrProvider(),
220 wxGridCellAttr*
GetAttr(
int row,
int col, wxGridCellAttr::wxAttrKind kind )
const override
222 wxGridCellAttrPtr cellAttr( wxGridCellAttrProvider::GetAttr( row, col, kind ) );
227 return cellAttr.release();
235 if( !cellAttr->HasBackgroundColour() )
237 cellAttr = cellAttr->Clone();
238 cellAttr->SetBackgroundColour(
m_attrEven->GetBackgroundColour() );
242 return cellAttr.release();
250WX_GRID::WX_GRID( wxWindow *parent, wxWindowID
id,
const wxPoint& pos,
const wxSize& size,
long style,
251 const wxString&
name ) :
252 wxGrid( parent, id, pos, size, style,
name ),
256 SetDefaultRowSize( GetDefaultRowSize() + FromDIP( 4 ) );
258 SetDefaultCellOverflow(
false );
293 std::vector<int> hiddenCols;
295 for(
int col = 0; col < GetNumberCols(); ++col )
297 if( !IsColShown( col ) )
298 hiddenCols.push_back( col );
303 if( !hiddenCols.empty() )
308 for(
int col : hiddenCols )
321 wxGrid::SetColLabelSize( wxGRID_AUTOSIZE );
328 if( aHeight == 0 || aHeight == wxGRID_AUTOSIZE )
330 wxGrid::SetColLabelSize( aHeight );
337 wxGrid::SetColLabelSize( std::max( aHeight, minHeight ) );
351 int numberCols = GetNumberCols();
352 int* formBuilderColWidths =
new int[numberCols];
354 for(
int i = 0; i < numberCols; ++i )
355 formBuilderColWidths[ i ] = GetColSize( i );
357 wxGrid::SetTable( aTable );
361 numberCols = std::min( numberCols, GetNumberCols() );
363 for(
int i = 0; i < numberCols; ++i )
368 SetColSize( i, std::max( formBuilderColWidths[ i ], headingWidth ) );
371 delete[] formBuilderColWidths;
384 wxGridTableBase*
table = wxGrid::GetTable();
386 wxCHECK_MSG(
table, ,
"Tried to enable alternate row colors without a table assigned to the grid" );
390 wxColor color = wxGrid::GetDefaultCellBackgroundColour();
395 table->SetAttrProvider(
nullptr );
405 int row = aEvent.GetRow();
406 int col = aEvent.GetCol();
408 if( row >= 0 && row < GetNumberRows() && col >= 0 && col < GetNumberCols() )
410 if( GetSelectionMode() == wxGrid::wxGridSelectCells )
412 SelectBlock( row, col, row, col,
false );
414 else if( GetSelectionMode() == wxGrid::wxGridSelectRows
415 || GetSelectionMode() == wxGrid::wxGridSelectRowsOrColumns )
417 SelectBlock( row, 0, row, GetNumberCols() - 1,
false );
419 else if( GetSelectionMode() == wxGrid::wxGridSelectColumns )
421 SelectBlock( 0, col, GetNumberRows() - 1, col,
false );
428 if( !m_firstSelectionRefreshDone )
430 m_firstSelectionRefreshDone =
true;
431 CallAfter( [
this]() { ForceRefresh(); } );
442 int row = aEvent.GetRow();
443 int col = aEvent.GetCol();
445 const std::pair<wxString, wxString>& beforeAfter =
m_evalBeforeAfter[ { row, col } ];
447 if( GetCellValue( row, col ) == beforeAfter.second )
448 SetCellValue( row, col, beforeAfter.first );
455 const int col = aEvent.GetCol();
462 EDA_UNITS cellUnits = cellUnitsData.first;
465 m_eval->SetDefaultUnits( cellUnits );
467 const int row = aEvent.GetRow();
470 bool isNullable =
false;
471 wxGridCellEditor* cellEditor = GetCellEditor( row, col );
477 isNullable = nullable->IsNullable();
479 cellEditor->DecRef();
483 [
this, row, col, isNullable, unitsProvider, cellDataType]()
487 if( row >= GetNumberRows() || col >= GetNumberCols() )
490 wxString stringValue = GetCellValue( row, col );
491 bool processedOk =
true;
494 processedOk =
m_eval->Process( stringValue );
502 std::optional<int> val;
522 if( stringValue != evalValue )
524 SetCellValue( row, col, evalValue );
544 wxGrid::SetTable(
nullptr );
551 wxString shownColumns;
553 for(
int i = 0; i < GetNumberCols(); ++i )
555 if( IsColShown( i ) )
557 if( shownColumns.Length() )
558 shownColumns << wxT(
" " );
570 std::bitset<64> shownColumns;
572 for(
int ii = 0; ii < GetNumberCols(); ++ii )
573 shownColumns[ii] = IsColShown( ii );
581 for(
int i = 0; i < GetNumberCols(); ++i )
584 wxStringTokenizer shownTokens( shownColumns,
" \t\r\n", wxTOKEN_STRTOK );
586 while( shownTokens.HasMoreTokens() )
589 shownTokens.GetNextToken().ToLong( &colNumber );
591 if( colNumber >= 0 && colNumber < GetNumberCols() )
592 ShowCol( (
int) colNumber );
599 if( m_nativeColumnLabels )
600 wxGrid::DrawCornerLabel( dc );
602 wxRect rect( wxSize( m_rowLabelWidth, m_colLabelHeight ) );
608 wxDCBrushChanger setBrush( dc, m_colLabelWin->GetBackgroundColour() );
609 wxDCPenChanger setPen( dc, m_colLabelWin->GetBackgroundColour() );
610 dc.DrawRectangle( rect.Inflate( 1 ) );
619 if( m_nativeColumnLabels )
620 wxGrid::DrawColLabel( dc, col );
622 if( GetColWidth( col ) <= 0 || m_colLabelHeight <= 0 )
625 wxRect rect( GetColLeft( col ), 0, GetColWidth( col ), m_colLabelHeight );
631 wxDCBrushChanger setBrush( dc, m_colLabelWin->GetBackgroundColour() );
632 wxDCPenChanger setPen( dc, m_colLabelWin->GetBackgroundColour() );
633 dc.DrawRectangle( rect.Inflate( 1 ) );
639 dc.SetFont( GetLabelFont() );
642 GetColLabelAlignment( &hAlign, &vAlign );
643 const int orient = GetColLabelTextOrientation();
646 hAlign = wxALIGN_LEFT;
648 if( hAlign == wxALIGN_LEFT )
651 rend.DrawLabel( *
this, dc, GetColLabelValue( col ), rect, hAlign, vAlign, orient );
657 if( GetRowHeight( row ) <= 0 || m_rowLabelWidth <= 0 )
660 wxRect rect( 0, GetRowTop( row ), m_rowLabelWidth, GetRowHeight( row ) );
666 wxDCBrushChanger setBrush( dc, m_colLabelWin->GetBackgroundColour() );
667 wxDCPenChanger setPen( dc, m_colLabelWin->GetBackgroundColour() );
668 dc.DrawRectangle( rect.Inflate( 1 ) );
674 dc.SetFont( GetLabelFont() );
677 GetRowLabelAlignment(&hAlign, &vAlign);
679 if( hAlign == wxALIGN_LEFT )
682 rend.DrawLabel( *
this, dc, GetRowLabelValue( row ), rect, hAlign, vAlign, wxHORIZONTAL );
688 if( !IsCellEditControlEnabled() )
691 HideCellEditControl();
694 m_cellEditCtrlEnabled =
false;
696 int row = m_currentCellCoords.GetRow();
697 int col = m_currentCellCoords.GetCol();
699 wxString oldval = GetCellValue( row, col );
702 wxGridCellAttr* attr = GetCellAttr( row, col );
703 wxGridCellEditor*
editor = attr->GetEditor(
this, row, col );
705 editor->EndEdit( row, col,
this, oldval, &newval );
716 if( !IsCellEditControlEnabled() )
719 if( !aQuietMode && SendEvent( wxEVT_GRID_EDITOR_HIDDEN ) == -1 )
722 HideCellEditControl();
725 m_cellEditCtrlEnabled =
false;
727 int row = m_currentCellCoords.GetRow();
728 int col = m_currentCellCoords.GetCol();
730 wxString oldval = GetCellValue( row, col );
733 wxGridCellAttr* attr = GetCellAttr( row, col );
734 wxGridCellEditor*
editor = attr->GetEditor(
this, row, col );
736 bool changed =
editor->EndEdit( row, col,
this, oldval, &newval );
743 if( !aQuietMode && SendEvent( wxEVT_GRID_CELL_CHANGING, newval ) == -1 )
746 editor->ApplyEdit( row, col,
this );
751 if( !aQuietMode && SendEvent( wxEVT_GRID_CELL_CHANGED, oldval ) == -1 )
754 SetCellValue( row, col, oldval );
771 auto [row, editCol] = aAdder();
775 MakeCellVisible( row, std::max( editCol, 0 ) );
776 SetGridCursor( row, std::max( editCol, 0 ) );
780 EnableCellEditControl(
true );
781 ShowCellEditControl();
798 const std::function<
void(
int row )>& aDeleter )
800 wxArrayInt selectedRows = GetSelectedRows();
802 auto addSelectedRow = [&](
int row )
804 for(
size_t i = 0; i < selectedRows.size(); ++i )
806 if( selectedRows[i] == row )
810 selectedRows.push_back( row );
813 wxGridCellCoordsArray topLeft = GetSelectionBlockTopLeft();
814 wxGridCellCoordsArray botRight = GetSelectionBlockBottomRight();
816 for(
size_t i = 0; i < std::min( topLeft.Count(), botRight.Count() ); ++i )
818 for(
int row = topLeft[i].GetRow(); row <= botRight[i].GetRow(); ++row )
819 addSelectedRow( row );
822 wxGridCellCoordsArray cells = GetSelectedCells();
824 for(
size_t i = 0; i < cells.Count(); ++i )
825 addSelectedRow( cells[i].GetRow() );
827 if( selectedRows.empty() && GetGridCursorRow() >= 0 )
828 selectedRows.push_back( GetGridCursorRow() );
830 if( selectedRows.empty() )
833 for(
int row : selectedRows )
835 if( !aFilter( row ) )
844 [](
int* first,
int* second )
846 return *second - *first;
849 int nextSelRow = selectedRows.back() - 1;
851 if( nextSelRow >= 0 )
853 GoToCell( nextSelRow, GetGridCursorCol() );
854 SetGridCursor( nextSelRow, GetGridCursorCol() );
857 for(
int row : selectedRows )
864 for(
int col = 0; col < GetNumberCols(); ++col )
866 wxString temp = GetCellValue( aRowA, col );
867 SetCellValue( aRowA, col, GetCellValue( aRowB, col ) );
868 SetCellValue( aRowB, col, temp );
885 const std::function<
void(
int row )>& aMover )
890 int i = GetGridCursorRow();
892 if( i > 0 && aFilter( i ) )
896 SetGridCursor( i - 1, GetGridCursorCol() );
897 MakeCellVisible( GetGridCursorRow(), GetGridCursorCol() );
918 const std::function<
void(
int row )>& aMover )
923 int i = GetGridCursorRow();
925 if( i + 1 < GetNumberRows() && aFilter( i ) )
929 SetGridCursor( i + 1, GetGridCursorCol() );
930 MakeCellVisible( GetGridCursorRow(), GetGridCursorCol() );
963 wxString stringValue = GetCellValue( aRow, aCol );
969 m_eval->SetDefaultUnits( cellUnits );
971 if(
m_eval->Process( stringValue ) )
972 stringValue =
m_eval->Result();
981 wxString stringValue = GetCellValue( aRow, aCol );
987 m_eval->SetDefaultUnits( cellUnits );
990 stringValue =
m_eval->Result();
1006 SetCellValue( aRow, aCol,
getUnitsProvider( aCol )->StringFromValue( aValue,
true, cellDataType ) );
1019 SetCellValue( aRow, aCol,
getUnitsProvider( aCol )->StringFromOptionalValue( aValue,
true, cellDataType ) );
1037 size = GetRowLabelSize();
1039 for(
int row = 0; aContents && row < GetNumberRows(); row++ )
1040 size = std::max( size,
int( GetTextExtent( GetRowLabelValue( row ) + wxS(
"M" ) ).x ) );
1045 size = GetColSize( aCol );
1053 size = std::max( size,
int( GetTextExtent( GetColLabelValue( aCol ) + wxS(
"M" ) ).x ) );
1056 for(
int row = 0; aContents && row < GetNumberRows(); row++ )
1059 if( GetTable()->CanGetValueAs( row, aCol, wxGRID_VALUE_STRING ) )
1060 size = std::max( size, GetTextExtent( GetCellValue( row, aCol ) + wxS(
"M" ) ).x );
1062 size = std::max( size, GetTextExtent(
"MM" ).x );
1072 int line_height = int( GetTextExtent(
"Mj" ).y ) + 3;
1073 int row_height = GetColLabelSize();
1074 int initial_row_height = row_height;
1079 for(
int col = 0; col < GetNumberCols(); col++ )
1081 int nl_count = GetColLabelValue( col ).Freq(
'\n' );
1086 if( row_height < line_height * ( nl_count+1 ) )
1087 row_height += line_height * nl_count;
1093 if( initial_row_height != row_height )
1110 const int colCount = GetNumberCols();
1112 for(
int ii = 0; ii < GetNumberCols(); ++ii )
1117 wxASSERT_MSG(
m_flexibleCol < colCount,
"Flexible column index does not exist in grid" );
1119 Bind( wxEVT_UPDATE_UI,
1120 [
this]( wxUpdateUIEvent& aEvent )
1127 [
this]( wxSizeEvent& aEvent )
1134 Bind( wxEVT_GRID_CELL_CHANGED,
1135 [
this]( wxGridEvent& aEvent )
1147 const int width = GetSize().GetX() - wxSystemSettings::GetMetric( wxSYS_VSCROLL_X );
1149 std::optional<int> flexibleMinWidth;
1153 if( GetColSize( colIndex ) != 0 )
1155 AutoSizeColumn( colIndex );
1156 const int colSize = GetColSize( colIndex );
1158 int minWidthScaled = FromDIP( minWidth );
1159 SetColSize( colIndex, std::max( minWidthScaled, colSize ) );
1162 flexibleMinWidth = minWidthScaled;
1167 int nonFlexibleWidth = 0;
1169 for(
int i = 0; i < GetNumberCols(); ++i )
1172 nonFlexibleWidth += GetColSize( i );
1176 SetColSize(
m_flexibleCol, std::max( flexibleMinWidth.value_or( 0 ), width - nonFlexibleWidth ) );
1187 const int width = aEvent.GetSize().GetX();
Dialog helper object to sit in the inheritance tree between wxDialog and any class written by wxFormB...
A color representation with 4 components: red, green, blue, alpha.
wxColour ToColour() const
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
Icon provider for the "standard" row indicators, for example in layer selection lists.
static const wxString NullUiString
The string that is used in the UI to represent a null value.
std::optional< int > OptionalValueFromString(const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aTextValue in aUnits to internal units used by the frame.
wxString StringFromOptionalValue(std::optional< int > aValue, bool aAddUnitLabel=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts an optional aValue in internal units into a united string.
EDA_UNITS GetUserUnits() const
static EDA_DATA_TYPE GetTypeFromUnits(const EDA_UNITS aUnits)
Gets the inferred type from the given units.
wxString StringFromValue(double aValue, bool aAddUnitLabel=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aValue in internal units into a united string.
int ValueFromString(const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aTextValue in aUnits to internal units used by the frame.
Attribute provider that provides attributes (or modifies the existing attribute) to alternate a row c...
WX_GRID_ALT_ROW_COLOR_PROVIDER(const wxColor &aBaseColor)
wxGridCellAttr * GetAttr(int row, int col, wxGridCellAttr::wxAttrKind kind) const override
wxGridCellAttrPtr m_attrEven
void UpdateColors(const wxColor &aBaseColor)
void DrawBorder(const wxGrid &grid, wxDC &dc, wxRect &rect) const override
wxGridCellAttr * enhanceAttr(wxGridCellAttr *aInputAttr, int aRow, int aCol, wxGridCellAttr::wxAttrKind aKind)
int GetVisibleWidth(int aCol, bool aHeader=true, bool aContents=true, bool aKeep=false)
Calculate the specified column based on the actual size of the text on screen.
void onGridCellSelect(wxGridEvent &aEvent)
std::map< int, int > m_autosizedCols
void SetLabelFont(const wxFont &aFont)
Hide wxGrid's SetLabelFont() because for some reason on MSW it's a one-shot and subsequent calls to i...
void onDPIChanged(wxDPIChangedEvent &event)
void ShowHideColumns(const wxString &shownColumns)
Show/hide the grid columns based on a tokenized string of shown column indexes.
void OnMoveRowUp(const std::function< void(int row)> &aMover)
std::map< int, UNITS_PROVIDER * > m_unitsProviders
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...
void DestroyTable(wxGridTableBase *aTable)
Work-around for a bug in wxGrid which crashes when deleting the table if the cell edit control was no...
std::unordered_map< int, std::pair< EDA_UNITS, EDA_DATA_TYPE > > m_autoEvalColsUnits
void SetAutoEvalColUnits(int col, EDA_UNITS aUnit, EDA_DATA_TYPE aUnitType)
Set the unit and unit data type to use for a given column.
bool CancelPendingChanges()
void SetColLabelSize(int aHeight)
Hide wxGrid's SetColLabelSize() method with one which makes sure the size is tall enough for the syst...
static int CapHeightToVisibleRows(int aMinHeight, int aHeaderHeight, const std::vector< int > &aRowHeights, int aMaxRows)
Height of aMaxRows data rows plus the column-label header, never more than aMinHeight.
void SwapRows(int aRowA, int aRowB)
These aren't that tricky, but might as well share code.
std::pair< EDA_UNITS, EDA_DATA_TYPE > getColumnUnits(int aCol) const
Returns the units and data type associated with a given column.
void SetUnitValue(int aRow, int aCol, int aValue)
Set a unitized cell's value.
WX_GRID(wxWindow *parent, wxWindowID id, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxWANTS_CHARS, const wxString &name=wxGridNameStr)
int GetUnitValue(int aRow, int aCol)
Apply standard KiCad unit and eval services to a numeric cell.
std::vector< int > m_autoEvalCols
UNITS_PROVIDER * getUnitsProvider(int aCol) const
std::map< std::pair< int, int >, std::pair< wxString, wxString > > m_evalBeforeAfter
void SetMinVisibleRows(wxWindow *aDialog, int aMinRows)
Floor this grid at aMinRows visible rows and grow aDialog so it opens tall enough to show every curre...
void DrawCornerLabel(wxDC &dc) override
A re-implementation of wxGrid::DrawCornerLabel which draws flat borders.
ROW_ICON_PROVIDER * m_rowIconProvider
void onCellEditorHidden(wxGridEvent &aEvent)
void SetupColumnAutosizer(int aFlexibleCol)
Set autosize behaviour using wxFormBuilder column widths as minimums, with a single specified growabl...
void RecomputeGridWidths()
void OnMoveRowDown(const std::function< void(int row)> &aMover)
void onGridColMove(wxGridEvent &aEvent)
void SetOptionalUnitValue(int aRow, int aCol, std::optional< int > aValue)
Set a unitized cell's optional value.
void onSizeEvent(wxSizeEvent &aEvent)
void onCellEditorShown(wxGridEvent &aEvent)
void EnsureColLabelsVisible()
Ensure the height of the row displaying the column labels is enough, even if labels are multiline tex...
void OnDeleteRows(const std::function< void(int row)> &aDeleter)
Handles a row deletion event.
wxString GetShownColumnsAsString()
Get a tokenized string containing the shown column indexes.
void OnAddRow(const std::function< std::pair< int, int >()> &aAdder)
void DrawRowLabel(wxDC &dc, int row) override
A re-implementation of wxGrid::DrawRowLabel which draws flat borders.
std::bitset< 64 > GetShownColumns()
static void CellEditorSetMargins(wxTextEntryBase *aEntry)
A helper function to set OS-specific margins for text-based cell editors.
std::optional< int > GetOptionalUnitValue(int aRow, int aCol)
Apply standard KiCad unit and eval services to a numeric cell.
void EnableAlternateRowColors(bool aEnable=true)
Enable alternate row highlighting, where every odd row has a different background color than the even...
void SetUnitsProvider(UNITS_PROVIDER *aProvider, int aCol=0)
Set a EUNITS_PROVIDER to enable use of unit- and eval-based Getters.
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
std::unique_ptr< NUMERIC_EVALUATOR > m_eval
void DrawColLabel(wxDC &dc, int col) override
A re-implementation of wxGrid::DrawColLabel which left-aligns the first column and draws flat borders...
static void CellEditorTransformSizeRect(wxRect &aRect)
A helper function to tweak sizes of text-based cell editors depending on OS.
EDA_DATA_TYPE
The type of unit.
KICOMMON_API wxFont GetControlFont(wxWindow *aWindow)
const int c_IndicatorSizeDIP
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
PGM_BASE & Pgm()
The global program "get" accessor.
std::vector< std::vector< std::string > > table
Functions to provide common constants and other functions to assist in making a consistent UI.
wxColour getBorderColour()
#define MIN_GRIDCELL_MARGIN