KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eeschema/dialogs/dialog_table_properties.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) 2023-2024 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 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 <kiplatform/ui.h>
25#include <ee_actions.h>
26#include <sch_edit_frame.h>
29#include <widgets/wx_grid.h>
31#include <grid_tricks.h>
33#include <sch_table.h>
34#include <sch_commit.h>
35#include <tool/tool_manager.h>
37
38
41 m_frame( aFrame ),
42 m_table( aTable ),
43 m_borderWidth( aFrame, m_borderWidthLabel, m_borderWidthCtrl, m_borderWidthUnits ),
44 m_separatorsWidth( aFrame, m_separatorsWidthLabel, m_separatorsWidthCtrl, m_separatorsWidthUnits )
45{
46 m_grid = new WX_GRID( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
47
48 m_grid->CreateGrid( m_table->GetRowCount(), m_table->GetColCount() );
49 m_grid->EnableEditing( true );
50 m_grid->EnableGridLines( true );
51 m_grid->EnableDragGridSize( false );
52 m_grid->SetMargins( 0, 0 );
53 m_grid->SetCellHighlightROPenWidth( 0 );
54
55 m_grid->EnableDragColMove( false );
56 m_grid->EnableDragColSize( false );
58 m_grid->EnableDragRowMove( false );
59 m_grid->EnableDragRowSize( false );
60 m_grid->SetRowLabelSize( 0 );
61 m_grid->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
62
63 m_gridSizer->Add( m_grid, 1, wxEXPAND, 5 );
64 m_grid->PushEventHandler( new GRID_TRICKS( m_grid ) );
65
66 wxColor coveredColor = wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT );
67
68 for( int row = 0; row < m_table->GetRowCount(); ++row )
69 {
70 for( int col = 0; col < m_table->GetColCount(); ++col )
71 {
72 const SCH_TABLECELL* cell = m_table->GetCell( row, col );
73 wxGridCellAttr* attr = new wxGridCellAttr;
74
75 if( cell->GetColSpan() == 0 || cell->GetRowSpan() == 0 )
76 {
77 attr->SetRenderer( new GRID_CELL_COLOR_RENDERER( this ) );
78 attr->SetReadOnly();
79 }
80 else
81 {
82 attr->SetEditor( new GRID_CELL_STC_EDITOR( true,
83 // onCharFn
84 [this]( wxStyledTextEvent& aEvent, SCINTILLA_TRICKS* aScintillaTricks )
85 {
86 aScintillaTricks->DoTextVarAutocomplete(
87 // getTokensFn
88 [this]( const wxString& xRef, wxArrayString* tokens )
89 {
90 getContextualTextVars( xRef, tokens );
91 } );
92 } ) );
93 }
94
95 m_grid->SetAttr( row, col, attr );
96 }
97 }
98
99 for( const auto& [lineStyle, lineStyleDesc] : lineTypeNames )
100 {
101 m_borderStyleCombo->Append( lineStyleDesc.name, KiBitmap( lineStyleDesc.bitmap ) );
102 m_separatorsStyleCombo->Append( lineStyleDesc.name, KiBitmap( lineStyleDesc.bitmap ) );
103 }
104
107
111
113 m_infoBar->ShowMessage( _( "Note: individual item colors overridden in Preferences." ) );
114
116 Layout();
117
118 // Now all widgets have the size fixed, call FinishDialogSettings
120}
121
122
124{
125 // Delete the GRID_TRICKS.
126 m_grid->PopEventHandler( true );
127}
128
129
131{
132 if( !wxDialog::TransferDataToWindow() )
133 return false;
134
135 //
136 // Cell Contents
137 //
138
139 wxColour coveredColor = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE );
140
142 coveredColor = coveredColor.ChangeLightness( 140 );
143 else
144 coveredColor = coveredColor.ChangeLightness( 100 );
145
146 for( int row = 0; row < m_table->GetRowCount(); ++row )
147 {
148 for( int col = 0; col < m_table->GetColCount(); ++col )
149 {
150 SCH_TABLECELL* tableCell = m_table->GetCell( row, col );
151
152 if( tableCell->GetColSpan() == 0 || tableCell->GetRowSpan() == 0 )
153 m_grid->SetCellValue( row, col, coveredColor.GetAsString() );
154 else
155 m_grid->SetCellValue( row, col, tableCell->GetText() );
156 }
157 }
158
159 CallAfter( [this]()
160 {
161 for( int row = 0; row < m_table->GetRowCount(); ++row )
162 {
163 for( int col = 0; col < m_table->GetColCount(); ++col )
164 {
165 SCH_TABLECELL* tableCell = m_table->GetCell( row, col );
166
167 if( tableCell->IsSelected() )
168 {
169 m_grid->SetGridCursor( row, col );
170 m_grid->EnableCellEditControl();
171 m_grid->ShowCellEditControl();
172 return;
173 }
174 }
175 }
176 } );
177
179
180 //
181 // Table Properties
182 //
183
185 m_headerBorder->SetValue( m_table->StrokeHeader() );
186
187 if( m_table->GetBorderStroke().GetWidth() >= 0 )
189
191
192 int style = static_cast<int>( m_table->GetBorderStroke().GetLineStyle() );
193
194 if( style == -1 )
195 m_borderStyleCombo->SetStringSelection( DEFAULT_STYLE );
196 else if( style < (int) lineTypeNames.size() )
197 m_borderStyleCombo->SetSelection( style );
198 else
199 wxFAIL_MSG( "Line type not found in the type lookup map" );
200
206
207 bool rows = m_table->StrokeRows() && m_table->GetSeparatorsStroke().GetWidth() >= 0;
208 bool cols = m_table->StrokeColumns() && m_table->GetSeparatorsStroke().GetWidth() >= 0;
209
210 m_rowSeparators->SetValue( rows );
211 m_colSeparators->SetValue( cols );
212
213 if( m_table->GetSeparatorsStroke().GetWidth() >= 0 )
215
217
218 style = static_cast<int>( m_table->GetSeparatorsStroke().GetLineStyle() );
219
220 if( style == -1 )
221 m_separatorsStyleCombo->SetStringSelection( DEFAULT_STYLE );
222 else if( style < (int) lineTypeNames.size() )
223 m_separatorsStyleCombo->SetSelection( style );
224 else
225 wxFAIL_MSG( "Line type not found in the type lookup map" );
226
227 m_separatorsWidth.Enable( rows || cols );
228 m_separatorsColorLabel->Enable( rows || cols );
229 m_separatorsColorSwatch->Enable( rows || cols );
230 m_separatorsStyleLabel->Enable( rows || cols );
231 m_separatorsStyleCombo->Enable( rows || cols );
232
233 return true;
234}
235
236
238 wxArrayString* aTokens )
239{
240 if( !aCrossRef.IsEmpty() )
241 {
243 SCH_SYMBOL* refSymbol = nullptr;
244
246
247 for( int jj = 0; jj < (int) refs.GetCount(); jj++ )
248 {
249 SCH_REFERENCE& ref = refs[jj];
250
251 if( ref.GetSymbol()->GetRef( &ref.GetSheetPath(), true ) == aCrossRef )
252 {
253 refSymbol = ref.GetSymbol();
254 break;
255 }
256 }
257
258 if( refSymbol )
259 refSymbol->GetContextualTextVars( aTokens );
260 }
261 else
262 {
263 SCHEMATIC* schematic = m_table->Schematic();
264
265 if( schematic && schematic->CurrentSheet().Last() )
266 {
267 schematic->CurrentSheet().Last()->GetContextualTextVars( aTokens );
268 }
269 else
270 {
271 for( std::pair<wxString, wxString> entry : Prj().GetTextVars() )
272 aTokens->push_back( entry.first );
273 }
274 }
275}
276
277
278void DIALOG_TABLE_PROPERTIES::onBorderChecked( wxCommandEvent& aEvent )
279{
280 bool border = m_borderCheckbox->GetValue();
281
282 if( border && m_borderWidth.GetValue() < 0 )
284
285 m_borderWidth.Enable( border );
286 m_borderColorLabel->Enable( border );
287 m_borderColorSwatch->Enable( border );
288 m_borderStyleLabel->Enable( border );
289 m_borderStyleCombo->Enable( border );
290
291 bool row = m_rowSeparators->GetValue();
292 bool col = m_colSeparators->GetValue();
293
294 if( ( row || col ) && m_separatorsWidth.GetValue() < 0 )
296
297 m_separatorsWidth.Enable( row || col );
298 m_separatorsColorLabel->Enable( row || col );
299 m_separatorsColorSwatch->Enable( row || col );
300 m_separatorsStyleLabel->Enable( row || col );
301 m_separatorsStyleCombo->Enable( row || col );
302}
303
304
306{
308 return false;
309
310 if( !wxDialog::TransferDataFromWindow() )
311 return false;
312
313 SCH_COMMIT commit( m_frame );
314
315 /* save table in undo list if not already in edit */
316 if( m_table->GetEditFlags() == 0 )
317 commit.Modify( m_table, m_frame->GetScreen() );
318
319 for( int row = 0; row < m_table->GetRowCount(); ++row )
320 {
321 for( int col = 0; col < m_table->GetColCount(); ++col )
322 {
323 SCH_TABLECELL* tableCell = m_table->GetCell( row, col );
324 wxString txt = m_grid->GetCellValue( row, col );
325
326#ifdef __WXMAC__
327 // On macOS CTRL+Enter produces '\r' instead of '\n' regardless of EOL setting.
328 // Replace it now.
329 txt.Replace( "\r", "\n" );
330#elif defined( __WINDOWS__ )
331 // On Windows, a new line is coded as \r\n. We use only \n in kicad files and in
332 // drawing routines so strip the \r char.
333 txt.Replace( "\r", "" );
334#endif
335
336 tableCell->SetText( txt );
337 }
338 }
339
341 m_table->SetStrokeHeader( m_headerBorder->GetValue() );
342 {
344
345 if( m_borderCheckbox->GetValue() )
346 stroke.SetWidth( std::max( 0, m_borderWidth.GetIntValue() ) );
347 else
348 stroke.SetWidth( -1 );
349
350 auto it = lineTypeNames.begin();
351 std::advance( it, m_borderStyleCombo->GetSelection() );
352
353 if( it == lineTypeNames.end() )
354 stroke.SetLineStyle( LINE_STYLE::DEFAULT );
355 else
356 stroke.SetLineStyle( it->first );
357
359
360 m_table->SetBorderStroke( stroke );
361 }
362
363 m_table->SetStrokeRows( m_rowSeparators->GetValue() );
365 {
367
368 if( m_rowSeparators->GetValue() || m_colSeparators->GetValue() )
369 stroke.SetWidth( std::max( 0, m_separatorsWidth.GetIntValue() ) );
370 else
371 stroke.SetWidth( -1 );
372
373 auto it = lineTypeNames.begin();
374 std::advance( it, m_separatorsStyleCombo->GetSelection() );
375
376 if( it == lineTypeNames.end() )
377 stroke.SetLineStyle( LINE_STYLE::DEFAULT );
378 else
379 stroke.SetLineStyle( it->first );
380
382
383 m_table->SetSeparatorsStroke( stroke );
384 }
385
386 if( !commit.Empty() )
387 commit.Push( _( "Edit Table" ) );
388
389 return true;
390}
391
392
394{
395 Layout(); // Make sure we get the current client size for the grid
396
397 wxSize availableGridSize = m_grid->GetClientSize();
398
399 if( availableGridSize.x == 0 || availableGridSize.y == 0 )
400 return;
401
402 BOX2I tableBBox = m_table->GetBoundingBox();
403 double scalerX = static_cast<double>( availableGridSize.x ) / tableBBox.GetWidth();
404 double scalerY = static_cast<double>( availableGridSize.y ) / tableBBox.GetHeight();
405
406 for( int row = 0; row < m_table->GetRowCount(); ++row )
407 m_grid->SetRowSize( row, std::floor( m_table->GetRowHeight( row ) * scalerY ) );
408
409 for( int col = 0; col < m_table->GetColCount(); ++col )
410 m_grid->SetColSize( col, std::floor( m_table->GetColWidth( col ) * scalerX ) );
411}
412
413
414void DIALOG_TABLE_PROPERTIES::onSize( wxSizeEvent& aEvent )
415{
416 if( m_table )
418
419 aEvent.Skip();
420}
421
422
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:104
size_type GetHeight() const
Definition: box2.h:205
size_type GetWidth() const
Definition: box2.h:204
bool GetOverrideSchItemColors() const
COLOR4D GetColor(int aLayer) const
void SetSwatchColor(const KIGFX::COLOR4D &aColor, bool aSendEvent)
Set the current swatch color directly.
KIGFX::COLOR4D GetSwatchColor() const
void SetSwatchBackground(const KIGFX::COLOR4D &aBackground)
Set the swatch background color.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
Definition: commit.h:105
bool Empty() const
Returns status of an item.
Definition: commit.h:144
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
DIALOG_TABLE_PROPERTIES(SCH_EDIT_FRAME *aParentFrame, SCH_TABLE *aTable)
void getContextualTextVars(const wxString &aCrossRef, wxArrayString *aTokens)
void onBorderChecked(wxCommandEvent &aEvent) override
void onSize(wxSizeEvent &aEvent) override
EDA_ITEM_FLAGS GetEditFlags() const
Definition: eda_item.h:133
bool IsSelected() const
Definition: eda_item.h:110
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:94
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:182
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Definition: grid_tricks.h:61
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
virtual std::map< wxString, wxString > & GetTextVars() const
Definition: project.cpp:84
Holds all the data relating to one schematic.
Definition: schematic.h:76
SCH_SHEET_PATH & CurrentSheet() const override
Definition: schematic.h:144
SCH_SHEET_LIST BuildUnorderedSheetList() const
Definition: schematic.h:101
EESCHEMA_SETTINGS * eeconfig() const
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Returns a pointer to the active color theme settings.
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
Definition: sch_commit.cpp:406
Schematic editor (Eeschema) main window.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
SCHEMATIC & Schematic() const
SCHEMATIC * Schematic() const
Searches the item hierarchy to find a SCHEMATIC.
Definition: sch_item.cpp:150
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
size_t GetCount() const
A helper to define a symbol's reference designator in a schematic.
const SCH_SHEET_PATH & GetSheetPath() const
SCH_SYMBOL * GetSymbol() const
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this sheet.
Definition: sch_sheet.cpp:212
Schematic symbol object.
Definition: sch_symbol.h:105
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this symbol.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
Definition: sch_symbol.cpp:720
int GetColSpan() const
Definition: sch_tablecell.h:61
int GetRowSpan() const
Definition: sch_tablecell.h:64
const STROKE_PARAMS & GetSeparatorsStroke() const
Definition: sch_table.h:72
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: sch_table.cpp:362
bool StrokeExternal() const
Definition: sch_table.h:54
int GetRowHeight(int aRow) const
Definition: sch_table.h:123
void SetStrokeHeader(bool aDoStroke)
Definition: sch_table.h:56
int GetColWidth(int aCol) const
Definition: sch_table.h:113
const STROKE_PARAMS & GetBorderStroke() const
Definition: sch_table.h:60
void SetStrokeExternal(bool aDoStroke)
Definition: sch_table.h:53
int GetColCount() const
Definition: sch_table.h:104
void SetStrokeColumns(bool aDoStroke)
Definition: sch_table.h:83
SCH_TABLECELL * GetCell(int aRow, int aCol) const
Definition: sch_table.h:131
bool StrokeColumns() const
Definition: sch_table.h:84
void SetSeparatorsStroke(const STROKE_PARAMS &aParams)
Definition: sch_table.h:71
bool StrokeRows() const
Definition: sch_table.h:87
int GetRowCount() const
Definition: sch_table.h:106
void SetStrokeRows(bool aDoStroke)
Definition: sch_table.h:86
void SetBorderStroke(const STROKE_PARAMS &aParams)
Definition: sch_table.h:59
bool StrokeHeader() const
Definition: sch_table.h:57
Add cut/copy/paste, dark theme, autocomplete and brace highlighting to a wxStyleTextCtrl instance.
void DoTextVarAutocomplete(const std::function< void(const wxString &xRef, wxArrayString *tokens)> &getTokensFn)
Simple container to manage line stroke parameters.
Definition: stroke_params.h:81
int GetWidth() const
Definition: stroke_params.h:91
void SetLineStyle(LINE_STYLE aLineStyle)
Definition: stroke_params.h:95
void SetWidth(int aWidth)
Definition: stroke_params.h:92
void SetColor(const KIGFX::COLOR4D &aColor)
Definition: stroke_params.h:98
LINE_STYLE GetLineStyle() const
Definition: stroke_params.h:94
KIGFX::COLOR4D GetColor() const
Definition: stroke_params.h:97
int GetIntValue()
Definition: unit_binder.h:127
virtual long long int GetValue()
Return the current value in Internal Units.
void Enable(bool aEnable)
Enable/disable the label, widget and units label.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
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:246
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:594
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Definition: wx_infobar.cpp:154
#define _(s)
@ LAYER_SCHEMATIC_BACKGROUND
Definition: layer_ids.h:392
bool IsDarkTheme()
Determine if the desktop interface is currently using a dark theme or a light theme.
Definition: wxgtk/ui.cpp:48
const std::map< LINE_STYLE, struct LINE_STYLE_DESC > lineTypeNames