KiCad PCB EDA Suite
Loading...
Searching...
No Matches
rc_item.h
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, see <https://www.gnu.org/licenses/>.
18 */
19
20#pragma once
21
22#include <deque>
23#include <memory>
24#include <vector>
25#include <unordered_set>
26
27#include <wx/dataview.h>
28#include <units_provider.h>
29#include <kiid.h>
30#include <reporter.h>
31
32class MARKER_BASE;
33class EDA_BASE_FRAME;
34class RC_ITEM;
35class EDA_ITEM;
36class EDA_DRAW_FRAME;
37
38namespace RC_JSON
39{
40struct VIOLATION;
41}
42
51{
52public:
53 virtual void SetSeverities( int aSeverities ) = 0;
54
55 virtual int GetSeverities() const = 0;
56
57 virtual int GetCount( int aSeverity = -1 ) const = 0;
58
62 virtual std::shared_ptr<RC_ITEM> GetItem( int aIndex ) const = 0;
63
70 virtual void DeleteItem( int aIndex, bool aDeep ) = 0;
71
72 virtual ~RC_ITEMS_PROVIDER() { }
73};
74
75
87{
88public:
89 virtual ~RC_ITEM_RESOLVER() = default;
90
98 EDA_ITEM* ResolveItemById( const KIID& aKiid ) const
99 {
100 // This is expected, e.g., when an RC item doesn't have an aux ID.
101 if( aKiid == niluuid )
102 return nullptr;
103
104 if( m_resolutionMisses.contains( aKiid ) )
105 return nullptr;
106
107 EDA_ITEM* item = doResolveItemById( aKiid );
108
109 if( !item )
110 m_resolutionMisses.insert( aKiid );
111
112 return item;
113 }
114
115protected:
124 virtual EDA_ITEM* doResolveItemById( const KIID& aKiid ) const = 0;
125
126private:
128 mutable std::unordered_set<KIID> m_resolutionMisses;
129};
130
131
138{
139public:
141 m_errorCode( 0 ),
142 m_parent( nullptr )
143 {
144 }
145
146 RC_ITEM( const std::shared_ptr<RC_ITEM>& aItem )
147 {
148 m_errorCode = aItem->m_errorCode;
149 m_errorMessage = aItem->m_errorMessage;
150 m_errorTitle = aItem->m_errorTitle;
151 m_settingsKey = aItem->m_settingsKey;
152 m_parent = aItem->m_parent;
153 m_ids = aItem->m_ids;
154 }
155
156 virtual ~RC_ITEM() { }
157
158 void SetErrorMessage( const wxString& aMessage ) { m_errorMessage = aMessage; }
159
160 void SetErrorDetail( const wxString& aMsg )
161 {
162 SetErrorMessage( GetErrorText( true ) + wxS( " " ) + aMsg );
163 }
164
165 void SetItems( const std::vector<KIID>& aIds ) { m_ids = aIds; }
166
167 void AddItem( EDA_ITEM* aItem );
168
169 void SetItems( const EDA_ITEM* aItem, const EDA_ITEM* bItem = nullptr, const EDA_ITEM* cItem = nullptr,
170 const EDA_ITEM* dItem = nullptr );
171
172 void SetItems( const KIID& aItem, const KIID& bItem = niluuid, const KIID& cItem = niluuid,
173 const KIID& dItem = niluuid )
174 {
175 m_ids.clear();
176
177 m_ids.push_back( aItem );
178 m_ids.push_back( bItem );
179 m_ids.push_back( cItem );
180 m_ids.push_back( dItem );
181 }
182
183 virtual KIID GetMainItemID() const { return m_ids.size() > 0 ? m_ids[0] : niluuid; }
184 virtual KIID GetAuxItemID() const { return m_ids.size() > 1 ? m_ids[1] : niluuid; }
185 virtual KIID GetAuxItem2ID() const { return m_ids.size() > 2 ? m_ids[2] : niluuid; }
186 virtual KIID GetAuxItem3ID() const { return m_ids.size() > 3 ? m_ids[3] : niluuid; }
187
188 std::vector<KIID> GetIDs() const { return m_ids; }
189
190 void SetParent( MARKER_BASE* aMarker ) { m_parent = aMarker; }
191 MARKER_BASE* GetParent() const { return m_parent; }
192
193
199 virtual wxString ShowReport( UNITS_PROVIDER* aUnitsProvider, SEVERITY aSeverity,
200 const RC_ITEM_RESOLVER& aResolver ) const;
201
210 virtual void GetJsonViolation( RC_JSON::VIOLATION& aViolation, UNITS_PROVIDER* aUnitsProvider, SEVERITY aSeverity,
211 const RC_ITEM_RESOLVER& aResolver ) const;
212
213 int GetErrorCode() const { return m_errorCode; }
214 void SetErrorCode( int aCode ) { m_errorCode = aCode; }
215
220 virtual wxString GetErrorMessage( bool aTranslate ) const;
221
226 wxString GetErrorText( bool aTranslate ) const
227 {
228 if( aTranslate )
229 return wxGetTranslation( m_errorTitle );
230 else
231 return m_errorTitle;
232 }
233
234 wxString GetSettingsKey() const
235 {
236 return m_settingsKey;
237 }
238
239 virtual wxString GetViolatingRuleDesc( bool aTranslate ) const
240 {
241 return wxEmptyString;
242 }
243
244protected:
245 static wxString getSeverityString( SEVERITY aSeverity );
246
257 virtual wxString getItemDescription( EDA_ITEM* aItem, int aIndex, UNITS_PROVIDER* aUnitsProvider ) const;
258
259protected:
261 wxString m_errorMessage;
262 wxString m_errorTitle;
263 wxString m_settingsKey;
265
266 std::vector<KIID> m_ids;
267};
268
269
271{
272public:
282
283 RC_TREE_NODE( RC_TREE_NODE* aParent, const std::shared_ptr<RC_ITEM>& aRcItem, NODE_TYPE aType ) :
284 m_Type( aType ),
285 m_RcItem( aRcItem ),
286 m_Parent( aParent )
287 {}
288
290 {
291 for( RC_TREE_NODE* child : m_Children )
292 delete child;
293 }
294
295 // We own at least one list of raw pointers. Don't let the compiler fill in copy c'tors that
296 // will only land us in trouble.
297 RC_TREE_NODE( const RC_TREE_NODE& ) = delete;
299
300 struct HANDLE
301 {
303 };
304
305public:
307 std::shared_ptr<RC_ITEM> m_RcItem;
308
309 HANDLE* m_Handle = nullptr;
311 std::vector<RC_TREE_NODE*> m_Children;
312};
313
314
315class RC_TREE_MODEL : public wxDataViewModel, public wxEvtHandler
316{
317public:
318 static wxDataViewItem ToItem( RC_TREE_NODE const* aNode )
319 {
320 return aNode && aNode->m_Handle ? wxDataViewItem( aNode->m_Handle ) : wxDataViewItem();
321 }
322
323 static RC_TREE_NODE* ToNode( wxDataViewItem aItem )
324 {
325 auto* handle = static_cast<RC_TREE_NODE::HANDLE*>( aItem.GetID() );
326 return handle ? handle->m_Node : nullptr;
327 }
328
329 const wxDataViewCtrl* GetView() const { return m_view; }
330
331 static KIID ToUUID( wxDataViewItem aItem );
332
333 RC_TREE_MODEL( EDA_DRAW_FRAME* aParentFrame, wxDataViewCtrl* aView );
334
336
337 // We own at least one list of raw pointers. Don't let the compiler fill in copy c'tors that
338 // will only land us in trouble.
339 RC_TREE_MODEL( const RC_TREE_MODEL& ) = delete;
341
342 void Update( std::shared_ptr<RC_ITEMS_PROVIDER> aProvider, int aSeverities );
343
346 void EnableHyperlinks( bool aEnable );
347
348 void ExpandAll();
349
350 void PrevMarker();
351 void NextMarker();
352 void SelectMarker( const MARKER_BASE* aMarker );
353 void CenterMarker( const MARKER_BASE* aMarker );
354
355 bool IsContainer( wxDataViewItem const& aItem ) const override;
356
357 wxDataViewItem GetParent( wxDataViewItem const& aItem ) const override;
358
359 unsigned int GetChildren( wxDataViewItem const& aItem, wxDataViewItemArray& aChildren ) const override;
360
361 bool HasContainerColumns( wxDataViewItem const& aItem ) const override { return true; }
362
363 bool HasValue( const wxDataViewItem& item, unsigned col ) const override
364 {
365 if( m_tree.empty() )
366 return false;
367 else
368 return wxDataViewModel::HasValue( item, col );
369 }
370
374 void GetValue( wxVariant& aVariant, wxDataViewItem const& aItem, unsigned int aCol ) const override;
375
379 bool SetValue( wxVariant const& aVariant, wxDataViewItem const& aItem, unsigned int aCol ) override
380 {
381 // Editing not supported
382 return false;
383 }
384
389 bool GetAttr( wxDataViewItem const& aItem, unsigned int aCol, wxDataViewItemAttr& aAttr ) const override;
390
391 void ValueChanged( RC_TREE_NODE* aNode );
392
393 void DeleteCurrentItem( bool aDeep );
394
400 void DeleteItems( bool aCurrentOnly, bool aIncludeExclusions, bool aDeep );
401
402protected:
403 RC_TREE_NODE* createNode( RC_TREE_NODE* aParent, const std::shared_ptr<RC_ITEM>& aRcItem,
405 void retireNodeTree( RC_TREE_NODE* aNode );
406 void deleteNodeTree( RC_TREE_NODE* aNode );
407
413 void clearTree();
414
418 void rebuildTree( std::shared_ptr<RC_ITEMS_PROVIDER> aProvider, int aSeverities );
419
420 void rebuildModel( std::shared_ptr<RC_ITEMS_PROVIDER> aProvider, int aSeverities );
421
422 void onViewSize( wxSizeEvent& aEvent );
423
424protected:
426 wxDataViewCtrl* m_view;
428 bool m_enableHyperlinks = false;
429 wxDataViewColumn* m_hyperlinkColumn = nullptr;
430 std::shared_ptr<RC_ITEMS_PROVIDER> m_rcItemsProvider;
431
435 std::deque<RC_TREE_NODE::HANDLE> m_handles;
436 std::vector<RC_TREE_NODE*> m_tree; // I own this
437};
The base frame for deriving all KiCad main window classes.
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:98
Definition kiid.h:46
Marker are mainly used to show a DRC or ERC error or warning.
Definition marker_base.h:45
Provide an abstract interface of a RC_ITEM* list manager.
Definition rc_item.h:51
virtual int GetSeverities() const =0
virtual void SetSeverities(int aSeverities)=0
virtual void DeleteItem(int aIndex, bool aDeep)=0
Remove (and optionally deletes) the indexed item from the list.
virtual ~RC_ITEMS_PROVIDER()
Definition rc_item.h:72
virtual int GetCount(int aSeverity=-1) const =0
virtual std::shared_ptr< RC_ITEM > GetItem(int aIndex) const =0
Retrieve a RC_ITEM by index.
Interface for resolving EDA_ITEM instances by the KIID from an RC_ITEM.
Definition rc_item.h:87
virtual EDA_ITEM * doResolveItemById(const KIID &aKiid) const =0
The actual resolution logic for an item by its KIID, must be implemented against the actual item stor...
std::unordered_set< KIID > m_resolutionMisses
Store of missed resolution attempts (KIIDs that could not be resolved).
Definition rc_item.h:128
virtual ~RC_ITEM_RESOLVER()=default
EDA_ITEM * ResolveItemById(const KIID &aKiid) const
Resolve an item by its KIID.
Definition rc_item.h:98
A holder for a rule check item, DRC in Pcbnew or ERC in Eeschema.
Definition rc_item.h:138
virtual wxString ShowReport(UNITS_PROVIDER *aUnitsProvider, SEVERITY aSeverity, const RC_ITEM_RESOLVER &aResolver) const
Translate this object into a text string suitable for saving to disk in a report.
Definition rc_item.cpp:104
wxString m_settingsKey
The key used to describe this type of error in settings.
Definition rc_item.h:263
void SetItems(const KIID &aItem, const KIID &bItem=niluuid, const KIID &cItem=niluuid, const KIID &dItem=niluuid)
Definition rc_item.h:172
int GetErrorCode() const
Definition rc_item.h:213
int m_errorCode
The error code's numeric value.
Definition rc_item.h:260
virtual ~RC_ITEM()
Definition rc_item.h:156
wxString GetErrorText(bool aTranslate) const
Definition rc_item.h:226
static wxString getSeverityString(SEVERITY aSeverity)
Definition rc_item.cpp:85
virtual wxString GetViolatingRuleDesc(bool aTranslate) const
Definition rc_item.h:239
MARKER_BASE * GetParent() const
Definition rc_item.h:191
void AddItem(EDA_ITEM *aItem)
Definition rc_item.cpp:54
MARKER_BASE * m_parent
The marker this item belongs to, if any.
Definition rc_item.h:264
virtual KIID GetAuxItem3ID() const
Definition rc_item.h:186
void SetErrorMessage(const wxString &aMessage)
Definition rc_item.h:158
virtual void GetJsonViolation(RC_JSON::VIOLATION &aViolation, UNITS_PROVIDER *aUnitsProvider, SEVERITY aSeverity, const RC_ITEM_RESOLVER &aResolver) const
Translate this object into an RC_JSON::VIOLATION object.
Definition rc_item.cpp:152
virtual KIID GetAuxItem2ID() const
Definition rc_item.h:185
virtual KIID GetMainItemID() const
Definition rc_item.h:183
virtual KIID GetAuxItemID() const
Definition rc_item.h:184
void SetItems(const std::vector< KIID > &aIds)
Definition rc_item.h:165
wxString m_errorMessage
A message describing the details of this specific error.
Definition rc_item.h:261
void SetParent(MARKER_BASE *aMarker)
Definition rc_item.h:190
RC_ITEM(const std::shared_ptr< RC_ITEM > &aItem)
Definition rc_item.h:146
void SetErrorCode(int aCode)
Definition rc_item.h:214
void SetErrorDetail(const wxString &aMsg)
Definition rc_item.h:160
wxString GetSettingsKey() const
Definition rc_item.h:234
std::vector< KIID > GetIDs() const
Definition rc_item.h:188
wxString m_errorTitle
The string describing the type of error.
Definition rc_item.h:262
std::vector< KIID > m_ids
Definition rc_item.h:266
RC_ITEM()
Definition rc_item.h:140
virtual wxString GetErrorMessage(bool aTranslate) const
Definition rc_item.cpp:37
virtual wxString getItemDescription(EDA_ITEM *aItem, int aIndex, UNITS_PROVIDER *aUnitsProvider) const
Resolve the description string used for an affected item in ShowReport and GetJsonViolation.
Definition rc_item.cpp:79
void ExpandAll()
Definition rc_item.cpp:435
std::deque< RC_TREE_NODE::HANDLE > m_handles
Stable wx item IDs.
Definition rc_item.h:435
void PrevMarker()
Definition rc_item.cpp:777
int m_severities
Definition rc_item.h:427
void onViewSize(wxSizeEvent &aEvent)
Definition rc_item.cpp:426
wxDataViewColumn * m_hyperlinkColumn
Definition rc_item.h:429
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:479
std::vector< RC_TREE_NODE * > m_tree
Definition rc_item.h:436
unsigned int GetChildren(wxDataViewItem const &aItem, wxDataViewItemArray &aChildren) const override
Definition rc_item.cpp:463
bool HasContainerColumns(wxDataViewItem const &aItem) const override
Definition rc_item.h:361
bool HasValue(const wxDataViewItem &item, unsigned col) const override
Definition rc_item.h:363
EDA_DRAW_FRAME * m_editFrame
Definition rc_item.h:425
void retireNodeTree(RC_TREE_NODE *aNode)
Definition rc_item.cpp:254
static wxDataViewItem ToItem(RC_TREE_NODE const *aNode)
Definition rc_item.h:318
void rebuildTree(std::shared_ptr< RC_ITEMS_PROVIDER > aProvider, int aSeverities)
Repopulate the node tree from aProvider.
Definition rc_item.cpp:294
bool SetValue(wxVariant const &aVariant, wxDataViewItem const &aItem, unsigned int aCol) override
Called by the wxDataView to edit an item's content.
Definition rc_item.h:379
bool m_enableHyperlinks
Definition rc_item.h:428
void clearTree()
Retire and destroy every node in the tree.
Definition rc_item.cpp:276
void SelectMarker(const MARKER_BASE *aMarker)
Definition rc_item.cpp:826
RC_TREE_MODEL(EDA_DRAW_FRAME *aParentFrame, wxDataViewCtrl *aView)
Definition rc_item.cpp:232
void deleteNodeTree(RC_TREE_NODE *aNode)
Definition rc_item.cpp:267
const wxDataViewCtrl * GetView() const
Definition rc_item.h:329
static RC_TREE_NODE * ToNode(wxDataViewItem aItem)
Definition rc_item.h:323
void ValueChanged(RC_TREE_NODE *aNode)
Definition rc_item.cpp:602
void Update(std::shared_ptr< RC_ITEMS_PROVIDER > aProvider, int aSeverities)
Definition rc_item.cpp:404
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:557
RC_TREE_MODEL & operator=(const RC_TREE_MODEL &)=delete
void DeleteItems(bool aCurrentOnly, bool aIncludeExclusions, bool aDeep)
Delete the current item or all items.
Definition rc_item.cpp:659
RC_TREE_NODE * createNode(RC_TREE_NODE *aParent, const std::shared_ptr< RC_ITEM > &aRcItem, RC_TREE_NODE::NODE_TYPE aType)
Definition rc_item.cpp:241
RC_TREE_MODEL(const RC_TREE_MODEL &)=delete
void DeleteCurrentItem(bool aDeep)
Definition rc_item.cpp:653
wxDataViewItem GetParent(wxDataViewItem const &aItem) const override
Definition rc_item.cpp:456
void CenterMarker(const MARKER_BASE *aMarker)
Definition rc_item.cpp:841
void EnableHyperlinks(bool aEnable)
Render [label](url) markup as clickable links.
Definition rc_item.cpp:410
static KIID ToUUID(wxDataViewItem aItem)
Definition rc_item.cpp:202
wxDataViewCtrl * m_view
Definition rc_item.h:426
std::shared_ptr< RC_ITEMS_PROVIDER > m_rcItemsProvider
Definition rc_item.h:430
void NextMarker()
Definition rc_item.cpp:798
bool IsContainer(wxDataViewItem const &aItem) const override
Definition rc_item.cpp:442
void rebuildModel(std::shared_ptr< RC_ITEMS_PROVIDER > aProvider, int aSeverities)
Definition rc_item.cpp:340
std::shared_ptr< RC_ITEM > m_RcItem
Definition rc_item.h:307
RC_TREE_NODE * m_Parent
Definition rc_item.h:310
RC_TREE_NODE(RC_TREE_NODE *aParent, const std::shared_ptr< RC_ITEM > &aRcItem, NODE_TYPE aType)
Definition rc_item.h:283
std::vector< RC_TREE_NODE * > m_Children
Definition rc_item.h:311
RC_TREE_NODE(const RC_TREE_NODE &)=delete
HANDLE * m_Handle
Definition rc_item.h:309
RC_TREE_NODE & operator=(const RC_TREE_NODE &)=delete
NODE_TYPE m_Type
Definition rc_item.h:306
KIID niluuid(0)
Contains the json serialization structs for DRC and ERC reports If you are trying to change the outpu...
Definition rc_item.h:39
SEVERITY
RC_TREE_NODE * m_Node
Definition rc_item.h:302