Push component tree down into common.
Precondition to reusing component tree for footprints.
This commit is contained in:
parent
13b96799ea
commit
97f7bd4cb9
|
@ -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
|
||||
|
|
|
@ -1375,9 +1375,7 @@ void EDA_DRAW_FRAME::SetScrollCenterPosition( const wxPoint& aPoint )
|
|||
|
||||
//-----</BASE_SCREEN API moved here >--------------------------------------------
|
||||
|
||||
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;
|
||||
|
||||
|
|
|
@ -19,10 +19,10 @@
|
|||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <cmp_tree_model.h>
|
||||
#include <lib_tree_model.h>
|
||||
|
||||
#include <class_library.h>
|
||||
#include <eda_pattern_match.h>
|
||||
#include <lib_tree_item.h>
|
||||
#include <make_unique.h>
|
||||
#include <utility>
|
||||
#include <pgm_base.h>
|
||||
|
@ -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<CMP_TREE_NODE*> sort_buf;
|
||||
std::vector<LIB_TREE_NODE*> 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<CMP_TREE_NODE> const& a, std::unique_ptr<CMP_TREE_NODE> const& b )
|
||||
[]( std::unique_ptr<LIB_TREE_NODE> const& a, std::unique_ptr<LIB_TREE_NODE> 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<CMP_TREE_NODE>( unit ) );
|
||||
LIB_TREE_NODE_UNIT* unit = new LIB_TREE_NODE_UNIT( this, aItem, aUnit );
|
||||
Children.push_back( std::unique_ptr<LIB_TREE_NODE>( 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<CMP_TREE_NODE>( alias ) );
|
||||
LIB_TREE_NODE_LIB_ID* alias = new LIB_TREE_NODE_LIB_ID( this, aAlias );
|
||||
Children.push_back( std::unique_ptr<LIB_TREE_NODE>( 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<CMP_TREE_NODE>( lib ) );
|
||||
LIB_TREE_NODE_LIB* lib = new LIB_TREE_NODE_LIB( this, aName, aDesc );
|
||||
Children.push_back( std::unique_ptr<LIB_TREE_NODE>( 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 );
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright (C) 2017 Chris Pavlina <pavlina.chris@gmail.com>
|
||||
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _CMP_TREE_MODEL_H
|
||||
#define _CMP_TREE_MODEL_H
|
||||
#ifndef LIB_TREE_MODEL_H
|
||||
#define LIB_TREE_MODEL_H
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <wx/string.h>
|
||||
#include <lib_id.h>
|
||||
#include <lib_tree_item.h>
|
||||
|
||||
|
||||
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<std::unique_ptr<CMP_TREE_NODE>> PTR_VECTOR;
|
||||
typedef std::vector<std::unique_ptr<LIB_TREE_NODE>> 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
|
|
@ -19,7 +19,7 @@
|
|||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <cmp_tree_model_adapter_base.h>
|
||||
#include <lib_tree_model_adapter.h>
|
||||
|
||||
#include <eda_pattern_match.h>
|
||||
|
||||
|
@ -28,11 +28,7 @@
|
|||
#include <wx/wupdlock.h>
|
||||
|
||||
|
||||
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<void*>( static_cast<void const*>( 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<CMP_TREE_NODE const*>( aItem.GetID() );
|
||||
return static_cast<LIB_TREE_NODE const*>( 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<wxString>& 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<LIB_ALIAS*> const& aAliasList )
|
||||
void LIB_TREE_MODEL_ADAPTER::DoAddLibrary( wxString const& aNodeName, wxString const& aDesc,
|
||||
std::vector<LIB_TREE_ITEM*> 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<int> 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<bool( CMP_TREE_NODE const* )> aFunc,
|
||||
CMP_TREE_NODE** aHighScore )
|
||||
void LIB_TREE_MODEL_ADAPTER::FindAndExpand( LIB_TREE_NODE& aNode,
|
||||
std::function<bool( LIB_TREE_NODE const* )> 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 );
|
|
@ -19,12 +19,12 @@
|
|||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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 <lib_id.h>
|
||||
|
||||
#include <cmp_tree_model.h>
|
||||
#include <lib_tree_model.h>
|
||||
|
||||
#include <wx/hashmap.h>
|
||||
#include <wx/dataview.h>
|
||||
|
@ -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<CMP_TREE_MODEL_ADAPTER_BASE> PTR;
|
||||
typedef wxObjectDataPtr<LIB_TREE_MODEL_ADAPTER> 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<wxString>& 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<LIB_ALIAS*> const& aAliasList );
|
||||
void DoAddLibrary( wxString const& aNodeName, wxString const& aDesc,
|
||||
std::vector<LIB_TREE_ITEM*> 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<bool( CMP_TREE_NODE const* )> aFunc,
|
||||
CMP_TREE_NODE** aHighScore );
|
||||
void FindAndExpand( LIB_TREE_NODE& aNode,
|
||||
std::function<bool( LIB_TREE_NODE const* )> 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
|
||||
|
|
@ -22,8 +22,7 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "component_tree.h"
|
||||
#include <generate_alias_info.h>
|
||||
#include "lib_tree.h"
|
||||
#include <wxdataviewctrl_helpers.h>
|
||||
|
||||
#include <wx/artprov.h>
|
||||
|
@ -31,13 +30,13 @@
|
|||
#include <wx/statbmp.h>
|
||||
#include <wx/html/htmlwin.h>
|
||||
|
||||
#include <symbol_lib_table.h>
|
||||
#include <lib_table_base.h>
|
||||
|
||||
|
||||
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] )
|
||||
{
|
|
@ -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 <wx/panel.h>
|
||||
#include <cmp_tree_model_adapter.h>
|
||||
#include <lib_tree_model_adapter.h>
|
||||
|
||||
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<wxMenu> aMenu )
|
||||
void SetMenu( LIB_TREE_NODE::TYPE aType, std::unique_ptr<wxMenu> 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 */
|
|
@ -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() );
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#define CLASS_LIBENTRY_H
|
||||
|
||||
#include <general.h>
|
||||
#include <lib_id.h>
|
||||
#include <lib_tree_item.h>
|
||||
#include <lib_draw_item.h>
|
||||
#include <lib_field.h>
|
||||
#include <vector>
|
||||
|
@ -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
|
||||
{
|
||||
|
|
|
@ -1,98 +0,0 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2017 Chris Pavlina <pavlina.chris@gmail.com>
|
||||
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <cmp_tree_model_adapter.h>
|
||||
|
||||
#include <eda_pattern_match.h>
|
||||
#include <wx/tokenzr.h>
|
||||
#include <symbol_lib_table.h>
|
||||
#include <wx/progdlg.h>
|
||||
|
||||
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<LIB_ALIAS*> 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<LIB_ALIAS*> 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 );
|
||||
}
|
|
@ -40,7 +40,7 @@
|
|||
#include <sch_base_frame.h>
|
||||
#include <template_fieldnames.h>
|
||||
#include <symbol_lib_table.h>
|
||||
#include <widgets/component_tree.h>
|
||||
#include <widgets/lib_tree.h>
|
||||
#include <widgets/footprint_preview_widget.h>
|
||||
#include <widgets/footprint_select_widget.h>
|
||||
|
||||
|
@ -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 );
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#define DIALOG_CHOOSE_COMPONENT_H
|
||||
|
||||
#include "dialog_shim.h"
|
||||
#include <cmp_tree_model_adapter.h>
|
||||
#include <symbol_tree_model_adapter.h>
|
||||
#include <footprint_info.h>
|
||||
|
||||
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<std::pair<int, wxString>> 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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -45,20 +45,20 @@ static const wxString FieldFormat =
|
|||
static const wxString DatasheetLinkFormat = "<a href=\"__HREF__\">__TEXT__</a>";
|
||||
|
||||
|
||||
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();
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
#include <symbol_lib_table.h>
|
||||
|
||||
#include <dialog_choose_component.h>
|
||||
#include <cmp_tree_model_adapter.h>
|
||||
#include <symbol_tree_model_adapter.h>
|
||||
|
||||
|
||||
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<COMPONENT_SELECTION>& 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<SYMBOL_TREE_MODEL_ADAPTER*>( 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() )
|
||||
|
|
|
@ -48,8 +48,8 @@
|
|||
#include <lib_pin.h>
|
||||
|
||||
#include <lib_manager.h>
|
||||
#include <widgets/cmp_tree_pane.h>
|
||||
#include <widgets/component_tree.h>
|
||||
#include <widgets/symbol_tree_pane.h>
|
||||
#include <widgets/lib_tree.h>
|
||||
#include <symbol_lib_table.h>
|
||||
|
||||
#include <kicad_device_context.h>
|
||||
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#include <set>
|
||||
#include <memory>
|
||||
#include <wx/arrstr.h>
|
||||
#include <lib_manager_adapter.h>
|
||||
#include <symbol_tree_synchronizing_adapter.h>
|
||||
#include <sch_screen.h>
|
||||
|
||||
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<LIB_MANAGER_ADAPTER*>( m_adapter.get() ); }
|
||||
SYMBOL_TREE_SYNCHRONIZING_ADAPTER::PTR m_adapter;
|
||||
SYMBOL_TREE_SYNCHRONIZING_ADAPTER* getAdapter() { return static_cast<SYMBOL_TREE_SYNCHRONIZING_ADAPTER*>( m_adapter.get() ); }
|
||||
};
|
||||
|
||||
#endif /* LIB_MANAGER_H */
|
||||
|
|
|
@ -46,11 +46,11 @@
|
|||
#include <sch_edit_frame.h>
|
||||
#include <symbol_lib_table.h>
|
||||
#include <lib_manager.h>
|
||||
#include <cmp_tree_pane.h>
|
||||
#include <component_tree.h>
|
||||
#include <symbol_tree_pane.h>
|
||||
#include <widgets/lib_tree.h>
|
||||
|
||||
#include <dialog_choose_component.h>
|
||||
#include <cmp_tree_model_adapter.h>
|
||||
#include <symbol_tree_model_adapter.h>
|
||||
|
||||
#include <dialogs/dialog_lib_new_component.h>
|
||||
#include <dialog_helpers.h>
|
||||
|
@ -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() );
|
||||
}
|
||||
|
||||
|
|
|
@ -28,8 +28,8 @@
|
|||
#include <lib_edit_frame.h>
|
||||
#include <class_libentry.h>
|
||||
#include <lib_manager.h>
|
||||
#include <component_tree.h>
|
||||
#include <cmp_tree_pane.h>
|
||||
#include <widgets/lib_tree.h>
|
||||
#include <symbol_tree_pane.h>
|
||||
|
||||
|
||||
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 ) )
|
||||
|
|
|
@ -35,8 +35,8 @@
|
|||
#include <dialog_edit_one_field.h>
|
||||
|
||||
#include <lib_manager.h>
|
||||
#include <widgets/cmp_tree_pane.h>
|
||||
#include <component_tree.h>
|
||||
#include <widgets/symbol_tree_pane.h>
|
||||
#include <widgets/lib_tree.h>
|
||||
|
||||
|
||||
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 )
|
||||
|
|
|
@ -194,15 +194,15 @@ public:
|
|||
*
|
||||
* @return the selected component
|
||||
*/
|
||||
COMPONENT_SELECTION SelectComponentFromLibrary(
|
||||
const SCHLIB_FILTER* aFilter,
|
||||
std::vector<COMPONENT_SELECTION>& 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<COMPONENT_SELECTION>& aHistoryList,
|
||||
bool aUseLibBrowser,
|
||||
int aUnit,
|
||||
int aConvert,
|
||||
bool aShowFootprints,
|
||||
const LIB_ID* aHighlight = nullptr,
|
||||
bool aAllowFields = true );
|
||||
|
||||
void OnConfigurePaths( wxCommandEvent& aEvent );
|
||||
|
||||
|
|
|
@ -0,0 +1,117 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2017 Chris Pavlina <pavlina.chris@gmail.com>
|
||||
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <wx/tokenzr.h>
|
||||
#include <wx/progdlg.h>
|
||||
|
||||
#include <eda_pattern_match.h>
|
||||
#include <symbol_lib_table.h>
|
||||
#include <class_libentry.h>
|
||||
#include <generate_alias_info.h>
|
||||
|
||||
#include <symbol_tree_model_adapter.h>
|
||||
|
||||
|
||||
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<wxString>& 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<LIB_ALIAS*> alias_list;
|
||||
std::vector<LIB_TREE_ITEM*> 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 );
|
||||
}
|
|
@ -19,65 +19,55 @@
|
|||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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 <cmp_tree_model_adapter_base.h>
|
||||
#include <lib_tree_model_adapter.h>
|
||||
|
||||
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<CMP_TREE_MODEL_ADAPTER> 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<wxString>& 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
|
|
@ -22,42 +22,35 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <lib_manager_adapter.h>
|
||||
#include <symbol_tree_synchronizing_adapter.h>
|
||||
#include <lib_manager.h>
|
||||
#include <symbol_lib_table.h>
|
||||
#include <class_libentry.h>
|
||||
|
||||
|
||||
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<void(int, int, const wxString&)> aProgressCallback )
|
||||
void SYMBOL_TREE_SYNCHRONIZING_ADAPTER::Sync( bool aForce, std::function<void(int, int, const wxString&)> aProgressCallback )
|
||||
{
|
||||
wxLongLong nextUpdate = wxGetUTCTimeMillis() + (PROGRESS_INTERVAL_MILLIS / 2);
|
||||
|
||||
|
@ -87,7 +80,7 @@ void LIB_MANAGER_ADAPTER::Sync( bool aForce, std::function<void(int, int, const
|
|||
}
|
||||
else if( m_libMgr->GetLibraryHash( 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::function<void(int, int, const
|
|||
}
|
||||
|
||||
|
||||
int LIB_MANAGER_ADAPTER::GetLibrariesCount() const
|
||||
int SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetLibrariesCount() const
|
||||
{
|
||||
int count = CMP_TREE_MODEL_ADAPTER_BASE::GetLibrariesCount();
|
||||
int count = LIB_TREE_MODEL_ADAPTER::GetLibrariesCount();
|
||||
|
||||
for( const auto& libName : m_libMgr->GetLibraryNames() )
|
||||
{
|
||||
|
@ -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<CMP_TREE_NODE_LIB_ID*>( nodeIt->get() )->Update( *aliasIt );
|
||||
static_cast<LIB_TREE_NODE_LIB_ID*>( 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 )
|
||||
{
|
||||
}
|
|
@ -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 <cmp_tree_model_adapter_base.h>
|
||||
#include <lib_tree_model_adapter.h>
|
||||
#include <map>
|
||||
|
||||
class LIB_MANAGER;
|
||||
|
||||
class LIB_MANAGER_ADAPTER : public CMP_TREE_MODEL_ADAPTER_BASE
|
||||
class SYMBOL_TREE_SYNCHRONIZING_ADAPTER : public LIB_TREE_MODEL_ADAPTER
|
||||
{
|
||||
public:
|
||||
static PTR Create( LIB_MANAGER* aLibs );
|
||||
|
||||
void AddLibrary( const wxString& aLibNickname ) override;
|
||||
|
||||
void AddAliasList( const wxString& aNodeName, const wxArrayString& aAliasNameList ) override;
|
||||
|
||||
bool IsContainer( const wxDataViewItem& aItem ) const override;
|
||||
|
||||
void Sync( bool aForce = false, std::function<void(int, int, const wxString&)> aProgressCallback
|
||||
= [](int, int, const wxString&){} );
|
||||
void Sync( bool aForce = false,
|
||||
std::function<void(int, int, const wxString&)> aProgressCallback = [](int, int, const wxString&){} );
|
||||
|
||||
int GetLibrariesCount() const override;
|
||||
|
||||
protected:
|
||||
void updateLibrary( CMP_TREE_NODE_LIB& aLibNode );
|
||||
void updateLibrary( LIB_TREE_NODE_LIB& aLibNode );
|
||||
|
||||
CMP_TREE_NODE::PTR_VECTOR::iterator deleteLibrary(
|
||||
CMP_TREE_NODE::PTR_VECTOR::iterator& aLibNodeIt );
|
||||
LIB_TREE_NODE::PTR_VECTOR::iterator deleteLibrary( LIB_TREE_NODE::PTR_VECTOR::iterator& aLibNodeIt );
|
||||
|
||||
CMP_TREE_NODE* findLibrary( const wxString& aLibNickName );
|
||||
LIB_TREE_NODE* findLibrary( const wxString& aLibNickName );
|
||||
|
||||
void GetValue( wxVariant& aVariant, wxDataViewItem const& aItem,
|
||||
unsigned int aCol ) const override;
|
||||
unsigned int aCol ) const override;
|
||||
bool GetAttr( wxDataViewItem const& aItem, unsigned int aCol,
|
||||
wxDataViewItemAttr& aAttr ) const override;
|
||||
wxDataViewItemAttr& aAttr ) const override;
|
||||
|
||||
LIB_MANAGER_ADAPTER( LIB_MANAGER* aLibMgr );
|
||||
SYMBOL_TREE_SYNCHRONIZING_ADAPTER( LIB_MANAGER* aLibMgr );
|
||||
|
||||
LIB_MANAGER* m_libMgr;
|
||||
LIB_MANAGER* m_libMgr;
|
||||
|
||||
///> Hashes to decide whether a library needs an update
|
||||
std::map<wxString, int> m_libHashes;
|
||||
|
||||
///> LIB_MANAGER hash value returned in the last synchronization
|
||||
int m_lastSyncHash;
|
||||
int m_lastSyncHash;
|
||||
};
|
||||
|
||||
#endif /* LIB_MANAGER_ADAPTER_H */
|
||||
#endif /* SYMBOL_TREE_SYNCHRONIZING_ADAPTER_H */
|
|
@ -38,7 +38,7 @@
|
|||
#include <class_library.h>
|
||||
#include <dialog_helpers.h>
|
||||
#include <dialog_choose_component.h>
|
||||
#include <cmp_tree_model_adapter.h>
|
||||
#include <symbol_tree_model_adapter.h>
|
||||
#include <symbol_lib_table.h>
|
||||
|
||||
void LIB_VIEW_FRAME::OnSelectSymbol( wxCommandEvent& aEvent )
|
||||
|
@ -52,15 +52,15 @@ void LIB_VIEW_FRAME::OnSelectSymbol( wxCommandEvent& aEvent )
|
|||
return;
|
||||
|
||||
// Container doing search-as-you-type.
|
||||
auto adapter( CMP_TREE_MODEL_ADAPTER::Create( libs ) );
|
||||
auto adapterPtr( SYMBOL_TREE_MODEL_ADAPTER::Create( libs ) );
|
||||
auto adapter = static_cast<SYMBOL_TREE_MODEL_ADAPTER*>( adapterPtr.get() );
|
||||
|
||||
const auto libNicknames = libs->GetLogicalLibs();
|
||||
|
||||
adapter->AddLibrariesWithProgress( libNicknames, this );
|
||||
adapter->AddLibraries( libNicknames, this );
|
||||
|
||||
dialogTitle.Printf( _( "Choose Symbol (%d items loaded)" ),
|
||||
adapter->GetComponentsCount() );
|
||||
DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, adapter, m_convert, false, false );
|
||||
dialogTitle.Printf( _( "Choose Symbol (%d items loaded)" ), adapter->GetItemCount() );
|
||||
DIALOG_CHOOSE_COMPONENT dlg( this, dialogTitle, adapterPtr, m_convert, false, false, false );
|
||||
|
||||
if( dlg.ShowQuasiModal() == wxID_CANCEL )
|
||||
return;
|
||||
|
|
|
@ -22,9 +22,9 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "cmp_tree_pane.h"
|
||||
#include "symbol_tree_pane.h"
|
||||
|
||||
#include <component_tree.h>
|
||||
#include <widgets/lib_tree.h>
|
||||
#include <eeschema_id.h>
|
||||
#include <lib_manager.h>
|
||||
#include <lib_edit_frame.h>
|
||||
|
@ -32,14 +32,14 @@
|
|||
#include <menus_helpers.h>
|
||||
|
||||
|
||||
CMP_TREE_PANE::CMP_TREE_PANE( LIB_EDIT_FRAME* aParent, LIB_MANAGER* aLibMgr )
|
||||
SYMBOL_TREE_PANE::SYMBOL_TREE_PANE( LIB_EDIT_FRAME* aParent, LIB_MANAGER* aLibMgr )
|
||||
: wxPanel( aParent ),
|
||||
m_libEditFrame( aParent ), m_tree( nullptr ), m_libMgr( aLibMgr )
|
||||
{
|
||||
// Create widgets
|
||||
wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL );
|
||||
m_tree = new COMPONENT_TREE( this, &SYMBOL_LIB_TABLE::GetGlobalLibTable(),
|
||||
m_libMgr->GetAdapter(), COMPONENT_TREE::SEARCH );
|
||||
m_tree = new LIB_TREE( this, &SYMBOL_LIB_TABLE::GetGlobalLibTable(),
|
||||
m_libMgr->GetAdapter(), LIB_TREE::SEARCH );
|
||||
boxSizer->Add( m_tree, 1, wxEXPAND, 5 );
|
||||
|
||||
SetSizer( boxSizer ); // should remove the previous sizer according to wxWidgets docs
|
||||
|
@ -93,29 +93,29 @@ CMP_TREE_PANE::CMP_TREE_PANE( LIB_EDIT_FRAME* aParent, LIB_MANAGER* aLibMgr )
|
|||
AddMenuItem( menuNoSelection.get(), ID_LIBEDIT_ADD_LIBRARY, _( "&Add Library..." ),
|
||||
KiBitmap( add_library_xpm ) );
|
||||
|
||||
m_tree->SetMenu( CMP_TREE_NODE::LIBID, std::move( menuPart ) );
|
||||
m_tree->SetMenu( CMP_TREE_NODE::LIB, std::move( menuLibrary ) );
|
||||
m_tree->SetMenu( CMP_TREE_NODE::INVALID, std::move( menuNoSelection ) );
|
||||
m_tree->SetMenu( LIB_TREE_NODE::LIBID, std::move( menuPart ) );
|
||||
m_tree->SetMenu( LIB_TREE_NODE::LIB, std::move( menuLibrary ) );
|
||||
m_tree->SetMenu( LIB_TREE_NODE::INVALID, std::move( menuNoSelection ) );
|
||||
|
||||
// Event handlers
|
||||
Bind( COMPONENT_SELECTED, &CMP_TREE_PANE::onComponentSelected, this );
|
||||
Bind( COMPONENT_SELECTED, &SYMBOL_TREE_PANE::onComponentSelected, this );
|
||||
}
|
||||
|
||||
|
||||
CMP_TREE_PANE::~CMP_TREE_PANE()
|
||||
SYMBOL_TREE_PANE::~SYMBOL_TREE_PANE()
|
||||
{
|
||||
m_tree->Destroy();
|
||||
}
|
||||
|
||||
|
||||
void CMP_TREE_PANE::Regenerate()
|
||||
void SYMBOL_TREE_PANE::Regenerate()
|
||||
{
|
||||
if( m_tree )
|
||||
m_tree->Regenerate();
|
||||
}
|
||||
|
||||
|
||||
void CMP_TREE_PANE::onComponentSelected( wxCommandEvent& aEvent )
|
||||
void SYMBOL_TREE_PANE::onComponentSelected( wxCommandEvent& aEvent )
|
||||
{
|
||||
// Repost the event
|
||||
wxCommandEvent evt( ID_LIBEDIT_EDIT_PART );
|
|
@ -29,7 +29,7 @@
|
|||
#include <wx/dataview.h>
|
||||
#include <vector>
|
||||
|
||||
class COMPONENT_TREE;
|
||||
class LIB_TREE;
|
||||
class LIB_EDIT_FRAME;
|
||||
class LIB_MANAGER;
|
||||
class wxBoxSizer;
|
||||
|
@ -37,13 +37,13 @@ class wxBoxSizer;
|
|||
/**
|
||||
* Library Editor pane with component tree and symbol library table selector.
|
||||
*/
|
||||
class CMP_TREE_PANE : public wxPanel
|
||||
class SYMBOL_TREE_PANE : public wxPanel
|
||||
{
|
||||
public:
|
||||
CMP_TREE_PANE( LIB_EDIT_FRAME* aParent, LIB_MANAGER* aLibMgr );
|
||||
~CMP_TREE_PANE();
|
||||
SYMBOL_TREE_PANE( LIB_EDIT_FRAME* aParent, LIB_MANAGER* aLibMgr );
|
||||
~SYMBOL_TREE_PANE();
|
||||
|
||||
COMPONENT_TREE* GetCmpTree() const
|
||||
LIB_TREE* GetLibTree() const
|
||||
{
|
||||
return m_tree;
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ protected:
|
|||
void onComponentSelected( wxCommandEvent& aEvent );
|
||||
|
||||
LIB_EDIT_FRAME* m_libEditFrame;
|
||||
COMPONENT_TREE* m_tree; ///< component search tree widget
|
||||
LIB_TREE* m_tree; ///< component search tree widget
|
||||
LIB_MANAGER* m_libMgr;
|
||||
};
|
||||
|
|
@ -180,6 +180,16 @@ protected:
|
|||
|
||||
void CommonSettingsChanged() override;
|
||||
|
||||
/**
|
||||
* Function LibraryFileBrowser
|
||||
* @param doOpen if true runs an Open Library browser, otherwise New Library
|
||||
* @param aFilename for New may contain a default name; in both cases return the chosen
|
||||
* filename.
|
||||
* @return true for OK; false for Cancel.
|
||||
*/
|
||||
bool LibraryFileBrowser( bool doOpen, wxFileName& aFilename,
|
||||
const wxString& wildcard, const wxString& ext );
|
||||
|
||||
/**
|
||||
* Function GeneralControlKeyMovement
|
||||
* Handle the common part of GeneralControl dedicated to global
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2018 KiCad Developers, see change_log.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 2
|
||||
* 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, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LIB_TREE_ITEM_H
|
||||
#define LIB_TREE_ITEM_H
|
||||
|
||||
#include <base_struct.h>
|
||||
#include <lib_id.h>
|
||||
|
||||
|
||||
/**
|
||||
* A mix-in to provide polymorphism between items stored in libraries (symbols, aliases
|
||||
* and footprints).
|
||||
*
|
||||
* It is used primarily to drive the component tree for library browsing and editing.
|
||||
*/
|
||||
|
||||
class LIB_TREE_ITEM
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* For items having aliases, IsRoot() indicates the principal item.
|
||||
*/
|
||||
virtual bool IsRoot() const { return true; }
|
||||
|
||||
virtual LIB_ID GetLibId() const = 0;
|
||||
|
||||
virtual const wxString& GetName() const = 0;
|
||||
|
||||
virtual wxString GetDescription() { return wxEmptyString; }
|
||||
|
||||
virtual wxString GetSearchText() { return wxEmptyString; }
|
||||
|
||||
/**
|
||||
* For items with units, return the number of units.
|
||||
*/
|
||||
virtual int GetUnitCount() { return 0; }
|
||||
|
||||
/**
|
||||
* For items with units, return an identifier for unit x.
|
||||
*/
|
||||
virtual wxString GetUnitReference( int aUnit ) { return wxEmptyString; }
|
||||
};
|
||||
|
||||
#endif //LIB_TREE_ITEM_H
|
Loading…
Reference in New Issue