Commit c237838d authored by jean-pierre charras's avatar jean-pierre charras
Browse files

python scripting: refinement for UTF8 class (from Miguel Ángel Ajo Pelayo) add...

python scripting: refinement for UTF8 class (from Miguel Ángel Ajo Pelayo) add __str__  method, usefull to print a UTF8 string.
Kicad manager: fix issues in file watcher: changes (adding/removing files)  in project folder not seen by Kicad manager (perhaps due to changes in internal wxWidgets code between 2.9.5 and 3.0).
parent 959b63ba
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,8 @@ TREEPROJECTFILES::TREEPROJECTFILES( TREE_PROJECT_FRAME* parent ) :
    m_ImageList->Add( KiBitmap( post_drill_xpm ) );             // TREE_DRILL
    m_ImageList->Add( KiBitmap( post_drill_xpm ) );             // TREE_DRILL
    m_ImageList->Add( KiBitmap( svg_file_xpm ) );               // TREE_SVG
    m_ImageList->Add( KiBitmap( svg_file_xpm ) );               // TREE_SVG
    m_ImageList->Add( KiBitmap( pagelayout_load_default_xpm ) );// TREE_PAGE_LAYOUT_DESCR
    m_ImageList->Add( KiBitmap( pagelayout_load_default_xpm ) );// TREE_PAGE_LAYOUT_DESCR
    m_ImageList->Add( KiBitmap( module_xpm ) );                 // TREE_FOOTPRINT_FILE
    m_ImageList->Add( KiBitmap( library_xpm ) );                // TREE_SCHEMATIC_LIBFILE


    SetImageList( m_ImageList );
    SetImageList( m_ImageList );
}
}
+2 −1
Original line number Original line Diff line number Diff line
@@ -54,7 +54,6 @@ class TREE_PROJECT_FRAME;
//
//
// When changing this enum  please verify (and perhaps update)
// When changing this enum  please verify (and perhaps update)
// TREE_PROJECT_FRAME::GetFileExt(),
// TREE_PROJECT_FRAME::GetFileExt(),
// TREE_PROJECT_FRAME::GetFileExt()
// s_AllowedExtensionsToList[]
// s_AllowedExtensionsToList[]


