diff --git a/kicad/kicad.h b/kicad/kicad.h index b19f744593..d9d21086e9 100644 --- a/kicad/kicad.h +++ b/kicad/kicad.h @@ -202,7 +202,7 @@ public: bool Rename( const wxString& name, bool check = true ); bool Delete( bool check = true ); void Move( TreePrjItemData* dest ); - void Activate(); + void Activate(WinEDA_PrjFrame* prjframe); const wxMenu* GetMenu() { @@ -320,7 +320,7 @@ public: #endif - void AddFile( const wxString& name, wxTreeItemId& root ); + bool AddFile( const wxString& name, wxTreeItemId& root ); DECLARE_EVENT_TABLE() }; diff --git a/kicad/treeprj_datas.cpp b/kicad/treeprj_datas.cpp index affc34e3da..662ff50f04 100644 --- a/kicad/treeprj_datas.cpp +++ b/kicad/treeprj_datas.cpp @@ -163,6 +163,10 @@ void TreePrjItemData::OnRename( wxTreeEvent& event, bool check ) /****************************************************************/ /* Called upon tree item rename */ { + //this segfaults on linux (in wxEvtHandler::ProcessEvent), wx version 2.8.7 + //therefore, until it is fixed, we must cancel the rename. + event.Veto(); + return; if( !Rename( event.GetLabel(), check ) ) event.Veto(); } @@ -174,8 +178,12 @@ void TreePrjItemData::Move( TreePrjItemData* dest ) // Move the object to dest { + //function not safe. + return; const wxString sep = wxFileName().GetPathSeparator(); - + + if( m_Type == TREE_DIRECTORY ) + return; if( !dest ) return; if( m_Parent != dest->m_Parent ) @@ -249,6 +257,9 @@ bool TreePrjItemData::Rename( const wxString& name, bool check ) /****************************************************************/ /* rename the file checking if extension change occurs */ { + //this is broken & unsafe to use on linux. + if( m_Type == TREE_DIRECTORY ) + return false; if( name.IsEmpty() ) return false; @@ -339,11 +350,16 @@ bool TreePrjItemData::Delete( bool check ) /**********************************/ -void TreePrjItemData::Activate() +void TreePrjItemData::Activate(WinEDA_PrjFrame* prjframe) /**********************************/ /* Called under item activation */ { - wxString FullFileName = wxGetCwd() + wxFileName().GetPathSeparator() + GetFileName(); + wxString sep = wxFileName().GetPathSeparator(); + wxString FullFileName = GetFileName(); + wxDir *dir; + wxString dir_filename; + wxTreeItemId id = GetId(); + int count; switch( GetType() ) { @@ -351,7 +367,29 @@ void TreePrjItemData::Activate() break; case TREE_DIRECTORY: - m_Parent->Toggle( GetId() ); + if(prjframe){ + dir = new wxDir(FullFileName); + count = 0; + if( dir && dir->IsOpened() && dir->GetFirst( &dir_filename ) ) + { + do + { + wxString fil = FullFileName + sep + dir_filename; + + if( prjframe->AddFile(fil, id) ){ + count++; + } + } while( dir->GetNext( &dir_filename ) ); + } + if(count == 0) + { + prjframe->AddFile(wxString("no kicad files found in this directory"), id); + } + /* Sort filenames by alphabetic order */ + m_Parent->SortChildren( id ); + if(dir) delete dir; + } + m_Parent->Toggle( id ); break; case TREE_SCHEMA: diff --git a/kicad/treeprj_frame.cpp b/kicad/treeprj_frame.cpp index 5977d7c645..f214414e07 100644 --- a/kicad/treeprj_frame.cpp +++ b/kicad/treeprj_frame.cpp @@ -26,6 +26,7 @@ #include "id.h" + /******************************************************************/ WinEDA_PrjFrame::WinEDA_PrjFrame( WinEDA_MainFrame* parent, const wxPoint& pos, @@ -49,6 +50,7 @@ WinEDA_PrjFrame::WinEDA_PrjFrame( WinEDA_MainFrame* parent, m_Filters.push_back( wxT( "^.*\\.net$" ) ); m_Filters.push_back( wxT( "^.*\\.txt$" ) ); m_Filters.push_back( wxT( "^.*\\.pho$" ) ); + m_Filters.push_back( wxT( "^no kicad files found" ) ); #ifdef KICAD_PYTHON m_Filters.push_back( wxT( "^.*\\.py$" ) ); @@ -517,7 +519,7 @@ wxString WinEDA_PrjFrame::GetFileExt( TreeFileType type ) /**************************************************************************/ -void WinEDA_PrjFrame::AddFile( const wxString& name, wxTreeItemId& root ) +bool WinEDA_PrjFrame::AddFile( const wxString& name, wxTreeItemId& root ) /**************************************************************************/ /* add filename "name" to the tree @@ -550,9 +552,8 @@ void WinEDA_PrjFrame::AddFile( const wxString& name, wxTreeItemId& root ) isSchematic = true; } } - if( !addFile ) - return; + return false; // only show the schematic if it is a top level schematic. eeschema // cannot open a schematic and display it properly unless it starts @@ -564,13 +565,13 @@ void WinEDA_PrjFrame::AddFile( const wxString& name, wxTreeItemId& root ) char line[128]; // small because we just need a few bytes from the start of a line FILE* fp; - wxString FullFileName = wxGetCwd() + STRING_DIR_SEP + name; + wxString FullFileName = name; fp = wxFopen( FullFileName, wxT( "rt" ) ); if( fp == NULL ) { //printf("Unable to open \"%s\"\n", (const char*) FullFileName.mb_str() ); - return; // why show a file we cannot open? + return false; // why show a file we cannot open? } addFile = false; @@ -589,7 +590,7 @@ void WinEDA_PrjFrame::AddFile( const wxString& name, wxTreeItemId& root ) fclose(fp); if( !addFile ) - return; // it is a non-top-level schematic + return false; // it is a non-top-level schematic } for( int i = TREE_PROJECT; i < TREE_MAX; i++ ) @@ -609,7 +610,20 @@ void WinEDA_PrjFrame::AddFile( const wxString& name, wxTreeItemId& root ) } } } - + //also check to see if it is already there. + wxTreeItemIdValue cookie; + wxTreeItemId kid = m_TreeProject->GetFirstChild(root, cookie); + while(kid.IsOk()) + { + TreePrjItemData* itemData = (TreePrjItemData*) + m_TreeProject->GetItemData(kid); + if( itemData ){ + if( itemData->m_FileName == name ){ + return true; //well, we would have added it, but it is already here! + } + } + kid = m_TreeProject->GetNextChild(root, cookie); + } // Append the item (only appending the filename not the full path): wxString file = wxFileNameFromPath( name ); @@ -632,24 +646,7 @@ void WinEDA_PrjFrame::AddFile( const wxString& name, wxTreeItemId& root ) #ifdef KICAD_PYTHON PyHandler::GetInstance()->TriggerEvent( wxT( "kicad::TreeAddFile" ), PyHandler::Convert( name ) ); #endif - - if( TREE_DIRECTORY == type ) - { - const wxString sep = wxFileName().GetPathSeparator(); - wxDir dir( name ); - - wxString dir_filename; - if( dir.GetFirst( &dir_filename ) ) - { - do - { - AddFile( name + sep + dir_filename, cellule ); - } while( dir.GetNext( &dir_filename ) ); - } - - /* Sort filenames by alphabetic order */ - m_TreeProject->SortChildren( cellule ); - } + return true; } @@ -701,7 +698,8 @@ void WinEDA_PrjFrame::ReCreateTreePrj() if( prjOpened ) { wxDir dir( wxGetCwd() ); - + wxString dir_str = dir.GetName(); + wxString sep = wxFileName().GetPathSeparator(); wxString filename; if( dir.GetFirst( &filename ) ) @@ -711,7 +709,7 @@ void WinEDA_PrjFrame::ReCreateTreePrj() if( filename == Text + wxT( ".pro" ) ) continue; - AddFile( filename, m_root ); + AddFile(dir_str + sep + filename, m_root ); } while( dir.GetNext( &filename ) ); } @@ -936,5 +934,5 @@ void WinEDA_PrjFrame::OnSelect( wxTreeEvent& Event ) if( !tree_data ) return; - tree_data->Activate(); + tree_data->Activate(this); }