Library Editor: Windows fixes

This commit is contained in:
Maciej Suminski 2017-11-15 11:13:58 +01:00
parent 07c104af63
commit 891cf783fb
4 changed files with 28 additions and 23 deletions

View File

@ -38,8 +38,7 @@ LIB_MANAGER::LIB_MANAGER( LIB_EDIT_FRAME& aFrame )
: m_frame( aFrame ), m_symbolTable( aFrame.Prj().SchSymbolLibTable() ) : m_frame( aFrame ), m_symbolTable( aFrame.Prj().SchSymbolLibTable() )
{ {
m_adapter = LIB_MANAGER_ADAPTER::Create( this ); m_adapter = LIB_MANAGER_ADAPTER::Create( this );
m_adapter->ShowUnits( true ); m_adapter->ShowUnits( false );
Sync();
} }

View File

@ -40,6 +40,7 @@ void LIB_MANAGER_ADAPTER::AddLibrary( const wxString& aLibNickname )
auto& lib_node = m_tree.AddLib( aLibNickname ); auto& lib_node = m_tree.AddLib( aLibNickname );
ItemAdded( wxDataViewItem( nullptr ), ToItem( &lib_node ) ); ItemAdded( wxDataViewItem( nullptr ), ToItem( &lib_node ) );
updateLibrary( lib_node ); updateLibrary( lib_node );
finishUpdate();
} }
@ -61,7 +62,7 @@ void LIB_MANAGER_ADAPTER::UpdateLibrary( const wxString& aLibraryName )
return; return;
updateLibrary( *(CMP_TREE_NODE_LIB*) node ); updateLibrary( *(CMP_TREE_NODE_LIB*) node );
Resort(); finishUpdate();
} }
@ -81,6 +82,7 @@ bool LIB_MANAGER_ADAPTER::IsContainer( const wxDataViewItem& aItem ) const
void LIB_MANAGER_ADAPTER::Sync( bool aForce ) void LIB_MANAGER_ADAPTER::Sync( bool aForce )
{ {
wxBusyCursor cursor;
int libMgrHash = m_libMgr->GetHash(); int libMgrHash = m_libMgr->GetHash();
if( !aForce && m_lastSyncHash == libMgrHash ) if( !aForce && m_lastSyncHash == libMgrHash )
@ -113,8 +115,7 @@ void LIB_MANAGER_ADAPTER::Sync( bool aForce )
AddLibrary( libName ); AddLibrary( libName );
} }
m_tree.AssignIntrinsicRanks(); finishUpdate();
Resort();
} }
@ -123,12 +124,17 @@ void LIB_MANAGER_ADAPTER::updateLibrary( CMP_TREE_NODE_LIB& aLibNode )
if( m_libHashes.count( aLibNode.Name ) == 0 ) if( m_libHashes.count( aLibNode.Name ) == 0 )
{ {
// add a new library // add a new library
addAliases( aLibNode ); wxDataViewItem parent = ToItem( &aLibNode );
for( auto alias : m_libMgr->GetAliases( aLibNode.Name ) )
{
auto& aliasNode = aLibNode.AddAlias( alias );
ItemAdded( parent, ToItem( &aliasNode ) );
}
} }
else else
{ {
// update an existing libary // update an existing libary
#if 1
std::list<LIB_ALIAS*> aliases = m_libMgr->GetAliases( aLibNode.Name ); std::list<LIB_ALIAS*> aliases = m_libMgr->GetAliases( aLibNode.Name );
wxDataViewItem parent = ToItem( &aLibNode ); wxDataViewItem parent = ToItem( &aLibNode );
@ -162,16 +168,6 @@ void LIB_MANAGER_ADAPTER::updateLibrary( CMP_TREE_NODE_LIB& aLibNode )
auto& aliasNode = aLibNode.AddAlias( alias ); auto& aliasNode = aLibNode.AddAlias( alias );
ItemAdded( parent, ToItem( &aliasNode ) ); ItemAdded( parent, ToItem( &aliasNode ) );
} }
#else
// Bruteforce approach - remove everything and rebuild the branch
wxDataViewItem parent = ToItem( &aLibNode );
for( const auto& node : aLibNode.Children )
ItemDeleted( parent, ToItem( node.get() ) );
aLibNode.Children.clear();
addAliases( aLibNode );
#endif
} }
aLibNode.AssignIntrinsicRanks(); aLibNode.AssignIntrinsicRanks();
@ -192,13 +188,19 @@ CMP_TREE_NODE::PTR_VECTOR::iterator LIB_MANAGER_ADAPTER::deleteLibrary(
void LIB_MANAGER_ADAPTER::addAliases( CMP_TREE_NODE_LIB& aLibNode ) void LIB_MANAGER_ADAPTER::addAliases( CMP_TREE_NODE_LIB& aLibNode )
{ {
wxDataViewItem parent = ToItem( &aLibNode ); }
for( auto alias : m_libMgr->GetAliases( aLibNode.Name ) )
{ void LIB_MANAGER_ADAPTER::finishUpdate()
auto& aliasNode = aLibNode.AddAlias( alias ); {
ItemAdded( parent, ToItem( &aliasNode ) ); m_tree.AssignIntrinsicRanks();
} #ifdef __WINDOWS__
// Normally one would call Item{Added,Changed,Deleted}() to notify the view
// about changes, but ItemAdded() causes duplicate entries on Windows.
// The only sensible way is to call Cleared() that rebuilds the model.
Cleared();
#endif /* __WINDOWS__ */
Resort();
} }

View File

@ -55,6 +55,8 @@ protected:
void addAliases( CMP_TREE_NODE_LIB& aLibNode ); void addAliases( CMP_TREE_NODE_LIB& aLibNode );
void finishUpdate();
CMP_TREE_NODE* findLibrary( const wxString& aLibNickName ); CMP_TREE_NODE* findLibrary( const wxString& aLibNickName );
bool GetAttr( wxDataViewItem const& aItem, unsigned int aCol, bool GetAttr( wxDataViewItem const& aItem, unsigned int aCol,

View File

@ -38,8 +38,10 @@ CMP_TREE_PANE::CMP_TREE_PANE( LIB_EDIT_FRAME* aParent, LIB_MANAGER* aLibMgr )
// Create widgets // Create widgets
wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL );
m_libMgr->Sync();
m_tree = new COMPONENT_TREE( this, &SYMBOL_LIB_TABLE::GetGlobalLibTable(), m_tree = new COMPONENT_TREE( this, &SYMBOL_LIB_TABLE::GetGlobalLibTable(),
m_libMgr->GetAdapter(), COMPONENT_TREE::SEARCH ); m_libMgr->GetAdapter(), COMPONENT_TREE::SEARCH );
boxSizer->Add( m_tree, 1, wxEXPAND | wxALL, 5 ); boxSizer->Add( m_tree, 1, wxEXPAND | wxALL, 5 );
SetSizer( boxSizer ); SetSizer( boxSizer );