KiCad: fix template folder load bug.

Add a check to see if the folder selected by the user contains a
project template meta data folder and use that folder instead of
assuming that it is a folder containing sub-folders with project
templates.  The normal behavior is preserved when no meta data
folder is detected.

Fixes lp:1751465

https://bugs.launchpad.net/kicad/+bug/1751465
This commit is contained in:
Wayne Stambaugh 2018-03-19 12:44:00 -04:00
parent 33dcc080ea
commit 620c2af356
1 changed files with 33 additions and 20 deletions

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2012 Brian Sidebotham <brian.sidebotham@gmail.com> * Copyright (C) 2012 Brian Sidebotham <brian.sidebotham@gmail.com>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 1992-2018 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -46,8 +46,10 @@ TEMPLATE_WIDGET::TEMPLATE_WIDGET( wxWindow* aParent, DIALOG_TEMPLATE_SELECTOR* a
// wxWidgets_3.xx way of doing the same... // wxWidgets_3.xx way of doing the same...
// Bind(wxEVT_LEFT_DOWN, &TEMPLATE_WIDGET::OnMouse, this ); // Bind(wxEVT_LEFT_DOWN, &TEMPLATE_WIDGET::OnMouse, this );
m_bitmapIcon->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( TEMPLATE_WIDGET::OnMouse ), NULL, this ); m_bitmapIcon->Connect( wxEVT_LEFT_DOWN,
m_staticTitle->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( TEMPLATE_WIDGET::OnMouse ), NULL, this ); wxMouseEventHandler( TEMPLATE_WIDGET::OnMouse ), NULL, this );
m_staticTitle->Connect( wxEVT_LEFT_DOWN,
wxMouseEventHandler( TEMPLATE_WIDGET::OnMouse ), NULL, this );
// We're not selected until we're clicked // We're not selected until we're clicked
Unselect(); Unselect();
@ -97,7 +99,7 @@ void DIALOG_TEMPLATE_SELECTOR::onNotebookResize(wxSizeEvent& event)
m_panels[i]->SetSize( m_notebook->GetSize().GetWidth() - 6, 140 ); m_panels[i]->SetSize( m_notebook->GetSize().GetWidth() - 6, 140 );
m_panels[i]->m_SizerBase->FitInside( m_panels[i] ); m_panels[i]->m_SizerBase->FitInside( m_panels[i] );
m_panels[i]->m_scrolledWindow->SetSize( m_panels[i]->GetSize().GetWidth() - 6, m_panels[i]->m_scrolledWindow->SetSize( m_panels[i]->GetSize().GetWidth() - 6,
m_panels[i]->GetSize().GetHeight() - 6 ); m_panels[i]->GetSize().GetHeight() - 6 );
m_panels[i]->m_SizerChoice->FitInside( m_panels[i]->m_scrolledWindow ); m_panels[i]->m_SizerChoice->FitInside( m_panels[i]->m_scrolledWindow );
} }
m_notebook->Refresh(); m_notebook->Refresh();
@ -105,6 +107,7 @@ void DIALOG_TEMPLATE_SELECTOR::onNotebookResize(wxSizeEvent& event)
event.Skip(); event.Skip();
} }
void DIALOG_TEMPLATE_SELECTOR::OnPageChange( wxNotebookEvent& event ) void DIALOG_TEMPLATE_SELECTOR::OnPageChange( wxNotebookEvent& event )
{ {
int page = event.GetSelection(); int page = event.GetSelection();
@ -118,7 +121,9 @@ DIALOG_TEMPLATE_SELECTOR::DIALOG_TEMPLATE_SELECTOR( wxWindow* aParent ) :
DIALOG_TEMPLATE_SELECTOR_BASE( aParent ) DIALOG_TEMPLATE_SELECTOR_BASE( aParent )
{ {
m_htmlWin->SetPage( _( "<html><h1>Template Selector</h1></html>" ) ); m_htmlWin->SetPage( _( "<html><h1>Template Selector</h1></html>" ) );
m_notebook->Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_TEMPLATE_SELECTOR::onNotebookResize ), NULL, this ); m_notebook->Connect( wxEVT_SIZE,
wxSizeEventHandler( DIALOG_TEMPLATE_SELECTOR::onNotebookResize ),
NULL, this );
m_selectedWidget = NULL; m_selectedWidget = NULL;
} }
@ -132,6 +137,7 @@ void DIALOG_TEMPLATE_SELECTOR::SetWidget( TEMPLATE_WIDGET* aWidget )
SetHtml( m_selectedWidget->GetTemplate()->GetHtmlFile() ); SetHtml( m_selectedWidget->GetTemplate()->GetHtmlFile() );
} }
void DIALOG_TEMPLATE_SELECTOR::AddTemplate( int aPage, PROJECT_TEMPLATE* aTemplate ) void DIALOG_TEMPLATE_SELECTOR::AddTemplate( int aPage, PROJECT_TEMPLATE* aTemplate )
{ {
TEMPLATE_WIDGET* w = new TEMPLATE_WIDGET( m_panels[aPage]->m_scrolledWindow, this ); TEMPLATE_WIDGET* w = new TEMPLATE_WIDGET( m_panels[aPage]->m_scrolledWindow, this );
@ -142,7 +148,7 @@ void DIALOG_TEMPLATE_SELECTOR::AddTemplate( int aPage, PROJECT_TEMPLATE* aTempla
m_panels[aPage]->SetSize( m_notebook->GetSize().GetWidth() - 6, 140 ); m_panels[aPage]->SetSize( m_notebook->GetSize().GetWidth() - 6, 140 );
m_panels[aPage]->m_SizerBase->FitInside( m_panels[aPage] ); m_panels[aPage]->m_SizerBase->FitInside( m_panels[aPage] );
m_panels[aPage]->m_scrolledWindow->SetSize( m_panels[aPage]->GetSize().GetWidth() - 6, m_panels[aPage]->m_scrolledWindow->SetSize( m_panels[aPage]->GetSize().GetWidth() - 6,
m_panels[aPage]->GetSize().GetHeight() - 6 ); m_panels[aPage]->GetSize().GetHeight() - 6 );
m_panels[aPage]->m_SizerChoice->FitInside( m_panels[aPage]->m_scrolledWindow ); m_panels[aPage]->m_SizerChoice->FitInside( m_panels[aPage]->m_scrolledWindow );
m_notebook->Refresh(); m_notebook->Refresh();
@ -154,6 +160,7 @@ PROJECT_TEMPLATE* DIALOG_TEMPLATE_SELECTOR::GetSelectedTemplate()
return m_selectedWidget? m_selectedWidget->GetTemplate() : NULL; return m_selectedWidget? m_selectedWidget->GetTemplate() : NULL;
} }
void DIALOG_TEMPLATE_SELECTOR::AddTemplatesPage( const wxString& aTitle, wxFileName& aPath ) void DIALOG_TEMPLATE_SELECTOR::AddTemplatesPage( const wxString& aTitle, wxFileName& aPath )
{ {
wxNotebookPage* newPage = new wxNotebookPage( m_notebook, wxID_ANY ); wxNotebookPage* newPage = new wxNotebookPage( m_notebook, wxID_ANY );
@ -172,30 +179,36 @@ void DIALOG_TEMPLATE_SELECTOR::AddTemplatesPage( const wxString& aTitle, wxFileN
buildPageContent( path, m_notebook->GetPageCount() - 1 ); buildPageContent( path, m_notebook->GetPageCount() - 1 );
} }
void DIALOG_TEMPLATE_SELECTOR::buildPageContent( const wxString& aPath, int aPage ) void DIALOG_TEMPLATE_SELECTOR::buildPageContent( const wxString& aPath, int aPage )
{ {
// Get a list of files under the template path to include as choices... // Get a list of files under the template path to include as choices...
wxArrayString files;
wxDir dir; wxDir dir;
if( dir.Open( aPath ) ) if( dir.Open( aPath ) )
{ {
wxDir sub_dir; if( dir.HasSubDirs( "meta" ) )
wxString sub_name;
bool cont = dir.GetFirst( &sub_name, wxEmptyString, wxDIR_DIRS );
while( cont )
{ {
wxString sub_full = aPath + sub_name; AddTemplate( aPage, new PROJECT_TEMPLATE( aPath ) );
if( sub_dir.Open( sub_full ) ) }
else
{
wxDir sub_dir;
wxString sub_name;
bool cont = dir.GetFirst( &sub_name, wxEmptyString, wxDIR_DIRS );
while( cont )
{ {
files.Add( sub_name ); wxString sub_full = aPath + sub_name;
PROJECT_TEMPLATE* pt = new PROJECT_TEMPLATE( sub_full ); if( sub_dir.Open( sub_full ) )
AddTemplate( aPage, pt ); {
AddTemplate( aPage, new PROJECT_TEMPLATE( sub_full ) );
}
cont = dir.GetNext( &sub_name );
} }
cont = dir.GetNext( &sub_name );
} }
} }
} }
@ -270,5 +283,5 @@ void DIALOG_TEMPLATE_SELECTOR::replaceCurrentPage()
void DIALOG_TEMPLATE_SELECTOR::OnHtmlLinkActivated( wxHtmlLinkEvent& event ) void DIALOG_TEMPLATE_SELECTOR::OnHtmlLinkActivated( wxHtmlLinkEvent& event )
{ {
wxString url = event.GetLinkInfo().GetHref(); wxString url = event.GetLinkInfo().GetHref();
wxLaunchDefaultBrowser( url); wxLaunchDefaultBrowser( url );
} }