KiCad PCB EDA Suite
panel_eeschema_template_fieldnames.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) 2009 Wayne Stambaugh <[email protected]>
5  * Copyright (C) 1992-2022 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, you may find one here:
19  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20  * or you may search the http://www.gnu.org website for the version 2 license,
21  * or you may write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
25 #include <widgets/wx_grid.h>
26 #include <template_fieldnames.h>
27 #include <grid_tricks.h>
28 #include <sch_edit_frame.h>
29 #include <bitmaps.h>
30 #include <schematic.h>
32 #include <kiface_base.h>
33 
35  wxWindow* aWindow,
36  bool aGlobal ) :
38  m_frame( aFrame ),
39  m_global( aGlobal )
40 {
41  m_title->SetLabel( aGlobal ? _( "Global field name templates:" )
42  : _( "Project field name templates:" ) );
43 
46 
47  m_checkboxColWidth = m_grid->GetColSize( 1 );
48 
49  m_grid->PushEventHandler( new GRID_TRICKS( m_grid ) );
50  m_grid->SetSelectionMode( wxGrid::wxGridSelectRows );
51 }
52 
53 
55 {
56  // Delete the GRID_TRICKS.
57  m_grid->PopEventHandler( true );
58 }
59 
60 
62 {
63  SCHEMATIC& schematic = m_frame->Schematic();
64 
66  return TransferDataToGrid();
67 }
68 
69 
71 {
73  return;
74 
75  int row = m_grid->GetNumberRows();
77 
78  TEMPLATE_FIELDNAME newFieldname = TEMPLATE_FIELDNAME( _( "Untitled Field" ) );
79  newFieldname.m_Visible = false;
80  m_fields.insert( m_fields.end(), newFieldname );
82 
83  // wx documentation is wrong, SetGridCursor does not make visible.
84  m_grid->MakeCellVisible( row, 0 );
85  m_grid->SetGridCursor( row, 0 );
86 }
87 
88 
90 {
92  return;
93 
94  wxArrayInt selectedRows = m_grid->GetSelectedRows();
95 
96  if( selectedRows.empty() && m_grid->GetGridCursorRow() >= 0 )
97  selectedRows.push_back( m_grid->GetGridCursorRow() );
98 
99  if( selectedRows.empty() )
100  return;
101 
102  // Reverse sort so deleting a row doesn't change the indexes of the other rows.
103  selectedRows.Sort( []( int* first, int* second ) { return *second - *first; } );
104 
105  for( int row : selectedRows )
106  {
107  m_fields.erase( m_fields.begin() + row );
108  m_grid->DeleteRows( row );
109 
110  m_grid->MakeCellVisible( std::max( 0, row-1 ), m_grid->GetGridCursorCol() );
111  m_grid->SetGridCursor( std::max( 0, row-1 ), m_grid->GetGridCursorCol() );
112  }
113 }
114 
115 
117 {
118  m_grid->Freeze();
119 
120  m_grid->ClearRows();
121  m_grid->AppendRows( m_fields.size() );
122 
123  for( int row = 0; row < m_grid->GetNumberRows(); ++row )
124  {
125  m_grid->SetCellValue( row, 0, m_fields[row].m_Name );
126  // columns 1 and 2 show a boolean value (in a check box):
127  m_grid->SetCellValue( row, 1, m_fields[row].m_Visible ? "1" : "0" );
128  m_grid->SetCellValue( row, 2, m_fields[row].m_URL ? "1" : "0" );
129 
130  // Set cell properties
131  m_grid->SetCellAlignment( row, 0, wxALIGN_LEFT, wxALIGN_CENTRE );
132 
133  // Render the Visible and URL columns as check boxes
134  m_grid->SetCellRenderer( row, 1, new wxGridCellBoolRenderer() );
135  m_grid->SetReadOnly( row, 1 ); // Not really; we delegate interactivity to GRID_TRICKS
136  m_grid->SetCellAlignment( row, 1, wxALIGN_CENTRE, wxALIGN_CENTRE );
137 
138  m_grid->SetCellRenderer( row, 2, new wxGridCellBoolRenderer() );
139  m_grid->SetReadOnly( row, 2 ); // Not really; we delegate interactivity to GRID_TRICKS
140  m_grid->SetCellAlignment( row, 2, wxALIGN_CENTRE, wxALIGN_CENTRE );
141  }
142 
143  m_grid->Thaw();
144 
145  return true;
146 }
147 
148 
150 {
151  if( !m_grid->CommitPendingChanges() )
152  return false;
153 
154  for( int row = 0; row < m_grid->GetNumberRows(); ++row )
155  {
156  m_fields[row].m_Name = m_grid->GetCellValue( row, 0 );
157  m_fields[row].m_Visible = m_grid->GetCellValue( row, 1 ) == "1";
158  m_fields[row].m_URL = m_grid->GetCellValue( row, 2 ) == "1";
159  }
160 
161  return true;
162 }
163 
164 
166 {
167  if( !TransferDataFromGrid() )
168  return false;
169 
170  SCHEMATIC& schematic = m_frame->Schematic();
171 
173 
174  for( const TEMPLATE_FIELDNAME& field : m_fields )
176 
177  if( m_global )
178  {
179  auto* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
180 
181  if( cfg )
182  {
183  // Save global fieldname templates
184  STRING_FORMATTER sf;
185  schematic.Settings().m_TemplateFieldNames.Format( &sf, 0, true );
186 
187  wxString record = FROM_UTF8( sf.GetString().c_str() );
188  record.Replace( wxT("\n"), wxT(""), true ); // strip all newlines
189  record.Replace( wxT(" "), wxT(" "), true ); // double space to single
190 
191  cfg->m_Drawing.field_names = record.ToStdString();
192  }
193  }
194 
195  return true;
196 }
197 
198 
200 {
201  if( aWidth <= 0 )
202  return;
203 
204  // Account for scroll bars
205  aWidth -= ( m_grid->GetSize().x - m_grid->GetClientSize().x );
206 
207  m_grid->SetColSize( 0, aWidth - 2 * m_checkboxColWidth );
208  m_grid->SetColSize( 1, m_checkboxColWidth );
209  m_grid->SetColSize( 2, m_checkboxColWidth );
210 }
211 
212 
214 {
215  AdjustGridColumns( event.GetSize().GetX() );
216 
217  event.Skip();
218 }
219 
220 
222 {
223  m_fields = templateMgr->GetTemplateFieldNames( m_global );
225 }
226 
227 
void Format(OUTPUTFORMATTER *out, int nestLevel, bool aGlobal) const
Serialize this object out as text into the given OUTPUTFORMATTER.
static wxString FROM_UTF8(const char *cstring)
Convert a UTF8 encoded C string to a wxString for all wxWidgets build modes.
Definition: macros.h:110
Holds all the data relating to one schematic.
Definition: schematic.h:59
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
void AddTemplateFieldName(const TEMPLATE_FIELDNAME &aFieldName, bool aGlobal)
Insert or append a wanted symbol field name into the field names template.
SCHEMATIC_SETTINGS & Settings() const
Definition: schematic.cpp:167
TEMPLATES m_TemplateFieldNames
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Definition: grid_tricks.h:55
Schematic editor (Eeschema) main window.
void DeleteAllFieldNameTemplates(bool aGlobal)
Delete the entire contents.
void OnAddButtonClick(wxCommandEvent &event) override
Adds a new template fieldname (with default values) to the template fieldnames data.
SCHEMATIC & Schematic() const
#define _(s)
const std::string & GetString()
Definition: richio.h:438
PANEL_EESCHEMA_TEMPLATE_FIELDNAMES(SCH_EDIT_FRAME *aFrame, wxWindow *aWindow, bool aGlobal)
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
Definition: wx_grid.cpp:226
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:105
void OnDeleteButtonClick(wxCommandEvent &event) override
Deletes the selected template fieldname from the template fieldnames data.
void ClearRows()
wxWidgets recently added an ASSERT which fires if the position is greater than or equal to the number...
Definition: wx_grid.h:109
Hold a name of a symbol's field, field value, and default visibility.
Class PANEL_EESCHEMA_TEMPLATE_FIELDNAMES_BASE.
Implement an OUTPUTFORMATTER to a memory buffer.
Definition: richio.h:414
const TEMPLATE_FIELDNAMES & GetTemplateFieldNames()
Return a template field name list for read only access.