diff --git a/CMakeLists.txt b/CMakeLists.txt
index 511fbe4cf5..eb1d29e77b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -203,7 +203,7 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
endif()
# quiet GCC while in boost
- if( GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8 )
+ if( GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8 OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-local-typedefs" )
endif()
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-strict-aliasing" )
@@ -481,8 +481,7 @@ find_package( Cairo 1.8.8 REQUIRED )
#
# Note: Prior to Boost 1.59, the Boost context library is not built when compiling on windows
# with GCC. You must patch the Boost sources.
-find_package( Boost 1.54.0 REQUIRED COMPONENTS context date_time filesystem iostreams locale
- program_options regex system thread )
+find_package( Boost 1.54.0 REQUIRED COMPONENTS context system thread )
# Include MinGW resource compiler.
include( MinGWResourceCompiler )
diff --git a/CMakeModules/FindOpenSSL.cmake b/CMakeModules/FindOpenSSL.cmake
deleted file mode 100644
index de91787c18..0000000000
--- a/CMakeModules/FindOpenSSL.cmake
+++ /dev/null
@@ -1,342 +0,0 @@
-#.rst:
-# FindOpenSSL
-# -----------
-#
-# Try to find the OpenSSL encryption library
-#
-# Once done this will define
-#
-# ::
-#
-# OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL
-#
-#
-#
-# Read-Only variables:
-#
-# ::
-#
-# OPENSSL_FOUND - system has the OpenSSL library
-# OPENSSL_INCLUDE_DIR - the OpenSSL include directory
-# OPENSSL_LIBRARIES - The libraries needed to use OpenSSL
-# OPENSSL_VERSION - This is set to $major.$minor.$revision$path (eg. 0.9.8s)
-
-#=============================================================================
-# Copyright 2006-2009 Kitware, Inc.
-# Copyright 2006 Alexander Neundorf
-# Copyright 2009-2011 Mathieu Malaterre
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-# License text for the above reference.)
-
-if (UNIX)
- find_package(PkgConfig QUIET)
- pkg_check_modules(_OPENSSL QUIET openssl)
-endif ()
-
-if (WIN32)
- # http://www.slproweb.com/products/Win32OpenSSL.html
- set(_OPENSSL_ROOT_HINTS
- ${OPENSSL_ROOT_DIR}
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]"
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]"
- ENV OPENSSL_ROOT_DIR
- )
- file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
- set(_OPENSSL_ROOT_PATHS
- "${_programfiles}/OpenSSL"
- "${_programfiles}/OpenSSL-Win32"
- "${_programfiles}/OpenSSL-Win64"
- "C:/OpenSSL/"
- "C:/OpenSSL-Win32/"
- "C:/OpenSSL-Win64/"
- )
- unset(_programfiles)
-else ()
- set(_OPENSSL_ROOT_HINTS
- ${OPENSSL_ROOT_DIR}
- ENV OPENSSL_ROOT_DIR
- )
-endif ()
-
-set(_OPENSSL_ROOT_HINTS_AND_PATHS
- HINTS ${_OPENSSL_ROOT_HINTS}
- PATHS ${_OPENSSL_ROOT_PATHS}
- )
-
-find_path(OPENSSL_INCLUDE_DIR
- NAMES
- openssl/ssl.h
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- HINTS
- ${_OPENSSL_INCLUDEDIR}
- PATH_SUFFIXES
- include
-)
-
-if(WIN32 AND NOT CYGWIN)
- if(MSVC)
- # /MD and /MDd are the standard values - if someone wants to use
- # others, the libnames have to change here too
- # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b
- # TODO: handle /MT and static lib
- # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix:
- # * MD for dynamic-release
- # * MDd for dynamic-debug
- # * MT for static-release
- # * MTd for static-debug
-
- # Implementation details:
- # We are using the libraries located in the VC subdir instead of the parent directory eventhough :
- # libeay32MD.lib is identical to ../libeay32.lib, and
- # ssleay32MD.lib is identical to ../ssleay32.lib
- find_library(LIB_EAY_DEBUG
- NAMES
- libeay32MDd
- libeay32d
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- PATH_SUFFIXES
- "lib"
- "VC"
- "lib/VC"
- )
-
- find_library(LIB_EAY_RELEASE
- NAMES
- libeay32MD
- libeay32
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- PATH_SUFFIXES
- "lib"
- "VC"
- "lib/VC"
- )
-
- find_library(SSL_EAY_DEBUG
- NAMES
- ssleay32MDd
- ssleay32d
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- PATH_SUFFIXES
- "lib"
- "VC"
- "lib/VC"
- )
-
- find_library(SSL_EAY_RELEASE
- NAMES
- ssleay32MD
- ssleay32
- ssl
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- PATH_SUFFIXES
- "lib"
- "VC"
- "lib/VC"
- )
-
- set(LIB_EAY_LIBRARY_DEBUG "${LIB_EAY_DEBUG}")
- set(LIB_EAY_LIBRARY_RELEASE "${LIB_EAY_RELEASE}")
- set(SSL_EAY_LIBRARY_DEBUG "${SSL_EAY_DEBUG}")
- set(SSL_EAY_LIBRARY_RELEASE "${SSL_EAY_RELEASE}")
-
- include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
- select_library_configurations(LIB_EAY)
- select_library_configurations(SSL_EAY)
-
- mark_as_advanced(LIB_EAY_LIBRARY_DEBUG LIB_EAY_LIBRARY_RELEASE
- SSL_EAY_LIBRARY_DEBUG SSL_EAY_LIBRARY_RELEASE)
- set( OPENSSL_LIBRARIES ${SSL_EAY_LIBRARY} ${LIB_EAY_LIBRARY} )
- elseif(MINGW)
- message( STATUS "Searching for OpenSSL in MinGW." )
- # same player, for MinGW
- set(LIB_EAY_NAMES libeay32)
- set(SSL_EAY_NAMES ssleay32)
- list(APPEND LIB_EAY_NAMES crypto)
- list(APPEND SSL_EAY_NAMES ssl)
-
- find_library(LIB_EAY
- NAMES
- ${LIB_EAY_NAMES}
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- PATH_SUFFIXES
- "lib"
- "lib/MinGW"
- # Do not search system path. Otherwise the DLL will be found rather than the link library.
- NO_SYSTEM_ENVIRONMENT_PATH
- NO_CMAKE_SYSTEM_PATH
- )
-
- find_library(SSL_EAY
- NAMES
- ${SSL_EAY_NAMES}
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- PATH_SUFFIXES
- "lib"
- "lib/MinGW"
- # Do not search system path. Otherwise the DLL will be found rather than the link library.
- NO_SYSTEM_ENVIRONMENT_PATH
- NO_CMAKE_SYSTEM_PATH
- )
-
- mark_as_advanced(SSL_EAY LIB_EAY)
- set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} )
- unset(LIB_EAY_NAMES)
- unset(SSL_EAY_NAMES)
- else()
- # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues:
- find_library(LIB_EAY
- NAMES
- libeay32
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- HINTS
- ${_OPENSSL_LIBDIR}
- PATH_SUFFIXES
- lib
- )
-
- find_library(SSL_EAY
- NAMES
- ssleay32
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- HINTS
- ${_OPENSSL_LIBDIR}
- PATH_SUFFIXES
- lib
- )
-
- mark_as_advanced(SSL_EAY LIB_EAY)
- set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} )
- endif()
-else()
-
- find_library(OPENSSL_SSL_LIBRARY
- NAMES
- ssl
- ssleay32
- ssleay32MD
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- HINTS
- ${_OPENSSL_LIBDIR}
- PATH_SUFFIXES
- lib
- )
-
- find_library(OPENSSL_CRYPTO_LIBRARY
- NAMES
- crypto
- ${_OPENSSL_ROOT_HINTS_AND_PATHS}
- HINTS
- ${_OPENSSL_LIBDIR}
- PATH_SUFFIXES
- lib
- )
-
- mark_as_advanced(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY)
-
- # compat defines
- set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY})
- set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
-
- set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
-
-endif()
-
-function(from_hex HEX DEC)
- string(TOUPPER "${HEX}" HEX)
- set(_res 0)
- string(LENGTH "${HEX}" _strlen)
-
- while (_strlen GREATER 0)
- math(EXPR _res "${_res} * 16")
- string(SUBSTRING "${HEX}" 0 1 NIBBLE)
- string(SUBSTRING "${HEX}" 1 -1 HEX)
- if (NIBBLE STREQUAL "A")
- math(EXPR _res "${_res} + 10")
- elseif (NIBBLE STREQUAL "B")
- math(EXPR _res "${_res} + 11")
- elseif (NIBBLE STREQUAL "C")
- math(EXPR _res "${_res} + 12")
- elseif (NIBBLE STREQUAL "D")
- math(EXPR _res "${_res} + 13")
- elseif (NIBBLE STREQUAL "E")
- math(EXPR _res "${_res} + 14")
- elseif (NIBBLE STREQUAL "F")
- math(EXPR _res "${_res} + 15")
- else()
- math(EXPR _res "${_res} + ${NIBBLE}")
- endif()
-
- string(LENGTH "${HEX}" _strlen)
- endwhile()
-
- set(${DEC} ${_res} PARENT_SCOPE)
-endfunction()
-
-if (OPENSSL_INCLUDE_DIR)
- if (_OPENSSL_VERSION)
- set(OPENSSL_VERSION "${_OPENSSL_VERSION}")
- elseif(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h")
- file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str
- REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*")
-
- # The version number is encoded as 0xMNNFFPPS: major minor fix patch status
- # The status gives if this is a developer or prerelease and is ignored here.
- # Major, minor, and fix directly translate into the version numbers shown in
- # the string. The patch field translates to the single character suffix that
- # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so
- # on.
-
- message(STATUS "OPENSSL_VERSION_STR=${openssl_version_str}")
-
- string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$"
- "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}")
- list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
- list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
- from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR)
- list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX)
- from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX)
- list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH)
-
- if (NOT OPENSSL_VERSION_PATCH STREQUAL "00")
- from_hex("${OPENSSL_VERSION_PATCH}" _tmp)
- # 96 is the ASCII code of 'a' minus 1
- math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96")
- unset(_tmp)
- # Once anyone knows how OpenSSL would call the patch versions beyond 'z'
- # this should be updated to handle that, too. This has not happened yet
- # so it is simply ignored here for now.
- string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING)
- endif ()
-
- set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}")
- endif ()
-endif ()
-
-include(FindPackageHandleStandardArgs)
-
-if (OPENSSL_VERSION)
- find_package_handle_standard_args(OpenSSL
- REQUIRED_VARS
- OPENSSL_LIBRARIES
- OPENSSL_INCLUDE_DIR
- VERSION_VAR
- OPENSSL_VERSION
- FAIL_MESSAGE
- "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR"
- )
-else ()
- find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR"
- OPENSSL_LIBRARIES
- OPENSSL_INCLUDE_DIR
- )
-endif ()
-
-mark_as_advanced(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES)
diff --git a/CMakeModules/FindwxWidgets.cmake b/CMakeModules/FindwxWidgets.cmake
index b93035deac..5a21f75f41 100644
--- a/CMakeModules/FindwxWidgets.cmake
+++ b/CMakeModules/FindwxWidgets.cmake
@@ -163,18 +163,6 @@ set(wxWidgets_LIBRARIES "")
set(wxWidgets_LIBRARY_DIRS "")
set(wxWidgets_CXX_FLAGS "")
-# Using SYSTEM with INCLUDE_DIRECTORIES in conjunction with wxWidgets on
-# the Mac produces compiler errors. Set wxWidgets_INCLUDE_DIRS_NO_SYSTEM
-# to prevent UsewxWidgets.cmake from using SYSTEM.
-#
-# See cmake mailing list discussions for more info:
-# http://www.cmake.org/pipermail/cmake/2008-April/021115.html
-# http://www.cmake.org/pipermail/cmake/2008-April/021146.html
-#
-if(APPLE)
- set(wxWidgets_INCLUDE_DIRS_NO_SYSTEM 1)
-endif(APPLE)
-
# DEPRECATED: This is a patch to support the DEPRECATED use of
# wxWidgets_USE_LIBS.
#
diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index 9d8b71fc09..cf66392782 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -283,7 +283,10 @@ set( COMMON_SRCS
add_library( common STATIC ${COMMON_SRCS} )
add_dependencies( common lib-dependencies )
add_dependencies( common version_header )
-target_link_libraries( common ${Boost_LIBRARIES} ${CURL_LIBRARIES} )
+target_link_libraries( common
+ ${Boost_LIBRARIES}
+# ${CURL_LIBRARIES} we dynamically link to this ON DEMAND, not at load time
+ )
set( PCB_COMMON_SRCS
diff --git a/common/dialogs/dialog_hotkeys_editor.cpp b/common/dialogs/dialog_hotkeys_editor.cpp
index 0dfedf291e..ad0952e4d9 100644
--- a/common/dialogs/dialog_hotkeys_editor.cpp
+++ b/common/dialogs/dialog_hotkeys_editor.cpp
@@ -1,11 +1,7 @@
-/**
- * @file dialog_hotkeys_editor.cpp
- */
-
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
- * Copyright (C) 1992-2014 Kicad Developers, see CHANGELOG.TXT for contributors.
+ * Copyright (C) 1992-2016 Kicad Developers, see CHANGELOG.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
@@ -35,121 +31,52 @@
#include
-HOTKEY_LIST_CTRL::HOTKEY_LIST_CTRL( wxWindow *aParent, struct EDA_HOTKEY_CONFIG* aSection ) :
- wxListCtrl( aParent, wxID_ANY, wxDefaultPosition,
- wxDefaultSize, wxLC_HRULES|wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_VIRTUAL )
+class DIALOG_HOTKEY_CLIENT_DATA : public wxClientData
{
- m_sectionTag = aSection->m_SectionTag;
- m_curEditingRow = -1;
+ EDA_HOTKEY m_hotkey;
+ wxString m_section_tag;
- InsertColumn( 0, _( "Command" ) );
- InsertColumn( 1, _( "Hotkey" ) );
+public:
+ DIALOG_HOTKEY_CLIENT_DATA( const EDA_HOTKEY& aHotkey, const wxString& aSectionTag )
+ : m_hotkey( aHotkey ), m_section_tag( aSectionTag ) {}
- // Add a dummy hotkey_spec which is a header before each hotkey list
- EDA_HOTKEY** hotkey_descr_list;
+ EDA_HOTKEY& GetHotkey() { return m_hotkey; }
+ wxString GetSectionTag() const { return m_section_tag; }
+};
- // Add a copy of hotkeys to our list
- for( hotkey_descr_list = aSection->m_HK_InfoList; *hotkey_descr_list; hotkey_descr_list++ )
- {
- EDA_HOTKEY* hotkey_descr = *hotkey_descr_list;
- m_hotkeys.push_back( new EDA_HOTKEY( hotkey_descr ) );
- }
- // Set item count to hotkey size, this gets it to autoload the entries
- SetItemCount( m_hotkeys.size() );
+HOTKEY_LIST_CTRL::HOTKEY_LIST_CTRL( wxWindow *aParent, const HOTKEYS_SECTIONS& aSections ) :
+ wxTreeListCtrl( aParent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTL_SINGLE ),
+ m_sections( aSections )
+{
+ AppendColumn( _( "Command" ) );
+ AppendColumn( _( "Hotkey" ) );
- SetColumnWidth( 0, wxLIST_AUTOSIZE );
- SetColumnWidth( 1, wxLIST_AUTOSIZE );
+ SetColumnWidth( 1, 100 );
Bind( wxEVT_CHAR, &HOTKEY_LIST_CTRL::OnChar, this );
- Bind( wxEVT_LIST_ITEM_SELECTED, &HOTKEY_LIST_CTRL::OnListItemSelected, this );
- Bind( wxEVT_SIZE, &HOTKEY_LIST_CTRL::OnSize, this );
-}
-
-
-void HOTKEY_LIST_CTRL::OnSize( wxSizeEvent& aEvent )
-{
- recalculateColumns();
- aEvent.Skip();
-}
-
-
-void HOTKEY_LIST_CTRL::recalculateColumns()
-{
- float totalLength = 0;
- float scale = 0;
-
- // Find max character length of first column
- int maxInfoMsgLength = 0;
-
- for( int i = 0; i < GetItemCount(); i++ )
- {
- int length = GetItemText( i, 0 ).Length();
-
- if( length > maxInfoMsgLength )
- maxInfoMsgLength = length;
- }
-
- // Find max character length of second column
- int maxKeyCodeLength = 0;
-
- for( int i = 0; i < GetItemCount(); i++ )
- {
- int length = GetItemText( i, 1 ).Length();
- if( length > maxKeyCodeLength )
- maxKeyCodeLength = length;
- }
-
- // Use the lengths of column texts to create a scale of the max list width
- // to set the column widths
- totalLength = maxInfoMsgLength + maxKeyCodeLength;
-
- scale = (double) GetClientSize().x / totalLength;
-
- SetColumnWidth( 0, int( maxInfoMsgLength*scale ) - 2 );
- SetColumnWidth( 1, int( maxKeyCodeLength*scale ) );
-}
-
-
-void HOTKEY_LIST_CTRL::OnListItemSelected( wxListEvent& aEvent )
-{
- m_curEditingRow = aEvent.GetIndex();
}
void HOTKEY_LIST_CTRL::DeselectRow( int aRow )
{
- SetItemState( aRow, 0, wxLIST_STATE_SELECTED );
-}
-
-
-wxString HOTKEY_LIST_CTRL::OnGetItemText( long aRow, long aColumn ) const
-{
- EDA_HOTKEY* hotkey_descr = m_hotkeys[aRow];
-
- if( aColumn == 0 )
- {
- return wxGetTranslation( hotkey_descr->m_InfoMsg );
- }
- else
- {
- return KeyNameFromKeyCode( hotkey_descr->m_KeyCode );
- }
+ wxASSERT( aRow >= 0 && aRow < (int)m_items.size() );
+ Unselect( m_items[aRow] );
}
void HOTKEY_LIST_CTRL::OnChar( wxKeyEvent& aEvent )
{
- if( m_curEditingRow != -1 )
+ DIALOG_HOTKEY_CLIENT_DATA* data = GetSelHKClientData();
+
+ if( data )
{
long key = aEvent.GetKeyCode();
switch( key )
{
case WXK_ESCAPE:
- // Remove selection
- DeselectRow( m_curEditingRow );
- m_curEditingRow = -1;
+ UnselectAll();
break;
default:
@@ -182,72 +109,224 @@ void HOTKEY_LIST_CTRL::OnChar( wxKeyEvent& aEvent )
bool exists;
KeyNameFromKeyCode( key, &exists );
- if( exists && m_hotkeys[m_curEditingRow]->m_KeyCode != key )
+ if( exists && data->GetHotkey().m_KeyCode != key )
{
- bool canUpdate = ((HOTKEY_SECTION_PAGE *)m_parent)->GetDialog()->CanSetKey( key, m_sectionTag );
+ wxString tag = data->GetSectionTag();
+ bool canUpdate = ResolveKeyConflicts( key, tag );
if( canUpdate )
{
- m_hotkeys[m_curEditingRow]->m_KeyCode = key;
- recalculateColumns();
+ data->GetHotkey().m_KeyCode = key;
}
// Remove selection
- DeselectRow( m_curEditingRow );
- m_curEditingRow = -1;
+ UnselectAll();
}
}
}
- RefreshItems(0,m_hotkeys.size()-1);
+ UpdateFromClientData();
}
-void HOTKEY_LIST_CTRL::RestoreFrom( struct EDA_HOTKEY_CONFIG* aSection )
+DIALOG_HOTKEY_CLIENT_DATA* HOTKEY_LIST_CTRL::GetSelHKClientData()
{
- int row = 0;
+ return GetHKClientData( GetSelection() );
+}
+
+DIALOG_HOTKEY_CLIENT_DATA* HOTKEY_LIST_CTRL::GetHKClientData( wxTreeListItem aItem )
+{
+ if( aItem.IsOk() )
+ {
+ wxClientData* data = GetItemData( aItem );
+ if( !data )
+ return NULL;
+
+ DIALOG_HOTKEY_CLIENT_DATA* hkdata = static_cast( data );
+ return hkdata;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+
+void HOTKEY_LIST_CTRL::LoadSection( struct EDA_HOTKEY_CONFIG* aSection )
+{
+ HOTKEY_LIST list;
EDA_HOTKEY** info_ptr;
for( info_ptr = aSection->m_HK_InfoList; *info_ptr; info_ptr++ )
{
- EDA_HOTKEY* info = *info_ptr;
- m_hotkeys[row++]->m_KeyCode = info->m_KeyCode;
+ EDA_HOTKEY info = **info_ptr;
+ list.push_back( info );
}
- // Remove selection
- DeselectRow( m_curEditingRow );
- m_curEditingRow = -1;
-
- RefreshItems( 0, m_hotkeys.size()-1 );
+ m_hotkeys.push_back( list );
}
-HOTKEY_SECTION_PAGE::HOTKEY_SECTION_PAGE( HOTKEYS_EDITOR_DIALOG* aDialog,
- wxNotebook* aParent,
- const wxString& aTitle,
- EDA_HOTKEY_CONFIG* aSection ) :
- wxPanel( aParent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxNO_BORDER ),
- m_hotkeySection( aSection ),
- m_dialog( aDialog )
+void HOTKEY_LIST_CTRL::UpdateFromClientData()
{
- aParent->AddPage( this, aTitle );
+ for( wxTreeListItem i = GetFirstItem(); i.IsOk(); i = GetNextItem( i ) )
+ {
+ DIALOG_HOTKEY_CLIENT_DATA* hkdata = GetHKClientData( i );
+ if( !hkdata )
+ continue;
- wxBoxSizer* bMainSizer = new wxBoxSizer( wxVERTICAL );
+ EDA_HOTKEY& hk = hkdata->GetHotkey();
- SetSizer( bMainSizer );
- Layout();
- bMainSizer->Fit( this );
+ wxString name = wxGetTranslation( hk.m_InfoMsg );
+ wxString key = KeyNameFromKeyCode( hk.m_KeyCode );
- m_hotkeyList = new HOTKEY_LIST_CTRL( this, aSection );
- bMainSizer->Add( m_hotkeyList, 1, wxALL|wxEXPAND, 5 );
+ SetItemText( i, 0, name );
+ SetItemText( i, 1, key );
+ }
}
-void HOTKEY_SECTION_PAGE::Restore()
+bool HOTKEY_LIST_CTRL::TransferDataToControl()
{
- m_hotkeyList->RestoreFrom( m_hotkeySection );
+ Freeze();
+ DeleteAllItems();
+ m_items.clear();
+ m_hotkeys.clear();
- Update();
+ HOTKEYS_SECTIONS::iterator sec_it;
+ size_t sec_index = 0;
+ for( sec_it = m_sections.begin(); sec_it != m_sections.end(); ++sec_it, ++sec_index )
+ {
+ LoadSection( sec_it->second );
+ wxString section_tag = *( sec_it->second->m_SectionTag );
+
+ // Create parent item
+ wxTreeListItem parent = AppendItem( GetRootItem(), sec_it->first );
+
+ HOTKEY_LIST& each_list = m_hotkeys[sec_index];
+ HOTKEY_LIST::iterator hk_it;
+ for( hk_it = each_list.begin(); hk_it != each_list.end(); ++hk_it )
+ {
+ wxTreeListItem item = AppendItem( parent, wxEmptyString );
+ SetItemData( item, new DIALOG_HOTKEY_CLIENT_DATA( &*hk_it, section_tag ) );
+ m_items.push_back( item );
+ }
+
+ Expand( parent );
+ }
+
+ UpdateFromClientData();
+ Thaw();
+
+ return true;
+}
+
+
+bool HOTKEY_LIST_CTRL::TransferDataFromControl()
+{
+ for( size_t i_sec = 0; i_sec < m_sections.size(); ++i_sec )
+ {
+ struct EDA_HOTKEY_CONFIG* section = m_sections[i_sec].second;
+ for( EDA_HOTKEY** info_ptr = section->m_HK_InfoList; *info_ptr; ++info_ptr )
+ {
+ EDA_HOTKEY* info = *info_ptr;
+ for( wxTreeListItem item = GetFirstItem(); item.IsOk(); item = GetNextItem( item ) )
+ {
+ DIALOG_HOTKEY_CLIENT_DATA* hkdata = GetHKClientData( item );
+ if( !hkdata )
+ continue;
+
+ EDA_HOTKEY& hk = hkdata->GetHotkey();
+ if( hk.m_Idcommand == info->m_Idcommand )
+ {
+ info->m_KeyCode = hk.m_KeyCode;
+ break;
+ }
+ }
+ }
+ }
+ return true;
+}
+
+
+bool HOTKEY_LIST_CTRL::ResolveKeyConflicts( long aKey, const wxString& aSectionTag )
+{
+ EDA_HOTKEY* conflictingKey = NULL;
+ EDA_HOTKEY_CONFIG* conflictingSection = NULL;
+
+ CheckKeyConflicts( aKey, aSectionTag, &conflictingKey, &conflictingSection );
+
+ if( conflictingKey != NULL )
+ {
+ wxString info = wxGetTranslation( conflictingKey->m_InfoMsg );
+ wxString msg = wxString::Format(
+ _( "<%s> is already assigned to \"%s\" in section \"%s\". Are you sure you want "
+ "to change its assignment?" ),
+ KeyNameFromKeyCode( aKey ), GetChars( info ),
+ *(conflictingSection->m_Title) );
+
+ wxMessageDialog dlg( m_parent, msg, _( "Confirm change" ), wxYES_NO | wxNO_DEFAULT );
+
+ if( dlg.ShowModal() == wxID_YES )
+ {
+ conflictingKey->m_KeyCode = 0;
+ UpdateFromClientData();
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+bool HOTKEY_LIST_CTRL::CheckKeyConflicts( long aKey, const wxString& aSectionTag,
+ EDA_HOTKEY** aConfKey, EDA_HOTKEY_CONFIG** aConfSect )
+{
+ EDA_HOTKEY* conflictingKey = NULL;
+ struct EDA_HOTKEY_CONFIG* conflictingSection = NULL;
+
+ for( wxTreeListItem item = GetFirstItem(); item.IsOk(); item = GetNextItem( item ) )
+ {
+ DIALOG_HOTKEY_CLIENT_DATA* hkdata = GetHKClientData( item );
+ if( !hkdata )
+ continue;
+
+ EDA_HOTKEY& hk = hkdata->GetHotkey();
+ wxString tag = hkdata->GetSectionTag();
+
+ if( aSectionTag != g_CommonSectionTag
+ && tag != g_CommonSectionTag
+ && tag != aSectionTag )
+ continue;
+
+ if( aKey == hk.m_KeyCode )
+ {
+ conflictingKey = &hk;
+
+ // Find the section
+ HOTKEYS_SECTIONS::iterator it;
+ for( it = m_sections.begin(); it != m_sections.end(); ++it )
+ {
+ if( *it->second->m_SectionTag == tag )
+ {
+ conflictingSection = it->second;
+ break;
+ }
+ }
+ }
+ }
+
+ if( aConfKey )
+ *aConfKey = conflictingKey;
+
+ if( aConfSect )
+ *aConfSect = conflictingSection;
+
+ return conflictingKey == NULL;
}
@@ -272,118 +351,51 @@ HOTKEYS_EDITOR_DIALOG::HOTKEYS_EDITOR_DIALOG( EDA_BASE_FRAME* aParent,
{
EDA_HOTKEY_CONFIG* section;
+ HOTKEYS_SECTIONS sections;
for( section = m_hotkeys; section->m_HK_InfoList; section++ )
{
- m_hotkeySectionPages.push_back( new HOTKEY_SECTION_PAGE( this, m_hotkeySections,
- wxGetTranslation( *section->m_Title ),
- section ) );
+ HOTKEYS_SECTION sec( wxGetTranslation( *section->m_Title ), section );
+ sections.push_back( sec );
}
+ m_hotkeyListCtrl = new HOTKEY_LIST_CTRL( this, sections );
+ m_mainSizer->Insert( 1, m_hotkeyListCtrl, wxSizerFlags( 1 ).Expand().Border( wxALL, 5 ) );
+ Layout();
+
m_sdbSizerOK->SetDefault();
Center();
}
-void HOTKEYS_EDITOR_DIALOG::OnOKClicked( wxCommandEvent& event )
+bool HOTKEYS_EDITOR_DIALOG::TransferDataToWindow()
{
- std::vector::iterator i;
+ if( !wxDialog::TransferDataToWindow() )
+ return false;
- for( i = m_hotkeySectionPages.begin(); i != m_hotkeySectionPages.end(); ++i )
- {
- std::vector& hotkey_vec = (*i)->GetHotkeys();
- EDA_HOTKEY_CONFIG* section = (*i)->GetHotkeySection();
-
- EDA_HOTKEY** info_ptr;
-
- for( info_ptr = section->m_HK_InfoList; *info_ptr; info_ptr++ )
- {
- EDA_HOTKEY* info = *info_ptr;
-
- /* find the corresponding hotkey */
- std::vector::iterator j;
-
- for( j = hotkey_vec.begin(); j != hotkey_vec.end(); ++j )
- {
- if( (*j) && (*j)->m_Idcommand == info->m_Idcommand )
- {
- info->m_KeyCode = (*j)->m_KeyCode;
- break;
- }
- }
- }
- }
-
- /* save the hotkeys */
- m_parent->WriteHotkeyConfig( m_hotkeys );
-
- EndModal( wxID_OK );
-}
-
-
-
-void HOTKEYS_EDITOR_DIALOG::UndoClicked( wxCommandEvent& aEvent )
-{
- std::vector::iterator i;
-
- for( i = m_hotkeySectionPages.begin(); i != m_hotkeySectionPages.end(); ++i )
- {
- (*i)->Restore();
- }
-}
-
-
-bool HOTKEYS_EDITOR_DIALOG::CanSetKey( long aKey, const wxString* sectionTag )
-{
- std::vector::iterator i;
-
- EDA_HOTKEY* conflictingKey = NULL;
- HOTKEY_SECTION_PAGE* conflictingSection = NULL;
-
- for( i = m_hotkeySectionPages.begin(); i != m_hotkeySectionPages.end(); ++i )
- {
- // Any non Common section can only conflict with itself and Common
- if( *sectionTag != g_CommonSectionTag
- && *((*i)->GetHotkeySection()->m_SectionTag) != g_CommonSectionTag
- && *((*i)->GetHotkeySection()->m_SectionTag) != *sectionTag )
- continue;
-
- std::vector& hotkey_vec = (*i)->GetHotkeys();
- /* find the corresponding hotkey */
- std::vector::iterator j;
-
- for( j = hotkey_vec.begin(); j != hotkey_vec.end(); ++j )
- {
- if( aKey == (*j)->m_KeyCode )
- {
- conflictingKey = (*j);
- conflictingSection = (*i);
-
- break;
- }
- }
- }
-
- if( conflictingKey != NULL )
- {
- wxString info = wxGetTranslation( conflictingKey->m_InfoMsg );
- wxString msg = wxString::Format(
- _( "<%s> is already assigned to \"%s\" in section \"%s\". Are you sure you want "
- "to change its assignment?" ),
- KeyNameFromKeyCode( aKey ), GetChars( info ),
- *(conflictingSection->GetHotkeySection()->m_Title) );
-
- wxMessageDialog dlg( this, msg, _( "Confirm change" ), wxYES_NO | wxNO_DEFAULT );
-
- if( dlg.ShowModal() == wxID_YES )
- {
- conflictingKey->m_KeyCode = 0;
- return true;
- }
- else
- {
- return false;
- }
- }
+ if( !m_hotkeyListCtrl->TransferDataToControl() )
+ return false;
return true;
}
+
+
+bool HOTKEYS_EDITOR_DIALOG::TransferDataFromWindow()
+{
+ if( !wxDialog::TransferDataToWindow() )
+ return false;
+
+ if( !m_hotkeyListCtrl->TransferDataFromControl() )
+ return false;
+
+ // save the hotkeys
+ m_parent->WriteHotkeyConfig( m_hotkeys );
+
+ return true;
+}
+
+
+void HOTKEYS_EDITOR_DIALOG::ResetClicked( wxCommandEvent& aEvent )
+{
+ m_hotkeyListCtrl->TransferDataToControl();
+}
+
diff --git a/common/dialogs/dialog_hotkeys_editor_base.cpp b/common/dialogs/dialog_hotkeys_editor_base.cpp
index ef2f7c9eef..1293cb4b95 100644
--- a/common/dialogs/dialog_hotkeys_editor_base.cpp
+++ b/common/dialogs/dialog_hotkeys_editor_base.cpp
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 17 2015)
+// C++ code generated with wxFormBuilder (version Dec 28 2015)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@@ -13,20 +13,21 @@ HOTKEYS_EDITOR_DIALOG_BASE::HOTKEYS_EDITOR_DIALOG_BASE( wxWindow* parent, wxWind
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
- wxBoxSizer* bMainSizer;
- bMainSizer = new wxBoxSizer( wxVERTICAL );
+ m_mainSizer = new wxBoxSizer( wxVERTICAL );
m_staticText1 = new wxStaticText( this, wxID_ANY, _("Select a row and press a new key combination to alter the binding."), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText1->Wrap( 400 );
- bMainSizer->Add( m_staticText1, 0, wxALL|wxEXPAND, 5 );
-
- m_hotkeySections = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
-
- bMainSizer->Add( m_hotkeySections, 1, wxEXPAND | wxALL, 5 );
+ m_mainSizer->Add( m_staticText1, 0, wxALL|wxEXPAND, 5 );
wxBoxSizer* b_buttonsSizer;
b_buttonsSizer = new wxBoxSizer( wxHORIZONTAL );
+ m_resetButton = new wxButton( this, wxID_RESET, _("Reset"), wxDefaultPosition, wxDefaultSize, 0 );
+ b_buttonsSizer->Add( m_resetButton, 0, wxALL|wxEXPAND, 5 );
+
+
+ b_buttonsSizer->Add( 0, 0, 1, wxEXPAND, 5 );
+
m_sdbSizer = new wxStdDialogButtonSizer();
m_sdbSizerOK = new wxButton( this, wxID_OK );
m_sdbSizer->AddButton( m_sdbSizerOK );
@@ -36,25 +37,20 @@ HOTKEYS_EDITOR_DIALOG_BASE::HOTKEYS_EDITOR_DIALOG_BASE( wxWindow* parent, wxWind
b_buttonsSizer->Add( m_sdbSizer, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
- m_undoButton = new wxButton( this, wxID_UNDO, _("Undo"), wxDefaultPosition, wxDefaultSize, 0 );
- b_buttonsSizer->Add( m_undoButton, 0, wxALL|wxEXPAND, 5 );
+
+ m_mainSizer->Add( b_buttonsSizer, 0, wxALIGN_RIGHT|wxEXPAND, 5 );
- bMainSizer->Add( b_buttonsSizer, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bMainSizer );
+ this->SetSizer( m_mainSizer );
this->Layout();
// Connect Events
- m_sdbSizerOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HOTKEYS_EDITOR_DIALOG_BASE::OnOKClicked ), NULL, this );
- m_undoButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HOTKEYS_EDITOR_DIALOG_BASE::UndoClicked ), NULL, this );
+ m_resetButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HOTKEYS_EDITOR_DIALOG_BASE::ResetClicked ), NULL, this );
}
HOTKEYS_EDITOR_DIALOG_BASE::~HOTKEYS_EDITOR_DIALOG_BASE()
{
// Disconnect Events
- m_sdbSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HOTKEYS_EDITOR_DIALOG_BASE::OnOKClicked ), NULL, this );
- m_undoButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HOTKEYS_EDITOR_DIALOG_BASE::UndoClicked ), NULL, this );
+ m_resetButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HOTKEYS_EDITOR_DIALOG_BASE::ResetClicked ), NULL, this );
}
diff --git a/common/dialogs/dialog_hotkeys_editor_base.fbp b/common/dialogs/dialog_hotkeys_editor_base.fbp
index 7b12ee4f4a..814b3acc7b 100644
--- a/common/dialogs/dialog_hotkeys_editor_base.fbp
+++ b/common/dialogs/dialog_hotkeys_editor_base.fbp
@@ -90,9 +90,9 @@
diff --git a/common/dialogs/dialog_hotkeys_editor_base.h b/common/dialogs/dialog_hotkeys_editor_base.h
index f0d4d9e626..9c58421872 100644
--- a/common/dialogs/dialog_hotkeys_editor_base.h
+++ b/common/dialogs/dialog_hotkeys_editor_base.h
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 17 2015)
+// C++ code generated with wxFormBuilder (version Dec 28 2015)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@@ -20,9 +20,8 @@ class DIALOG_SHIM;
#include
#include
#include
-#include
-#include
#include
+#include
#include
///////////////////////////////////////////////////////////////////////////
@@ -36,16 +35,15 @@ class HOTKEYS_EDITOR_DIALOG_BASE : public DIALOG_SHIM
private:
protected:
+ wxBoxSizer* m_mainSizer;
wxStaticText* m_staticText1;
- wxNotebook* m_hotkeySections;
+ wxButton* m_resetButton;
wxStdDialogButtonSizer* m_sdbSizer;
wxButton* m_sdbSizerOK;
wxButton* m_sdbSizerCancel;
- wxButton* m_undoButton;
// Virtual event handlers, overide them in your derived class
- virtual void OnOKClicked( wxCommandEvent& event ) { event.Skip(); }
- virtual void UndoClicked( wxCommandEvent& event ) { event.Skip(); }
+ virtual void ResetClicked( wxCommandEvent& event ) { event.Skip(); }
public:
diff --git a/common/footprint_info.cpp b/common/footprint_info.cpp
index da14839cdb..de924a510f 100644
--- a/common/footprint_info.cpp
+++ b/common/footprint_info.cpp
@@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2011 Jean-Pierre Charras,
- * Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck
+ * Copyright (C) 2013-2016 SoftPLC Corporation, Dick Hollenbeck
* Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
@@ -28,7 +28,12 @@
*/
-#define USE_WORKER_THREADS 1 // 1:yes, 0:no. use worker thread to load libraries
+/**
+ No. concurrent threads doing "http(s) GET". More than 6 is not significantly
+ faster, less than 6 is likely slower. Main thread is in this count, so if
+ set to 1 then no temp threads are created.
+*/
+#define READER_THREADS 6
/*
* Functions to read footprint libraries and fill m_footprints by available footprints names
@@ -119,20 +124,13 @@ void FOOTPRINT_INFO::load()
}
-#define JOBZ 6 // no. libraries per worker thread. It takes about
- // a second to load a GITHUB library, so assigning
- // this no. libraries to each thread should give a little
- // over this no. seconds total time if the original delay
- // were caused by latencies alone.
- // (If https://github.com does not mind.)
-
#define NTOLERABLE_ERRORS 4 // max errors before aborting, although threads
// in progress will still pile on for a bit. e.g. if 9 threads
// expect 9 greater than this.
void FOOTPRINT_LIST::loader_job( const wxString* aNicknameList, int aJobZ )
{
- //DBG(printf( "%s: first:'%s' count:%d\n", __func__, (char*) TO_UTF8( *aNicknameList ), aJobZ );)
+ DBG(printf( "%s: first:'%s' aJobZ:%d\n", __func__, TO_UTF8( *aNicknameList ), aJobZ );)
for( int i=0; iGetLogicalLibs();
-#if USE_WORKER_THREADS
-
// Even though the PLUGIN API implementation is the place for the
// locale toggling, in order to keep LOCAL_IO::C_count at 1 or greater
// for the duration of all helper threads, we increment by one here via instantiation.
@@ -229,6 +225,8 @@ bool FOOTPRINT_LIST::ReadFootprintFiles( FP_LIB_TABLE* aTable, const wxString* a
MYTHREADS threads;
+ unsigned jobz = (nicknames.size() + READER_THREADS - 1) / READER_THREADS;
+
// Give each thread JOBZ nicknames to process. The last portion of, or if the entire
// size() is small, I'll do myself.
for( unsigned i=0; i= nicknames.size() )
+ if( i + jobz >= nicknames.size() ) // on the last iteration of this for(;;)
{
jobz = nicknames.size() - i;
- // Only a little bit to do, I'll do it myself, on current thread.
+ // Only a little bit to do, I'll do it myself on current thread.
+ // I am part of the READER_THREADS count.
loader_job( &nicknames[i], jobz );
}
else
{
- // Delegate the job to a worker thread created here.
+ // Delegate the job to a temporary thread created here.
threads.push_back( new boost::thread( &FOOTPRINT_LIST::loader_job,
this, &nicknames[i], jobz ) );
}
@@ -266,9 +263,6 @@ bool FOOTPRINT_LIST::ReadFootprintFiles( FP_LIB_TABLE* aTable, const wxString* a
{
threads[i].join();
}
-#else
- loader_job( &nicknames[0], nicknames.size() );
-#endif
m_list.sort();
}
diff --git a/common/kicad_curl/kicad_curl.cpp b/common/kicad_curl/kicad_curl.cpp
index 0df2528859..0977f28c80 100644
--- a/common/kicad_curl/kicad_curl.cpp
+++ b/common/kicad_curl/kicad_curl.cpp
@@ -22,51 +22,188 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include
+#include
+#include
-bool KICAD_CURL::Init()
+#include
+#include
+#include // MUTEX and MUTLOCK
+#include
+
+// These are even more private than class members, and since there is only
+// one instance of KICAD_CURL ever, these statics are hidden here to simplify the
+// client (API) header file.
+static volatile bool s_initialized;
+
+static MUTEX s_lock;
+
+
+void (CURL_EXTERN * KICAD_CURL::easy_cleanup) ( CURL* curl );
+CURL* (CURL_EXTERN * KICAD_CURL::easy_init) ( void );
+CURLcode (CURL_EXTERN * KICAD_CURL::easy_perform) ( CURL* curl );
+CURLcode (CURL_EXTERN * KICAD_CURL::easy_setopt) ( CURL* curl, CURLoption option, ... );
+const char* (CURL_EXTERN * KICAD_CURL::easy_strerror) ( CURLcode );
+CURLcode (CURL_EXTERN * KICAD_CURL::global_init) ( long flags );
+void (CURL_EXTERN * KICAD_CURL::global_cleanup) ( void );
+curl_slist* (CURL_EXTERN * KICAD_CURL::slist_append) ( curl_slist*, const char* );
+void (CURL_EXTERN * KICAD_CURL::slist_free_all) ( curl_slist* );
+char* (CURL_EXTERN * KICAD_CURL::version) ( void );
+curl_version_info_data* (CURL_EXTERN * KICAD_CURL::version_info) (CURLversion);
+
+
+struct DYN_LOOKUP
{
- if ( curl_global_init( CURL_GLOBAL_ALL ) != CURLE_OK )
+ const char* name;
+ void** address;
+};
+
+// May need to modify "name" for each platform according to how libcurl is built on
+// that platform and the spelling or partial mangling of C function names. On linux
+// there is no mangling.
+#define DYN_PAIR( basename ) { "curl_" #basename, (void**) &KICAD_CURL::basename }
+
+
+const DYN_LOOKUP KICAD_CURL::dyn_funcs[] = {
+ DYN_PAIR( easy_cleanup ),
+ DYN_PAIR( easy_init ),
+ DYN_PAIR( easy_perform ),
+ DYN_PAIR( easy_setopt ),
+ DYN_PAIR( easy_strerror ),
+ DYN_PAIR( global_init ),
+ DYN_PAIR( global_cleanup ),
+ DYN_PAIR( slist_append ),
+ DYN_PAIR( slist_free_all ),
+ DYN_PAIR( version ),
+ DYN_PAIR( version_info ),
+};
+
+
+void KICAD_CURL::Init()
+{
+ // We test s_initialized twice in an effort to avoid
+ // unnecessarily locking s_lock. This understands that the common case
+ // will not need to lock.
+ if( !s_initialized )
{
- return false;
- }
- else
- {
- m_initialized = true;
- return true;
+ MUTLOCK lock( s_lock );
+
+ if( !s_initialized )
+ {
+ // dynamically load the library.
+ wxDynamicLibrary dso;
+ wxString canonicalName = dso.CanonicalizeName( wxT( "curl" ) );
+
+ // This is an ugly hack for MinGW builds. We should probably use something
+ // like objdump to get the actual library file name from the link file.
+#if defined( __MINGW32__ )
+ canonicalName = dso.CanonicalizeName( wxT( "curl-4" ) );
+ canonicalName = wxT( "lib" ) + canonicalName;
+#endif
+
+ if( !dso.Load( canonicalName, wxDL_NOW | wxDL_GLOBAL ) )
+ {
+ // Failure: error reporting UI was done via wxLogSysError().
+ std::string msg = StrPrintf( "%s not wxDynamicLibrary::Load()ed",
+ static_cast< const char *>( canonicalName.mb_str() ) );
+ THROW_IO_ERROR( msg );
+ }
+
+ // get addresses.
+
+ for( unsigned i=0; i < DIM(dyn_funcs); ++i )
+ {
+ *dyn_funcs[i].address = dso.GetSymbol( dyn_funcs[i].name );
+
+ if( *dyn_funcs[i].address == NULL )
+ {
+ // Failure: error reporting UI was done via wxLogSysError().
+ // No further reporting required here.
+
+ std::string msg = StrPrintf( "%s has no function %s",
+ static_cast( canonicalName.mb_str() ),
+ dyn_funcs[i].name );
+
+ THROW_IO_ERROR( msg );
+ }
+ }
+
+ if( KICAD_CURL::global_init( CURL_GLOBAL_ALL ) != CURLE_OK )
+ {
+ THROW_IO_ERROR( "curl_global_init() failed." );
+ }
+
+ wxLogDebug( "Using %s", GetVersion() );
+
+ // Tell dso's wxDynamicLibrary destructor not to Unload() the program image,
+ // since everything is fine before this. In those cases where THROW_IO_ERROR
+ // is called, dso is destroyed and the DSO/DLL is unloaded before returning in
+ // those error cases.
+ (void) dso.Detach();
+
+ s_initialized = true;
+ }
}
}
void KICAD_CURL::Cleanup()
{
- if( m_initialized )
- curl_global_cleanup();
-}
+ /*
+ Calling MUTLOCK() from a static destructor will typically be bad, since the
+ s_lock may already have been statically destroyed itself leading to a boost
+ exception. (Remember C++ does not provide certain sequencing of static
+ destructor invocation.)
-std::string KICAD_CURL::GetVersion()
-{
- return std::string( curl_version() );
+ To prevent this we test s_initialized twice, which ensures that the MUTLOCK
+ is only instantiated on the first call, which should be from
+ PGM_BASE::destroy() which is first called earlier than static destruction.
+ Then when called again from the actual PGM_BASE::~PGM_BASE() function,
+ MUTLOCK will not be instantiated because s_initialized will be false.
+
+ */
+
+ if( s_initialized )
+ {
+ MUTLOCK lock( s_lock );
+
+ if( s_initialized )
+ {
+
+ KICAD_CURL::global_cleanup();
+
+ // dyn_funcs are not good for anything now, assuming process is ending soon here.
+ for( unsigned i=0; i < DIM(dyn_funcs); ++i )
+ {
+ *dyn_funcs[i].address = 0;
+ }
+
+ s_initialized = false;
+ }
+ }
}
std::string KICAD_CURL::GetSimpleVersion()
{
- curl_version_info_data *info = curl_version_info(CURLVERSION_NOW);
+ if( !s_initialized )
+ Init();
+
+ curl_version_info_data *info = KICAD_CURL::version_info( CURLVERSION_NOW );
std::string res;
if( info->version )
{
- res += "libcurl version: " + std::string(info->version);
+ res += "libcurl version: " + std::string( info->version );
}
res += " (";
+
if( info->features & CURL_VERSION_SSL )
{
res += "with SSL - ";
- res += std::string(info->ssl_version);
+ res += std::string( info->ssl_version );
}
else
{
@@ -76,5 +213,3 @@ std::string KICAD_CURL::GetSimpleVersion()
return res;
}
-
-bool KICAD_CURL::m_initialized = false;
\ No newline at end of file
diff --git a/common/kicad_curl/kicad_curl_easy.cpp b/common/kicad_curl/kicad_curl_easy.cpp
index 4dadf04397..e180ca6c99 100644
--- a/common/kicad_curl/kicad_curl_easy.cpp
+++ b/common/kicad_curl/kicad_curl_easy.cpp
@@ -30,134 +30,70 @@
#include
#include
-static size_t write_callback (void *contents, size_t size, size_t nmemb, void *userp);
-
-KICAD_CURL_EASY::KICAD_CURL_EASY()
- : m_headers( NULL )
+static size_t write_callback( void* contents, size_t size, size_t nmemb, void* userp )
{
- m_CURL = curl_easy_init();
+ size_t realsize = size * nmemb;
- if( m_CURL == NULL )
+ std::string* p = (std::string*) userp;
+
+ p->append( (const char*) contents, realsize );
+
+ return realsize;
+}
+
+
+KICAD_CURL_EASY::KICAD_CURL_EASY() :
+ m_headers( NULL )
+{
+ // Call KICAD_CURL::Init() from in here everytime, but only the first time
+ // will incur any overhead. This strategy ensures that libcurl is never loaded
+ // unless it is needed.
+
+ KICAD_CURL::Init();
+
+ // Do not catch exception from KICAD_CURL::Init() at this level.
+ // Instantiation of this instance will fail if Init() throws, thus ensuring
+ // that this instance cannot be subsequently used.
+ // Caller needs a try catch around KICAD_CURL_EASY instantiation.
+
+ m_CURL = KICAD_CURL::easy_init();
+
+ if( !m_CURL )
{
THROW_IO_ERROR( "Unable to initialize CURL session" );
}
- m_Buffer.Payload = (char*)malloc( 1 );
- m_Buffer.Size = 0;
-
- curl_easy_setopt( m_CURL, CURLOPT_WRITEFUNCTION, write_callback );
- curl_easy_setopt( m_CURL, CURLOPT_WRITEDATA, (void *)&m_Buffer );
+ KICAD_CURL::easy_setopt( m_CURL, CURLOPT_WRITEFUNCTION, write_callback );
+ KICAD_CURL::easy_setopt( m_CURL, CURLOPT_WRITEDATA, (void*) &m_buffer );
}
KICAD_CURL_EASY::~KICAD_CURL_EASY()
{
- free(m_Buffer.Payload);
- curl_easy_cleanup(m_CURL);
-}
+ if( m_headers )
+ KICAD_CURL::slist_free_all( m_headers );
-
-bool KICAD_CURL_EASY::SetURL( const std::string& aURL )
-{
- if( SetOption( CURLOPT_URL, aURL.c_str() ) == CURLE_OK )
- {
- return true;
- }
- return false;
-}
-
-
-bool KICAD_CURL_EASY::SetUserAgent( const std::string& aAgent )
-{
- if( SetOption( CURLOPT_USERAGENT, aAgent.c_str() ) == CURLE_OK )
- {
- return true;
- }
- return false;
-}
-
-
-bool KICAD_CURL_EASY::SetFollowRedirects( bool aFollow )
-{
- if( SetOption( CURLOPT_FOLLOWLOCATION , (aFollow ? 1 : 0) ) == CURLE_OK )
- {
- return true;
- }
- return false;
-}
-
-
-void KICAD_CURL_EASY::SetHeader( const std::string& aName, const std::string& aValue )
-{
- std::string header = aName + ':' + aValue;
- m_headers = curl_slist_append( m_headers, header.c_str() );
-}
-
-
-std::string KICAD_CURL_EASY::GetErrorText(CURLcode code)
-{
- return curl_easy_strerror(code);
-}
-
-
-static size_t write_callback( void *contents, size_t size, size_t nmemb, void *userp )
-{
- /* calculate buffer size */
- size_t realsize = size * nmemb;
-
- /* cast pointer to fetch struct */
- struct KICAD_EASY_CURL_BUFFER *p = ( struct KICAD_EASY_CURL_BUFFER * ) userp;
-
- /* expand buffer */
- p->Payload = (char *) realloc( p->Payload, p->Size + realsize + 1 );
-
- /* check buffer */
- if ( p->Payload == NULL )
- {
- wxLogError( wxT( "Failed to expand buffer in curl_callback" ) );
-
- /* free buffer */
- free( p->Payload );
-
- return -1;
- }
-
- /* copy contents to buffer */
- memcpy( &(p->Payload[p->Size]), contents, realsize );
-
- /* set new buffer size */
- p->Size += realsize;
-
- /* ensure null termination */
- p->Payload[p->Size] = 0;
-
- /* return size */
- return realsize;
+ KICAD_CURL::easy_cleanup( m_CURL );
}
void KICAD_CURL_EASY::Perform()
{
- if( m_headers != NULL )
+ if( m_headers )
{
- curl_easy_setopt( m_CURL, CURLOPT_HTTPHEADER, m_headers );
+ KICAD_CURL::easy_setopt( m_CURL, CURLOPT_HTTPHEADER, m_headers );
}
- if( m_Buffer.Size > 0 )
- {
- free( m_Buffer.Payload );
- m_Buffer.Payload = (char*)malloc( 1 );
- m_Buffer.Size = 0;
- }
+ // bonus: retain worst case memory allocation, should re-use occur
+ m_buffer.clear();
+
+ CURLcode res = KICAD_CURL::easy_perform( m_CURL );
- CURLcode res = curl_easy_perform( m_CURL );
if( res != CURLE_OK )
{
- wxString msg = wxString::Format(
- _( "CURL Request Failed: %s" ),
- GetErrorText( res ) );
-
+ std::string msg = StrPrintf( "curl_easy_perform()=%d: %s",
+ res, GetErrorText( res ).c_str() );
THROW_IO_ERROR( msg );
}
-}
\ No newline at end of file
+}
diff --git a/common/kiway.cpp b/common/kiway.cpp
index f267ebd96a..a5ca94f46a 100644
--- a/common/kiway.cpp
+++ b/common/kiway.cpp
@@ -269,6 +269,15 @@ KIWAY::FACE_T KIWAY::KifaceType( FRAME_T aFrameType )
}
+KIWAY_PLAYER* KIWAY::GetPlayerFrame( FRAME_T aFrameType )
+{
+ if( unsigned( aFrameType ) >= KIWAY_PLAYER_COUNT )
+ return NULL;
+
+ return m_player[aFrameType];
+}
+
+
KIWAY_PLAYER* KIWAY::Player( FRAME_T aFrameType, bool doCreate )
{
// Since this will be called from python, cannot assume that code will
@@ -283,8 +292,10 @@ KIWAY_PLAYER* KIWAY::Player( FRAME_T aFrameType, bool doCreate )
}
// return the previously opened window
- if( m_player[aFrameType] )
- return m_player[aFrameType];
+ KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
+
+ if( frame )
+ return frame;
if( doCreate )
{
@@ -296,7 +307,7 @@ KIWAY_PLAYER* KIWAY::Player( FRAME_T aFrameType, bool doCreate )
if( kiface )
{
- KIWAY_PLAYER* frame = (KIWAY_PLAYER*) kiface->CreateWindow(
+ frame = (KIWAY_PLAYER*) kiface->CreateWindow(
m_top,
aFrameType,
this,
@@ -325,18 +336,18 @@ bool KIWAY::PlayerClose( FRAME_T aFrameType, bool doForce )
return false;
}
- if( m_player[aFrameType] )
- {
- if( m_player[aFrameType]->Close( doForce ) )
- {
- m_player[aFrameType] = 0;
- return true;
- }
+ KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
- return false;
+ if( frame == NULL ) // Already closed
+ return true;
+
+ if( frame->Close( doForce ) )
+ {
+ m_player[aFrameType] = 0;
+ return true;
}
- return true; // window is closed already.
+ return false;
}
@@ -377,7 +388,11 @@ void KIWAY::SetLanguage( int aLanguage )
// the array below.
if( m_ctl & KFCTL_CPP_PROJECT_SUITE )
{
- EDA_BASE_FRAME* top = (EDA_BASE_FRAME*) m_top;
+ // A dynamic_cast could be better, but creates link issues
+ // (some basic_frame functions not found) on some platforms,
+ // so a static_cast is used.
+ EDA_BASE_FRAME* top = static_cast( m_top );
+
if( top )
top->ShowChangedLanguage();
}
@@ -385,7 +400,7 @@ void KIWAY::SetLanguage( int aLanguage )
for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
{
- KIWAY_PLAYER* frame = m_player[i];
+ KIWAY_PLAYER* frame = GetPlayerFrame( ( FRAME_T )i );
if( frame )
{
diff --git a/common/pgm_base.cpp b/common/pgm_base.cpp
index 6606ee1b0a..ddfdf0089b 100644
--- a/common/pgm_base.cpp
+++ b/common/pgm_base.cpp
@@ -283,7 +283,6 @@ PGM_BASE::PGM_BASE()
PGM_BASE::~PGM_BASE()
{
destroy();
- KICAD_CURL::Cleanup();
}
@@ -291,6 +290,8 @@ void PGM_BASE::destroy()
{
// unlike a normal destructor, this is designed to be called more than once safely:
+ KICAD_CURL::Cleanup();
+
delete m_common_settings;
m_common_settings = 0;
@@ -495,13 +496,6 @@ bool PGM_BASE::initPgm()
wxSystemOptions::SetOption( wxOSX_FILEDIALOG_ALWAYS_SHOW_TYPES, 1 );
#endif
- // Initialize CURL
- wxLogDebug( wxT( "Using %s" ), KICAD_CURL::GetVersion() );
- if( !KICAD_CURL::Init() )
- {
- wxLogDebug( wxT( "Error initializing libcurl" ) );
- }
-
return true;
}
diff --git a/cvpcb/CMakeLists.txt b/cvpcb/CMakeLists.txt
index 3a106825b5..3b9f1766f9 100644
--- a/cvpcb/CMakeLists.txt
+++ b/cvpcb/CMakeLists.txt
@@ -46,7 +46,7 @@ set( CVPCB_SRCS
class_DisplayFootprintsFrame.cpp
class_footprints_listbox.cpp
class_library_listbox.cpp
- cvframe.cpp
+ cvpcb_mainframe.cpp
listboxes.cpp
menubar.cpp
readwrite_dlgs.cpp
diff --git a/cvpcb/class_footprints_listbox.cpp b/cvpcb/class_footprints_listbox.cpp
index ae611e43a7..7d2414f3e9 100644
--- a/cvpcb/class_footprints_listbox.cpp
+++ b/cvpcb/class_footprints_listbox.cpp
@@ -1,8 +1,8 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
- * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
- * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
+ * Copyright (C) 1992-2016 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
@@ -200,7 +200,7 @@ void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event )
return;
// If the footprint view window is displayed, update the footprint.
- if( GetParent()->GetFpViewerFrame() )
+ if( GetParent()->GetFootprintViewerFrame() )
GetParent()->CreateScreenCmp();
GetParent()->DisplayStatus();
diff --git a/cvpcb/cvframe.cpp b/cvpcb/cvpcb_mainframe.cpp
similarity index 98%
rename from cvpcb/cvframe.cpp
rename to cvpcb/cvpcb_mainframe.cpp
index a3deab9c17..4b3e4d0a00 100644
--- a/cvpcb/cvframe.cpp
+++ b/cvpcb/cvpcb_mainframe.cpp
@@ -1,9 +1,9 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
- * Copyright (C) 2015 Jean-Pierre Charras, jean-pierre.charras
+ * Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2011 Wayne Stambaugh
- * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 1992-2016 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
@@ -262,8 +262,8 @@ void CVPCB_MAINFRAME::OnCloseWindow( wxCloseEvent& Event )
}
// Close module display frame
- if( GetFpViewerFrame() )
- GetFpViewerFrame()->Close( true );
+ if( GetFootprintViewerFrame() )
+ GetFootprintViewerFrame()->Close( true );
m_modified = false;
@@ -495,7 +495,7 @@ void CVPCB_MAINFRAME::OnKeepOpenOnSave( wxCommandEvent& event )
void CVPCB_MAINFRAME::DisplayModule( wxCommandEvent& event )
{
CreateScreenCmp();
- GetFpViewerFrame()->RedrawScreen( wxPoint( 0, 0 ), false );
+ GetFootprintViewerFrame()->RedrawScreen( wxPoint( 0, 0 ), false );
}
@@ -569,7 +569,7 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
if ( ii >= 0 )
m_footprintListBox->SetSelection( ii, false );
- if( GetFpViewerFrame() )
+ if( GetFootprintViewerFrame() )
{
CreateScreenCmp();
}
@@ -781,7 +781,7 @@ int CVPCB_MAINFRAME::ReadSchematicNetlist( const std::string& aNetlist )
void CVPCB_MAINFRAME::CreateScreenCmp()
{
- DISPLAY_FOOTPRINTS_FRAME* fpframe = GetFpViewerFrame();
+ DISPLAY_FOOTPRINTS_FRAME* fpframe = GetFootprintViewerFrame();
if( !fpframe )
{
@@ -907,7 +907,7 @@ COMPONENT* CVPCB_MAINFRAME::GetSelectedComponent()
}
-DISPLAY_FOOTPRINTS_FRAME* CVPCB_MAINFRAME::GetFpViewerFrame()
+DISPLAY_FOOTPRINTS_FRAME* CVPCB_MAINFRAME::GetFootprintViewerFrame()
{
// returns the Footprint Viewer frame, if exists, or NULL
return dynamic_cast
diff --git a/cvpcb/cvpcb_mainframe.h b/cvpcb/cvpcb_mainframe.h
index 7ea861269e..5261350df9 100644
--- a/cvpcb/cvpcb_mainframe.h
+++ b/cvpcb/cvpcb_mainframe.h
@@ -1,8 +1,8 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
- * Copyright (C) 2011 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
- * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
+ * Copyright (C) 1992-2016 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
@@ -92,7 +92,7 @@ public:
/**
* @return a pointer on the Footprint Viewer frame, if exists, or NULL
*/
- DISPLAY_FOOTPRINTS_FRAME* GetFpViewerFrame();
+ DISPLAY_FOOTPRINTS_FRAME* GetFootprintViewerFrame();
/**
* Function OnSelectComponent
diff --git a/eeschema/annotate.cpp b/eeschema/annotate.cpp
index d0bae72a91..34f59047e5 100644
--- a/eeschema/annotate.cpp
+++ b/eeschema/annotate.cpp
@@ -50,7 +50,7 @@ void SCH_EDIT_FRAME::DeleteAnnotation( bool aCurrentSheetOnly )
}
// Update the references for the sheet that is currently being displayed.
- m_CurrentSheet->UpdateAllScreenReferences();
+ m_CurrentSheet->Last()->UpdateAllScreenReferences();
GetCanvas()->Refresh();
OnModify();
}
@@ -176,7 +176,7 @@ void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic,
OnModify();
// Update on screen references, that can be modified by previous calculations:
- m_CurrentSheet->UpdateAllScreenReferences();
+ m_CurrentSheet->Last()->UpdateAllScreenReferences();
SetSheetNumberAndCount();
m_canvas->Refresh( true );
diff --git a/eeschema/autoplace_fields.cpp b/eeschema/autoplace_fields.cpp
index 62dab7a363..4d97cd8e83 100644
--- a/eeschema/autoplace_fields.cpp
+++ b/eeschema/autoplace_fields.cpp
@@ -643,10 +643,6 @@ protected:
if( aDynamic )
{
- if( m_component->GetTransform().y1 )
- field_height = aField->GetBoundingBox().GetWidth();
- else
- field_height = aField->GetBoundingBox().GetHeight();
field_height = aField->GetBoundingBox().GetHeight();
padding = get_field_padding();
diff --git a/eeschema/class_netlist_object.cpp b/eeschema/class_netlist_object.cpp
index 5d7ca6b41d..1f53224fc9 100644
--- a/eeschema/class_netlist_object.cpp
+++ b/eeschema/class_netlist_object.cpp
@@ -357,7 +357,7 @@ wxString NETLIST_OBJECT::GetShortNetName() const
if( link ) // Should be always true
{
netName = wxT("Net-(");
- netName << link->GetRef( &m_netNameCandidate->m_SheetPath );
+ netName << link->GetRef( m_netNameCandidate->m_SheetPath.Last() );
netName << wxT("-Pad")
<< LIB_PIN::PinStringNum( m_netNameCandidate->m_PinNum )
<< wxT(")");
diff --git a/eeschema/component_references_lister.cpp b/eeschema/component_references_lister.cpp
index 93ce5ab35e..f927d88cdd 100644
--- a/eeschema/component_references_lister.cpp
+++ b/eeschema/component_references_lister.cpp
@@ -7,8 +7,8 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2011 jean-pierre Charras
- * Copyright (C) 1992-2011 Wayne Stambaugh
- * Copyright (C) 1992-2011 KiCad Developers, see change_log.txt for contributors.
+ * Copyright (C) 1992-2015 Wayne Stambaugh
+ * 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
@@ -701,7 +701,7 @@ SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent
m_RootCmp = aComponent;
m_Entry = aLibComponent;
- m_Unit = aComponent->GetUnitSelection( &aSheetPath );
+ m_Unit = aComponent->GetUnitSelection( aSheetPath.Last() );
m_SheetPath = aSheetPath;
m_IsNew = false;
m_Flag = 0;
@@ -709,10 +709,10 @@ SCH_REFERENCE::SCH_REFERENCE( SCH_COMPONENT* aComponent, LIB_PART* aLibComponent
m_CmpPos = aComponent->GetPosition();
m_SheetNum = 0;
- if( aComponent->GetRef( &aSheetPath ).IsEmpty() )
+ if( aComponent->GetRef( aSheetPath.Last() ).IsEmpty() )
aComponent->SetRef( aSheetPath.Last(), wxT( "DefRef?" ) );
- SetRef( aComponent->GetRef( &aSheetPath ) );
+ SetRef( aComponent->GetRef( aSheetPath.Last() ) );
m_NumRef = -1;
diff --git a/eeschema/controle.cpp b/eeschema/controle.cpp
index cfd7c6e8d9..99bd9ee755 100644
--- a/eeschema/controle.cpp
+++ b/eeschema/controle.cpp
@@ -108,7 +108,7 @@ SCH_ITEM* SCH_EDIT_FRAME::LocateAndShowItem( const wxPoint& aPosition, const KIC
Pin->GetMsgPanelInfo( items );
if( LibItem )
- items.push_back( MSG_PANEL_ITEM( LibItem->GetRef( m_CurrentSheet ),
+ items.push_back( MSG_PANEL_ITEM( LibItem->GetRef( m_CurrentSheet->Last() ),
LibItem->GetField( VALUE )->GetShownText(), DARKCYAN ) );
SetMsgPanel( items );
diff --git a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp
index 6aaf17a358..25bd214d43 100644
--- a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp
+++ b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp
@@ -727,7 +727,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::InitBuffers( SCH_COMPONENT* aComponent
}
#endif
- m_FieldsBuf[REFERENCE].SetText( m_cmp->GetRef( &m_parent->GetCurrentSheet() ) );
+ m_FieldsBuf[REFERENCE].SetText( m_cmp->GetRef( m_parent->GetCurrentSheet().Last() ) );
for( unsigned i = 0; iLastScreen()->SetZoom( m_parent->GetScreen()->GetZoom() );
m_parent->SetCurrentSheet( *sheet );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
}
m_lastMarkerFound = marker;
diff --git a/eeschema/dialogs/dialog_print_using_printer.cpp b/eeschema/dialogs/dialog_print_using_printer.cpp
index 09257bda8c..c21b5bb152 100644
--- a/eeschema/dialogs/dialog_print_using_printer.cpp
+++ b/eeschema/dialogs/dialog_print_using_printer.cpp
@@ -327,7 +327,7 @@ bool SCH_PRINTOUT::OnPrintPage( int page )
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
{
m_parent->SetCurrentSheet( list );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
screen = m_parent->GetCurrentSheet().LastScreen();
}
@@ -341,7 +341,7 @@ bool SCH_PRINTOUT::OnPrintPage( int page )
DrawPage( screen );
m_parent->SetCurrentSheet( oldsheetpath );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
return true;
diff --git a/eeschema/dialogs/dialog_rescue_each.cpp b/eeschema/dialogs/dialog_rescue_each.cpp
index ac804ba2ea..fcc7f489fa 100644
--- a/eeschema/dialogs/dialog_rescue_each.cpp
+++ b/eeschema/dialogs/dialog_rescue_each.cpp
@@ -34,6 +34,8 @@
#include
#include
#include
+#include
+
class DIALOG_RESCUE_EACH: public DIALOG_RESCUE_EACH_BASE
{
@@ -156,7 +158,7 @@ void DIALOG_RESCUE_EACH::PopulateInstanceList()
SCH_FIELD* valueField = each_component->GetField( 1 );
data.clear();
- data.push_back( each_component->GetRef( & m_Parent->GetCurrentSheet() ) );
+ data.push_back( each_component->GetRef( m_Parent->GetCurrentSheet().Last() ) );
data.push_back( valueField ? valueField->GetText() : wxT( "" ) );
m_ListOfInstances->AppendItem( data );
diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp
index 1105566086..750c012185 100644
--- a/eeschema/erc.cpp
+++ b/eeschema/erc.cpp
@@ -290,7 +290,7 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst,
cmp_ref = wxT( "?" );
if( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link )
- cmp_ref = aNetItemRef->GetComponentParent()->GetRef( &aNetItemRef->m_SheetPath );
+ cmp_ref = aNetItemRef->GetComponentParent()->GetRef( aNetItemRef->m_SheetPath.Last() );
if( aNetItemTst == NULL )
{
@@ -311,7 +311,7 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst,
{
if( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link )
cmp_ref = aNetItemRef->GetComponentParent()->GetRef(
- &aNetItemRef->m_SheetPath );
+ aNetItemRef->m_SheetPath.Last() );
msg.Printf( _( "Pin %s (%s) of component %s is not driven (Net %d)." ),
GetChars( string_pinnum ),
@@ -353,7 +353,7 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst,
alt_cmp = wxT( "?" );
if( aNetItemTst->m_Type == NET_PIN && aNetItemTst->m_Link )
- alt_cmp = aNetItemTst->GetComponentParent()->GetRef( &aNetItemTst->m_SheetPath );
+ alt_cmp = aNetItemTst->GetComponentParent()->GetRef( aNetItemTst->m_SheetPath.Last() );
msg.Printf( _( "Pin %s (%s) of component %s is connected to " ),
GetChars( string_pinnum ),
@@ -426,9 +426,9 @@ void TestOthersItems( NETLIST_OBJECT_LIST* aList,
continue;
if( ( (SCH_COMPONENT*) aList->GetItem( aNetItemRef )->
- m_Link )->GetRef( &aList->GetItem( aNetItemRef )-> m_SheetPath ) !=
+ m_Link )->GetRef( aList->GetItem( aNetItemRef )->m_SheetPath.Last() ) !=
( (SCH_COMPONENT*) aList->GetItem( duplicate )->m_Link )
- ->GetRef( &aList->GetItem( duplicate )->m_SheetPath ) )
+ ->GetRef( aList->GetItem( duplicate )->m_SheetPath.Last() ) )
continue;
// Same component and same pin. Do dot create error for this pin
diff --git a/eeschema/find.cpp b/eeschema/find.cpp
index d3a29e7c81..f239ad5727 100644
--- a/eeschema/find.cpp
+++ b/eeschema/find.cpp
@@ -85,7 +85,7 @@ void SCH_EDIT_FRAME::OnFindDrcMarker( wxFindDialogEvent& event )
{
sheetFoundIn->LastScreen()->SetZoom( GetScreen()->GetZoom() );
*m_CurrentSheet = *sheetFoundIn;
- m_CurrentSheet->UpdateAllScreenReferences();
+ m_CurrentSheet->Last()->UpdateAllScreenReferences();
}
SetCrossHairPosition( lastMarker->GetPosition() );
@@ -139,7 +139,7 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference,
SCH_COMPONENT* pSch = (SCH_COMPONENT*) item;
- if( aReference.CmpNoCase( pSch->GetRef( sheet ) ) == 0 )
+ if( aReference.CmpNoCase( pSch->GetRef( sheet->Last() ) ) == 0 )
{
Component = pSch;
sheetWithComponentFound = sheet;
@@ -193,7 +193,7 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference,
{
sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() );
*m_CurrentSheet = *sheet;
- m_CurrentSheet->UpdateAllScreenReferences();
+ m_CurrentSheet->Last()->UpdateAllScreenReferences();
centerAndRedraw = true;
}
@@ -489,7 +489,7 @@ void SCH_EDIT_FRAME::updateFindReplaceView( wxFindDialogEvent& aEvent )
{
sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() );
*m_CurrentSheet = *sheet;
- m_CurrentSheet->UpdateAllScreenReferences();
+ m_CurrentSheet->Last()->UpdateAllScreenReferences();
SetScreen( sheet->LastScreen() );
}
diff --git a/eeschema/hierarch.cpp b/eeschema/hierarch.cpp
index 578274b173..adbf2332c7 100644
--- a/eeschema/hierarch.cpp
+++ b/eeschema/hierarch.cpp
@@ -285,7 +285,7 @@ void SCH_EDIT_FRAME::DisplayCurrentSheet()
GetScreen()->SetGrid( m_LastGridSizeId + ID_POPUP_GRID_LEVEL_1000 );
// update the References
- m_CurrentSheet->UpdateAllScreenReferences();
+ m_CurrentSheet->Last()->UpdateAllScreenReferences();
SetSheetNumberAndCount();
m_canvas->SetCanStartBlock( -1 );
diff --git a/eeschema/netlist_exporters/netlist_exporter.cpp b/eeschema/netlist_exporters/netlist_exporter.cpp
index 62e39ccca8..4a7ebf4a32 100644
--- a/eeschema/netlist_exporters/netlist_exporter.cpp
+++ b/eeschema/netlist_exporters/netlist_exporter.cpp
@@ -115,7 +115,8 @@ SCH_COMPONENT* NETLIST_EXPORTER::findNextComponent( EDA_ITEM* aItem, SCH_SHEET_P
// Power symbols and other components which have the reference starting
// with "#" are not included in netlist (pseudo or virtual components)
- ref = comp->GetRef( aSheetPath );
+ ref = comp->GetRef( aSheetPath->Last() );
+
if( ref[0] == wxChar( '#' ) )
continue;
@@ -173,7 +174,7 @@ SCH_COMPONENT* NETLIST_EXPORTER::findNextComponentAndCreatePinList( EDA_ITEM*
// Power symbols and other components which have the reference starting
// with "#" are not included in netlist (pseudo or virtual components)
- ref = comp->GetRef( aSheetPath );
+ ref = comp->GetRef( aSheetPath->Last() );
if( ref[0] == wxChar( '#' ) )
continue;
@@ -206,7 +207,7 @@ SCH_COMPONENT* NETLIST_EXPORTER::findNextComponentAndCreatePinList( EDA_ITEM*
{
LIB_PINS pins; // constructed once here
- part->GetPins( pins, comp->GetUnitSelection( aSheetPath ), comp->GetConvert() );
+ part->GetPins( pins, comp->GetUnitSelection( aSheetPath->Last() ), comp->GetConvert() );
for( size_t i = 0; i < pins.size(); i++ )
{
@@ -322,10 +323,10 @@ void NETLIST_EXPORTER::eraseDuplicatePins()
void NETLIST_EXPORTER::findAllInstancesOfComponent( SCH_COMPONENT* aComponent,
- LIB_PART* aEntry,
- SCH_SHEET_PATH* aSheetPath )
+ LIB_PART* aEntry,
+ SCH_SHEET_PATH* aSheetPath )
{
- wxString ref = aComponent->GetRef( aSheetPath );
+ wxString ref = aComponent->GetRef( aSheetPath->Last() );
wxString ref2;
SCH_SHEET_LIST sheetList;
@@ -339,11 +340,11 @@ void NETLIST_EXPORTER::findAllInstancesOfComponent( SCH_COMPONENT* aComponent,
SCH_COMPONENT* comp2 = (SCH_COMPONENT*) item;
- ref2 = comp2->GetRef( sheet );
+ ref2 = comp2->GetRef( sheet->Last() );
if( ref2.CmpNoCase( ref ) != 0 )
continue;
- int unit2 = comp2->GetUnitSelection( sheet ); // slow
+ int unit2 = comp2->GetUnitSelection( sheet->Last() ); // slow
for( LIB_PIN* pin = aEntry->GetNextPin(); pin; pin = aEntry->GetNextPin( pin ) )
{
diff --git a/eeschema/netlist_exporters/netlist_exporter_cadstar.cpp b/eeschema/netlist_exporters/netlist_exporter_cadstar.cpp
index 2b5b7fbf45..9c94c7d394 100644
--- a/eeschema/netlist_exporters/netlist_exporter_cadstar.cpp
+++ b/eeschema/netlist_exporters/netlist_exporter_cadstar.cpp
@@ -93,7 +93,7 @@ bool NETLIST_EXPORTER_CADSTAR::WriteNetlist( const wxString& aOutFileName, unsig
footprint = wxT( "$noname" );
*/
- msg = component->GetRef( sheet );
+ msg = component->GetRef( sheet->Last() );
ret |= fprintf( f, "%s ", TO_UTF8( StartCmpDesc ) );
ret |= fprintf( f, "%s", TO_UTF8( msg ) );
@@ -159,7 +159,8 @@ bool NETLIST_EXPORTER_CADSTAR::writeListOfNets( FILE* f )
continue;
Cmp = nitem->GetComponentParent();
- wxString refstr = Cmp->GetRef( &nitem->m_SheetPath );
+ wxString refstr = Cmp->GetRef( nitem->m_SheetPath.Last() );
+
if( refstr[0] == '#' )
continue; // Power supply symbols.
diff --git a/eeschema/netlist_exporters/netlist_exporter_generic.cpp b/eeschema/netlist_exporters/netlist_exporter_generic.cpp
index 921e0fc1e4..df55edcef6 100644
--- a/eeschema/netlist_exporters/netlist_exporter_generic.cpp
+++ b/eeschema/netlist_exporters/netlist_exporter_generic.cpp
@@ -131,7 +131,7 @@ XNODE* NETLIST_EXPORTER_GENERIC::makeComponents()
// an element.
xcomps->AddChild( xcomp = node( sComponent ) );
- xcomp->AddAttribute( sRef, comp->GetRef( path ) );
+ xcomp->AddAttribute( sRef, comp->GetRef( path->Last() ) );
xcomp->AddChild( node( sValue, comp->GetField( VALUE )->GetText() ) );
@@ -467,7 +467,8 @@ XNODE* NETLIST_EXPORTER_GENERIC::makeListOfNets()
comp = nitem->GetComponentParent();
// Get the reference for the net name and the main parent component
- ref = comp->GetRef( &nitem->m_SheetPath );
+ ref = comp->GetRef( nitem->m_SheetPath.Last() );
+
if( ref[0] == wxChar( '#' ) )
continue;
@@ -529,7 +530,8 @@ bool NETLIST_EXPORTER_GENERIC::writeListOfNets( FILE* f, NETLIST_OBJECT_LIST& aO
comp = nitem->GetComponentParent();
// Get the reference for the net name and the main parent component
- ref = comp->GetRef( &nitem->m_SheetPath );
+ ref = comp->GetRef( nitem->m_SheetPath.Last() );
+
if( ref[0] == wxChar( '#' ) )
continue; // Pseudo component (Like Power symbol)
diff --git a/eeschema/netlist_exporters/netlist_exporter_orcadpcb2.cpp b/eeschema/netlist_exporters/netlist_exporter_orcadpcb2.cpp
index b0c8f6a286..b5f481b3ba 100644
--- a/eeschema/netlist_exporters/netlist_exporter_orcadpcb2.cpp
+++ b/eeschema/netlist_exporters/netlist_exporter_orcadpcb2.cpp
@@ -99,7 +99,7 @@ bool NETLIST_EXPORTER_ORCADPCB2::WriteNetlist( const wxString& aOutFileName, uns
else
footprint = wxT( "$noname" );
- field = comp->GetRef( path );
+ field = comp->GetRef( path->Last() );
ret |= fprintf( f, " ( %s %s",
TO_UTF8( comp->GetPath( path->Last() ) ),
diff --git a/eeschema/netlist_exporters/netlist_exporter_pspice.cpp b/eeschema/netlist_exporters/netlist_exporter_pspice.cpp
index 7158bd4d5e..90746556b0 100644
--- a/eeschema/netlist_exporters/netlist_exporter_pspice.cpp
+++ b/eeschema/netlist_exporters/netlist_exporter_pspice.cpp
@@ -235,7 +235,7 @@ bool NETLIST_EXPORTER_PSPICE::WriteNetlist( const wxString& aOutFileName, unsign
}
//Get Standard Reference Designator:
- wxString RefName = comp->GetRef( sheet );
+ wxString RefName = comp->GetRef( sheet->Last() );
//Conditionally add Prefix only for devices that begin with U or IC:
if( aUsePrefix )
diff --git a/eeschema/plot_schematic_DXF.cpp b/eeschema/plot_schematic_DXF.cpp
index a571c73baa..887aa36886 100644
--- a/eeschema/plot_schematic_DXF.cpp
+++ b/eeschema/plot_schematic_DXF.cpp
@@ -30,6 +30,7 @@
#include
#include
#include
+#include
#include
#include
@@ -67,7 +68,7 @@ void DIALOG_PLOT_SCHEMATIC::CreateDXFFile( bool aPlotAll, bool aPlotFrameRef )
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
{
schframe->SetCurrentSheet( list );
- schframe->GetCurrentSheet().UpdateAllScreenReferences();
+ schframe->GetCurrentSheet().Last()->UpdateAllScreenReferences();
schframe->SetSheetNumberAndCount();
screen = schframe->GetCurrentSheet().LastScreen();
}
@@ -105,7 +106,7 @@ void DIALOG_PLOT_SCHEMATIC::CreateDXFFile( bool aPlotAll, bool aPlotFrameRef )
msg.Printf( wxT( "DXF Plotter exception: %s"), GetChars( e.errorText ) );
reporter.Report( msg, REPORTER::RPT_ERROR );
schframe->SetCurrentSheet( oldsheetpath );
- schframe->GetCurrentSheet().UpdateAllScreenReferences();
+ schframe->GetCurrentSheet().Last()->UpdateAllScreenReferences();
schframe->SetSheetNumberAndCount();
return;
}
@@ -116,7 +117,7 @@ void DIALOG_PLOT_SCHEMATIC::CreateDXFFile( bool aPlotAll, bool aPlotFrameRef )
}
schframe->SetCurrentSheet( oldsheetpath );
- schframe->GetCurrentSheet().UpdateAllScreenReferences();
+ schframe->GetCurrentSheet().Last()->UpdateAllScreenReferences();
schframe->SetSheetNumberAndCount();
}
@@ -125,7 +126,7 @@ bool DIALOG_PLOT_SCHEMATIC::PlotOneSheetDXF( const wxString& aFileName,
SCH_SCREEN* aScreen,
wxPoint aPlotOffset,
double aScale,
- bool aPlotFrameRef )
+ bool aPlotFrameRef )
{
DXF_PLOTTER* plotter = new DXF_PLOTTER();
diff --git a/eeschema/plot_schematic_HPGL.cpp b/eeschema/plot_schematic_HPGL.cpp
index 9b64ab021f..ca69560e85 100644
--- a/eeschema/plot_schematic_HPGL.cpp
+++ b/eeschema/plot_schematic_HPGL.cpp
@@ -30,6 +30,7 @@
#include
#include
#include
+#include
#include
#include
@@ -140,7 +141,7 @@ void DIALOG_PLOT_SCHEMATIC::createHPGLFile( bool aPlotAll, bool aPlotFrameRef )
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
{
m_parent->SetCurrentSheet( list );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
screen = m_parent->GetCurrentSheet().LastScreen();
@@ -208,7 +209,7 @@ void DIALOG_PLOT_SCHEMATIC::createHPGLFile( bool aPlotAll, bool aPlotFrameRef )
}
m_parent->SetCurrentSheet( oldsheetpath );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
}
diff --git a/eeschema/plot_schematic_PDF.cpp b/eeschema/plot_schematic_PDF.cpp
index 900e1fb625..a72c7d3355 100644
--- a/eeschema/plot_schematic_PDF.cpp
+++ b/eeschema/plot_schematic_PDF.cpp
@@ -28,6 +28,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -77,7 +78,7 @@ void DIALOG_PLOT_SCHEMATIC::createPDFFile( bool aPlotAll, bool aPlotFrameRef )
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
{
m_parent->SetCurrentSheet( list );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
screen = m_parent->GetCurrentSheet().LastScreen();
}
@@ -154,7 +155,7 @@ void DIALOG_PLOT_SCHEMATIC::restoreEnvironment( PDF_PLOTTER* aPlotter,
// Restore the previous sheet
m_parent->SetCurrentSheet( aOldsheetpath );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
}
diff --git a/eeschema/plot_schematic_PS.cpp b/eeschema/plot_schematic_PS.cpp
index 0c42e53b91..fc1dac9d5e 100644
--- a/eeschema/plot_schematic_PS.cpp
+++ b/eeschema/plot_schematic_PS.cpp
@@ -29,6 +29,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -67,7 +68,7 @@ void DIALOG_PLOT_SCHEMATIC::createPSFile( bool aPlotAll, bool aPlotFrameRef )
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
{
m_parent->SetCurrentSheet( list );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
screen = m_parent->GetCurrentSheet().LastScreen();
}
@@ -141,7 +142,7 @@ void DIALOG_PLOT_SCHEMATIC::createPSFile( bool aPlotAll, bool aPlotFrameRef )
}
m_parent->SetCurrentSheet( oldsheetpath );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
}
diff --git a/eeschema/plot_schematic_SVG.cpp b/eeschema/plot_schematic_SVG.cpp
index 0cc81ed854..6213d34e09 100644
--- a/eeschema/plot_schematic_SVG.cpp
+++ b/eeschema/plot_schematic_SVG.cpp
@@ -34,6 +34,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -67,7 +68,7 @@ void DIALOG_PLOT_SCHEMATIC::createSVGFile( bool aPrintAll, bool aPrintFrameRef )
if( list.BuildSheetPathInfoFromSheetPathValue( sheetpath->Path() ) )
{
m_parent->SetCurrentSheet( list );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
screen = m_parent->GetCurrentSheet().LastScreen();
}
@@ -109,14 +110,14 @@ void DIALOG_PLOT_SCHEMATIC::createSVGFile( bool aPrintAll, bool aPrintFrameRef )
reporter.Report( msg, REPORTER::RPT_ERROR );
m_parent->SetCurrentSheet( oldsheetpath );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
return;
}
}
m_parent->SetCurrentSheet( oldsheetpath );
- m_parent->GetCurrentSheet().UpdateAllScreenReferences();
+ m_parent->GetCurrentSheet().Last()->UpdateAllScreenReferences();
m_parent->SetSheetNumberAndCount();
}
else // Print current sheet
diff --git a/eeschema/sch_component.cpp b/eeschema/sch_component.cpp
index 4dec42ad63..b49daa9922 100644
--- a/eeschema/sch_component.cpp
+++ b/eeschema/sch_component.cpp
@@ -119,6 +119,7 @@ SCH_COMPONENT::SCH_COMPONENT( const wxPoint& aPos, SCH_ITEM* aParent ) :
{
Init( aPos );
m_currentSheetPath = NULL;
+ m_fieldsAutoplaced = AUTOPLACED_NO;
}
@@ -133,6 +134,7 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET_PATH* sheet, int unit,
m_part_name = aPart.GetName();
m_part = aPart.SharedPtr();
m_currentSheetPath = NULL;
+ m_fieldsAutoplaced = AUTOPLACED_NO;
SetTimeStamp( GetNewTimeStamp() );
@@ -442,9 +444,9 @@ wxString SCH_COMPONENT::GetPath( const SCH_SHEET* aSheet ) const
}
-const wxString SCH_COMPONENT::GetRef( const SCH_SHEET_PATH* sheet )
+const wxString SCH_COMPONENT::GetRef( const SCH_SHEET* aSheet )
{
- wxString path = GetPath( sheet->Last() );
+ wxString path = GetPath( aSheet );
wxString h_path, h_ref;
wxStringTokenizer tokenizer;
wxString separators( wxT( " " ) );
@@ -471,7 +473,7 @@ const wxString SCH_COMPONENT::GetRef( const SCH_SHEET_PATH* sheet )
// all have the same component references, but perhaps this is best.
if( !GetField( REFERENCE )->GetText().IsEmpty() )
{
- SetRef( sheet->Last(), GetField( REFERENCE )->GetText() );
+ SetRef( aSheet, GetField( REFERENCE )->GetText() );
return GetField( REFERENCE )->GetText();
}
@@ -479,12 +481,6 @@ const wxString SCH_COMPONENT::GetRef( const SCH_SHEET_PATH* sheet )
}
-/* Function IsReferenceStringValid (static function)
- * Tests for an acceptable reference string
- * An acceptable reference string must support unannotation
- * i.e starts by letter
- * returns true if OK
- */
bool SCH_COMPONENT::IsReferenceStringValid( const wxString& aReferenceString )
{
wxString text = aReferenceString;
@@ -582,9 +578,9 @@ void SCH_COMPONENT::SetTimeStamp( time_t aNewTimeStamp )
}
-int SCH_COMPONENT::GetUnitSelection( SCH_SHEET_PATH* aSheet )
+int SCH_COMPONENT::GetUnitSelection( SCH_SHEET* aSheet )
{
- wxString path = GetPath( aSheet->Last() );
+ wxString path = GetPath( aSheet );
wxString h_path, h_multi;
wxStringTokenizer tokenizer;
wxString separators( wxT( " " ) );
@@ -1534,7 +1530,7 @@ void SCH_COMPONENT::GetMsgPanelInfo( MSG_PANEL_ITEMS& aList )
if( m_currentSheetPath )
aList.push_back( MSG_PANEL_ITEM( _( "Reference" ),
- GetRef( m_currentSheetPath ),
+ GetRef( m_currentSheetPath->Last() ),
DARKCYAN ) );
wxString msg = part->IsPower() ? _( "Power symbol" ) : _( "Value" );
@@ -1884,7 +1880,7 @@ void SCH_COMPONENT::GetNetListItem( NETLIST_OBJECT_LIST& aNetListItems,
{
wxASSERT( pin->Type() == LIB_PIN_T );
- if( pin->GetUnit() && ( pin->GetUnit() != GetUnitSelection( aSheetPath ) ) )
+ if( pin->GetUnit() && ( pin->GetUnit() != GetUnitSelection( aSheetPath->Last() ) ) )
continue;
if( pin->GetConvert() && ( pin->GetConvert() != GetConvert() ) )
diff --git a/eeschema/sch_component.h b/eeschema/sch_component.h
index faa9f46535..4c780402ba 100644
--- a/eeschema/sch_component.h
+++ b/eeschema/sch_component.h
@@ -413,7 +413,7 @@ public:
* Function GetRef
* returns the reference, for the given sheet path.
*/
- const wxString GetRef( const SCH_SHEET_PATH* sheet );
+ const wxString GetRef( const SCH_SHEET* sheet );
/**
* Set the reference, for the given sheet path.
@@ -433,7 +433,7 @@ public:
int aMulti );
// returns the unit selection, for the given sheet path.
- int GetUnitSelection( SCH_SHEET_PATH* aSheet );
+ int GetUnitSelection( SCH_SHEET* aSheet );
// Set the unit selection, for the given sheet path.
void SetUnitSelection( SCH_SHEET_PATH* aSheet, int aUnitSelection );
diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp
index 550d91de9c..63f5bbd6e6 100644
--- a/eeschema/sch_field.cpp
+++ b/eeschema/sch_field.cpp
@@ -402,7 +402,7 @@ bool SCH_FIELD::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint
wxCHECK_MSG( component != NULL, false,
wxT( "No component associated with field" ) + text );
- text = component->GetRef( (SCH_SHEET_PATH*) aAuxData );
+ text = component->GetRef( ((SCH_SHEET_PATH*) aAuxData)->Last() );
if( component->GetUnitCount() > 1 )
text << LIB_PART::SubReference( component->GetUnit() );
@@ -440,7 +440,7 @@ bool SCH_FIELD::Replace( wxFindReplaceData& aSearchData, void* aAuxData )
wxCHECK_MSG( component != NULL, false,
wxT( "No component associated with field" ) + text );
- text = component->GetRef( (SCH_SHEET_PATH*) aAuxData );
+ text = component->GetRef( ((SCH_SHEET_PATH*) aAuxData)->Last() );
// if( component->GetUnitCount() > 1 )
// text << LIB_PART::SubReference( component->GetUnit() );
diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp
index 95f9d94010..1a24d4a24e 100644
--- a/eeschema/sch_screen.cpp
+++ b/eeschema/sch_screen.cpp
@@ -1116,7 +1116,7 @@ bool SCH_SCREEN::SetComponentFootprint( SCH_SHEET_PATH* aSheetPath, const wxStri
component = (SCH_COMPONENT*) item;
- if( aReference.CmpNoCase( component->GetRef( aSheetPath ) ) == 0 )
+ if( aReference.CmpNoCase( component->GetRef( aSheetPath->Last() ) ) == 0 )
{
// Found: Init Footprint Field
diff --git a/eeschema/sch_sheet.cpp b/eeschema/sch_sheet.cpp
index e60adf26fe..b593882b82 100644
--- a/eeschema/sch_sheet.cpp
+++ b/eeschema/sch_sheet.cpp
@@ -1332,6 +1332,24 @@ void SCH_SHEET::AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference )
}
+void SCH_SHEET::UpdateAllScreenReferences()
+{
+ EDA_ITEM* t = m_screen->GetDrawItems();
+
+ while( t )
+ {
+ if( t->Type() == SCH_COMPONENT_T )
+ {
+ SCH_COMPONENT* component = (SCH_COMPONENT*) t;
+ component->GetField( REFERENCE )->SetText( component->GetRef( this ) );
+ component->UpdateUnit( component->GetUnitSelection( this ) );
+ }
+
+ t = t->Next();
+ }
+}
+
+
SCH_ITEM& SCH_SHEET::operator=( const SCH_ITEM& aItem )
{
wxLogDebug( wxT( "Sheet assignment operator." ) );
diff --git a/eeschema/sch_sheet.h b/eeschema/sch_sheet.h
index 30114adb31..2787f12f95 100644
--- a/eeschema/sch_sheet.h
+++ b/eeschema/sch_sheet.h
@@ -668,6 +668,17 @@ public:
*/
void AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference );
+ /**
+ * Function UpdateAllScreenReferences
+ * updates the reference and the m_Multi parameter (part selection) for all
+ * components on a screen depending on the actual sheet.
+ * Mandatory in complex hierarchies because sheets use the same screen
+ * (basic schematic)
+ * but with different references and part selections according to the
+ * displayed sheet
+ */
+ void UpdateAllScreenReferences();
+
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const; // override
#endif
diff --git a/eeschema/sch_sheet_path.cpp b/eeschema/sch_sheet_path.cpp
index e829924152..a731ca4b88 100644
--- a/eeschema/sch_sheet_path.cpp
+++ b/eeschema/sch_sheet_path.cpp
@@ -227,24 +227,6 @@ wxString SCH_SHEET_PATH::PathHumanReadable() const
}
-void SCH_SHEET_PATH::UpdateAllScreenReferences()
-{
- EDA_ITEM* t = LastDrawList();
-
- while( t )
- {
- if( t->Type() == SCH_COMPONENT_T )
- {
- SCH_COMPONENT* component = (SCH_COMPONENT*) t;
- component->GetField( REFERENCE )->SetText( component->GetRef( this ) );
- component->UpdateUnit( component->GetUnitSelection( this ) );
- }
-
- t = t->Next();
- }
-}
-
-
void SCH_SHEET_PATH::GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols )
{
// Search to sheet path number:
@@ -266,7 +248,7 @@ void SCH_SHEET_PATH::GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aRefer
// Skip pseudo components, which have a reference starting with #. This mainly
// affects power symbols.
- if( !aIncludePowerSymbols && component->GetRef( this )[0] == wxT( '#' ) )
+ if( !aIncludePowerSymbols && component->GetRef( Last() )[0] == wxT( '#' ) )
continue;
LIB_PART* part = aLibs->FindLibPart( component->GetPartName() );
@@ -301,7 +283,7 @@ void SCH_SHEET_PATH::GetMultiUnitComponents( PART_LIBS* aLibs, SCH_MULTI_UNIT_RE
// Skip pseudo components, which have a reference starting with #. This mainly
// affects power symbols.
- if( !aIncludePowerSymbols && component->GetRef( this )[0] == wxT( '#' ) )
+ if( !aIncludePowerSymbols && component->GetRef( Last() )[0] == wxT( '#' ) )
continue;
LIB_PART* part = aLibs->FindLibPart( component->GetPartName() );
diff --git a/eeschema/sch_sheet_path.h b/eeschema/sch_sheet_path.h
index 0c542086b3..e535b307aa 100644
--- a/eeschema/sch_sheet_path.h
+++ b/eeschema/sch_sheet_path.h
@@ -215,17 +215,6 @@ public:
*/
bool BuildSheetPathInfoFromSheetPathValue( const wxString& aPath, bool aFound = false );
- /**
- * Function UpdateAllScreenReferences
- * updates the reference and the m_Multi parameter (part selection) for all
- * components on a screen depending on the actual sheet path.
- * Mandatory in complex hierarchies because sheets use the same screen
- * (basic schematic)
- * but with different references and part selections according to the
- * displayed sheet
- */
- void UpdateAllScreenReferences();
-
/**
* Function GetComponents
* adds a SCH_REFERENCE() object to \a aReferences for each component in the sheet.
diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp
index 91bad6f34b..864f8d5f61 100644
--- a/eeschema/schedit.cpp
+++ b/eeschema/schedit.cpp
@@ -768,7 +768,7 @@ void SCH_EDIT_FRAME::PrepareMoveItem( SCH_ITEM* aItem, wxDC* aDC )
if( aItem->Type() == SCH_FIELD_T && aItem->GetParent()->Type() == SCH_COMPONENT_T )
{
// Now that we're moving a field, they're no longer autoplaced.
- SCH_COMPONENT *parent = dynamic_cast( aItem->GetParent() );
+ SCH_COMPONENT *parent = static_cast( aItem->GetParent() );
parent->ClearFieldsAutoplaced();
}
@@ -834,7 +834,7 @@ void SCH_EDIT_FRAME::OnRotate( wxCommandEvent& aEvent )
{
case SCH_COMPONENT_T:
{
- SCH_COMPONENT* component = dynamic_cast( item );
+ SCH_COMPONENT* component = static_cast( item );
if( aEvent.GetId() == ID_SCH_ROTATE_CLOCKWISE )
OrientComponent( CMP_ROTATE_CLOCKWISE );
else if( aEvent.GetId() == ID_SCH_ROTATE_COUNTERCLOCKWISE )
@@ -864,7 +864,7 @@ void SCH_EDIT_FRAME::OnRotate( wxCommandEvent& aEvent )
if( item->GetParent()->Type() == SCH_COMPONENT_T )
{
// Now that we're moving a field, they're no longer autoplaced.
- SCH_COMPONENT *parent = dynamic_cast( item->GetParent() );
+ SCH_COMPONENT *parent = static_cast( item->GetParent() );
parent->ClearFieldsAutoplaced();
}
break;
@@ -1148,7 +1148,7 @@ void SCH_EDIT_FRAME::OnOrient( wxCommandEvent& aEvent )
{
case SCH_COMPONENT_T:
{
- SCH_COMPONENT *component = dynamic_cast( item );
+ SCH_COMPONENT *component = static_cast( item );
if( aEvent.GetId() == ID_SCH_MIRROR_X )
OrientComponent( CMP_MIRROR_X );
else if( aEvent.GetId() == ID_SCH_MIRROR_Y )
diff --git a/include/dialog_hotkeys_editor.h b/include/dialog_hotkeys_editor.h
index 55951c2ea9..c0da68277d 100644
--- a/include/dialog_hotkeys_editor.h
+++ b/include/dialog_hotkeys_editor.h
@@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
- * Copyright (C) 2004-2014 KiCad Developers, see CHANGELOG.TXT for contributors.
+ * Copyright (C) 2004-2016 KiCad Developers, see CHANGELOG.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
@@ -38,24 +38,33 @@
#include
#include
#include
-#include
+#include
#include
#include
+#include
+#include
+
#include
#include
#include <../common/dialogs/dialog_hotkeys_editor_base.h>
+typedef std::pair HOTKEYS_SECTION;
+typedef std::vector HOTKEYS_SECTIONS;
+
+typedef std::vector HOTKEY_LIST;
+
class HOTKEYS_EDITOR_DIALOG;
+class DIALOG_HOTKEY_CLIENT_DATA;
/**
* Class HOTKEY_LIST_CTRL
* is a class to contain the contents of a hotkey editor tab page.
*/
-class HOTKEY_LIST_CTRL : public wxListCtrl
+class HOTKEY_LIST_CTRL : public wxTreeListCtrl
{
public:
- HOTKEY_LIST_CTRL( wxWindow* aParent, struct EDA_HOTKEY_CONFIG* aSection );
+ HOTKEY_LIST_CTRL( wxWindow* aParent, const HOTKEYS_SECTIONS& aSections );
~HOTKEY_LIST_CTRL() {};
/**
@@ -67,35 +76,83 @@ public:
void DeselectRow( int aRow );
/**
- * Function GetHotkeys
- * Access to return the vector used for the list control data. This will contain the
- * "live" state of the user's configuration.
- *
- * @return Pointer to vector of hotkey settings
+ * Function TransferDataToControl
+ * Load the hotkey data into the control.
+ * @return true iff the operation was successful
*/
- std::vector< EDA_HOTKEY* >& GetHotkeys() { return m_hotkeys; }
+ bool TransferDataToControl();
/**
- * Function RestoreFrom
- * Restores list control hotkey keycodes to the keycodes present in the
- * given hotkey configuration array.
+ * Function TransferDataFromControl
+ * Save the hotkey data from the control.
+ * @return true iff the operation was successful
+ */
+ bool TransferDataFromControl();
+
+ /**
+ * Function ResolveKeyConflicts
+ * Check if we can set a hotkey, this will prompt the user if there
+ * is a conflict between keys. The key code should have already been
+ * checked that it's not for the same entry as its currently in or else
+ * it'll prompt the change on itself.
+ * The function will do conflict detection depending on aSectionTag.
+ * g_CommonSectionTag means the key code must be checked with all sections.
+ * While other tags means the key code only must be checked with the aSectionTag
+ * section and g_CommonSectionTag section.
+ *
+ * @param aKey is the key code that wants to be set
+ * @param aSectionTag is the section tag that the key code came from
+ *
+ * @return True if the user accepted the overwrite or no conflict existed
+ */
+ bool ResolveKeyConflicts( long aKey, const wxString& aSectionTag );
+
+
+ /**
+ * Function CheckKeyConflicts
+ * Check whether the given key conflicts with anything in this HOTKEY_LIST_CTRL.
+ *
+ * @param aKey - key to check
+ * @param aSectionTag - section tag of the key
+ * @param aConfKey - if not NULL, outparam holding the key this one conflicts with
+ * @param aConfSect - if not NULL, outparam holding the section this one conflicts with
+ */
+ bool CheckKeyConflicts( long aKey, const wxString& aSectionTag,
+ EDA_HOTKEY** aConfKey, EDA_HOTKEY_CONFIG** aConfSect );
+
+ /**
+ * Function UpdateFromClientData
+ * Update all visible items from the data stored in their client data objects.
+ */
+ void UpdateFromClientData();
+
+private:
+ HOTKEYS_SECTIONS m_sections;
+ std::vector< HOTKEY_LIST > m_hotkeys;
+ std::vector< wxTreeListItem > m_items;
+
+ /**
+ * Function GetSelHKClientData
+ * Return the DIALOG_HOTKEY_CLIENT_DATA for the item being edited, or NULL if none is selected.
+ */
+ DIALOG_HOTKEY_CLIENT_DATA* GetSelHKClientData();
+
+ /**
+ * Function GetHKClientData
+ * Return the DIALOG_HOTKEY_CLIENT_DATA for the given item, or NULL if invalid.
+ */
+ DIALOG_HOTKEY_CLIENT_DATA* GetHKClientData( wxTreeListItem aItem );
+
+protected:
+ /**
+ * Function LoadSection
+ * Generates a HOTKEY_LIST from the given hotkey configuration array and
+ * pushes it to m_hotkeys.
*
* @param aSection is a pointer to the hotkey configuration array
*/
- void RestoreFrom( struct EDA_HOTKEY_CONFIG* aSection );
+ void LoadSection( struct EDA_HOTKEY_CONFIG* aSection );
-private:
- int m_curEditingRow;
- wxString* m_sectionTag;
- std::vector< EDA_HOTKEY* > m_hotkeys;
-
- /**
- * Function recalculateColumns
- * Adjusts the width of grid columns in proportion of the max text length of both
- */
- void recalculateColumns();
-
-protected:
/**
* Function OnGetItemText
* Returns the requested row, column data to the list control.
@@ -114,81 +171,8 @@ protected:
* @param aEvent is the key press event, the keycode is retrieved from it
*/
void OnChar( wxKeyEvent& aEvent );
-
- /**
- * Function OnListItemSelected
- * Item selection handler which is used to record what index is selected to alter
- * update with the key press
- *
- * @param aEvent is the button press event, unused
- */
- void OnListItemSelected( wxListEvent& aEvent );
-
- /**
- * Function OnSize
- * Sizing update handler to recompute the column widths dynamically and maximize them.
- * Due to wxWidget's broken autosizing support (it's completely inconsistent across
- * platforms), we just do it based on a scale of
- *
- * @param aEvent is the button press event, unused
- */
- void OnSize( wxSizeEvent& aEvent );
};
-/**
- * Class HOTKEY_SECTION_PAGE
- * is a class to contain the contents of a hotkey editor tab page.
- */
-class HOTKEY_SECTION_PAGE : public wxPanel
-{
-public:
-private:
- EDA_HOTKEY_CONFIG* m_hotkeySection;
- HOTKEY_LIST_CTRL *m_hotkeyList;
- HOTKEYS_EDITOR_DIALOG* m_dialog;
-
-public:
- /** Constructor to create a setup page for one netlist format.
- * Used in Netlist format Dialog box creation
- * @param parent = wxNotebook * parent
- * @param title = title (name) of the notebook page
- * @param id_NetType = netlist type id
- */
- HOTKEY_SECTION_PAGE( HOTKEYS_EDITOR_DIALOG* aDialog, wxNotebook* aParent,
- const wxString& aTitle,
- EDA_HOTKEY_CONFIG* aSection );
- ~HOTKEY_SECTION_PAGE() {};
-
- /**
- * Function Restore
- * Resets the hotkeys back to their original unedited state
- */
- void Restore();
-
- /**
- * Function GetHotkeys
- * Accessor to retrieve hotkeys list from list control
- *
- * @return Pointer to vector used for list control data
- */
- std::vector< EDA_HOTKEY* >& GetHotkeys() { return m_hotkeyList->GetHotkeys(); }
-
- /**
- * Function GetHotkeySection
- * Accessor to retrieve hotkey configuration array assigned to a tab control page
- *
- * @return Pointer to hotkey configuration array
- */
- EDA_HOTKEY_CONFIG* GetHotkeySection() { return m_hotkeySection; }
-
- /**
- * Function GetDialog
- * Returns pointer to parent dialog window
- *
- * @return Pointer to parent dialog window
- */
- HOTKEYS_EDITOR_DIALOG* GetDialog() { return m_dialog; }
-};
/**
* Class HOTKEYS_EDITOR_DIALOG
@@ -201,47 +185,25 @@ protected:
EDA_BASE_FRAME* m_parent;
struct EDA_HOTKEY_CONFIG* m_hotkeys;
- std::vector m_hotkeySectionPages;
+ HOTKEY_LIST_CTRL* m_hotkeyListCtrl;
+
+ bool TransferDataToWindow();
+ bool TransferDataFromWindow();
public:
HOTKEYS_EDITOR_DIALOG( EDA_BASE_FRAME* aParent, EDA_HOTKEY_CONFIG* aHotkeys );
~HOTKEYS_EDITOR_DIALOG() {};
- /**
- * Function CanSetKey
- * Check if we can set a hotkey, this will prompt the user if there
- * is a conflict between keys. The key code should have already been
- * checked that it's not for the same entry as its currently in or else
- * it'll prompt the change on itself.
- * The function will do conflict detection depending on aSectionTag.
- * g_CommonSectionTag means the key code must be checked with all sections.
- * While other tags means the key code only must be checked with the aSectionTag
- * section and g_CommonSectionTag section.
- *
- * @param aKey is the key code that wants to be set
- * @param aSectionTag is the section tag that the key code came from
- *
- * @return True if the user accepted the overwrite or no conflict existed
- */
- bool CanSetKey( long aKey, const wxString* aSectionTag );
-
private:
- /**
- * Function OnOKClicked
- * Close the dialog and make save all changes to hotkeys
- *
- * @param aEvent is the button press event, unused
- */
- void OnOKClicked( wxCommandEvent& aEvent );
/**
- * Function UndoClicked
+ * Function ResetClicked
* Reinit the hotkeys to the initial state (removes all pending changes)
*
* @param aEvent is the button press event, unused
*/
- void UndoClicked( wxCommandEvent& aEvent );
+ void ResetClicked( wxCommandEvent& aEvent );
};
/**
diff --git a/include/kicad_curl/kicad_curl.h b/include/kicad_curl/kicad_curl.h
index ef49f92df3..1b8af488e3 100644
--- a/include/kicad_curl/kicad_curl.h
+++ b/include/kicad_curl/kicad_curl.h
@@ -44,12 +44,27 @@
#include
#include
+// CURL_EXTERN expands to dllimport on MinGW which causes gcc warnings. This really should
+// expand to nothing on MinGW.
+#if defined( __MINGW32__)
+# if defined( CURL_EXTERN )
+# undef CURL_EXTERN
+# define CURL_EXTERN
+# endif
+#endif
+
+
+struct DYN_LOOKUP;
+
+
/**
* Class KICAD_CURL
* simple wrapper class to call curl_global_init and curl_global_cleanup for KiCad.
*/
class KICAD_CURL
{
+ friend class KICAD_CURL_EASY;
+
public:
/**
* Function Init
@@ -57,8 +72,9 @@ public:
* and before any curl functions that perform requests.
*
* @return bool - True if successful, false if CURL returned an error
+ * @throw IO_ERROR on failure, hopefully with helpful text in it.
*/
- static bool Init();
+ static void Init();
/**
* Function Cleanup
@@ -71,9 +87,14 @@ public:
* Function GetVersion
* wrapper for curl_version(). Reports back a short string of loaded libraries.
*
- * @return std::string - String reported by libcurl
+ * @return const char* - String reported by libcurl and owned by it.
+ * @throw IO_ERROR on failure, hopefully with helpful text in it.
*/
- static std::string GetVersion();
+ static const char* GetVersion()
+ {
+ return KICAD_CURL::version();
+ }
+
/**
* Function GetSimpleVersion
@@ -83,7 +104,25 @@ public:
*/
static std::string GetSimpleVersion();
private:
- static bool m_initialized;
+
+ // Alphabetically:
+ // dynamically looked up libcurl function pointers whose prototypes were
+ // taken from the system's libcurl headers.
+
+ static void (CURL_EXTERN * easy_cleanup) ( CURL* curl );
+ static CURL* (CURL_EXTERN * easy_init) ( void );
+ static CURLcode (CURL_EXTERN * easy_perform) ( CURL* curl );
+ static CURLcode (CURL_EXTERN * easy_setopt) ( CURL* curl, CURLoption option, ... );
+ static const char* (CURL_EXTERN * easy_strerror) ( CURLcode );
+ static CURLcode (CURL_EXTERN * global_init) ( long flags );
+ static void (CURL_EXTERN * global_cleanup) ( void );
+ static curl_slist* (CURL_EXTERN * slist_append) ( curl_slist*, const char* );
+ static void (CURL_EXTERN * slist_free_all) ( curl_slist* );
+ static char* (CURL_EXTERN * version) ( void );
+ static curl_version_info_data* (CURL_EXTERN * version_info) (CURLversion);
+
+ /// A tuple of ASCII function names and pointers to pointers to functions
+ static const DYN_LOOKUP dyn_funcs[];
};
-#endif // KICAD_CURL_H_
\ No newline at end of file
+#endif // KICAD_CURL_H_
diff --git a/include/kicad_curl/kicad_curl_easy.h b/include/kicad_curl/kicad_curl_easy.h
index 2273e4893c..18a3564798 100644
--- a/include/kicad_curl/kicad_curl_easy.h
+++ b/include/kicad_curl/kicad_curl_easy.h
@@ -27,7 +27,7 @@
/*
* KICAD_CURL_EASY.h must included before wxWidgets because on Windows,
* wxWidgets ends up including windows.h before winsocks2.h inside curl
- * this causes build warnings
+ * this causes build warnings
* Because we are before wx, we must explicitly define we are building with unicode
* wxWidgets defaults to supporting unicode now, so this should be safe.
*/
@@ -42,19 +42,9 @@
#endif
-#include
#include
-
-/**
- * Struct KICAD_EASY_CURL_BUFFER
- * is a struct used for storing the libcurl received data in its callbacks.
- * Do not use directly, KICAD_CURL_EASY uses it.
- */
-struct KICAD_EASY_CURL_BUFFER
-{
- char* Payload;
- size_t Size;
-};
+#include
+#include
/**
@@ -67,9 +57,10 @@ struct KICAD_EASY_CURL_BUFFER
* Here is a small example usage:
* @code
* KICAD_CURL_EASY curl;
- * curl.SetURL("http://github.com");
- * curl.SetUserAgent("KiCad-EDA");
- * curl.SetHeader("Accept", "application/json");
+ *
+ * curl.SetURL( "http://github.com" );
+ * curl.SetUserAgent( );
+ * curl.SetHeader( "Accept", "application/json" );
* curl.Perform();
* @endcode
*/
@@ -95,7 +86,11 @@ public:
* @param aName is the left hand side of the header, i.e. Accept without the colon
* @param aValue is the right hand side of the header, i.e. application/json
*/
- void SetHeader( const std::string& aName, const std::string& aValue );
+ void SetHeader( const std::string& aName, const std::string& aValue )
+ {
+ std::string header = aName + ':' + aValue;
+ m_headers = KICAD_CURL::slist_append( m_headers, header.c_str() );
+ }
/**
* Function SetUserAgent
@@ -104,7 +99,14 @@ public:
* @param aAgent is the string to set for the user agent
* @return bool - True if successful, false if not
*/
- bool SetUserAgent( const std::string& aAgent );
+ bool SetUserAgent( const std::string& aAgent )
+ {
+ if( SetOption( CURLOPT_USERAGENT, aAgent.c_str() ) == CURLE_OK )
+ {
+ return true;
+ }
+ return false;
+ }
/**
* Function SetURL
@@ -113,7 +115,14 @@ public:
* @param aURL is the URL
* @return bool - True if successful, false if not
*/
- bool SetURL( const std::string& aURL );
+ bool SetURL( const std::string& aURL )
+ {
+ if( SetOption( CURLOPT_URL, aURL.c_str() ) == CURLE_OK )
+ {
+ return true;
+ }
+ return false;
+ }
/**
* Function SetFollowRedirects
@@ -123,16 +132,26 @@ public:
* @param aFollow is a boolean where true will enable following redirects
* @return bool - True if successful, false if not
*/
- bool SetFollowRedirects( bool aFollow );
+ bool SetFollowRedirects( bool aFollow )
+ {
+ if( SetOption( CURLOPT_FOLLOWLOCATION , (aFollow ? 1 : 0) ) == CURLE_OK )
+ {
+ return true;
+ }
+ return false;
+ }
/**
* Function GetErrorText
* fetches CURL's "friendly" error string for a given error code
*
* @param aCode is CURL error code
- * @return std::string - the corresponding error string for the given code
+ * @return const std::string - the corresponding error string for the given code
*/
- std::string GetErrorText( CURLcode aCode );
+ const std::string GetErrorText( CURLcode aCode )
+ {
+ return KICAD_CURL::easy_strerror( aCode );
+ }
/**
* Function SetOption
@@ -143,24 +162,23 @@ public:
* @return CURLcode - CURL error code, will return CURLE_OK unless a problem was encountered
*/
template CURLcode SetOption( CURLoption aOption, T aArg )
- {
- return curl_easy_setopt( m_CURL, aOption, aArg );
+ {
+ return KICAD_CURL::easy_setopt( m_CURL, aOption, aArg );
}
/**
* Function GetBuffer
- * returns a const pointer to the data buffer
- *
- * @return KICAD_EASY_CURL_BUFFER* - pointer to buffer
+ * returns a const reference to the recevied data buffer
*/
- const KICAD_EASY_CURL_BUFFER* GetBuffer()
+ const std::string& GetBuffer()
{
- return &m_Buffer;
+ return m_buffer;
}
+
private:
- CURL *m_CURL;
- struct curl_slist *m_headers;
- struct KICAD_EASY_CURL_BUFFER m_Buffer;
+ CURL* m_CURL;
+ curl_slist* m_headers;
+ std::string m_buffer;
};
-#endif // KICAD_CURL_EASY_H_
\ No newline at end of file
+#endif // KICAD_CURL_EASY_H_
diff --git a/include/kiway.h b/include/kiway.h
index 3ec5af8cad..fd288f0994 100644
--- a/include/kiway.h
+++ b/include/kiway.h
@@ -4,7 +4,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck
- * Copyright (C) 2014 KiCad Developers, see CHANGELOG.TXT for contributors.
+ * Copyright (C) 2016 KiCad Developers, see CHANGELOG.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
@@ -380,12 +380,19 @@ private:
return false;
}
+ /**
+ * @return the reference of the KIWAY_PLAYER having the type aFrameType
+ * if exists, or NULL if this KIWAY_PLAYER was not yet created, or was closed
+ */
+ KIWAY_PLAYER* GetPlayerFrame( FRAME_T aFrameType );
+
static KIFACE* m_kiface[KIWAY_FACE_COUNT];
static int m_kiface_version[KIWAY_FACE_COUNT];
PGM_BASE* m_program;
int m_ctl;
- wxFrame* m_top;
+ wxFrame* m_top; // Usually m_top is the Project manager
+
KIWAY_PLAYER* m_player[KIWAY_PLAYER_COUNT]; // from frame_type.h
diff --git a/include/layers_id_colors_and_visibility.h b/include/layers_id_colors_and_visibility.h
index b424aea8d7..db72495293 100644
--- a/include/layers_id_colors_and_visibility.h
+++ b/include/layers_id_colors_and_visibility.h
@@ -54,9 +54,6 @@ typedef int LAYER_NUM;
* One of these cannot be "incremented".
*/
enum LAYER_ID
-#if __cplusplus >= 201103L
- : unsigned char
-#endif
{
F_Cu, // 0
In1_Cu,
@@ -116,13 +113,13 @@ enum LAYER_ID
B_Fab,
F_Fab,
- LAYER_ID_COUNT
+ LAYER_ID_COUNT,
+
+ UNDEFINED_LAYER = -1,
+ UNSELECTED_LAYER = -2,
};
-#define UNDEFINED_LAYER LAYER_ID(-1)
-#define UNSELECTED_LAYER LAYER_ID(-2)
-
#define MAX_CU_LAYERS (B_Cu - F_Cu + 1)
/// A sequence of layers, a sequence provides a certain order.
diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h
index 82751702d8..24f893ed7b 100644
--- a/include/wxPcbStruct.h
+++ b/include/wxPcbStruct.h
@@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2010 Jean-Pierre Charras, jp.charras@wanadoo.fr
- * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 1992-2016 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
@@ -1587,12 +1587,17 @@ public:
* Function SpreadFootprints
* Footprints (after loaded by reading a netlist for instance) are moved
* to be in a small free area (outside the current board) without overlapping.
- * @param aFootprintsOutsideBoardOnly: true to move only
- * footprints outside the board outlines
- * (they are outside if the position of a footprint is outside
- * the board outlines bounding box
+ * @param aFootprints: a list of footprints to be spread out.
+ * @param aMoveFootprintsOutsideBoardOnly: true to move only
+ * footprints outside the board outlines
+ * (they are outside if the position of a footprint is outside
+ * the board outlines bounding box).
+ * @param aCheckForBoardEdges: true to try to place footprints outside of
+ * board edges.
*/
- void SpreadFootprints( bool aFootprintsOutsideBoardOnly );
+ void SpreadFootprints( std::vector* aFootprints,
+ bool aMoveFootprintsOutsideBoardOnly,
+ bool aCheckForBoardEdges );
/**
* Function AutoPlaceModule
diff --git a/pcb_calculator/UnitSelector.cpp b/pcb_calculator/UnitSelector.cpp
index ddf26aeb20..06b3768628 100644
--- a/pcb_calculator/UnitSelector.cpp
+++ b/pcb_calculator/UnitSelector.cpp
@@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2011-2014 Jean-Pierre Charras
- * Copyright (C) 2004-2014 KiCad Developers, see change_log.txt for contributors.
+ * Copyright (C) 2004-2016 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
@@ -46,7 +46,7 @@ UNIT_SELECTOR_LEN::UNIT_SELECTOR_LEN( wxWindow *parent, wxWindowID id,
/*
* Function GetUnitScale
* return the scaling factor to convert users units
- * to normalized units (meter )
+ * to normalized units (meter)
*/
double UNIT_SELECTOR_LEN::GetUnitScale()
{
@@ -62,6 +62,40 @@ double UNIT_SELECTOR_LEN::GetUnitScale()
}
+UNIT_SELECTOR_THICKNESS::UNIT_SELECTOR_THICKNESS( wxWindow *parent, wxWindowID id,
+ const wxPoint& pos, const wxSize& size,
+ const wxArrayString& choices, long style )
+ : UNIT_SELECTOR( parent, id, pos, size, choices, style )
+{
+ Append( _( "mm" ) );
+ Append( _( "um" ) );
+ Append( _( "cm" ) );
+ Append( _( "mil" ) );
+ Append( _( "inch" ) );
+ Append( _( "oz/ft^2" ) );
+};
+
+
+/*
+ * Function GetUnitScale
+ * return the scaling factor to convert users units
+ * to normalized units (meter) including copper oz/ft^2
+ */
+double UNIT_SELECTOR_THICKNESS::GetUnitScale()
+{
+ switch( GetCurrentSelection() )
+ {
+ case 0: return UNIT_MM; break;
+ case 1: return UNIT_MICRON; break;
+ case 2: return UNIT_CM; break;
+ case 3: return UNIT_MIL; break;
+ case 4: return UNIT_INCH; break;
+ case 5: return UNIT_OZSQFT; break;
+ }
+ return 1.0;
+}
+
+
UNIT_SELECTOR_FREQUENCY::UNIT_SELECTOR_FREQUENCY( wxWindow *parent, wxWindowID id,
const wxPoint& pos, const wxSize& size,
const wxArrayString& choices, long style ):
diff --git a/pcb_calculator/UnitSelector.h b/pcb_calculator/UnitSelector.h
index e8ea45d2a9..d5adea0602 100644
--- a/pcb_calculator/UnitSelector.h
+++ b/pcb_calculator/UnitSelector.h
@@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2011-2014 Jean-Pierre Charras
- * Copyright (C) 2004-2014 KiCad Developers, see change_log.txt for contributors.
+ * Copyright (C) 2004-2016 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
@@ -73,6 +73,21 @@ public:
virtual double GetUnitScale();
};
+class UNIT_SELECTOR_THICKNESS: public UNIT_SELECTOR
+{
+public:
+ UNIT_SELECTOR_THICKNESS( wxWindow *parent, wxWindowID id,
+ const wxPoint& pos, const wxSize& size,
+ const wxArrayString& choices, long style = 0 );
+
+ /**
+ * Function GetUnitScale
+ * @return the scaling factor to convert users units
+ * to normalized units (meter) including oz/ft^2
+ */
+ virtual double GetUnitScale();
+};
+
class UNIT_SELECTOR_FREQUENCY: public UNIT_SELECTOR
{
public:
diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp b/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp
index 5ba848f949..5682d2da30 100644
--- a/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp
+++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 17 2015)
+// C++ code generated with wxFormBuilder (version Jan 1 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@@ -91,7 +91,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerRegParams->Add( m_labelRegultR1, 0, wxALL, 5 );
m_RegulR1Value = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_RegulR1Value->SetMaxLength( 0 );
fgSizerRegParams->Add( m_RegulR1Value, 0, wxALL|wxEXPAND, 5 );
m_UnitRegultR11 = new wxStaticText( m_panelRegulators, wxID_ANY, _("KOhm"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -106,7 +105,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerRegParams->Add( m_labelRegultR2, 0, wxALL, 5 );
m_RegulR2Value = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_RegulR2Value->SetMaxLength( 0 );
fgSizerRegParams->Add( m_RegulR2Value, 0, wxALL|wxEXPAND, 5 );
m_UnitRegultR1 = new wxStaticText( m_panelRegulators, wxID_ANY, _("KOhm"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -121,7 +119,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerRegParams->Add( m_labelVout, 0, wxALL, 5 );
m_RegulVoutValue = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_RegulVoutValue->SetMaxLength( 0 );
fgSizerRegParams->Add( m_RegulVoutValue, 0, wxALL|wxEXPAND, 5 );
m_unitsVout = new wxStaticText( m_panelRegulators, wxID_ANY, _("V"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -138,7 +135,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerRegParams->Add( m_labelVRef, 0, wxALL, 5 );
m_RegulVrefValue = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_RegulVrefValue->SetMaxLength( 0 );
fgSizerRegParams->Add( m_RegulVrefValue, 0, wxALL|wxEXPAND, 5 );
m_unitsVref = new wxStaticText( m_panelRegulators, wxID_ANY, _("V"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -155,7 +151,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerRegParams->Add( m_RegulIadjTitle, 0, wxALL, 5 );
m_RegulIadjValue = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_RegulIadjValue->SetMaxLength( 0 );
fgSizerRegParams->Add( m_RegulIadjValue, 0, wxALL|wxEXPAND, 5 );
m_IadjUnitLabel = new wxStaticText( m_panelRegulators, wxID_ANY, _("uA"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -204,7 +199,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
bSizerDataFile = new wxBoxSizer( wxHORIZONTAL );
m_regulators_fileNameCtrl = new wxTextCtrl( sbSizerRegulatorsChooser->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_regulators_fileNameCtrl->SetMaxLength( 0 );
bSizerDataFile->Add( m_regulators_fileNameCtrl, 1, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_buttonDataFile = new wxButton( sbSizerRegulatorsChooser->GetStaticBox(), wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -267,10 +261,11 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
m_staticTextCurrent = new wxStaticText( sbSizerTW_Prms->GetStaticBox(), wxID_ANY, _("Current"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextCurrent->Wrap( -1 );
- fgSizerTWprms->Add( m_staticTextCurrent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+ m_staticTextCurrent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );
+
+ fgSizerTWprms->Add( m_staticTextCurrent, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxALIGN_RIGHT, 5 );
m_TrackCurrentValue = new wxTextCtrl( sbSizerTW_Prms->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_TrackCurrentValue->SetMaxLength( 0 );
fgSizerTWprms->Add( m_TrackCurrentValue, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
m_staticText62 = new wxStaticText( sbSizerTW_Prms->GetStaticBox(), wxID_ANY, _("A"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -282,7 +277,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerTWprms->Add( m_staticText63, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_TrackDeltaTValue = new wxTextCtrl( sbSizerTW_Prms->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_TrackDeltaTValue->SetMaxLength( 0 );
fgSizerTWprms->Add( m_TrackDeltaTValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 );
m_staticText64 = new wxStaticText( sbSizerTW_Prms->GetStaticBox(), wxID_ANY, _("deg C"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -294,7 +288,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerTWprms->Add( m_staticText66, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 );
m_TrackLengthValue = new wxTextCtrl( sbSizerTW_Prms->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_TrackLengthValue->SetMaxLength( 0 );
fgSizerTWprms->Add( m_TrackLengthValue, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
wxArrayString m_TW_CuLength_choiceUnitChoices;
@@ -335,17 +328,18 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
sbSizerTW_Result = new wxStaticBoxSizer( new wxStaticBox( m_panelTrackWidth, wxID_ANY, _("External layer traces") ), wxVERTICAL );
wxFlexGridSizer* fgSizerTW_Results;
- fgSizerTW_Results = new wxFlexGridSizer( 6, 3, 0, 0 );
+ fgSizerTW_Results = new wxFlexGridSizer( 0, 3, 0, 0 );
fgSizerTW_Results->AddGrowableCol( 1 );
fgSizerTW_Results->SetFlexibleDirection( wxBOTH );
fgSizerTW_Results->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_staticTextExtWidth = new wxStaticText( sbSizerTW_Result->GetStaticBox(), wxID_ANY, _("Trace width"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextExtWidth->Wrap( -1 );
+ m_staticTextExtWidth->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );
+
fgSizerTW_Results->Add( m_staticTextExtWidth, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxLEFT|wxRIGHT, 5 );
m_ExtTrackWidthValue = new wxTextCtrl( sbSizerTW_Result->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_ExtTrackWidthValue->SetMaxLength( 0 );
fgSizerTW_Results->Add( m_ExtTrackWidthValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 );
wxArrayString m_TW_ExtTrackWidth_choiceUnitChoices;
@@ -358,13 +352,21 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerTW_Results->Add( m_staticText65, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 );
m_ExtTrackThicknessValue = new wxTextCtrl( sbSizerTW_Result->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_ExtTrackThicknessValue->SetMaxLength( 0 );
- fgSizerTW_Results->Add( m_ExtTrackThicknessValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 );
+ fgSizerTW_Results->Add( m_ExtTrackThicknessValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
wxArrayString m_ExtTrackThicknessUnitChoices;
- m_ExtTrackThicknessUnit = new UNIT_SELECTOR_LEN( sbSizerTW_Result->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_ExtTrackThicknessUnitChoices, 0 );
+ m_ExtTrackThicknessUnit = new UNIT_SELECTOR_THICKNESS( sbSizerTW_Result->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_ExtTrackThicknessUnitChoices, 0 );
m_ExtTrackThicknessUnit->SetSelection( 0 );
- fgSizerTW_Results->Add( m_ExtTrackThicknessUnit, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 );
+ fgSizerTW_Results->Add( m_ExtTrackThicknessUnit, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ m_staticline3 = new wxStaticLine( sbSizerTW_Result->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ fgSizerTW_Results->Add( m_staticline3, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
+
+ m_staticline4 = new wxStaticLine( sbSizerTW_Result->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ fgSizerTW_Results->Add( m_staticline4, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
+
+ m_staticline5 = new wxStaticLine( sbSizerTW_Result->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ fgSizerTW_Results->Add( m_staticline5, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 );
m_staticTextArea = new wxStaticText( sbSizerTW_Result->GetStaticBox(), wxID_ANY, _("Cross-section area"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextArea->Wrap( -1 );
@@ -431,10 +433,11 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
m_staticTextIntWidth = new wxStaticText( sbSizerTW_Result1->GetStaticBox(), wxID_ANY, _("Trace width"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextIntWidth->Wrap( -1 );
+ m_staticTextIntWidth->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );
+
fgSizerTW_Results1->Add( m_staticTextIntWidth, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
m_IntTrackWidthValue = new wxTextCtrl( sbSizerTW_Result1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_IntTrackWidthValue->SetMaxLength( 0 );
fgSizerTW_Results1->Add( m_IntTrackWidthValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 );
wxArrayString m_TW_IntTrackWidth_choiceUnitChoices;
@@ -447,11 +450,10 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerTW_Results1->Add( m_staticText652, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
m_IntTrackThicknessValue = new wxTextCtrl( sbSizerTW_Result1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_IntTrackThicknessValue->SetMaxLength( 0 );
fgSizerTW_Results1->Add( m_IntTrackThicknessValue, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
wxArrayString m_IntTrackThicknessUnitChoices;
- m_IntTrackThicknessUnit = new UNIT_SELECTOR_LEN( sbSizerTW_Result1->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_IntTrackThicknessUnitChoices, 0 );
+ m_IntTrackThicknessUnit = new UNIT_SELECTOR_THICKNESS( sbSizerTW_Result1->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_IntTrackThicknessUnitChoices, 0 );
m_IntTrackThicknessUnit->SetSelection( 0 );
fgSizerTW_Results1->Add( m_IntTrackThicknessUnit, 0, wxALL, 5 );
@@ -537,7 +539,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
bLeftSizerElectricalClearance->Add( m_staticText891, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_ElectricalSpacingVoltage = new wxTextCtrl( m_panelElectricalSpacing, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_ElectricalSpacingVoltage->SetMaxLength( 0 );
bLeftSizerElectricalClearance->Add( m_ElectricalSpacingVoltage, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_buttonElectSpacingRefresh = new wxButton( m_panelElectricalSpacing, wxID_ANY, _("Update Values"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -650,7 +651,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerSubstPrms->Add( m_EpsilonR_label, 0, wxRIGHT|wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
m_Value_EpsilonR = new wxTextCtrl( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Value_EpsilonR->SetMaxLength( 0 );
fgSizerSubstPrms->Add( m_Value_EpsilonR, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
m_button_EpsilonR = new wxButton( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, _("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
@@ -661,7 +661,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerSubstPrms->Add( m_TanD_label, 0, wxRIGHT|wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
m_Value_TanD = new wxTextCtrl( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Value_TanD->SetMaxLength( 0 );
fgSizerSubstPrms->Add( m_Value_TanD, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_button_TanD = new wxButton( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, _("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
@@ -674,7 +673,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerSubstPrms->Add( m_Rho_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Value_Rho = new wxTextCtrl( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Value_Rho->SetMaxLength( 0 );
fgSizerSubstPrms->Add( m_Value_Rho, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_button_Rho = new wxButton( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, _("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
@@ -685,7 +683,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerSubstPrms->Add( m_substrate_prm4_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Substrate_prm4_Value = new wxTextCtrl( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Substrate_prm4_Value->SetMaxLength( 0 );
fgSizerSubstPrms->Add( m_Substrate_prm4_Value, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxArrayString m_SubsPrm4_choiceUnitChoices;
@@ -698,7 +695,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerSubstPrms->Add( m_substrate_prm5_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Substrate_prm5_Value = new wxTextCtrl( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Substrate_prm5_Value->SetMaxLength( 0 );
fgSizerSubstPrms->Add( m_Substrate_prm5_Value, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxArrayString m_SubsPrm5_choiceUnitChoices;
@@ -711,7 +707,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerSubstPrms->Add( m_substrate_prm6_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Substrate_prm6_Value = new wxTextCtrl( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Substrate_prm6_Value->SetMaxLength( 0 );
fgSizerSubstPrms->Add( m_Substrate_prm6_Value, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxArrayString m_SubsPrm6_choiceUnitChoices;
@@ -724,7 +719,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerSubstPrms->Add( m_substrate_prm7_label, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 );
m_Substrate_prm7_Value = new wxTextCtrl( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Substrate_prm7_Value->SetMaxLength( 0 );
fgSizerSubstPrms->Add( m_Substrate_prm7_Value, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxArrayString m_SubsPrm7_choiceUnitChoices;
@@ -737,7 +731,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerSubstPrms->Add( m_substrate_prm8_label, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 );
m_Substrate_prm8_Value = new wxTextCtrl( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Substrate_prm8_Value->SetMaxLength( 0 );
fgSizerSubstPrms->Add( m_Substrate_prm8_Value, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
wxArrayString m_SubsPrm8_choiceUnitChoices;
@@ -750,7 +743,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerSubstPrms->Add( m_substrate_prm9_label, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Substrate_prm9_Value = new wxTextCtrl( sbSubstrateBoxSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Substrate_prm9_Value->SetMaxLength( 0 );
fgSizerSubstPrms->Add( m_Substrate_prm9_Value, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
wxArrayString m_SubsPrm9_choiceUnitChoices;
@@ -778,7 +770,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizeCmpPrms->Add( m_Frequency_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Value_Frequency_Ctrl = new wxTextCtrl( sbCmpPrmsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Value_Frequency_Ctrl->SetMaxLength( 0 );
fgSizeCmpPrms->Add( m_Value_Frequency_Ctrl, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxArrayString m_choiceUnit_FrequencyChoices;
@@ -824,7 +815,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerPhysPrms->Add( m_phys_prm1_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Phys_prm1_Value = new wxTextCtrl( btranslineRightSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Phys_prm1_Value->SetMaxLength( 0 );
fgSizerPhysPrms->Add( m_Phys_prm1_Value, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxArrayString m_choiceUnit_Param1Choices;
@@ -840,7 +830,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerPhysPrms->Add( m_phys_prm2_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Phys_prm2_Value = new wxTextCtrl( btranslineRightSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Phys_prm2_Value->SetMaxLength( 0 );
fgSizerPhysPrms->Add( m_Phys_prm2_Value, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxArrayString m_choiceUnit_Param2Choices;
@@ -856,7 +845,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerPhysPrms->Add( m_phys_prm3_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Phys_prm3_Value = new wxTextCtrl( btranslineRightSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Phys_prm3_Value->SetMaxLength( 0 );
fgSizerPhysPrms->Add( m_Phys_prm3_Value, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxArrayString m_choiceUnit_Param3Choices;
@@ -914,7 +902,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerResults->Add( m_elec_prm1_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Elec_prm1_Value = new wxTextCtrl( sbElectricalResultsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Elec_prm1_Value->SetMaxLength( 0 );
fgSizerResults->Add( m_Elec_prm1_Value, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxArrayString m_choiceUnit_ElecPrm1Choices;
@@ -927,7 +914,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerResults->Add( m_elec_prm2_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Elec_prm2_Value = new wxTextCtrl( sbElectricalResultsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Elec_prm2_Value->SetMaxLength( 0 );
fgSizerResults->Add( m_Elec_prm2_Value, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
wxArrayString m_choiceUnit_ElecPrm2Choices;
@@ -940,7 +926,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerResults->Add( m_elec_prm3_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
m_Elec_prm3_Value = new wxTextCtrl( sbElectricalResultsSizer->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Elec_prm3_Value->SetMaxLength( 0 );
fgSizerResults->Add( m_Elec_prm3_Value, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
wxArrayString m_choiceUnit_ElecPrm3Choices;
@@ -1069,7 +1054,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerAttPrms->Add( m_attenuationLabel, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_AttValueCtrl = new wxTextCtrl( sbSizerAttPrms->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_AttValueCtrl->SetMaxLength( 0 );
fgSizerAttPrms->Add( m_AttValueCtrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_attUnit = new wxStaticText( sbSizerAttPrms->GetStaticBox(), wxID_ANY, _("dB"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -1081,7 +1065,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerAttPrms->Add( m_attenuationZinLabel, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_ZinValueCtrl = new wxTextCtrl( sbSizerAttPrms->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_ZinValueCtrl->SetMaxLength( 0 );
fgSizerAttPrms->Add( m_ZinValueCtrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_attZinUnit = new wxStaticText( sbSizerAttPrms->GetStaticBox(), wxID_ANY, _("Ohms"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -1093,7 +1076,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerAttPrms->Add( m_ZoutLabel, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_ZoutValueCtrl = new wxTextCtrl( sbSizerAttPrms->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_ZoutValueCtrl->SetMaxLength( 0 );
fgSizerAttPrms->Add( m_ZoutValueCtrl, 0, wxALL, 5 );
m_attZoutUnit = new wxStaticText( sbSizerAttPrms->GetStaticBox(), wxID_ANY, _("Ohms"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -1132,7 +1114,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerAttResults->Add( m_attenuatorR1Label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_Att_R1_Value = new wxTextCtrl( sbSizerAttValues->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Att_R1_Value->SetMaxLength( 0 );
fgSizerAttResults->Add( m_Att_R1_Value, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_attR1Unit = new wxStaticText( sbSizerAttValues->GetStaticBox(), wxID_ANY, _("Ohms"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -1144,7 +1125,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerAttResults->Add( m_attenuatorR2Label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_Att_R2_Value = new wxTextCtrl( sbSizerAttValues->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Att_R2_Value->SetMaxLength( 0 );
fgSizerAttResults->Add( m_Att_R2_Value, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
m_attR2Unit1 = new wxStaticText( sbSizerAttValues->GetStaticBox(), wxID_ANY, _("Ohms"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -1156,7 +1136,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow
fgSizerAttResults->Add( m_attenuatorR3Label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_Att_R3_Value = new wxTextCtrl( sbSizerAttValues->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_Att_R3_Value->SetMaxLength( 0 );
fgSizerAttResults->Add( m_Att_R3_Value, 0, wxALL, 5 );
m_attR3Unit = new wxStaticText( sbSizerAttValues->GetStaticBox(), wxID_ANY, _("Ohms"), wxDefaultPosition, wxDefaultSize, 0 );
diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp b/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp
index 3cf27fd505..12ba002568 100644
--- a/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp
+++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp
@@ -562,6 +562,7 @@
sbSizerRegFormula
wxVERTICAL
+ 1
none
@@ -2536,6 +2537,7 @@
sbSizerRegulatorsChooser
wxVERTICAL
+ 1
none
@@ -3366,6 +3368,7 @@
sbSizerTW_Prms
wxVERTICAL
+ 1
none
@@ -3386,7 +3389,7 @@
0
5
- wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
+ wxALIGN_CENTER_VERTICAL|wxALL|wxALIGN_RIGHT
0
1
@@ -3412,7 +3415,7 @@
1
1
-
+ ,90,90,-1,70,0
0
0
wxID_ANY
@@ -4278,7 +4281,7 @@
0
-
+ 0
0
@@ -4526,6 +4529,7 @@
sbSizerTW_Result
wxVERTICAL
+ 1
none
@@ -4542,7 +4546,7 @@
fgSizerTW_Results
wxFLEX_GROWMODE_SPECIFIED
none
- 6
+ 0
0
5
@@ -4572,7 +4576,7 @@
1
1
-
+ ,90,90,-1,70,0
0
0
wxID_ANY
@@ -4891,7 +4895,7 @@
5
- wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT|wxTOP
+ wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT
0
1
@@ -4982,7 +4986,7 @@
5
- wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT|wxRIGHT|wxTOP
+ wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT
0
1
@@ -5032,7 +5036,7 @@
1
- UNIT_SELECTOR_LEN; UnitSelector.h
+ UNIT_SELECTOR_THICKNESS; UnitSelector.h
0
@@ -5068,6 +5072,249 @@
+
+ 5
+ wxEXPAND|wxTOP|wxBOTTOM
+ 0
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 0
+ 1
+
+ 1
+ 0
+ Dock
+ 0
+ Left
+ 1
+
+ 1
+
+ 0
+ 0
+ wxID_ANY
+
+ 0
+
+
+ 0
+
+ 1
+ m_staticline3
+ 1
+
+
+ protected
+ 1
+
+ Resizable
+ 1
+
+ wxLI_HORIZONTAL
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+ wxEXPAND|wxTOP|wxBOTTOM
+ 0
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 0
+ 1
+
+ 1
+ 0
+ Dock
+ 0
+ Left
+ 1
+
+ 1
+
+ 0
+ 0
+ wxID_ANY
+
+ 0
+
+
+ 0
+
+ 1
+ m_staticline4
+ 1
+
+
+ protected
+ 1
+
+ Resizable
+ 1
+
+ wxLI_HORIZONTAL
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+ wxEXPAND|wxTOP|wxBOTTOM
+ 0
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 0
+ 1
+
+ 1
+ 0
+ Dock
+ 0
+ Left
+ 1
+
+ 1
+
+ 0
+ 0
+ wxID_ANY
+
+ 0
+
+
+ 0
+
+ 1
+ m_staticline5
+ 1
+
+
+ protected
+ 1
+
+ Resizable
+ 1
+
+ wxLI_HORIZONTAL
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
5
wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL
@@ -6078,6 +6325,7 @@
sbSizerTW_Result1
wxVERTICAL
+ 1
none
@@ -6124,7 +6372,7 @@
1
1
-
+ ,90,90,-1,70,0
0
0
wxID_ANY
@@ -6584,7 +6832,7 @@
1
- UNIT_SELECTOR_LEN; UnitSelector.h
+ UNIT_SELECTOR_THICKNESS; UnitSelector.h
0
@@ -8837,6 +9085,7 @@
sbSubstrateBoxSizer
wxVERTICAL
+ 1
none
@@ -11227,6 +11476,7 @@
sbCmpPrmsSizer
wxVERTICAL
+ 1
none
@@ -11624,6 +11874,7 @@
btranslineRightSizer
wxVERTICAL
+ 1
none
@@ -12999,6 +13250,7 @@
sbElectricalResultsSizer
wxVERTICAL
+ 1
none
@@ -13817,6 +14069,7 @@
sbMessagesSizer
wxVERTICAL
+ 1
none
@@ -15090,6 +15343,7 @@
sbSizerAtt
wxHORIZONTAL
+ 1
none
@@ -15292,6 +15546,7 @@
sbSizerAttPrms
wxVERTICAL
+ 1
none
@@ -16275,6 +16530,7 @@
sbSizerAttValues
wxVERTICAL
+ 1
none
@@ -17247,6 +17503,7 @@
sbRightSizerFormula
wxVERTICAL
+ 1
none
diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.h b/pcb_calculator/dialogs/pcb_calculator_frame_base.h
index ff718f42aa..24dd80c26a 100644
--- a/pcb_calculator/dialogs/pcb_calculator_frame_base.h
+++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.h
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 17 2015)
+// C++ code generated with wxFormBuilder (version Jan 1 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@@ -16,6 +16,7 @@ class UNIT_SELECTOR_ANGLE;
class UNIT_SELECTOR_FREQUENCY;
class UNIT_SELECTOR_LEN;
class UNIT_SELECTOR_RESISTOR;
+class UNIT_SELECTOR_THICKNESS;
#include "kiway_player.h"
#include
@@ -110,7 +111,10 @@ class PCB_CALCULATOR_FRAME_BASE : public KIWAY_PLAYER
UNIT_SELECTOR_LEN* m_TW_ExtTrackWidth_choiceUnit;
wxStaticText* m_staticText65;
wxTextCtrl* m_ExtTrackThicknessValue;
- UNIT_SELECTOR_LEN* m_ExtTrackThicknessUnit;
+ UNIT_SELECTOR_THICKNESS* m_ExtTrackThicknessUnit;
+ wxStaticLine* m_staticline3;
+ wxStaticLine* m_staticline4;
+ wxStaticLine* m_staticline5;
wxStaticText* m_staticTextArea;
wxStaticText* m_ExtTrackAreaValue;
wxStaticText* m_ExtTrackAreaUnitLabel;
@@ -128,7 +132,7 @@ class PCB_CALCULATOR_FRAME_BASE : public KIWAY_PLAYER
UNIT_SELECTOR_LEN* m_TW_IntTrackWidth_choiceUnit;
wxStaticText* m_staticText652;
wxTextCtrl* m_IntTrackThicknessValue;
- UNIT_SELECTOR_LEN* m_IntTrackThicknessUnit;
+ UNIT_SELECTOR_THICKNESS* m_IntTrackThicknessUnit;
wxStaticText* m_staticTextArea1;
wxStaticText* m_IntTrackAreaValue;
wxStaticText* m_IntTrackAreaUnitLabel;
diff --git a/pcb_calculator/tracks_width_versus_current.cpp b/pcb_calculator/tracks_width_versus_current.cpp
index f7569042a9..ef5aa2a6a4 100644
--- a/pcb_calculator/tracks_width_versus_current.cpp
+++ b/pcb_calculator/tracks_width_versus_current.cpp
@@ -115,16 +115,14 @@ void PCB_CALCULATOR_FRAME::OnTWCalculateFromCurrent( wxCommandEvent& event )
double extThickness = std::abs( DoubleFromString( m_ExtTrackThicknessValue->GetValue() ) );
double intThickness = std::abs( DoubleFromString( m_IntTrackThicknessValue->GetValue() ) );
double deltaT_C = std::abs( DoubleFromString( m_TrackDeltaTValue->GetValue() ) );
- double extTrackWidth;
- double intTrackWidth;
- // Normalize units.
+ // Normalize by units.
extThickness *= m_ExtTrackThicknessUnit->GetUnitScale();
intThickness *= m_IntTrackThicknessUnit->GetUnitScale();
// Calculate the widths.
- extTrackWidth = TWCalculateWidth( current, extThickness, deltaT_C, false );
- intTrackWidth = TWCalculateWidth( current, intThickness, deltaT_C, true );
+ double extTrackWidth = TWCalculateWidth( current, extThickness, deltaT_C, false );
+ double intTrackWidth = TWCalculateWidth( current, intThickness, deltaT_C, true );
// Update the display.
TWDisplayValues( current, extTrackWidth, intTrackWidth, extThickness, intThickness );
@@ -355,6 +353,11 @@ void PCB_CALCULATOR_FRAME::TWUpdateModeDisplay()
m_staticTextIntWidth->SetFont( labelfont );
m_IntTrackWidthValue->SetFont( controlfont );
+
+ // Text sizes have changed when the font weight was changes
+ // So, run the page layout to reflect the changes
+ wxWindow* page = m_Notebook->GetPage ( 1 );
+ page->GetSizer()->Layout();
}
/* calculate track width for external or internal layers
diff --git a/pcb_calculator/units_scales.h b/pcb_calculator/units_scales.h
index f694a83b3d..3d996a7210 100644
--- a/pcb_calculator/units_scales.h
+++ b/pcb_calculator/units_scales.h
@@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2011-2014 Jean-Pierre Charras
- * Copyright (C) 2004-2014 KiCad Developers, see change_log.txt for contributors.
+ * Copyright (C) 2004-2016 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
@@ -37,6 +37,7 @@
#define UNIT_MICRON 1e-6 // um to meter
#define UNIT_INCH (1e-2*2.54) // inch to meter
#define UNIT_MIL (1e-5*2.54) // mil (or thou) to meter
+#define UNIT_OZSQFT (34.40*UNIT_MICRON) // 1 oz/ft^2 is 34.30 microns nominal, 30.90 minimum
#define UNIT_GHZ 1e9
#define UNIT_MHZ 1e6
diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt
index b5bc9101f5..6f20b735b6 100644
--- a/pcbnew/CMakeLists.txt
+++ b/pcbnew/CMakeLists.txt
@@ -426,11 +426,11 @@ if( KICAD_SCRIPTING_MODULES )
pcad2kicadpcb
lib_dxf
idf3
- ${GITHUB_PLUGIN_LIBRARIES}
polygon
bitmaps
gal
${wxWidgets_LIBRARIES}
+ ${GITHUB_PLUGIN_LIBRARIES}
${GDI_PLUS_LIBRARIES}
${PYTHON_LIBRARIES}
${PCBNEW_EXTRA_LIBS}
@@ -594,8 +594,8 @@ target_link_libraries( pcbnew_kiface
gal
lib_dxf
idf3
- ${GITHUB_PLUGIN_LIBRARIES}
${wxWidgets_LIBRARIES}
+ ${GITHUB_PLUGIN_LIBRARIES}
${GDI_PLUS_LIBRARIES}
${PYTHON_LIBRARIES}
${Boost_LIBRARIES} # must follow GITHUB
diff --git a/pcbnew/autorouter/move_and_route_event_functions.cpp b/pcbnew/autorouter/move_and_route_event_functions.cpp
index 5e9f31935c..c09aa5fca6 100644
--- a/pcbnew/autorouter/move_and_route_event_functions.cpp
+++ b/pcbnew/autorouter/move_and_route_event_functions.cpp
@@ -5,7 +5,7 @@
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck
* Copyright (C) 2011 Wayne Stambaugh
*
- * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 1992-2016 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
@@ -139,8 +139,15 @@ void PCB_EDIT_FRAME::OnPlaceOrRouteFootprints( wxCommandEvent& event )
DisplayError( this, _( "No footprint found!" ) );
return;
}
+ else
+ {
+ MODULE* footprint = GetBoard()->m_Modules;
+ std::vector footprintList;
+ for( ; footprint != NULL; footprint = footprint->Next() )
+ footprintList.push_back( footprint );
- SpreadFootprints( id == ID_POPUP_PCB_SPREAD_NEW_MODULES );
+ SpreadFootprints( &footprintList, id == ID_POPUP_PCB_SPREAD_NEW_MODULES, true );
+ }
break;
case ID_POPUP_PCB_AUTOROUTE_ALL_MODULES:
diff --git a/pcbnew/autorouter/spread_footprints.cpp b/pcbnew/autorouter/spread_footprints.cpp
index 52b7106110..15519f36fb 100644
--- a/pcbnew/autorouter/spread_footprints.cpp
+++ b/pcbnew/autorouter/spread_footprints.cpp
@@ -5,7 +5,7 @@
* Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck
* Copyright (C) 2013 Wayne Stambaugh
*
- * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 1992-2016 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
@@ -35,6 +35,7 @@
*/
#include
+#include
#include
#include
@@ -95,8 +96,8 @@ void fillRectList( CSubRectArray& vecSubRects, std::vector & aRectList
// Spread a list of rectangles inside a placement area
void spreadRectangles( CRectPlacement& aPlacementArea,
- CSubRectArray& vecSubRects,
- int areaSizeX, int areaSizeY )
+ CSubRectArray& vecSubRects,
+ int areaSizeX, int areaSizeY )
{
areaSizeX/= scale;
areaSizeY/= scale;
@@ -135,8 +136,9 @@ void spreadRectangles( CRectPlacement& aPlacementArea,
void moveFootprintsInArea( CRectPlacement& aPlacementArea,
- std::vector & aModuleList, EDA_RECT& aFreeArea,
- bool aFindAreaOnly )
+ std::vector & aModuleList,
+ EDA_RECT& aFreeArea,
+ bool aFindAreaOnly )
{
CSubRectArray vecSubRects;
@@ -163,83 +165,82 @@ void moveFootprintsInArea( CRectPlacement& aPlacementArea,
}
}
-static bool sortModulesbySheetPath( MODULE* ref, MODULE* compare );
+static bool sortFootprintsbySheetPath( MODULE* ref, MODULE* compare );
/* Function to move components in a rectangular area format 4 / 3,
* starting from the mouse cursor
* The components with the FIXED status set are not moved
*/
-void PCB_EDIT_FRAME::SpreadFootprints( bool aFootprintsOutsideBoardOnly )
+void PCB_EDIT_FRAME::SpreadFootprints( std::vector* aFootprints,
+ bool aMoveFootprintsOutsideBoardOnly,
+ bool aCheckForBoardEdges )
{
EDA_RECT bbox = GetBoard()->ComputeBoundingBox( true );
bool edgesExist = ( bbox.GetWidth() || bbox.GetHeight() );
+ // if aFootprintsOutsideBoardOnly is true, and if board outline exists,
+ // wue have to filter footprints to move:
+ bool outsideBrdFilter = aMoveFootprintsOutsideBoardOnly && edgesExist;
// no edges exist
- if( aFootprintsOutsideBoardOnly && !edgesExist )
+ if( aMoveFootprintsOutsideBoardOnly && !edgesExist )
{
DisplayError( this,
_( "Could not automatically place footprints. No board outlines detected." ) );
return;
}
- // if aFootprintsOutsideBoardOnly is true, and if board outline exists,
- // wue have to filter footprints to move:
- bool outsideBrdFilter = aFootprintsOutsideBoardOnly && edgesExist;
// Build candidate list
// calculate also the area needed by these footprints
- MODULE* module = GetBoard()->m_Modules;
- std::vector moduleList;
+ std::vector footprintList;
- for( ; module != NULL; module = module->Next() )
+ BOOST_FOREACH( MODULE* footprint, *aFootprints )
{
- module->CalculateBoundingBox();
+ footprint->CalculateBoundingBox();
if( outsideBrdFilter )
{
- if( bbox.Contains( module->GetPosition() ) )
+ if( bbox.Contains( footprint->GetPosition() ) )
continue;
}
- if( module->IsLocked() )
+ if( footprint->IsLocked() )
continue;
- moduleList.push_back(module);
+ footprintList.push_back( footprint );
}
- if( moduleList.size() == 0 ) // Nothing to do
+ if( footprintList.empty() )
return;
// sort footprints by sheet path. we group them later by sheet
- sort( moduleList.begin(), moduleList.end(), sortModulesbySheetPath );
+ sort( footprintList.begin(), footprintList.end(), sortFootprintsbySheetPath );
// Undo command: init undo list
PICKED_ITEMS_LIST undoList;
undoList.m_Status = UR_CHANGED;
ITEM_PICKER picker( NULL, UR_CHANGED );
- for( unsigned ii = 0; ii < moduleList.size(); ii++ )
+ BOOST_FOREACH( MODULE* footprint, footprintList )
{
- module = moduleList[ii];
-
- // Undo: add copy of module to undo list
- picker.SetItem( module );
- picker.SetLink( module->Clone() );
+ // Undo: add copy of the footprint to undo list
+ picker.SetItem( footprint );
+ picker.SetLink( footprint->Clone() );
undoList.PushItem( picker );
}
// Extract and place footprints by sheet
- std::vector moduleListBySheet;
+ std::vector footprintListBySheet;
std::vector placementSheetAreas;
double subsurface;
double placementsurface = 0.0;
wxPoint placementAreaPosition = GetCrossHairPosition();
- // We do not want to move footprints inside an existing board.
+ // We sometimes do not want to move footprints inside an existing board.
// move the placement area position outside the board bounding box
// to the left of the board
- if( edgesExist )
+ if( edgesExist && aCheckForBoardEdges )
{
if( placementAreaPosition.x < bbox.GetEnd().x &&
placementAreaPosition.y < bbox.GetEnd().y )
@@ -253,24 +254,25 @@ void PCB_EDIT_FRAME::SpreadFootprints( bool aFootprintsOutsideBoardOnly )
// the first pass creates the rectangular areas to place footprints
// each sheet in schematic creates one rectangular area.
// the second pass moves footprints inside these areas
+ MODULE* footprint;
for( int pass = 0; pass < 2; pass++ )
{
int subareaIdx = 0;
- moduleListBySheet.clear();
+ footprintListBySheet.clear();
subsurface = 0.0;
- for( unsigned ii = 0; ii < moduleList.size(); ii++ )
+ for( unsigned ii = 0; ii < footprintList.size(); ii++ )
{
- module = moduleList[ii];
+ footprint = footprintList[ii];
bool islastItem = false;
- if( ii == moduleList.size() - 1 ||
- ( moduleList[ii]->GetPath().BeforeLast( '/' ) !=
- moduleList[ii+1]->GetPath().BeforeLast( '/' ) ) )
+ if( ii == footprintList.size() - 1 ||
+ ( footprintList[ii]->GetPath().BeforeLast( '/' ) !=
+ footprintList[ii+1]->GetPath().BeforeLast( '/' ) ) )
islastItem = true;
- moduleListBySheet.push_back( module );
- subsurface += module->GetArea();
+ footprintListBySheet.push_back( footprint );
+ subsurface += footprint->GetArea();
if( islastItem )
{
@@ -292,7 +294,7 @@ void PCB_EDIT_FRAME::SpreadFootprints( bool aFootprintsOutsideBoardOnly )
}
bool findAreaOnly = pass == 0;
- moveFootprintsInArea( placementArea, moduleListBySheet,
+ moveFootprintsInArea( placementArea, footprintListBySheet,
freeArea, findAreaOnly );
if( pass == 0 )
@@ -312,7 +314,7 @@ void PCB_EDIT_FRAME::SpreadFootprints( bool aFootprintsOutsideBoardOnly )
// Prepare buffers for next sheet
subsurface = 0.0;
- moduleListBySheet.clear();
+ footprintListBySheet.clear();
subareaIdx++;
}
}
@@ -353,7 +355,7 @@ void PCB_EDIT_FRAME::SpreadFootprints( bool aFootprintsOutsideBoardOnly )
// Footprints are sorted by their sheet path.
// (the full sheet path restricted to the time stamp of the sheet itself,
// without the time stamp of the footprint ).
-static bool sortModulesbySheetPath( MODULE* ref, MODULE* compare )
+static bool sortFootprintsbySheetPath( MODULE* ref, MODULE* compare )
{
if( ref->GetPath().Length() == compare->GetPath().Length() )
return ref->GetPath().BeforeLast( '/' ).Cmp( compare->GetPath().BeforeLast( '/' ) ) < 0;
diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp
index a9090500ea..bfca85d1a8 100644
--- a/pcbnew/class_board.cpp
+++ b/pcbnew/class_board.cpp
@@ -10,7 +10,7 @@
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck
* Copyright (C) 2011 Wayne Stambaugh
*
- * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 1992-2016 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
@@ -2259,13 +2259,14 @@ bool BOARD::NormalizeAreaPolygon( PICKED_ITEMS_LIST * aNewZonesList, ZONE_CONTAI
void BOARD::ReplaceNetlist( NETLIST& aNetlist, bool aDeleteSinglePadNets,
- REPORTER* aReporter )
+ std::vector* aNewFootprints, REPORTER* aReporter )
{
unsigned i;
wxPoint bestPosition;
wxString msg;
D_PAD* pad;
MODULE* footprint;
+ std::vector newFootprints;
if( !IsEmpty() )
{
@@ -2340,6 +2341,7 @@ void BOARD::ReplaceNetlist( NETLIST& aNetlist, bool aDeleteSinglePadNets,
footprint->SetParent( this );
footprint->SetPosition( bestPosition );
footprint->SetTimeStamp( GetNewTimeStamp() );
+ newFootprints.push_back( footprint );
Add( footprint, ADD_APPEND );
}
}
@@ -2666,6 +2668,8 @@ void BOARD::ReplaceNetlist( NETLIST& aNetlist, bool aDeleteSinglePadNets,
}
}
}
+
+ std::swap( newFootprints, *aNewFootprints );
}
diff --git a/pcbnew/class_board.h b/pcbnew/class_board.h
index 8836e151f9..bd9a78dab4 100644
--- a/pcbnew/class_board.h
+++ b/pcbnew/class_board.h
@@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2007 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
- * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 1992-2016 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
@@ -962,7 +962,7 @@ public:
* the #BOARD. If NULL, no change reporting occurs.
*/
void ReplaceNetlist( NETLIST& aNetlist, bool aDeleteSinglePadNets,
- REPORTER* aReporter = NULL );
+ std::vector* aNewFootprints, REPORTER* aReporter = NULL );
/**
* Function SortedNetnamesList
@@ -1216,10 +1216,10 @@ public:
* of the via.
*
* @param aPosition The wxPoint to HitTest() against.
- * @param aLayer The layer to search. Use -1 for a don't care.
+ * @param aLayer The layer to search. Use -1 (LAYER_ID::UNDEFINED_LAYER) for a don't care.
* @return VIA* A point a to the VIA object if found, else NULL.
*/
- VIA* GetViaByPosition( const wxPoint& aPosition, LAYER_ID aLayer = UNDEFINED_LAYER ) const;
+ VIA* GetViaByPosition( const wxPoint& aPosition, LAYER_ID aLayer = LAYER_ID( -1 ) ) const;
/**
* Function GetPad
diff --git a/pcbnew/drc_clearance_test_functions.cpp b/pcbnew/drc_clearance_test_functions.cpp
index 39d1b9d039..1f339f4d46 100644
--- a/pcbnew/drc_clearance_test_functions.cpp
+++ b/pcbnew/drc_clearance_test_functions.cpp
@@ -584,8 +584,6 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
{
int dist;
- double pad_angle;
-
// Get the clearance between the 2 pads. this is the min distance between aRefPad and aPad
int dist_min = aRefPad->GetClearance( aPad );
@@ -662,80 +660,6 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
diag = checkClearanceSegmToPad( aPad, aRefPad->GetSize().x, dist_min );
break;
- case PAD_SHAPE_RECT:
- // pad_angle = pad orient relative to the aRefPad orient
- pad_angle = aRefPad->GetOrientation() + aPad->GetOrientation();
- NORMALIZE_ANGLE_POS( pad_angle );
-
- if( aPad->GetShape() == PAD_SHAPE_RECT )
- {
- wxSize size = aPad->GetSize();
-
- // The trivial case is if both rects are rotated by multiple of 90 deg
- // Most of time this is the case, and the test is fast
- if( ( (aRefPad->GetOrientation() == 0) || (aRefPad->GetOrientation() == 900)
- || (aRefPad->GetOrientation() == 1800) || (aRefPad->GetOrientation() == 2700) )
- && ( (aPad->GetOrientation() == 0) || (aPad->GetOrientation() == 900) || (aPad->GetOrientation() == 1800)
- || (aPad->GetOrientation() == 2700) ) )
- {
- if( (pad_angle == 900) || (pad_angle == 2700) )
- {
- std::swap( size.x, size.y );
- }
-
- // Test DRC:
- diag = false;
- RotatePoint( &relativePadPos, aRefPad->GetOrientation() );
- relativePadPos.x = std::abs( relativePadPos.x );
- relativePadPos.y = std::abs( relativePadPos.y );
-
- if( ( relativePadPos.x - ( (size.x + aRefPad->GetSize().x) / 2 ) ) >= dist_min )
- diag = true;
-
- if( ( relativePadPos.y - ( (size.y + aRefPad->GetSize().y) / 2 ) ) >= dist_min )
- diag = true;
- }
- else // at least one pad has any other orient. Test is more tricky
- { // Use the trapezoid2trapezoidDRC which also compare 2 rectangles with any orientation
- wxPoint polyref[4]; // Shape of aRefPad
- wxPoint polycompare[4]; // Shape of aPad
- aRefPad->BuildPadPolygon( polyref, wxSize( 0, 0 ), aRefPad->GetOrientation() );
- aPad->BuildPadPolygon( polycompare, wxSize( 0, 0 ), aPad->GetOrientation() );
-
- // Move aPad shape to relativePadPos
- for( int ii = 0; ii < 4; ii++ )
- polycompare[ii] += relativePadPos;
-
- // And now test polygons:
- if( !trapezoid2trapezoidDRC( polyref, polycompare, dist_min ) )
- diag = false;
- }
- }
- else if( aPad->GetShape() == PAD_SHAPE_TRAPEZOID )
- {
- wxPoint polyref[4]; // Shape of aRefPad
- wxPoint polycompare[4]; // Shape of aPad
- aRefPad->BuildPadPolygon( polyref, wxSize( 0, 0 ), aRefPad->GetOrientation() );
- aPad->BuildPadPolygon( polycompare, wxSize( 0, 0 ), aPad->GetOrientation() );
-
- // Move aPad shape to relativePadPos
- for( int ii = 0; ii < 4; ii++ )
- polycompare[ii] += relativePadPos;
-
- // And now test polygons:
- if( !trapezoid2trapezoidDRC( polyref, polycompare, dist_min ) )
- diag = false;
- }
- else
- {
- // Should not occur, because aPad and aRefPad are swapped
- // to have only aPad shape RECT or TRAP and aRefPad shape TRAP or RECT.
- wxLogDebug( wxT( "DRC::checkClearancePadToPad: unexpected pad ref RECT @ %d, %d to pad shape %d @ %d, %d"),
- aRefPad->GetPosition().x, aRefPad->GetPosition().y,
- aPad->GetShape(), aPad->GetPosition().x, aPad->GetPosition().y );
- }
- break;
-
case PAD_SHAPE_OVAL: /* an oval pad is like a track segment */
{
/* Create a track segment with same dimensions as the oval aRefPad
@@ -779,10 +703,7 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
}
case PAD_SHAPE_TRAPEZOID:
-
- // at this point, aPad is also a trapezoid, because all other shapes
- // have priority, and are already tested
- wxASSERT( aPad->GetShape() == PAD_SHAPE_TRAPEZOID );
+ case PAD_SHAPE_RECT:
{
wxPoint polyref[4]; // Shape of aRefPad
wxPoint polycompare[4]; // Shape of aPad
diff --git a/pcbnew/github/github_getliblist.cpp b/pcbnew/github/github_getliblist.cpp
index 90d015bb54..0603477e34 100644
--- a/pcbnew/github/github_getliblist.cpp
+++ b/pcbnew/github/github_getliblist.cpp
@@ -41,7 +41,7 @@
* JP Charras.
*/
-#include /* Include before any wx file */
+#include // Include before any wx file
#include
#include
@@ -62,6 +62,7 @@ bool GITHUB_GETLIBLIST::Get3DshapesLibsList( wxArrayString* aList,
bool (*aFilter)( const wxString& aData ) )
{
std::string fullURLCommand;
+
strcpy( m_option_string, "text/html" );
wxString repoURL = m_repoURL;
@@ -95,6 +96,7 @@ bool GITHUB_GETLIBLIST::GetFootprintLibraryList( wxArrayString& aList )
std::string fullURLCommand;
int page = 1;
int itemCountMax = 99; // Do not use a valu > 100, it does not work
+
strcpy( m_option_string, "application/json" );
// Github max items returned is 100 per page
@@ -212,16 +214,15 @@ bool GITHUB_GETLIBLIST::remoteGetJSON( const std::string& aFullURLCommand, wxStr
wxLogDebug( wxT( "Attempting to download: " ) + aFullURLCommand );
- kcurl.SetURL(aFullURLCommand);
- kcurl.SetUserAgent("KiCad-EDA");
- kcurl.SetHeader("Accept", m_option_string);
- kcurl.SetFollowRedirects(true);
+ kcurl.SetURL( aFullURLCommand );
+ kcurl.SetUserAgent( "http://kicad-pcb.org" );
+ kcurl.SetHeader( "Accept", m_option_string );
+ kcurl.SetFollowRedirects( true );
try
{
kcurl.Perform();
- m_image.reserve( kcurl.GetBuffer()->Size );
- m_image.assign( kcurl.GetBuffer()->Payload, kcurl.GetBuffer()->Size );
+ m_image = kcurl.GetBuffer();
return true;
}
catch( const IO_ERROR& ioe )
@@ -229,8 +230,8 @@ bool GITHUB_GETLIBLIST::remoteGetJSON( const std::string& aFullURLCommand, wxStr
if( aMsgError )
{
UTF8 fmt( _( "Error fetching JSON data from URL '%s'.\nReason: '%s'" ) );
-
- std::string msg = StrPrintf( fmt.c_str(),
+
+ std::string msg = StrPrintf( fmt.c_str(),
aFullURLCommand.c_str(),
TO_UTF8( ioe.errorText ) );
@@ -238,4 +239,4 @@ bool GITHUB_GETLIBLIST::remoteGetJSON( const std::string& aFullURLCommand, wxStr
}
return false;
}
-}
\ No newline at end of file
+}
diff --git a/pcbnew/github/github_plugin.cpp b/pcbnew/github/github_plugin.cpp
index cc5e4ee41f..be92681121 100644
--- a/pcbnew/github/github_plugin.cpp
+++ b/pcbnew/github/github_plugin.cpp
@@ -61,10 +61,9 @@ Access-Control-Expose-Headers: ETag, Link, X-RateLimit-Limit, X-RateLimit-Remain
Access-Control-Allow-Origin: *
X-GitHub-Request-Id: 411087C2:659E:50FD6E6:52E67F66
Vary: Accept-Encoding
-
*/
-#include /* Include before any wx file */
+#include // Include before any wx file
#include
#include
#include
@@ -122,7 +121,7 @@ GITHUB_PLUGIN::~GITHUB_PLUGIN()
const wxString GITHUB_PLUGIN::PluginName() const
{
- return wxT( "Github" );
+ return "Github";
}
@@ -391,7 +390,7 @@ void GITHUB_PLUGIN::cacheLib( const wxString& aLibraryPath, const PROPERTIES* aP
if( !wx_pretty_fn.IsOk() ||
!wx_pretty_fn.IsDirWritable() ||
- wx_pretty_fn.GetExt() != wxT( "pretty" )
+ wx_pretty_fn.GetExt() != "pretty"
)
{
wxString msg = wxString::Format(
@@ -408,7 +407,7 @@ void GITHUB_PLUGIN::cacheLib( const wxString& aLibraryPath, const PROPERTIES* aP
}
// operator==( wxString, wxChar* ) does not exist, construct wxString once here.
- const wxString kicad_mod( wxT( "kicad_mod" ) );
+ const wxString kicad_mod( "kicad_mod" );
//D(printf("%s: this:%p m_lib_path:'%s' aLibraryPath:'%s'\n", __func__, this, TO_UTF8( m_lib_path), TO_UTF8(aLibraryPath) );)
m_gh_cache = new GH_CACHE();
@@ -443,7 +442,7 @@ void GITHUB_PLUGIN::cacheLib( const wxString& aLibraryPath, const PROPERTIES* aP
}
-bool GITHUB_PLUGIN::repoURL_zipURL( const wxString& aRepoURL, std::string& aZipURL )
+bool GITHUB_PLUGIN::repoURL_zipURL( const wxString& aRepoURL, std::string* aZipURL )
{
// e.g. "https://github.com/liftoff-sr/pretty_footprints"
//D(printf("aRepoURL:%s\n", TO_UTF8( aRepoURL ) );)
@@ -509,7 +508,7 @@ bool GITHUB_PLUGIN::repoURL_zipURL( const wxString& aRepoURL, std::string& aZipU
// this code path with the needs of one particular inflexible server.
}
- aZipURL = zip_url.utf8_str();
+ *aZipURL = zip_url.utf8_str();
return true;
}
return false;
@@ -520,7 +519,7 @@ void GITHUB_PLUGIN::remoteGetZip( const wxString& aRepoURL ) throw( IO_ERROR )
{
std::string zip_url;
- if( !repoURL_zipURL( aRepoURL, zip_url ) )
+ if( !repoURL_zipURL( aRepoURL, &zip_url ) )
{
wxString msg = wxString::Format( _( "Unable to parse URL:\n'%s'" ), GetChars( aRepoURL ) );
THROW_IO_ERROR( msg );
@@ -528,27 +527,30 @@ void GITHUB_PLUGIN::remoteGetZip( const wxString& aRepoURL ) throw( IO_ERROR )
wxLogDebug( wxT( "Attempting to download: " ) + zip_url );
- KICAD_CURL_EASY kcurl;
+ KICAD_CURL_EASY kcurl; // this can THROW_IO_ERROR
- kcurl.SetURL(zip_url.c_str());
- kcurl.SetUserAgent("KiCad-EDA");
- kcurl.SetHeader("Accept", "application/zip");
- kcurl.SetFollowRedirects(true);
+ kcurl.SetURL( zip_url.c_str() );
+ kcurl.SetUserAgent( "http://kicad-pcb.org" );
+ kcurl.SetHeader( "Accept", "application/zip" );
+ kcurl.SetFollowRedirects( true );
try
{
kcurl.Perform();
- m_zip_image.reserve( kcurl.GetBuffer()->Size );
- m_zip_image.assign( kcurl.GetBuffer()->Payload, kcurl.GetBuffer()->Size );
+ m_zip_image = kcurl.GetBuffer();
}
catch( const IO_ERROR& ioe )
{
+ // https "GET" has faild, report this to API caller.
+ static const char errorcmd[] = "http GET command failed"; // Do not translate this message
+
UTF8 fmt( _( "%s\nCannot get/download Zip archive: '%s'\nfor library path: '%s'.\nReason: '%s'" ) );
std::string msg = StrPrintf( fmt.c_str(),
zip_url.c_str(),
TO_UTF8( aRepoURL ),
- TO_UTF8( ioe.errorText ) );
+ TO_UTF8( ioe.errorText )
+ );
THROW_IO_ERROR( msg );
}
@@ -575,7 +577,7 @@ int main( int argc, char** argv )
try
{
wxArrayString fps = gh.FootprintEnumerate(
- wxT( "https://github.com/liftoff-sr/pretty_footprints" ),
+ "https://github.com/liftoff-sr/pretty_footprints",
NULL
);
diff --git a/pcbnew/github/github_plugin.h b/pcbnew/github/github_plugin.h
index 8588fc955f..3dc10a69af 100644
--- a/pcbnew/github/github_plugin.h
+++ b/pcbnew/github/github_plugin.h
@@ -210,7 +210,7 @@ protected:
* @param aZipURL is where to put the zip file URL.
* @return bool - true if @a aRepoULR was parseable, else false
*/
- static bool repoURL_zipURL( const wxString& aRepoURL, std::string& aZipURL );
+ static bool repoURL_zipURL( const wxString& aRepoURL, std::string* aZipURL );
/**
* Function remoteGetZip
diff --git a/pcbnew/netlist.cpp b/pcbnew/netlist.cpp
index 9a9eba773a..bbd31bf750 100644
--- a/pcbnew/netlist.cpp
+++ b/pcbnew/netlist.cpp
@@ -7,7 +7,7 @@
* Copyright (C) 1992-2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck
* Copyright (C) 2013 Wayne Stambaugh
- * Copyright (C) 1992-2013 KiCad Developers, see change_log.txt for contributors.
+ * Copyright (C) 1992-2016 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
@@ -66,6 +66,7 @@ void PCB_EDIT_FRAME::ReadPcbNetlist( const wxString& aNetlistFileName,
NETLIST netlist;
KIGFX::VIEW* view = GetGalCanvas()->GetView();
BOARD* board = GetBoard();
+ std::vector newFootprints;
netlist.SetIsDryRun( aIsDryRun );
netlist.SetFindByTimeStamp( aSelectByTimeStamp );
@@ -113,12 +114,24 @@ void PCB_EDIT_FRAME::ReadPcbNetlist( const wxString& aNetlistFileName,
m_toolManager->RunAction( COMMON_ACTIONS::selectionClear, true );
netlist.SortByReference();
- board->ReplaceNetlist( netlist, aDeleteSinglePadNets, aReporter );
+ board->ReplaceNetlist( netlist, aDeleteSinglePadNets, &newFootprints, aReporter );
+
// If it was a dry run, nothing has changed so we're done.
if( netlist.IsDryRun() )
return;
+ if( IsGalCanvasActive() )
+ {
+ SpreadFootprints( &newFootprints, false, false );
+
+ BOOST_FOREACH( MODULE* footprint, newFootprints )
+ {
+ m_toolManager->RunAction( COMMON_ACTIONS::selectItem, true, footprint );
+ }
+ m_toolManager->InvokeTool( "pcbnew.InteractiveEdit" );
+ }
+
OnModify();
SetCurItem( NULL );
diff --git a/pcbnew/router/pns_node.cpp b/pcbnew/router/pns_node.cpp
index b276b799a3..3f9bf12c87 100644
--- a/pcbnew/router/pns_node.cpp
+++ b/pcbnew/router/pns_node.cpp
@@ -885,6 +885,9 @@ int PNS_NODE::FindLinesBetweenJoints( PNS_JOINT& aA, PNS_JOINT& aB, std::vector<
PNS_SEGMENT* seg = static_cast( item );
PNS_LINE line = AssembleLine( seg );
+ if ( !line.Layers().Overlaps( aB.Layers() ) )
+ continue;
+
PNS_JOINT j_start, j_end;
FindLineEnds( line, j_start, j_end );
diff --git a/pcbnew/scripting/python_console_frame.h b/pcbnew/scripting/python_console_frame.h
deleted file mode 100644
index 042e6b07c2..0000000000
--- a/pcbnew/scripting/python_console_frame.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * 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) 2004-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 python_console_frame.h
- */
-
-#ifndef PYTHON_CONSOLE_FRAME_H_
-#define PYTHON_CONSOLE_FRAME_H_
-
-#if defined(KICAD_SCRIPTING) || defined(KICAD_SCRIPTING_WXPYTHON)
-#include
-#endif
-
-
-/**
- * Class PYTHON_CONSOLE_FRAME is a simple derived class from wxMiniFrame
- * to handle the scripting python console
- */
-#define PC_STYLE wxCAPTION|wxCLOSE_BOX|wxRESIZE_BORDER
-
-class PYTHON_CONSOLE_FRAME : public wxMiniFrame
-{
-private:
- static wxSize m_frameSize; ///< The size of the frame, stored during a session
- static wxPoint m_framePos; ///< The position of the frame, stored during a session
- wxWindow * m_pythonPanel; ///< the window managed by the python shell
-
-public:
-
- PYTHON_CONSOLE_FRAME( wxWindow* aParent, const wxString& aFramenameId )
- : wxMiniFrame( aParent, wxID_ANY, wxT("Python console"), wxDefaultPosition, wxDefaultSize,
- PC_STYLE | wxFRAME_FLOAT_ON_PARENT, aFramenameId )
- {
- wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL );
- SetSizer( sizer );
- SetMinSize( wxSize( 500, 200 ) );
-
-#if defined(KICAD_SCRIPTING_WXPYTHON)
- m_pythonPanel = CreatePythonShellWindow( this );
- sizer->Add( m_pythonPanel, 1, wxEXPAND, 0 );
-#else
- m_pythonPanel = NULL;
-#endif
-
- if( m_frameSize.x <= 0 || m_frameSize.y <= 0 )
- SetSize( wxSize( 600, 300 ) );
- else
- SetSize( m_frameSize );
-
- if( m_framePos.x == 0 && m_framePos.y == 0 )
- Centre();
- else
- SetPosition( m_framePos );
-
- Layout();
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW,
- wxCloseEventHandler( PYTHON_CONSOLE_FRAME::OnClose ) );
- }
-
- ~PYTHON_CONSOLE_FRAME()
- {
- // Disconnect Events
- this->Disconnect( wxEVT_CLOSE_WINDOW,
- wxCloseEventHandler( PYTHON_CONSOLE_FRAME::OnClose ) );
- }
-
-private:
-
- void OnClose( wxCloseEvent& event )
- {
- if( !IsIconized() )
- {
- m_frameSize = GetSize();
- m_framePos = GetPosition();
- }
-
- event.Skip();
- }
-};
-
-#endif // PYTHON_CONSOLE_FRAME_H_
diff --git a/pcbnew/tools/drawing_tool.cpp b/pcbnew/tools/drawing_tool.cpp
index 10c46fd034..1ea9537567 100644
--- a/pcbnew/tools/drawing_tool.cpp
+++ b/pcbnew/tools/drawing_tool.cpp
@@ -1159,6 +1159,7 @@ int DRAWING_TOOL::drawZone( bool aKeepout )
// Get the current default settings for zones
ZONE_SETTINGS zoneInfo = m_frame->GetZoneSettings();
zoneInfo.m_CurrentZone_Layer = m_frame->GetScreen()->m_Active_Layer;
+ zoneInfo.SetIsKeepout( aKeepout );
m_controls->SetAutoPan( true );
m_controls->CaptureCursor( true );
diff --git a/pcbnew/tools/edit_tool.cpp b/pcbnew/tools/edit_tool.cpp
index 01bdcac71b..8e7c0b4f0e 100644
--- a/pcbnew/tools/edit_tool.cpp
+++ b/pcbnew/tools/edit_tool.cpp
@@ -313,7 +313,7 @@ int EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
lockOverride = false;
}
- } while( evt = Wait() );
+ } while( ( evt = Wait() ) ); //Should be assignment not equality test
if( m_dragging )
decUndoInhibit();
@@ -429,7 +429,7 @@ int EDIT_TOOL::Rotate( const TOOL_EVENT& aEvent )
// Shall the selection be cleared at the end?
bool unselect = selection.Empty();
- if( !hoverSelection( selection ) )
+ if( !hoverSelection( selection ) || m_selectionTool->CheckLock() == SELECTION_LOCKED )
return 0;
wxPoint rotatePoint = getModificationPoint( selection );
@@ -479,7 +479,7 @@ int EDIT_TOOL::Flip( const TOOL_EVENT& aEvent )
// Shall the selection be cleared at the end?
bool unselect = selection.Empty();
- if( !hoverSelection( selection ) )
+ if( !hoverSelection( selection ) || m_selectionTool->CheckLock() == SELECTION_LOCKED )
return 0;
wxPoint flipPoint = getModificationPoint( selection );
@@ -524,7 +524,7 @@ int EDIT_TOOL::Remove( const TOOL_EVENT& aEvent )
{
const SELECTION& selection = m_selectionTool->GetSelection();
- if( !hoverSelection( selection ) )
+ if( !hoverSelection( selection ) || m_selectionTool->CheckLock() == SELECTION_LOCKED )
return 0;
// Get a copy of the selected items set
@@ -649,7 +649,7 @@ int EDIT_TOOL::MoveExact( const TOOL_EVENT& aEvent )
// Shall the selection be cleared at the end?
bool unselect = selection.Empty();
- if( !hoverSelection( selection ) )
+ if( !hoverSelection( selection ) || m_selectionTool->CheckLock() == SELECTION_LOCKED )
return 0;
wxPoint translation;
diff --git a/pcbnew/tools/grid_helper.cpp b/pcbnew/tools/grid_helper.cpp
index 4e811caae1..b53fca2b9d 100644
--- a/pcbnew/tools/grid_helper.cpp
+++ b/pcbnew/tools/grid_helper.cpp
@@ -116,9 +116,6 @@ VECTOR2I GRID_HELPER::AlignToSegment ( const VECTOR2I& aPoint, const SEG& aSeg )
{
OPT_VECTOR2I pts[6];
- VECTOR2I origin( GetOrigin() );
- VECTOR2I grid( GetGrid() );
-
const VECTOR2D gridOffset( GetOrigin() );
const VECTOR2D gridSize( GetGrid() );
diff --git a/pcbnew/tools/pcbnew_control.cpp b/pcbnew/tools/pcbnew_control.cpp
index a84dc6ff6f..f96ff9e14b 100644
--- a/pcbnew/tools/pcbnew_control.cpp
+++ b/pcbnew/tools/pcbnew_control.cpp
@@ -479,7 +479,7 @@ int PCBNEW_CONTROL::CursorControl( const TOOL_EVENT& aEvent )
case COMMON_ACTIONS::CURSOR_CLICK: // fall through
case COMMON_ACTIONS::CURSOR_DBL_CLICK:
{
- TOOL_ACTIONS action;
+ TOOL_ACTIONS action = TA_NONE;
int modifiers = 0;
modifiers |= wxGetKeyState( WXK_SHIFT ) ? MD_SHIFT : 0;