Overhaul file locking system.

See bug report for details.

Fixes https://gitlab.com/kicad/code/kicad/issues/8919
This commit is contained in:
Jeff Young 2021-08-31 15:03:40 +01:00
parent ef38642bf1
commit b5a3385ea9
5 changed files with 45 additions and 15 deletions

View File

@ -151,6 +151,19 @@ long KIDIALOG::getStyle( KD_TYPE aType )
}
bool OverrideLock( wxWindow* aParent, const wxString& aMessage )
{
wxRichMessageDialog dlg( aParent, aMessage, _( "File Open Error" ),
wxYES_NO | wxICON_ERROR | wxCENTER );
// Note: must use the "no" label to get the correct positioning/spacing for a (potentially)
// destructive action
dlg.SetYesNoLabels( _( "OK" ), _( "Open Anyway" ) );
return dlg.ShowModal() == wxID_NO;
}
int UnsavedChangesDialog( wxWindow* parent, const wxString& aMessage, bool* aApplyToAll )
{
static bool s_apply_to_all = false;

View File

@ -205,7 +205,7 @@ bool EDA_DRAW_FRAME::LockFile( const wxString& aFileName )
{
m_file_checker = ::LockFile( aFileName );
return bool( m_file_checker );
return m_file_checker && !m_file_checker->IsAnotherRunning();
}

View File

@ -120,9 +120,12 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
if( !LockFile( fullFileName ) )
{
msg.Printf( _( "Schematic file '%s' is already open." ), fullFileName );
DisplayError( this, msg );
return false;
msg.Printf( _( "Schematic file '%s' is already open.\n\n"
"Interleaved saves may produce very unexpected results.\n" ),
fullFileName );
if( !OverrideLock( this, msg ) )
return false;
}
if( !AskToSaveChanges() )
@ -1131,9 +1134,13 @@ bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
if( !LockFile( aFileName ) )
{
wxString msg = wxString::Format( _( "Schematic '%s' is already open." ), aFileName );
DisplayError( this, msg );
return false;
wxString msg;
msg.Printf( _( "Schematic file '%s' is already open.\n\n"
"Interleaved saves may produce very unexpected results.\n" ),
aFileName );
if( !OverrideLock( this, msg ) )
return false;
}
try

View File

@ -82,6 +82,13 @@ protected:
};
/**
* Display a dialog indicating the file is already open, with an option to reset the lock.
* @return true if the lock was reset.
*/
bool OverrideLock( wxWindow* aParent, const wxString& aMessage );
/**
* Display a dialog with Save, Cancel and Discard Changes buttons.
*

View File

@ -564,6 +564,7 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
}
wxString fullFileName( aFileSet[0] );
wxString msg;
if( Kiface().IsSingle() )
{
@ -575,11 +576,14 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
std::unique_ptr<wxSingleInstanceChecker> lockFile = ::LockFile( fullFileName );
if( !lockFile )
if( !lockFile || lockFile->IsAnotherRunning() )
{
wxString msg = wxString::Format( _( "PCB '%s' is already open." ), fullFileName );
DisplayError( this, msg );
return false;
msg.Printf( _( "PCB file '%s' is already open.\n\n"
"Interleaved saves may produce very unexpected results.\n" ),
fullFileName );
if( !OverrideLock( this, msg ) )
return false;
}
if( IsContentModified() )
@ -603,9 +607,9 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
if( is_new && !( aCtl & KICTL_CREATE ) )
{
// notify user that fullFileName does not exist, ask if user wants to create it.
wxString ask = wxString::Format( _( "PCB '%s' does not exist. Do you wish to create it?" ),
fullFileName );
if( !IsOK( this, ask ) )
msg.Printf( _( "PCB '%s' does not exist. Do you wish to create it?" ), fullFileName );
if( !IsOK( this, msg ) )
return false;
}
@ -662,7 +666,6 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
{
BOARD* loadedBoard = nullptr; // it will be set to non-NULL if loaded OK
PLUGIN::RELEASER pi( IO_MGR::PluginFind( pluginType ) );
wxString msg;
LAYER_REMAPPABLE_PLUGIN* layerRemappablePlugin =
dynamic_cast< LAYER_REMAPPABLE_PLUGIN* >( (PLUGIN*) pi );