enum TreeFileType {
enum TreeFileType {
@@ -74,6 +73,8 @@ enum TreeFileType {
    TREE_DRILL,             // Excellon drill file (.drl)
    TREE_DRILL,             // Excellon drill file (.drl)
    TREE_SVG,               // SVG file (.svg)
    TREE_SVG,               // SVG file (.svg)
    TREE_PAGE_LAYOUT_DESCR, // Page layout and title block descr file (.kicad_wks)
    TREE_PAGE_LAYOUT_DESCR, // Page layout and title block descr file (.kicad_wks)
    TREE_FOOTPRINT_FILE,    // footprint file (.kicad_mod)
    TREE_SCHEMATIC_LIBFILE, // schematic library file (.lib)
    TREE_MAX
    TREE_MAX
};
};


+52 −23
Original line number Original line Diff line number Diff line
@@ -65,9 +65,11 @@ static const wxChar* s_allowedExtensionsToList[] =
    wxT( "^.*\\.pro$" ),
    wxT( "^.*\\.pro$" ),
    wxT( "^.*\\.pdf$" ),
    wxT( "^.*\\.pdf$" ),
    wxT( "^[^$].*\\.brd$" ),        // Legacy Pcbnew files
    wxT( "^[^$].*\\.brd$" ),        // Legacy Pcbnew files
    wxT( "^[^$].*\\.kicad_pcb$" ),  // S format Pcbnew files
    wxT( "^[^$].*\\.kicad_pcb$" ),  // S format Pcbnew board files
    wxT( "^[^$].*\\.kicad_wks$" ),  // S format kicad page layout descr files
    wxT( "^[^$].*\\.kicad_wks$" ),  // S format kicad page layout descr files
    wxT( "^[^$].*\\.kicad_mod$" ),  // S format kicad footprint files, currently not listed
    wxT( "^.*\\.net$" ),
    wxT( "^.*\\.net$" ),
    wxT( "^.*\\.lib$" ),            // Schematic library file
    wxT( "^.*\\.txt$" ),
    wxT( "^.*\\.txt$" ),
    wxT( "^.*\\.pho$" ),            // Gerber file (Old Kicad extension)
    wxT( "^.*\\.pho$" ),            // Gerber file (Old Kicad extension)
    wxT( "^.*\\.gbr$" ),            // Gerber file
    wxT( "^.*\\.gbr$" ),            // Gerber file
@@ -75,7 +77,6 @@ static const wxChar* s_allowedExtensionsToList[] =
    wxT( "^.*\\.gt[alops]$" ),      // Gerber front (or top) layer file
    wxT( "^.*\\.gt[alops]$" ),      // Gerber front (or top) layer file
    wxT( "^.*\\.g[0-9]{1,2}$" ),    // Gerber inner layer file
    wxT( "^.*\\.g[0-9]{1,2}$" ),    // Gerber inner layer file
    wxT( "^.*\\.odt$" ),
    wxT( "^.*\\.odt$" ),
    wxT( "^.*\\.sxw$" ),
    wxT( "^.*\\.htm$" ),
    wxT( "^.*\\.htm$" ),
    wxT( "^.*\\.html$" ),
    wxT( "^.*\\.html$" ),
    wxT( "^.*\\.rpt$" ),    // Report files
    wxT( "^.*\\.rpt$" ),    // Report files
@@ -196,27 +197,33 @@ void TREE_PROJECT_FRAME::OnCreateNewDirectory( wxCommandEvent& event )
            root = m_TreeProject->GetSelection();
            root = m_TreeProject->GetSelection();
    }
    }


    wxString prj_dir = wxPathOnly( m_Parent->GetProjectFileName() );

    // Ask for the new sub directory name
    // Ask for the new sub directory name
    wxString curr_dir = treeData->GetDir();
    wxString curr_dir = treeData->GetDir();


    // Make the current subdir relative to the current path:
    if( !curr_dir.IsEmpty() )    // A subdir is selected
    if( !curr_dir.IsEmpty() )    // A subdir is selected
    {
    {
        // Make this subdir name relative to the current path.
        // It will be more easy to read by the user, in the next dialog
        wxFileName fn;
        fn.AssignDir( curr_dir );
        fn.MakeRelativeTo( prj_dir );
        curr_dir = fn.GetPath();

        if( !curr_dir.IsEmpty() )
            curr_dir += wxFileName::GetPathSeparator();
            curr_dir += wxFileName::GetPathSeparator();
        curr_dir    += wxT( "dummy" );
        wxFileName fn( curr_dir );
        fn.MakeRelativeTo();
        curr_dir = fn.GetPath() + wxFileName::GetPathSeparator();
    }
    }


    wxString    msg = wxString::Format( _( "Current working directory:\n%s" ), GetChars( wxGetCwd() ) );
    wxString    msg = wxString::Format( _( "Current project directory:\n%s" ), GetChars( prj_dir ) );

    wxString    subdir = wxGetTextFromUser( msg, _( "Create New Directory" ), curr_dir );
    wxString    subdir = wxGetTextFromUser( msg, _( "Create New Directory" ), curr_dir );


    if( subdir.IsEmpty() )
    if( subdir.IsEmpty() )
        return;
        return;


    if( wxMkdir( subdir ) )
    wxString full_dirname = prj_dir + wxFileName::GetPathSeparator() + subdir;

    if( wxMkdir( full_dirname ) )
    {
    {
#ifndef KICAD_USE_FILES_WATCHER
#ifndef KICAD_USE_FILES_WATCHER
        AddItemToTreeProject( subdir, root );
        AddItemToTreeProject( subdir, root );
@@ -287,6 +294,14 @@ wxString TREE_PROJECT_FRAME::GetFileExt( TreeFileType type )
        ext = PageLayoutDescrFileExtension;
        ext = PageLayoutDescrFileExtension;
        break;
        break;


    case TREE_FOOTPRINT_FILE:
        ext = KiCadFootprintFileExtension;
        break;

    case TREE_SCHEMATIC_LIBFILE:
        ext = SchematicLibraryFileExtension;
        break;

    default:                       // Eliminates unnecessary GCC warning.
    default:                       // Eliminates unnecessary GCC warning.
        break;
        break;
    }
    }
