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 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 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,
45 m_separatorsWidthUnits )
46{
47 m_grid = new WX_GRID( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
48
49 m_grid->CreateGrid( m_table->GetRowCount(), m_table->GetColCount() );
50 m_grid->EnableEditing( true );
51 m_grid->EnableGridLines( true );
52 m_grid->EnableDragGridSize( false );
53 m_grid->SetMargins( 0, 0 );
54 m_grid->SetCellHighlightROPenWidth( 0 );
55
56 m_grid->EnableDragColMove( false );
57 m_grid->EnableDragColSize( false );
59 m_grid->EnableDragRowMove( false );
60 m_grid->EnableDragRowSize( false );
61 m_grid->SetRowLabelSize( 0 );
62 m_grid->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
63
64 m_gridSizer->Add( m_grid, 1, wxEXPAND, 5 );
65 m_grid->PushEventHandler( new GRID_TRICKS( m_grid ) );
66
67 wxColor coveredColor = wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT );
68
69 for( int row = 0; row < m_table->GetRowCount(); ++row )
70 {
71 for( int col = 0; col < m_table->GetColCount(); ++col )
72 {
73 const SCH_TABLECELL* cell = m_table->GetCell( row, col );
74 wxGridCellAttr* attr = new wxGridCellAttr;
75
76 if( cell->GetColSpan() == 0 || cell->GetRowSpan() == 0 )
77 {
78 attr->SetRenderer( new GRID_CELL_COLOR_RENDERER( this ) );
79 attr->SetReadOnly();
80 }
81 else
82 {
83 attr->SetEditor( new GRID_CELL_STC_EDITOR( true,
84 // onCharFn
85 [this]( wxStyledTextEvent& aEvent, SCINTILLA_TRICKS* aScintillaTricks )
86 {
87 aScintillaTricks->DoTextVarAutocomplete(
88 // getTokensFn
89 [this]( const wxString& xRef, wxArrayString* tokens )
90 {
91 getContextualTextVars( xRef, tokens );
92 } );
93 } ) );
94 }
95
96 m_grid->SetAttr( row, col, attr );
97 }
98 }
99
100 for( const auto& [lineStyle, lineStyleDesc] : lineTypeNames )
101 {
102 m_borderStyleCombo->Append( lineStyleDesc.name, KiBitmap( lineStyleDesc.bitmap ) );
103 m_separatorsStyleCombo->Append( lineStyleDesc.name, KiBitmap( lineStyleDesc.bitmap ) );
104 }
105
109
111 m_infoBar->ShowMessage( _( "Note: individual item colors overridden in Preferences." ) );
112
114 Layout();
115
116 // Now all widgets have the size fixed, call FinishDialogSettings
118}
119
120
122{
123 // Delete the GRID_TRICKS.
124 m_grid->PopEventHandler( true );
125}
126
127
129{
130 if( !wxDialog::TransferDataToWindow() )
131 return false;
132
133 //
134 // Cell Contents
135 //
136
137 wxColour coveredColor = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE );
138
140 coveredColor = coveredColor.ChangeLightness( 140 );
141 else
142 coveredColor = coveredColor.ChangeLightness( 100 );
143
144 for( int row = 0; row < m_table->GetRowCount(); ++row )
145 {
146 for( int col = 0; col < m_table->GetColCount(); ++col )
147 {
148 SCH_TABLECELL* tableCell = m_table->GetCell( row, col );
149
150 if( tableCell->GetColSpan() == 0 || tableCell->GetRowSpan() == 0 )
151 {
152 m_grid->SetCellValue( row, col, coveredColor.GetAsString() );
153 continue;
154 }
155
156 wxString text = tableCell->GetText();
157
158 // show text variable cross-references in a human-readable format
159 if( SCHEMATIC* schematic = tableCell->Schematic() )
160 text = schematic->ConvertKIIDsToRefs( text );
161
162 m_grid->SetCellValue( row, col, text );
163 }
164 }
165
166 CallAfter( [this]()
167 {
168 for( int row = 0; row < m_table->GetRowCount(); ++row )
169 {
170 for( int col = 0; col < m_table->GetColCount(); ++col )
171 {
172 SCH_TABLECELL* tableCell = m_table->GetCell( row, col );
173
174 if( tableCell->IsSelected() )
175 {
176 m_grid->SetGridCursor( row, col );
177 m_grid->EnableCellEditControl();
178 m_grid->ShowCellEditControl();
179 return;
180 }
181 }
182 }
183 } );
184
186
187 //
188 // Table Properties
189 //
190
192 m_headerBorder->SetValue( m_table->StrokeHeader() );
193
194 if( m_table->GetBorderStroke().GetWidth() >= 0 )
196
198
199 int style = static_cast<int>( m_table->GetBorderStroke().GetLineStyle() );
200
201 if( style >= 0 && style < (int) lineTypeNames.size() )
202 m_borderStyleCombo->SetSelection( style );
203 else
204 m_borderStyleCombo->SetSelection( 0 );
205
211
212 bool rows = m_table->StrokeRows() && m_table->GetSeparatorsStroke().GetWidth() >= 0;
213 bool cols = m_table->StrokeColumns() && m_table->GetSeparatorsStroke().GetWidth() >= 0;
214
215 m_rowSeparators->SetValue( rows );
216 m_colSeparators->SetValue( cols );
217
218 if( m_table->GetSeparatorsStroke().GetWidth() >= 0 )
220
222
223 style = static_cast<int>( m_table->GetSeparatorsStroke().GetLineStyle() );
224
225 if( style >= 0 && style < (int) lineTypeNames.size() )
226 m_separatorsStyleCombo->SetSelection( style );
227 else
228 m_separatorsStyleCombo->SetSelection( 0 );
229
230 m_separatorsWidth.Enable( rows || cols );
231 m_separatorsColorLabel->Enable( rows || cols );
232 m_separatorsColorSwatch->Enable( rows || cols );
233 m_separatorsStyleLabel->Enable( rows || cols );
234 m_separatorsStyleCombo->Enable( rows || cols );
235
236 return true;
237}
238
239
241 wxArrayString* aTokens )
242{
243 if( !aCrossRef.IsEmpty() )
244 {
246 SCH_SYMBOL* refSymbol = nullptr;
247
249
250 for( int jj = 0; jj < (int) refs.GetCount(); jj++ )
251 {
252 SCH_REFERENCE& ref = refs[jj];
253
254 if( ref.GetSymbol()->GetRef( &ref.GetSheetPath(), true ) == aCrossRef )
255 {
256 refSymbol = ref.GetSymbol();
257 break;
258 }
259 }
260
261 if( refSymbol )
262 refSymbol->GetContextualTextVars( aTokens );
263 }
264 else
265 {
266 SCHEMATIC* schematic = m_table->Schematic();
267
268 if( schematic && schematic->CurrentSheet().Last() )
269 {
270 schematic->CurrentSheet().Last()->GetContextualTextVars( aTokens );
271 }
272 else
273 {
274 for( std::pair<wxString, wxString> entry : Prj().GetTextVars() )
275 aTokens->push_back( entry.first );
276 }
277 }
278}
279
280
281void DIALOG_TABLE_PROPERTIES::onBorderChecked( wxCommandEvent& aEvent )
282{
283 bool border = m_borderCheckbox->GetValue();
284
285 if( border && m_borderWidth.GetValue() < 0 )
287
288 m_borderWidth.Enable( border );
289 m_borderColorLabel->Enable( border );
290 m_borderColorSwatch->Enable( border );
291 m_borderStyleLabel->Enable( border );
292 m_borderStyleCombo->Enable( border );
293
294 bool row = m_rowSeparators->GetValue();
295 bool col = m_colSeparators->GetValue();
296
297 if( ( row || col ) && m_separatorsWidth.GetValue() < 0 )
299
300 m_separatorsWidth.Enable( row || col );
301 m_separatorsColorLabel->Enable( row || col );
302 m_separatorsColorSwatch->Enable( row || col );
303 m_separatorsStyleLabel->Enable( row || col );
304 m_separatorsStyleCombo->Enable( row || col );
305}
306
307
309{
311 return false;
312
313 if( !wxDialog::TransferDataFromWindow() )
314 return false;
315
316 SCH_COMMIT commit( m_frame );
317
318 /* save table in undo list if not already in edit */
319 if( m_table->GetEditFlags() == 0 )
320 commit.Modify( m_table, m_frame->GetScreen() );
321
322 for( int row = 0; row < m_table->GetRowCount(); ++row )
323 {
324 for( int col = 0; col < m_table->GetColCount(); ++col )
325 {
326 SCH_TABLECELL* tableCell = m_table->GetCell( row, col );
327 wxString txt = m_grid->GetCellValue( row, col );
328
329 // convert any text variable cross-references to their UUIDs
330 if( SCHEMATIC* schematic = tableCell->Schematic() )
331 txt = schematic->ConvertRefsToKIIDs( txt );
332
333#ifdef __WXMAC__
334 // On macOS CTRL+Enter produces '\r' instead of '\n' regardless of EOL setting.
335 // Replace it now.
336 txt.Replace( "\r", "\n" );
337#elif defined( __WINDOWS__ )
338 // On Windows, a new line is coded as \r\n. We use only \n in kicad files and in
339 // drawing routines so strip the \r char.
340 txt.Replace( "\r", "" );
341#endif
342
343 tableCell->SetText( txt );
344 }
345 }
346
348 m_table->SetStrokeHeader( m_headerBorder->GetValue() );
349 {
351
352 if( m_borderCheckbox->GetValue() )
353 stroke.SetWidth( std::max( 0, m_borderWidth.GetIntValue() ) );
354 else
355 stroke.SetWidth( -1 );
356
357 auto it = lineTypeNames.begin();
358 std::advance( it, m_borderStyleCombo->GetSelection() );
359
360 if( it == lineTypeNames.end() )
361 stroke.SetLineStyle( LINE_STYLE::SOLID );
362 else
363 stroke.SetLineStyle( it->first );
364
366
367 m_table->SetBorderStroke( stroke );
368 }
369
370 m_table->SetStrokeRows( m_rowSeparators->GetValue() );
372 {
374
375 if( m_rowSeparators->GetValue() || m_colSeparators->GetValue() )
376 stroke.SetWidth( std::max( 0, m_separatorsWidth.GetIntValue() ) );
377 else
378 stroke.SetWidth( -1 );
379
380 auto it = lineTypeNames.begin();
381 std::advance( it, m_separatorsStyleCombo->GetSelection() );
382
383 if( it == lineTypeNames.end() )
384 stroke.SetLineStyle( LINE_STYLE::SOLID );
385 else
386 stroke.SetLineStyle( it->first );
387
389
390 m_table->SetSeparatorsStroke( stroke );
391 }
392
393 if( !commit.Empty() )
394 commit.Push( _( "Edit Table" ) );
395
396 return true;
397}
398
399
401{
402 Layout(); // Make sure we get the current client size for the grid
403
404 wxSize availableGridSize = m_grid->GetClientSize();
405
406 if( availableGridSize.x == 0 || availableGridSize.y == 0 )
407 return;
408
409 BOX2I tableBBox = m_table->GetBoundingBox();
410 double scalerX = static_cast<double>( availableGridSize.x ) / tableBBox.GetWidth();
411 double scalerY = static_cast<double>( availableGridSize.y ) / tableBBox.GetHeight();
412
413 for( int row = 0; row < m_table->GetRowCount(); ++row )
414 m_grid->SetRowSize( row, std::floor( m_table->GetRowHeight( row ) * scalerY ) );
415
416 for( int col = 0; col < m_table->GetColCount(); ++col )
417 m_grid->SetColSize( col, std::floor( m_table->GetColWidth( col ) * scalerX ) );
418}
419
420
421void DIALOG_TABLE_PROPERTIES::onSize( wxSizeEvent& aEvent )
422{
423 if( m_table )
425
426 aEvent.Skip();
427}
428
429
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
constexpr size_type GetWidth() const
Definition: box2.h:214
constexpr size_type GetHeight() const
Definition: box2.h:215
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)
Modify a given item in the model.
Definition: commit.h:108
bool Empty() const
Definition: commit.h:150
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:98
virtual void SetText(const wxString &aText)
Definition: eda_text.cpp:268
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:95
Holds all the data relating to one schematic.
Definition: schematic.h:82
SCH_SHEET_PATH & CurrentSheet() const override
Definition: schematic.h:161
SCH_SHEET_LIST Hierarchy() const override
Return the full schematic flattened hierarchical sheet list.
Definition: schematic.cpp:214
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
Execute the changes.
Definition: sch_commit.cpp:432
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:210
Schematic symbol object.
Definition: sch_symbol.h:77
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:704
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:386
bool StrokeExternal() const
Definition: sch_table.h:54
int GetRowHeight(int aRow) const
Definition: sch_table.h:124
void SetStrokeHeader(bool aDoStroke)
Definition: sch_table.h:56
int GetColWidth(int aCol) const
Definition: sch_table.h:114
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:105
void SetStrokeColumns(bool aDoStroke)
Definition: sch_table.h:83
SCH_TABLECELL * GetCell(int aRow, int aCol) const
Definition: sch_table.h:132
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:107
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:93
int GetWidth() const
void SetLineStyle(LINE_STYLE aLineStyle)
void SetWidth(int aWidth)
void SetColor(const KIGFX::COLOR4D &aColor)
LINE_STYLE GetLineStyle() const
KIGFX::COLOR4D GetColor() const
int GetIntValue()
Definition: unit_binder.h:129
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:256
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:646
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
Definition: wx_infobar.cpp:153
#define _(s)
@ LAYER_SCHEMATIC_BACKGROUND
Definition: layer_ids.h:440
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
Conversion map between LINE_STYLE values and style names displayed.