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 <stambaughw@verizon.net>
5  * Copyright (C) 1992-2020 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 <fctsys.h>
26 #include <widgets/wx_grid.h>
27 #include <template_fieldnames.h>
28 #include <grid_tricks.h>
29 #include <sch_edit_frame.h>
30 #include <bitmaps.h>
31 
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 
44  // Yep, it's a hack. I haven't a clue why the global and project versions don't lay
45  // out the same.
46  if( !aGlobal )
47  {
48  m_leftMargin->PrependSpacer( 10 );
49  m_topMargin->PrependSpacer( 10 );
50  }
51 
52  m_addFieldButton->SetBitmap( KiBitmap( small_plus_xpm ) );
53  m_deleteFieldButton->SetBitmap( KiBitmap( trash_xpm ) );
54 
55  m_checkboxColWidth = m_grid->GetColSize( 1 );
56 
57  m_grid->PushEventHandler( new GRID_TRICKS( m_grid ) );
58 }
59 
60 
62 {
63  // Delete the GRID_TRICKS.
64  m_grid->PopEventHandler( true );
65 }
66 
67 
69 {
71  return TransferDataToGrid();
72 }
73 
74 
76 {
78  return;
79 
80  int row = m_grid->GetNumberRows();
82 
83  TEMPLATE_FIELDNAME newFieldname = TEMPLATE_FIELDNAME( _( "Untitled Field" ) );
84  newFieldname.m_Visible = false;
85  m_fields.insert( m_fields.end(), newFieldname );
87 
88  // wx documentation is wrong, SetGridCursor does not make visible.
89  m_grid->MakeCellVisible( row, 0 );
90  m_grid->SetGridCursor( row, 0 );
91 }
92 
93 
95 {
97  return;
98 
99  int curRow = m_grid->GetGridCursorRow();
100 
101  if( curRow >= 0 && curRow < (int)m_fields.size() )
102  {
103  m_fields.erase( m_fields.begin() + curRow );
104  m_grid->DeleteRows( curRow );
105  }
106 
107  m_grid->MakeCellVisible( std::max( 0, curRow-1 ), m_grid->GetGridCursorCol() );
108  m_grid->SetGridCursor( std::max( 0, curRow-1 ), m_grid->GetGridCursorCol() );
109 }
110 
111 
113 {
114  m_grid->Freeze();
115 
116  if( m_grid->GetNumberRows() )
117  m_grid->DeleteRows( 0, m_grid->GetNumberRows() );
118 
119  m_grid->AppendRows( m_fields.size() );
120 
121  for( int row = 0; row < m_grid->GetNumberRows(); ++row )
122  {
123  m_grid->SetCellValue( row, 0, m_fields[row].m_Name );
124  m_grid->SetCellValue( row, 1, m_fields[row].m_Visible ? wxT( "1" ) : wxEmptyString );
125  m_grid->SetCellValue( row, 2, m_fields[row].m_URL ? wxT( "1" ) : wxEmptyString );
126 
127  // Set cell properties
128  m_grid->SetCellAlignment( row, 0, wxALIGN_LEFT, wxALIGN_CENTRE );
129 
130  // Render the Visible and URL columns as check boxes
131  m_grid->SetCellRenderer( row, 1, new wxGridCellBoolRenderer() );
132  m_grid->SetReadOnly( row, 1 ); // Not really; we delegate interactivity to GRID_TRICKS
133  m_grid->SetCellAlignment( row, 1, wxALIGN_CENTRE, wxALIGN_CENTRE );
134 
135  m_grid->SetCellRenderer( row, 2, new wxGridCellBoolRenderer() );
136  m_grid->SetReadOnly( row, 2 ); // Not really; we delegate interactivity to GRID_TRICKS
137  m_grid->SetCellAlignment( row, 2, wxALIGN_CENTRE, wxALIGN_CENTRE );
138  }
139 
140  m_grid->Thaw();
141 
142  return true;
143 }
144 
145 
147 {
148  if( !m_grid->CommitPendingChanges() )
149  return false;
150 
151  for( int row = 0; row < m_grid->GetNumberRows(); ++row )
152  {
153  m_fields[row].m_Name = m_grid->GetCellValue( row, 0 );
154  m_fields[row].m_Visible = m_grid->GetCellValue( row, 1 ) != wxEmptyString;
155  m_fields[row].m_URL = m_grid->GetCellValue( row, 2 ) != wxEmptyString;
156  }
157 
158  return true;
159 }
160 
161 
163 {
164  if( !TransferDataFromGrid() )
165  return false;
166 
168 
169  for( const TEMPLATE_FIELDNAME& field : m_fields )
171 
172  return true;
173 }
174 
175 
177 {
178  if( aWidth <= 0 )
179  return;
180 
181  // Account for scroll bars
182  aWidth -= ( m_grid->GetSize().x - m_grid->GetClientSize().x );
183 
184  m_grid->SetColSize( 0, aWidth - 2 * m_checkboxColWidth );
185  m_grid->SetColSize( 1, m_checkboxColWidth );
186  m_grid->SetColSize( 2, m_checkboxColWidth );
187 }
188 
189 
191 {
192  AdjustGridColumns( event.GetSize().GetX() );
193 
194  event.Skip();
195 }
196 
197 
199 {
200  m_fields = templateMgr->GetTemplateFieldNames( m_global );
202 }
203 
204 
const BITMAP_OPAQUE trash_xpm[1]
Definition: trash.cpp:46
GRID_TRICKS is used to add mouse and command handling (such as cut, copy, and paste) to a WX_GRID ins...
Definition: grid_tricks.h:51
Schematic editor (Eeschema) main window.
void DeleteAllTemplateFieldNames(bool aGlobal)
Remove all global or project fieldname templates.
wxBitmap KiBitmap(BITMAP_DEF aBitmap)
Construct a wxBitmap from a memory record, held in a BITMAP_DEF.
Definition: bitmap.cpp:80
void OnAddButtonClick(wxCommandEvent &event) override
Function OnAddButtonClick Process the wxWidgets event produced when the user presses the Add buton fo...
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:174
void OnDeleteButtonClick(wxCommandEvent &event) override
Function OnDeleteButtonClick Process the wxWidgets event produced when the user presses the Delete bu...
void AddTemplateFieldName(const TEMPLATE_FIELDNAME &aFieldName, bool aGlobal)
Insert or append a wanted symbol field name into the field names template.
#define _(s)
Definition: 3d_actions.cpp:33
Struct TEMPLATE_FIELDNAME holds a name of a component's field, field value, and default visibility.
Class PANEL_EESCHEMA_TEMPLATE_FIELDNAMES_BASE.
const BITMAP_OPAQUE small_plus_xpm[1]
Definition: small_plus.cpp:20
const TEMPLATE_FIELDNAMES & GetTemplateFieldNames()
Function GetTemplateFieldName returns a template fieldnames list for read only access.
const TEMPLATE_FIELDNAMES & GetTemplateFieldNames()
Return a template field names list for read only access.