diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index 34aefa7749..ca31d61c29 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -185,6 +185,7 @@ set( COMMON_WIDGET_SRCS
widgets/grid_icon_text_helpers.cpp
widgets/grid_text_button_helpers.cpp
widgets/indicator_icon.cpp
+ widgets/lib_tree.cpp
widgets/mathplot.cpp
widgets/paged_dialog.cpp
widgets/progress_reporter.cpp
@@ -290,6 +291,8 @@ set( COMMON_SRCS
lib_id.cpp
lib_table_base.cpp
lib_table_keywords.cpp
+ lib_tree_model.cpp
+ lib_tree_model_adapter.cpp
lockfile.cpp
marker_base.cpp
md5_hash.cpp
diff --git a/common/draw_frame.cpp b/common/draw_frame.cpp
index 124a27af78..7236fd74d1 100644
--- a/common/draw_frame.cpp
+++ b/common/draw_frame.cpp
@@ -1375,9 +1375,7 @@ void EDA_DRAW_FRAME::SetScrollCenterPosition( const wxPoint& aPoint )
//-------------------------------------------------
-void EDA_DRAW_FRAME::RefreshCrossHair( const wxPoint &aOldPos,
- const wxPoint &aEvtPos,
- wxDC* aDC )
+void EDA_DRAW_FRAME::RefreshCrossHair( const wxPoint &aOldPos, const wxPoint &aEvtPos, wxDC* aDC )
{
wxPoint newpos = GetCrossHairPosition();
@@ -1408,8 +1406,30 @@ void EDA_DRAW_FRAME::RefreshCrossHair( const wxPoint &aOldPos,
}
}
-bool EDA_DRAW_FRAME::GeneralControlKeyMovement( int aHotKey, wxPoint *aPos,
- bool aSnapToGrid )
+
+bool EDA_DRAW_FRAME::LibraryFileBrowser( bool doOpen, wxFileName& aFilename,
+ const wxString& wildcard, const wxString& ext )
+{
+ aFilename.SetExt( ext );
+
+ wxFileDialog dlg( this,
+ doOpen ? _( "Select Library" ) : _( "New Library" ),
+ Prj().GetProjectPath(),
+ doOpen ? wxString( wxEmptyString ) : aFilename.GetFullName() ,
+ wildcard,
+ doOpen ? wxFD_OPEN | wxFD_FILE_MUST_EXIST : wxFD_SAVE | wxFD_CHANGE_DIR | wxFD_OVERWRITE_PROMPT );
+
+ if( dlg.ShowModal() == wxID_CANCEL )
+ return false;
+
+ aFilename = dlg.GetPath();
+ aFilename.SetExt( ext );
+
+ return true;
+}
+
+
+bool EDA_DRAW_FRAME::GeneralControlKeyMovement( int aHotKey, wxPoint *aPos, bool aSnapToGrid )
{
bool key_handled = false;
diff --git a/eeschema/cmp_tree_model.cpp b/common/lib_tree_model.cpp
similarity index 68%
rename from eeschema/cmp_tree_model.cpp
rename to common/lib_tree_model.cpp
index 7308f12178..73a60671bb 100644
--- a/eeschema/cmp_tree_model.cpp
+++ b/common/lib_tree_model.cpp
@@ -19,10 +19,10 @@
* with this program. If not, see .
*/
-#include
+#include
-#include
#include
+#include
#include
#include
#include
@@ -50,7 +50,7 @@ static int matchPosScore(int aPosition, int aMaximum)
}
-void CMP_TREE_NODE::ResetScore()
+void LIB_TREE_NODE::ResetScore()
{
for( auto& child: Children )
child->ResetScore();
@@ -59,15 +59,15 @@ void CMP_TREE_NODE::ResetScore()
}
-void CMP_TREE_NODE::AssignIntrinsicRanks()
+void LIB_TREE_NODE::AssignIntrinsicRanks()
{
- std::vector sort_buf;
+ std::vector sort_buf;
for( auto const& node: Children )
sort_buf.push_back( &*node );
std::sort( sort_buf.begin(), sort_buf.end(),
- []( CMP_TREE_NODE* a, CMP_TREE_NODE* b ) -> bool
+ []( LIB_TREE_NODE* a, LIB_TREE_NODE* b ) -> bool
{ return a->MatchName > b->MatchName; } );
for( int i = 0; i < (int) sort_buf.size(); ++i )
@@ -75,10 +75,10 @@ void CMP_TREE_NODE::AssignIntrinsicRanks()
}
-void CMP_TREE_NODE::SortNodes()
+void LIB_TREE_NODE::SortNodes()
{
std::sort( Children.begin(), Children.end(),
- []( std::unique_ptr const& a, std::unique_ptr const& b )
+ []( std::unique_ptr const& a, std::unique_ptr const& b )
{ return Compare( *a, *b ) > 0; } );
for( auto& node: Children )
@@ -88,7 +88,7 @@ void CMP_TREE_NODE::SortNodes()
}
-int CMP_TREE_NODE::Compare( CMP_TREE_NODE const& aNode1, CMP_TREE_NODE const& aNode2 )
+int LIB_TREE_NODE::Compare( LIB_TREE_NODE const& aNode1, LIB_TREE_NODE const& aNode2 )
{
if( aNode1.Type != aNode2.Type )
return 0;
@@ -103,7 +103,7 @@ int CMP_TREE_NODE::Compare( CMP_TREE_NODE const& aNode1, CMP_TREE_NODE const& aN
}
-CMP_TREE_NODE::CMP_TREE_NODE()
+LIB_TREE_NODE::LIB_TREE_NODE()
: Parent( nullptr ),
Type( INVALID ),
IntrinsicRank( 0 ),
@@ -114,7 +114,7 @@ CMP_TREE_NODE::CMP_TREE_NODE()
{}
-CMP_TREE_NODE_UNIT::CMP_TREE_NODE_UNIT( CMP_TREE_NODE* aParent, int aUnit )
+LIB_TREE_NODE_UNIT::LIB_TREE_NODE_UNIT( LIB_TREE_NODE* aParent, LIB_TREE_ITEM* aItem, int aUnit )
{
static void* locale = nullptr;
static wxString namePrefix;
@@ -133,7 +133,7 @@ CMP_TREE_NODE_UNIT::CMP_TREE_NODE_UNIT( CMP_TREE_NODE* aParent, int aUnit )
Unit = aUnit;
LibId = aParent->LibId;
- Name = namePrefix + " " + LIB_PART::SubReference( aUnit, false );
+ Name = namePrefix + " " + aItem->GetUnitReference( aUnit );
Desc = wxEmptyString;
MatchName = wxEmptyString;
@@ -141,7 +141,7 @@ CMP_TREE_NODE_UNIT::CMP_TREE_NODE_UNIT( CMP_TREE_NODE* aParent, int aUnit )
}
-CMP_TREE_NODE_LIB_ID::CMP_TREE_NODE_LIB_ID( CMP_TREE_NODE* aParent, LIB_ALIAS* aAlias )
+LIB_TREE_NODE_LIB_ID::LIB_TREE_NODE_LIB_ID( LIB_TREE_NODE* aParent, LIB_TREE_ITEM* aAlias )
{
wxASSERT( aParent && aAlias );
@@ -151,61 +151,36 @@ CMP_TREE_NODE_LIB_ID::CMP_TREE_NODE_LIB_ID( CMP_TREE_NODE* aParent, LIB_ALIAS* a
}
-CMP_TREE_NODE_UNIT& CMP_TREE_NODE_LIB_ID::AddUnit( int aUnit )
+LIB_TREE_NODE_UNIT& LIB_TREE_NODE_LIB_ID::AddUnit( LIB_TREE_ITEM* aItem, int aUnit )
{
- CMP_TREE_NODE_UNIT* unit = new CMP_TREE_NODE_UNIT( this, aUnit );
- Children.push_back( std::unique_ptr( unit ) );
+ LIB_TREE_NODE_UNIT* unit = new LIB_TREE_NODE_UNIT( this, aItem, aUnit );
+ Children.push_back( std::unique_ptr( unit ) );
return *unit;
}
-void CMP_TREE_NODE_LIB_ID::Update( LIB_ALIAS* aAlias )
+void LIB_TREE_NODE_LIB_ID::Update( LIB_TREE_ITEM* aItem )
{
- Name = aAlias->GetName();
- Desc = aAlias->GetDescription();
+ IsRoot = aItem->IsRoot();
+ LibId = aItem->GetLibId();
- // Parent node is the library nickname so set the LIB_ID library nickname.
- IsRoot = aAlias->IsRoot();
+ Name = aItem->GetName();
+ Desc = aItem->GetDescription();
- // Pre-normalized strings for fast case-insensitive matching
- // Search text spaces out keywords and description to penalize description
- // matches - earlier matches are worth more.
- MatchName = aAlias->GetName().Lower();
- SearchText = (aAlias->GetKeyWords() + " " + Desc);
-
- // Extract default footprint text
- LIB_PART* part = aAlias->GetPart();
-
- wxString footprint;
-
- if( part )
- {
- LibId = part->GetLibId();
- LibId.SetLibItemName( Name );
- footprint = part->GetFootprintField().GetText();
- }
-
- // If a footprint is defined for the part,
- // add it to the serach string
- if( !footprint.IsEmpty() )
- {
- SearchText += " ";
- SearchText += footprint;
- }
+ MatchName = aItem->GetName().Lower();
+ SearchText = aItem->GetSearchText();
+ SearchTextNormalized = false;
Children.clear();
- if( part && part->IsMulti() )
- {
- for( int u = 1; u <= part->GetUnitCount(); ++u )
- AddUnit( u );
- }
+ int unitCount = aItem->GetUnitCount();
- SearchTextNormalized = false;
+ for( int u = 1; u <= unitCount; ++u )
+ AddUnit( aItem, u );
}
-void CMP_TREE_NODE_LIB_ID::UpdateScore( EDA_COMBINED_MATCHER& aMatcher )
+void LIB_TREE_NODE_LIB_ID::UpdateScore( EDA_COMBINED_MATCHER& aMatcher )
{
if( Score <= 0 )
return; // Leaf nodes without scores are out of the game.
@@ -259,8 +234,8 @@ void CMP_TREE_NODE_LIB_ID::UpdateScore( EDA_COMBINED_MATCHER& aMatcher )
}
-CMP_TREE_NODE_LIB::CMP_TREE_NODE_LIB( CMP_TREE_NODE* aParent,
- wxString const& aName, wxString const& aDesc )
+LIB_TREE_NODE_LIB::LIB_TREE_NODE_LIB( LIB_TREE_NODE* aParent, wxString const& aName,
+ wxString const& aDesc )
{
Type = LIB;
Name = aName;
@@ -271,15 +246,15 @@ CMP_TREE_NODE_LIB::CMP_TREE_NODE_LIB( CMP_TREE_NODE* aParent,
}
-CMP_TREE_NODE_LIB_ID& CMP_TREE_NODE_LIB::AddAlias( LIB_ALIAS* aAlias )
+LIB_TREE_NODE_LIB_ID& LIB_TREE_NODE_LIB::AddComp( LIB_TREE_ITEM* aAlias )
{
- CMP_TREE_NODE_LIB_ID* alias = new CMP_TREE_NODE_LIB_ID( this, aAlias );
- Children.push_back( std::unique_ptr( alias ) );
+ LIB_TREE_NODE_LIB_ID* alias = new LIB_TREE_NODE_LIB_ID( this, aAlias );
+ Children.push_back( std::unique_ptr( alias ) );
return *alias;
}
-void CMP_TREE_NODE_LIB::UpdateScore( EDA_COMBINED_MATCHER& aMatcher )
+void LIB_TREE_NODE_LIB::UpdateScore( EDA_COMBINED_MATCHER& aMatcher )
{
Score = 0;
@@ -291,21 +266,21 @@ void CMP_TREE_NODE_LIB::UpdateScore( EDA_COMBINED_MATCHER& aMatcher )
}
-CMP_TREE_NODE_ROOT::CMP_TREE_NODE_ROOT()
+LIB_TREE_NODE_ROOT::LIB_TREE_NODE_ROOT()
{
Type = ROOT;
}
-CMP_TREE_NODE_LIB& CMP_TREE_NODE_ROOT::AddLib( wxString const& aName, wxString const& aDesc )
+LIB_TREE_NODE_LIB& LIB_TREE_NODE_ROOT::AddLib( wxString const& aName, wxString const& aDesc )
{
- CMP_TREE_NODE_LIB* lib = new CMP_TREE_NODE_LIB( this, aName, aDesc );
- Children.push_back( std::unique_ptr( lib ) );
+ LIB_TREE_NODE_LIB* lib = new LIB_TREE_NODE_LIB( this, aName, aDesc );
+ Children.push_back( std::unique_ptr( lib ) );
return *lib;
}
-void CMP_TREE_NODE_ROOT::UpdateScore( EDA_COMBINED_MATCHER& aMatcher )
+void LIB_TREE_NODE_ROOT::UpdateScore( EDA_COMBINED_MATCHER& aMatcher )
{
for( auto& child: Children )
child->UpdateScore( aMatcher );
diff --git a/eeschema/cmp_tree_model.h b/common/lib_tree_model.h
similarity index 80%
rename from eeschema/cmp_tree_model.h
rename to common/lib_tree_model.h
index 28b5e0c175..81866684e0 100644
--- a/eeschema/cmp_tree_model.h
+++ b/common/lib_tree_model.h
@@ -3,7 +3,7 @@
*
* Copyright (C) 2017 Chris Pavlina
* Copyright (C) 2014 Henner Zeller
- * Copyright (C) 2014-2017 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2014-2018 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -19,25 +19,23 @@
* with this program. If not, see .
*/
-#ifndef _CMP_TREE_MODEL_H
-#define _CMP_TREE_MODEL_H
+#ifndef LIB_TREE_MODEL_H
+#define LIB_TREE_MODEL_H
#include
#include
#include
-#include
+#include
class EDA_COMBINED_MATCHER;
-class TREE_NODE;
-class LIB_ALIAS;
/**
* Model class in the component selector Model-View-Adapter (mediated MVC)
* architecture. The other pieces are in:
*
- * - Adapter: CMP_TREE_MODEL_ADAPTER in eeschema/cmp_tree_model_adapter.h
+ * - Adapter: LIB_TREE_MODEL_ADAPTER in common/lib_tree_model_adapter.h
* - View:
* - DIALOG_CHOOSE_COMPONENT in eeschema/dialogs/dialog_choose_component.h
* - wxDataViewCtrl
@@ -74,15 +72,15 @@ class LIB_ALIAS;
* - `LibId` - the #LIB_ID this alias or unit is from, or not valid
* - `Unit` - the unit number, or zero for non-units
*/
-class CMP_TREE_NODE {
+class LIB_TREE_NODE {
public:
enum TYPE {
ROOT, LIB, LIBID, UNIT, INVALID
};
- typedef std::vector> PTR_VECTOR;
+ typedef std::vector> PTR_VECTOR;
- CMP_TREE_NODE* Parent; ///< Parent node or null
+ LIB_TREE_NODE* Parent; ///< Parent node or null
PTR_VECTOR Children; ///< List of child nodes
enum TYPE Type; ///< Node type
@@ -135,17 +133,17 @@ public:
* Compare two nodes. Returns negative if aNode1 < aNode2, zero if aNode1 ==
* aNode2, or positive if aNode1 > aNode2.
*/
- static int Compare( CMP_TREE_NODE const& aNode1, CMP_TREE_NODE const& aNode2 );
+ static int Compare( LIB_TREE_NODE const& aNode1, LIB_TREE_NODE const& aNode2 );
- CMP_TREE_NODE();
- virtual ~CMP_TREE_NODE() {}
+ LIB_TREE_NODE();
+ virtual ~LIB_TREE_NODE() {}
};
/**
* Node type: unit of component.
*/
-class CMP_TREE_NODE_UNIT: public CMP_TREE_NODE
+class LIB_TREE_NODE_UNIT: public LIB_TREE_NODE
{
public:
@@ -153,8 +151,8 @@ public:
* The addresses of CMP_TREE_NODEs are used as unique IDs for the
* wxDataViewModel, so don't let them be copied around.
*/
- CMP_TREE_NODE_UNIT( CMP_TREE_NODE_UNIT const& _ ) = delete;
- void operator=( CMP_TREE_NODE_UNIT const& _ ) = delete;
+ LIB_TREE_NODE_UNIT( LIB_TREE_NODE_UNIT const& _ ) = delete;
+ void operator=( LIB_TREE_NODE_UNIT const& _ ) = delete;
/**
@@ -164,9 +162,10 @@ public:
* by LIB_PART::SubReference.
*
* @param aParent parent node, should be a CMP_TREE_NODE_ALIAS
+ * @param aItem parent item
* @param aUnit unit number
*/
- CMP_TREE_NODE_UNIT( CMP_TREE_NODE* aParent, int aUnit );
+ LIB_TREE_NODE_UNIT( LIB_TREE_NODE* aParent, LIB_TREE_ITEM* aItem, int aUnit );
/**
@@ -179,15 +178,15 @@ public:
/**
* Node type: #LIB_ID.
*/
-class CMP_TREE_NODE_LIB_ID: public CMP_TREE_NODE
+class LIB_TREE_NODE_LIB_ID: public LIB_TREE_NODE
{
public:
/**
* The addresses of CMP_TREE_NODEs are used as unique IDs for the
* wxDataViewModel, so don't let them be copied around.
*/
- CMP_TREE_NODE_LIB_ID( CMP_TREE_NODE_LIB_ID const& _ ) = delete;
- void operator=( CMP_TREE_NODE_LIB_ID const& _ ) = delete;
+ LIB_TREE_NODE_LIB_ID( LIB_TREE_NODE_LIB_ID const& _ ) = delete;
+ void operator=( LIB_TREE_NODE_LIB_ID const& _ ) = delete;
/**
@@ -200,14 +199,14 @@ public:
* The alias must be resolved at the time of use. Anything else is a bug.
*
* @param aParent parent node, should be a CMP_TREE_NODE_LIB
- * @param aAlias LIB_ALIAS to populate the node.
+ * @param aItem LIB_COMPONENT to populate the node.
*/
- CMP_TREE_NODE_LIB_ID( CMP_TREE_NODE* aParent, LIB_ALIAS* aAlias );
+ LIB_TREE_NODE_LIB_ID( LIB_TREE_NODE* aParent, LIB_TREE_ITEM* aItem );
/**
* Update the node using data from a LIB_ALIAS object.
*/
- void Update( LIB_ALIAS* aAlias );
+ void Update( LIB_TREE_ITEM* aItem );
/**
* Perform the actual search.
@@ -220,22 +219,22 @@ protected:
*
* This should not be used directly, as the constructor adds all units.
*/
- CMP_TREE_NODE_UNIT& AddUnit( int aUnit );
+ LIB_TREE_NODE_UNIT& AddUnit( LIB_TREE_ITEM* aItem, int aUnit );
};
/**
* Node type: library
*/
-class CMP_TREE_NODE_LIB: public CMP_TREE_NODE
+class LIB_TREE_NODE_LIB: public LIB_TREE_NODE
{
public:
/**
* The addresses of CMP_TREE_NODEs are used as unique IDs for the
* wxDataViewModel, so don't let them be copied around.
*/
- CMP_TREE_NODE_LIB( CMP_TREE_NODE_LIB const& _ ) = delete;
- void operator=( CMP_TREE_NODE_LIB const& _ ) = delete;
+ LIB_TREE_NODE_LIB( LIB_TREE_NODE_LIB const& _ ) = delete;
+ void operator=( LIB_TREE_NODE_LIB const& _ ) = delete;
/**
@@ -245,14 +244,14 @@ public:
* @param aName display name of the library
* @param aDesc a description of the library
*/
- CMP_TREE_NODE_LIB( CMP_TREE_NODE* aParent, wxString const& aName, wxString const& aDesc );
+ LIB_TREE_NODE_LIB( LIB_TREE_NODE* aParent, wxString const& aName, wxString const& aDesc );
/**
* Construct a new alias node, add it to this library, and return it.
*
- * @param aAlias LIB_ALIAS to provide data
+ * @param aAlias LIB_COMPONENT to provide data
*/
- CMP_TREE_NODE_LIB_ID& AddAlias( LIB_ALIAS* aAlias );
+ LIB_TREE_NODE_LIB_ID& AddComp( LIB_TREE_ITEM* aAlias );
virtual void UpdateScore( EDA_COMBINED_MATCHER& aMatcher ) override;
};
@@ -261,28 +260,28 @@ public:
/**
* Node type: root
*/
-class CMP_TREE_NODE_ROOT: public CMP_TREE_NODE
+class LIB_TREE_NODE_ROOT: public LIB_TREE_NODE
{
public:
/**
* The addresses of CMP_TREE_NODEs are used as unique IDs for the
* wxDataViewModel, so don't let them be copied around.
*/
- CMP_TREE_NODE_ROOT( CMP_TREE_NODE_ROOT const& _ ) = delete;
- void operator=( CMP_TREE_NODE_ROOT const& _ ) = delete;
+ LIB_TREE_NODE_ROOT( LIB_TREE_NODE_ROOT const& _ ) = delete;
+ void operator=( LIB_TREE_NODE_ROOT const& _ ) = delete;
/**
* Construct the root node. Root nodes have no properties.
*/
- CMP_TREE_NODE_ROOT();
+ LIB_TREE_NODE_ROOT();
/**
* Construct an empty library node, add it to the root, and return it.
*/
- CMP_TREE_NODE_LIB& AddLib( wxString const& aName, wxString const& aDesc );
+ LIB_TREE_NODE_LIB& AddLib( wxString const& aName, wxString const& aDesc );
virtual void UpdateScore( EDA_COMBINED_MATCHER& aMatcher ) override;
};
-#endif // _CMP_TREE_MODEL_H
+#endif // LIB_TREE_MODEL_H
diff --git a/eeschema/cmp_tree_model_adapter_base.cpp b/common/lib_tree_model_adapter.cpp
similarity index 52%
rename from eeschema/cmp_tree_model_adapter_base.cpp
rename to common/lib_tree_model_adapter.cpp
index 7729f83fe6..8dbd74943c 100644
--- a/eeschema/cmp_tree_model_adapter_base.cpp
+++ b/common/lib_tree_model_adapter.cpp
@@ -19,7 +19,7 @@
* with this program. If not, see .
*/
-#include
+#include
#include
@@ -28,11 +28,7 @@
#include
-CMP_TREE_MODEL_ADAPTER_BASE::WIDTH_CACHE CMP_TREE_MODEL_ADAPTER_BASE::m_width_cache;
-
-bool CMP_TREE_MODEL_ADAPTER_BASE::m_show_progress = true;
-
-#define PROGRESS_INTERVAL_MILLIS 66
+LIB_TREE_MODEL_ADAPTER::WIDTH_CACHE LIB_TREE_MODEL_ADAPTER::m_width_cache;
static const int kDataViewIndent = 20;
@@ -40,7 +36,7 @@ static const int kDataViewIndent = 20;
/**
* Convert CMP_TREE_NODE -> wxDataViewItem
*/
-wxDataViewItem CMP_TREE_MODEL_ADAPTER_BASE::ToItem( CMP_TREE_NODE const* aNode )
+wxDataViewItem LIB_TREE_MODEL_ADAPTER::ToItem( LIB_TREE_NODE const* aNode )
{
return wxDataViewItem( const_cast( static_cast( aNode ) ) );
}
@@ -49,17 +45,17 @@ wxDataViewItem CMP_TREE_MODEL_ADAPTER_BASE::ToItem( CMP_TREE_NODE const* aNode )
/**
* Convert wxDataViewItem -> CMP_TREE_NODE
*/
-CMP_TREE_NODE const* CMP_TREE_MODEL_ADAPTER_BASE::ToNode( wxDataViewItem aItem )
+LIB_TREE_NODE const* LIB_TREE_MODEL_ADAPTER::ToNode( wxDataViewItem aItem )
{
- return static_cast( aItem.GetID() );
+ return static_cast( aItem.GetID() );
}
/**
* Convert CMP_TREE_NODE's children to wxDataViewItemArray
*/
-unsigned int CMP_TREE_MODEL_ADAPTER_BASE::IntoArray(
- CMP_TREE_NODE const& aNode, wxDataViewItemArray& aChildren )
+unsigned int LIB_TREE_MODEL_ADAPTER::IntoArray( LIB_TREE_NODE const& aNode,
+ wxDataViewItemArray& aChildren )
{
unsigned int n = 0;
@@ -76,7 +72,7 @@ unsigned int CMP_TREE_MODEL_ADAPTER_BASE::IntoArray(
}
-CMP_TREE_MODEL_ADAPTER_BASE::CMP_TREE_MODEL_ADAPTER_BASE()
+LIB_TREE_MODEL_ADAPTER::LIB_TREE_MODEL_ADAPTER()
:m_filter( CMP_FILTER_NONE ),
m_show_units( true ),
m_preselect_unit( 0 ),
@@ -87,79 +83,43 @@ CMP_TREE_MODEL_ADAPTER_BASE::CMP_TREE_MODEL_ADAPTER_BASE()
{}
-CMP_TREE_MODEL_ADAPTER_BASE::~CMP_TREE_MODEL_ADAPTER_BASE()
+LIB_TREE_MODEL_ADAPTER::~LIB_TREE_MODEL_ADAPTER()
{}
-void CMP_TREE_MODEL_ADAPTER_BASE::SetFilter( CMP_FILTER_TYPE aFilter )
+void LIB_TREE_MODEL_ADAPTER::SetFilter( CMP_FILTER_TYPE aFilter )
{
m_filter = aFilter;
}
-void CMP_TREE_MODEL_ADAPTER_BASE::ShowUnits( bool aShow )
+void LIB_TREE_MODEL_ADAPTER::ShowUnits( bool aShow )
{
m_show_units = aShow;
}
-void CMP_TREE_MODEL_ADAPTER_BASE::SetPreselectNode( LIB_ID const& aLibId, int aUnit )
+void LIB_TREE_MODEL_ADAPTER::SetPreselectNode( LIB_ID const& aLibId, int aUnit )
{
m_preselect_lib_id = aLibId;
m_preselect_unit = aUnit;
}
-void CMP_TREE_MODEL_ADAPTER_BASE::AddLibrariesWithProgress(
- const std::vector& aNicknames, wxWindow* aParent )
-{
- wxProgressDialog* prg = nullptr;
- wxLongLong nextUpdate = wxGetUTCTimeMillis() + (PROGRESS_INTERVAL_MILLIS / 2);
-
- if( m_show_progress )
- prg = new wxProgressDialog( _( "Loading Symbol Libraries" ),
- wxEmptyString,
- aNicknames.size(),
- aParent );
-
- unsigned int ii = 0;
-
- for( const auto& nickname : aNicknames )
- {
- if( prg && wxGetUTCTimeMillis() > nextUpdate )
- {
- prg->Update( ii, wxString::Format( _( "Loading library \"%s\"" ), nickname ) );
- nextUpdate = wxGetUTCTimeMillis() + PROGRESS_INTERVAL_MILLIS;
- }
-
- AddLibrary( nickname );
- ii++;
- }
-
- if( prg )
- {
- prg->Destroy();
- m_show_progress = false;
- }
-}
-
-
-void CMP_TREE_MODEL_ADAPTER_BASE::AddAliasList( wxString const& aNodeName, wxString const& aDesc,
- std::vector const& aAliasList )
+void LIB_TREE_MODEL_ADAPTER::DoAddLibrary( wxString const& aNodeName, wxString const& aDesc,
+ std::vector const& aCompList )
{
auto& lib_node = m_tree.AddLib( aNodeName, aDesc );
- for( auto a: aAliasList )
- {
- lib_node.AddAlias( a );
- }
+ for( auto a: aCompList )
+ lib_node.AddComp( a );
lib_node.AssignIntrinsicRanks();
m_tree.AssignIntrinsicRanks();
}
-void CMP_TREE_MODEL_ADAPTER_BASE::UpdateSearchString( wxString const& aSearch )
+void LIB_TREE_MODEL_ADAPTER::UpdateSearchString( wxString const& aSearch )
{
m_tree.ResetScore();
@@ -193,7 +153,7 @@ void CMP_TREE_MODEL_ADAPTER_BASE::UpdateSearchString( wxString const& aSearch )
#endif
}
- CMP_TREE_NODE* bestMatch = ShowResults();
+ LIB_TREE_NODE* bestMatch = ShowResults();
if( !bestMatch )
bestMatch = ShowPreselect();
@@ -210,7 +170,7 @@ void CMP_TREE_MODEL_ADAPTER_BASE::UpdateSearchString( wxString const& aSearch )
}
-void CMP_TREE_MODEL_ADAPTER_BASE::AttachTo( wxDataViewCtrl* aDataViewCtrl )
+void LIB_TREE_MODEL_ADAPTER::AttachTo( wxDataViewCtrl* aDataViewCtrl )
{
m_widget = aDataViewCtrl;
aDataViewCtrl->SetIndent( kDataViewIndent );
@@ -221,13 +181,13 @@ void CMP_TREE_MODEL_ADAPTER_BASE::AttachTo( wxDataViewCtrl* aDataViewCtrl )
wxString desc_head = _( "Desc" );
m_col_part = aDataViewCtrl->AppendTextColumn( part_head, 0, wxDATAVIEW_CELL_INERT,
- ColWidth( m_tree, 0, part_head ) );
+ ColWidth( m_tree, 0, part_head ) );
m_col_desc = aDataViewCtrl->AppendTextColumn( desc_head, 1, wxDATAVIEW_CELL_INERT,
- ColWidth( m_tree, 1, desc_head ) );
+ ColWidth( m_tree, 1, desc_head ) );
}
-LIB_ID CMP_TREE_MODEL_ADAPTER_BASE::GetAliasFor( const wxDataViewItem& aSelection ) const
+LIB_ID LIB_TREE_MODEL_ADAPTER::GetAliasFor( const wxDataViewItem& aSelection ) const
{
auto node = ToNode( aSelection );
@@ -240,38 +200,32 @@ LIB_ID CMP_TREE_MODEL_ADAPTER_BASE::GetAliasFor( const wxDataViewItem& aSelectio
}
-int CMP_TREE_MODEL_ADAPTER_BASE::GetUnitFor( const wxDataViewItem& aSelection ) const
+int LIB_TREE_MODEL_ADAPTER::GetUnitFor( const wxDataViewItem& aSelection ) const
{
auto node = ToNode( aSelection );
return node ? node->Unit : 0;
}
-CMP_TREE_NODE::TYPE CMP_TREE_MODEL_ADAPTER_BASE::GetTypeFor( const wxDataViewItem& aSelection ) const
+LIB_TREE_NODE::TYPE LIB_TREE_MODEL_ADAPTER::GetTypeFor( const wxDataViewItem& aSelection ) const
{
auto node = ToNode( aSelection );
- return node ? node->Type : CMP_TREE_NODE::INVALID;
+ return node ? node->Type : LIB_TREE_NODE::INVALID;
}
-int CMP_TREE_MODEL_ADAPTER_BASE::GetComponentsCount() const
+int LIB_TREE_MODEL_ADAPTER::GetItemCount() const
{
int n = 0;
for( auto& lib: m_tree.Children )
- {
- for( auto& alias: lib->Children )
- {
- (void) alias;
- ++n;
- }
- }
+ n += lib->Children.size();
return n;
}
-wxDataViewItem CMP_TREE_MODEL_ADAPTER_BASE::FindItem( const LIB_ID& aLibId )
+wxDataViewItem LIB_TREE_MODEL_ADAPTER::FindItem( const LIB_ID& aLibId )
{
for( auto& lib: m_tree.Children )
{
@@ -295,55 +249,49 @@ wxDataViewItem CMP_TREE_MODEL_ADAPTER_BASE::FindItem( const LIB_ID& aLibId )
}
-unsigned int CMP_TREE_MODEL_ADAPTER_BASE::GetChildren(
- wxDataViewItem const& aItem,
- wxDataViewItemArray& aChildren ) const
+unsigned int LIB_TREE_MODEL_ADAPTER::GetChildren( wxDataViewItem const& aItem,
+ wxDataViewItemArray& aChildren ) const
{
auto node = ( aItem.IsOk() ? ToNode( aItem ) : &m_tree );
- if( node->Type != CMP_TREE_NODE::TYPE::LIBID
- || ( m_show_units && node->Type == CMP_TREE_NODE::TYPE::LIBID ) )
+ if( node->Type != LIB_TREE_NODE::TYPE::LIBID
+ || ( m_show_units && node->Type == LIB_TREE_NODE::TYPE::LIBID ) )
return IntoArray( *node, aChildren );
else
return 0;
}
-bool CMP_TREE_MODEL_ADAPTER_BASE::HasContainerColumns( wxDataViewItem const& aItem ) const
+bool LIB_TREE_MODEL_ADAPTER::HasContainerColumns( wxDataViewItem const& aItem ) const
{
return IsContainer( aItem );
}
-bool CMP_TREE_MODEL_ADAPTER_BASE::IsContainer( wxDataViewItem const& aItem ) const
+bool LIB_TREE_MODEL_ADAPTER::IsContainer( wxDataViewItem const& aItem ) const
{
auto node = ToNode( aItem );
return node ? node->Children.size() : true;
}
-wxDataViewItem CMP_TREE_MODEL_ADAPTER_BASE::GetParent( wxDataViewItem const& aItem ) const
+wxDataViewItem LIB_TREE_MODEL_ADAPTER::GetParent( wxDataViewItem const& aItem ) const
{
auto node = ToNode( aItem );
auto parent = node ? node->Parent : nullptr;
// wxDataViewModel has no root node, but rather top-level elements have
// an invalid (null) parent.
- if( !node || !parent || parent->Type == CMP_TREE_NODE::TYPE::ROOT )
- {
+ if( !node || !parent || parent->Type == LIB_TREE_NODE::TYPE::ROOT )
return ToItem( nullptr );
- }
else
- {
return ToItem( parent );
- }
}
-void CMP_TREE_MODEL_ADAPTER_BASE::GetValue(
- wxVariant& aVariant,
- wxDataViewItem const& aItem,
- unsigned int aCol ) const
+void LIB_TREE_MODEL_ADAPTER::GetValue( wxVariant& aVariant,
+ wxDataViewItem const& aItem,
+ unsigned int aCol ) const
{
if( IsFrozen() )
{
@@ -367,10 +315,9 @@ void CMP_TREE_MODEL_ADAPTER_BASE::GetValue(
}
-bool CMP_TREE_MODEL_ADAPTER_BASE::GetAttr(
- wxDataViewItem const& aItem,
- unsigned int aCol,
- wxDataViewItemAttr& aAttr ) const
+bool LIB_TREE_MODEL_ADAPTER::GetAttr( wxDataViewItem const& aItem,
+ unsigned int aCol,
+ wxDataViewItemAttr& aAttr ) const
{
if( IsFrozen() )
return false;
@@ -378,7 +325,7 @@ bool CMP_TREE_MODEL_ADAPTER_BASE::GetAttr(
auto node = ToNode( aItem );
wxASSERT( node );
- if( node->Type != CMP_TREE_NODE::LIBID )
+ if( node->Type != LIB_TREE_NODE::LIBID )
{
// Currently only aliases are formatted at all
return false;
@@ -397,67 +344,20 @@ bool CMP_TREE_MODEL_ADAPTER_BASE::GetAttr(
}
-int CMP_TREE_MODEL_ADAPTER_BASE::ColWidth( CMP_TREE_NODE& aTree, int aCol, wxString const& aHeading )
+int LIB_TREE_MODEL_ADAPTER::ColWidth( LIB_TREE_NODE& aTree, int aCol, wxString const& aHeading )
{
- const int indent = aCol ? 0 : kDataViewIndent;
-
- int min_width = WidthFor( aHeading, aCol );
- int width = std::max( aTree.Score > 0 ? WidthFor( aTree, aCol ) : 0, min_width );
-
- if( aTree.Score > 0 )
- {
- for( auto& node: aTree.Children )
- {
- width = std::max( width, ColWidth( *node, aCol, aHeading ) + indent );
- }
- }
-
- return width;
-}
-
-
-int CMP_TREE_MODEL_ADAPTER_BASE::WidthFor( CMP_TREE_NODE& aNode, int aCol )
-{
- auto result = m_width_cache.find( aNode.Name );
-
- if( result != m_width_cache.end() )
- {
- return result->second[aCol];
- }
+ // It's too expensive to calculate widths on really big trees, and the user probably
+ // wants it left where they dragged it anyway.
+ if( aCol == 0 )
+ return 360;
else
- {
- int wname = m_widget->GetTextExtent( aNode.Name ).x + kDataViewIndent;
- int wdesc = m_widget->GetTextExtent( aNode.Desc ).x;
-
- auto& val = m_width_cache[aNode.Name];
- val.push_back( wname );
- val.push_back( wdesc );
- return val[aCol];
- }
+ return 2000;
}
-int CMP_TREE_MODEL_ADAPTER_BASE::WidthFor( wxString const& aHeading, int aCol )
-{
- static std::vector widths;
-
- for( int i = (int) widths.size(); i <= aCol; ++i )
- {
- widths.push_back( 0 );
- }
-
- if( widths[aCol] == 0 )
- {
- widths[aCol] = m_widget->GetTextExtent( aHeading ).x;
- }
-
- return widths[aCol];
-}
-
-
-void CMP_TREE_MODEL_ADAPTER_BASE::FindAndExpand( CMP_TREE_NODE& aNode,
- std::function aFunc,
- CMP_TREE_NODE** aHighScore )
+void LIB_TREE_MODEL_ADAPTER::FindAndExpand( LIB_TREE_NODE& aNode,
+ std::function aFunc,
+ LIB_TREE_NODE** aHighScore )
{
for( auto& node: aNode.Children )
{
@@ -477,14 +377,14 @@ void CMP_TREE_MODEL_ADAPTER_BASE::FindAndExpand( CMP_TREE_NODE& aNode,
}
-CMP_TREE_NODE* CMP_TREE_MODEL_ADAPTER_BASE::ShowResults()
+LIB_TREE_NODE* LIB_TREE_MODEL_ADAPTER::ShowResults()
{
- CMP_TREE_NODE* highScore = nullptr;
+ LIB_TREE_NODE* highScore = nullptr;
FindAndExpand( m_tree,
- []( CMP_TREE_NODE const* n )
+ []( LIB_TREE_NODE const* n )
{
- return n->Type == CMP_TREE_NODE::TYPE::LIBID && n->Score > 1;
+ return n->Type == LIB_TREE_NODE::TYPE::LIBID && n->Score > 1;
},
&highScore );
@@ -492,19 +392,19 @@ CMP_TREE_NODE* CMP_TREE_MODEL_ADAPTER_BASE::ShowResults()
}
-CMP_TREE_NODE* CMP_TREE_MODEL_ADAPTER_BASE::ShowPreselect()
+LIB_TREE_NODE* LIB_TREE_MODEL_ADAPTER::ShowPreselect()
{
- CMP_TREE_NODE* highScore = nullptr;
+ LIB_TREE_NODE* highScore = nullptr;
if( !m_preselect_lib_id.IsValid() )
return highScore;
FindAndExpand( m_tree,
- [&]( CMP_TREE_NODE const* n )
+ [&]( LIB_TREE_NODE const* n )
{
- if( n->Type == CMP_TREE_NODE::LIBID && ( n->Children.empty() || !m_preselect_unit ) )
+ if( n->Type == LIB_TREE_NODE::LIBID && ( n->Children.empty() || !m_preselect_unit ) )
return m_preselect_lib_id == n->LibId;
- else if( n->Type == CMP_TREE_NODE::UNIT && m_preselect_unit )
+ else if( n->Type == LIB_TREE_NODE::UNIT && m_preselect_unit )
return m_preselect_lib_id == n->Parent->LibId && m_preselect_unit == n->Unit;
else
return false;
@@ -515,14 +415,14 @@ CMP_TREE_NODE* CMP_TREE_MODEL_ADAPTER_BASE::ShowPreselect()
}
-CMP_TREE_NODE* CMP_TREE_MODEL_ADAPTER_BASE::ShowSingleLibrary()
+LIB_TREE_NODE* LIB_TREE_MODEL_ADAPTER::ShowSingleLibrary()
{
- CMP_TREE_NODE* highScore = nullptr;
+ LIB_TREE_NODE* highScore = nullptr;
FindAndExpand( m_tree,
- []( CMP_TREE_NODE const* n )
+ []( LIB_TREE_NODE const* n )
{
- return n->Type == CMP_TREE_NODE::TYPE::LIBID &&
+ return n->Type == LIB_TREE_NODE::TYPE::LIBID &&
n->Parent->Parent->Children.size() == 1;
},
&highScore );
diff --git a/eeschema/cmp_tree_model_adapter_base.h b/common/lib_tree_model_adapter.h
similarity index 73%
rename from eeschema/cmp_tree_model_adapter_base.h
rename to common/lib_tree_model_adapter.h
index 4998c8b50b..4016fef101 100644
--- a/eeschema/cmp_tree_model_adapter_base.h
+++ b/common/lib_tree_model_adapter.h
@@ -19,12 +19,12 @@
* with this program. If not, see .
*/
-#ifndef _CMP_TREE_MODEL_ADAPTER_BASE_H
-#define _CMP_TREE_MODEL_ADAPTER_BASE_H
+#ifndef LIB_TREE_MODEL_ADAPTER_H
+#define LIB_TREE_MODEL_ADAPTER_H
#include
-#include
+#include
#include
#include
@@ -56,8 +56,8 @@
*
* Because this adapter is a wxDataViewModel, it is reference-counted by
* wxObject. To ensure this interface is used correctly, the constructor
- * is private; CMP_TREE_MODEL_ADAPTER should be created by the static
- * factory method CMP_TREE_MODEL_ADAPTER::Create().
+ * is private; LIB_TREE_MODEL_ADAPTER should be created by the static
+ * factory method LIB_TREE_MODEL_ADAPTER::Create().
*
* Quick summary of methods used to drive this class:
*
@@ -89,20 +89,20 @@
* - `Compare()` - compare two rows, for sorting
* - `HasDefaultCompare()` - whether sorted by default
*/
-class CMP_TREE_MODEL_ADAPTER_BASE: public wxDataViewModel
+class LIB_TREE_MODEL_ADAPTER: public wxDataViewModel
{
public:
/**
* Reference-counting container for a pointer to CMP_TREE_MODEL_ADAPTER_BASE.
*/
- typedef wxObjectDataPtr PTR;
+ typedef wxObjectDataPtr PTR;
/**
* Destructor. Do NOT delete this class manually; it is reference-counted
* by wxObject.
*/
- ~CMP_TREE_MODEL_ADAPTER_BASE();
+ ~LIB_TREE_MODEL_ADAPTER();
/**
* This enum allows a selective filtering of components to list
@@ -142,47 +142,16 @@ public:
*/
void SetPreselectNode( LIB_ID const& aLibId, int aUnit );
- /**
- * Add all the components and their aliases in this library. To be called
- * in the setup phase.
- *
- * @param aLibNickname reference to a symbol library nickname
- */
- virtual void AddLibrary( wxString const& aLibNickname ) = 0;
-
- /**
- * Add all the libraries in a SYMBOL_LIB_TABLE to the model,
- * displaying a progress dialog attached to the parent frame
- *
- * @param aNicknames is the list of library nicknames
- * @param aParent is the parent window to display the progress dialog
- */
- void AddLibrariesWithProgress( const std::vector& aNicknames,
- wxWindow* aParent );
-
- /**
- * Add the given list of components, by name. To be called in the setup
- * phase.
- *
- * @param aNodeName the parent node the components will appear under
- * @param aAliasNameList list of alias names
- */
- virtual void AddAliasList(
- wxString const& aNodeName,
- wxArrayString const& aAliasNameList ) = 0;
-
/**
* Add the given list of components by alias. To be called in the setup
* phase.
*
- * @param aNodeName the parent node the components will appear under
- * @param aDesc the description field of the parent node
- * @param aAliasList list of aliases
+ * @param aNodeName the parent node the components will appear under
+ * @param aDesc the description field of the parent node
+ * @param aCompList list of components
*/
- void AddAliasList(
- wxString const& aNodeName,
- wxString const& aDesc,
- std::vector const& aAliasList );
+ void DoAddLibrary( wxString const& aNodeName, wxString const& aDesc,
+ std::vector const& aCompList );
/**
* Set the search string provided by the user.
@@ -228,12 +197,14 @@ public:
*
* @return Type of the selected node, might be INVALID.
*/
- CMP_TREE_NODE::TYPE GetTypeFor( const wxDataViewItem& aSelection ) const;
+ LIB_TREE_NODE::TYPE GetTypeFor( const wxDataViewItem& aSelection ) const;
+
+ virtual wxString GenerateInfo( LIB_ID const& aLibId, int aUnit ) { return wxEmptyString; };
/**
* Return the number of components loaded in the tree.
*/
- int GetComponentsCount() const;
+ int GetItemCount() const;
/**
* Return the number of libraries loaded in the tree.
@@ -256,9 +227,8 @@ public:
*
* @return number of children
*/
- virtual unsigned int GetChildren(
- wxDataViewItem const& aItem,
- wxDataViewItemArray& aChildren ) const override;
+ unsigned int GetChildren( wxDataViewItem const& aItem,
+ wxDataViewItemArray& aChildren ) const override;
// Freezing/Thawing. Used when updating the table model so that we don't try and fetch
// values during updating. Primarily a problem on OSX which doesn't pay attention to the
@@ -268,16 +238,16 @@ public:
bool IsFrozen() const { return m_freeze; }
protected:
- static wxDataViewItem ToItem( CMP_TREE_NODE const* aNode );
- static CMP_TREE_NODE const* ToNode( wxDataViewItem aItem );
- static unsigned int IntoArray( CMP_TREE_NODE const& aNode, wxDataViewItemArray& aChildren );
+ static wxDataViewItem ToItem( LIB_TREE_NODE const* aNode );
+ static LIB_TREE_NODE const* ToNode( wxDataViewItem aItem );
+ static unsigned int IntoArray( LIB_TREE_NODE const& aNode, wxDataViewItemArray& aChildren );
- CMP_TREE_NODE_ROOT m_tree;
+ LIB_TREE_NODE_ROOT m_tree;
/**
* Constructor
*/
- CMP_TREE_MODEL_ADAPTER_BASE();
+ LIB_TREE_MODEL_ADAPTER();
/**
* Check whether a container has columns too
@@ -316,19 +286,17 @@ protected:
* @param aItem item whose data will be placed into aVariant
* @param aCol column number of the data
*/
- virtual void GetValue(
- wxVariant& aVariant,
- wxDataViewItem const& aItem,
- unsigned int aCol ) const override;
+ virtual void GetValue( wxVariant& aVariant,
+ wxDataViewItem const& aItem,
+ unsigned int aCol ) const override;
/**
* Set the value of an item. Does nothing - this model doesn't support
* editing.
*/
- virtual bool SetValue(
- wxVariant const& aVariant,
- wxDataViewItem const& aItem,
- unsigned int aCol ) override { return false; }
+ virtual bool SetValue( wxVariant const& aVariant,
+ wxDataViewItem const& aItem,
+ unsigned int aCol ) override { return false; }
/**
* Get any formatting for an item.
@@ -338,10 +306,9 @@ protected:
* @param aAttr receiver for attributes
* @return true iff the item has non-default attributes
*/
- virtual bool GetAttr(
- wxDataViewItem const& aItem,
- unsigned int aCol,
- wxDataViewItemAttr& aAttr ) const override;
+ virtual bool GetAttr( wxDataViewItem const& aItem,
+ unsigned int aCol,
+ wxDataViewItemAttr& aAttr ) const override;
private:
CMP_FILTER_TYPE m_filter;
@@ -358,11 +325,6 @@ private:
static WIDTH_CACHE m_width_cache;
- /**
- * Flag to only show the symbol library table load progress dialog the first time.
- */
- static bool m_show_progress;
-
/**
* Compute the width required for the given column of a node and its
* children.
@@ -371,45 +333,32 @@ private:
* @param aCol - column number
* @param aHeading - heading text, to set the minimum width
*/
- int ColWidth( CMP_TREE_NODE& aTree, int aCol, wxString const& aHeading );
-
- /**
- * Return the width required to display a single row's aCol text.
- * This is cached for efficiency as it's very slow on some platforms
- * (*cough* macOS)
- */
- int WidthFor( CMP_TREE_NODE& aNode, int aCol );
-
- /**
- * Return the width required to display a column's heading. This is
- * cached by column number for the same reason as the width per cell.
- */
- int WidthFor( wxString const& aHeading, int aCol );
+ int ColWidth( LIB_TREE_NODE& aTree, int aCol, wxString const& aHeading );
/**
* Find any results worth highlighting and expand them, according to given
* criteria (f(CMP_TREE_NODE const*) -> bool)
* The highest-scoring node is written to aHighScore
*/
- void FindAndExpand( CMP_TREE_NODE& aNode,
- std::function aFunc,
- CMP_TREE_NODE** aHighScore );
+ void FindAndExpand( LIB_TREE_NODE& aNode,
+ std::function aFunc,
+ LIB_TREE_NODE** aHighScore );
/**
* Find and expand successful search results. Return the best match (if any).
*/
- CMP_TREE_NODE* ShowResults();
+ LIB_TREE_NODE* ShowResults();
/**
* Find and expand preselected node. Return the best match (if any).
*/
- CMP_TREE_NODE* ShowPreselect();
+ LIB_TREE_NODE* ShowPreselect();
/**
* Find and expand a library if there is only one. Return the best match (if any).
*/
- CMP_TREE_NODE* ShowSingleLibrary();
+ LIB_TREE_NODE* ShowSingleLibrary();
};
-#endif // _CMP_TREE_MODEL_ADAPTER_BASE_H
+#endif // LIB_TREE_MODEL_ADAPTER_H
diff --git a/eeschema/widgets/component_tree.cpp b/common/widgets/lib_tree.cpp
similarity index 74%
rename from eeschema/widgets/component_tree.cpp
rename to common/widgets/lib_tree.cpp
index e63dcfcd89..0ad6e62dd6 100644
--- a/eeschema/widgets/component_tree.cpp
+++ b/common/widgets/lib_tree.cpp
@@ -22,8 +22,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "component_tree.h"
-#include
+#include "lib_tree.h"
#include
#include
@@ -31,13 +30,13 @@
#include
#include
-#include
+#include
-COMPONENT_TREE::COMPONENT_TREE( wxWindow* aParent, SYMBOL_LIB_TABLE* aSymLibTable,
- CMP_TREE_MODEL_ADAPTER_BASE::PTR& aAdapter, WIDGETS aWidgets, wxHtmlWindow* aDetails )
+LIB_TREE::LIB_TREE( wxWindow* aParent, LIB_TABLE* aLibTable, LIB_TREE_MODEL_ADAPTER::PTR& aAdapter,
+ WIDGETS aWidgets, wxHtmlWindow* aDetails )
: wxPanel( aParent ),
- m_sym_lib_table( aSymLibTable ),
+ m_lib_table( aLibTable ),
m_adapter( aAdapter ),
m_query_ctrl( nullptr ),
m_details_ctrl( nullptr ),
@@ -45,7 +44,7 @@ COMPONENT_TREE::COMPONENT_TREE( wxWindow* aParent, SYMBOL_LIB_TABLE* aSymLibTabl
m_filtering( false )
{
// create space for context menu pointers, INVALID is the max value
- m_menus.resize( CMP_TREE_NODE::TYPE::INVALID + 1 );
+ m_menus.resize( LIB_TREE_NODE::TYPE::INVALID + 1 );
auto sizer = new wxBoxSizer( wxVERTICAL );
@@ -59,17 +58,16 @@ COMPONENT_TREE::COMPONENT_TREE( wxWindow* aParent, SYMBOL_LIB_TABLE* aSymLibTabl
// Additional visual cue for GTK, which hides the placeholder text on focus
#ifdef __WXGTK__
- search_sizer->Add( new wxStaticBitmap( this, wxID_ANY,
- wxArtProvider::GetBitmap( wxART_FIND, wxART_FRAME_ICON ) ),
- 0, wxALIGN_CENTER | wxALL, 5 );
+ auto bitmap = new wxStaticBitmap( this, wxID_ANY, wxArtProvider::GetBitmap( wxART_FIND, wxART_FRAME_ICON ) );
+ search_sizer->Add( bitmap, 0, wxALIGN_CENTER | wxALL, 5 );
#endif
search_sizer->Add( m_query_ctrl, 1, wxLEFT | wxTOP | wxEXPAND, 5 );
sizer->Add( search_sizer, 0, wxEXPAND, 5 );
- m_query_ctrl->Bind( wxEVT_TEXT, &COMPONENT_TREE::onQueryText, this );
- m_query_ctrl->Bind( wxEVT_TEXT_ENTER, &COMPONENT_TREE::onQueryEnter, this );
- m_query_ctrl->Bind( wxEVT_CHAR_HOOK, &COMPONENT_TREE::onQueryCharHook, this );
+ m_query_ctrl->Bind( wxEVT_TEXT, &LIB_TREE::onQueryText, this );
+ m_query_ctrl->Bind( wxEVT_TEXT_ENTER, &LIB_TREE::onQueryEnter, this );
+ m_query_ctrl->Bind( wxEVT_CHAR_HOOK, &LIB_TREE::onQueryCharHook, this );
}
// Component tree
@@ -97,16 +95,16 @@ COMPONENT_TREE::COMPONENT_TREE( wxWindow* aParent, SYMBOL_LIB_TABLE* aSymLibTabl
m_details_ctrl = aDetails;
}
- m_details_ctrl->Bind( wxEVT_HTML_LINK_CLICKED, &COMPONENT_TREE::onDetailsLink, this );
+ m_details_ctrl->Bind( wxEVT_HTML_LINK_CLICKED, &LIB_TREE::onDetailsLink, this );
}
SetSizer( sizer );
- m_tree_ctrl->Bind( wxEVT_DATAVIEW_ITEM_ACTIVATED, &COMPONENT_TREE::onTreeActivate, this );
- m_tree_ctrl->Bind( wxEVT_DATAVIEW_SELECTION_CHANGED, &COMPONENT_TREE::onTreeSelect, this );
- m_tree_ctrl->Bind( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, &COMPONENT_TREE::onContextMenu, this );
+ m_tree_ctrl->Bind( wxEVT_DATAVIEW_ITEM_ACTIVATED, &LIB_TREE::onTreeActivate, this );
+ m_tree_ctrl->Bind( wxEVT_DATAVIEW_SELECTION_CHANGED, &LIB_TREE::onTreeSelect, this );
+ m_tree_ctrl->Bind( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, &LIB_TREE::onContextMenu, this );
- Bind( COMPONENT_PRESELECTED, &COMPONENT_TREE::onPreselect, this );
+ Bind( COMPONENT_PRESELECTED, &LIB_TREE::onPreselect, this );
// If wxTextCtrl::SetHint() is called before binding wxEVT_TEXT, the event
// handler will intermittently fire.
@@ -132,7 +130,7 @@ COMPONENT_TREE::COMPONENT_TREE( wxWindow* aParent, SYMBOL_LIB_TABLE* aSymLibTabl
}
-LIB_ID COMPONENT_TREE::GetSelectedLibId( int* aUnit ) const
+LIB_ID LIB_TREE::GetSelectedLibId( int* aUnit ) const
{
auto sel = m_tree_ctrl->GetSelection();
@@ -150,19 +148,19 @@ LIB_ID COMPONENT_TREE::GetSelectedLibId( int* aUnit ) const
}
-void COMPONENT_TREE::SelectLibId( const LIB_ID& aLibId )
+void LIB_TREE::SelectLibId( const LIB_ID& aLibId )
{
selectIfValid( m_adapter->FindItem( aLibId ) );
}
-void COMPONENT_TREE::Unselect()
+void LIB_TREE::Unselect()
{
m_tree_ctrl->UnselectAll();
}
-void COMPONENT_TREE::Regenerate()
+void LIB_TREE::Regenerate()
{
STATE current;
@@ -181,7 +179,7 @@ void COMPONENT_TREE::Regenerate()
}
-void COMPONENT_TREE::SetFocus()
+void LIB_TREE::SetFocus()
{
if( m_query_ctrl )
m_query_ctrl->SetFocus();
@@ -190,7 +188,7 @@ void COMPONENT_TREE::SetFocus()
}
-void COMPONENT_TREE::toggleExpand( const wxDataViewItem& aTreeId )
+void LIB_TREE::toggleExpand( const wxDataViewItem& aTreeId )
{
if( !aTreeId.IsOk() )
return;
@@ -202,7 +200,7 @@ void COMPONENT_TREE::toggleExpand( const wxDataViewItem& aTreeId )
}
-void COMPONENT_TREE::selectIfValid( const wxDataViewItem& aTreeId )
+void LIB_TREE::selectIfValid( const wxDataViewItem& aTreeId )
{
if( aTreeId.IsOk() )
{
@@ -213,21 +211,21 @@ void COMPONENT_TREE::selectIfValid( const wxDataViewItem& aTreeId )
}
-void COMPONENT_TREE::postPreselectEvent()
+void LIB_TREE::postPreselectEvent()
{
wxCommandEvent event( COMPONENT_PRESELECTED );
wxPostEvent( this, event );
}
-void COMPONENT_TREE::postSelectEvent()
+void LIB_TREE::postSelectEvent()
{
wxCommandEvent event( COMPONENT_SELECTED );
wxPostEvent( this, event );
}
-COMPONENT_TREE::STATE COMPONENT_TREE::getState() const
+LIB_TREE::STATE LIB_TREE::getState() const
{
STATE state;
wxDataViewItemArray items;
@@ -245,7 +243,7 @@ COMPONENT_TREE::STATE COMPONENT_TREE::getState() const
}
-void COMPONENT_TREE::setState( const STATE& aState )
+void LIB_TREE::setState( const STATE& aState )
{
m_tree_ctrl->Freeze();
@@ -261,7 +259,7 @@ void COMPONENT_TREE::setState( const STATE& aState )
}
-void COMPONENT_TREE::onQueryText( wxCommandEvent& aEvent )
+void LIB_TREE::onQueryText( wxCommandEvent& aEvent )
{
Regenerate();
@@ -271,17 +269,17 @@ void COMPONENT_TREE::onQueryText( wxCommandEvent& aEvent )
}
-void COMPONENT_TREE::onQueryEnter( wxCommandEvent& aEvent )
+void LIB_TREE::onQueryEnter( wxCommandEvent& aEvent )
{
if( GetSelectedLibId().IsValid() )
postSelectEvent();
}
-void COMPONENT_TREE::onQueryCharHook( wxKeyEvent& aKeyStroke )
+void LIB_TREE::onQueryCharHook( wxKeyEvent& aKeyStroke )
{
auto const sel = m_tree_ctrl->GetSelection();
- auto type = sel.IsOk() ? m_adapter->GetTypeFor( sel ) : CMP_TREE_NODE::INVALID;
+ auto type = sel.IsOk() ? m_adapter->GetTypeFor( sel ) : LIB_TREE_NODE::INVALID;
switch( aKeyStroke.GetKeyCode() )
{
@@ -294,7 +292,7 @@ void COMPONENT_TREE::onQueryCharHook( wxKeyEvent& aKeyStroke )
break;
case WXK_RETURN:
- if( type == CMP_TREE_NODE::LIB )
+ if( type == LIB_TREE_NODE::LIB )
{
toggleExpand( sel );
break;
@@ -308,13 +306,13 @@ void COMPONENT_TREE::onQueryCharHook( wxKeyEvent& aKeyStroke )
}
-void COMPONENT_TREE::onTreeSelect( wxDataViewEvent& aEvent )
+void LIB_TREE::onTreeSelect( wxDataViewEvent& aEvent )
{
postPreselectEvent();
}
-void COMPONENT_TREE::onTreeActivate( wxDataViewEvent& aEvent )
+void LIB_TREE::onTreeActivate( wxDataViewEvent& aEvent )
{
if( !GetSelectedLibId().IsValid() )
{
@@ -328,14 +326,14 @@ void COMPONENT_TREE::onTreeActivate( wxDataViewEvent& aEvent )
}
-void COMPONENT_TREE::onDetailsLink( wxHtmlLinkEvent& aEvent )
+void LIB_TREE::onDetailsLink( wxHtmlLinkEvent& aEvent )
{
const wxHtmlLinkInfo& info = aEvent.GetLinkInfo();
::wxLaunchDefaultBrowser( info.GetHref() );
}
-void COMPONENT_TREE::onPreselect( wxCommandEvent& aEvent )
+void LIB_TREE::onPreselect( wxCommandEvent& aEvent )
{
if( m_details_ctrl )
{
@@ -343,7 +341,7 @@ void COMPONENT_TREE::onPreselect( wxCommandEvent& aEvent )
LIB_ID id = GetSelectedLibId( &unit );
if( id.IsValid() )
- m_details_ctrl->SetPage( GenerateAliasInfo( m_sym_lib_table, id, unit ) );
+ m_details_ctrl->SetPage( m_adapter->GenerateInfo( id, unit ) );
else
m_details_ctrl->SetPage( wxEmptyString );
}
@@ -352,10 +350,10 @@ void COMPONENT_TREE::onPreselect( wxCommandEvent& aEvent )
}
-void COMPONENT_TREE::onContextMenu( wxDataViewEvent& aEvent )
+void LIB_TREE::onContextMenu( wxDataViewEvent& aEvent )
{
auto const sel = m_tree_ctrl->GetSelection();
- auto type = sel.IsOk() ? m_adapter->GetTypeFor( sel ) : CMP_TREE_NODE::INVALID;
+ auto type = sel.IsOk() ? m_adapter->GetTypeFor( sel ) : LIB_TREE_NODE::INVALID;
if( m_menus[type] )
{
diff --git a/eeschema/widgets/component_tree.h b/common/widgets/lib_tree.h
similarity index 87%
rename from eeschema/widgets/component_tree.h
rename to common/widgets/lib_tree.h
index 7c538db7b3..6a0029f24b 100644
--- a/eeschema/widgets/component_tree.h
+++ b/common/widgets/lib_tree.h
@@ -22,24 +22,24 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#ifndef COMPONENT_TREE_H
-#define COMPONENT_TREE_H
+#ifndef LIB_TREE_H
+#define LIB_TREE_H
#include
-#include
+#include
class wxDataViewCtrl;
class wxTextCtrl;
class wxHtmlWindow;
class wxHtmlLinkEvent;
class LIB_ID;
-class SYMBOL_LIB_TABLE;
+class LIB_TABLE;
/**
* Widget displaying a tree of components with optional search text control and description panel.
*/
-class COMPONENT_TREE : public wxPanel
+class LIB_TREE : public wxPanel
{
public:
///> Flags to select extra widgets
@@ -49,15 +49,14 @@ public:
* Construct a component tree.
*
* @param aParent parent window containing this tree widget
- * @param aSymLibTable table containing symbols to display
- * @param aAdapter a CMP_TREE_MODEL_ADAPTER instance to use
+ * @param aLibTable table containing libraries and items to display
+ * @param aAdapter a LIB_TREE_MODEL_ADAPTER instance to use
* @param aWidgets selection of sub-widgets to include
- * @param aDetails if not null, a custom wxHtmlWindow to hold symbol details. If null this will
- * be created inside the COMPONENT_TREE.
+ * @param aDetails if not null, a custom wxHtmlWindow to hold symbol details. If null this
+ * will be created inside the LIB_TREE.
*/
- COMPONENT_TREE( wxWindow* aParent, SYMBOL_LIB_TABLE* aSymLibTable,
- CMP_TREE_MODEL_ADAPTER_BASE::PTR& aAdapter, WIDGETS aWidgets = ALL,
- wxHtmlWindow *aDetails = nullptr );
+ LIB_TREE( wxWindow* aParent, LIB_TABLE* aLibTable, LIB_TREE_MODEL_ADAPTER::PTR& aAdapter,
+ WIDGETS aWidgets = ALL, wxHtmlWindow *aDetails = nullptr );
/**
* For multi-unit components, if the user selects the component itself
@@ -87,7 +86,7 @@ public:
* @param aType is the node type to have a menu associated.
* @param aMenu is the associated menu.
*/
- void SetMenu( CMP_TREE_NODE::TYPE aType, std::unique_ptr aMenu )
+ void SetMenu( LIB_TREE_NODE::TYPE aType, std::unique_ptr aMenu )
{
m_menus[aType] = std::move( aMenu );
}
@@ -163,8 +162,8 @@ protected:
void onPreselect( wxCommandEvent& aEvent );
void onContextMenu( wxDataViewEvent& aEvent );
- SYMBOL_LIB_TABLE* m_sym_lib_table;
- CMP_TREE_MODEL_ADAPTER_BASE::PTR m_adapter;
+ LIB_TABLE* m_lib_table;
+ LIB_TREE_MODEL_ADAPTER::PTR m_adapter;
wxTextCtrl* m_query_ctrl;
wxDataViewCtrl* m_tree_ctrl;
@@ -189,4 +188,4 @@ wxDECLARE_EVENT( COMPONENT_PRESELECTED, wxCommandEvent );
///> Custom event sent when a component is selected
wxDECLARE_EVENT( COMPONENT_SELECTED, wxCommandEvent );
-#endif /* COMPONENT_TREE_H */
+#endif /* LIB_TREE_H */
diff --git a/cvpcb/cvpcb_mainframe.cpp b/cvpcb/cvpcb_mainframe.cpp
index a517009eb7..3c1bb94b3f 100644
--- a/cvpcb/cvpcb_mainframe.cpp
+++ b/cvpcb/cvpcb_mainframe.cpp
@@ -753,7 +753,7 @@ void CVPCB_MAINFRAME::DisplayStatus()
if( module ) // can be NULL if no netlist loaded
{
msg = wxString::Format( _( "Description: %s; Key words: %s" ),
- module->GetDoc(),
+ module->GetDescription(),
module->GetKeywords() );
}
diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt
index 87177f7b30..69eb0be642 100644
--- a/eeschema/CMakeLists.txt
+++ b/eeschema/CMakeLists.txt
@@ -87,10 +87,9 @@ set( EESCHEMA_DLGS
)
set( EESCHEMA_WIDGETS
- widgets/cmp_tree_pane.cpp
- widgets/component_tree.cpp
widgets/pin_shape_combobox.cpp
widgets/pin_type_combobox.cpp
+ widgets/symbol_tree_pane.cpp
widgets/widget_eeschema_color_config.cpp
)
@@ -109,9 +108,6 @@ set( EESCHEMA_SRCS
class_library.cpp
cmp_library_keywords.cpp
cmp_library_lexer.cpp
- cmp_tree_model.cpp
- cmp_tree_model_adapter.cpp
- cmp_tree_model_adapter_base.cpp
component_references_lister.cpp
controle.cpp
cross-probing.cpp
@@ -140,7 +136,6 @@ set( EESCHEMA_SRCS
lib_export.cpp
lib_field.cpp
lib_manager.cpp
- lib_manager_adapter.cpp
lib_pin.cpp
lib_polyline.cpp
lib_rectangle.cpp
@@ -201,6 +196,8 @@ set( EESCHEMA_SRCS
symbdraw.cpp
symbedit.cpp
symbol_lib_table.cpp
+ symbol_tree_model_adapter.cpp
+ symbol_tree_synchronizing_adapter.cpp
template_fieldnames.cpp
template_fieldnames_keywords.cpp
tool_lib.cpp
diff --git a/eeschema/class_libentry.cpp b/eeschema/class_libentry.cpp
index ec0c97bb3b..b9176cc890 100644
--- a/eeschema/class_libentry.cpp
+++ b/eeschema/class_libentry.cpp
@@ -62,7 +62,7 @@ int LIB_PART::m_subpartIdSeparator = 0;
int LIB_PART::m_subpartFirstId = 'A';
-LIB_ALIAS::LIB_ALIAS( const wxString& aName, LIB_PART* aRootPart ):
+LIB_ALIAS::LIB_ALIAS( const wxString& aName, LIB_PART* aRootPart ) :
EDA_ITEM( LIB_ALIAS_T ),
shared( aRootPart )
{
@@ -111,6 +111,14 @@ bool LIB_ALIAS::IsRoot() const
}
+LIB_ID LIB_ALIAS::GetLibId() const
+{
+ LIB_ID id = shared->GetLibId();
+ id.SetLibItemName( name );
+ return id;
+}
+
+
PART_LIB* LIB_ALIAS::GetLib()
{
return shared->GetLib();
@@ -123,6 +131,34 @@ void LIB_ALIAS::SetName( const wxString& aName )
}
+int LIB_ALIAS::GetUnitCount()
+{
+ return shared->GetUnitCount();
+}
+
+
+wxString LIB_ALIAS::GetUnitReference( int aUnit )
+{
+ return LIB_PART::SubReference( aUnit, false );
+}
+
+
+wxString LIB_ALIAS::GetSearchText()
+{
+ wxString text = GetKeyWords() + wxT( " " ) + GetDescription();
+
+ // If a footprint is defined for the part, add it to the serach string
+ if( shared )
+ {
+ wxString footprint = shared->GetFootprintField().GetText();
+
+ if( !footprint.IsEmpty() )
+ text += wxT( " " ) + footprint;
+ }
+
+ return text;
+}
+
bool LIB_ALIAS::operator==( const wxChar* aName ) const
{
@@ -136,12 +172,6 @@ bool operator<( const LIB_ALIAS& aItem1, const LIB_ALIAS& aItem2 )
}
-int LibraryEntryCompare( const LIB_ALIAS* aItem1, const LIB_ALIAS* aItem2 )
-{
- return aItem1->GetName().Cmp( aItem2->GetName() );
-}
-
-
/// http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/sp_techniques.html#weak_without_shared
struct null_deleter
{
diff --git a/eeschema/class_libentry.h b/eeschema/class_libentry.h
index bff3e545e2..bb25fa75fd 100644
--- a/eeschema/class_libentry.h
+++ b/eeschema/class_libentry.h
@@ -31,7 +31,7 @@
#define CLASS_LIBENTRY_H
#include
-#include
+#include
#include
#include
#include
@@ -70,7 +70,7 @@ enum LIBRENTRYOPTIONS
* method to create parts that have the same physical layout with different names
* such as 74LS00, 74HC00 ... and many op amps.
*/
-class LIB_ALIAS : public EDA_ITEM
+class LIB_ALIAS : public EDA_ITEM, public LIB_TREE_ITEM
{
/**
* Actual LIB_PART referenced by [multiple] aliases.
@@ -111,23 +111,22 @@ public:
const wxString GetLibraryName();
- bool IsRoot() const;
+ bool IsRoot() const override;
+
+ LIB_ID GetLibId() const override;
PART_LIB* GetLib();
- const wxString& GetName() const { return name; }
+ const wxString& GetName() const override { return name; }
void SetName( const wxString& aName );
- ///> Helper function to replace illegal chars in symbol names
- static void ValidateName( wxString& aName );
-
void SetDescription( const wxString& aDescription )
{
description = aDescription;
}
- wxString GetDescription() const { return description; }
+ wxString GetDescription() override { return description; }
void SetKeyWords( const wxString& aKeyWords )
{
@@ -143,6 +142,12 @@ public:
wxString GetDocFileName() const { return docFileName; }
+ wxString GetSearchText() override;
+
+ int GetUnitCount() override;
+
+ wxString GetUnitReference( int aUnit ) override;
+
/**
* KEEPCASE sensitive comparison of the part entry name.
*/
@@ -161,8 +166,6 @@ public:
extern bool operator<( const LIB_ALIAS& aItem1, const LIB_ALIAS& aItem2 );
-extern int LibraryEntryCompare( const LIB_ALIAS* aItem1, const LIB_ALIAS* aItem2 );
-
struct PART_DRAW_OPTIONS
{
diff --git a/eeschema/cmp_tree_model_adapter.cpp b/eeschema/cmp_tree_model_adapter.cpp
deleted file mode 100644
index 7982afdb24..0000000000
--- a/eeschema/cmp_tree_model_adapter.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * This program source code file is part of KiCad, a free EDA CAD application.
- *
- * Copyright (C) 2017 Chris Pavlina
- * Copyright (C) 2014 Henner Zeller
- * Copyright (C) 2014-2017 KiCad Developers, see AUTHORS.txt for contributors.
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-#include
-
-#include
-#include
-#include
-#include
-
-CMP_TREE_MODEL_ADAPTER_BASE::PTR CMP_TREE_MODEL_ADAPTER::Create( SYMBOL_LIB_TABLE* aLibs )
-{
- auto adapter = new CMP_TREE_MODEL_ADAPTER( aLibs );
- auto container = CMP_TREE_MODEL_ADAPTER::PTR( adapter );
- return container;
-}
-
-
-CMP_TREE_MODEL_ADAPTER::CMP_TREE_MODEL_ADAPTER( SYMBOL_LIB_TABLE* aLibs )
- : m_libs( aLibs )
-{}
-
-
-CMP_TREE_MODEL_ADAPTER::~CMP_TREE_MODEL_ADAPTER()
-{}
-
-
-void CMP_TREE_MODEL_ADAPTER::AddLibrary( wxString const& aLibNickname )
-{
- bool onlyPowerSymbols = ( GetFilter() == CMP_FILTER_POWER );
-
- std::vector alias_list;
-
- try
- {
- m_libs->LoadSymbolLib( alias_list, aLibNickname, onlyPowerSymbols );
- }
- catch( const IO_ERROR& ioe )
- {
- wxLogError( wxString::Format( _( "Error occurred loading symbol library %s."
- "\n\n%s" ), aLibNickname, ioe.What() ) );
- return;
- }
-
- if( alias_list.size() > 0 )
- {
- AddAliasList( aLibNickname, m_libs->GetDescription( aLibNickname ), alias_list );
- m_tree.AssignIntrinsicRanks();
- }
-}
-
-
-void CMP_TREE_MODEL_ADAPTER::AddAliasList(
- wxString const& aNodeName,
- wxArrayString const& aAliasNameList )
-{
- std::vector alias_list;
-
- for( const wxString& name: aAliasNameList )
- {
- LIB_ALIAS* a = nullptr;
-
- try
- {
- a = m_libs->LoadSymbol( aNodeName, name );
- }
- catch( const IO_ERROR& ioe )
- {
- wxLogError( wxString::Format( _( "Error occurred loading symbol %s from library %s."
- "\n\n%s" ), name, aNodeName, ioe.What() ) );
- continue;
- }
-
- if( a )
- alias_list.push_back( a );
- }
-
- if( alias_list.size() > 0 )
- AddAliasList( aNodeName, m_libs->GetDescription( aNodeName ), alias_list );
-}
diff --git a/eeschema/dialogs/dialog_choose_component.cpp b/eeschema/dialogs/dialog_choose_component.cpp
index 5db8045ca1..6eab8c038f 100644
--- a/eeschema/dialogs/dialog_choose_component.cpp
+++ b/eeschema/dialogs/dialog_choose_component.cpp
@@ -40,7 +40,7 @@
#include
#include
#include
-#include
+#include
#include
#include
@@ -53,14 +53,16 @@ std::mutex DIALOG_CHOOSE_COMPONENT::g_Mutex;
DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const wxString& aTitle,
- CMP_TREE_MODEL_ADAPTER::PTR& aAdapter, int aDeMorganConvert, bool aAllowFieldEdits,
- bool aShowFootprints )
+ SYMBOL_TREE_MODEL_ADAPTER::PTR& aAdapter,
+ int aDeMorganConvert, bool aAllowFieldEdits,
+ bool aShowFootprints, bool aAllowBrowser )
: DIALOG_SHIM( aParent, wxID_ANY, aTitle, wxDefaultPosition, wxDefaultSize,
- wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ),
+ wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ),
+ m_browser_button( nullptr ),
m_hsplitter( nullptr ),
m_vsplitter( nullptr ),
m_fp_sel_ctrl( nullptr ),
- m_fp_view_ctrl( nullptr ),
+ m_fp_preview( nullptr ),
m_parent( aParent ),
m_deMorganConvert( aDeMorganConvert >= 0 ? aDeMorganConvert : 0 ),
m_allow_field_edits( aAllowFieldEdits ),
@@ -110,33 +112,43 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const
sizer->Add( m_vsplitter, 1, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, 5 );
}
- m_tree = new COMPONENT_TREE( m_hsplitter, Prj().SchSymbolLibTable(), aAdapter,
- COMPONENT_TREE::WIDGETS::ALL, details );
-
- m_symbol_view_panel = ConstructRightPanel( m_hsplitter );
+ m_tree = new LIB_TREE( m_hsplitter, Prj().SchSymbolLibTable(), aAdapter,
+ LIB_TREE::WIDGETS::ALL, details );
m_hsplitter->SetSashGravity( 0.8 );
m_hsplitter->SetMinimumPaneSize( 20 );
- m_hsplitter->SplitVertically( m_tree, m_symbol_view_panel );
+ m_hsplitter->SplitVertically( m_tree, ConstructRightPanel( m_hsplitter ) );
m_dbl_click_timer = new wxTimer( this );
- auto buttons = new wxStdDialogButtonSizer();
- buttons->AddButton( new wxButton( this, wxID_OK ) );
- buttons->AddButton( new wxButton( this, wxID_CANCEL ) );
- buttons->Realize();
+ auto buttonsSizer = new wxBoxSizer( wxHORIZONTAL );
- sizer->Add( buttons, 0, wxEXPAND | wxALL, 5 );
+ if( aAllowBrowser )
+ {
+ m_browser_button = new wxButton( this, wxID_ANY, _( "Select with Browser" ) );
+ buttonsSizer->Add( m_browser_button, 0, wxALL | wxALIGN_CENTER_VERTICAL, 10 );
+ }
+
+ auto sdbSizer = new wxStdDialogButtonSizer();
+ auto okButton = new wxButton( this, wxID_OK );
+ auto cancelButton = new wxButton( this, wxID_CANCEL );
+ sdbSizer->AddButton( okButton );
+ sdbSizer->AddButton( cancelButton );
+ sdbSizer->Realize();
+
+ buttonsSizer->Add( sdbSizer, 1, wxALL, 5 );
+
+ sizer->Add( buttonsSizer, 0, wxEXPAND | wxLEFT, 5 );
SetSizer( sizer );
Bind( wxEVT_INIT_DIALOG, &DIALOG_CHOOSE_COMPONENT::OnInitDialog, this );
- Bind( wxEVT_ACTIVATE, &DIALOG_CHOOSE_COMPONENT::OnActivate, this );
Bind( wxEVT_TIMER, &DIALOG_CHOOSE_COMPONENT::OnCloseTimer, this, m_dbl_click_timer->GetId() );
Bind( COMPONENT_PRESELECTED, &DIALOG_CHOOSE_COMPONENT::OnComponentPreselected, this );
Bind( COMPONENT_SELECTED, &DIALOG_CHOOSE_COMPONENT::OnComponentSelected, this );
+ m_symbol_preview->Bind( wxEVT_PAINT, &DIALOG_CHOOSE_COMPONENT::OnSymbolPreviewPaint, this );
- m_sch_view_ctrl->Bind( wxEVT_LEFT_DCLICK, &DIALOG_CHOOSE_COMPONENT::OnSchViewDClick, this );
- m_sch_view_ctrl->Bind( wxEVT_PAINT, &DIALOG_CHOOSE_COMPONENT::OnSchViewPaint, this );
+ if( m_browser_button )
+ m_browser_button->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_CHOOSE_COMPONENT::OnUseBrowser, this );
if( m_fp_sel_ctrl )
m_fp_sel_ctrl->Bind( EVT_FOOTPRINT_SELECTED, &DIALOG_CHOOSE_COMPONENT::OnFootprintSelected, this );
@@ -154,19 +166,22 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const
SetSizeInDU( 360, 280 );
else
SetSize( m_last_dlg_size );
+
+ SetInitialFocus( m_tree );
+ okButton->SetDefault();
}
DIALOG_CHOOSE_COMPONENT::~DIALOG_CHOOSE_COMPONENT()
{
Unbind( wxEVT_INIT_DIALOG, &DIALOG_CHOOSE_COMPONENT::OnInitDialog, this );
- Unbind( wxEVT_ACTIVATE, &DIALOG_CHOOSE_COMPONENT::OnActivate, this );
Unbind( wxEVT_TIMER, &DIALOG_CHOOSE_COMPONENT::OnCloseTimer, this );
Unbind( COMPONENT_PRESELECTED, &DIALOG_CHOOSE_COMPONENT::OnComponentPreselected, this );
Unbind( COMPONENT_SELECTED, &DIALOG_CHOOSE_COMPONENT::OnComponentSelected, this );
+ m_symbol_preview->Unbind( wxEVT_PAINT, &DIALOG_CHOOSE_COMPONENT::OnSymbolPreviewPaint, this );
- m_sch_view_ctrl->Unbind( wxEVT_LEFT_DCLICK, &DIALOG_CHOOSE_COMPONENT::OnSchViewDClick, this );
- m_sch_view_ctrl->Unbind( wxEVT_PAINT, &DIALOG_CHOOSE_COMPONENT::OnSchViewPaint, this );
+ if( m_browser_button )
+ m_browser_button->Unbind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_CHOOSE_COMPONENT::OnUseBrowser, this );
if( m_fp_sel_ctrl )
m_fp_sel_ctrl->Unbind( EVT_FOOTPRINT_SELECTED, &DIALOG_CHOOSE_COMPONENT::OnFootprintSelected, this );
@@ -189,9 +204,9 @@ wxPanel* DIALOG_CHOOSE_COMPONENT::ConstructRightPanel( wxWindow* aParent )
auto panel = new wxPanel( aParent );
auto sizer = new wxBoxSizer( wxVERTICAL );
- m_sch_view_ctrl = new wxPanel( panel, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ),
+ m_symbol_preview = new wxPanel( panel, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ),
wxFULL_REPAINT_ON_RESIZE | wxTAB_TRAVERSAL | wxRAISED_BORDER );
- m_sch_view_ctrl->SetLayoutDirection( wxLayout_LeftToRight );
+ m_symbol_preview->SetLayoutDirection( wxLayout_LeftToRight );
if( m_show_footprints )
{
@@ -200,19 +215,19 @@ wxPanel* DIALOG_CHOOSE_COMPONENT::ConstructRightPanel( wxWindow* aParent )
if( m_allow_field_edits )
m_fp_sel_ctrl = new FOOTPRINT_SELECT_WIDGET( panel, fp_list, true );
- m_fp_view_ctrl = new FOOTPRINT_PREVIEW_WIDGET( panel, Kiway() );
+ m_fp_preview = new FOOTPRINT_PREVIEW_WIDGET( panel, Kiway() );
- sizer->Add( m_sch_view_ctrl, 1, wxEXPAND | wxTOP | wxBOTTOM | wxRIGHT, 5 );
+ sizer->Add( m_symbol_preview, 1, wxEXPAND | wxTOP | wxBOTTOM | wxRIGHT, 5 );
if( m_fp_sel_ctrl )
sizer->Add( m_fp_sel_ctrl, 0, wxEXPAND | wxTOP | wxRIGHT, 5 );
- sizer->Add( m_fp_view_ctrl, 1, wxEXPAND | wxBOTTOM | wxRIGHT, 5 );
+ sizer->Add( m_fp_preview, 1, wxEXPAND | wxBOTTOM | wxRIGHT, 5 );
}
else
{
- sizer->Add( m_sch_view_ctrl, 1, wxEXPAND | wxTOP | wxRIGHT, 5 );
+ sizer->Add( m_symbol_preview, 1, wxEXPAND | wxTOP | wxRIGHT, 5 );
}
panel->SetSizer( sizer );
@@ -225,10 +240,10 @@ wxPanel* DIALOG_CHOOSE_COMPONENT::ConstructRightPanel( wxWindow* aParent )
void DIALOG_CHOOSE_COMPONENT::OnInitDialog( wxInitDialogEvent& aEvent )
{
- if( m_fp_view_ctrl && m_fp_view_ctrl->IsInitialized() )
+ if( m_fp_preview && m_fp_preview->IsInitialized() )
{
// This hides the GAL panel and shows the status label
- m_fp_view_ctrl->SetStatusText( wxEmptyString );
+ m_fp_preview->SetStatusText( wxEmptyString );
}
if( m_fp_sel_ctrl )
@@ -236,20 +251,19 @@ void DIALOG_CHOOSE_COMPONENT::OnInitDialog( wxInitDialogEvent& aEvent )
}
-void DIALOG_CHOOSE_COMPONENT::OnActivate( wxActivateEvent& event )
-{
- m_tree->SetFocus();
-
- event.Skip(); // required under wxMAC
-}
-
-
LIB_ID DIALOG_CHOOSE_COMPONENT::GetSelectedLibId( int* aUnit ) const
{
return m_tree->GetSelectedLibId( aUnit );
}
+void DIALOG_CHOOSE_COMPONENT::OnUseBrowser( wxCommandEvent& aEvent )
+{
+ m_external_browser_requested = true;
+ EndQuasiModal( wxID_OK );
+}
+
+
void DIALOG_CHOOSE_COMPONENT::OnCloseTimer( wxTimerEvent& aEvent )
{
// Hack handler because of eaten MouseUp event. See
@@ -271,16 +285,9 @@ void DIALOG_CHOOSE_COMPONENT::OnCloseTimer( wxTimerEvent& aEvent )
}
-void DIALOG_CHOOSE_COMPONENT::OnSchViewDClick( wxMouseEvent& aEvent )
-{
- m_external_browser_requested = true;
- EndQuasiModal( wxID_OK );
-}
-
-
void DIALOG_CHOOSE_COMPONENT::ShowFootprintFor( LIB_ID const& aLibId )
{
- if( !m_fp_view_ctrl || !m_fp_view_ctrl->IsInitialized() )
+ if( !m_fp_preview || !m_fp_preview->IsInitialized() )
return;
LIB_ALIAS* alias = nullptr;
@@ -298,10 +305,8 @@ void DIALOG_CHOOSE_COMPONENT::ShowFootprintFor( LIB_ID const& aLibId )
ioe.What() ) );
}
- if( alias == nullptr )
- {
+ if( !alias )
return;
- }
LIB_FIELD* fp_field = alias->GetPart()->GetField( FOOTPRINT );
wxString fp_name = fp_field ? fp_field->GetFullText() : wxString( "" );
@@ -312,14 +317,12 @@ void DIALOG_CHOOSE_COMPONENT::ShowFootprintFor( LIB_ID const& aLibId )
void DIALOG_CHOOSE_COMPONENT::ShowFootprint( wxString const& aName )
{
- if( !m_fp_view_ctrl || !m_fp_view_ctrl->IsInitialized() )
- {
+ if( !m_fp_preview || !m_fp_preview->IsInitialized() )
return;
- }
if( aName == wxEmptyString )
{
- m_fp_view_ctrl->SetStatusText( _( "No footprint specified" ) );
+ m_fp_preview->SetStatusText( _( "No footprint specified" ) );
}
else
{
@@ -327,13 +330,13 @@ void DIALOG_CHOOSE_COMPONENT::ShowFootprint( wxString const& aName )
if( lib_id.Parse( aName, LIB_ID::ID_PCB ) == -1 && lib_id.IsValid() )
{
- m_fp_view_ctrl->ClearStatus();
- m_fp_view_ctrl->CacheFootprint( lib_id );
- m_fp_view_ctrl->DisplayFootprint( lib_id );
+ m_fp_preview->ClearStatus();
+ m_fp_preview->CacheFootprint( lib_id );
+ m_fp_preview->DisplayFootprint( lib_id );
}
else
{
- m_fp_view_ctrl->SetStatusText( _( "Invalid footprint specified" ) );
+ m_fp_preview->SetStatusText( _( "Invalid footprint specified" ) );
}
}
}
@@ -386,7 +389,7 @@ void DIALOG_CHOOSE_COMPONENT::PopulateFootprintSelector( LIB_ID const& aLibId )
}
-void DIALOG_CHOOSE_COMPONENT::OnSchViewPaint( wxPaintEvent& aEvent )
+void DIALOG_CHOOSE_COMPONENT::OnSymbolPreviewPaint( wxPaintEvent& aEvent )
{
int unit = 0;
LIB_ID id = m_tree->GetSelectedLibId( &unit );
@@ -413,18 +416,13 @@ void DIALOG_CHOOSE_COMPONENT::OnSchViewPaint( wxPaintEvent& aEvent )
ioe.What() ) );
}
- if( alias == nullptr )
+ if( !alias )
return;
- LIB_PART* part = alias ? alias->GetPart() : nullptr;
+ LIB_PART* part = alias->GetPart();
- // Don't draw if we don't have a part to show
- // just display a tooltip
if( !part )
- {
- RenderPreview( nullptr, unit );
return;
- }
if( alias->IsRoot() )
{
@@ -465,7 +463,7 @@ void DIALOG_CHOOSE_COMPONENT::OnComponentPreselected( wxCommandEvent& aEvent )
LIB_ID id = m_tree->GetSelectedLibId( &unit );
- m_sch_view_ctrl->Refresh();
+ m_symbol_preview->Refresh();
if( id.IsValid() )
{
@@ -474,8 +472,8 @@ void DIALOG_CHOOSE_COMPONENT::OnComponentPreselected( wxCommandEvent& aEvent )
}
else
{
- if( m_fp_view_ctrl && m_fp_view_ctrl->IsInitialized() )
- m_fp_view_ctrl->SetStatusText( wxEmptyString );
+ if( m_fp_preview && m_fp_preview->IsInitialized() )
+ m_fp_preview->SetStatusText( wxEmptyString );
PopulateFootprintSelector( id );
}
@@ -505,7 +503,7 @@ void DIALOG_CHOOSE_COMPONENT::OnComponentSelected( wxCommandEvent& aEvent )
void DIALOG_CHOOSE_COMPONENT::RenderPreview( LIB_PART* aComponent, int aUnit )
{
- wxPaintDC dc( m_sch_view_ctrl );
+ wxPaintDC dc( m_symbol_preview );
const wxSize dc_size = dc.GetSize();
@@ -513,12 +511,8 @@ void DIALOG_CHOOSE_COMPONENT::RenderPreview( LIB_PART* aComponent, int aUnit )
if( dc_size.x == 0 || dc_size.y == 0 )
return;
- if( !aComponent ) // display a tooltip
- {
- wxString tooltip = _( "Double-click here to select a symbol from the library browser" );
- GRDrawWrappedText( dc, tooltip );
+ if( !aComponent )
return;
- }
GRResetPenAndBrush( &dc );
diff --git a/eeschema/dialogs/dialog_choose_component.h b/eeschema/dialogs/dialog_choose_component.h
index 1003b5751e..e24a6db2f7 100644
--- a/eeschema/dialogs/dialog_choose_component.h
+++ b/eeschema/dialogs/dialog_choose_component.h
@@ -25,7 +25,7 @@
#define DIALOG_CHOOSE_COMPONENT_H
#include "dialog_shim.h"
-#include
+#include
#include
class wxStaticBitmap;
@@ -39,7 +39,7 @@ class wxChoice;
class wxButton;
class wxTimer;
-class COMPONENT_TREE;
+class LIB_TREE;
class FOOTPRINT_PREVIEW_WIDGET;
class FOOTPRINT_SELECT_WIDGET;
class LIB_ALIAS;
@@ -52,14 +52,14 @@ class SCH_BASE_FRAME;
* View class in a Model-View-Adapter (mediated MVC) architecture. The other
* pieces are in:
*
- * - Adapter: CMP_TREE_MODEL_ADAPTER in eeschema/cmp_tree_model_adapter.h
- * - Model: CMP_TREE_NODE and descendants in eeschema/cmp_tree_model.h
+ * - Adapter: CMP_TREE_MODEL_ADAPTER in common/cmp_tree_model_adapter.h
+ * - Model: CMP_TREE_NODE and descendants in common/cmp_tree_model.h
*
* Because everything is tied together in the adapter class, see that file
* for thorough documentation. A simple example usage follows:
*
* // Create the adapter class
- * auto adapter( CMP_TREE_MODEL_ADAPTER::Create( Prj().SchSymbolLibTable() ) );
+ * auto adapter( SYMBOL_TREE_MODEL_ADAPTER::Create( Prj().SchSymbolLibTable() ) );
*
* // Perform any configuration of adapter properties here
* adapter->SetPreselectNode( "LIB_NICKNAME", "SYMBO_NAME", 2 );
@@ -93,18 +93,19 @@ public:
*
* @param aParent a SCH_BASE_FRAME parent window.
* @param aTitle Dialog title.
- * @param aAdapter CMP_TREE_MODEL_ADAPTER::PTR. See CMP_TREE_MODEL_ADAPTER
+ * @param aAdapter SYMBOL_TREE_MODEL_ADAPTER::PTR. See CMP_TREE_MODEL_ADAPTER
* for documentation.
* @param aDeMorganConvert preferred deMorgan conversion
* (TODO: should happen in dialog)
- * @param aAllowFieldEdits if false, all functions that allow the user to edit
- * fields (currently just footprint selection) will not be available.
- * @param aShowFootprints if false, all footprint preview and selection features
- * are disabled. This forces aAllowFieldEdits false too.
+ * @param aAllowFieldEdits if false, all functions that allow the user to edit fields
+ * (currently just footprint selection) will not be available.
+ * @param aShowFootprints if false, all footprint preview and selection features are
+ * disabled. This forces aAllowFieldEdits false too.
+ * @param aAllowBrowser show a Select with Browser button
*/
DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const wxString& aTitle,
- CMP_TREE_MODEL_ADAPTER::PTR& aAdapter, int aDeMorganConvert, bool aAllowFieldEdits,
- bool aShowFootprints );
+ SYMBOL_TREE_MODEL_ADAPTER::PTR& aAdapter, int aDeMorganConvert,
+ bool aAllowFieldEdits, bool aShowFootprints, bool aAllowBrowser );
~DIALOG_CHOOSE_COMPONENT();
@@ -148,14 +149,12 @@ protected:
wxPanel* ConstructRightPanel( wxWindow* aParent );
void OnInitDialog( wxInitDialogEvent& aEvent );
- void OnActivate( wxActivateEvent& event );
void OnCloseTimer( wxTimerEvent& aEvent );
+ void OnUseBrowser( wxCommandEvent& aEvent );
- void OnSchViewDClick( wxMouseEvent& aEvent );
- void OnSchViewPaint( wxPaintEvent& aEvent );
+ void OnSymbolPreviewPaint( wxPaintEvent& aEvent );
void OnFootprintSelected( wxCommandEvent& aEvent );
-
void OnComponentPreselected( wxCommandEvent& aEvent );
/**
@@ -189,33 +188,30 @@ protected:
*/
void RenderPreview( LIB_PART* aComponent, int aUnit );
- wxTimer* m_dbl_click_timer;
- wxPanel* m_sch_view_ctrl;
- // the wxSplitterWindow that manages the symbol tree and symbol canvas viewer
- wxSplitterWindow* m_hsplitter;
- wxSplitterWindow* m_vsplitter;
- // the symbol canvas viewer
- wxPanel* m_symbol_view_panel;
- // the sash position separation between symbol tree and symbol canvas viewer
- // (remember the sash position during a session)
- static int m_h_sash_pos;
- static int m_v_sash_pos;
+ wxTimer* m_dbl_click_timer;
+ wxPanel* m_symbol_preview;
+ wxButton* m_browser_button;
+ wxSplitterWindow* m_hsplitter;
+ wxSplitterWindow* m_vsplitter;
FOOTPRINT_SELECT_WIDGET* m_fp_sel_ctrl;
- FOOTPRINT_PREVIEW_WIDGET* m_fp_view_ctrl;
- COMPONENT_TREE* m_tree;
+ FOOTPRINT_PREVIEW_WIDGET* m_fp_preview;
+ LIB_TREE* m_tree;
- SCH_BASE_FRAME* m_parent;
- int m_deMorganConvert;
- bool m_allow_field_edits;
- bool m_show_footprints;
- bool m_external_browser_requested;
- wxString m_fp_override;
+ static int m_h_sash_pos; // remember sash positions during a session
+ static int m_v_sash_pos;
+
+ SCH_BASE_FRAME* m_parent;
+ int m_deMorganConvert;
+ bool m_allow_field_edits;
+ bool m_show_footprints;
+ bool m_external_browser_requested;
+ wxString m_fp_override;
std::vector> m_field_edits;
// Remember the dialog size during a session
- static wxSize m_last_dlg_size;
+ static wxSize m_last_dlg_size;
};
#endif /* DIALOG_CHOOSE_COMPONENT_H */
diff --git a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp
index d2653ee087..9505824b11 100644
--- a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp
+++ b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp
@@ -303,7 +303,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnBrowseLibrary( wxCommandEvent& event
LIB_ID id;
id.Parse( m_libraryNameTextCtrl->GetValue(), LIB_ID::ID_SCH );
- auto sel = GetParent()->SelectComponentFromLibrary( nullptr, dummy, true, 0, 0, false, &id );
+ auto sel = GetParent()->SelectComponentFromLibTree( nullptr, dummy, true, 0, 0, false, &id );
if( !sel.LibId.IsValid() )
return;
diff --git a/eeschema/generate_alias_info.cpp b/eeschema/generate_alias_info.cpp
index 37dc5db166..c5026d71e0 100644
--- a/eeschema/generate_alias_info.cpp
+++ b/eeschema/generate_alias_info.cpp
@@ -45,20 +45,20 @@ static const wxString FieldFormat =
static const wxString DatasheetLinkFormat = "__TEXT__";
-class ALIAS_INFO_GENERATOR
+class FOOTPRINT_INFO_GENERATOR
{
wxString m_html;
SYMBOL_LIB_TABLE* m_sym_lib_table;
LIB_ID const m_lib_id;
- LIB_ALIAS* m_alias;
+ LIB_ALIAS* m_module;
int m_unit;
public:
- ALIAS_INFO_GENERATOR( SYMBOL_LIB_TABLE* aSymbolLibTable, LIB_ID const& aLibId, int aUnit )
+ FOOTPRINT_INFO_GENERATOR( SYMBOL_LIB_TABLE* aSymbolLibTable, LIB_ID const& aLibId, int aUnit )
: m_html( DescriptionFormat ),
m_sym_lib_table( aSymbolLibTable ),
m_lib_id( aLibId ),
- m_alias( nullptr ),
+ m_module( nullptr ),
m_unit( aUnit )
{ }
@@ -74,7 +74,7 @@ public:
try
{
- m_alias = const_cast< LIB_ALIAS* >( m_sym_lib_table->LoadSymbol( m_lib_id ) );
+ m_module = const_cast< LIB_ALIAS* >( m_sym_lib_table->LoadSymbol( m_lib_id ) );
}
catch( const IO_ERROR& ioe )
{
@@ -86,7 +86,7 @@ public:
return;
}
- if( m_alias )
+ if( m_module )
{
SetHtmlName();
SetHtmlAliasOf();
@@ -107,13 +107,13 @@ public:
protected:
void SetHtmlName()
{
- m_html.Replace( "__NAME__", EscapedHTML( m_alias->GetName() ) );
+ m_html.Replace( "__NAME__", EscapedHTML( m_module->GetName() ) );
}
void SetHtmlAliasOf()
{
- if( m_alias->IsRoot() )
+ if( m_module->IsRoot() )
{
m_html.Replace( "__ALIASOF__", wxEmptyString );
}
@@ -122,7 +122,7 @@ protected:
wxString root_name = _( "Unknown" );
wxString root_desc = "";
- LIB_PART* root = m_alias->GetPart();
+ LIB_PART* root = m_module->GetPart();
LIB_ALIAS* root_alias = root ? root->GetAlias( 0 ) : nullptr;
if( root )
@@ -140,7 +140,7 @@ protected:
void SetHtmlDesc()
{
- wxString raw_desc = m_alias->GetDescription();
+ wxString raw_desc = m_module->GetDescription();
m_html.Replace( "__DESC__", wxString::Format( DescFormat, EscapedHTML( raw_desc ) ) );
}
@@ -148,7 +148,7 @@ protected:
void SetHtmlKeywords()
{
- wxString keywords = m_alias->GetKeyWords();
+ wxString keywords = m_module->GetKeyWords();
if( keywords.empty() )
m_html.Replace( "__KEY__", wxEmptyString );
@@ -171,7 +171,7 @@ protected:
case DATASHEET:
{
if( text.IsEmpty() )
- text = m_alias->GetDocFileName();
+ text = m_module->GetDocFileName();
wxString datasheetlink = DatasheetLinkFormat;
datasheetlink.Replace( "__HREF__", EscapedHTML( text ) );
@@ -197,7 +197,7 @@ protected:
{
wxString fieldtable;
LIB_FIELDS fields;
- m_alias->GetPart()->GetFields( fields );
+ m_module->GetPart()->GetFields( fields );
for( auto const & field: fields )
{
@@ -211,7 +211,7 @@ protected:
wxString GenerateAliasInfo( SYMBOL_LIB_TABLE* aSymLibTable, LIB_ID const& aLibId, int aUnit )
{
- ALIAS_INFO_GENERATOR gen( aSymLibTable, aLibId, aUnit );
+ FOOTPRINT_INFO_GENERATOR gen( aSymLibTable, aLibId, aUnit );
gen.GenerateHtml();
return gen.GetHtml();
}
diff --git a/eeschema/getpart.cpp b/eeschema/getpart.cpp
index b81e3063d6..96476ed1f3 100644
--- a/eeschema/getpart.cpp
+++ b/eeschema/getpart.cpp
@@ -48,7 +48,7 @@
#include
#include
-#include
+#include
SCH_BASE_FRAME::COMPONENT_SELECTION SCH_BASE_FRAME::SelectComponentFromLibBrowser(
@@ -98,10 +98,10 @@ SCH_BASE_FRAME::COMPONENT_SELECTION SCH_BASE_FRAME::SelectComponentFromLibBrowse
}
-SCH_BASE_FRAME::COMPONENT_SELECTION SCH_BASE_FRAME::SelectComponentFromLibrary(
+SCH_BASE_FRAME::COMPONENT_SELECTION SCH_BASE_FRAME::SelectComponentFromLibTree(
const SCHLIB_FILTER* aFilter,
std::vector& aHistoryList,
- bool aUseLibBrowser,
+ bool aAllowBrowser,
int aUnit,
int aConvert,
bool aShowFootprints,
@@ -116,7 +116,8 @@ SCH_BASE_FRAME::COMPONENT_SELECTION SCH_BASE_FRAME::SelectComponentFromLibrary(
if( !dialogLock.try_lock() )
return COMPONENT_SELECTION();
- auto adapter( CMP_TREE_MODEL_ADAPTER::Create( libs ) );
+ auto adapterPtr( SYMBOL_TREE_MODEL_ADAPTER::Create( libs ) );
+ auto adapter = static_cast( adapterPtr.get() );
bool loaded = false;
if( aFilter )
@@ -133,13 +134,13 @@ SCH_BASE_FRAME::COMPONENT_SELECTION SCH_BASE_FRAME::SelectComponentFromLibrary(
}
if( aFilter->GetFilterPowerParts() )
- adapter->SetFilter( CMP_TREE_MODEL_ADAPTER::CMP_FILTER_POWER );
+ adapter->SetFilter( SYMBOL_TREE_MODEL_ADAPTER::CMP_FILTER_POWER );
}
if( !aHistoryList.empty() )
{
- std::vector< LIB_ALIAS* > history_list;
+ std::vector< LIB_TREE_ITEM* > history_list;
for( auto const& i : aHistoryList )
{
@@ -149,7 +150,7 @@ SCH_BASE_FRAME::COMPONENT_SELECTION SCH_BASE_FRAME::SelectComponentFromLibrary(
history_list.push_back( alias );
}
- adapter->AddAliasList( "-- " + _( "History" ) + " --", _( "Recently used items" ), history_list );
+ adapter->DoAddLibrary( "-- " + _( "Recently Used" ) + " --", wxEmptyString, history_list );
adapter->SetPreselectNode( aHistoryList[0].LibId, aHistoryList[0].Unit );
}
@@ -157,18 +158,19 @@ SCH_BASE_FRAME::COMPONENT_SELECTION SCH_BASE_FRAME::SelectComponentFromLibrary(
if( !loaded )
{
- adapter->AddLibrariesWithProgress( libNicknames, this );
+ adapter->AddLibraries( libNicknames, this );
}
if( aHighlight && aHighlight->IsValid() )
adapter->SetPreselectNode( *aHighlight, /* aUnit */ 0 );
- if( adapter->GetFilter() == CMP_TREE_MODEL_ADAPTER::CMP_FILTER_POWER )
- dialogTitle.Printf( _( "Choose Power Symbol (%d items loaded)" ), adapter->GetComponentsCount() );
+ if( adapter->GetFilter() == SYMBOL_TREE_MODEL_ADAPTER::CMP_FILTER_POWER )
+ dialogTitle.Printf( _( "Choose Power Symbol (%d items loaded)" ), adapter->GetItemCount() );
else
- dialogTitle.Printf( _( "Choose Symbol (%d items loaded)" ), adapter->GetComponentsCount() );
+ dialogTitle.Printf( _( "Choose Symbol (%d items loaded)" ), adapter->GetItemCount() );
- DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, adapter, aConvert, aAllowFields, aShowFootprints );
+ DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, adapterPtr, aConvert,
+ aAllowFields, aShowFootprints, aAllowBrowser );
if( dlg.ShowQuasiModal() == wxID_CANCEL )
return COMPONENT_SELECTION();
@@ -214,14 +216,14 @@ SCH_BASE_FRAME::COMPONENT_SELECTION SCH_BASE_FRAME::SelectComponentFromLibrary(
SCH_COMPONENT* SCH_EDIT_FRAME::Load_Component( wxDC* aDC,
const SCHLIB_FILTER* aFilter,
SCH_BASE_FRAME::HISTORY_LIST& aHistoryList,
- bool aUseLibBrowser )
+ bool aAllowBrowser )
{
wxString msg;
SetRepeatItem( NULL );
m_canvas->SetIgnoreMouseEvents( true );
- auto sel = SelectComponentFromLibrary( aFilter, aHistoryList, aUseLibBrowser, 1, 1,
+ auto sel = SelectComponentFromLibTree( aFilter, aHistoryList, aAllowBrowser, 1, 1,
m_footprintPreview );
if( !sel.LibId.IsValid() )
diff --git a/eeschema/lib_edit_frame.cpp b/eeschema/lib_edit_frame.cpp
index eaa46ceddc..cede60ad69 100644
--- a/eeschema/lib_edit_frame.cpp
+++ b/eeschema/lib_edit_frame.cpp
@@ -48,8 +48,8 @@
#include
#include
-#include
-#include
+#include
+#include
#include
#include
@@ -245,7 +245,7 @@ LIB_EDIT_FRAME::LIB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_libMgr = new LIB_MANAGER( *this );
SyncLibraries( true );
- m_treePane = new CMP_TREE_PANE( this, m_libMgr );
+ m_treePane = new SYMBOL_TREE_PANE( this, m_libMgr );
ReCreateMenuBar();
ReCreateHToolbar();
@@ -460,7 +460,7 @@ bool LIB_EDIT_FRAME::IsSearchTreeShown()
void LIB_EDIT_FRAME::ClearSearchTreeSelection()
{
- m_treePane->GetCmpTree()->Unselect();
+ m_treePane->GetLibTree()->Unselect();
}
@@ -1031,7 +1031,7 @@ void LIB_EDIT_FRAME::SetCurPart( LIB_PART* aPart )
// select the current component in the tree widget
if( aPart )
- m_treePane->GetCmpTree()->SelectLibId( aPart->GetLibId() );
+ m_treePane->GetLibTree()->SelectLibId( aPart->GetLibId() );
wxString partName = aPart ? aPart->GetName() : wxString();
m_libMgr->SetCurrentPart( partName );
@@ -1457,7 +1457,7 @@ void LIB_EDIT_FRAME::OnModify()
{
GetScreen()->SetModify();
storeCurrentPart();
- m_treePane->GetCmpTree()->Refresh();
+ m_treePane->GetLibTree()->Refresh();
}
@@ -1519,17 +1519,19 @@ void LIB_EDIT_FRAME::refreshSchematic()
bool LIB_EDIT_FRAME::addLibraryFile( bool aCreateNew )
{
- wxFileName fileName = getLibraryFileName( !aCreateNew );
- wxString libName = fileName.GetName();
- bool res = false;
+ wxFileName fn = m_libMgr->GetUniqueLibraryName();
+
+ if( !LibraryFileBrowser( !aCreateNew, fn, SchematicLibraryFileWildcard(), SchematicLibraryFileExtension) )
+ return false;
+
+ wxString libName = fn.GetName();
if( libName.IsEmpty() )
return false;
if( m_libMgr->LibraryExists( libName ) )
{
- DisplayError( this,
- wxString::Format( _( "Library \"%s\" already exists" ), GetChars( libName ) ) );
+ DisplayError( this, wxString::Format( _( "Library \"%s\" already exists" ), libName ) );
return false;
}
@@ -1541,46 +1543,25 @@ bool LIB_EDIT_FRAME::addLibraryFile( bool aCreateNew )
if( aCreateNew )
{
- res = m_libMgr->CreateLibrary( fileName.GetFullPath(), libTable );
-
- if( !res )
+ if( !m_libMgr->CreateLibrary( fn.GetFullPath(), libTable ) )
+ {
DisplayError( this, _( "Could not create the library file. Check write permission." ) );
+ return false;
+ }
}
else
{
- res = m_libMgr->AddLibrary( fileName.GetFullPath(), libTable );
-
- if( !res )
+ if( !m_libMgr->AddLibrary( fn.GetFullPath(), libTable ) )
+ {
DisplayError( this, _( "Could not open the library file." ) );
+ return false;
+ }
}
bool globalTable = ( libTable == &SYMBOL_LIB_TABLE::GetGlobalLibTable() );
saveSymbolLibTables( globalTable, !globalTable );
- return res;
-}
-
-
-wxFileName LIB_EDIT_FRAME::getLibraryFileName( bool aExisting )
-{
- wxFileName fn = m_libMgr->GetUniqueLibraryName();
- fn.SetExt( SchematicLibraryFileExtension );
-
- wxFileDialog dlg( this,
- aExisting ? _( "Select Library" ) : _( "New Library" ),
- Prj().GetProjectPath(),
- aExisting ? wxString( wxEmptyString ) : fn.GetFullName() ,
- SchematicLibraryFileWildcard(),
- aExisting ? wxFD_OPEN | wxFD_FILE_MUST_EXIST :
- wxFD_SAVE | wxFD_CHANGE_DIR | wxFD_OVERWRITE_PROMPT );
-
- if( dlg.ShowModal() == wxID_CANCEL )
- return wxFileName();
-
- fn = dlg.GetPath();
- fn.SetExt( SchematicLibraryFileExtension );
-
- return fn;
+ return true;
}
@@ -1588,9 +1569,9 @@ LIB_PART* LIB_EDIT_FRAME::getTargetPart() const
{
LIB_ALIAS* alias = nullptr;
- if( m_treePane->GetCmpTree()->IsMenuActive() )
+ if( m_treePane->GetLibTree()->IsMenuActive() )
{
- LIB_ID libId = m_treePane->GetCmpTree()->GetSelectedLibId();
+ LIB_ID libId = m_treePane->GetLibTree()->GetSelectedLibId();
alias = m_libMgr->GetAlias( libId.GetLibItemName(), libId.GetLibNickname() );
}
else if( LIB_PART* part = GetCurPart() )
@@ -1604,7 +1585,7 @@ LIB_PART* LIB_EDIT_FRAME::getTargetPart() const
LIB_ID LIB_EDIT_FRAME::getTargetLibId() const
{
- LIB_ID id = m_treePane->GetCmpTree()->GetSelectedLibId();
+ LIB_ID id = m_treePane->GetLibTree()->GetSelectedLibId();
wxString nickname = id.GetLibNickname();
if( nickname.IsEmpty() && GetCurPart() )
@@ -1625,7 +1606,7 @@ void LIB_EDIT_FRAME::SyncLibraries( bool aProgress )
LIB_ID selected;
if( m_treePane )
- selected = m_treePane->GetCmpTree()->GetSelectedLibId();
+ selected = m_treePane->GetLibTree()->GetSelectedLibId();
if( aProgress )
{
@@ -1652,7 +1633,7 @@ void LIB_EDIT_FRAME::SyncLibraries( bool aProgress )
found = m_libMgr->GetAdapter()->FindItem( selected );
if( !found )
- m_treePane->GetCmpTree()->Unselect();
+ m_treePane->GetLibTree()->Unselect();
}
m_treePane->Regenerate();
@@ -1664,7 +1645,7 @@ void LIB_EDIT_FRAME::SyncLibraries( bool aProgress )
found = m_libMgr->GetAdapter()->FindItem( selected );
if( found )
- m_treePane->GetCmpTree()->SelectLibId( selected );
+ m_treePane->GetLibTree()->SelectLibId( selected );
}
}
}
diff --git a/eeschema/lib_edit_frame.h b/eeschema/lib_edit_frame.h
index 746b698274..0c3fc786e0 100644
--- a/eeschema/lib_edit_frame.h
+++ b/eeschema/lib_edit_frame.h
@@ -45,7 +45,7 @@ class LIB_PART;
class LIB_ALIAS;
class LIB_FIELD;
class DIALOG_LIB_EDIT_TEXT;
-class CMP_TREE_PANE;
+class SYMBOL_TREE_PANE;
class LIB_ID;
class LIB_MANAGER;
@@ -55,13 +55,13 @@ class LIB_MANAGER;
*/
class LIB_EDIT_FRAME : public SCH_BASE_FRAME
{
- LIB_PART* m_my_part; ///< a part I own, it is not in any library, but a copy could be.
- LIB_PART* m_tempCopyComponent; ///< temp copy of a part during edit, I own it here.
- LIB_COLLECTOR m_collectedItems; ///< Used for hit testing.
- wxComboBox* m_partSelectBox; ///< a Box to select a part to edit (if any)
- wxComboBox* m_aliasSelectBox; ///< a box to select the alias to edit (if any)
- CMP_TREE_PANE* m_treePane; ///< component search tree widget
- LIB_MANAGER* m_libMgr; ///< manager taking care of temporary modificatoins
+ LIB_PART* m_my_part; ///< a part I own, it is not in any library, but a copy could be.
+ LIB_PART* m_tempCopyComponent; ///< temp copy of a part during edit, I own it here.
+ LIB_COLLECTOR m_collectedItems; ///< Used for hit testing.
+ wxComboBox* m_partSelectBox; ///< a Box to select a part to edit (if any)
+ wxComboBox* m_aliasSelectBox; ///< a box to select the alias to edit (if any)
+ SYMBOL_TREE_PANE* m_treePane; ///< component search tree widget
+ LIB_MANAGER* m_libMgr; ///< manager taking care of temporary modificatoins
/** Convert of the item currently being drawn. */
bool m_drawSpecificConvert;
@@ -745,9 +745,6 @@ private:
///> Creates or adds an existing library to the symbol library table.
bool addLibraryFile( bool aCreateNew );
- ///> Displays a file browser dialog to select a library file.
- wxFileName getLibraryFileName( bool aExisting );
-
///> Stores the currently modified part in the library manager buffer.
void storeCurrentPart();
diff --git a/eeschema/lib_manager.cpp b/eeschema/lib_manager.cpp
index a26e053cb0..ed75e144f5 100644
--- a/eeschema/lib_manager.cpp
+++ b/eeschema/lib_manager.cpp
@@ -38,7 +38,7 @@
LIB_MANAGER::LIB_MANAGER( LIB_EDIT_FRAME& aFrame )
: m_frame( aFrame ), m_syncHash( 0 )
{
- m_adapter = LIB_MANAGER_ADAPTER::Create( this );
+ m_adapter = SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Create( this );
m_adapter->ShowUnits( false );
}
diff --git a/eeschema/lib_manager.h b/eeschema/lib_manager.h
index 371818e9fb..66dfe25e13 100644
--- a/eeschema/lib_manager.h
+++ b/eeschema/lib_manager.h
@@ -31,7 +31,7 @@
#include
#include
#include
-#include
+#include
#include
class LIB_ALIAS;
@@ -232,7 +232,7 @@ public:
/**
* Returns the adapter object that provides the stored data.
*/
- CMP_TREE_MODEL_ADAPTER_BASE::PTR& GetAdapter() { return m_adapter; }
+ LIB_TREE_MODEL_ADAPTER::PTR& GetAdapter() { return m_adapter; }
/**
* Returns the currently modified library name.
@@ -448,8 +448,8 @@ private:
///> Currently modified library
wxString m_currentPart;
- LIB_MANAGER_ADAPTER::PTR m_adapter;
- LIB_MANAGER_ADAPTER* getAdapter() { return static_cast( m_adapter.get() ); }
+ SYMBOL_TREE_SYNCHRONIZING_ADAPTER::PTR m_adapter;
+ SYMBOL_TREE_SYNCHRONIZING_ADAPTER* getAdapter() { return static_cast( m_adapter.get() ); }
};
#endif /* LIB_MANAGER_H */
diff --git a/eeschema/libedit.cpp b/eeschema/libedit.cpp
index 58881b8a68..4e28d8db0d 100644
--- a/eeschema/libedit.cpp
+++ b/eeschema/libedit.cpp
@@ -46,11 +46,11 @@
#include
#include
#include
-#include
-#include
+#include
+#include
#include
-#include
+#include
#include
#include
@@ -319,7 +319,7 @@ void LIB_EDIT_FRAME::OnCreateNewPart( wxCommandEvent& event )
void LIB_EDIT_FRAME::OnEditPart( wxCommandEvent& aEvent )
{
int unit = 0;
- LIB_ID partId = m_treePane->GetCmpTree()->GetSelectedLibId( &unit );
+ LIB_ID partId = m_treePane->GetLibTree()->GetSelectedLibId( &unit );
loadPart( partId.GetLibItemName(), partId.GetLibNickname(), unit );
}
@@ -332,13 +332,13 @@ void LIB_EDIT_FRAME::OnSave( wxCommandEvent& aEvent )
if( partName.IsEmpty() )
{
- saveLibrary( getTargetLib(), false );
+ saveLibrary( libName, false );
}
else
{
// Save Part
- if( m_libMgr->FlushPart( libId.GetLibItemName(), libId.GetLibNickname() ) )
- m_libMgr->ClearPartModified( libId.GetLibItemName(), libId.GetLibNickname() );
+ if( m_libMgr->FlushPart( partName,libName ) )
+ m_libMgr->ClearPartModified( partName, libName );
}
m_treePane->Refresh();
@@ -352,7 +352,7 @@ void LIB_EDIT_FRAME::OnSaveAs( wxCommandEvent& aEvent )
const wxString& partName = libId.GetLibItemName();
if( partName.IsEmpty() )
- saveLibrary( getTargetLib(), true );
+ saveLibrary( libName, true );
else
savePartAs();
@@ -448,7 +448,7 @@ void LIB_EDIT_FRAME::savePartAs()
fixDuplicateAliases( &new_part, new_lib );
m_libMgr->UpdatePart( &new_part, new_lib );
- m_treePane->GetCmpTree()->SelectLibId( LIB_ID( new_lib, new_part.GetName() ) );
+ m_treePane->GetLibTree()->SelectLibId( LIB_ID( new_lib, new_part.GetName() ) );
if( isCurrentPart( old_lib_id ) )
loadPart( new_name, new_lib, m_unit );
@@ -480,7 +480,7 @@ void LIB_EDIT_FRAME::OnRemovePart( wxCommandEvent& aEvent )
void LIB_EDIT_FRAME::OnDuplicatePart( wxCommandEvent& aEvent )
{
int unit = 0;
- LIB_ID libId = m_treePane->GetCmpTree()->GetSelectedLibId( &unit );
+ LIB_ID libId = m_treePane->GetLibTree()->GetSelectedLibId( &unit );
wxString lib = libId.GetLibNickname();
if( !m_libMgr->LibraryExists( lib ) )
@@ -494,7 +494,7 @@ void LIB_EDIT_FRAME::OnDuplicatePart( wxCommandEvent& aEvent )
LIB_PART newPart( *srcPart );
fixDuplicateAliases( &newPart, lib );
m_libMgr->UpdatePart( &newPart, lib );
- m_treePane->GetCmpTree()->SelectLibId( LIB_ID( lib, newPart.GetName() ) );
+ m_treePane->GetLibTree()->SelectLibId( LIB_ID( lib, newPart.GetName() ) );
}
@@ -549,7 +549,7 @@ void LIB_EDIT_FRAME::OnRevert( wxCommandEvent& aEvent )
{
libId = m_libMgr->RevertPart( libId.GetLibItemName(), libId.GetLibNickname() );
- m_treePane->GetCmpTree()->SelectLibId( libId );
+ m_treePane->GetLibTree()->SelectLibId( libId );
m_libMgr->ClearPartModified( libId.GetLibItemName(), libId.GetLibNickname() );
}
diff --git a/eeschema/libedit_undo_redo.cpp b/eeschema/libedit_undo_redo.cpp
index e996f8d8a5..130442b8f1 100644
--- a/eeschema/libedit_undo_redo.cpp
+++ b/eeschema/libedit_undo_redo.cpp
@@ -28,8 +28,8 @@
#include
#include
#include
-#include
-#include
+#include
+#include
void LIB_EDIT_FRAME::SaveCopyInUndoList( EDA_ITEM* ItemToCopy, UNDO_REDO_T undoType )
@@ -86,7 +86,7 @@ void LIB_EDIT_FRAME::GetComponentFromRedoList( wxCommandEvent& event )
m_libMgr->UpdatePartAfterRename( part, oldPart->GetName(), lib );
// Reselect the renamed part
- m_treePane->GetCmpTree()->SelectLibId( LIB_ID( lib, part->GetName() ) );
+ m_treePane->GetLibTree()->SelectLibId( LIB_ID( lib, part->GetName() ) );
}
if( !m_aliasName.IsEmpty() && !part->HasAlias( m_aliasName ) )
@@ -137,7 +137,7 @@ void LIB_EDIT_FRAME::GetComponentFromUndoList( wxCommandEvent& event )
m_libMgr->UpdatePartAfterRename( part, oldPart->GetName(), lib );
// Reselect the renamed part
- m_treePane->GetCmpTree()->SelectLibId( LIB_ID( lib, part->GetName() ) );
+ m_treePane->GetLibTree()->SelectLibId( LIB_ID( lib, part->GetName() ) );
}
if( !m_aliasName.IsEmpty() && !part->HasAlias( m_aliasName ) )
diff --git a/eeschema/libfield.cpp b/eeschema/libfield.cpp
index 3e7ebc9b3d..e33b9e5654 100644
--- a/eeschema/libfield.cpp
+++ b/eeschema/libfield.cpp
@@ -35,8 +35,8 @@
#include
#include
-#include
-#include
+#include
+#include
void LIB_EDIT_FRAME::EditField( LIB_FIELD* aField )
@@ -93,7 +93,7 @@ void LIB_EDIT_FRAME::EditField( LIB_FIELD* aField )
m_libMgr->UpdatePartAfterRename( parent, oldFieldValue, lib );
// Reselect the renamed part
- m_treePane->GetCmpTree()->SelectLibId( LIB_ID( lib, newFieldValue ) );
+ m_treePane->GetLibTree()->SelectLibId( LIB_ID( lib, newFieldValue ) );
}
if( !aField->InEditMode() && !renamed )
diff --git a/eeschema/sch_base_frame.h b/eeschema/sch_base_frame.h
index 317142f774..80a7d65966 100644
--- a/eeschema/sch_base_frame.h
+++ b/eeschema/sch_base_frame.h
@@ -194,15 +194,15 @@ public:
*
* @return the selected component
*/
- COMPONENT_SELECTION SelectComponentFromLibrary(
- const SCHLIB_FILTER* aFilter,
- std::vector& aHistoryList,
- bool aUseLibBrowser,
- int aUnit,
- int aConvert,
- bool aShowFootprints,
- const LIB_ID* aHighlight = nullptr,
- bool aAllowFields = true );
+ COMPONENT_SELECTION SelectComponentFromLibTree(
+ const SCHLIB_FILTER* aFilter,
+ std::vector& aHistoryList,
+ bool aUseLibBrowser,
+ int aUnit,
+ int aConvert,
+ bool aShowFootprints,
+ const LIB_ID* aHighlight = nullptr,
+ bool aAllowFields = true );
void OnConfigurePaths( wxCommandEvent& aEvent );
diff --git a/eeschema/symbol_tree_model_adapter.cpp b/eeschema/symbol_tree_model_adapter.cpp
new file mode 100644
index 0000000000..853e4dc335
--- /dev/null
+++ b/eeschema/symbol_tree_model_adapter.cpp
@@ -0,0 +1,117 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2017 Chris Pavlina
+ * Copyright (C) 2014 Henner Zeller
+ * Copyright (C) 2014-2017 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+
+
+bool SYMBOL_TREE_MODEL_ADAPTER::m_show_progress = true;
+
+#define PROGRESS_INTERVAL_MILLIS 66
+
+
+SYMBOL_TREE_MODEL_ADAPTER::PTR SYMBOL_TREE_MODEL_ADAPTER::Create( LIB_TABLE* aLibs )
+{
+ return PTR( new SYMBOL_TREE_MODEL_ADAPTER( aLibs ) );
+}
+
+
+SYMBOL_TREE_MODEL_ADAPTER::SYMBOL_TREE_MODEL_ADAPTER( LIB_TABLE* aLibs )
+ : m_libs( (SYMBOL_LIB_TABLE*) aLibs )
+{}
+
+
+SYMBOL_TREE_MODEL_ADAPTER::~SYMBOL_TREE_MODEL_ADAPTER()
+{}
+
+
+void SYMBOL_TREE_MODEL_ADAPTER::AddLibraries( const std::vector& aNicknames,
+ wxWindow* aParent )
+{
+ wxProgressDialog* prg = nullptr;
+ wxLongLong nextUpdate = wxGetUTCTimeMillis() + (PROGRESS_INTERVAL_MILLIS / 2);
+
+ if( m_show_progress )
+ {
+ prg = new wxProgressDialog( _( "Loading Symbol Libraries" ), wxEmptyString,
+ aNicknames.size(), aParent );
+ }
+
+ unsigned int ii = 0;
+
+ for( const auto& nickname : aNicknames )
+ {
+ if( prg && wxGetUTCTimeMillis() > nextUpdate )
+ {
+ prg->Update( ii, wxString::Format( _( "Loading library \"%s\"" ), nickname ) );
+ nextUpdate = wxGetUTCTimeMillis() + PROGRESS_INTERVAL_MILLIS;
+ }
+
+ AddLibrary( nickname );
+ ii++;
+ }
+
+ if( prg )
+ {
+ prg->Destroy();
+ m_show_progress = false;
+ }
+}
+
+
+void SYMBOL_TREE_MODEL_ADAPTER::AddLibrary( wxString const& aLibNickname )
+{
+ bool onlyPowerSymbols = ( GetFilter() == CMP_FILTER_POWER );
+ std::vector alias_list;
+ std::vector comp_list;
+
+ try
+ {
+ m_libs->LoadSymbolLib( alias_list, aLibNickname, onlyPowerSymbols );
+ }
+ catch( const IO_ERROR& ioe )
+ {
+ wxLogError( wxString::Format( _( "Error loading symbol library %s.\n\n%s" ),
+ aLibNickname,
+ ioe.What() ) );
+ return;
+ }
+
+ if( alias_list.size() > 0 )
+ {
+ comp_list.assign( alias_list.begin(), alias_list.end() );
+ DoAddLibrary( aLibNickname, m_libs->GetDescription( aLibNickname ), comp_list );
+ m_tree.AssignIntrinsicRanks();
+ }
+}
+
+
+wxString SYMBOL_TREE_MODEL_ADAPTER::GenerateInfo( LIB_ID const& aLibId, int aUnit )
+{
+ return GenerateAliasInfo( m_libs, aLibId, aUnit );
+}
diff --git a/eeschema/cmp_tree_model_adapter.h b/eeschema/symbol_tree_model_adapter.h
similarity index 52%
rename from eeschema/cmp_tree_model_adapter.h
rename to eeschema/symbol_tree_model_adapter.h
index 17c033370c..0b6437a6cc 100644
--- a/eeschema/cmp_tree_model_adapter.h
+++ b/eeschema/symbol_tree_model_adapter.h
@@ -19,65 +19,55 @@
* with this program. If not, see .
*/
-#ifndef _CMP_TREE_MODEL_ADAPTER_H
-#define _CMP_TREE_MODEL_ADAPTER_H
+#ifndef SYMBOL_TREE_MODEL_ADAPTER_H
+#define SYMBOL_TREE_MODEL_ADAPTER_H
-#include
+#include
+class LIB_TABLE;
class SYMBOL_LIB_TABLE;
-class CMP_TREE_MODEL_ADAPTER: public CMP_TREE_MODEL_ADAPTER_BASE
+class SYMBOL_TREE_MODEL_ADAPTER : public LIB_TREE_MODEL_ADAPTER
{
public:
-
/**
- * Reference-counting container for a pointer to CMP_TREE_MODEL_ADAPTER.
+ * Destructor. Do NOT delete this class manually; it is reference-counted by wxObject.
*/
- //typedef wxObjectDataPtr PTR;
+ ~SYMBOL_TREE_MODEL_ADAPTER();
/**
- * Destructor. Do NOT delete this class manually; it is reference-counted
- * by wxObject.
- */
- ~CMP_TREE_MODEL_ADAPTER();
-
- /**
- * Factory function: create a model adapter in a reference-counting
- * container.
+ * Factory function: create a model adapter in a reference-counting container.
*
* @param aLibs library set from which parts will be loaded
*/
- static PTR Create( SYMBOL_LIB_TABLE* aLibs );
+ static PTR Create( LIB_TABLE* aLibs );
/**
- * Add all the components and their aliases in this library. To be called
- * in the setup phase.
+ * Add all the libraries in a SYMBOL_LIB_TABLE to the model.
+ * Displays a progress dialog attached to the parent frame the first time it is run.
*
- * @param aLibNickname reference to a symbol library nickname
+ * @param aNicknames is the list of library nicknames
+ * @param aParent is the parent window to display the progress dialog
*/
- void AddLibrary( wxString const& aLibNickname ) override;
+ void AddLibraries( const std::vector& aNicknames, wxWindow* aParent );
- /**
- * Add the given list of components, by name. To be called in the setup
- * phase.
- *
- * @param aNodeName the parent node the components will appear under
- * @param aAliasNameList list of alias names
- */
- void AddAliasList(
- wxString const& aNodeName,
- wxArrayString const& aAliasNameList ) override;
+ void AddLibrary( wxString const& aLibNickname );
+
+ wxString GenerateInfo( LIB_ID const& aLibId, int aUnit ) override;
- using CMP_TREE_MODEL_ADAPTER_BASE::AddAliasList;
protected:
-
/**
* Constructor; takes a set of libraries to be included in the search.
*/
- CMP_TREE_MODEL_ADAPTER( SYMBOL_LIB_TABLE* aLibs );
+ SYMBOL_TREE_MODEL_ADAPTER( LIB_TABLE* aLibs );
private:
- SYMBOL_LIB_TABLE* m_libs;
+ /**
+ * Flag to only show the symbol library table load progress dialog the first time.
+ */
+ static bool m_show_progress;
+
+ SYMBOL_LIB_TABLE* m_libs;
};
-#endif // _CMP_TREE_MODEL_ADAPTER_H
+#endif // SYMBOL_TREE_MODEL_ADAPTER_H
diff --git a/eeschema/lib_manager_adapter.cpp b/eeschema/symbol_tree_synchronizing_adapter.cpp
similarity index 78%
rename from eeschema/lib_manager_adapter.cpp
rename to eeschema/symbol_tree_synchronizing_adapter.cpp
index f0953f41bf..a933180594 100644
--- a/eeschema/lib_manager_adapter.cpp
+++ b/eeschema/symbol_tree_synchronizing_adapter.cpp
@@ -22,42 +22,35 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include
+#include
#include
#include
#include
-CMP_TREE_MODEL_ADAPTER_BASE::PTR LIB_MANAGER_ADAPTER::Create( LIB_MANAGER* aLibMgr )
+LIB_TREE_MODEL_ADAPTER::PTR SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Create( LIB_MANAGER* aLibMgr )
{
- auto adapter = new LIB_MANAGER_ADAPTER( aLibMgr );
- auto container = CMP_TREE_MODEL_ADAPTER_BASE::PTR( adapter );
- return container;
+ return PTR( new SYMBOL_TREE_SYNCHRONIZING_ADAPTER( aLibMgr ) );
}
-void LIB_MANAGER_ADAPTER::AddLibrary( const wxString& aLibNickname )
+SYMBOL_TREE_SYNCHRONIZING_ADAPTER::SYMBOL_TREE_SYNCHRONIZING_ADAPTER( LIB_MANAGER* aLibMgr )
+ : m_libMgr( aLibMgr ),
+ m_lastSyncHash( -1 )
{
}
-void LIB_MANAGER_ADAPTER::AddAliasList( const wxString& aNodeName,
- const wxArrayString& aAliasNameList )
+bool SYMBOL_TREE_SYNCHRONIZING_ADAPTER::IsContainer( const wxDataViewItem& aItem ) const
{
- wxASSERT( false ); // TODO
-}
-
-
-bool LIB_MANAGER_ADAPTER::IsContainer( const wxDataViewItem& aItem ) const
-{
- const CMP_TREE_NODE* node = ToNode( aItem );
- return node ? node->Type == CMP_TREE_NODE::LIB : true;
+ const LIB_TREE_NODE* node = ToNode( aItem );
+ return node ? node->Type == LIB_TREE_NODE::LIB : true;
}
#define PROGRESS_INTERVAL_MILLIS 66
-void LIB_MANAGER_ADAPTER::Sync( bool aForce, std::function aProgressCallback )
+void SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Sync( bool aForce, std::function aProgressCallback )
{
wxLongLong nextUpdate = wxGetUTCTimeMillis() + (PROGRESS_INTERVAL_MILLIS / 2);
@@ -87,7 +80,7 @@ void LIB_MANAGER_ADAPTER::Sync( bool aForce, std::functionGetLibraryHash( name ) != m_libHashes[name] )
{
- updateLibrary( *(CMP_TREE_NODE_LIB*) it->get() );
+ updateLibrary( *(LIB_TREE_NODE_LIB*) it->get() );
}
++it;
@@ -115,9 +108,9 @@ void LIB_MANAGER_ADAPTER::Sync( bool aForce, std::functionGetLibraryNames() )
{
@@ -129,7 +122,7 @@ int LIB_MANAGER_ADAPTER::GetLibrariesCount() const
}
-void LIB_MANAGER_ADAPTER::updateLibrary( CMP_TREE_NODE_LIB& aLibNode )
+void SYMBOL_TREE_SYNCHRONIZING_ADAPTER::updateLibrary( LIB_TREE_NODE_LIB& aLibNode )
{
auto hashIt = m_libHashes.find( aLibNode.Name );
@@ -137,7 +130,7 @@ void LIB_MANAGER_ADAPTER::updateLibrary( CMP_TREE_NODE_LIB& aLibNode )
{
// add a new library
for( auto alias : m_libMgr->GetAliases( aLibNode.Name ) )
- aLibNode.AddAlias( alias );
+ aLibNode.AddComp( alias );
}
else if( hashIt->second != m_libMgr->GetLibraryHash( aLibNode.Name ) )
{
@@ -156,7 +149,7 @@ void LIB_MANAGER_ADAPTER::updateLibrary( CMP_TREE_NODE_LIB& aLibNode )
{
// alias exists both in the component tree and the library manager,
// update only the node data
- static_cast( nodeIt->get() )->Update( *aliasIt );
+ static_cast( nodeIt->get() )->Update( *aliasIt );
aliases.erase( aliasIt );
++nodeIt;
}
@@ -169,7 +162,7 @@ void LIB_MANAGER_ADAPTER::updateLibrary( CMP_TREE_NODE_LIB& aLibNode )
// now the aliases list contains only new aliases that need to be added to the tree
for( auto alias : aliases )
- aLibNode.AddAlias( alias );
+ aLibNode.AddComp( alias );
}
aLibNode.AssignIntrinsicRanks();
@@ -177,17 +170,17 @@ void LIB_MANAGER_ADAPTER::updateLibrary( CMP_TREE_NODE_LIB& aLibNode )
}
-CMP_TREE_NODE::PTR_VECTOR::iterator LIB_MANAGER_ADAPTER::deleteLibrary(
- CMP_TREE_NODE::PTR_VECTOR::iterator& aLibNodeIt )
+LIB_TREE_NODE::PTR_VECTOR::iterator SYMBOL_TREE_SYNCHRONIZING_ADAPTER::deleteLibrary(
+ LIB_TREE_NODE::PTR_VECTOR::iterator& aLibNodeIt )
{
- CMP_TREE_NODE* node = aLibNodeIt->get();
+ LIB_TREE_NODE* node = aLibNodeIt->get();
m_libHashes.erase( node->Name );
auto it = m_tree.Children.erase( aLibNodeIt );
return it;
}
-CMP_TREE_NODE* LIB_MANAGER_ADAPTER::findLibrary( const wxString& aLibNickName )
+LIB_TREE_NODE* SYMBOL_TREE_SYNCHRONIZING_ADAPTER::findLibrary( const wxString& aLibNickName )
{
for( auto& lib : m_tree.Children )
{
@@ -199,8 +192,8 @@ CMP_TREE_NODE* LIB_MANAGER_ADAPTER::findLibrary( const wxString& aLibNickName )
}
-void LIB_MANAGER_ADAPTER::GetValue( wxVariant& aVariant, wxDataViewItem const& aItem,
- unsigned int aCol ) const
+void SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetValue( wxVariant& aVariant, wxDataViewItem const& aItem,
+ unsigned int aCol ) const
{
if( IsFrozen() )
{
@@ -217,11 +210,11 @@ void LIB_MANAGER_ADAPTER::GetValue( wxVariant& aVariant, wxDataViewItem const& a
aVariant = node->Name;
// mark modified libs with an asterix
- if( node->Type == CMP_TREE_NODE::LIB && m_libMgr->IsLibraryModified( node->Name ) )
+ if( node->Type == LIB_TREE_NODE::LIB && m_libMgr->IsLibraryModified( node->Name ) )
aVariant = node->Name + " *";
// mark modified parts with an asterix
- if( node->Type == CMP_TREE_NODE::LIBID
+ if( node->Type == LIB_TREE_NODE::LIBID
&& m_libMgr->IsPartModified( node->Name, node->Parent->Name ) )
aVariant = node->Name + " *";
@@ -238,8 +231,8 @@ void LIB_MANAGER_ADAPTER::GetValue( wxVariant& aVariant, wxDataViewItem const& a
}
-bool LIB_MANAGER_ADAPTER::GetAttr( wxDataViewItem const& aItem, unsigned int aCol,
- wxDataViewItemAttr& aAttr ) const
+bool SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetAttr( wxDataViewItem const& aItem, unsigned int aCol,
+ wxDataViewItemAttr& aAttr ) const
{
if( IsFrozen() )
return false;
@@ -253,7 +246,7 @@ bool LIB_MANAGER_ADAPTER::GetAttr( wxDataViewItem const& aItem, unsigned int aCo
switch( node->Type )
{
- case CMP_TREE_NODE::LIB:
+ case LIB_TREE_NODE::LIB:
// mark modified libs with bold font
aAttr.SetBold( m_libMgr->IsLibraryModified( node->Name ) );
@@ -269,7 +262,7 @@ bool LIB_MANAGER_ADAPTER::GetAttr( wxDataViewItem const& aItem, unsigned int aCo
#endif
break;
- case CMP_TREE_NODE::LIBID:
+ case LIB_TREE_NODE::LIBID:
// mark modified part with bold font
aAttr.SetBold( m_libMgr->IsPartModified( node->Name, node->Parent->Name ) );
@@ -296,7 +289,3 @@ bool LIB_MANAGER_ADAPTER::GetAttr( wxDataViewItem const& aItem, unsigned int aCo
}
-LIB_MANAGER_ADAPTER::LIB_MANAGER_ADAPTER( LIB_MANAGER* aLibMgr )
- : m_libMgr( aLibMgr ), m_lastSyncHash( -1 )
-{
-}
diff --git a/eeschema/lib_manager_adapter.h b/eeschema/symbol_tree_synchronizing_adapter.h
similarity index 62%
rename from eeschema/lib_manager_adapter.h
rename to eeschema/symbol_tree_synchronizing_adapter.h
index 4740860316..4b1c8b6eeb 100644
--- a/eeschema/lib_manager_adapter.h
+++ b/eeschema/symbol_tree_synchronizing_adapter.h
@@ -22,52 +22,47 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#ifndef LIB_MANAGER_ADAPTER_H
-#define LIB_MANAGER_ADAPTER_H
+#ifndef SYMBOL_TREE_SYNCHRONIZING_ADAPTER_H
+#define SYMBOL_TREE_SYNCHRONIZING_ADAPTER_H
-#include
+#include
#include