Convert Footprint Editor to component tree.
Fixes: lp:1784178 * https://bugs.launchpad.net/kicad/+bug/1784178 Fixes: lp:1780363 * https://bugs.launchpad.net/kicad/+bug/1780363
This commit is contained in:
parent
b400565880
commit
0a35c5c97e
|
@ -154,6 +154,12 @@ void LIB_TREE::SelectLibId( const LIB_ID& aLibId )
|
|||
}
|
||||
|
||||
|
||||
void LIB_TREE::CenterLibId( const LIB_ID& aLibId )
|
||||
{
|
||||
centerIfValid( m_adapter->FindItem( aLibId ) );
|
||||
}
|
||||
|
||||
|
||||
void LIB_TREE::Unselect()
|
||||
{
|
||||
m_tree_ctrl->UnselectAll();
|
||||
|
@ -211,6 +217,14 @@ void LIB_TREE::selectIfValid( const wxDataViewItem& aTreeId )
|
|||
}
|
||||
|
||||
|
||||
void LIB_TREE::centerIfValid( const wxDataViewItem& aTreeId )
|
||||
{
|
||||
if( aTreeId.IsOk() )
|
||||
m_tree_ctrl->EnsureVisible( aTreeId );
|
||||
}
|
||||
|
||||
|
||||
|
||||
void LIB_TREE::postPreselectEvent()
|
||||
{
|
||||
wxCommandEvent event( COMPONENT_PRESELECTED );
|
||||
|
|
|
@ -70,12 +70,15 @@ public:
|
|||
LIB_ID GetSelectedLibId( int* aUnit = nullptr ) const;
|
||||
|
||||
/**
|
||||
* Select a part in the tree widget.
|
||||
*
|
||||
* @param aLibId is the identifier of part to be selected.
|
||||
* Select an item in the tree widget.
|
||||
*/
|
||||
void SelectLibId( const LIB_ID& aLibId );
|
||||
|
||||
/**
|
||||
* Ensure that an item is visible (preferrably centered).
|
||||
*/
|
||||
void CenterLibId( const LIB_ID& aLibId );
|
||||
|
||||
/**
|
||||
* Unselect currently selected item in wxDataViewCtrl
|
||||
*/
|
||||
|
@ -118,6 +121,8 @@ protected:
|
|||
*/
|
||||
void selectIfValid( const wxDataViewItem& aTreeId );
|
||||
|
||||
void centerIfValid( const wxDataViewItem& aTreeId );
|
||||
|
||||
/**
|
||||
* Post a wxEVT_DATAVIEW_SELECTION_CHANGED to notify the selection handler
|
||||
* that a new part has been preselected.
|
||||
|
@ -157,6 +162,7 @@ protected:
|
|||
|
||||
void onTreeSelect( wxDataViewEvent& aEvent );
|
||||
void onTreeActivate( wxDataViewEvent& aEvent );
|
||||
void onUpdateUI( wxUpdateUIEvent& aEvent );
|
||||
|
||||
void onDetailsLink( wxHtmlLinkEvent& aEvent );
|
||||
void onPreselect( wxCommandEvent& aEvent );
|
||||
|
|
|
@ -309,7 +309,7 @@ bool LIB_EDIT_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KE
|
|||
keyHandled = true;
|
||||
}
|
||||
|
||||
// Make sure current-part highlighting doesn't get lost in seleciton highlighting
|
||||
// Make sure current-part highlighting doesn't get lost in selection highlighting
|
||||
ClearSearchTreeSelection();
|
||||
|
||||
UpdateStatusBar();
|
||||
|
|
|
@ -1657,14 +1657,14 @@ SYMBOL_LIB_TABLE* LIB_EDIT_FRAME::selectSymLibTable()
|
|||
libTableNames.Add( _( "Global" ) );
|
||||
libTableNames.Add( _( "Project" ) );
|
||||
|
||||
switch( SelectSingleOption( this, _( "Select Symbol Library Table" ),
|
||||
_( "Choose the Library Table to add the library:" ), libTableNames ) )
|
||||
switch( SelectSingleOption( this, _( "Select Library Table" ),
|
||||
_( "Choose the Library Table to add the library to:" ),
|
||||
libTableNames ) )
|
||||
{
|
||||
case 0: return &SYMBOL_LIB_TABLE::GetGlobalLibTable();
|
||||
case 1: return Prj().SchSymbolLibTable();
|
||||
case 0: return &SYMBOL_LIB_TABLE::GetGlobalLibTable();
|
||||
case 1: return Prj().SchSymbolLibTable();
|
||||
default: return nullptr;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -273,12 +273,12 @@ void SCH_BASE_FRAME::OnEditSymbolLibTable( wxCommandEvent& aEvent )
|
|||
DIALOG_EDIT_LIBRARY_TABLES dlg( this, _( "Footprint Libraries" ) );
|
||||
|
||||
dlg.InstallPanel( new PANEL_SYM_LIB_TABLE( &dlg, &SYMBOL_LIB_TABLE::GetGlobalLibTable(),
|
||||
Prj().SchSymbolLibTable() ) );
|
||||
Prj().SchSymbolLibTable() ) );
|
||||
|
||||
if( dlg.ShowModal() == wxID_CANCEL )
|
||||
return;
|
||||
|
||||
saveSymbolLibTables( true, true );
|
||||
saveSymbolLibTables( dlg.m_GlobalTableChanged, dlg.m_ProjectTableChanged );
|
||||
|
||||
LIB_EDIT_FRAME* editor = (LIB_EDIT_FRAME*) Kiway().Player( FRAME_SCH_LIB_EDITOR, false );
|
||||
|
||||
|
|
|
@ -130,8 +130,6 @@ set( PCBNEW_DIALOGS
|
|||
dialogs/dialog_print_using_printer_base.cpp
|
||||
dialogs/dialog_select_net_from_list.cpp
|
||||
dialogs/dialog_select_net_from_list_base.cpp
|
||||
dialogs/dialog_select_pretty_lib.cpp
|
||||
dialogs/dialog_select_pretty_lib_base.cpp
|
||||
dialogs/dialog_set_grid.cpp
|
||||
dialogs/dialog_set_grid_base.cpp
|
||||
dialogs/dialog_swap_layers.cpp
|
||||
|
@ -240,6 +238,7 @@ set( PCBNEW_CLASS_SRCS
|
|||
footprint_editor_utils.cpp
|
||||
footprint_editor_onclick.cpp
|
||||
footprint_editor_options.cpp
|
||||
fp_tree_synchronizing_adapter.cpp
|
||||
footprint_edit_frame.cpp
|
||||
footprint_libraries_utils.cpp
|
||||
footprint_viewer_frame.cpp
|
||||
|
@ -326,6 +325,7 @@ set( PCBNEW_CLASS_SRCS
|
|||
tools/zone_filler_tool.cpp
|
||||
|
||||
footprint_preview_panel.cpp
|
||||
footprint_tree_pane.cpp
|
||||
)
|
||||
|
||||
set( PCBNEW_SRCS
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||
* Copyright (C) 1992-2015 KiCad Developers, see change_log.txt for contributors.
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file dialog_select_pretty_lib.cpp
|
||||
* @brief A dialog to select/create a .pretty folder which is a
|
||||
* footprint library.
|
||||
* footprints are .kicad_mod files inside this folder
|
||||
*/
|
||||
|
||||
#include <wildcards_and_files_ext.h>
|
||||
#include <dialog_select_pretty_lib.h>
|
||||
#include <project.h>
|
||||
|
||||
|
||||
DIALOG_SELECT_PRETTY_LIB::DIALOG_SELECT_PRETTY_LIB( wxWindow* parent,
|
||||
const wxString& aDefaultPath ) :
|
||||
DIALOG_SELECT_PRETTY_LIB_BASE( parent )
|
||||
{
|
||||
if( !aDefaultPath.IsEmpty() )
|
||||
m_dirCtrl->SetPath( aDefaultPath );
|
||||
|
||||
m_sdbSizerOK->SetDefault();
|
||||
|
||||
// Now all widgets have the size fixed, call FinishDialogSettings
|
||||
FinishDialogSettings();
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_SELECT_PRETTY_LIB::OnSelectFolder( wxFileDirPickerEvent& event )
|
||||
{
|
||||
m_libName->SetValue( m_dirCtrl->GetPath() );
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
const wxString DIALOG_SELECT_PRETTY_LIB::GetFullPrettyLibName()
|
||||
{
|
||||
wxFileName fn = m_libName->GetValue();
|
||||
|
||||
if( !fn.IsAbsolute() )
|
||||
fn.MakeAbsolute( m_dirCtrl->GetPath() );
|
||||
|
||||
// Enforce the extension:
|
||||
fn.SetExt( KiCadFootprintLibPathExtension );
|
||||
|
||||
return fn.GetFullPath();
|
||||
}
|
||||
|
||||
void DIALOG_SELECT_PRETTY_LIB::OnOKButton( wxCommandEvent& event )
|
||||
{
|
||||
event.Skip();
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
#ifndef __DIALOG_SELECT_PRETTY_LIB_H__
|
||||
#define __DIALOG_SELECT_PRETTY_LIB_H__
|
||||
|
||||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||
* Copyright (C) 1992-2014 KiCad Developers, see change_log.txt for contributors.
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file dialog_select_pretty_lib.h
|
||||
* @brief A dialog to select/create a .pretty folder which is a
|
||||
* footprint library.
|
||||
* footprints are .kicad_mod files inside this folder
|
||||
*/
|
||||
|
||||
#include <dialog_select_pretty_lib_base.h>
|
||||
|
||||
|
||||
class DIALOG_SELECT_PRETTY_LIB : public DIALOG_SELECT_PRETTY_LIB_BASE
|
||||
{
|
||||
public:
|
||||
DIALOG_SELECT_PRETTY_LIB( wxWindow* parent,
|
||||
const wxString& aDefaultPath );
|
||||
~DIALOG_SELECT_PRETTY_LIB() {};
|
||||
|
||||
/**
|
||||
* @return the full .pretty lib name, which is an absolute path
|
||||
*, ending wityh ".pretty"
|
||||
*/
|
||||
const wxString GetFullPrettyLibName();
|
||||
|
||||
private:
|
||||
virtual void OnSelectFolder( wxFileDirPickerEvent& event ) override;
|
||||
virtual void OnOKButton( wxCommandEvent& event ) override;
|
||||
};
|
||||
|
||||
|
||||
#endif //__DIALOG_SELECT_PRETTY_LIB_BASE_H__
|
|
@ -1,74 +0,0 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Apr 19 2018)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dialog_select_pretty_lib_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DIALOG_SELECT_PRETTY_LIB_BASE::DIALOG_SELECT_PRETTY_LIB_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
|
||||
|
||||
wxBoxSizer* bSizerMain;
|
||||
bSizerMain = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_messageInfo = new wxStaticText( this, wxID_ANY, _("The footprint library is a folder with a name ending with .pretty\nFootprints are .kicad_mod files inside this folder."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_messageInfo->Wrap( -1 );
|
||||
m_messageInfo->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
|
||||
|
||||
bSizerMain->Add( m_messageInfo, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
|
||||
|
||||
m_staticText3 = new wxStaticText( this, wxID_ANY, _("Path base:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticText3->Wrap( -1 );
|
||||
bSizerMain->Add( m_staticText3, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_dirCtrl = new wxDirPickerCtrl( this, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DEFAULT_STYLE );
|
||||
bSizerMain->Add( m_dirCtrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_SizerNewLibName = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_staticTextDirname = new wxStaticText( this, wxID_ANY, _("Library folder (.pretty will be added to name, if missing):"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_staticTextDirname->Wrap( -1 );
|
||||
m_SizerNewLibName->Add( m_staticTextDirname, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
m_libName = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_SizerNewLibName->Add( m_libName, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
bSizerMain->Add( m_SizerNewLibName, 0, wxEXPAND, 5 );
|
||||
|
||||
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
bSizerMain->Add( m_staticline1, 0, wxEXPAND, 5 );
|
||||
|
||||
m_sdbSizer = new wxStdDialogButtonSizer();
|
||||
m_sdbSizerOK = new wxButton( this, wxID_OK );
|
||||
m_sdbSizer->AddButton( m_sdbSizerOK );
|
||||
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
|
||||
m_sdbSizer->AddButton( m_sdbSizerCancel );
|
||||
m_sdbSizer->Realize();
|
||||
|
||||
bSizerMain->Add( m_sdbSizer, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bSizerMain );
|
||||
this->Layout();
|
||||
bSizerMain->Fit( this );
|
||||
|
||||
this->Centre( wxBOTH );
|
||||
|
||||
// Connect Events
|
||||
m_dirCtrl->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( DIALOG_SELECT_PRETTY_LIB_BASE::OnSelectFolder ), NULL, this );
|
||||
m_sdbSizerOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SELECT_PRETTY_LIB_BASE::OnOKButton ), NULL, this );
|
||||
}
|
||||
|
||||
DIALOG_SELECT_PRETTY_LIB_BASE::~DIALOG_SELECT_PRETTY_LIB_BASE()
|
||||
{
|
||||
// Disconnect Events
|
||||
m_dirCtrl->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( DIALOG_SELECT_PRETTY_LIB_BASE::OnSelectFolder ), NULL, this );
|
||||
m_sdbSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_SELECT_PRETTY_LIB_BASE::OnOKButton ), NULL, this );
|
||||
|
||||
}
|
|
@ -1,646 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<wxFormBuilder_Project>
|
||||
<FileVersion major="1" minor="13" />
|
||||
<object class="Project" expanded="1">
|
||||
<property name="class_decoration"></property>
|
||||
<property name="code_generation">C++</property>
|
||||
<property name="disconnect_events">1</property>
|
||||
<property name="disconnect_mode">source_name</property>
|
||||
<property name="disconnect_php_events">0</property>
|
||||
<property name="disconnect_python_events">0</property>
|
||||
<property name="embedded_files_path">res</property>
|
||||
<property name="encoding">UTF-8</property>
|
||||
<property name="event_generation">connect</property>
|
||||
<property name="file">dialog_select_pretty_lib_base</property>
|
||||
<property name="first_id">1000</property>
|
||||
<property name="help_provider">none</property>
|
||||
<property name="indent_with_spaces"></property>
|
||||
<property name="internationalize">1</property>
|
||||
<property name="name">dialog_select_pretty_lib_base</property>
|
||||
<property name="namespace"></property>
|
||||
<property name="path">.</property>
|
||||
<property name="precompiled_header"></property>
|
||||
<property name="relative_path">1</property>
|
||||
<property name="skip_lua_events">1</property>
|
||||
<property name="skip_php_events">1</property>
|
||||
<property name="skip_python_events">1</property>
|
||||
<property name="ui_table">UI</property>
|
||||
<property name="use_enum">0</property>
|
||||
<property name="use_microsoft_bom">0</property>
|
||||
<object class="Dialog" expanded="1">
|
||||
<property name="aui_managed">0</property>
|
||||
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
|
||||
<property name="bg"></property>
|
||||
<property name="center">wxBOTH</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="event_handler">impl_virtual</property>
|
||||
<property name="extra_style"></property>
|
||||
<property name="fg"></property>
|
||||
<property name="font"></property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="minimum_size">-1,-1</property>
|
||||
<property name="name">DIALOG_SELECT_PRETTY_LIB_BASE</property>
|
||||
<property name="pos"></property>
|
||||
<property name="size">-1,-1</property>
|
||||
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
|
||||
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
|
||||
<property name="title">Select Footprint Library Folder</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnActivate"></event>
|
||||
<event name="OnActivateApp"></event>
|
||||
<event name="OnAuiFindManager"></event>
|
||||
<event name="OnAuiPaneButton"></event>
|
||||
<event name="OnAuiPaneClose"></event>
|
||||
<event name="OnAuiPaneMaximize"></event>
|
||||
<event name="OnAuiPaneRestore"></event>
|
||||
<event name="OnAuiRender"></event>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnClose"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnHibernate"></event>
|
||||
<event name="OnIconize"></event>
|
||||
<event name="OnIdle"></event>
|
||||
<event name="OnInitDialog"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizerMain</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxALIGN_CENTER_HORIZONTAL</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font">,90,92,-1,70,0</property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">The footprint library is a folder with a name ending with .pretty
Footprints are .kicad_mod files inside this folder.</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_messageInfo</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Path base:</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_staticText3</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxDirPickerCtrl" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="message">Select a folder</property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_dirCtrl</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxDIRP_DEFAULT_STYLE</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="value"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnDirChanged">OnSelectFolder</event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxBoxSizer" expanded="1">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_SizerNewLibName</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">protected</property>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticText" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="label">Library folder (.pretty will be added to name, if missing):</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_staticTextDirname</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<property name="wrap">-1</property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="maxlength">0</property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_libName</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style"></property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="value"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnText"></event>
|
||||
<event name="OnTextEnter"></event>
|
||||
<event name="OnTextMaxLen"></event>
|
||||
<event name="OnTextURL"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStaticLine" expanded="1">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer"></property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position"></property>
|
||||
<property name="aui_row"></property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_staticline1</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxLI_HORIZONTAL</property>
|
||||
<property name="subclass"></property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
<event name="OnChar"></event>
|
||||
<event name="OnEnterWindow"></event>
|
||||
<event name="OnEraseBackground"></event>
|
||||
<event name="OnKeyDown"></event>
|
||||
<event name="OnKeyUp"></event>
|
||||
<event name="OnKillFocus"></event>
|
||||
<event name="OnLeaveWindow"></event>
|
||||
<event name="OnLeftDClick"></event>
|
||||
<event name="OnLeftDown"></event>
|
||||
<event name="OnLeftUp"></event>
|
||||
<event name="OnMiddleDClick"></event>
|
||||
<event name="OnMiddleDown"></event>
|
||||
<event name="OnMiddleUp"></event>
|
||||
<event name="OnMotion"></event>
|
||||
<event name="OnMouseEvents"></event>
|
||||
<event name="OnMouseWheel"></event>
|
||||
<event name="OnPaint"></event>
|
||||
<event name="OnRightDClick"></event>
|
||||
<event name="OnRightDown"></event>
|
||||
<event name="OnRightUp"></event>
|
||||
<event name="OnSetFocus"></event>
|
||||
<event name="OnSize"></event>
|
||||
<event name="OnUpdateUI"></event>
|
||||
</object>
|
||||
</object>
|
||||
<object class="sizeritem" expanded="1">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxStdDialogButtonSizer" expanded="1">
|
||||
<property name="Apply">0</property>
|
||||
<property name="Cancel">1</property>
|
||||
<property name="ContextHelp">0</property>
|
||||
<property name="Help">0</property>
|
||||
<property name="No">0</property>
|
||||
<property name="OK">1</property>
|
||||
<property name="Save">0</property>
|
||||
<property name="Yes">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">m_sdbSizer</property>
|
||||
<property name="permission">protected</property>
|
||||
<event name="OnApplyButtonClick"></event>
|
||||
<event name="OnCancelButtonClick"></event>
|
||||
<event name="OnContextHelpButtonClick"></event>
|
||||
<event name="OnHelpButtonClick"></event>
|
||||
<event name="OnNoButtonClick"></event>
|
||||
<event name="OnOKButtonClick">OnOKButton</event>
|
||||
<event name="OnSaveButtonClick"></event>
|
||||
<event name="OnYesButtonClick"></event>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</wxFormBuilder_Project>
|
|
@ -1,62 +0,0 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version Apr 19 2018)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __DIALOG_SELECT_PRETTY_LIB_BASE_H__
|
||||
#define __DIALOG_SELECT_PRETTY_LIB_BASE_H__
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include <wx/intl.h>
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/string.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/filepicker.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/statline.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/dialog.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class DIALOG_SELECT_PRETTY_LIB_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class DIALOG_SELECT_PRETTY_LIB_BASE : public DIALOG_SHIM
|
||||
{
|
||||
private:
|
||||
|
||||
protected:
|
||||
wxStaticText* m_messageInfo;
|
||||
wxStaticText* m_staticText3;
|
||||
wxDirPickerCtrl* m_dirCtrl;
|
||||
wxBoxSizer* m_SizerNewLibName;
|
||||
wxStaticText* m_staticTextDirname;
|
||||
wxTextCtrl* m_libName;
|
||||
wxStaticLine* m_staticline1;
|
||||
wxStdDialogButtonSizer* m_sdbSizer;
|
||||
wxButton* m_sdbSizerOK;
|
||||
wxButton* m_sdbSizerCancel;
|
||||
|
||||
// Virtual event handlers, overide them in your derived class
|
||||
virtual void OnSelectFolder( wxFileDirPickerEvent& event ) { event.Skip(); }
|
||||
virtual void OnOKButton( wxCommandEvent& event ) { event.Skip(); }
|
||||
|
||||
|
||||
public:
|
||||
|
||||
DIALOG_SELECT_PRETTY_LIB_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select Footprint Library Folder"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||
~DIALOG_SELECT_PRETTY_LIB_BASE();
|
||||
|
||||
};
|
||||
|
||||
#endif //__DIALOG_SELECT_PRETTY_LIB_BASE_H__
|
|
@ -774,7 +774,17 @@ int InvokePcbLibTableEditor( wxTopLevelWindow* aCaller, FP_LIB_TABLE* aGlobalTab
|
|||
|
||||
dlg.InstallPanel( new PANEL_FP_LIB_TABLE( &dlg, aGlobalTable, aProjectTable ) );
|
||||
|
||||
return dlg.ShowModal();
|
||||
int ret = 0;
|
||||
|
||||
if( dlg.ShowModal() != wxID_CANCEL )
|
||||
{
|
||||
if( dlg.m_GlobalTableChanged )
|
||||
ret += 1;
|
||||
if( dlg.m_ProjectTableChanged )
|
||||
ret += 2;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -58,6 +58,11 @@
|
|||
#include <tool/tool_dispatcher.h>
|
||||
#include <tool/zoom_tool.h>
|
||||
|
||||
#include <footprint_tree_pane.h>
|
||||
#include <widgets/lib_tree.h>
|
||||
#include <fp_lib_table.h>
|
||||
#include <footprint_info_impl.h>
|
||||
|
||||
#include <widgets/paged_dialog.h>
|
||||
#include <dialogs/panel_modedit_settings.h>
|
||||
#include <dialogs/panel_modedit_defaults.h>
|
||||
|
@ -65,6 +70,7 @@
|
|||
#include <dialog_configure_paths.h>
|
||||
|
||||
#include <tools/position_relative_tool.h>
|
||||
#include <widgets/progress_reporter.h>
|
||||
#include "tools/selection_tool.h"
|
||||
#include "tools/edit_tool.h"
|
||||
#include "tools/drawing_tool.h"
|
||||
|
@ -88,10 +94,8 @@ BEGIN_EVENT_TABLE( FOOTPRINT_EDIT_FRAME, PCB_BASE_FRAME )
|
|||
EVT_CHOICE( ID_ON_ZOOM_SELECT, FOOTPRINT_EDIT_FRAME::OnSelectZoom )
|
||||
EVT_CHOICE( ID_ON_GRID_SELECT, FOOTPRINT_EDIT_FRAME::OnSelectGrid )
|
||||
|
||||
EVT_TOOL( ID_MODEDIT_SAVE_LIBRARY_AS, FOOTPRINT_EDIT_FRAME::OnSaveLibraryAs )
|
||||
|
||||
EVT_TOOL( ID_MODEDIT_SAVE_LIBMODULE, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_TOOL( ID_MODEDIT_SAVE_LIBMODULE_AS, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_TOOL( ID_MODEDIT_SAVE, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_TOOL( ID_MODEDIT_SAVE_AS, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_TOOL( ID_OPEN_MODULE_VIEWER, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
|
||||
EVT_TOOL( ID_MODEDIT_DELETE_PART, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
|
@ -103,7 +107,7 @@ BEGIN_EVENT_TABLE( FOOTPRINT_EDIT_FRAME, PCB_BASE_FRAME )
|
|||
EVT_TOOL( ID_MODEDIT_SHEET_SET, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_TOOL( ID_GEN_IMPORT_DXF_FILE, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_TOOL( wxID_PRINT, FOOTPRINT_EDIT_FRAME::ToPrinter )
|
||||
EVT_TOOL( ID_MODEDIT_LOAD_MODULE, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_TOOL( ID_MODEDIT_EDIT_MODULE, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_TOOL( ID_MODEDIT_CHECK, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_TOOL( ID_MODEDIT_PAD_SETTINGS, FOOTPRINT_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_TOOL( ID_MODEDIT_LOAD_MODULE_FROM_BOARD, FOOTPRINT_EDIT_FRAME::LoadModuleFromBoard )
|
||||
|
@ -170,10 +174,10 @@ BEGIN_EVENT_TABLE( FOOTPRINT_EDIT_FRAME, PCB_BASE_FRAME )
|
|||
EVT_MENU( ID_MENU_CANVAS_OPENGL, PCB_BASE_FRAME::OnSwitchCanvas )
|
||||
|
||||
// UI update events.
|
||||
EVT_UPDATE_UI( ID_MODEDIT_EXPORT_PART, FOOTPRINT_EDIT_FRAME::OnUpdateModuleSelected )
|
||||
EVT_UPDATE_UI( ID_MODEDIT_SAVE_LIBMODULE, FOOTPRINT_EDIT_FRAME::OnUpdateModuleSelected )
|
||||
EVT_UPDATE_UI( ID_MODEDIT_SAVE_LIBMODULE_AS, FOOTPRINT_EDIT_FRAME::OnUpdateModuleSelected )
|
||||
EVT_UPDATE_UI( ID_MODEDIT_SAVE_LIBRARY_AS, FOOTPRINT_EDIT_FRAME::OnUpdateModuleSelected )
|
||||
EVT_UPDATE_UI( ID_MODEDIT_EXPORT_PART, FOOTPRINT_EDIT_FRAME::OnUpdateModuleTargeted )
|
||||
EVT_UPDATE_UI( ID_MODEDIT_SAVE, FOOTPRINT_EDIT_FRAME::OnUpdateSave )
|
||||
EVT_UPDATE_UI( ID_MODEDIT_SAVE_AS, FOOTPRINT_EDIT_FRAME::OnUpdateSaveAs )
|
||||
EVT_UPDATE_UI( ID_MODEDIT_DELETE_PART, FOOTPRINT_EDIT_FRAME::OnUpdateModuleTargeted )
|
||||
EVT_UPDATE_UI( ID_MODEDIT_LOAD_MODULE_FROM_BOARD,
|
||||
FOOTPRINT_EDIT_FRAME::OnUpdateLoadModuleFromBoard )
|
||||
EVT_UPDATE_UI( ID_MODEDIT_INSERT_MODULE_IN_BOARD,
|
||||
|
@ -186,12 +190,14 @@ BEGIN_EVENT_TABLE( FOOTPRINT_EDIT_FRAME, PCB_BASE_FRAME )
|
|||
EVT_UPDATE_UI_RANGE( ID_MODEDIT_PAD_TOOL, ID_MODEDIT_MEASUREMENT_TOOL,
|
||||
FOOTPRINT_EDIT_FRAME::OnUpdateVerticalToolbar )
|
||||
|
||||
EVT_UPDATE_UI( ID_MODEDIT_EDIT_MODULE_PROPERTIES, FOOTPRINT_EDIT_FRAME::OnUpdateModuleSelected )
|
||||
EVT_UPDATE_UI( ID_MODEDIT_PAD_SETTINGS, FOOTPRINT_EDIT_FRAME::OnUpdateModuleSelected )
|
||||
|
||||
// Option toolbar:
|
||||
EVT_UPDATE_UI( ID_TB_OPTIONS_SHOW_HIGH_CONTRAST_MODE,
|
||||
FOOTPRINT_EDIT_FRAME::OnUpdateOptionsToolbar )
|
||||
|
||||
EVT_UPDATE_UI( ID_GEN_IMPORT_DXF_FILE,
|
||||
FOOTPRINT_EDIT_FRAME::OnUpdateModuleSelected )
|
||||
EVT_UPDATE_UI( ID_GEN_IMPORT_DXF_FILE, FOOTPRINT_EDIT_FRAME::OnUpdateModuleSelected )
|
||||
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
@ -262,6 +268,10 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
|||
SetPageSettings( PAGE_INFO( PAGE_INFO::A4 ) );
|
||||
|
||||
SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
|
||||
|
||||
initLibraryTree();
|
||||
m_treePane = new FOOTPRINT_TREE_PANE( this );
|
||||
|
||||
ReCreateMenuBar();
|
||||
ReCreateHToolbar();
|
||||
ReCreateAuxiliaryToolbar();
|
||||
|
@ -317,6 +327,9 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
|||
m_auimgr.AddPane( m_messagePanel,
|
||||
wxAuiPaneInfo( mesg_pane ).Name( "MsgPanel" ).Bottom().Layer(10) );
|
||||
|
||||
m_auimgr.AddPane( m_treePane, wxAuiPaneInfo().Name( "FootprintTree" ).Left().Row( 1 )
|
||||
.Resizable().MinSize( 250, 400 ).Dock().CloseButton( false ) );
|
||||
|
||||
// Create the manager and dispatcher & route draw panel events to the dispatcher
|
||||
setupTools();
|
||||
GetGalCanvas()->GetGAL()->SetAxesEnabled( true );
|
||||
|
@ -360,36 +373,35 @@ BOARD_ITEM_CONTAINER* FOOTPRINT_EDIT_FRAME::GetModel() const
|
|||
}
|
||||
|
||||
|
||||
const wxString FOOTPRINT_EDIT_FRAME::getLibPath()
|
||||
LIB_ID FOOTPRINT_EDIT_FRAME::getTargetLibId() const
|
||||
{
|
||||
try
|
||||
{
|
||||
const wxString& nickname = GetCurrentLib();
|
||||
LIB_ID id = m_treePane->GetLibTree()->GetSelectedLibId();
|
||||
wxString nickname = id.GetLibNickname();
|
||||
|
||||
const FP_LIB_TABLE_ROW* row = Prj().PcbFootprintLibs()->FindRow( nickname );
|
||||
if( nickname.IsEmpty() )
|
||||
return GetCurrentLibId();
|
||||
|
||||
return row->GetFullURI( true );
|
||||
}
|
||||
catch( const IO_ERROR& )
|
||||
{
|
||||
return wxEmptyString;
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
|
||||
const wxString FOOTPRINT_EDIT_FRAME::GetCurrentLib() const
|
||||
LIB_ID FOOTPRINT_EDIT_FRAME::GetCurrentLibId() const
|
||||
{
|
||||
return Prj().GetRString( PROJECT::PCB_LIB_NICKNAME );
|
||||
MODULE* module = GetBoard()->m_Modules;
|
||||
|
||||
if( module )
|
||||
return module->GetFPID();
|
||||
else
|
||||
return LIB_ID();
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINT_EDIT_FRAME::retainLastFootprint()
|
||||
{
|
||||
MODULE* module = GetBoard()->m_Modules;
|
||||
LIB_ID id = GetCurrentLibId();
|
||||
|
||||
if( module )
|
||||
if( id.IsValid() )
|
||||
{
|
||||
LIB_ID id = module->GetFPID();
|
||||
Prj().SetRString( PROJECT::PCB_FOOTPRINT_EDITOR_NICKNAME, id.GetLibNickname() );
|
||||
Prj().SetRString( PROJECT::PCB_FOOTPRINT_EDITOR_FPNAME, id.GetLibItemName() );
|
||||
}
|
||||
|
@ -509,6 +521,7 @@ void FOOTPRINT_EDIT_FRAME::OnCloseWindow( wxCloseEvent& Event )
|
|||
|
||||
switch( ii )
|
||||
{
|
||||
default:
|
||||
case wxID_NO:
|
||||
break;
|
||||
|
||||
|
@ -584,6 +597,28 @@ void FOOTPRINT_EDIT_FRAME::OnUpdateModuleSelected( wxUpdateUIEvent& aEvent )
|
|||
}
|
||||
|
||||
|
||||
void FOOTPRINT_EDIT_FRAME::OnUpdateModuleTargeted( wxUpdateUIEvent& aEvent )
|
||||
{
|
||||
aEvent.Enable( getTargetLibId().IsValid() );
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINT_EDIT_FRAME::OnUpdateSave( wxUpdateUIEvent& aEvent )
|
||||
{
|
||||
aEvent.Enable( GetBoard()->m_Modules && GetScreen()->IsModify() );
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINT_EDIT_FRAME::OnUpdateSaveAs( wxUpdateUIEvent& aEvent )
|
||||
{
|
||||
LIB_ID libId = getTargetLibId();
|
||||
const wxString& libName = libId.GetLibNickname();
|
||||
const wxString& partName = libId.GetLibItemName();
|
||||
|
||||
aEvent.Enable( !libName.IsEmpty() || !partName.IsEmpty() );
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINT_EDIT_FRAME::OnUpdateLoadModuleFromBoard( wxUpdateUIEvent& aEvent )
|
||||
{
|
||||
PCB_EDIT_FRAME* frame = (PCB_EDIT_FRAME*) Kiway().Player( FRAME_PCB, false );
|
||||
|
@ -691,35 +726,37 @@ void FOOTPRINT_EDIT_FRAME::OnModify()
|
|||
{
|
||||
PCB_BASE_FRAME::OnModify();
|
||||
Update3DView();
|
||||
m_treePane->GetLibTree()->Refresh();
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINT_EDIT_FRAME::updateTitle()
|
||||
{
|
||||
wxString title = _( "Footprint Editor" );
|
||||
MODULE* module = GetBoard()->m_Modules;
|
||||
LIB_ID fpid = GetCurrentLibId();
|
||||
bool writable = true;
|
||||
|
||||
if( module )
|
||||
if( fpid.IsValid() )
|
||||
{
|
||||
bool writable = true;
|
||||
const LIB_ID& fpid = module->GetFPID();
|
||||
wxString nickname = fpid.GetLibNickname();
|
||||
|
||||
if( !nickname.IsEmpty() )
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
writable = Prj().PcbFootprintLibs()->IsFootprintLibWritable( nickname );
|
||||
}
|
||||
catch( const IO_ERROR& )
|
||||
{
|
||||
}
|
||||
writable = Prj().PcbFootprintLibs()->IsFootprintLibWritable( fpid.GetLibNickname() );
|
||||
}
|
||||
catch( const IO_ERROR& )
|
||||
{
|
||||
// best efforts...
|
||||
}
|
||||
|
||||
title += wxString::Format( wxT( " \u2014 %s %s" ),
|
||||
FROM_UTF8( module->GetFPID().Format().c_str() ),
|
||||
FROM_UTF8( fpid.Format().c_str() ),
|
||||
writable ? wxString( wxEmptyString ) : _( "[Read Only]" ) );
|
||||
}
|
||||
else if( !fpid.GetLibItemName().empty() )
|
||||
{
|
||||
title += wxString::Format( wxT( " \u2014 %s %s" ),
|
||||
FROM_UTF8( fpid.GetLibItemName().c_str() ),
|
||||
_( "[Unsaved]" ) );
|
||||
}
|
||||
|
||||
SetTitle( title );
|
||||
}
|
||||
|
@ -736,6 +773,68 @@ void FOOTPRINT_EDIT_FRAME::updateView()
|
|||
}
|
||||
|
||||
|
||||
void FOOTPRINT_EDIT_FRAME::initLibraryTree()
|
||||
{
|
||||
FP_LIB_TABLE* fpTable = Prj().PcbFootprintLibs();
|
||||
|
||||
WX_PROGRESS_REPORTER progressReporter( this, _( "Loading Footprint Libraries" ), 2 );
|
||||
GFootprintList.ReadFootprintFiles( fpTable, NULL, &progressReporter );
|
||||
progressReporter.Show( false );
|
||||
|
||||
if( GFootprintList.GetErrorCount() )
|
||||
GFootprintList.DisplayErrors( this );
|
||||
|
||||
m_adapter = FP_TREE_SYNCHRONIZING_ADAPTER::Create( this, fpTable );
|
||||
auto adapter = static_cast<FP_TREE_SYNCHRONIZING_ADAPTER*>( m_adapter.get() );
|
||||
|
||||
adapter->AddLibraries();
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINT_EDIT_FRAME::syncLibraryTree( bool aProgress )
|
||||
{
|
||||
FP_LIB_TABLE* fpTable = Prj().PcbFootprintLibs();
|
||||
auto adapter = static_cast<FP_TREE_SYNCHRONIZING_ADAPTER*>( m_adapter.get() );
|
||||
LIB_ID target = getTargetLibId();
|
||||
bool targetSelected = ( target == m_treePane->GetLibTree()->GetSelectedLibId() );
|
||||
|
||||
// Sync FOOTPRINT_INFO list to the libraries on disk
|
||||
if( aProgress )
|
||||
{
|
||||
WX_PROGRESS_REPORTER progressReporter( this, _( "Updating Footprint Libraries" ), 2 );
|
||||
GFootprintList.ReadFootprintFiles( fpTable, NULL, &progressReporter );
|
||||
progressReporter.Show( false );
|
||||
}
|
||||
else
|
||||
{
|
||||
GFootprintList.ReadFootprintFiles( fpTable, NULL, NULL );
|
||||
}
|
||||
|
||||
// Sync the LIB_TREE to the FOOTPRINT_INFO list
|
||||
adapter->Sync();
|
||||
|
||||
m_treePane->GetLibTree()->Unselect();
|
||||
m_treePane->Regenerate();
|
||||
|
||||
if( target.IsValid() )
|
||||
{
|
||||
if( adapter->FindItem( target ) )
|
||||
{
|
||||
if( targetSelected )
|
||||
m_treePane->GetLibTree()->SelectLibId( target );
|
||||
else
|
||||
m_treePane->GetLibTree()->CenterLibId( target );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Try to focus on parent
|
||||
target.SetLibItemName( wxEmptyString );
|
||||
m_treePane->GetLibTree()->CenterLibId( target );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool FOOTPRINT_EDIT_FRAME::IsGridVisible() const
|
||||
{
|
||||
return IsElementVisible( LAYER_GRID );
|
||||
|
@ -796,11 +895,9 @@ void FOOTPRINT_EDIT_FRAME::ProcessPreferences( wxCommandEvent& event )
|
|||
}
|
||||
catch( const IO_ERROR& ioe )
|
||||
{
|
||||
wxString msg = wxString::Format( _(
|
||||
"Error occurred saving the global footprint library "
|
||||
"table:\n\n%s" ),
|
||||
GetChars( ioe.What().GetData() )
|
||||
);
|
||||
wxString msg;
|
||||
msg.Printf( _( "Error saving the global footprint library table:\n\n%s" ),
|
||||
ioe.What().GetData() );
|
||||
wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
|
||||
}
|
||||
}
|
||||
|
@ -816,11 +913,9 @@ void FOOTPRINT_EDIT_FRAME::ProcessPreferences( wxCommandEvent& event )
|
|||
}
|
||||
catch( const IO_ERROR& ioe )
|
||||
{
|
||||
wxString msg = wxString::Format( _(
|
||||
"Error occurred saving project specific footprint library "
|
||||
"table:\n\n%s" ),
|
||||
GetChars( ioe.What() )
|
||||
);
|
||||
wxString msg;
|
||||
msg.Printf( _( "Error saving project specific footprint library table:\n\n%s" ),
|
||||
ioe.What() );
|
||||
wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR );
|
||||
}
|
||||
}
|
||||
|
@ -828,8 +923,13 @@ void FOOTPRINT_EDIT_FRAME::ProcessPreferences( wxCommandEvent& event )
|
|||
FOOTPRINT_VIEWER_FRAME* viewer;
|
||||
viewer = (FOOTPRINT_VIEWER_FRAME*)Kiway().Player( FRAME_PCB_MODULE_VIEWER, false );
|
||||
|
||||
if( tableChanged && viewer != NULL )
|
||||
viewer->ReCreateLibraryList();
|
||||
if( tableChanged )
|
||||
{
|
||||
if( viewer != NULL )
|
||||
viewer->ReCreateLibraryList();
|
||||
|
||||
syncLibraryTree( true );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -29,10 +29,13 @@
|
|||
#include <pcb_base_edit_frame.h>
|
||||
#include <io_mgr.h>
|
||||
#include <config_params.h>
|
||||
#include <fp_tree_synchronizing_adapter.h>
|
||||
|
||||
class PCB_LAYER_WIDGET;
|
||||
class FP_LIB_TABLE;
|
||||
class EDGE_MODULE;
|
||||
class FOOTPRINT_TREE_PANE;
|
||||
class LIB_MANAGER;
|
||||
|
||||
namespace PCB { struct IFACE; } // A KIFACE_I coded in pcbnew.c
|
||||
|
||||
|
@ -41,6 +44,9 @@ class FOOTPRINT_EDIT_FRAME : public PCB_BASE_EDIT_FRAME
|
|||
{
|
||||
friend struct PCB::IFACE;
|
||||
|
||||
FOOTPRINT_TREE_PANE* m_treePane;
|
||||
LIB_TREE_MODEL_ADAPTER::PTR m_adapter;
|
||||
|
||||
public:
|
||||
|
||||
~FOOTPRINT_EDIT_FRAME();
|
||||
|
@ -132,13 +138,13 @@ public:
|
|||
void OnConfigurePaths( wxCommandEvent& aEvent );
|
||||
|
||||
/**
|
||||
* Function OnSaveLibraryAs
|
||||
* saves the current library to a new name and/or library type.
|
||||
* Function SaveLibraryAs
|
||||
* saves a library to a new name and/or library type.
|
||||
*
|
||||
* @note Saving as a new library type requires the plug-in to support saving libraries
|
||||
* @see PLUGIN::FootprintSave and PLUGIN::FootprintLibCreate
|
||||
*/
|
||||
void OnSaveLibraryAs( wxCommandEvent& aEvent );
|
||||
bool SaveLibraryAs( const wxString& aLibraryPath );
|
||||
|
||||
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
||||
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
||||
|
@ -183,6 +189,9 @@ public:
|
|||
|
||||
void OnUpdateOptionsToolbar( wxUpdateUIEvent& aEvent );
|
||||
void OnUpdateModuleSelected( wxUpdateUIEvent& aEvent );
|
||||
void OnUpdateModuleTargeted( wxUpdateUIEvent& aEvent );
|
||||
void OnUpdateSave( wxUpdateUIEvent& aEvent );
|
||||
void OnUpdateSaveAs( wxUpdateUIEvent& aEvent );
|
||||
void OnUpdateLoadModuleFromBoard( wxUpdateUIEvent& aEvent );
|
||||
void OnUpdateInsertModuleInBoard( wxUpdateUIEvent& aEvent );
|
||||
void OnUpdateReplaceModuleInBoard( wxUpdateUIEvent& aEvent );
|
||||
|
@ -196,6 +205,11 @@ public:
|
|||
*/
|
||||
void LoadModuleFromBoard( wxCommandEvent& event );
|
||||
|
||||
/**
|
||||
* Returns the adapter object that provides the stored data.
|
||||
*/
|
||||
LIB_TREE_MODEL_ADAPTER::PTR& GetLibTreeAdapter() { return m_adapter; }
|
||||
|
||||
/**
|
||||
* Function SaveFootprint
|
||||
* Save in an existing library a given footprint
|
||||
|
@ -267,8 +281,11 @@ public:
|
|||
|
||||
BOARD_ITEM* ModeditLocateAndDisplay( int aHotKeyCode = 0 );
|
||||
|
||||
/// Return the current library nickname.
|
||||
const wxString GetCurrentLib() const;
|
||||
/// Return the LIB_ID of the part selected in the footprint or the part being edited.
|
||||
LIB_ID getTargetLibId() const;
|
||||
|
||||
/// Return the LIB_ID of the part being edited.
|
||||
LIB_ID GetCurrentLibId() const;
|
||||
|
||||
void RemoveStruct( EDA_ITEM* Item );
|
||||
|
||||
|
@ -378,9 +395,9 @@ public:
|
|||
|
||||
/**
|
||||
* Function DeleteModuleFromLibrary
|
||||
* prompts user for footprint name, then deletes it from current library.
|
||||
* deletes the given module from its library.
|
||||
*/
|
||||
bool DeleteModuleFromLibrary();
|
||||
bool DeleteModuleFromLibrary( MODULE* aModule );
|
||||
|
||||
/**
|
||||
* Function IsElementVisible
|
||||
|
@ -446,6 +463,18 @@ public:
|
|||
*/
|
||||
bool OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl = 0 ) override;
|
||||
|
||||
/**
|
||||
* Build the footprint library tree. Displays a progress dialog.
|
||||
*/
|
||||
void initLibraryTree();
|
||||
|
||||
/**
|
||||
* Synchronize the footprint library tree to the current state of the footprint library
|
||||
* table.
|
||||
* @param aProgress
|
||||
*/
|
||||
void syncLibraryTree( bool aProgress );
|
||||
|
||||
/**
|
||||
* Allows Modedit to install its preferences panel into the preferences dialog.
|
||||
*/
|
||||
|
@ -486,9 +515,6 @@ protected:
|
|||
/// Reloads displayed items and sets view.
|
||||
void updateView();
|
||||
|
||||
/// The libPath is not publicly visible, grab it from the FP_LIB_TABLE if we must.
|
||||
const wxString getLibPath();
|
||||
|
||||
void restoreLastFootprint();
|
||||
void retainLastFootprint();
|
||||
|
||||
|
|
|
@ -52,6 +52,9 @@
|
|||
#include <pcbnew_id.h>
|
||||
#include <footprint_edit_frame.h>
|
||||
#include <footprint_viewer_frame.h>
|
||||
#include <footprint_tree_pane.h>
|
||||
#include <fp_lib_table.h>
|
||||
#include <widgets/lib_tree.h>
|
||||
#include <collectors.h>
|
||||
#include <tool/tool_manager.h>
|
||||
#include <tools/pcb_actions.h>
|
||||
|
@ -279,12 +282,19 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
break;
|
||||
|
||||
case ID_MODEDIT_DELETE_PART:
|
||||
if( DeleteModuleFromLibrary() )
|
||||
Clear_Pcb( false );
|
||||
if( DeleteModuleFromLibrary( LoadFootprint( getTargetLibId() ) ) )
|
||||
{
|
||||
if( getTargetLibId() == GetCurrentLibId() )
|
||||
Clear_Pcb( false );
|
||||
|
||||
syncLibraryTree( true );
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_MODEDIT_NEW_MODULE:
|
||||
{
|
||||
LIB_ID selected = m_treePane->GetLibTree()->GetSelectedLibId();
|
||||
|
||||
if( GetScreen()->IsModify() && !GetBoard()->IsEmpty() )
|
||||
{
|
||||
KIDIALOG dlg( this, _( "The current footprint contains unsaved changes." ),
|
||||
|
@ -315,21 +325,39 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
GetBoard()->m_Modules->ClearFlags();
|
||||
|
||||
Zoom_Automatique( false );
|
||||
GetScreen()->SetModify();
|
||||
|
||||
// If selected from the library tree then go ahead and save it there
|
||||
if( !selected.GetLibNickname().empty() )
|
||||
{
|
||||
LIB_ID fpid = module->GetFPID();
|
||||
fpid.SetLibNickname( selected.GetLibNickname() );
|
||||
module->SetFPID( fpid );
|
||||
SaveFootprint( module );
|
||||
GetScreen()->ClrModify();
|
||||
}
|
||||
}
|
||||
|
||||
updateView();
|
||||
m_canvas->Refresh();
|
||||
Update3DView();
|
||||
|
||||
GetScreen()->ClrModify();
|
||||
syncLibraryTree( false );
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_MODEDIT_NEW_MODULE_FROM_WIZARD:
|
||||
{
|
||||
LIB_ID selected = m_treePane->GetLibTree()->GetSelectedLibId();
|
||||
|
||||
if( GetScreen()->IsModify() && !GetBoard()->IsEmpty() )
|
||||
{
|
||||
if( !IsOK( this,
|
||||
_( "Current Footprint will be lost and this operation cannot be undone. Continue ?" ) ) )
|
||||
KIDIALOG dlg( this, _( "The current footprint contains unsaved changes." ),
|
||||
_( "Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
|
||||
dlg.SetOKLabel( _( "Discard Changes" ) );
|
||||
dlg.DoNotShowCheckbox();
|
||||
|
||||
if( dlg.ShowModal() == wxID_CANCEL )
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -359,48 +387,79 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
module->ClearFlags();
|
||||
|
||||
Zoom_Automatique( false );
|
||||
GetScreen()->SetModify();
|
||||
|
||||
// If selected from the library tree then go ahead and save it there
|
||||
if( !selected.GetLibNickname().empty() )
|
||||
{
|
||||
LIB_ID fpid = module->GetFPID();
|
||||
fpid.SetLibNickname( selected.GetLibNickname() );
|
||||
module->SetFPID( fpid );
|
||||
SaveFootprint( module );
|
||||
GetScreen()->ClrModify();
|
||||
}
|
||||
|
||||
updateView();
|
||||
m_canvas->Refresh();
|
||||
|
||||
Update3DView();
|
||||
|
||||
GetScreen()->ClrModify();
|
||||
syncLibraryTree( false );
|
||||
}
|
||||
|
||||
wizard->Destroy();
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_MODEDIT_SAVE_LIBMODULE:
|
||||
if( GetBoard()->m_Modules )
|
||||
case ID_MODEDIT_SAVE:
|
||||
if( getTargetLibId() == GetCurrentLibId() )
|
||||
{
|
||||
SaveFootprint( GetBoard()->m_Modules );
|
||||
if( SaveFootprint( GetBoard()->m_Modules ) )
|
||||
{
|
||||
m_toolManager->GetView()->Update( GetBoard()->m_Modules );
|
||||
|
||||
m_toolManager->GetView()->Update( GetBoard()->m_Modules );
|
||||
if( IsGalCanvasActive() && GetGalCanvas() )
|
||||
GetGalCanvas()->ForceRefresh();
|
||||
else
|
||||
GetCanvas()->Refresh();
|
||||
|
||||
if( IsGalCanvasActive() && GetGalCanvas() )
|
||||
GetGalCanvas()->ForceRefresh();
|
||||
else
|
||||
GetCanvas()->Refresh();
|
||||
|
||||
GetScreen()->ClrModify();
|
||||
GetScreen()->ClrModify();
|
||||
}
|
||||
}
|
||||
|
||||
m_treePane->GetLibTree()->Refresh();
|
||||
break;
|
||||
|
||||
case ID_MODEDIT_SAVE_LIBMODULE_AS:
|
||||
if( GetBoard()->m_Modules )
|
||||
case ID_MODEDIT_SAVE_AS:
|
||||
if( getTargetLibId().GetLibItemName().empty() )
|
||||
{
|
||||
SaveFootprintAs( GetBoard()->m_Modules );
|
||||
|
||||
m_toolManager->GetView()->Update( GetBoard()->m_Modules );
|
||||
|
||||
if( IsGalCanvasActive() && GetGalCanvas() )
|
||||
GetGalCanvas()->ForceRefresh();
|
||||
else
|
||||
GetCanvas()->Refresh();
|
||||
|
||||
GetScreen()->ClrModify();
|
||||
// Save Library As
|
||||
const wxString& libName = getTargetLibId().GetLibNickname();
|
||||
if( SaveLibraryAs( Prj().PcbFootprintLibs()->FindRow( libName )->GetFullURI() ) )
|
||||
syncLibraryTree( true );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Save Footprint As
|
||||
MODULE* footprint = LoadFootprint( getTargetLibId() );
|
||||
if( footprint && SaveFootprintAs( footprint ) )
|
||||
{
|
||||
syncLibraryTree( false );
|
||||
|
||||
if( getTargetLibId() == GetCurrentLibId() )
|
||||
{
|
||||
m_toolManager->GetView()->Update( GetBoard()->m_Modules );
|
||||
|
||||
if( IsGalCanvasActive() && GetGalCanvas() )
|
||||
GetGalCanvas()->ForceRefresh();
|
||||
else
|
||||
GetCanvas()->Refresh();
|
||||
|
||||
GetScreen()->ClrModify();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_treePane->GetLibTree()->Refresh();
|
||||
break;
|
||||
|
||||
case ID_MODEDIT_INSERT_MODULE_IN_BOARD:
|
||||
|
@ -511,21 +570,29 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
break;
|
||||
|
||||
case ID_MODEDIT_EXPORT_PART:
|
||||
if( GetBoard()->m_Modules )
|
||||
Export_Module( GetBoard()->m_Modules );
|
||||
Export_Module( LoadFootprint( getTargetLibId() ) );
|
||||
break;
|
||||
|
||||
case ID_MODEDIT_CREATE_NEW_LIB:
|
||||
CreateNewLibrary();
|
||||
{
|
||||
wxFileName fn( CreateNewLibrary() );
|
||||
wxString name = fn.GetName();
|
||||
|
||||
if( !name.IsEmpty() )
|
||||
{
|
||||
LIB_ID newLib( name, wxEmptyString );
|
||||
|
||||
syncLibraryTree( false );
|
||||
m_treePane->GetLibTree()->SelectLibId( newLib );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_MODEDIT_SHEET_SET:
|
||||
break;
|
||||
|
||||
case ID_MODEDIT_LOAD_MODULE:
|
||||
case ID_MODEDIT_EDIT_MODULE:
|
||||
{
|
||||
wxLogDebug( wxT( "Loading module from library " ) + getLibPath() );
|
||||
|
||||
if( GetScreen()->IsModify() && !GetBoard()->IsEmpty() )
|
||||
{
|
||||
KIDIALOG dlg( this, _( "The current footprint contains unsaved changes." ),
|
||||
|
@ -537,7 +604,9 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
break;
|
||||
}
|
||||
|
||||
MODULE* module = SelectFootprintFromLibTree( wxEmptyString );
|
||||
LIB_ID partId = m_treePane->GetLibTree()->GetSelectedLibId();
|
||||
|
||||
MODULE* module = LoadFootprint( partId );
|
||||
|
||||
if( !module )
|
||||
break;
|
||||
|
@ -578,6 +647,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|||
|
||||
updateView();
|
||||
m_canvas->Refresh();
|
||||
m_treePane->GetLibTree()->Refresh();
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -53,8 +53,6 @@
|
|||
#include <kicad_plugin.h>
|
||||
#include <legacy_plugin.h>
|
||||
|
||||
#include <dialog_select_pretty_lib.h>
|
||||
|
||||
|
||||
// unique, "file local" translations:
|
||||
|
||||
|
@ -318,6 +316,10 @@ MODULE* FOOTPRINT_EDIT_FRAME::Import_Module( const wxString& aName )
|
|||
return NULL;
|
||||
}
|
||||
|
||||
LIB_ID fpid;
|
||||
fpid.SetLibItemName( module->GetFPID().GetLibItemName() );
|
||||
module->SetFPID( fpid );
|
||||
|
||||
// Insert footprint in list
|
||||
GetBoard()->Add( module );
|
||||
|
||||
|
@ -417,28 +419,33 @@ wxString PCB_BASE_EDIT_FRAME::CreateNewLibrary(const wxString& aLibName )
|
|||
// because the legacy format cannot handle current features.
|
||||
// The footprint library is actually a directory
|
||||
|
||||
// if a library name is not given, prompt user for footprint library name, ending by ".pretty"
|
||||
// Because there are constraints for the directory name to create,
|
||||
// (the name should have the extension ".pretty", and the folder cannot be inside
|
||||
// a footprint library), we do not use the standard wxDirDialog.
|
||||
|
||||
|
||||
wxString initialPath = wxPathOnly( Prj().GetProjectFullName() );
|
||||
|
||||
wxString libPath;
|
||||
wxFileName fn;
|
||||
bool saveInGlobalTable = false, saveInProjectTable = false;
|
||||
|
||||
if( aLibName.IsEmpty() )
|
||||
{
|
||||
DIALOG_SELECT_PRETTY_LIB dlg( this, initialPath );
|
||||
fn = initialPath;
|
||||
|
||||
if( dlg.ShowModal() != wxID_OK )
|
||||
if( !LibraryFileBrowser( false, fn, KiCadFootprintLibPathWildcard(), KiCadFootprintLibPathExtension ) )
|
||||
return wxEmptyString;
|
||||
|
||||
libPath = dlg.GetFullPrettyLibName();
|
||||
wxArrayString libTableNames;
|
||||
libTableNames.Add( _( "Global" ) );
|
||||
libTableNames.Add( _( "Project" ) );
|
||||
|
||||
switch( SelectSingleOption( this, _( "Select Library Table" ),
|
||||
_( "Choose the Library Table to add the library to:" ),
|
||||
libTableNames ) )
|
||||
{
|
||||
case 0: saveInGlobalTable = true; break;
|
||||
case 1: saveInProjectTable = true; break;
|
||||
default: return wxEmptyString;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
wxFileName fn = aLibName;
|
||||
fn = aLibName;
|
||||
|
||||
if( !fn.IsAbsolute() )
|
||||
{
|
||||
|
@ -448,13 +455,11 @@ wxString PCB_BASE_EDIT_FRAME::CreateNewLibrary(const wxString& aLibName )
|
|||
|
||||
// Enforce the .pretty extension:
|
||||
fn.SetExt( KiCadFootprintLibPathExtension );
|
||||
|
||||
libPath = fn.GetFullPath();
|
||||
}
|
||||
|
||||
|
||||
// We can save fp libs only using IO_MGR::KICAD_SEXP format (.pretty libraries)
|
||||
IO_MGR::PCB_FILE_T piType = IO_MGR::KICAD_SEXP;
|
||||
wxString libPath = fn.GetFullPath();
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -469,15 +474,13 @@ wxString PCB_BASE_EDIT_FRAME::CreateNewLibrary(const wxString& aLibName )
|
|||
exists = true; // no exception was thrown, lib must exist.
|
||||
}
|
||||
catch( const IO_ERROR& )
|
||||
{
|
||||
// ignore, original values of 'writable' and 'exists' are accurate.
|
||||
}
|
||||
{ }
|
||||
|
||||
if( exists )
|
||||
{
|
||||
if( !writable )
|
||||
{
|
||||
wxString msg = wxString::Format( FMT_LIB_READ_ONLY, GetChars( libPath ) );
|
||||
wxString msg = wxString::Format( FMT_LIB_READ_ONLY, libPath );
|
||||
DisplayError( this, msg );
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
@ -496,6 +499,19 @@ wxString PCB_BASE_EDIT_FRAME::CreateNewLibrary(const wxString& aLibName )
|
|||
}
|
||||
|
||||
pi->FootprintLibCreate( libPath );
|
||||
|
||||
if( saveInGlobalTable )
|
||||
{
|
||||
auto row = new FP_LIB_TABLE_ROW( fn.GetName(), libPath, wxT( "KiCad" ), wxEmptyString );
|
||||
GFootprintTable.InsertRow( row );
|
||||
GFootprintTable.Save( FP_LIB_TABLE::GetGlobalTableFileName() );
|
||||
}
|
||||
else if( saveInProjectTable )
|
||||
{
|
||||
auto row = new FP_LIB_TABLE_ROW( fn.GetName(), libPath, wxT( "KiCad" ), wxEmptyString );
|
||||
Prj().PcbFootprintLibs()->InsertRow( row );
|
||||
Prj().PcbFootprintLibs()->Save( Prj().FootprintLibTblName() );
|
||||
}
|
||||
}
|
||||
catch( const IO_ERROR& ioe )
|
||||
{
|
||||
|
@ -507,14 +523,12 @@ wxString PCB_BASE_EDIT_FRAME::CreateNewLibrary(const wxString& aLibName )
|
|||
}
|
||||
|
||||
|
||||
bool FOOTPRINT_EDIT_FRAME::DeleteModuleFromLibrary()
|
||||
bool FOOTPRINT_EDIT_FRAME::DeleteModuleFromLibrary( MODULE* aModule )
|
||||
{
|
||||
MODULE* module = GetBoard()->m_Modules;
|
||||
|
||||
if( !module )
|
||||
if( !aModule )
|
||||
return false;
|
||||
|
||||
LIB_ID fpid = module->GetFPID();
|
||||
LIB_ID fpid = aModule->GetFPID();
|
||||
|
||||
if( !fpid.IsValid() )
|
||||
return false;
|
||||
|
|
|
@ -0,0 +1,147 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2018 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 3
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "footprint_tree_pane.h"
|
||||
#include "fp_tree_synchronizing_adapter.h"
|
||||
|
||||
#include <widgets/lib_tree.h>
|
||||
#include <pcbnew_id.h>
|
||||
#include <footprint_edit_frame.h>
|
||||
#include <fp_lib_table.h>
|
||||
#include <menus_helpers.h>
|
||||
|
||||
|
||||
FOOTPRINT_TREE_PANE::FOOTPRINT_TREE_PANE( FOOTPRINT_EDIT_FRAME* aParent )
|
||||
: wxPanel( aParent ),
|
||||
m_frame( aParent ),
|
||||
m_tree( nullptr )
|
||||
{
|
||||
// Create widgets
|
||||
wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL );
|
||||
m_tree = new LIB_TREE( this, &GFootprintTable, m_frame->GetLibTreeAdapter(), LIB_TREE::SEARCH );
|
||||
boxSizer->Add( m_tree, 1, wxEXPAND, 5 );
|
||||
|
||||
SetSizer( boxSizer ); // should remove the previous sizer according to wxWidgets docs
|
||||
Layout();
|
||||
boxSizer->Fit( this );
|
||||
|
||||
// Setup right click-context menus
|
||||
std::unique_ptr<wxMenu> menuLibrary = std::make_unique<wxMenu>();
|
||||
|
||||
AddMenuItem( menuLibrary.get(), ID_MODEDIT_CREATE_NEW_LIB, _( "New &Library..." ),
|
||||
KiBitmap( new_library_xpm ) );
|
||||
/* TODO
|
||||
AddMenuItem( menuLibrary.get(), ID_LIBEDIT_ADD_LIBRARY, _( "&Add Library..." ),
|
||||
KiBitmap( add_library_xpm ) );
|
||||
*/
|
||||
AddMenuItem( menuLibrary.get(), ID_MODEDIT_SAVE, _( "&Save" ),
|
||||
KiBitmap( save_xpm ) );
|
||||
AddMenuItem( menuLibrary.get(), ID_MODEDIT_SAVE_AS, _( "Save a Copy As..." ),
|
||||
KiBitmap( save_as_xpm ) );
|
||||
/* TODO
|
||||
AddMenuItem( menuLibrary.get(), ID_LIBEDIT_REVERT, _( "Revert" ),
|
||||
KiBitmap( undo_xpm ) );
|
||||
*/
|
||||
|
||||
menuLibrary->AppendSeparator();
|
||||
AddMenuItem( menuLibrary.get(), ID_MODEDIT_NEW_MODULE, _( "New &Footprint..." ),
|
||||
KiBitmap( new_component_xpm ) );
|
||||
AddMenuItem( menuLibrary.get(), ID_MODEDIT_NEW_MODULE_FROM_WIZARD, _( "&Create Footprint..." ),
|
||||
KiBitmap( new_component_xpm ) );
|
||||
AddMenuItem( menuLibrary.get(), ID_MODEDIT_IMPORT_PART, _( "&Import Footprint..." ),
|
||||
KiBitmap( import_part_xpm ) );
|
||||
|
||||
std::unique_ptr<wxMenu> menuPart = std::make_unique<wxMenu>();
|
||||
AddMenuItem( menuPart.get(), ID_MODEDIT_EDIT_MODULE, _( "&Edit Footprint" ),
|
||||
KiBitmap( edit_xpm ) );
|
||||
|
||||
menuPart->AppendSeparator();
|
||||
AddMenuItem( menuPart.get(), ID_MODEDIT_SAVE, _( "&Save" ),
|
||||
KiBitmap( save_xpm ) );
|
||||
AddMenuItem( menuPart.get(), ID_MODEDIT_SAVE_AS, _( "Save a Copy As..." ),
|
||||
KiBitmap( save_xpm ) );
|
||||
AddMenuItem( menuPart.get(), ID_MODEDIT_DELETE_PART, _( "Delete" ),
|
||||
KiBitmap( delete_xpm ) );
|
||||
/* TODO
|
||||
AddMenuItem( menuPart.get(), ID_LIBEDIT_REVERT, _( "Revert" ),
|
||||
KiBitmap( undo_xpm ) );
|
||||
*/
|
||||
|
||||
menuPart->AppendSeparator();
|
||||
AddMenuItem( menuPart.get(), ID_MODEDIT_EXPORT_PART, _( "E&xport Footprint..." ),
|
||||
KiBitmap( export_part_xpm ) );
|
||||
|
||||
// Menu displayed when nothing is selected
|
||||
std::unique_ptr<wxMenu> menuNoSelection = std::make_unique<wxMenu>();
|
||||
AddMenuItem( menuNoSelection.get(), ID_MODEDIT_CREATE_NEW_LIB, _( "&New Library..." ),
|
||||
KiBitmap( new_library_xpm ) );
|
||||
/* TODO
|
||||
AddMenuItem( menuNoSelection.get(), ID_LIBEDIT_ADD_LIBRARY, _( "&Add Library..." ),
|
||||
KiBitmap( add_library_xpm ) );
|
||||
*/
|
||||
m_tree->SetMenu( LIB_TREE_NODE::LIBID, std::move( menuPart ) );
|
||||
m_tree->SetMenu( LIB_TREE_NODE::LIB, std::move( menuLibrary ) );
|
||||
m_tree->SetMenu( LIB_TREE_NODE::INVALID, std::move( menuNoSelection ) );
|
||||
|
||||
// Event handlers
|
||||
Bind( COMPONENT_SELECTED, &FOOTPRINT_TREE_PANE::onComponentSelected, this );
|
||||
m_tree->Bind( wxEVT_UPDATE_UI, &FOOTPRINT_TREE_PANE::onUpdateUI, this );
|
||||
}
|
||||
|
||||
|
||||
FOOTPRINT_TREE_PANE::~FOOTPRINT_TREE_PANE()
|
||||
{
|
||||
m_tree->Destroy();
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINT_TREE_PANE::Regenerate()
|
||||
{
|
||||
if( m_tree )
|
||||
m_tree->Regenerate();
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINT_TREE_PANE::onComponentSelected( wxCommandEvent& aEvent )
|
||||
{
|
||||
// Repost the event
|
||||
wxCommandEvent evt( wxEVT_COMMAND_TOOL_CLICKED, ID_MODEDIT_EDIT_MODULE );
|
||||
// I cannot figure out why the two methods below do not work..
|
||||
//wxPostEvent( libEditFrame, evt );
|
||||
//wxQueueEvent( m_libEditFrame, new wxCommandEvent( ID_LIBEDIT_EDIT_PART ) );
|
||||
m_frame->Process_Special_Functions( evt );
|
||||
|
||||
// Make sure current-part highlighting doesn't get lost in seleciton highlighting
|
||||
m_tree->Unselect();
|
||||
}
|
||||
|
||||
|
||||
void FOOTPRINT_TREE_PANE::onUpdateUI( wxUpdateUIEvent& aEvent )
|
||||
{
|
||||
if( m_frame->GetGalCanvas()->HasFocus() )
|
||||
{
|
||||
// Don't allow a selected item in the tree when the canvas has focus: it's too easy
|
||||
// to confuse the selected-highlighting with the being-edited-on-canvas-highlighting.
|
||||
m_tree->Unselect();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2017 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 3
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef FOOTPRINT_TREE_PANE_H
|
||||
#define FOOTPRINT_TREE_PANE_H
|
||||
|
||||
#include <wx/panel.h>
|
||||
#include <wx/dataview.h>
|
||||
#include <vector>
|
||||
|
||||
class LIB_TREE;
|
||||
class FOOTPRINT_EDIT_FRAME;
|
||||
class wxBoxSizer;
|
||||
|
||||
/**
|
||||
* Footprint Editor pane with footprint library tree.
|
||||
*/
|
||||
class FOOTPRINT_TREE_PANE : public wxPanel
|
||||
{
|
||||
public:
|
||||
FOOTPRINT_TREE_PANE( FOOTPRINT_EDIT_FRAME* aParent );
|
||||
~FOOTPRINT_TREE_PANE();
|
||||
|
||||
LIB_TREE* GetLibTree() const
|
||||
{
|
||||
return m_tree;
|
||||
}
|
||||
|
||||
///> Updates the footprint tree
|
||||
void Regenerate();
|
||||
|
||||
protected:
|
||||
void onComponentSelected( wxCommandEvent& aEvent );
|
||||
void onUpdateUI( wxUpdateUIEvent& aEvent );
|
||||
|
||||
FOOTPRINT_EDIT_FRAME* m_frame;
|
||||
LIB_TREE* m_tree; ///< component search tree widget
|
||||
};
|
||||
|
||||
#endif /* FOOTPRINT_TREE_PANE_H */
|
|
@ -23,11 +23,11 @@
|
|||
#include <eda_pattern_match.h>
|
||||
#include <fp_lib_table.h>
|
||||
#include <footprint_info.h>
|
||||
#include <footprint_info_impl.h>
|
||||
#include <generate_footprint_info.h>
|
||||
|
||||
#include "fp_tree_model_adapter.h"
|
||||
|
||||
|
||||
FP_TREE_MODEL_ADAPTER::PTR FP_TREE_MODEL_ADAPTER::Create( LIB_TABLE* aLibs )
|
||||
{
|
||||
return PTR( new FP_TREE_MODEL_ADAPTER( aLibs ) );
|
||||
|
@ -43,29 +43,37 @@ FP_TREE_MODEL_ADAPTER::~FP_TREE_MODEL_ADAPTER()
|
|||
{}
|
||||
|
||||
|
||||
void FP_TREE_MODEL_ADAPTER::AddLibraries( FOOTPRINT_LIST* aFootprintInfoList )
|
||||
void FP_TREE_MODEL_ADAPTER::AddLibraries()
|
||||
{
|
||||
// Note: FOOTPRINT_INFO list must be sorted!
|
||||
|
||||
wxString currentLib;
|
||||
std::vector<LIB_TREE_ITEM*> footprints;
|
||||
|
||||
for( auto& footprint : aFootprintInfoList->GetList() )
|
||||
for( const auto& libName : m_libs->GetLogicalLibs() )
|
||||
{
|
||||
if( footprint->GetNickname() != currentLib )
|
||||
{
|
||||
if( footprints.size() )
|
||||
DoAddLibrary( currentLib, m_libs->GetDescription( currentLib ), footprints );
|
||||
const FP_LIB_TABLE_ROW* library = m_libs->FindRow( libName );
|
||||
|
||||
footprints.clear();
|
||||
currentLib = footprint->GetNickname();
|
||||
DoAddLibrary( libName, library->GetDescr(), getFootprints( libName ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::vector<LIB_TREE_ITEM*> FP_TREE_MODEL_ADAPTER::getFootprints( const wxString& aLibName )
|
||||
{
|
||||
std::vector<LIB_TREE_ITEM*> list;
|
||||
bool found = false;
|
||||
|
||||
for( auto& footprint : GFootprintList.GetList() )
|
||||
{
|
||||
if( footprint->GetNickname() != aLibName )
|
||||
{
|
||||
if( found )
|
||||
return list;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
|
||||
footprints.push_back( footprint.get() );
|
||||
found = true;
|
||||
list.push_back( footprint.get() );
|
||||
}
|
||||
|
||||
if( footprints.size() )
|
||||
DoAddLibrary( currentLib, m_libs->GetDescription( currentLib ), footprints );
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -43,18 +43,18 @@ public:
|
|||
*/
|
||||
static PTR Create( LIB_TABLE* aLibs );
|
||||
|
||||
void AddLibraries( FOOTPRINT_LIST* aFootprintInfoList );
|
||||
void AddLibraries();
|
||||
|
||||
wxString GenerateInfo( LIB_ID const& aLibId, int aUnit ) override;
|
||||
|
||||
protected:
|
||||
|
||||
/**
|
||||
* Constructor; takes a set of libraries to be included in the search.
|
||||
*/
|
||||
FP_TREE_MODEL_ADAPTER( LIB_TABLE* aLibs );
|
||||
|
||||
private:
|
||||
std::vector<LIB_TREE_ITEM*> getFootprints( const wxString& aLibName );
|
||||
|
||||
FP_LIB_TABLE* m_libs;
|
||||
};
|
||||
|
||||
|
|
|
@ -0,0 +1,235 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2017 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 3
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <fp_tree_synchronizing_adapter.h>
|
||||
#include <footprint_edit_frame.h>
|
||||
#include <fp_lib_table.h>
|
||||
#include <footprint_info_impl.h>
|
||||
|
||||
LIB_TREE_MODEL_ADAPTER::PTR FP_TREE_SYNCHRONIZING_ADAPTER::Create( FOOTPRINT_EDIT_FRAME* aFrame,
|
||||
FP_LIB_TABLE* aLibs )
|
||||
{
|
||||
return PTR( new FP_TREE_SYNCHRONIZING_ADAPTER( aFrame, aLibs ) );
|
||||
}
|
||||
|
||||
|
||||
FP_TREE_SYNCHRONIZING_ADAPTER::FP_TREE_SYNCHRONIZING_ADAPTER( FOOTPRINT_EDIT_FRAME* aFrame,
|
||||
FP_LIB_TABLE* aLibs ) :
|
||||
FP_TREE_MODEL_ADAPTER( aLibs ),
|
||||
m_frame( aFrame )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool FP_TREE_SYNCHRONIZING_ADAPTER::IsContainer( const wxDataViewItem& aItem ) const
|
||||
{
|
||||
const LIB_TREE_NODE* node = ToNode( aItem );
|
||||
return node ? node->Type == LIB_TREE_NODE::LIB : true;
|
||||
}
|
||||
|
||||
|
||||
#define PROGRESS_INTERVAL_MILLIS 66
|
||||
|
||||
void FP_TREE_SYNCHRONIZING_ADAPTER::Sync()
|
||||
{
|
||||
// Process already stored libraries
|
||||
for( auto it = m_tree.Children.begin(); it != m_tree.Children.end(); )
|
||||
{
|
||||
const wxString& name = it->get()->Name;
|
||||
|
||||
if( !m_libs->HasLibrary( name, true ) )
|
||||
{
|
||||
it = deleteLibrary( it );
|
||||
continue;
|
||||
}
|
||||
|
||||
updateLibrary( *(LIB_TREE_NODE_LIB*) it->get() );
|
||||
++it;
|
||||
}
|
||||
|
||||
// Look for new libraries
|
||||
for( const auto& libName : m_libs->GetLogicalLibs() )
|
||||
{
|
||||
if( m_libMap.count( libName ) == 0 )
|
||||
{
|
||||
const FP_LIB_TABLE_ROW* library = m_libs->FindRow( libName );
|
||||
|
||||
DoAddLibrary( libName, library->GetDescr(), getFootprints( libName ) );
|
||||
m_libMap.insert( libName );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int FP_TREE_SYNCHRONIZING_ADAPTER::GetLibrariesCount() const
|
||||
{
|
||||
return GFootprintTable.GetCount();
|
||||
}
|
||||
|
||||
|
||||
void FP_TREE_SYNCHRONIZING_ADAPTER::updateLibrary( LIB_TREE_NODE_LIB& aLibNode )
|
||||
{
|
||||
std::vector<LIB_TREE_ITEM*> footprints = getFootprints( aLibNode.Name );
|
||||
|
||||
// remove the common part from the aliases list
|
||||
for( auto nodeIt = aLibNode.Children.begin(); nodeIt != aLibNode.Children.end(); )
|
||||
{
|
||||
auto footprintIt = std::find_if( footprints.begin(), footprints.end(),
|
||||
[&] ( const LIB_TREE_ITEM* a )
|
||||
{
|
||||
return a->GetName() == (*nodeIt)->Name;
|
||||
} );
|
||||
|
||||
if( footprintIt != footprints.end() )
|
||||
{
|
||||
// alias exists both in the component tree and the library manager,
|
||||
// update only the node data
|
||||
static_cast<LIB_TREE_NODE_LIB_ID*>( nodeIt->get() )->Update( *footprintIt );
|
||||
footprints.erase( footprintIt );
|
||||
++nodeIt;
|
||||
}
|
||||
else
|
||||
{
|
||||
// node does not exist in the library manager, remove the corresponding node
|
||||
nodeIt = aLibNode.Children.erase( nodeIt );
|
||||
}
|
||||
}
|
||||
|
||||
// now the aliases list contains only new aliases that need to be added to the tree
|
||||
for( auto footprint : footprints )
|
||||
aLibNode.AddComp( footprint );
|
||||
|
||||
aLibNode.AssignIntrinsicRanks();
|
||||
m_libMap.insert( aLibNode.Name );
|
||||
}
|
||||
|
||||
|
||||
LIB_TREE_NODE::PTR_VECTOR::iterator FP_TREE_SYNCHRONIZING_ADAPTER::deleteLibrary(
|
||||
LIB_TREE_NODE::PTR_VECTOR::iterator& aLibNodeIt )
|
||||
{
|
||||
LIB_TREE_NODE* node = aLibNodeIt->get();
|
||||
m_libMap.erase( node->Name );
|
||||
auto it = m_tree.Children.erase( aLibNodeIt );
|
||||
return it;
|
||||
}
|
||||
|
||||
|
||||
void FP_TREE_SYNCHRONIZING_ADAPTER::GetValue( wxVariant& aVariant, wxDataViewItem const& aItem,
|
||||
unsigned int aCol ) const
|
||||
{
|
||||
if( IsFrozen() )
|
||||
{
|
||||
aVariant = wxEmptyString;
|
||||
return;
|
||||
}
|
||||
|
||||
auto node = ToNode( aItem );
|
||||
wxASSERT( node );
|
||||
|
||||
switch( aCol )
|
||||
{
|
||||
case 0:
|
||||
// mark modified part with an asterix
|
||||
if( node->LibId == m_frame->GetCurrentLibId() && m_frame->GetScreen()->IsModify() )
|
||||
aVariant = node->Name + " *";
|
||||
else
|
||||
aVariant = node->Name;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
aVariant = node->Desc;
|
||||
break;
|
||||
|
||||
default: // column == -1 is used for default Compare function
|
||||
aVariant = node->Name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool FP_TREE_SYNCHRONIZING_ADAPTER::GetAttr( wxDataViewItem const& aItem, unsigned int aCol,
|
||||
wxDataViewItemAttr& aAttr ) const
|
||||
{
|
||||
if( IsFrozen() )
|
||||
return false;
|
||||
|
||||
// change attributes only for the name field
|
||||
if( aCol != 0 )
|
||||
return false;
|
||||
|
||||
auto node = ToNode( aItem );
|
||||
wxCHECK( node, false );
|
||||
|
||||
switch( node->Type )
|
||||
{
|
||||
case LIB_TREE_NODE::LIB:
|
||||
#ifdef __WXGTK__
|
||||
// The native wxGTK+ impl ignores background colour, so set the text colour instead.
|
||||
// This works reasonably well in dark themes, and quite poorly in light ones....
|
||||
if( node->Name == m_frame->GetCurrentLibId().GetLibNickname() )
|
||||
{
|
||||
aAttr.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
|
||||
// mark modified libs with bold font
|
||||
aAttr.SetBold( m_frame->GetScreen()->IsModified() );
|
||||
}
|
||||
#else
|
||||
// mark the current library with background color
|
||||
if( node->Name == m_frame->GetCurrentLibId().GetLibNickname() )
|
||||
{
|
||||
aAttr.SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
|
||||
// mark modified libs with bold font
|
||||
aAttr.SetBold( m_frame->GetScreen()->IsModify() );
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
case LIB_TREE_NODE::LIBID:
|
||||
#ifdef __WXGTK__
|
||||
// The native wxGTK+ impl ignores background colour, so set the text colour instead.
|
||||
// This works reasonably well in dark themes, and quite poorly in light ones....
|
||||
if( node->LibId == m_libMgr->GetCurrentLibId() )
|
||||
{
|
||||
aAttr.SetColour( wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
|
||||
// mark modified part with bold font
|
||||
aAttr.SetBold( m_frame->GetScreen()->IsModified() );
|
||||
}
|
||||
#else
|
||||
// mark the current part with background color
|
||||
if( node->LibId == m_frame->GetCurrentLibId() )
|
||||
{
|
||||
aAttr.SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_HIGHLIGHT ) );
|
||||
// mark modified part with bold font
|
||||
aAttr.SetBold( m_frame->GetScreen()->IsModify() );
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2017 CERN
|
||||
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 3
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#ifndef FP_TREE_SYNCHRONIZING_ADAPTER_H
|
||||
#define FP_TREE_SYNCHRONIZING_ADAPTER_H
|
||||
|
||||
#include <fp_tree_model_adapter.h>
|
||||
#include <set>
|
||||
|
||||
class FOOTPRINT_EDIT_FRAME;
|
||||
|
||||
class FP_TREE_SYNCHRONIZING_ADAPTER : public FP_TREE_MODEL_ADAPTER
|
||||
{
|
||||
public:
|
||||
static PTR Create( FOOTPRINT_EDIT_FRAME* aFrame, FP_LIB_TABLE* aLibs );
|
||||
|
||||
bool IsContainer( const wxDataViewItem& aItem ) const override;
|
||||
|
||||
void Sync();
|
||||
|
||||
int GetLibrariesCount() const override;
|
||||
|
||||
protected:
|
||||
FP_TREE_SYNCHRONIZING_ADAPTER( FOOTPRINT_EDIT_FRAME* aFrame, FP_LIB_TABLE* aLibs );
|
||||
|
||||
void updateLibrary( LIB_TREE_NODE_LIB& aLibNode );
|
||||
|
||||
LIB_TREE_NODE::PTR_VECTOR::iterator deleteLibrary( LIB_TREE_NODE::PTR_VECTOR::iterator& aLibNodeIt );
|
||||
|
||||
void GetValue( wxVariant& aVariant, wxDataViewItem const& aItem,
|
||||
unsigned int aCol ) const override;
|
||||
bool GetAttr( wxDataViewItem const& aItem, unsigned int aCol,
|
||||
wxDataViewItemAttr& aAttr ) const override;
|
||||
|
||||
FOOTPRINT_EDIT_FRAME* m_frame;
|
||||
std::set<wxString> m_libMap; // Set to indicate libraries currently in tree
|
||||
};
|
||||
|
||||
#endif /* FP_TREE_SYNCHRONIZING_ADAPTER_H */
|
|
@ -213,7 +213,7 @@ MODULE* PCB_BASE_FRAME::SelectFootprintFromLibTree( const wxString& aLibrary, bo
|
|||
adapter->SetPreselectNode( history_list[0]->GetLibId(), 0 );
|
||||
}
|
||||
|
||||
adapter->AddLibraries( &GFootprintList );
|
||||
adapter->AddLibraries();
|
||||
|
||||
wxString title;
|
||||
title.Printf( _( "Choose Footprint (%d items loaded)" ), adapter->GetItemCount() );
|
||||
|
@ -396,13 +396,13 @@ MODULE* FOOTPRINT_EDIT_FRAME::SelectFootprintFromBoard( BOARD* aPcb )
|
|||
}
|
||||
|
||||
|
||||
void FOOTPRINT_EDIT_FRAME::OnSaveLibraryAs( wxCommandEvent& aEvent )
|
||||
bool FOOTPRINT_EDIT_FRAME::SaveLibraryAs( const wxString& aLibraryPath )
|
||||
{
|
||||
wxString curLibPath;
|
||||
wxString curLibPath = aLibraryPath;
|
||||
wxString dstLibPath = CreateNewLibrary();
|
||||
|
||||
if( !dstLibPath )
|
||||
return; // user aborted in CreateNewLibrary()
|
||||
return false; // user aborted in CreateNewLibrary()
|
||||
|
||||
wxBusyCursor dummy;
|
||||
wxString msg;
|
||||
|
@ -415,26 +415,23 @@ void FOOTPRINT_EDIT_FRAME::OnSaveLibraryAs( wxCommandEvent& aEvent )
|
|||
PLUGIN::RELEASER cur( IO_MGR::PluginFind( curType ) );
|
||||
PLUGIN::RELEASER dst( IO_MGR::PluginFind( dstType ) );
|
||||
|
||||
wxArrayString mods;
|
||||
wxArrayString footprints;
|
||||
|
||||
cur->FootprintEnumerate( mods, curLibPath );
|
||||
cur->FootprintEnumerate( footprints, curLibPath );
|
||||
|
||||
for( unsigned i = 0; i < mods.size(); ++i )
|
||||
for( unsigned i = 0; i < footprints.size(); ++i )
|
||||
{
|
||||
std::unique_ptr<MODULE> m( cur->LoadEnumeratedFootprint( curLibPath, mods[i] ) );
|
||||
dst->FootprintSave( dstLibPath, m.get() );
|
||||
const MODULE* footprint = cur->LoadEnumeratedFootprint( curLibPath, footprints[i] );
|
||||
dst->FootprintSave( dstLibPath, footprint );
|
||||
|
||||
msg = wxString::Format( _( "Footprint \"%s\" saved" ),
|
||||
GetChars( mods[i] ) );
|
||||
msg = wxString::Format( _( "Footprint \"%s\" saved" ), footprints[i] );
|
||||
SetStatusText( msg );
|
||||
|
||||
// m is deleted here by unique_ptr.
|
||||
}
|
||||
}
|
||||
catch( const IO_ERROR& ioe )
|
||||
{
|
||||
DisplayError( this, ioe.What() );
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
msg = wxString::Format(
|
||||
|
@ -444,4 +441,5 @@ void FOOTPRINT_EDIT_FRAME::OnSaveLibraryAs( wxCommandEvent& aEvent )
|
|||
DisplayInfoMessage( this, msg );
|
||||
|
||||
SetStatusText( wxEmptyString );
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -53,33 +53,38 @@ void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
|
|||
// Menu File:
|
||||
wxMenu* fileMenu = new wxMenu;
|
||||
|
||||
// New module
|
||||
text = AddHotkeyName( _( "&New..." ), m_hotkeysDescrList, HK_NEW );
|
||||
AddMenuItem( fileMenu,
|
||||
ID_MODEDIT_CREATE_NEW_LIB,
|
||||
_( "New Library..." ),
|
||||
_( "Creates an empty library" ),
|
||||
KiBitmap( new_library_xpm ) );
|
||||
/* TODO
|
||||
AddMenuItem( fileMenu,
|
||||
ID_MODEDIT_ADD_LIBRARY,
|
||||
_( "Add Library..." ),
|
||||
_( "Adds a previously created library" ),
|
||||
KiBitmap( add_library_xpm ) );
|
||||
*/
|
||||
text = AddHotkeyName( _( "&New Footprint..." ), m_hotkeysDescrList, HK_NEW );
|
||||
AddMenuItem( fileMenu, ID_MODEDIT_NEW_MODULE,
|
||||
text, _( "Create a new footprint" ),
|
||||
KiBitmap( new_footprint_xpm ) );
|
||||
|
||||
AddMenuItem( fileMenu, ID_MODEDIT_NEW_MODULE_FROM_WIZARD,
|
||||
_( "&Create..." ),
|
||||
_( "&Create Footprint..." ),
|
||||
_( "Create a new footprint using the footprint wizard" ),
|
||||
KiBitmap( module_wizard_xpm ) );
|
||||
|
||||
text = AddHotkeyName( _( "&Open..." ), m_hotkeysDescrList, HK_OPEN );
|
||||
AddMenuItem( fileMenu, ID_MODEDIT_LOAD_MODULE, text,
|
||||
_( "Open a footprint from a library" ),
|
||||
KiBitmap( load_module_lib_xpm ) );
|
||||
|
||||
fileMenu->AppendSeparator();
|
||||
|
||||
// Save module
|
||||
text = AddHotkeyName( _( "&Save" ), m_hotkeysDescrList, HK_SAVE );
|
||||
AddMenuItem( fileMenu, ID_MODEDIT_SAVE_LIBMODULE, text,
|
||||
AddMenuItem( fileMenu, ID_MODEDIT_SAVE, text,
|
||||
_( "Save changes" ),
|
||||
KiBitmap( save_xpm ) );
|
||||
|
||||
AddMenuItem( fileMenu, ID_MODEDIT_SAVE_LIBMODULE_AS,
|
||||
_( "Save &As..." ),
|
||||
_( "Save footprint to a new name and/or new library" ),
|
||||
AddMenuItem( fileMenu, ID_MODEDIT_SAVE_AS,
|
||||
_( "Save a Copy &As..." ),
|
||||
_( "Save a copy to a new name and/or location" ),
|
||||
KiBitmap( save_as_xpm ) );
|
||||
|
||||
fileMenu->AppendSeparator();
|
||||
|
|
|
@ -104,7 +104,7 @@ const LAYER_NUM GAL_LAYER_ORDER[] =
|
|||
PCB_DRAW_PANEL_GAL::PCB_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWindowId,
|
||||
const wxPoint& aPosition, const wxSize& aSize,
|
||||
KIGFX::GAL_DISPLAY_OPTIONS& aOptions, GAL_TYPE aGalType ) :
|
||||
EDA_DRAW_PANEL_GAL( aParentWindow, aWindowId, aPosition, aSize, aOptions, aGalType )
|
||||
EDA_DRAW_PANEL_GAL( aParentWindow, aWindowId, aPosition, aSize, aOptions, aGalType )
|
||||
{
|
||||
m_view = new KIGFX::PCB_VIEW( true );
|
||||
m_view->SetGAL( m_gal );
|
||||
|
|
|
@ -75,9 +75,7 @@ void PCB_EDIT_FRAME::Process_Config( wxCommandEvent& event )
|
|||
{
|
||||
try
|
||||
{
|
||||
FILE_OUTPUTFORMATTER sf( FP_LIB_TABLE::GetGlobalTableFileName() );
|
||||
|
||||
GFootprintTable.Format( &sf, 0 );
|
||||
GFootprintTable.Save( FP_LIB_TABLE::GetGlobalTableFileName() );
|
||||
tableChanged = true;
|
||||
}
|
||||
catch( const IO_ERROR& ioe )
|
||||
|
|
|
@ -364,14 +364,13 @@ enum pcbnew_ids
|
|||
ID_POPUP_MODEDIT_EDIT_EDGE,
|
||||
ID_MODEDIT_CHECK,
|
||||
ID_MODEDIT_CREATE_NEW_LIB,
|
||||
ID_MODEDIT_SAVE_LIBMODULE,
|
||||
ID_MODEDIT_SAVE_LIBMODULE_AS,
|
||||
ID_MODEDIT_SAVE_LIBRARY_AS,
|
||||
ID_MODEDIT_SAVE,
|
||||
ID_MODEDIT_SAVE_AS,
|
||||
ID_MODEDIT_DELETE_PART,
|
||||
ID_MODEDIT_NEW_MODULE,
|
||||
ID_MODEDIT_NEW_MODULE_FROM_WIZARD,
|
||||
ID_MODEDIT_SHEET_SET,
|
||||
ID_MODEDIT_LOAD_MODULE,
|
||||
ID_MODEDIT_EDIT_MODULE,
|
||||
ID_MODEDIT_PAD_SETTINGS,
|
||||
ID_MODEDIT_LOAD_MODULE_FROM_BOARD,
|
||||
ID_MODEDIT_INSERT_MODULE_IN_BOARD,
|
||||
|
|
|
@ -56,11 +56,7 @@ void FOOTPRINT_EDIT_FRAME::ReCreateHToolbar()
|
|||
_( "New footprint using footprint wizard" ) );
|
||||
#endif
|
||||
|
||||
m_mainToolBar->AddTool( ID_MODEDIT_LOAD_MODULE, wxEmptyString,
|
||||
KiScaledBitmap( load_module_lib_xpm, this ),
|
||||
_( "Open a footprint from a library" ) );
|
||||
|
||||
m_mainToolBar->AddTool( ID_MODEDIT_SAVE_LIBMODULE, wxEmptyString,
|
||||
m_mainToolBar->AddTool( ID_MODEDIT_SAVE, wxEmptyString,
|
||||
KiScaledBitmap( save_xpm, this ),
|
||||
_( "Save footprint in existing library" ) );
|
||||
|
||||
|
|
Loading…
Reference in New Issue