Browse Source

Allow deletion of nested embedded files.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20581

(cherry picked from commit ea84879b06)
9.0
Jeff Young 3 months ago
parent
commit
1eefb2b70a
  1. 47
      common/dialogs/panel_embedded_files.cpp
  2. 12
      eeschema/schematic.cpp
  3. 2
      eeschema/schematic.h
  4. 8
      include/embedded_files.h
  5. 34
      pcbnew/board.cpp
  6. 2
      pcbnew/board.h

47
common/dialogs/panel_embedded_files.cpp

@ -21,6 +21,8 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <eda_item.h>
#include <confirm.h>
#include <bitmaps.h>
#include <dialogs/panel_embedded_files.h>
#include <embedded_files.h>
@ -187,6 +189,51 @@ bool PANEL_EMBEDDED_FILES::TransferDataToWindow()
bool PANEL_EMBEDDED_FILES::TransferDataFromWindow()
{
std::optional<bool> deleteReferences;
auto confirmDelete =
[&]() -> bool
{
if( EDA_ITEM* parent = dynamic_cast<EDA_ITEM*>( m_files ) )
{
if( parent->Type() == PCB_T )
{
return IsOK( m_parent, _( "Deleted embedded files are also referenced in some footprints.\n"
"Delete from footprints as well?" ) );
}
else if( parent->Type() == SCHEMATIC_T )
{
return IsOK( m_parent, _( "Deleted embedded files are also referenced in some symbols.\n"
"Delete from symbols as well?" ) );
}
}
wxFAIL_MSG( wxT( "Unexpected embedded files owner" ) );
return false;
};
for( const auto& [name, file] : m_files->EmbeddedFileMap() )
{
if( !m_localFiles->HasFile( name ) )
{
m_files->RunOnNestedEmbeddedFiles(
[&]( EMBEDDED_FILES* nested_files )
{
if( nested_files->HasFile( name ) )
{
if( !deleteReferences.has_value() )
deleteReferences = confirmDelete();
if( deleteReferences.value() )
nested_files->RemoveFile( name, true );
}
} );
}
if( deleteReferences.has_value() && deleteReferences.value() == false )
break;
}
m_files->ClearEmbeddedFiles();
std::vector<EMBEDDED_FILES::EMBEDDED_FILE*> files;

12
eeschema/schematic.cpp

@ -913,6 +913,18 @@ const EMBEDDED_FILES* SCHEMATIC::GetEmbeddedFiles() const
}
void SCHEMATIC::RunOnNestedEmbeddedFiles( const std::function<void( EMBEDDED_FILES* )>& aFunction )
{
SCH_SCREENS screens( Root() );
for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() )
{
for( auto& [name, libSym] : screen->GetLibSymbols() )
aFunction( libSym->GetEmbeddedFiles() );
}
}
std::set<KIFONT::OUTLINE_FONT*> SCHEMATIC::GetFonts() const
{
std::set<KIFONT::OUTLINE_FONT*> fonts;

2
eeschema/schematic.h

@ -376,6 +376,8 @@ public:
*/
void RemoveAllListeners();
void RunOnNestedEmbeddedFiles( const std::function<void( EMBEDDED_FILES* )>& aFunction ) override;
/**
* Embed fonts in the schematic.
*/

8
include/embedded_files.h

@ -175,6 +175,14 @@ public:
return m_files.empty();
}
/**
* Provide access to nested embedded files, such as symbols in schematics and footprints in
* boards.
*/
virtual void RunOnNestedEmbeddedFiles( const std::function<void( EMBEDDED_FILES* )>& aFunction )
{
}
/**
* Helper function to get a list of fonts for fontconfig to add to the library.
*

34
pcbnew/board.cpp

@ -1110,23 +1110,31 @@ void BOARD::CacheTriangulation( PROGRESS_REPORTER* aReporter, const std::vector<
}
void BOARD::FixupEmbeddedData()
void BOARD::RunOnNestedEmbeddedFiles( const std::function<void( EMBEDDED_FILES* )>& aFunction )
{
for( FOOTPRINT* footprint : m_footprints )
{
for( auto& [filename, embeddedFile] : footprint->EmbeddedFileMap() )
{
EMBEDDED_FILES::EMBEDDED_FILE* file = GetEmbeddedFile( filename );
aFunction( footprint->GetEmbeddedFiles() );
}
if( file )
void BOARD::FixupEmbeddedData()
{
RunOnNestedEmbeddedFiles(
[&]( EMBEDDED_FILES* nested )
{
embeddedFile->compressedEncodedData = file->compressedEncodedData;
embeddedFile->decompressedData = file->decompressedData;
embeddedFile->data_hash = file->data_hash;
embeddedFile->is_valid = file->is_valid;
}
}
}
for( auto& [filename, embeddedFile] : nested->EmbeddedFileMap() )
{
EMBEDDED_FILES::EMBEDDED_FILE* file = GetEmbeddedFile( filename );
if( file )
{
embeddedFile->compressedEncodedData = file->compressedEncodedData;
embeddedFile->decompressedData = file->decompressedData;
embeddedFile->data_hash = file->data_hash;
embeddedFile->is_valid = file->is_valid;
}
}
} );
}

2
pcbnew/board.h

@ -449,6 +449,8 @@ public:
*/
void FixupEmbeddedData();
void RunOnNestedEmbeddedFiles( const std::function<void( EMBEDDED_FILES* )>& aFunction ) override;
void CacheTriangulation( PROGRESS_REPORTER* aReporter = nullptr,
const std::vector<ZONE*>& aZones = {} );

Loading…
Cancel
Save