KiCad PCB EDA Suite
Loading...
Searching...
No Matches
wx_grid.h
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 The KiCad Developers, see AUTHORS.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 3
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#ifndef KICAD_WX_GRID_H
25#define KICAD_WX_GRID_H
26
27#include <bitset>
28#include <memory>
29#include <utility>
30#include <vector>
31
32#include <wx/event.h>
33#include <wx/grid.h>
34#include <wx/version.h>
35
37#include <units_provider.h>
38
39class wxTextEntryBase;
40
41
42class WX_GRID_TABLE_BASE : public wxGridTableBase
43{
44protected:
45 wxGridCellAttr* enhanceAttr( wxGridCellAttr* aInputAttr, int aRow, int aCol,
46 wxGridCellAttr::wxAttrKind aKind );
47};
48
49
50class WX_GRID : public wxGrid
51{
52public:
53 // Constructor has to be wxFormBuilder-compatible
54 WX_GRID( wxWindow *parent, wxWindowID id,
55 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
56 long style = wxWANTS_CHARS, const wxString& name = wxGridNameStr );
57
58 ~WX_GRID() override;
59
66 void SetColLabelSize( int aHeight ); // Yes, we're hiding a non-virtual method
67
72 void SetLabelFont( const wxFont& aFont ); // Yes, we're hiding a non-virtual method
73
80 void EnableAlternateRowColors( bool aEnable = true );
81
87 wxString GetShownColumnsAsString();
88 std::bitset<64> GetShownColumns();
89
93 void ShowHideColumns( const wxString& shownColumns );
94
98 void ShowHideColumns( const std::bitset<64>& aShownColumns );
99
104 void SetTable( wxGridTableBase* table, bool aTakeOwnership = false );
105
110 void DestroyTable( wxGridTableBase* aTable );
111
118 bool CommitPendingChanges( bool aQuietMode = false );
120
126 void SetUnitsProvider( UNITS_PROVIDER* aProvider, int aCol = 0 );
127
128 void SetAutoEvalCols( const std::vector<int>& aCols ) { m_autoEvalCols = aCols; }
129
138 int GetUnitValue( int aRow, int aCol );
139
140
148 std::optional<int> GetOptionalUnitValue( int aRow, int aCol );
149
153 void SetUnitValue( int aRow, int aCol, int aValue );
154
158 void SetOptionalUnitValue( int aRow, int aCol, std::optional<int> aValue );
159
169 int GetVisibleWidth( int aCol, bool aHeader = true, bool aContents = true, bool aKeep = false );
170
176
185 void ShowEditorOnMouseUp() { m_waitForSlowClick = true; }
186 void CancelShowEditorOnMouseUp() { m_waitForSlowClick = false; }
187
194 {
195 if( GetNumberRows() )
196 DeleteRows( 0, GetNumberRows() );
197 }
198
202 static void CellEditorSetMargins( wxTextEntryBase* aEntry );
203
207 static void CellEditorTransformSizeRect( wxRect& aRect );
208
215 void OverrideMinSize( double aXPct, double aYPct )
216 {
217 wxSize size = DoGetBestSize();
218 m_minSizeOverride = wxSize( KiROUND( size.x * aXPct ), KiROUND( size.y * aYPct ) );
219 }
220
221 wxSize DoGetBestSize() const override
222 {
224 return m_minSizeOverride.value();
225 else
226 return wxGrid::DoGetBestSize();
227 }
228
229protected:
234 void DrawColLabel( wxDC& dc, int col ) override;
235
239 void DrawRowLabel( wxDC& dc, int row ) override;
240
244 void DrawCornerLabel( wxDC& dc ) override;
245
246 void onGridColMove( wxGridEvent& aEvent );
247 void onGridCellSelect( wxGridEvent& aEvent );
248 void onCellEditorShown( wxGridEvent& aEvent );
249 void onCellEditorHidden( wxGridEvent& aEvent );
250
251 void onDPIChanged(wxDPIChangedEvent& event);
252
253protected:
255
256 std::map<int, UNITS_PROVIDER*> m_unitsProviders;
257 std::unique_ptr<NUMERIC_EVALUATOR> m_eval;
258 std::vector<int> m_autoEvalCols;
259
260 std::map< std::pair<int, int>, std::pair<wxString, wxString> > m_evalBeforeAfter;
261
262 std::optional<wxSize> m_minSizeOverride;
263};
264
265#endif //KICAD_WX_GRID_H
const char * name
Definition: DXF_plotter.cpp:59
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition: box2.h:990
wxGridCellAttr * enhanceAttr(wxGridCellAttr *aInputAttr, int aRow, int aCol, wxGridCellAttr::wxAttrKind aKind)
Definition: wx_grid.cpp:45
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.
Definition: wx_grid.cpp:778
void onGridCellSelect(wxGridEvent &aEvent)
Definition: wx_grid.cpp:332
~WX_GRID() override
Definition: wx_grid.cpp:226
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...
Definition: wx_grid.cpp:271
bool m_weOwnTable
Definition: wx_grid.h:254
void onDPIChanged(wxDPIChangedEvent &event)
Definition: wx_grid.cpp:240
void ShowHideColumns(const wxString &shownColumns)
Show/hide the grid columns based on a tokenized string of shown column indexes.
Definition: wx_grid.cpp:496
std::map< int, UNITS_PROVIDER * > m_unitsProviders
Definition: wx_grid.h:256
std::optional< wxSize > m_minSizeOverride
Definition: wx_grid.h:262
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...
Definition: wx_grid.cpp:277
void DestroyTable(wxGridTableBase *aTable)
Work-around for a bug in wxGrid which crashes when deleting the table if the cell edit control was no...
Definition: wx_grid.cpp:451
void OverrideMinSize(double aXPct, double aYPct)
Grids that have column sizes automatically set to fill the available width don't want to shrink after...
Definition: wx_grid.h:215
bool CancelPendingChanges()
Definition: wx_grid.cpp:618
void SetColLabelSize(int aHeight)
Hide wxGrid's SetColLabelSize() method with one which makes sure the size is tall enough for the syst...
Definition: wx_grid.cpp:256
void SetUnitValue(int aRow, int aCol, int aValue)
Set a unitized cell's value.
Definition: wx_grid.cpp:749
int GetUnitValue(int aRow, int aCol)
Apply standard KiCad unit and eval services to a numeric cell.
Definition: wx_grid.cpp:707
std::vector< int > m_autoEvalCols
Definition: wx_grid.h:258
std::map< std::pair< int, int >, std::pair< wxString, wxString > > m_evalBeforeAfter
Definition: wx_grid.h:260
void CancelShowEditorOnMouseUp()
Definition: wx_grid.h:186
void DrawCornerLabel(wxDC &dc) override
A re-implementation of wxGrid::DrawCornerLabel which draws flat borders.
Definition: wx_grid.cpp:526
void onCellEditorHidden(wxGridEvent &aEvent)
Definition: wx_grid.cpp:374
void ShowEditorOnMouseUp()
WxWidgets has a bunch of bugs in its handling of wxGrid mouse events which close cell editors right a...
Definition: wx_grid.h:185
void onGridColMove(wxGridEvent &aEvent)
Definition: wx_grid.cpp:771
void SetOptionalUnitValue(int aRow, int aCol, std::optional< int > aValue)
Set a unitized cell's optional value.
Definition: wx_grid.cpp:760
void onCellEditorShown(wxGridEvent &aEvent)
Definition: wx_grid.cpp:359
void EnsureColLabelsVisible()
Ensure the height of the row displaying the column labels is enough, even if labels are multiline tex...
Definition: wx_grid.cpp:819
wxString GetShownColumnsAsString()
Get a tokenized string containing the shown column indexes.
Definition: wx_grid.cpp:466
void DrawRowLabel(wxDC &dc, int row) override
A re-implementation of wxGrid::DrawRowLabel which draws flat borders.
Definition: wx_grid.cpp:586
std::bitset< 64 > GetShownColumns()
Definition: wx_grid.cpp:485
static void CellEditorSetMargins(wxTextEntryBase *aEntry)
A helper function to set OS-specific margins for text-based cell editors.
Definition: wx_grid.cpp:77
std::optional< int > GetOptionalUnitValue(int aRow, int aCol)
Apply standard KiCad unit and eval services to a numeric cell.
Definition: wx_grid.cpp:728
void SetAutoEvalCols(const std::vector< int > &aCols)
Definition: wx_grid.h:128
void EnableAlternateRowColors(bool aEnable=true)
Enable alternate row highlighting, where every odd row has a different background color than the even...
Definition: wx_grid.cpp:313
void SetUnitsProvider(UNITS_PROVIDER *aProvider, int aCol=0)
Set a EUNITS_PROVIDER to enable use of unit- and eval-based Getters.
Definition: wx_grid.cpp:698
void ClearRows()
wxWidgets recently added an ASSERT which fires if the position is greater than or equal to the number...
Definition: wx_grid.h:193
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:646
std::unique_ptr< NUMERIC_EVALUATOR > m_eval
Definition: wx_grid.h:257
void DrawColLabel(wxDC &dc, int col) override
A re-implementation of wxGrid::DrawColLabel which left-aligns the first column and draws flat borders...
Definition: wx_grid.cpp:547
wxSize DoGetBestSize() const override
Definition: wx_grid.h:221
static void CellEditorTransformSizeRect(wxRect &aRect)
A helper function to tweak sizes of text-based cell editors depending on OS.
Definition: wx_grid.cpp:85