Remove class RETAINED_PATH, put is main member function into SEARCH_STACK.

Change class PROJECT to use a generalized wxString in place of the
RETAINED_PATH items, so that new session and project specific strings
of any purpose can be saved there, for the life of a session.
This commit is contained in:
Dick Hollenbeck 2014-06-10 10:56:43 -05:00
parent 53cd19a69b
commit 8cb3423262
12 changed files with 111 additions and 91 deletions

View File

@ -69,5 +69,9 @@ Dick's Final TODO List:
https://blueprints.launchpad.net/kicad/+spec/modular-kicad
Issues as a result of minimal testing:
If eeschema launched from C++ project manager and does not find all libraries,
* If eeschema launched from C++ project manager and does not find all libraries,
then the dialog showing the names of missing libraries is shown twice.
* Clear all/some? retained strings on project change.
* Clear the FP_LIB_TABLE when the last KIWAY_PLAYER using it is closed.

View File

@ -133,17 +133,32 @@ const wxString PROJECT::FootprintLibTblName() const
}
RETAINED_PATH& PROJECT::RPath( RETPATH_T aIndex )
void PROJECT::SetRString( RSTRING_T aIndex, const wxString& aString )
{
unsigned ndx = unsigned( aIndex );
if( ndx < DIM( m_rpaths ) )
if( ndx < DIM( m_rstrings ) )
{
return m_rpaths[ndx];
m_rstrings[ndx] = aString;
}
else
{
static RETAINED_PATH no_cookie_for_you;
wxASSERT( 0 ); // bad index
}
}
const wxString& PROJECT::GetRString( RSTRING_T aIndex )
{
unsigned ndx = unsigned( aIndex );
if( ndx < DIM( m_rstrings ) )
{
return m_rstrings[ndx];
}
else
{
static wxString no_cookie_for_you;
wxASSERT( 0 ); // bad index

View File

@ -104,42 +104,33 @@ void SEARCH_STACK::AddPaths( const wxString& aPaths, int aIndex )
}
void RETAINED_PATH::Clear()
const wxString SEARCH_STACK::LastVisitedPath( const wxString& aSubPathToSearch )
{
m_retained_path.Clear();
}
wxString RETAINED_PATH::LastVisitedPath( const SEARCH_STACK& aSStack, const wxString& aSubPathToSearch )
{
if( !!m_retained_path )
return m_retained_path;
wxString path;
// Initialize default path to the main default lib path
// this is the second path in list (the first is the project path)
unsigned pcount = aSStack.GetCount();
// this is the second path in list (the first is the project path).
unsigned pcount = GetCount();
if( pcount )
{
unsigned ipath = 0;
if( aSStack[0] == wxGetCwd() )
if( (*this)[0] == wxGetCwd() )
ipath = 1;
// First choice of path:
if( ipath < pcount )
path = aSStack[ipath];
path = (*this)[ipath];
// Search a sub path matching aSubPathToSearch
if( !aSubPathToSearch.IsEmpty() )
// Search a sub path matching this SEARCH_PATH
if( !IsEmpty() )
{
for( ; ipath < pcount; ipath++ )
{
if( aSStack[ipath].Contains( aSubPathToSearch ) )
if( (*this)[ipath].Contains( aSubPathToSearch ) )
{
path = aSStack[ipath];
path = (*this)[ipath];
break;
}
}
@ -153,12 +144,6 @@ wxString RETAINED_PATH::LastVisitedPath( const SEARCH_STACK& aSStack, const wxSt
}
void RETAINED_PATH::SaveLastVisitedPath( const wxString& aPath )
{
m_retained_path = aPath;
}
#if defined(DEBUG)
void SEARCH_STACK::Show( const char* aPrefix ) const
{

View File

@ -439,8 +439,11 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::BrowseAndSelectDocFile( wxCommandEvent& e
PROJECT& prj = Prj();
SEARCH_STACK& search = prj.SchSearchS();
wxString docpath = prj.RPath(PROJECT::DOC).LastVisitedPath( search, wxT( "doc" ) );
wxString mask = wxT( "*" );
wxString docpath = prj.GetRString( PROJECT::DOC_PATH );
if( !docpath )
docpath = search.LastVisitedPath( wxT( "doc" ) );
wxString fullFileName = EDA_FileSelector( _( "Doc Files" ),
docpath,
@ -463,7 +466,7 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::BrowseAndSelectDocFile( wxCommandEvent& e
*/
wxFileName fn = fullFileName;
prj.RPath(PROJECT::DOC).SaveLastVisitedPath( fn.GetPath() );
prj.SetRString( PROJECT::DOC_PATH, fn.GetPath() );
wxString filename = search.FilenameWithRelativePathInSearchList( fullFileName );

View File

@ -321,8 +321,12 @@ void DIALOG_EESCHEMA_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event )
wxString libpath = m_DefaultLibraryPathslistBox->GetStringSelection();
if( libpath.IsEmpty() )
libpath = prj.RPath(PROJECT::SCH_LIB).LastVisitedPath( search );
if( !libpath )
{
libpath = prj.GetRString( PROJECT::SCH_LIB_PATH );
if( !libpath )
libpath = search.LastVisitedPath();
}
wxFileDialog filesDialog( this, _( "Library files:" ), libpath,
wxEmptyString, SchematicLibraryFileWildcard,
@ -340,7 +344,7 @@ void DIALOG_EESCHEMA_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event )
fn = filenames[jj];
if( jj == 0 )
prj.RPath(PROJECT::SCH_LIB).SaveLastVisitedPath( fn.GetPath() );
prj.SetRString( PROJECT::SCH_LIB_PATH, fn.GetPath() );
/* If the library path is already in the library search paths
* list, just add the library name to the list. Otherwise, add
@ -376,12 +380,14 @@ void DIALOG_EESCHEMA_CONFIG::OnAddOrInsertLibClick( wxCommandEvent& event )
}
void DIALOG_EESCHEMA_CONFIG::OnAddOrInsertPath( wxCommandEvent& event )
{
PROJECT& prj = Prj();
SEARCH_STACK& search = Prj().SchSearchS();
wxString path = prj.RPath(PROJECT::SCH_LIB).LastVisitedPath( search );
wxString path = prj.GetRString( PROJECT::SCH_LIB_PATH );
if( !path )
path = search.LastVisitedPath();
bool select = EDA_DirectorySelector( _( "Default Path for Libraries" ),
path, wxDD_DEFAULT_STYLE,
@ -439,7 +445,7 @@ void DIALOG_EESCHEMA_CONFIG::OnAddOrInsertPath( wxCommandEvent& event )
DisplayError( this, _("Path already in use") );
}
prj.RPath(PROJECT::SCH_LIB).SaveLastVisitedPath( path );
prj.SetRString( PROJECT::SCH_LIB_PATH, path );
}

View File

@ -308,7 +308,7 @@ bool LIB_EDIT_FRAME::SaveActiveLibrary( bool newFile )
m_canvas->EndMouseCapture( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor() );
if( m_library == NULL )
if( !m_library )
{
DisplayError( this, _( "No library specified." ) );
return false;
@ -326,7 +326,9 @@ bool LIB_EDIT_FRAME::SaveActiveLibrary( bool newFile )
SEARCH_STACK& search = prj.SchSearchS();
// Get a new name for the library
wxString default_path = prj.RPath(PROJECT::SCH_LIB).LastVisitedPath( search );
wxString default_path = prj.GetRString( PROJECT::SCH_LIB_PATH );
if( !default_path )
default_path = search.LastVisitedPath();
wxFileDialog dlg( this, _( "Component Library Name:" ), default_path,
wxEmptyString, SchematicLibraryFileExtension,
@ -342,7 +344,7 @@ bool LIB_EDIT_FRAME::SaveActiveLibrary( bool newFile )
if( fn.GetExt().IsEmpty() )
fn.SetExt( SchematicLibraryFileExtension );
prj.RPath(PROJECT::SCH_LIB).SaveLastVisitedPath( fn.GetPath() );
prj.SetRString( PROJECT::SCH_LIB_PATH, fn.GetPath() );
}
else
{

View File

@ -60,7 +60,9 @@ void LIB_EDIT_FRAME::LoadOneSymbol()
m_canvas->SetIgnoreMouseEvents( true );
wxString default_path = prj.RPath(PROJECT::SCH_LIB).LastVisitedPath( search );
wxString default_path = prj.GetRString( PROJECT::SCH_LIB_PATH );
if( !default_path )
default_path = search.LastVisitedPath();
wxFileDialog dlg( this, _( "Import Symbol Drawings" ), default_path,
wxEmptyString, SchematicSymbolFileWildcard,
@ -75,7 +77,7 @@ void LIB_EDIT_FRAME::LoadOneSymbol()
wxFileName fn = dlg.GetPath();
prj.RPath(PROJECT::SCH_LIB).SaveLastVisitedPath( fn.GetPath() );
prj.SetRString( PROJECT::SCH_LIB_PATH, fn.GetPath() );
Lib = new CMP_LIBRARY( LIBRARY_TYPE_SYMBOL, fn );
@ -143,7 +145,9 @@ void LIB_EDIT_FRAME::SaveOneSymbol()
if( m_component->GetDrawItemList().empty() )
return;
wxString default_path = prj.RPath(PROJECT::SCH_LIB).LastVisitedPath( search );
wxString default_path = prj.GetRString( PROJECT::SCH_LIB_PATH );
if( !default_path )
default_path = search.LastVisitedPath();
wxFileDialog dlg( this, _( "Export Symbol Drawings" ), default_path,
m_component->GetName(), SchematicSymbolFileWildcard,
@ -159,7 +163,7 @@ void LIB_EDIT_FRAME::SaveOneSymbol()
if( fn.GetExt().IsEmpty() )
fn.SetExt( SchematicSymbolFileExtension );
prj.RPath(PROJECT::SCH_LIB).SaveLastVisitedPath( fn.GetPath() );
prj.SetRString( PROJECT::SCH_LIB_PATH, fn.GetPath() );
msg.Printf( _( "Saving symbol in '%s'" ), GetChars( fn.GetPath() ) );
SetStatusText( msg );

View File

@ -137,19 +137,32 @@ public:
VTBL_ENTRY wxString GetModuleLibraryNickname() { return m_module_library_nickname; }
VTBL_ENTRY void SetModuleLibraryNickname( const wxString& aNickName ) { m_module_library_nickname = aNickName; }
/// Retain a number of paths for user convienience, enumerated here:
enum RETPATH_T
/// Retain a number of project specific wxStrings, enumerated here:
enum RSTRING_T
{
DOC,
SCH_LIB,
PCB_LIB,
VIEWER_3D,
DOC_PATH,
SCH_LIB_PATH,
PCB_LIB_NICKNAME,
VIEWER_3D_PATH,
RPATH_COUNT
RSTRING_COUNT
};
/// Give acess to a RETAINED_PATH using enum RETPATH_T
VTBL_ENTRY RETAINED_PATH& RPath( RETPATH_T aPath );
/**
* Function GetRString
* returns a "retained string", which is any session and project specific string
* identified in enum RSTRING_T. Retained strings are not written to disk, and
* are therefore good only for the current session.
*/
VTBL_ENTRY const wxString& GetRString( RSTRING_T aStringId );
/**
* Function SetRString
* stores a "retained string", which is any session and project specific string
* identified in enum RSTRING_T. Retained strings are not written to disk, and
* are therefore good only for the current session.
*/
VTBL_ENTRY void SetRString( RSTRING_T aStringId, const wxString& aString );
/**
* Enum ELEM_T
@ -241,8 +254,8 @@ private:
wxString m_module_library_nickname; ///< @todo move this into m_rpaths[]
/// @see this::RPath() and enum RETPATH_T.
RETAINED_PATH m_rpaths[RPATH_COUNT];
/// @see this::SetRString(), GetRString(), and enum RSTRING_T.
wxString m_rstrings[RSTRING_COUNT];
/// @see this::Elem() and enum ELEM_T.
_ELEM* m_elems[ELEM_COUNT];

View File

@ -57,38 +57,19 @@ public:
* ";" on windows, or ":" | ";" on unix.
*/
void RemovePaths( const wxString& aPaths );
};
/**
* Class RETAINED_PATH
* is a glamorous way to save a path you might need in the future.
* It is simply a container for the two functions, if you can figure them out.
* This whole concept is awkward, and the two function might have better been
* non-member functions, simply globals.
*/
class RETAINED_PATH
{
public:
/**
* Function LastVisitedPath
* returns the last visited directory, or aSubPathToSearch is empty, the first
* path in lib path list ( but not the CWD ).
* is a quirky function inherited from old code that seems to serve particular
* needs in the UI. It returns what is called the last visited directory, or
* if aSubPathToSearch is empty, the first path in this SEARCH_STACK
* ( but not the CWD ).
*
* @todo add more here if you can figure it out.
*
* @param aSearchStack gives the set of directories to consider.
* @param aSubPathToSearch is the preferred sub path to search in path list
* @param aSubPathToSearch is the preferred sub path to search in path list
*/
wxString LastVisitedPath( const SEARCH_STACK& aSStack,
const wxString& aSubPathToSearch = wxEmptyString );
void SaveLastVisitedPath( const wxString& aPath );
void Clear();
private:
wxString m_retained_path;
const wxString LastVisitedPath( const wxString& aSubPathToSearch = wxEmptyString );
};
#endif // SEARCH_STACK_H_

View File

@ -440,7 +440,11 @@ void DIALOG_MODULE_BOARD_EDITOR::Browse3DLib( wxCommandEvent& event )
}
if( !fullpath )
fullpath = prj.RPath(PROJECT::VIEWER_3D).LastVisitedPath( search, LIB3D_PATH );
{
fullpath = prj.GetRString( PROJECT::VIEWER_3D_PATH );
if( !fullpath )
fullpath = search.LastVisitedPath( LIB3D_PATH );
}
#ifdef __WINDOWS__
fullpath.Replace( wxT( "/" ), wxT( "\\" ) );
@ -469,7 +473,7 @@ void DIALOG_MODULE_BOARD_EDITOR::Browse3DLib( wxCommandEvent& event )
wxFileName fn = fullfilename;
prj.RPath(PROJECT::VIEWER_3D).SaveLastVisitedPath( fn.GetPath() );
prj.SetRString( PROJECT::VIEWER_3D_PATH, fn.GetPath() );
/* If the file path is already in the library search paths
* list, just add the library name to the list. Otherwise, add
@ -482,7 +486,7 @@ void DIALOG_MODULE_BOARD_EDITOR::Browse3DLib( wxCommandEvent& event )
wxFileName aux = shortfilename;
if( aux.IsAbsolute() )
{
{
// Absolute path, ask if the user wants a relative one
int diag = wxMessageBox(
_( "Use a relative path?" ),
@ -490,7 +494,7 @@ void DIALOG_MODULE_BOARD_EDITOR::Browse3DLib( wxCommandEvent& event )
wxYES_NO | wxICON_QUESTION, this );
if( diag == wxYES )
{
{
// Make it relative
aux.MakeRelativeTo( wxT(".") );
shortfilename = aux.GetPathWithSep() + aux.GetFullName();

View File

@ -303,7 +303,11 @@ void DIALOG_MODULE_MODULE_EDITOR::BrowseAndAdd3DLib( wxCommandEvent& event )
}
if( !fullpath )
fullpath = prj.RPath(PROJECT::VIEWER_3D).LastVisitedPath( search, LIB3D_PATH );
{
fullpath = prj.GetRString( PROJECT::VIEWER_3D_PATH );
if( !fullpath )
fullpath = search.LastVisitedPath( LIB3D_PATH );
}
#ifdef __WINDOWS__
fullpath.Replace( wxT( "/" ), wxT( "\\" ) );
@ -330,7 +334,7 @@ void DIALOG_MODULE_MODULE_EDITOR::BrowseAndAdd3DLib( wxCommandEvent& event )
wxFileName fn = fullfilename;
prj.RPath(PROJECT::VIEWER_3D).SaveLastVisitedPath( fn.GetPath() );
prj.SetRString( PROJECT::VIEWER_3D_PATH, fn.GetPath() );
/* If the file path is already in the library search paths
* list, just add the library name to the list. Otherwise, add

View File

@ -522,16 +522,15 @@ void PCB_EDIT_FRAME::ArchiveModulesOnBoard( bool aNewModulesOnly )
}
PROJECT& prj = Prj();
SEARCH_STACK& search = Kiface().KifaceSearch();
wxString last_nickname = prj.RPath(PROJECT::PCB_LIB).LastVisitedPath( search );
wxString last_nickname = prj.GetRString( PROJECT::PCB_LIB_NICKNAME );
wxString nickname = SelectLibrary( last_nickname );
if( !nickname )
return;
prj.RPath(PROJECT::PCB_LIB).SaveLastVisitedPath( nickname );
prj.SetRString( PROJECT::PCB_LIB_NICKNAME, nickname );
if( !aNewModulesOnly )
{
@ -545,7 +544,7 @@ void PCB_EDIT_FRAME::ArchiveModulesOnBoard( bool aNewModulesOnly )
try
{
FP_LIB_TABLE* tbl = Prj().PcbFootprintLibs();
FP_LIB_TABLE* tbl = prj.PcbFootprintLibs();
// Delete old library if we're replacing it entirely.
if( !aNewModulesOnly )