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 m_grid->SetCellValue( row, col, coveredColor.GetAsString() );
152 else
153 m_grid->SetCellValue( row, col, tableCell->GetText() );
154 }
155 }
156
157 CallAfter( [this]()
158 {
159 for( int row = 0; row < m_table->GetRowCount(); ++row )
160 {
161 for( int col = 0; col < m_table->GetColCount(); ++col )
162 {
163 SCH_TABLECELL* tableCell = m_table->GetCell( row, col );
164
165 if( tableCell->IsSelected() )
166 {
167 m_grid->SetGridCursor( row, col );
168 m_grid->EnableCellEditControl();
169 m_grid->ShowCellEditControl();
170 return;
171 }
172 }
173 }
174 } );
175
177
178 //
179 // Table Properties
180 //
181
183 m_headerBorder->SetValue( m_table->StrokeHeader() );
184
185 if( m_table->GetBorderStroke().GetWidth() >= 0 )
187
189
190 int style = static_cast<int>( m_table->GetBorderStroke().GetLineStyle() );
191
192 if( style >= 0 && style < (int) lineTypeNames.size() )
193 m_borderStyleCombo->SetSelection( style );
194 else
195 m_borderStyleCombo->SetSelection( 0 );
196
202
203 bool rows = m_table->StrokeRows() && m_table->GetSeparatorsStroke().GetWidth() >= 0;
204 bool cols = m_table->StrokeColumns() && m_table->GetSeparatorsStroke().GetWidth() >= 0;
205
206 m_rowSeparators->SetValue( rows );
207 m_colSeparators->SetValue( cols );
208
209 if( m_table->GetSeparatorsStroke().GetWidth() >= 0 )
211
213
214 style = static_cast<int>( m_table->GetSeparatorsStroke().GetLineStyle() );
215
216 if( style >= 0 && style < (int) lineTypeNames.size() )
217 m_separatorsStyleCombo->SetSelection( style );
218 else
219 m_separatorsStyleCombo->SetSelection( 0 );
220
221 m_separatorsWidth.Enable( rows || cols );
222 m_separatorsColorLabel->Enable( rows || cols );
223 m_separatorsColorSwatch->Enable( rows || cols );
224 m_separatorsStyleLabel->Enable( rows || cols );
225 m_separatorsStyleCombo->Enable( rows || cols );
226
227 return true;
228}
229
230
232 wxArrayString* aTokens )
233{
234 if( !aCrossRef.IsEmpty() )
235 {
237 SCH_SYMBOL* refSymbol = nullptr;
238
240
241 for( int jj = 0; jj < (int) refs.GetCount(); jj++ )
242 {
243 SCH_REFERENCE& ref = refs[jj];
244
245 if( ref.GetSymbol()->GetRef( &ref.GetSheetPath(), true ) == aCrossRef )
246 {
247 refSymbol = ref.GetSymbol();
248 break;
249 }
250 }
251
252 if( refSymbol )
253 refSymbol->GetContextualTextVars( aTokens );
254 }
255 else
256 {
257 SCHEMATIC* schematic = m_table->Schematic();
258
259 if( schematic && schematic->CurrentSheet().Last() )
260 {
261 schematic->CurrentSheet().Last()->GetContextualTextVars( aTokens );
262 }
263 else
264 {
265 for( std::pair<wxString, wxString> entry : Prj().GetTextVars() )
266 aTokens->push_back( entry.first );
267 }
268 }
269}
270
271
272void DIALOG_TABLE_PROPERTIES::onBorderChecked( wxCommandEvent& aEvent )
273{
274 bool border = m_borderCheckbox->GetValue();
275
276 if( border && m_borderWidth.GetValue() < 0 )
278
279 m_borderWidth.Enable( border );
280 m_borderColorLabel->Enable( border );
281 m_borderColorSwatch->Enable( border );
282 m_borderStyleLabel->Enable( border );
283 m_borderStyleCombo->Enable( border );
284
285 bool row = m_rowSeparators->GetValue();
286 bool col = m_colSeparators->GetValue();
287
288 if( ( row || col ) && m_separatorsWidth.GetValue() < 0 )
290
291 m_separatorsWidth.Enable( row || col );
292 m_separatorsColorLabel->Enable( row || col );
293 m_separatorsColorSwatch->Enable( row || col );
294 m_separatorsStyleLabel->Enable( row || col );
295 m_separatorsStyleCombo->Enable( row || col );
296}
297
298
300{
302 return false;
303
304 if( !wxDialog::TransferDataFromWindow() )
305 return false;
306
307 SCH_COMMIT commit( m_frame );
308
309 /* save table in undo list if not already in edit */
310 if( m_table->GetEditFlags() == 0 )
311 commit.Modify( m_table, m_frame->GetScreen() );
312
313 for( int row = 0; row < m_table->GetRowCount(); ++row )
314 {
315 for( int col = 0; col < m_table->GetColCount(); ++col )
316 {
317 SCH_TABLECELL* tableCell = m_table->GetCell( row, col );
318 wxString txt = m_grid->GetCellValue( row, col );
319
320#ifdef __WXMAC__
321 // On macOS CTRL+Enter produces '\r' instead of '\n' regardless of EOL setting.
322 // Replace it now.
323 txt.Replace( "\r", "\n" );
324#elif defined( __WINDOWS__ )
325 // On Windows, a new line is coded as \r\n. We use only \n in kicad files and in
326 // drawing routines so strip the \r char.
327 txt.Replace( "\r", "" );
328#endif
329
330 tableCell->SetText( txt );
331 }
332 }
333
335 m_table->SetStrokeHeader( m_headerBorder->GetValue() );
336 {
338
339 if( m_borderCheckbox->GetValue() )
340 stroke.SetWidth( std::max( 0, m_borderWidth.GetIntValue() ) );
341 else
342 stroke.SetWidth( -1 );
343
344 auto it = lineTypeNames.begin();
345 std::advance( it, m_borderStyleCombo->GetSelection() );
346
347 if( it == lineTypeNames.end() )
348 stroke.SetLineStyle( LINE_STYLE::SOLID );
349 else
350 stroke.SetLineStyle( it->first );
351
353
354 m_table->SetBorderStroke( stroke );
355 }
356
357 m_table->SetStrokeRows( m_rowSeparators->GetValue() );
359 {
361
362 if( m_rowSeparators->GetValue() || m_colSeparators->GetValue() )
363 stroke.SetWidth( std::max( 0, m_separatorsWidth.GetIntValue() ) );
364 else
365 stroke.SetWidth( -1 );
366
367 auto it = lineTypeNames.begin();
368 std::advance( it, m_separatorsStyleCombo->GetSelection() );
369
370 if( it == lineTypeNames.end() )
371 stroke.SetLineStyle( LINE_STYLE::SOLID );
372 else
373 stroke.SetLineStyle( it->first );
374
376
377 m_table->SetSeparatorsStroke( stroke );
378 }
379
380 if( !commit.Empty() )
381 commit.Push( _( "Edit Table" ) );
382
383 return true;
384}
385
386
388{
389 Layout(); // Make sure we get the current client size for the grid
390
391 wxSize availableGridSize = m_grid->GetClientSize();
392
393 if( availableGridSize.x == 0 || availableGridSize.y == 0 )
394 return;
395
396 BOX2I tableBBox = m_table->GetBoundingBox();
397 double scalerX = static_cast<double>( availableGridSize.x ) / tableBBox.GetWidth();
398 double scalerY = static_cast<double>( availableGridSize.y ) / tableBBox.GetHeight();
399
400 for( int row = 0; row < m_table->GetRowCount(); ++row )
401 m_grid->SetRowSize( row, std::floor( m_table->GetRowHeight( row ) * scalerY ) );
402
403 for( int col = 0; col < m_table->GetColCount(); ++col )
404 m_grid->SetColSize( col, std::floor( m_table->GetColWidth( col ) * scalerX ) );
405}
406
407
408void DIALOG_TABLE_PROPERTIES::onSize( wxSizeEvent& aEvent )
409{
410 if( m_table )
412
413 aEvent.Skip();
414}
415
416
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.