A better way of handling standalone project files

This commit is contained in:
Jon Evans 2020-08-30 16:04:39 -04:00
parent be0aad5984
commit 9f7bca38b3
7 changed files with 26 additions and 8 deletions

View File

@ -40,6 +40,7 @@
PROJECT::PROJECT() :
m_readOnly( false ),
m_projectFile( nullptr ),
m_localSettings( nullptr )
{

View File

@ -794,6 +794,10 @@ bool SETTINGS_MANAGER::SaveProject( const wxString& aFullPath )
if( path.empty() )
path = Prj().GetProjectFullName();
// TODO: refactor for MDI
if( Prj().IsReadOnly() )
return false;
if( !m_project_files.count( path ) )
return false;

View File

@ -82,8 +82,8 @@ DIALOG_SCHEMATIC_SETUP::DIALOG_SCHEMATIC_SETUP( SCH_EDIT_FRAME* aFrame ) :
m_treebook->Connect( wxEVT_TREEBOOK_PAGE_CHANGED,
wxBookCtrlEventHandler( DIALOG_SCHEMATIC_SETUP::OnPageChange ), NULL, this );
if( Prj().IsNullProject() )
m_infoBar->ShowMessage( _( "No project is loaded. Changes will not be saved." ) );
if( Prj().IsReadOnly() )
m_infoBar->ShowMessage( _( "Project is missing or read-only. Changes will not be saved." ) );
FinishDialogSettings();
}

View File

@ -290,9 +290,12 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
Schematic().SetProject( nullptr );
GetSettingsManager()->UnloadProject( &Prj() );
// Do not load a project if one doesn't exist. This normally happens if we are
GetSettingsManager()->LoadProject( pro.GetFullPath() );
// Do not allow saving a project if one doesn't exist. This normally happens if we are
// standalone and opening a board that has been moved from its project folder.
GetSettingsManager()->LoadProject( pro.Exists() ? pro.GetFullPath() : "" );
if( !pro.Exists() )
Prj().SetReadOnly();
CreateScreens();
}

View File

@ -117,6 +117,10 @@ public:
*/
VTBL_ENTRY bool IsNullProject() const;
VTBL_ENTRY bool IsReadOnly() const { return m_readOnly || IsNullProject(); }
VTBL_ENTRY void SetReadOnly( bool aReadOnly = true ) { m_readOnly = aReadOnly; }
/**
* Return the name of the sheet identified by the given UUID.
*/
@ -332,6 +336,9 @@ private:
wxFileName m_project_name; ///< \<fullpath\>/\<basename\>.pro
wxString m_pro_date_and_time;
///> True if the project is read-only: no project files will be written
bool m_readOnly;
/// Backing store for project data -- owned by SETTINGS_MANAGER
PROJECT_FILE* m_projectFile;

View File

@ -95,8 +95,8 @@ DIALOG_BOARD_SETUP::DIALOG_BOARD_SETUP( PCB_EDIT_FRAME* aFrame ) :
m_treebook->Connect( wxEVT_TREEBOOK_PAGE_CHANGED,
wxBookCtrlEventHandler( DIALOG_BOARD_SETUP::OnPageChange ), NULL, this );
if( Prj().IsNullProject() )
m_infoBar->ShowMessage( _( "No project is loaded. Changes will not be saved." ) );
if( Prj().IsReadOnly() )
m_infoBar->ShowMessage( _( "Project is missing or read-only. Changes will not be saved." ) );
FinishDialogSettings();
}

View File

@ -521,9 +521,12 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
mgr->UnloadProject( &mgr->Prj() );
// Do not load a project if one doesn't exist. This normally happens if we are
mgr->LoadProject( pro.GetFullPath() );
// Do not allow saving a project if one doesn't exist. This normally happens if we are
// standalone and opening a board that has been moved from its project folder.
mgr->LoadProject( pro.Exists() ? pro.GetFullPath() : "" );
if( !pro.Exists() )
Prj().SetReadOnly();
}
}