KiCad PCB EDA Suite
rc_item.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) 2020 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 
25 #include <wx/wupdlock.h>
26 #include <wx/dataview.h>
27 #include <wx/settings.h>
28 #include <widgets/ui_common.h>
29 #include <marker_base.h>
30 #include <eda_draw_frame.h>
31 #include <rc_item.h>
32 #include <eda_item.h>
33 #include <base_units.h>
34 
35 #define WX_DATAVIEW_WINDOW_PADDING 6
36 
37 
38 wxString RC_ITEM::GetErrorMessage() const
39 {
40  if( m_errorMessage.IsEmpty() )
41  return GetErrorText();
42  else
43  return m_errorMessage;
44 }
45 
46 
47 wxString RC_ITEM::ShowCoord( EDA_UNITS aUnits, const wxPoint& aPos )
48 {
49  return wxString::Format( "@(%s, %s)",
50  MessageTextFromValue( aUnits, aPos.x ),
51  MessageTextFromValue( aUnits, aPos.y ) );
52 }
53 
54 
55 void RC_ITEM::AddItem( EDA_ITEM* aItem )
56 {
57  m_ids.push_back( aItem->m_Uuid );
58 }
59 
60 
61 void RC_ITEM::SetItems( const EDA_ITEM* aItem, const EDA_ITEM* bItem,
62  const EDA_ITEM* cItem, const EDA_ITEM* dItem )
63 {
64  m_ids.clear();
65 
66  m_ids.push_back( aItem->m_Uuid );
67 
68  if( bItem )
69  m_ids.push_back( bItem->m_Uuid );
70 
71  if( cItem )
72  m_ids.push_back( cItem->m_Uuid );
73 
74  if( dItem )
75  m_ids.push_back( dItem->m_Uuid );
76 }
77 
78 
79 wxString RC_ITEM::ShowReport( EDA_UNITS aUnits, SEVERITY aSeverity,
80  const std::map<KIID, EDA_ITEM*>& aItemMap ) const
81 {
82  wxString severity;
83 
84  switch( aSeverity )
85  {
86  case RPT_SEVERITY_ERROR: severity = wxT( "Severity: error" ); break;
87  case RPT_SEVERITY_WARNING: severity = wxT( "Severity: warning" ); break;
88  case RPT_SEVERITY_ACTION: severity = wxT( "Severity: action" ); break;
89  case RPT_SEVERITY_INFO: severity = wxT( "Severity: info" ); break;
90  default: ;
91  };
92 
93  if( m_parent && m_parent->IsExcluded() )
94  severity += wxT( " (excluded)" );
95 
96  EDA_ITEM* mainItem = nullptr;
97  EDA_ITEM* auxItem = nullptr;
98 
99  auto ii = aItemMap.find( GetMainItemID() );
100 
101  if( ii != aItemMap.end() )
102  mainItem = ii->second;
103 
104  ii = aItemMap.find( GetAuxItemID() );
105 
106  if( ii != aItemMap.end() )
107  auxItem = ii->second;
108 
109  // Note: some customers machine-process these. So:
110  // 1) don't translate
111  // 2) try not to re-order or change syntax
112  // 3) report numeric error code (which should be more stable) in addition to message
113 
114  if( mainItem && auxItem )
115  {
116  return wxString::Format( wxT( "[%s]: %s %s\n %s: %s\n %s: %s\n" ),
117  GetSettingsKey(),
118  GetErrorMessage(),
119  severity,
120  ShowCoord( aUnits, mainItem->GetPosition() ),
121  mainItem->GetSelectMenuText( aUnits ),
122  ShowCoord( aUnits, auxItem->GetPosition() ),
123  auxItem->GetSelectMenuText( aUnits ) );
124  }
125  else if( mainItem )
126  {
127  return wxString::Format( wxT( "[%s]: %s %s\n %s: %s\n" ),
128  GetSettingsKey(),
129  GetErrorMessage(),
130  severity,
131  ShowCoord( aUnits, mainItem->GetPosition() ),
132  mainItem->GetSelectMenuText( aUnits ) );
133  }
134  else
135  {
136  return wxString::Format( wxT( "[%s]: %s %s\n" ),
137  GetSettingsKey(),
138  GetErrorMessage(),
139  severity );
140  }
141 }
142 
143 
144 KIID RC_TREE_MODEL::ToUUID( wxDataViewItem aItem )
145 {
146  const RC_TREE_NODE* node = RC_TREE_MODEL::ToNode( aItem );
147 
148  if( node && node->m_RcItem )
149  {
150  const std::shared_ptr<RC_ITEM> rc_item = node->m_RcItem;
151 
152  switch( node->m_Type )
153  {
155  // rc_item->GetParent() can be null, if the parent is not existing
156  // when a RC item has no corresponding ERC/DRC marker
157  if( rc_item->GetParent() )
158  return rc_item->GetParent()->GetUUID();
159 
160  break;
161 
162  case RC_TREE_NODE::MAIN_ITEM: return rc_item->GetMainItemID();
163  case RC_TREE_NODE::AUX_ITEM: return rc_item->GetAuxItemID();
164  case RC_TREE_NODE::AUX_ITEM2: return rc_item->GetAuxItem2ID();
165  case RC_TREE_NODE::AUX_ITEM3: return rc_item->GetAuxItem3ID();
166  }
167  }
168 
169  return niluuid;
170 }
171 
172 
173 RC_TREE_MODEL::RC_TREE_MODEL( EDA_DRAW_FRAME* aParentFrame, wxDataViewCtrl* aView ) :
174  m_editFrame( aParentFrame ),
175  m_view( aView ),
176  m_severities( 0 ),
177  m_rcItemsProvider( nullptr )
178 {
179  m_view->GetMainWindow()->Connect( wxEVT_SIZE,
180  wxSizeEventHandler( RC_TREE_MODEL::onSizeView ),
181  NULL, this );
182 }
183 
184 
186 {
187  delete m_rcItemsProvider;
188 
189  for( RC_TREE_NODE* topLevelNode : m_tree )
190  delete topLevelNode;
191 }
192 
193 
194 void RC_TREE_MODEL::rebuildModel( RC_ITEMS_PROVIDER* aProvider, int aSeverities )
195 {
196  wxWindowUpdateLocker updateLock( m_view );
197 
198  std::shared_ptr<RC_ITEM> selectedRcItem = nullptr;
199 
200  if( m_view )
201  {
202  RC_TREE_NODE* selectedNode = ToNode( m_view->GetSelection() );
203  selectedRcItem = selectedNode ? selectedNode->m_RcItem : nullptr;
204 
205  // Even with the updateLock, wxWidgets sometimes ties its knickers in a knot trying
206  // to run a wxdataview_selection_changed_callback() on a row that has been deleted.
207  m_view->UnselectAll();
208  }
209 
210  if( aProvider != m_rcItemsProvider )
211  {
212  delete m_rcItemsProvider;
213  m_rcItemsProvider = aProvider;
214  }
215 
216  if( aSeverities != m_severities )
217  m_severities = aSeverities;
218 
219  if( m_rcItemsProvider )
221 
222  for( RC_TREE_NODE* topLevelNode : m_tree )
223  delete topLevelNode;
224 
225  m_tree.clear();
226 
227  // wxDataView::ExpandAll() pukes with large lists
228  int count = 0;
229 
230  if( m_rcItemsProvider )
231  count = std::min( 1000, m_rcItemsProvider->GetCount() );
232 
233  for( int i = 0; i < count; ++i )
234  {
235  std::shared_ptr<RC_ITEM> rcItem = m_rcItemsProvider->GetItem( i );
236 
237  m_tree.push_back( new RC_TREE_NODE( nullptr, rcItem, RC_TREE_NODE::MARKER ) );
238  RC_TREE_NODE* n = m_tree.back();
239 
240  if( rcItem->GetMainItemID() != niluuid )
241  n->m_Children.push_back( new RC_TREE_NODE( n, rcItem, RC_TREE_NODE::MAIN_ITEM ) );
242 
243  if( rcItem->GetAuxItemID() != niluuid )
244  n->m_Children.push_back( new RC_TREE_NODE( n, rcItem, RC_TREE_NODE::AUX_ITEM ) );
245 
246  if( rcItem->GetAuxItem2ID() != niluuid )
247  n->m_Children.push_back( new RC_TREE_NODE( n, rcItem, RC_TREE_NODE::AUX_ITEM2 ) );
248 
249  if( rcItem->GetAuxItem3ID() != niluuid )
250  n->m_Children.push_back( new RC_TREE_NODE( n, rcItem, RC_TREE_NODE::AUX_ITEM3 ) );
251  }
252 
253  // Must be called after a significant change of items to force the
254  // wxDataViewModel to reread all of them, repopulating itself entirely.
255  Cleared();
256 
257 #ifdef __WXGTK__
258  // The fastest method to update wxDataViewCtrl is to rebuild from
259  // scratch by calling Cleared(). Linux requires to reassociate model to
260  // display data, but Windows will create multiple associations.
261  // On MacOS, this crashes kicad. See https://gitlab.com/kicad/code/kicad/issues/3666
262  // and https://gitlab.com/kicad/code/kicad/issues/3653
263  m_view->AssociateModel( this );
264 #endif
265 
266  m_view->ClearColumns();
267  int width = m_view->GetMainWindow()->GetRect().GetWidth() - WX_DATAVIEW_WINDOW_PADDING;
268  m_view->AppendTextColumn( wxEmptyString, 0, wxDATAVIEW_CELL_INERT, width );
269 
270  ExpandAll();
271 
272  // Most annoyingly wxWidgets won't tell us the scroll position (and no, all the usual
273  // routines don't work), so we can only restore the scroll position based on a selection.
274  if( selectedRcItem )
275  {
276  for( RC_TREE_NODE* candidate : m_tree )
277  {
278  if( candidate->m_RcItem == selectedRcItem )
279  {
280  m_view->Select( ToItem( candidate ) );
281  m_view->EnsureVisible( ToItem( candidate ) );
282  break;
283  }
284  }
285  }
286 }
287 
288 
290 {
291  rebuildModel( aProvider, m_severities );
292 }
293 
294 
295 void RC_TREE_MODEL::SetSeverities( int aSeverities )
296 {
297  rebuildModel( m_rcItemsProvider, aSeverities );
298 }
299 
300 
302 {
303  for( RC_TREE_NODE* topLevelNode : m_tree )
304  m_view->Expand( ToItem( topLevelNode ) );
305 }
306 
307 
308 bool RC_TREE_MODEL::IsContainer( wxDataViewItem const& aItem ) const
309 {
310  if( ToNode( aItem ) == nullptr ) // must be tree root...
311  return true;
312  else
313  return ToNode( aItem )->m_Type == RC_TREE_NODE::MARKER;
314 }
315 
316 
317 wxDataViewItem RC_TREE_MODEL::GetParent( wxDataViewItem const& aItem ) const
318 {
319  return ToItem( ToNode( aItem)->m_Parent );
320 }
321 
322 
323 unsigned int RC_TREE_MODEL::GetChildren( wxDataViewItem const& aItem,
324  wxDataViewItemArray& aChildren ) const
325 {
326  const RC_TREE_NODE* node = ToNode( aItem );
327  const std::vector<RC_TREE_NODE*>& children = node ? node->m_Children : m_tree;
328 
329  for( const RC_TREE_NODE* child: children )
330  aChildren.push_back( ToItem( child ) );
331 
332  return children.size();
333 }
334 
335 
339 void RC_TREE_MODEL::GetValue( wxVariant& aVariant,
340  wxDataViewItem const& aItem,
341  unsigned int aCol ) const
342 {
343  const RC_TREE_NODE* node = ToNode( aItem );
344  const std::shared_ptr<RC_ITEM> rcItem = node->m_RcItem;
345 
346  switch( node->m_Type )
347  {
349  {
350  wxString prefix;
351 
352  if( rcItem->GetParent() && rcItem->GetParent()->IsExcluded() )
353  prefix = _( "Excluded " );
354 
355  switch( m_editFrame->GetSeverity( rcItem->GetErrorCode() ) )
356  {
357  case RPT_SEVERITY_ERROR: prefix += _( "Error: " ); break;
358  case RPT_SEVERITY_WARNING: prefix += _( "Warning: " ); break;
359 
362  case RPT_SEVERITY_INFO:
363  case RPT_SEVERITY_ACTION:
364  case RPT_SEVERITY_IGNORE:
365  break;
366  }
367 
368  aVariant = prefix + rcItem->GetErrorMessage();
369  }
370  break;
371 
373  {
374  EDA_ITEM* item = m_editFrame->GetItem( rcItem->GetMainItemID() );
375  aVariant = item->GetSelectMenuText( m_editFrame->GetUserUnits() );
376  }
377  break;
378 
380  {
381  EDA_ITEM* item = m_editFrame->GetItem( rcItem->GetAuxItemID() );
382  aVariant = item->GetSelectMenuText( m_editFrame->GetUserUnits() );
383  }
384  break;
385 
387  {
388  EDA_ITEM* item = m_editFrame->GetItem( rcItem->GetAuxItem2ID() );
389  aVariant = item->GetSelectMenuText( m_editFrame->GetUserUnits() );
390  }
391  break;
392 
394  {
395  EDA_ITEM* item = m_editFrame->GetItem( rcItem->GetAuxItem3ID() );
396  aVariant = item->GetSelectMenuText( m_editFrame->GetUserUnits() );
397  }
398  break;
399  }
400 }
401 
402 
407 bool RC_TREE_MODEL::GetAttr( wxDataViewItem const& aItem,
408  unsigned int aCol,
409  wxDataViewItemAttr& aAttr ) const
410 {
411  const RC_TREE_NODE* node = ToNode( aItem );
412  wxASSERT( node );
413 
414  bool ret = false;
415  bool heading = node->m_Type == RC_TREE_NODE::MARKER;
416 
417  if( heading )
418  {
419  aAttr.SetBold( true );
420  ret = true;
421  }
422 
423  if( node->m_RcItem->GetParent() && node->m_RcItem->GetParent()->IsExcluded() )
424  {
425  wxColour textColour = wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOXTEXT );
426 
427  if( KIGFX::COLOR4D( textColour ).GetBrightness() > 0.5 )
428  aAttr.SetColour( textColour.ChangeLightness( heading ? 30 : 35 ) );
429  else
430  aAttr.SetColour( textColour.ChangeLightness( heading ? 170 : 165 ) );
431 
432  aAttr.SetItalic( true ); // Strikethrough would be better, if wxWidgets supported it
433  ret = true;
434  }
435 
436  return ret;
437 }
438 
439 
441 {
442  if( aNode->m_Type == RC_TREE_NODE::MAIN_ITEM || aNode->m_Type == RC_TREE_NODE::AUX_ITEM )
443  {
444  ValueChanged( aNode->m_Parent );
445  }
446 
447  if( aNode->m_Type == RC_TREE_NODE::MARKER )
448  {
449  wxDataViewModel::ValueChanged( ToItem( aNode ), 0 );
450 
451  for( const RC_TREE_NODE* child : aNode->m_Children )
452  wxDataViewModel::ValueChanged( ToItem( child ), 0 );
453  }
454 }
455 
456 
458 {
459  DeleteItems( true, true, aDeep );
460 }
461 
462 
463 void RC_TREE_MODEL::DeleteItems( bool aCurrentOnly, bool aIncludeExclusions, bool aDeep )
464 {
465  RC_TREE_NODE* current_node = ToNode( m_view->GetCurrentItem() );
466  const std::shared_ptr<RC_ITEM> current_item = current_node ? current_node->m_RcItem : nullptr;
467 
469  std::vector<RC_TREE_NODE*> to_delete;
470 
471  if( aCurrentOnly && !current_item )
472  {
473  wxBell();
474  return;
475  }
476 
477  if( !m_rcItemsProvider )
478  return;
479 
480  int lastGood = -1;
481  bool itemDeleted = false;
482 
483  if( m_view )
484  {
485  m_view->UnselectAll();
486  wxYield();
487  m_view->Freeze();
488  }
489 
490  for( int i = m_rcItemsProvider->GetCount() - 1; i >= 0; --i )
491  {
492  std::shared_ptr<RC_ITEM> rcItem = m_rcItemsProvider->GetItem( i );
493  MARKER_BASE* marker = rcItem->GetParent();
494  bool excluded = marker ? marker->IsExcluded() : false;
495 
496  if( aCurrentOnly && itemDeleted && lastGood >= 0 )
497  break;
498 
499  if( aCurrentOnly && rcItem != current_item )
500  {
501  lastGood = i;
502  continue;
503  }
504 
505  if( excluded && !aIncludeExclusions )
506  continue;
507 
508  if( i < (int) m_tree.size() ) // Careful; tree is truncated for large datasets
509  {
510  wxDataViewItem markerItem = ToItem( m_tree[i] );
511  wxDataViewItemArray childItems;
512  wxDataViewItem parentItem = ToItem( m_tree[i]->m_Parent );
513 
514  for( RC_TREE_NODE* child : m_tree[i]->m_Children )
515  {
516  childItems.push_back( ToItem( child ) );
517  to_delete.push_back( child );
518  }
519 
520  m_tree[i]->m_Children.clear();
521  ItemsDeleted( markerItem, childItems );
522 
523  to_delete.push_back( m_tree[i] );
524  m_tree.erase( m_tree.begin() + i );
525  ItemDeleted( parentItem, markerItem );
526  }
527 
528  // Only deep delete the current item here; others will be done through the
529  // DeleteAllItems() call below, which is more efficient.
530  m_rcItemsProvider->DeleteItem( i, aDeep && aCurrentOnly );
531 
532  if( lastGood > i )
533  lastGood--;
534 
535  itemDeleted = true;
536  }
537 
538  if( m_view && aCurrentOnly && lastGood >= 0 )
539  m_view->Select( ToItem( m_tree[ lastGood ] ) );
540 
541  for( RC_TREE_NODE* item : to_delete )
542  delete( item );
543 
544  if( !aCurrentOnly )
545  m_rcItemsProvider->DeleteAllItems( aIncludeExclusions, aDeep );
546 
547  if( m_view )
548  m_view->Thaw();
549 }
550 
551 
553 {
554  RC_TREE_NODE* currentNode = ToNode( m_view->GetCurrentItem() );
555  RC_TREE_NODE* prevMarker = nullptr;
556 
557  while( currentNode && currentNode->m_Type != RC_TREE_NODE::MARKER )
558  currentNode = currentNode->m_Parent;
559 
560  for( RC_TREE_NODE* candidate : m_tree )
561  {
562  if( candidate == currentNode )
563  break;
564  else
565  prevMarker = candidate;
566  }
567 
568  if( prevMarker )
569  m_view->Select( ToItem( prevMarker ) );
570 }
571 
572 
574 {
575  RC_TREE_NODE* currentNode = ToNode( m_view->GetCurrentItem() );
576 
577  while( currentNode && currentNode->m_Type != RC_TREE_NODE::MARKER )
578  currentNode = currentNode->m_Parent;
579 
580  RC_TREE_NODE* nextMarker = nullptr;
581  bool trigger = currentNode == nullptr;
582 
583  for( RC_TREE_NODE* candidate : m_tree )
584  {
585  if( candidate == currentNode )
586  {
587  trigger = true;
588  }
589  else if( trigger )
590  {
591  nextMarker = candidate;
592  break;
593  }
594  }
595 
596  if( nextMarker )
597  m_view->Select( ToItem( nextMarker ) );
598 }
599 
600 
601 void RC_TREE_MODEL::onSizeView( wxSizeEvent& aEvent )
602 {
603  int width = m_view->GetMainWindow()->GetRect().GetWidth() - WX_DATAVIEW_WINDOW_PADDING;
604 
605  if( m_view->GetColumnCount() > 0 )
606  m_view->GetColumn( 0 )->SetWidth( width );
607 
608  // Pass size event to other widgets
609  aEvent.Skip();
610 }
void DeleteItems(bool aCurrentOnly, bool aIncludeExclusions, bool aDeep)
Deletes the current item or all items.
Definition: rc_item.cpp:463
KIIDS m_ids
Definition: rc_item.h:167
wxString MessageTextFromValue(EDA_UNITS aUnits, int aValue, bool aAddUnitLabel, EDA_DATA_TYPE aType)
Convert a value to a string using double notation.
Definition: base_units.cpp:103
void NextMarker()
Definition: rc_item.cpp:573
virtual void DeleteAllItems(bool aIncludeExclusions, bool aDeep)=0
KIID niluuid(0)
static wxDataViewItem ToItem(RC_TREE_NODE const *aNode)
Definition: rc_item.h:200
void SetProvider(RC_ITEMS_PROVIDER *aProvider)
Definition: rc_item.cpp:289
Implementation of conversion functions that require both schematic and board internal units.
SEVERITY
Definition: ui_common.h:83
bool GetAttr(wxDataViewItem const &aItem, unsigned int aCol, wxDataViewItemAttr &aAttr) const override
Called by the wxDataView to fetch an item's formatting.
Definition: rc_item.cpp:407
RC_TREE_NODE * m_Parent
Definition: rc_item.h:192
static KIID ToUUID(wxDataViewItem aItem)
Definition: rc_item.cpp:144
wxDataViewCtrl * m_view
Definition: rc_item.h:279
virtual SEVERITY GetSeverity(int aErrorCode) const
#define WX_DATAVIEW_WINDOW_PADDING
Definition: rc_item.cpp:35
virtual wxPoint GetPosition() const
Definition: eda_item.h:252
virtual int GetCount(int aSeverity=-1) const =0
The base class for create windows for drawing purpose.
void DeleteCurrentItem(bool aDeep)
Definition: rc_item.cpp:457
void SetSeverities(int aSeverities)
Definition: rc_item.cpp:295
Provide an abstract interface of a RC_ITEM* list manager.
Definition: rc_item.h:45
void GetValue(wxVariant &aVariant, wxDataViewItem const &aItem, unsigned int aCol) const override
Called by the wxDataView to fetch an item's value.
Definition: rc_item.cpp:339
wxString GetErrorText() const
Definition: rc_item.h:145
std::vector< RC_TREE_NODE * > m_Children
Definition: rc_item.h:193
RC_ITEMS_PROVIDER * m_rcItemsProvider
Definition: rc_item.h:281
Definition: kiid.h:44
std::shared_ptr< RC_ITEM > m_RcItem
Definition: rc_item.h:190
#define NULL
void ExpandAll()
Definition: rc_item.cpp:301
void rebuildModel(RC_ITEMS_PROVIDER *aProvider, int aSeverities)
Definition: rc_item.cpp:194
static RC_TREE_NODE * ToNode(wxDataViewItem aItem)
Definition: rc_item.h:205
static wxString ShowCoord(EDA_UNITS aUnits, const wxPoint &aPos)
Format a coordinate or position to text.
Definition: rc_item.cpp:47
KIID GetAuxItemID() const
Definition: rc_item.h:121
RC_TREE_MODEL(EDA_DRAW_FRAME *aParentFrame, wxDataViewCtrl *aView)
Definition: rc_item.cpp:173
Functions to provide common constants and other functions to assist in making a consistent UI.
#define _(s)
EDA_DRAW_FRAME * m_editFrame
Definition: rc_item.h:278
wxString m_errorMessage
A message describing the details of this specific error.
Definition: rc_item.h:162
bool IsExcluded() const
Definition: marker_base.h:94
void onSizeView(wxSizeEvent &aEvent)
Definition: rc_item.cpp:601
void PrevMarker()
Definition: rc_item.cpp:552
virtual void SetSeverities(int aSeverities)=0
unsigned int GetChildren(wxDataViewItem const &aItem, wxDataViewItemArray &aChildren) const override
Definition: rc_item.cpp:323
virtual EDA_ITEM * GetItem(const KIID &aId) const
Fetch an item by KIID.
void AddItem(EDA_ITEM *aItem)
Definition: rc_item.cpp:55
const KIID m_Uuid
Definition: eda_item.h:475
NODE_TYPE m_Type
Definition: rc_item.h:189
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
EDA_UNITS
Definition: eda_units.h:38
std::vector< RC_TREE_NODE * > m_tree
Definition: rc_item.h:283
virtual wxString ShowReport(EDA_UNITS aUnits, SEVERITY aSeverity, const std::map< KIID, EDA_ITEM * > &aItemMap) const
Translate this object into a text string suitable for saving to disk in a report.
Definition: rc_item.cpp:79
virtual std::shared_ptr< RC_ITEM > GetItem(int aIndex) const =0
Retrieve a RC_ITEM by index.
MARKER_BASE * m_parent
The marker this item belongs to, if any.
Definition: rc_item.h:165
int m_severities
Definition: rc_item.h:280
void SetItems(const KIIDS &aIds)
Definition: rc_item.h:99
virtual wxString GetSelectMenuText(EDA_UNITS aUnits) const
Return the text to display to be used in the selection clarification context menu when multiple items...
Definition: eda_item.cpp:109
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:100
wxString GetSettingsKey() const
Definition: rc_item.h:150
KIID GetMainItemID() const
Definition: rc_item.h:120
void ValueChanged(const RC_TREE_NODE *aNode)
Definition: rc_item.cpp:440
bool IsContainer(wxDataViewItem const &aItem) const override
Definition: rc_item.cpp:308
wxDataViewItem GetParent(wxDataViewItem const &aItem) const override
Definition: rc_item.cpp:317
virtual wxString GetErrorMessage() const
Return the error message of a RC_ITEM.
Definition: rc_item.cpp:38
virtual void DeleteItem(int aIndex, bool aDeep)=0
Remove (and optionally deletes) the indexed item from the list.
EDA_UNITS GetUserUnits() const
Return the user units currently in use.
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:103