KiCad PCB EDA Suite
Loading...
Searching...
No Matches
design_block_tree_model_adapter.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 modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <pgm_base.h>
21#include <kiface_base.h>
22#include <eda_base_frame.h>
23#include <core/kicad_algo.h>
26#include <wx/log.h>
27#include <wx/tokenzr.h>
29#include <string_utils.h>
30#include <eda_pattern_match.h>
31#include <design_block.h>
33#include <design_block_info.h>
35
36wxObjectDataPtr<LIB_TREE_MODEL_ADAPTER>
39 TOOL_INTERACTIVE* aContextMenuTool )
40{
41 auto* adapter = new DESIGN_BLOCK_TREE_MODEL_ADAPTER( aParent, aLibs, aSettings, aContextMenuTool );
42 return wxObjectDataPtr<LIB_TREE_MODEL_ADAPTER>( adapter );
43}
44
45
48 TOOL_INTERACTIVE* aContextMenuTool ) :
49 LIB_TREE_MODEL_ADAPTER( aParent, wxT( "pinned_design_block_libs" ),
50 Kiface().KifaceSettings()->m_DesignBlockChooserPanel.tree ),
52 m_frame( aParent ),
53 m_contextMenuTool( aContextMenuTool )
54{
55}
56
57
59{
61 PROJECT_FILE& project = aParent->Prj().GetProjectFile();
62
63 for( const wxString& libName : m_libs->GetLogicalLibs() )
64 {
65 const DESIGN_BLOCK_LIB_TABLE_ROW* library = nullptr;
66
67 try
68 {
69 library = m_libs->FindRow( libName, true );
70 }
71 catch( ... )
72 {
73 // Skip loading this library, if not exists/ not found
74 continue;
75 }
76 bool pinned = alg::contains( cfg->m_Session.pinned_design_block_libs, libName )
77 || alg::contains( project.m_PinnedDesignBlockLibs, libName );
78
79 DoAddLibrary( libName, library->GetDescr(), getDesignBlocks( aParent, libName ), pinned, true );
80 }
81
82 m_tree.AssignIntrinsicRanks( m_shownColumns );
83}
84
85
90
91
93 const wxString& aLibName )
94{
95 std::vector<LIB_TREE_ITEM*> libList;
96
97 auto fullListStart = DESIGN_BLOCK_LIB_TABLE::GetGlobalList().GetList().begin();
98 auto fullListEnd = DESIGN_BLOCK_LIB_TABLE::GetGlobalList().GetList().end();
99
100 std::unique_ptr<DESIGN_BLOCK_INFO> dummy = std::make_unique<DESIGN_BLOCK_INFO_IMPL>( aLibName, wxEmptyString );
101
102 // List is sorted, so use a binary search to find the range of footnotes for our library
103 auto libBounds = std::equal_range(
104 fullListStart, fullListEnd, dummy,
105 []( const std::unique_ptr<DESIGN_BLOCK_INFO>& a, const std::unique_ptr<DESIGN_BLOCK_INFO>& b )
106 {
107 return StrNumCmp( a->GetLibNickname(), b->GetLibNickname(), false ) < 0;
108 } );
109
110 for( auto i = libBounds.first; i != libBounds.second; ++i )
111 libList.push_back( i->get() );
112
113 return libList;
114}
115
116
117wxString DESIGN_BLOCK_TREE_MODEL_ADAPTER::GenerateInfo( LIB_ID const& aLibId, int aUnit )
118{
119 static const wxString DescriptionFormat = wxT(
120 "<b>__NAME__</b>"
121 "__DESC__"
122 "__KEY__"
123 "<hr><table border=0>"
124 "__FIELDS__"
125 "</table>" );
126
127 static const wxString DescFormat = wxS( "<br>%s" );
128 static const wxString KeywordsFormat = wxS( "<br>" ) + _( "Keywords" ) + wxS( ": %s" );
129
130 static const wxString FieldFormat = wxT(
131 "<tr>"
132 " <td><b>__FIELD_NAME__</b></td>"
133 " <td>__FIELD_VALUE__</td>"
134 "</tr>" );
135
136
137 if( !aLibId.IsValid() )
138 return wxEmptyString;
139
140 const DESIGN_BLOCK* db = nullptr;
141
142 try
143 {
144 db = m_libs->GetEnumeratedDesignBlock( aLibId.GetLibNickname(), aLibId.GetLibItemName() );
145 }
146 catch( const IO_ERROR& ioe )
147 {
148 wxLogError( _( "Error loading design block %s from library '%s'." ) + wxS( "\n%s" ),
149 aLibId.GetLibItemName().wx_str(), aLibId.GetLibNickname().wx_str(), ioe.What() );
150
151 return wxEmptyString;
152 }
153
154 wxString html = DescriptionFormat;
155
156 if( db )
157 {
158 wxString name = aLibId.GetLibItemName();
159 wxString desc = db->GetLibDescription();
160 wxString keywords = db->GetKeywords();
161
162 html.Replace( "__NAME__", EscapeHTML( name ) );
163
164 wxString esc_desc = EscapeHTML( UnescapeString( desc ) );
165
166 // Add line breaks
167 esc_desc.Replace( wxS( "\n" ), wxS( "<br>" ) );
168
169 // Add links
170 esc_desc = LinkifyHTML( esc_desc );
171
172 if( esc_desc.IsEmpty() )
173 html.Replace( "__DESC__", wxEmptyString );
174 else
175 html.Replace( "__DESC__", wxString::Format( DescFormat, esc_desc ) );
176
177 if( keywords.IsEmpty() )
178 html.Replace( "__KEY__", wxEmptyString );
179 else
180 html.Replace( "__KEY__", wxString::Format( KeywordsFormat, EscapeHTML( keywords ) ) );
181
182 wxString fieldTable;
183
184 for( const auto& [key, value] : db->GetFields() )
185 {
186 wxString fieldRow = FieldFormat;
187 fieldRow.Replace( wxS( "__FIELD_NAME__" ), EscapeHTML( key ) );
188 fieldRow.Replace( wxS( "__FIELD_VALUE__" ), EscapeHTML( value ) );
189 fieldTable += fieldRow;
190 }
191
192 html.Replace( "__FIELDS__", fieldTable );
193
194 // Design blocks (unlike symbols and footprints) are not cached. We own the pointer.
195 delete db;
196 }
197 else
198 {
199 html.Printf( _( "Error loading design block %s from library '%s'." ) + wxS( "\n" ),
200 aLibId.GetLibItemName().wx_str(), aLibId.GetLibNickname().wx_str() );
201 }
202
203 return html;
204}
205
206
const char * name
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
Hold a record identifying a library accessed by the appropriate design block library #PLUGIN object i...
static DESIGN_BLOCK_LIST_IMPL & GetGlobalList()
const std::vector< std::unique_ptr< DESIGN_BLOCK_INFO > > & GetList() const
Was forced to add this by modview_frame.cpp.
std::vector< LIB_TREE_ITEM * > getDesignBlocks(EDA_BASE_FRAME *aParent, const wxString &aLibName)
wxString GenerateInfo(LIB_ID const &aLibId, int aUnit) override
static wxObjectDataPtr< LIB_TREE_MODEL_ADAPTER > Create(EDA_BASE_FRAME *aParent, LIB_TABLE *aLibs, APP_SETTINGS_BASE::LIB_TREE &aSettings, TOOL_INTERACTIVE *aContextMenuTool)
Factory function: create a model adapter in a reference-counting container.
DESIGN_BLOCK_TREE_MODEL_ADAPTER(EDA_BASE_FRAME *aParent, LIB_TABLE *aLibs, APP_SETTINGS_BASE::LIB_TREE &aSettings, TOOL_INTERACTIVE *aContextMenuTool)
Constructor; takes a set of libraries to be included in the search.
const wxString & GetKeywords() const
const wxString & GetLibDescription() const
const nlohmann::ordered_map< wxString, wxString > & GetFields() const
The base frame for deriving all KiCad main window classes.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
A logical library item identifier and consists of various portions much like a URI.
Definition lib_id.h:49
bool IsValid() const
Check if this LID_ID is valid.
Definition lib_id.h:172
const UTF8 & GetLibItemName() const
Definition lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition lib_id.h:87
Manage LIB_TABLE_ROW records (rows), and can be searched based on library nickname.
LIB_TREE_MODEL_ADAPTER(EDA_BASE_FRAME *aParent, const wxString &aPinnedKey, APP_SETTINGS_BASE::LIB_TREE &aSettingsStruct)
Create the adapter.
std::vector< wxString > m_shownColumns
LIB_TREE_NODE_LIBRARY & DoAddLibrary(const wxString &aNodeName, const wxString &aDesc, const std::vector< LIB_TREE_ITEM * > &aItemList, bool pinned, bool presorted)
Add the given list of symbols by alias.
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:576
The backing store for a PROJECT, in JSON format.
virtual PROJECT_FILE & GetProjectFile() const
Definition project.h:204
wxString wx_str() const
Definition utf8.cpp:45
#define _(s)
Base window classes and related definitions.
Abstract pattern-matching tool and implementations.
static const wxString KeywordsFormat
static const wxString DescriptionFormat
static const wxString DescFormat
static const wxString FieldFormat
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition kicad_algo.h:100
PGM_BASE & Pgm()
The global program "get" accessor.
Definition pgm_base.cpp:913
see class PGM_BASE
std::vector< FAB_LAYER_COLOR > dummy
int StrNumCmp(const wxString &aString1, const wxString &aString2, bool aIgnoreCase)
Compare two strings with alphanumerical content.
wxString EscapeHTML(const wxString &aString)
Return a new wxString escaped for embedding in HTML.
wxString UnescapeString(const wxString &aSource)
wxString LinkifyHTML(wxString aStr)
Wraps links in HTML tags.
std::vector< wxString > pinned_design_block_libs