From 891cf783fbef33af27fa82e034fe7bb26e39ee72 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Wed, 15 Nov 2017 11:13:58 +0100 Subject: [PATCH] Library Editor: Windows fixes --- eeschema/lib_manager.cpp | 3 +- eeschema/lib_manager_adapter.cpp | 44 ++++++++++++++++-------------- eeschema/lib_manager_adapter.h | 2 ++ eeschema/widgets/cmp_tree_pane.cpp | 2 ++ 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/eeschema/lib_manager.cpp b/eeschema/lib_manager.cpp index 4a02b975b0..072e71f248 100644 --- a/eeschema/lib_manager.cpp +++ b/eeschema/lib_manager.cpp @@ -38,8 +38,7 @@ LIB_MANAGER::LIB_MANAGER( LIB_EDIT_FRAME& aFrame ) : m_frame( aFrame ), m_symbolTable( aFrame.Prj().SchSymbolLibTable() ) { m_adapter = LIB_MANAGER_ADAPTER::Create( this ); - m_adapter->ShowUnits( true ); - Sync(); + m_adapter->ShowUnits( false ); } diff --git a/eeschema/lib_manager_adapter.cpp b/eeschema/lib_manager_adapter.cpp index 9243d79202..eb09efbc20 100644 --- a/eeschema/lib_manager_adapter.cpp +++ b/eeschema/lib_manager_adapter.cpp @@ -40,6 +40,7 @@ void LIB_MANAGER_ADAPTER::AddLibrary( const wxString& aLibNickname ) auto& lib_node = m_tree.AddLib( aLibNickname ); ItemAdded( wxDataViewItem( nullptr ), ToItem( &lib_node ) ); updateLibrary( lib_node ); + finishUpdate(); } @@ -61,7 +62,7 @@ void LIB_MANAGER_ADAPTER::UpdateLibrary( const wxString& aLibraryName ) return; 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 ) { + wxBusyCursor cursor; int libMgrHash = m_libMgr->GetHash(); if( !aForce && m_lastSyncHash == libMgrHash ) @@ -113,8 +115,7 @@ void LIB_MANAGER_ADAPTER::Sync( bool aForce ) AddLibrary( libName ); } - m_tree.AssignIntrinsicRanks(); - Resort(); + finishUpdate(); } @@ -123,12 +124,17 @@ void LIB_MANAGER_ADAPTER::updateLibrary( CMP_TREE_NODE_LIB& aLibNode ) if( m_libHashes.count( aLibNode.Name ) == 0 ) { // 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 { // update an existing libary -#if 1 std::list aliases = m_libMgr->GetAliases( aLibNode.Name ); wxDataViewItem parent = ToItem( &aLibNode ); @@ -162,16 +168,6 @@ void LIB_MANAGER_ADAPTER::updateLibrary( CMP_TREE_NODE_LIB& aLibNode ) auto& aliasNode = aLibNode.AddAlias( alias ); 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(); @@ -192,13 +188,19 @@ CMP_TREE_NODE::PTR_VECTOR::iterator LIB_MANAGER_ADAPTER::deleteLibrary( void LIB_MANAGER_ADAPTER::addAliases( CMP_TREE_NODE_LIB& aLibNode ) { - wxDataViewItem parent = ToItem( &aLibNode ); +} - for( auto alias : m_libMgr->GetAliases( aLibNode.Name ) ) - { - auto& aliasNode = aLibNode.AddAlias( alias ); - ItemAdded( parent, ToItem( &aliasNode ) ); - } + +void LIB_MANAGER_ADAPTER::finishUpdate() +{ + 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(); } diff --git a/eeschema/lib_manager_adapter.h b/eeschema/lib_manager_adapter.h index 074cd1e149..9abff01afe 100644 --- a/eeschema/lib_manager_adapter.h +++ b/eeschema/lib_manager_adapter.h @@ -55,6 +55,8 @@ protected: void addAliases( CMP_TREE_NODE_LIB& aLibNode ); + void finishUpdate(); + CMP_TREE_NODE* findLibrary( const wxString& aLibNickName ); bool GetAttr( wxDataViewItem const& aItem, unsigned int aCol, diff --git a/eeschema/widgets/cmp_tree_pane.cpp b/eeschema/widgets/cmp_tree_pane.cpp index bc2524f595..41f79e732a 100644 --- a/eeschema/widgets/cmp_tree_pane.cpp +++ b/eeschema/widgets/cmp_tree_pane.cpp @@ -38,8 +38,10 @@ CMP_TREE_PANE::CMP_TREE_PANE( LIB_EDIT_FRAME* aParent, LIB_MANAGER* aLibMgr ) // Create widgets wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL ); + m_libMgr->Sync(); m_tree = new COMPONENT_TREE( this, &SYMBOL_LIB_TABLE::GetGlobalLibTable(), m_libMgr->GetAdapter(), COMPONENT_TREE::SEARCH ); + boxSizer->Add( m_tree, 1, wxEXPAND | wxALL, 5 ); SetSizer( boxSizer );