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;
379 Connect( wxEVT_IDLE, wxIdleEventHandler( WX_GRID::onIdleRefreshHighlight ),
nullptr,
this );
388 wxGridTableBase*
table = wxGrid::GetTable();
390 wxCHECK_MSG(
table, ,
"Tried to enable alternate row colors without a table assigned to the grid" );
394 wxColor color = wxGrid::GetDefaultCellBackgroundColour();
399 table->SetAttrProvider(
nullptr );
409 int row = aEvent.GetRow();
410 int col = aEvent.GetCol();
412 if( row >= 0 && row < GetNumberRows() && col >= 0 && col < GetNumberCols() )
414 if( GetSelectionMode() == wxGrid::wxGridSelectCells )
416 SelectBlock( row, col, row, col,
false );
418 else if( GetSelectionMode() == wxGrid::wxGridSelectRows
419 || GetSelectionMode() == wxGrid::wxGridSelectRowsOrColumns )
421 SelectBlock( row, 0, row, GetNumberCols() - 1,
false );
423 else if( GetSelectionMode() == wxGrid::wxGridSelectColumns )
425 SelectBlock( 0, col, GetNumberRows() - 1, col,
false );
435void WX_GRID::onIdleRefreshHighlight( wxIdleEvent& aEvent )
445 if( !IsShownOnScreen() )
448 Disconnect( wxEVT_IDLE, wxIdleEventHandler( WX_GRID::onIdleRefreshHighlight ),
nullptr,
this );
458 int row = aEvent.GetRow();
459 int col = aEvent.GetCol();
461 const std::pair<wxString, wxString>& beforeAfter =
m_evalBeforeAfter[ { row, col } ];
463 if( GetCellValue( row, col ) == beforeAfter.second )
464 SetCellValue( row, col, beforeAfter.first );
471 const int col = aEvent.GetCol();
478 EDA_UNITS cellUnits = cellUnitsData.first;
481 m_eval->SetDefaultUnits( cellUnits );
483 const int row = aEvent.GetRow();
486 bool isNullable =
false;
487 wxGridCellEditor* cellEditor = GetCellEditor( row, col );
493 isNullable = nullable->IsNullable();
495 cellEditor->DecRef();
499 [
this, row, col, isNullable, unitsProvider, cellDataType]()
503 if( row >= GetNumberRows() || col >= GetNumberCols() )
506 wxString stringValue = GetCellValue( row, col );
507 bool processedOk =
true;
510 processedOk =
m_eval->Process( stringValue );
518 std::optional<int> val;
538 if( stringValue != evalValue )
540 SetCellValue( row, col, evalValue );
561 Disconnect( wxEVT_IDLE, wxIdleEventHandler( WX_GRID::onIdleRefreshHighlight ),
nullptr,
this );
564 wxGrid::SetTable(
nullptr );
571 wxString shownColumns;
573 for(
int i = 0; i < GetNumberCols(); ++i )
575 if( IsColShown( i ) )
577 if( shownColumns.Length() )
578 shownColumns << wxT(
" " );
590 std::bitset<64> shownColumns;
592 for(
int ii = 0; ii < GetNumberCols(); ++ii )
593 shownColumns[ii] = IsColShown( ii );
601 for(
int i = 0; i < GetNumberCols(); ++i )
604 wxStringTokenizer shownTokens( shownColumns,
" \t\r\n", wxTOKEN_STRTOK );
606 while( shownTokens.HasMoreTokens() )
609 shownTokens.GetNextToken().ToLong( &colNumber );
611 if( colNumber >= 0 && colNumber < GetNumberCols() )
612 ShowCol( (
int) colNumber );
619 if( m_nativeColumnLabels )
620 wxGrid::DrawCornerLabel( dc );
622 wxRect rect( wxSize( m_rowLabelWidth, m_colLabelHeight ) );
628 wxDCBrushChanger setBrush( dc, m_colLabelWin->GetBackgroundColour() );
629 wxDCPenChanger setPen( dc, m_colLabelWin->GetBackgroundColour() );
630 dc.DrawRectangle( rect.Inflate( 1 ) );
639 if( m_nativeColumnLabels )
640 wxGrid::DrawColLabel( dc, col );
642 if( GetColWidth( col ) <= 0 || m_colLabelHeight <= 0 )
645 wxRect rect( GetColLeft( col ), 0, GetColWidth( col ), m_colLabelHeight );
651 wxDCBrushChanger setBrush( dc, m_colLabelWin->GetBackgroundColour() );
652 wxDCPenChanger setPen( dc, m_colLabelWin->GetBackgroundColour() );
653 dc.DrawRectangle( rect.Inflate( 1 ) );
659 dc.SetFont( GetLabelFont() );
662 GetColLabelAlignment( &hAlign, &vAlign );
663 const int orient = GetColLabelTextOrientation();
666 hAlign = wxALIGN_LEFT;
668 if( hAlign == wxALIGN_LEFT )
671 rend.DrawLabel( *
this, dc, GetColLabelValue( col ), rect, hAlign, vAlign, orient );
677 if( GetRowHeight( row ) <= 0 || m_rowLabelWidth <= 0 )
680 wxRect rect( 0, GetRowTop( row ), m_rowLabelWidth, GetRowHeight( row ) );
686 wxDCBrushChanger setBrush( dc, m_colLabelWin->GetBackgroundColour() );
687 wxDCPenChanger setPen( dc, m_colLabelWin->GetBackgroundColour() );
688 dc.DrawRectangle( rect.Inflate( 1 ) );
694 dc.SetFont( GetLabelFont() );
697 GetRowLabelAlignment(&hAlign, &vAlign);
699 if( hAlign == wxALIGN_LEFT )
702 rend.DrawLabel( *
this, dc, GetRowLabelValue( row ), rect, hAlign, vAlign, wxHORIZONTAL );
708 if( !IsCellEditControlEnabled() )
711 HideCellEditControl();
714 m_cellEditCtrlEnabled =
false;
716 int row = m_currentCellCoords.GetRow();
717 int col = m_currentCellCoords.GetCol();
719 wxString oldval = GetCellValue( row, col );
722 wxGridCellAttr* attr = GetCellAttr( row, col );
723 wxGridCellEditor*
editor = attr->GetEditor(
this, row, col );
725 editor->EndEdit( row, col,
this, oldval, &newval );
736 if( !IsCellEditControlEnabled() )
739 if( !aQuietMode && SendEvent( wxEVT_GRID_EDITOR_HIDDEN ) == -1 )
742 HideCellEditControl();
745 m_cellEditCtrlEnabled =
false;
747 int row = m_currentCellCoords.GetRow();
748 int col = m_currentCellCoords.GetCol();
750 wxString oldval = GetCellValue( row, col );
753 wxGridCellAttr* attr = GetCellAttr( row, col );
754 wxGridCellEditor*
editor = attr->GetEditor(
this, row, col );
756 bool changed =
editor->EndEdit( row, col,
this, oldval, &newval );
763 if( !aQuietMode && SendEvent( wxEVT_GRID_CELL_CHANGING, newval ) == -1 )
766 editor->ApplyEdit( row, col,
this );
771 if( !aQuietMode && SendEvent( wxEVT_GRID_CELL_CHANGED, oldval ) == -1 )
774 SetCellValue( row, col, oldval );
791 auto [row, editCol] = aAdder();
795 MakeCellVisible( row, std::max( editCol, 0 ) );
796 SetGridCursor( row, std::max( editCol, 0 ) );
800 EnableCellEditControl(
true );
801 ShowCellEditControl();
818 const std::function<
void(
int row )>& aDeleter )
820 wxArrayInt selectedRows = GetSelectedRows();
822 auto addSelectedRow = [&](
int row )
824 for(
size_t i = 0; i < selectedRows.size(); ++i )
826 if( selectedRows[i] == row )
830 selectedRows.push_back( row );
833 wxGridCellCoordsArray topLeft = GetSelectionBlockTopLeft();
834 wxGridCellCoordsArray botRight = GetSelectionBlockBottomRight();
836 for(
size_t i = 0; i < std::min( topLeft.Count(), botRight.Count() ); ++i )
838 for(
int row = topLeft[i].GetRow(); row <= botRight[i].GetRow(); ++row )
839 addSelectedRow( row );
842 wxGridCellCoordsArray cells = GetSelectedCells();
844 for(
size_t i = 0; i < cells.Count(); ++i )
845 addSelectedRow( cells[i].GetRow() );
847 if( selectedRows.empty() && GetGridCursorRow() >= 0 )
848 selectedRows.push_back( GetGridCursorRow() );
850 if( selectedRows.empty() )
853 for(
int row : selectedRows )
855 if( !aFilter( row ) )
864 [](
int* first,
int* second )
866 return *second - *first;
869 int nextSelRow = selectedRows.back() - 1;
871 if( nextSelRow >= 0 )
873 GoToCell( nextSelRow, GetGridCursorCol() );
874 SetGridCursor( nextSelRow, GetGridCursorCol() );
877 for(
int row : selectedRows )
884 for(
int col = 0; col < GetNumberCols(); ++col )
886 wxString temp = GetCellValue( aRowA, col );
887 SetCellValue( aRowA, col, GetCellValue( aRowB, col ) );
888 SetCellValue( aRowB, col, temp );
905 const std::function<
void(
int row )>& aMover )
910 int i = GetGridCursorRow();
912 if( i > 0 && aFilter( i ) )
916 SetGridCursor( i - 1, GetGridCursorCol() );
917 MakeCellVisible( GetGridCursorRow(), GetGridCursorCol() );
938 const std::function<
void(
int row )>& aMover )
943 int i = GetGridCursorRow();
945 if( i + 1 < GetNumberRows() && aFilter( i ) )
949 SetGridCursor( i + 1, GetGridCursorCol() );
950 MakeCellVisible( GetGridCursorRow(), GetGridCursorCol() );
983 wxString stringValue = GetCellValue( aRow, aCol );
989 m_eval->SetDefaultUnits( cellUnits );
991 if(
m_eval->Process( stringValue ) )
992 stringValue =
m_eval->Result();
1001 wxString stringValue = GetCellValue( aRow, aCol );
1007 m_eval->SetDefaultUnits( cellUnits );
1010 stringValue =
m_eval->Result();
1026 SetCellValue( aRow, aCol,
getUnitsProvider( aCol )->StringFromValue( aValue,
true, cellDataType ) );
1039 SetCellValue( aRow, aCol,
getUnitsProvider( aCol )->StringFromOptionalValue( aValue,
true, cellDataType ) );
1057 size = GetRowLabelSize();
1059 for(
int row = 0; aContents && row < GetNumberRows(); row++ )
1060 size = std::max( size,
int( GetTextExtent( GetRowLabelValue( row ) + wxS(
"M" ) ).x ) );
1065 size = GetColSize( aCol );
1073 size = std::max( size,
int( GetTextExtent( GetColLabelValue( aCol ) + wxS(
"M" ) ).x ) );
1076 for(
int row = 0; aContents && row < GetNumberRows(); row++ )
1079 if( GetTable()->CanGetValueAs( row, aCol, wxGRID_VALUE_STRING ) )
1080 size = std::max( size, GetTextExtent( GetCellValue( row, aCol ) + wxS(
"M" ) ).x );
1082 size = std::max( size, GetTextExtent(
"MM" ).x );
1092 int line_height = int( GetTextExtent(
"Mj" ).y ) + 3;
1093 int row_height = GetColLabelSize();
1094 int initial_row_height = row_height;
1099 for(
int col = 0; col < GetNumberCols(); col++ )
1101 int nl_count = GetColLabelValue( col ).Freq(
'\n' );
1106 if( row_height < line_height * ( nl_count+1 ) )
1107 row_height += line_height * nl_count;
1113 if( initial_row_height != row_height )
1130 const int colCount = GetNumberCols();
1132 for(
int ii = 0; ii < GetNumberCols(); ++ii )
1137 wxASSERT_MSG(
m_flexibleCol < colCount,
"Flexible column index does not exist in grid" );
1139 Bind( wxEVT_UPDATE_UI,
1140 [
this]( wxUpdateUIEvent& aEvent )
1147 [
this]( wxSizeEvent& aEvent )
1154 Bind( wxEVT_GRID_CELL_CHANGED,
1155 [
this]( wxGridEvent& aEvent )
1167 const int width = GetSize().GetX() - wxSystemSettings::GetMetric( wxSYS_VSCROLL_X );
1169 std::optional<int> flexibleMinWidth;
1173 if( GetColSize( colIndex ) != 0 )
1175 AutoSizeColumn( colIndex );
1176 const int colSize = GetColSize( colIndex );
1178 int minWidthScaled = FromDIP( minWidth );
1179 SetColSize( colIndex, std::max( minWidthScaled, colSize ) );
1182 flexibleMinWidth = minWidthScaled;
1187 int nonFlexibleWidth = 0;
1189 for(
int i = 0; i < GetNumberCols(); ++i )
1192 nonFlexibleWidth += GetColSize( i );
1196 SetColSize(
m_flexibleCol, std::max( flexibleMinWidth.value_or( 0 ), width - nonFlexibleWidth ) );
1207 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.
bool m_cursorRowColumnHighlight
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.
Functions to provide common constants and other functions to assist in making a consistent UI.
wxColour getBorderColour()
#define MIN_GRIDCELL_MARGIN