mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 02:03:12 +02:00
design blocks: cross-editor notification of library actions
This commit is contained in:
parent
97aa507dd4
commit
9389a2b7c5
@ -293,6 +293,9 @@ DESIGN_BLOCK* DESIGN_BLOCK_IO::DesignBlockLoad( const wxString& aLibraryPath,
|
|||||||
wxString dbPcbPath = dbPath + aDesignBlockName + wxT( "." ) + FILEEXT::KiCadPcbFileExtension;
|
wxString dbPcbPath = dbPath + aDesignBlockName + wxT( "." ) + FILEEXT::KiCadPcbFileExtension;
|
||||||
wxString dbMetadataPath = dbPath + aDesignBlockName + wxT( "." ) + FILEEXT::JsonFileExtension;
|
wxString dbMetadataPath = dbPath + aDesignBlockName + wxT( "." ) + FILEEXT::JsonFileExtension;
|
||||||
|
|
||||||
|
if( !wxDir::Exists( dbPath ) )
|
||||||
|
THROW_IO_ERROR( wxString::Format( _( "Design block '%s' does not exist." ), dbPath ) );
|
||||||
|
|
||||||
DESIGN_BLOCK* newDB = new DESIGN_BLOCK();
|
DESIGN_BLOCK* newDB = new DESIGN_BLOCK();
|
||||||
|
|
||||||
// Library name needs to be empty for when we fill it in with the correct library nickname
|
// Library name needs to be empty for when we fill it in with the correct library nickname
|
||||||
@ -339,16 +342,27 @@ DESIGN_BLOCK* DESIGN_BLOCK_IO::DesignBlockLoad( const wxString& aLibraryPath,
|
|||||||
}
|
}
|
||||||
catch( ... )
|
catch( ... )
|
||||||
{
|
{
|
||||||
|
delete newDB;
|
||||||
THROW_IO_ERROR( wxString::Format(
|
THROW_IO_ERROR( wxString::Format(
|
||||||
_( "Design block metadata file '%s' could not be read." ), dbMetadataPath ) );
|
_( "Design block metadata file '%s' could not be read." ), dbMetadataPath ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return newDB;
|
return newDB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool DESIGN_BLOCK_IO::DesignBlockExists( const wxString& aLibraryPath,
|
||||||
|
const wxString& aDesignBlockName,
|
||||||
|
const std::map<std::string, UTF8>* aProperties )
|
||||||
|
{
|
||||||
|
wxString dbPath = aLibraryPath + wxFileName::GetPathSeparator() + aDesignBlockName + wxT( "." )
|
||||||
|
+ FILEEXT::KiCadDesignBlockPathExtension + wxFileName::GetPathSeparator();
|
||||||
|
|
||||||
|
return wxDir::Exists( dbPath );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DESIGN_BLOCK_IO::DesignBlockSave( const wxString& aLibraryPath,
|
void DESIGN_BLOCK_IO::DesignBlockSave( const wxString& aLibraryPath,
|
||||||
const DESIGN_BLOCK* aDesignBlock,
|
const DESIGN_BLOCK* aDesignBlock,
|
||||||
const std::map<std::string, UTF8>* aProperties )
|
const std::map<std::string, UTF8>* aProperties )
|
||||||
|
@ -76,10 +76,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool DesignBlockExists( const wxString& aLibraryPath, const wxString& aDesignBlockName,
|
bool DesignBlockExists( const wxString& aLibraryPath, const wxString& aDesignBlockName,
|
||||||
const std::map<std::string, UTF8>* aProperties = nullptr )
|
const std::map<std::string, UTF8>* aProperties = nullptr );
|
||||||
{
|
|
||||||
return DesignBlockLoad( aLibraryPath, aDesignBlockName, true, aProperties ) != nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
DESIGN_BLOCK* ImportDesignBlock( const wxString& aDesignBlockPath,
|
DESIGN_BLOCK* ImportDesignBlock( const wxString& aDesignBlockPath,
|
||||||
wxString& aDesignBlockNameOut,
|
wxString& aDesignBlockNameOut,
|
||||||
|
@ -26,6 +26,8 @@
|
|||||||
#include <widgets/design_block_pane.h>
|
#include <widgets/design_block_pane.h>
|
||||||
#include <widgets/panel_design_block_chooser.h>
|
#include <widgets/panel_design_block_chooser.h>
|
||||||
#include <dialog_design_block_properties.h>
|
#include <dialog_design_block_properties.h>
|
||||||
|
#include <mail_type.h>
|
||||||
|
#include <kiway.h>
|
||||||
|
|
||||||
|
|
||||||
DESIGN_BLOCK_CONTROL::~DESIGN_BLOCK_CONTROL()
|
DESIGN_BLOCK_CONTROL::~DESIGN_BLOCK_CONTROL()
|
||||||
@ -88,9 +90,12 @@ int DESIGN_BLOCK_CONTROL::PinLibrary( const TOOL_EVENT& aEvent )
|
|||||||
PROJECT::LIB_TYPE_T::DESIGN_BLOCK_LIB );
|
PROJECT::LIB_TYPE_T::DESIGN_BLOCK_LIB );
|
||||||
current->m_Pinned = true;
|
current->m_Pinned = true;
|
||||||
getDesignBlockPane()->RefreshLibs();
|
getDesignBlockPane()->RefreshLibs();
|
||||||
|
notifyOtherFrames();
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -104,17 +109,24 @@ int DESIGN_BLOCK_CONTROL::UnpinLibrary( const TOOL_EVENT& aEvent )
|
|||||||
PROJECT::LIB_TYPE_T::DESIGN_BLOCK_LIB );
|
PROJECT::LIB_TYPE_T::DESIGN_BLOCK_LIB );
|
||||||
current->m_Pinned = false;
|
current->m_Pinned = false;
|
||||||
getDesignBlockPane()->RefreshLibs();
|
getDesignBlockPane()->RefreshLibs();
|
||||||
|
notifyOtherFrames();
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int DESIGN_BLOCK_CONTROL::NewLibrary( const TOOL_EVENT& aEvent )
|
int DESIGN_BLOCK_CONTROL::NewLibrary( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
getDesignBlockPane()->CreateNewDesignBlockLibrary();
|
if( getDesignBlockPane()->CreateNewDesignBlockLibrary() != wxEmptyString )
|
||||||
|
{
|
||||||
|
notifyOtherFrames();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -125,9 +137,13 @@ int DESIGN_BLOCK_CONTROL::DeleteDesignBlock( const TOOL_EVENT& aEvent )
|
|||||||
if( !current )
|
if( !current )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
getDesignBlockPane()->DeleteDesignBlockFromLibrary( current->m_LibId, true );
|
if( getDesignBlockPane()->DeleteDesignBlockFromLibrary( current->m_LibId, true ) )
|
||||||
|
{
|
||||||
|
notifyOtherFrames();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -139,7 +155,10 @@ int DESIGN_BLOCK_CONTROL::EditDesignBlockProperties( const TOOL_EVENT& aEvent )
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if( getDesignBlockPane()->EditDesignBlockProperties( current->m_LibId ) )
|
if( getDesignBlockPane()->EditDesignBlockProperties( current->m_LibId ) )
|
||||||
|
{
|
||||||
|
notifyOtherFrames();
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -190,3 +209,12 @@ LIB_TREE_NODE* DESIGN_BLOCK_CONTROL::getCurrentTreeNode()
|
|||||||
LIB_TREE* libTree = getDesignBlockPane()->GetDesignBlockPanel()->GetLibTree();
|
LIB_TREE* libTree = getDesignBlockPane()->GetDesignBlockPanel()->GetLibTree();
|
||||||
return libTree ? libTree->GetCurrentTreeNode() : nullptr;
|
return libTree ? libTree->GetCurrentTreeNode() : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DESIGN_BLOCK_CONTROL::notifyOtherFrames()
|
||||||
|
{
|
||||||
|
std::string payload = "";
|
||||||
|
|
||||||
|
for( FRAME_T frame : m_framesToNotify )
|
||||||
|
m_frame->Kiway().ExpressMail( frame, MAIL_RELOAD_LIB, payload );
|
||||||
|
}
|
||||||
|
@ -66,6 +66,10 @@ protected:
|
|||||||
virtual DESIGN_BLOCK_PANE* getDesignBlockPane() = 0;
|
virtual DESIGN_BLOCK_PANE* getDesignBlockPane() = 0;
|
||||||
LIB_TREE_NODE* getCurrentTreeNode();
|
LIB_TREE_NODE* getCurrentTreeNode();
|
||||||
|
|
||||||
|
/// Notify other frames that the design block lib table has changed
|
||||||
|
std::vector<FRAME_T> m_framesToNotify;
|
||||||
|
void notifyOtherFrames();
|
||||||
|
|
||||||
EDA_DRAW_FRAME* m_frame = nullptr;
|
EDA_DRAW_FRAME* m_frame = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -57,14 +57,14 @@ bool checkOverwrite( wxWindow* aFrame, wxString& libname, wxString& newName )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_EDIT_FRAME::SaveSheetAsDesignBlock( const wxString& aLibraryName,
|
bool SCH_EDIT_FRAME::SaveSheetAsDesignBlock( const wxString& aLibraryName,
|
||||||
SCH_SHEET_PATH& aSheetPath )
|
SCH_SHEET_PATH& aSheetPath )
|
||||||
{
|
{
|
||||||
// Make sure the user has selected a library to save into
|
// Make sure the user has selected a library to save into
|
||||||
if( m_designBlocksPane->GetSelectedLibId().GetLibNickname().empty() )
|
if( m_designBlocksPane->GetSelectedLibId().GetLibNickname().empty() )
|
||||||
{
|
{
|
||||||
DisplayErrorMessage( this, _( "Please select a library to save the design block to." ) );
|
DisplayErrorMessage( this, _( "Please select a library to save the design block to." ) );
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Just block all attempts to create design blocks with nested sheets at this point
|
// Just block all attempts to create design blocks with nested sheets at this point
|
||||||
@ -74,7 +74,7 @@ void SCH_EDIT_FRAME::SaveSheetAsDesignBlock( const wxString& aLibraryName,
|
|||||||
if( !sheets.empty() )
|
if( !sheets.empty() )
|
||||||
{
|
{
|
||||||
DisplayErrorMessage( this, _( "Design blocks with nested sheets are not supported." ) );
|
DisplayErrorMessage( this, _( "Design blocks with nested sheets are not supported." ) );
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DESIGN_BLOCK blk;
|
DESIGN_BLOCK blk;
|
||||||
@ -99,7 +99,16 @@ void SCH_EDIT_FRAME::SaveSheetAsDesignBlock( const wxString& aLibraryName,
|
|||||||
DIALOG_DESIGN_BLOCK_PROPERTIES dlg( this, &blk );
|
DIALOG_DESIGN_BLOCK_PROPERTIES dlg( this, &blk );
|
||||||
|
|
||||||
if( dlg.ShowModal() != wxID_OK )
|
if( dlg.ShowModal() != wxID_OK )
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
|
wxString libName = blk.GetLibId().GetLibNickname();
|
||||||
|
wxString newName = blk.GetLibId().GetLibItemName();
|
||||||
|
|
||||||
|
if( Prj().DesignBlockLibs()->DesignBlockExists( libName, newName )
|
||||||
|
&& !checkOverwrite( this, libName, newName ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Save a temporary copy of the schematic file, as the plugin is just going to move it
|
// Save a temporary copy of the schematic file, as the plugin is just going to move it
|
||||||
wxString tempFile = wxFileName::CreateTempFileName( "design_block" );
|
wxString tempFile = wxFileName::CreateTempFileName( "design_block" );
|
||||||
@ -107,21 +116,16 @@ void SCH_EDIT_FRAME::SaveSheetAsDesignBlock( const wxString& aLibraryName,
|
|||||||
{
|
{
|
||||||
DisplayErrorMessage( this, _( "Error saving temporary schematic file to create design block." ) );
|
DisplayErrorMessage( this, _( "Error saving temporary schematic file to create design block." ) );
|
||||||
wxRemoveFile( tempFile );
|
wxRemoveFile( tempFile );
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
blk.SetSchematicFile( tempFile );
|
blk.SetSchematicFile( tempFile );
|
||||||
|
|
||||||
|
bool success = false;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
wxString libName = blk.GetLibId().GetLibNickname();
|
success = Prj().DesignBlockLibs()->DesignBlockSave( aLibraryName, &blk )
|
||||||
wxString newName = blk.GetLibId().GetLibItemName();
|
== DESIGN_BLOCK_LIB_TABLE::SAVE_OK;
|
||||||
|
|
||||||
if( Prj().DesignBlockLibs()->DesignBlockExists( libName, newName ) )
|
|
||||||
if( !checkOverwrite( this, libName, newName ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
Prj().DesignBlockLibs()->DesignBlockSave( aLibraryName, &blk );
|
|
||||||
}
|
}
|
||||||
catch( const IO_ERROR& ioe )
|
catch( const IO_ERROR& ioe )
|
||||||
{
|
{
|
||||||
@ -133,25 +137,27 @@ void SCH_EDIT_FRAME::SaveSheetAsDesignBlock( const wxString& aLibraryName,
|
|||||||
|
|
||||||
m_designBlocksPane->RefreshLibs();
|
m_designBlocksPane->RefreshLibs();
|
||||||
m_designBlocksPane->SelectLibId( blk.GetLibId() );
|
m_designBlocksPane->SelectLibId( blk.GetLibId() );
|
||||||
|
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
bool SCH_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
||||||
{
|
{
|
||||||
// Make sure the user has selected a library to save into
|
|
||||||
if( m_designBlocksPane->GetSelectedLibId().GetLibNickname().empty() )
|
|
||||||
{
|
|
||||||
DisplayErrorMessage( this, _( "Please select a library to save the design block to." ) );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all selected items
|
// Get all selected items
|
||||||
EE_SELECTION selection = m_toolManager->GetTool<EE_SELECTION_TOOL>()->GetSelection();
|
EE_SELECTION selection = m_toolManager->GetTool<EE_SELECTION_TOOL>()->GetSelection();
|
||||||
|
|
||||||
if( selection.Empty() )
|
if( selection.Empty() )
|
||||||
{
|
{
|
||||||
DisplayErrorMessage( this, _( "Please select some items to save as a design block." ) );
|
DisplayErrorMessage( this, _( "Please select some items to save as a design block." ) );
|
||||||
return;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the user has selected a library to save into
|
||||||
|
if( m_designBlocksPane->GetSelectedLibId().GetLibNickname().empty() )
|
||||||
|
{
|
||||||
|
DisplayErrorMessage( this, _( "Please select a library to save the design block to." ) );
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Just block all attempts to create design blocks with nested sheets at this point
|
// Just block all attempts to create design blocks with nested sheets at this point
|
||||||
@ -168,7 +174,7 @@ void SCH_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
|||||||
else
|
else
|
||||||
DisplayErrorMessage( this, _( "Design blocks with nested sheets are not supported." ) );
|
DisplayErrorMessage( this, _( "Design blocks with nested sheets are not supported." ) );
|
||||||
|
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DESIGN_BLOCK blk;
|
DESIGN_BLOCK blk;
|
||||||
@ -179,7 +185,16 @@ void SCH_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
|||||||
DIALOG_DESIGN_BLOCK_PROPERTIES dlg( this, &blk );
|
DIALOG_DESIGN_BLOCK_PROPERTIES dlg( this, &blk );
|
||||||
|
|
||||||
if( dlg.ShowModal() != wxID_OK )
|
if( dlg.ShowModal() != wxID_OK )
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
|
wxString libName = blk.GetLibId().GetLibNickname();
|
||||||
|
wxString newName = blk.GetLibId().GetLibItemName();
|
||||||
|
|
||||||
|
if( Prj().DesignBlockLibs()->DesignBlockExists( libName, newName )
|
||||||
|
&& !checkOverwrite( this, libName, newName ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Create a temporary screen
|
// Create a temporary screen
|
||||||
SCH_SCREEN* tempScreen = new SCH_SCREEN( m_schematic );
|
SCH_SCREEN* tempScreen = new SCH_SCREEN( m_schematic );
|
||||||
@ -201,21 +216,16 @@ void SCH_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
|||||||
{
|
{
|
||||||
DisplayErrorMessage( this, _( "Error saving temporary schematic file to create design block." ) );
|
DisplayErrorMessage( this, _( "Error saving temporary schematic file to create design block." ) );
|
||||||
wxRemoveFile( tempFile );
|
wxRemoveFile( tempFile );
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
blk.SetSchematicFile( tempFile );
|
blk.SetSchematicFile( tempFile );
|
||||||
|
|
||||||
|
bool success = false;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
wxString libName = blk.GetLibId().GetLibNickname();
|
success = Prj().DesignBlockLibs()->DesignBlockSave( aLibraryName, &blk )
|
||||||
wxString newName = blk.GetLibId().GetLibItemName();
|
== DESIGN_BLOCK_LIB_TABLE::SAVE_OK;
|
||||||
|
|
||||||
if( Prj().DesignBlockLibs()->DesignBlockExists( libName, newName ) )
|
|
||||||
if( !checkOverwrite( this, libName, newName ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
Prj().DesignBlockLibs()->DesignBlockSave( aLibraryName, &blk );
|
|
||||||
}
|
}
|
||||||
catch( const IO_ERROR& ioe )
|
catch( const IO_ERROR& ioe )
|
||||||
{
|
{
|
||||||
@ -229,4 +239,6 @@ void SCH_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
|||||||
|
|
||||||
m_designBlocksPane->RefreshLibs();
|
m_designBlocksPane->RefreshLibs();
|
||||||
m_designBlocksPane->SelectLibId( blk.GetLibId() );
|
m_designBlocksPane->SelectLibId( blk.GetLibId() );
|
||||||
|
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
|
@ -744,9 +744,9 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool CreateArchiveLibrary( const wxString& aFileName );
|
bool CreateArchiveLibrary( const wxString& aFileName );
|
||||||
|
|
||||||
void SaveSheetAsDesignBlock( const wxString& aLibraryName, SCH_SHEET_PATH& aSheetPath );
|
bool SaveSheetAsDesignBlock( const wxString& aLibraryName, SCH_SHEET_PATH& aSheetPath );
|
||||||
|
|
||||||
void SaveSelectionAsDesignBlock( const wxString& aLibraryName );
|
bool SaveSelectionAsDesignBlock( const wxString& aLibraryName );
|
||||||
|
|
||||||
SCH_DESIGN_BLOCK_PANE* GetDesignBlockPane() const { return m_designBlocksPane; }
|
SCH_DESIGN_BLOCK_PANE* GetDesignBlockPane() const { return m_designBlocksPane; }
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ bool SCH_DESIGN_BLOCK_CONTROL::Init()
|
|||||||
{
|
{
|
||||||
m_editFrame = getEditFrame<SCH_EDIT_FRAME>();
|
m_editFrame = getEditFrame<SCH_EDIT_FRAME>();
|
||||||
m_frame = m_editFrame;
|
m_frame = m_editFrame;
|
||||||
|
m_framesToNotify = { FRAME_PCB_EDITOR };
|
||||||
|
|
||||||
auto isInLibrary =
|
auto isInLibrary =
|
||||||
[this](const SELECTION& aSel )
|
[this](const SELECTION& aSel )
|
||||||
@ -75,8 +76,11 @@ int SCH_DESIGN_BLOCK_CONTROL::SaveSheetAsDesignBlock( const TOOL_EVENT& aEvent )
|
|||||||
if( !current )
|
if( !current )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
m_editFrame->SaveSheetAsDesignBlock( current->m_LibId.GetLibNickname(),
|
if( !m_editFrame->SaveSheetAsDesignBlock( current->m_LibId.GetLibNickname(),
|
||||||
m_editFrame->GetCurrentSheet() );
|
m_editFrame->GetCurrentSheet() ) )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
notifyOtherFrames();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -89,7 +93,10 @@ int SCH_DESIGN_BLOCK_CONTROL::SaveSelectionAsDesignBlock( const TOOL_EVENT& aEve
|
|||||||
if( !current )
|
if( !current )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
m_editFrame->SaveSelectionAsDesignBlock( current->m_LibId.GetLibNickname() );
|
if( !m_editFrame->SaveSelectionAsDesignBlock( current->m_LibId.GetLibNickname() ) )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
notifyOtherFrames();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,7 @@
|
|||||||
#include <tools/pcb_actions.h>
|
#include <tools/pcb_actions.h>
|
||||||
#include <tools/pcb_selection_tool.h>
|
#include <tools/pcb_selection_tool.h>
|
||||||
#include <netlist_reader/netlist_reader.h>
|
#include <netlist_reader/netlist_reader.h>
|
||||||
|
#include <widgets/pcb_design_block_pane.h>
|
||||||
#include <wx/log.h>
|
#include <wx/log.h>
|
||||||
|
|
||||||
/* Execute a remote command sent via a socket on port KICAD_PCB_PORT_SERVICE_NUMBER
|
/* Execute a remote command sent via a socket on port KICAD_PCB_PORT_SERVICE_NUMBER
|
||||||
@ -718,6 +719,10 @@ void PCB_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
|
|||||||
GetToolManager()->RunAction( ACTIONS::pluginsReload );
|
GetToolManager()->RunAction( ACTIONS::pluginsReload );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MAIL_RELOAD_LIB:
|
||||||
|
m_designBlocksPane->RefreshLibs();
|
||||||
|
break;
|
||||||
|
|
||||||
// many many others.
|
// many many others.
|
||||||
default:
|
default:
|
||||||
;
|
;
|
||||||
|
@ -104,13 +104,13 @@ bool PCB_EDIT_FRAME::saveBoardAsFile( BOARD* aBoard, const wxString& aFileName,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::SaveBoardAsDesignBlock( const wxString& aLibraryName )
|
bool PCB_EDIT_FRAME::SaveBoardAsDesignBlock( const wxString& aLibraryName )
|
||||||
{
|
{
|
||||||
// Make sure the user has selected a library to save into
|
// Make sure the user has selected a library to save into
|
||||||
if( m_designBlocksPane->GetSelectedLibId().GetLibNickname().empty() )
|
if( m_designBlocksPane->GetSelectedLibId().GetLibNickname().empty() )
|
||||||
{
|
{
|
||||||
DisplayErrorMessage( this, _( "Please select a library to save the design block to." ) );
|
DisplayErrorMessage( this, _( "Please select a library to save the design block to." ) );
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DESIGN_BLOCK blk;
|
DESIGN_BLOCK blk;
|
||||||
@ -121,7 +121,16 @@ void PCB_EDIT_FRAME::SaveBoardAsDesignBlock( const wxString& aLibraryName )
|
|||||||
DIALOG_DESIGN_BLOCK_PROPERTIES dlg( this, &blk );
|
DIALOG_DESIGN_BLOCK_PROPERTIES dlg( this, &blk );
|
||||||
|
|
||||||
if( dlg.ShowModal() != wxID_OK )
|
if( dlg.ShowModal() != wxID_OK )
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
|
wxString libName = blk.GetLibId().GetLibNickname();
|
||||||
|
wxString newName = blk.GetLibId().GetLibItemName();
|
||||||
|
|
||||||
|
if( Prj().DesignBlockLibs()->DesignBlockExists( libName, newName )
|
||||||
|
&& !checkOverwrite( this, libName, newName ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Save a temporary copy of the schematic file, as the plugin is just going to move it
|
// Save a temporary copy of the schematic file, as the plugin is just going to move it
|
||||||
wxString tempFile = wxFileName::CreateTempFileName( "design_block" );
|
wxString tempFile = wxFileName::CreateTempFileName( "design_block" );
|
||||||
@ -131,21 +140,17 @@ void PCB_EDIT_FRAME::SaveBoardAsDesignBlock( const wxString& aLibraryName )
|
|||||||
DisplayErrorMessage( this,
|
DisplayErrorMessage( this,
|
||||||
_( "Error saving temporary board file to create design block." ) );
|
_( "Error saving temporary board file to create design block." ) );
|
||||||
wxRemoveFile( tempFile );
|
wxRemoveFile( tempFile );
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
blk.SetBoardFile( tempFile );
|
blk.SetBoardFile( tempFile );
|
||||||
|
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
wxString libName = blk.GetLibId().GetLibNickname();
|
success = Prj().DesignBlockLibs()->DesignBlockSave( aLibraryName, &blk )
|
||||||
wxString newName = blk.GetLibId().GetLibItemName();
|
== DESIGN_BLOCK_LIB_TABLE::SAVE_OK;
|
||||||
|
|
||||||
if( Prj().DesignBlockLibs()->DesignBlockExists( libName, newName ) )
|
|
||||||
if( !checkOverwrite( this, libName, newName ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
Prj().DesignBlockLibs()->DesignBlockSave( aLibraryName, &blk );
|
|
||||||
}
|
}
|
||||||
catch( const IO_ERROR& ioe )
|
catch( const IO_ERROR& ioe )
|
||||||
{
|
{
|
||||||
@ -157,16 +162,18 @@ void PCB_EDIT_FRAME::SaveBoardAsDesignBlock( const wxString& aLibraryName )
|
|||||||
|
|
||||||
m_designBlocksPane->RefreshLibs();
|
m_designBlocksPane->RefreshLibs();
|
||||||
m_designBlocksPane->SelectLibId( blk.GetLibId() );
|
m_designBlocksPane->SelectLibId( blk.GetLibId() );
|
||||||
|
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
bool PCB_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
||||||
{
|
{
|
||||||
// Make sure the user has selected a library to save into
|
// Make sure the user has selected a library to save into
|
||||||
if( m_designBlocksPane->GetSelectedLibId().GetLibNickname().empty() )
|
if( m_designBlocksPane->GetSelectedLibId().GetLibNickname().empty() )
|
||||||
{
|
{
|
||||||
DisplayErrorMessage( this, _( "Please select a library to save the design block to." ) );
|
DisplayErrorMessage( this, _( "Please select a library to save the design block to." ) );
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get all selected items
|
// Get all selected items
|
||||||
@ -175,7 +182,7 @@ void PCB_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
|||||||
if( selection.Empty() )
|
if( selection.Empty() )
|
||||||
{
|
{
|
||||||
DisplayErrorMessage( this, _( "Please select some items to save as a design block." ) );
|
DisplayErrorMessage( this, _( "Please select some items to save as a design block." ) );
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DESIGN_BLOCK blk;
|
DESIGN_BLOCK blk;
|
||||||
@ -186,7 +193,16 @@ void PCB_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
|||||||
DIALOG_DESIGN_BLOCK_PROPERTIES dlg( this, &blk );
|
DIALOG_DESIGN_BLOCK_PROPERTIES dlg( this, &blk );
|
||||||
|
|
||||||
if( dlg.ShowModal() != wxID_OK )
|
if( dlg.ShowModal() != wxID_OK )
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
|
wxString libName = blk.GetLibId().GetLibNickname();
|
||||||
|
wxString newName = blk.GetLibId().GetLibItemName();
|
||||||
|
|
||||||
|
if( Prj().DesignBlockLibs()->DesignBlockExists( libName, newName )
|
||||||
|
&& !checkOverwrite( this, libName, newName ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Create a temporary board
|
// Create a temporary board
|
||||||
BOARD* tempBoard = new BOARD();
|
BOARD* tempBoard = new BOARD();
|
||||||
@ -220,21 +236,17 @@ void PCB_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
|||||||
DisplayErrorMessage( this,
|
DisplayErrorMessage( this,
|
||||||
_( "Error saving temporary board file to create design block." ) );
|
_( "Error saving temporary board file to create design block." ) );
|
||||||
wxRemoveFile( tempFile );
|
wxRemoveFile( tempFile );
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
blk.SetBoardFile( tempFile );
|
blk.SetBoardFile( tempFile );
|
||||||
|
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
wxString libName = blk.GetLibId().GetLibNickname();
|
success = Prj().DesignBlockLibs()->DesignBlockSave( aLibraryName, &blk )
|
||||||
wxString newName = blk.GetLibId().GetLibItemName();
|
== DESIGN_BLOCK_LIB_TABLE::SAVE_OK;
|
||||||
|
|
||||||
if( Prj().DesignBlockLibs()->DesignBlockExists( libName, newName ) )
|
|
||||||
if( !checkOverwrite( this, libName, newName ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
Prj().DesignBlockLibs()->DesignBlockSave( aLibraryName, &blk );
|
|
||||||
}
|
}
|
||||||
catch( const IO_ERROR& ioe )
|
catch( const IO_ERROR& ioe )
|
||||||
{
|
{
|
||||||
@ -246,4 +258,6 @@ void PCB_EDIT_FRAME::SaveSelectionAsDesignBlock( const wxString& aLibraryName )
|
|||||||
|
|
||||||
m_designBlocksPane->RefreshLibs();
|
m_designBlocksPane->RefreshLibs();
|
||||||
m_designBlocksPane->SelectLibId( blk.GetLibId() );
|
m_designBlocksPane->SelectLibId( blk.GetLibId() );
|
||||||
|
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
|
@ -464,9 +464,9 @@ public:
|
|||||||
*/
|
*/
|
||||||
void RecreateCmpFileFromBoard( wxCommandEvent& aEvent );
|
void RecreateCmpFileFromBoard( wxCommandEvent& aEvent );
|
||||||
|
|
||||||
void SaveBoardAsDesignBlock( const wxString& aLibraryName );
|
bool SaveBoardAsDesignBlock( const wxString& aLibraryName );
|
||||||
|
|
||||||
void SaveSelectionAsDesignBlock( const wxString& aLibraryName );
|
bool SaveSelectionAsDesignBlock( const wxString& aLibraryName );
|
||||||
|
|
||||||
PCB_DESIGN_BLOCK_PANE* GetDesignBlockPane() const { return m_designBlocksPane; }
|
PCB_DESIGN_BLOCK_PANE* GetDesignBlockPane() const { return m_designBlocksPane; }
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ bool PCB_DESIGN_BLOCK_CONTROL::Init()
|
|||||||
{
|
{
|
||||||
m_editFrame = getEditFrame<PCB_EDIT_FRAME>();
|
m_editFrame = getEditFrame<PCB_EDIT_FRAME>();
|
||||||
m_frame = m_editFrame;
|
m_frame = m_editFrame;
|
||||||
|
m_framesToNotify = { FRAME_SCH };
|
||||||
|
|
||||||
auto isInLibrary =
|
auto isInLibrary =
|
||||||
[this](const SELECTION& aSel )
|
[this](const SELECTION& aSel )
|
||||||
@ -75,7 +76,10 @@ int PCB_DESIGN_BLOCK_CONTROL::SaveBoardAsDesignBlock( const TOOL_EVENT& aEvent )
|
|||||||
if( !current )
|
if( !current )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
m_editFrame->SaveBoardAsDesignBlock( current->m_LibId.GetLibNickname() );
|
if( !m_editFrame->SaveBoardAsDesignBlock( current->m_LibId.GetLibNickname() ) )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
notifyOtherFrames();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -88,7 +92,10 @@ int PCB_DESIGN_BLOCK_CONTROL::SaveSelectionAsDesignBlock( const TOOL_EVENT& aEve
|
|||||||
if( !current )
|
if( !current )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
m_editFrame->SaveSelectionAsDesignBlock( current->m_LibId.GetLibNickname() );
|
if( !m_editFrame->SaveSelectionAsDesignBlock( current->m_LibId.GetLibNickname() ) )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
notifyOtherFrames();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user