@@ -357,6 +372,14 @@ wxString TREE_PROJECT_FRAME::GetFileWildcard( TreeFileType type )
        ext = PageLayoutDescrFileWildcard;
        ext = PageLayoutDescrFileWildcard;
        break;
        break;


    case TREE_FOOTPRINT_FILE:
        ext = KiCadFootprintLibFileWildcard;
        break;

    case TREE_SCHEMATIC_LIBFILE:
        ext = SchematicLibraryFileWildcard;
        break;

     default:                       // Eliminates unnecessary GCC warning.
     default:                       // Eliminates unnecessary GCC warning.
        break;
        break;
    }
    }
@@ -536,7 +559,7 @@ bool TREE_PROJECT_FRAME::AddItemToTreeProject( const wxString& aName,
            {
            {
                do    // Add name in tree, but do not recurse
                do    // Add name in tree, but do not recurse
                {
                {
                    wxString path = aName + wxCONFIG_PATH_SEPARATOR + dir_filename;
                    wxString path = aName + wxFileName::GetPathSeparator() + dir_filename;
                    AddItemToTreeProject( path, cellule, false );
                    AddItemToTreeProject( path, cellule, false );
                } while( dir.GetNext( &dir_filename ) );
                } while( dir.GetNext( &dir_filename ) );
            }
            }
@@ -603,8 +626,8 @@ void TREE_PROJECT_FRAME::ReCreateTreePrj()
            {
            {
                if( filename != fn.GetFullName() )
                if( filename != fn.GetFullName() )
                {
                {
                    wxString n = dir.GetName() + wxCONFIG_PATH_SEPARATOR + filename;
                    wxString name = dir.GetName() + wxFileName::GetPathSeparator() + filename;
                    AddItemToTreeProject( n, m_root );
                    AddItemToTreeProject( name, m_root );
                }
                }


                cont = dir.GetNext( &filename );
                cont = dir.GetNext( &filename );
@@ -791,8 +814,8 @@ void TREE_PROJECT_FRAME::OnExpand( wxTreeEvent& Event )
            {
            {
                do    // Add name to tree item, but do not recurse in subdirs:
                do    // Add name to tree item, but do not recurse in subdirs:
                {
                {
                    wxString n = fileName + wxCONFIG_PATH_SEPARATOR + dir_filename;
                    wxString name = fileName + wxFileName::GetPathSeparator() + dir_filename;
                    AddItemToTreeProject( n, kid, false );
                    AddItemToTreeProject( name, kid, false );
                } while( dir.GetNext( &dir_filename ) );
                } while( dir.GetNext( &dir_filename ) );
            }
            }


@@ -830,9 +853,11 @@ TREEPROJECT_ITEM* TREE_PROJECT_FRAME::GetItemIdData( wxTreeItemId aId )


wxTreeItemId TREE_PROJECT_FRAME::findSubdirTreeItem( const wxString& aSubDir )
wxTreeItemId TREE_PROJECT_FRAME::findSubdirTreeItem( const wxString& aSubDir )
{
{
    wxString prj_dir = wxPathOnly( m_Parent->GetProjectFileName() );

    // If the subdir is the current working directory, return m_root
    // If the subdir is the current working directory, return m_root
    // in main list:
    // in main list:
    if( wxGetCwd() == aSubDir )
    if( prj_dir == aSubDir )
        return m_root;
        return m_root;


    // The subdir is in the main tree or in a subdir: Locate it
    // The subdir is in the main tree or in a subdir: Locate it
@@ -905,8 +930,8 @@ void TREE_PROJECT_FRAME::OnFileSystemEvent( wxFileSystemWatcherEvent& event )
        return;
        return;
    }
    }



    wxTreeItemId root_id = findSubdirTreeItem( subdir );
    wxTreeItemId root_id = findSubdirTreeItem( subdir );

    if( !root_id.IsOk() )
    if( !root_id.IsOk() )
        return;
        return;


@@ -976,12 +1001,15 @@ void TREE_PROJECT_FRAME::FileWatcherReset()
    // moreover, under wxWidgets 2.9.4, AddTree does not work properly.
    // moreover, under wxWidgets 2.9.4, AddTree does not work properly.


    // We can see wxString under a debugger, not a wxFileName
    // We can see wxString under a debugger, not a wxFileName
    wxString pro_dir = wxPathOnly( m_Parent->GetProjectFileName() );
    wxString prj_dir = wxPathOnly( m_Parent->GetProjectFileName() );
    wxFileName fn;
    fn.AssignDir( prj_dir );
    fn.DontFollowLink();


#ifdef __WINDOWS__
#ifdef __WINDOWS__
    m_watcher->AddTree( pro_dir );
    m_watcher->AddTree( fn );
#else
#else
    m_watcher->Add( pro_dir );
    m_watcher->Add( fn );


    // Add subdirs
    // Add subdirs
    wxTreeItemIdValue  cookie;
    wxTreeItemIdValue  cookie;
@@ -1017,7 +1045,8 @@ void TREE_PROJECT_FRAME::FileWatcherReset()


            if( wxFileName::IsDirReadable( path ) )     // linux whines about watching protected dir
            if( wxFileName::IsDirReadable( path ) )     // linux whines about watching protected dir
            {
            {
                m_watcher->Add( path );
                fn.AssignDir( path );
                m_watcher->Add( fn );


                // if kid is a subdir, push in list to explore it later
                // if kid is a subdir, push in list to explore it later
                if( itemData->IsPopulated() && m_TreeProject->GetChildrenCount( kid ) )
                if( itemData->IsPopulated() && m_TreeProject->GetChildrenCount( kid ) )
+11 −0
Original line number Original line Diff line number Diff line
@@ -132,8 +132,19 @@
    %pythoncode
    %pythoncode
    {
    {


    /*
     * Get the char buffer of the UTF8 string
     */
    def GetChars(self):
    def GetChars(self):
        return self.Cast_to_CChar()
        return self.Cast_to_CChar()

    /*
     * Convert the UTF8 string to a python string
     * Same as GetChars(), but more easy to use in print command
     */
    def __str__(self):
        return self.GetChars()

    }
    }
}
}
+3 −3
Original line number Original line Diff line number Diff line
@@ -65,7 +65,7 @@ footprint = plugin.FootprintLoad( lib_path2, 'footprint' )


fpid = footprint.GetFPID()
fpid = footprint.GetFPID()
fpid.SetLibNickname( UTF8( 'mylib' ) )
fpid.SetLibNickname( UTF8( 'mylib' ) )
name = fpid.Format().GetChars()
name = fpid.Format().GetChars() # example to get the UTF8 char buffer


# Always after a FootprintLoad() the internal name should match the one used to load it.
# Always after a FootprintLoad() the internal name should match the one used to load it.
print( "Internal name should be 'footprint': '%s'" % name  )
print( "Internal name should be 'footprint': '%s'" % name  )
@@ -76,10 +76,10 @@ footprint = plugin.FootprintLoad( lib_path1, 'mine' )


fpid = footprint.GetFPID()
fpid = footprint.GetFPID()
fpid.SetLibNickname( UTF8( 'other_mylib' ) )
fpid.SetLibNickname( UTF8( 'other_mylib' ) )
name = fpid.Format().GetChars()


# Always after a FootprintLoad() the internal name should match the one used to load it.
# Always after a FootprintLoad() the internal name should match the one used to load it.
print( "Internal name should be 'mine': '%s'" % name )
# Example to print an UTF8 string
print( "Internal name should be 'mine': '%s'" % fpid.Format() )


# As of 3-Dec-2013 this test is passed by KICAD_PLUGIN and Wayne is owed an atta boy!
# As of 3-Dec-2013 this test is passed by KICAD_PLUGIN and Wayne is owed an atta boy!