Update hierarchy navigator when undoing or redoing sheet name changes.
Use new schematic commit object in the edit sheet properties dialog.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/17721
(cherry picked from commit ec310ac3ed
)
This commit is contained in:
parent
b26ca0e21a
commit
c4c804edf7
|
@ -34,6 +34,7 @@
|
||||||
#include <wildcards_and_files_ext.h>
|
#include <wildcards_and_files_ext.h>
|
||||||
#include <widgets/std_bitmap_button.h>
|
#include <widgets/std_bitmap_button.h>
|
||||||
#include <kiplatform/ui.h>
|
#include <kiplatform/ui.h>
|
||||||
|
#include <sch_commit.h>
|
||||||
#include <sch_edit_frame.h>
|
#include <sch_edit_frame.h>
|
||||||
#include <sch_sheet.h>
|
#include <sch_sheet.h>
|
||||||
#include <schematic.h>
|
#include <schematic.h>
|
||||||
|
@ -259,9 +260,17 @@ static bool positioningChanged( FIELDS_GRID_TABLE<SCH_FIELD>* a, std::vector<SCH
|
||||||
|
|
||||||
bool DIALOG_SHEET_PROPERTIES::TransferDataFromWindow()
|
bool DIALOG_SHEET_PROPERTIES::TransferDataFromWindow()
|
||||||
{
|
{
|
||||||
|
wxCHECK( m_sheet && m_frame, false );
|
||||||
|
|
||||||
if( !wxDialog::TransferDataFromWindow() ) // Calls our Validate() method.
|
if( !wxDialog::TransferDataFromWindow() ) // Calls our Validate() method.
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
SCH_COMMIT commit( m_frame );
|
||||||
|
|
||||||
|
commit.Modify( m_sheet, m_frame->GetScreen() );
|
||||||
|
|
||||||
|
bool isUndoable = true;
|
||||||
|
|
||||||
// Sheet file names can be relative or absolute.
|
// Sheet file names can be relative or absolute.
|
||||||
wxString sheetFileName = m_fields->at( SHEETFILENAME ).GetText();
|
wxString sheetFileName = m_fields->at( SHEETFILENAME ).GetText();
|
||||||
|
|
||||||
|
@ -330,7 +339,7 @@ bool DIALOG_SHEET_PROPERTIES::TransferDataFromWindow()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !onSheetFilenameChanged( newRelativeFilename ) )
|
if( !onSheetFilenameChanged( newRelativeFilename, &isUndoable ) )
|
||||||
{
|
{
|
||||||
if( clearFileName )
|
if( clearFileName )
|
||||||
currentScreen->SetFileName( wxEmptyString );
|
currentScreen->SetFileName( wxEmptyString );
|
||||||
|
@ -416,14 +425,26 @@ bool DIALOG_SHEET_PROPERTIES::TransferDataFromWindow()
|
||||||
for( SCH_ITEM* item : m_frame->GetScreen()->Items().OfType( SCH_SHEET_T ) )
|
for( SCH_ITEM* item : m_frame->GetScreen()->Items().OfType( SCH_SHEET_T ) )
|
||||||
m_frame->UpdateItem( item );
|
m_frame->UpdateItem( item );
|
||||||
|
|
||||||
m_frame->OnModify();
|
if( isUndoable )
|
||||||
|
{
|
||||||
|
commit.Push( _( "Edit Sheet Properties" ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If we are renaming files, the undo/redo list becomes invalid and must be cleared.
|
||||||
|
m_frame->ClearUndoRedoList();
|
||||||
|
m_frame->OnModify();
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DIALOG_SHEET_PROPERTIES::onSheetFilenameChanged( const wxString& aNewFilename )
|
bool DIALOG_SHEET_PROPERTIES::onSheetFilenameChanged( const wxString& aNewFilename,
|
||||||
|
bool* aIsUndoable )
|
||||||
{
|
{
|
||||||
|
wxCHECK( aIsUndoable, false );
|
||||||
|
|
||||||
wxString msg;
|
wxString msg;
|
||||||
wxFileName sheetFileName(
|
wxFileName sheetFileName(
|
||||||
EnsureFileExtension( aNewFilename, FILEEXT::KiCadSchematicFileExtension ) );
|
EnsureFileExtension( aNewFilename, FILEEXT::KiCadSchematicFileExtension ) );
|
||||||
|
@ -503,7 +524,6 @@ bool DIALOG_SHEET_PROPERTIES::onSheetFilenameChanged( const wxString& aNewFilena
|
||||||
}
|
}
|
||||||
else // Existing sheet.
|
else // Existing sheet.
|
||||||
{
|
{
|
||||||
bool isUndoable = true;
|
|
||||||
isExistingSheet = true;
|
isExistingSheet = true;
|
||||||
|
|
||||||
if( !m_frame->AllowCaseSensitiveFileNameClashes( newAbsoluteFilename ) )
|
if( !m_frame->AllowCaseSensitiveFileNameClashes( newAbsoluteFilename ) )
|
||||||
|
@ -524,7 +544,7 @@ bool DIALOG_SHEET_PROPERTIES::onSheetFilenameChanged( const wxString& aNewFilena
|
||||||
if( newAbsoluteFilename.Cmp( oldAbsoluteFilename ) != 0 )
|
if( newAbsoluteFilename.Cmp( oldAbsoluteFilename ) != 0 )
|
||||||
{
|
{
|
||||||
// Sheet file name changes cannot be undone.
|
// Sheet file name changes cannot be undone.
|
||||||
isUndoable = false;
|
*aIsUndoable = false;
|
||||||
|
|
||||||
if( useScreen || loadFromFile ) // Load from existing file.
|
if( useScreen || loadFromFile ) // Load from existing file.
|
||||||
{
|
{
|
||||||
|
@ -562,12 +582,6 @@ bool DIALOG_SHEET_PROPERTIES::onSheetFilenameChanged( const wxString& aNewFilena
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we are renaming files, the undo/redo list becomes invalid and must be cleared
|
|
||||||
if( isUndoable )
|
|
||||||
m_frame->SaveCopyInUndoList( m_frame->GetScreen(), m_sheet, UNDO_REDO::CHANGED, false );
|
|
||||||
else
|
|
||||||
m_frame->ClearUndoRedoList();
|
|
||||||
|
|
||||||
if( renameFile )
|
if( renameFile )
|
||||||
{
|
{
|
||||||
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
|
||||||
|
|
|
@ -44,7 +44,7 @@ public:
|
||||||
~DIALOG_SHEET_PROPERTIES() override;
|
~DIALOG_SHEET_PROPERTIES() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool onSheetFilenameChanged( const wxString& aNewFilename );
|
bool onSheetFilenameChanged( const wxString& aNewFilename, bool* aIsUndoable );
|
||||||
|
|
||||||
bool TransferDataToWindow() override;
|
bool TransferDataToWindow() override;
|
||||||
bool TransferDataFromWindow() override;
|
bool TransferDataFromWindow() override;
|
||||||
|
|
|
@ -395,7 +395,7 @@ void SCH_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList )
|
||||||
if( schItem->Type() == SCH_SHEET_T )
|
if( schItem->Type() == SCH_SHEET_T )
|
||||||
{
|
{
|
||||||
const SCH_SHEET* origSheet = static_cast<const SCH_SHEET*>( schItem );
|
const SCH_SHEET* origSheet = static_cast<const SCH_SHEET*>( schItem );
|
||||||
const SCH_SHEET* copySheet = static_cast<const SCH_SHEET*>( schItem );
|
const SCH_SHEET* copySheet = static_cast<const SCH_SHEET*>( itemCopy );
|
||||||
|
|
||||||
wxCHECK2( origSheet && copySheet, continue );
|
wxCHECK2( origSheet && copySheet, continue );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue