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 @@ - bMainSizer + m_mainSizer wxVERTICAL - none + protected 5 wxALL|wxEXPAND @@ -178,123 +178,13 @@ 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_hotkeySections - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_RIGHT + wxALIGN_RIGHT|wxEXPAND 0 b_buttonsSizer wxHORIZONTAL none - - 5 - wxEXPAND|wxTOP|wxBOTTOM - 0 - - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - - m_sdbSizer - protected - - - - - - OnOKClicked - - - - 5 wxALL|wxEXPAND @@ -327,8 +217,8 @@ 0 0 - wxID_UNDO - Undo + wxID_RESET + Reset 0 @@ -336,7 +226,7 @@ 0 1 - m_undoButton + m_resetButton 1 @@ -357,7 +247,7 @@ - UndoClicked + ResetClicked @@ -383,6 +273,42 @@ + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxEXPAND|wxTOP|wxBOTTOM + 0 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + + m_sdbSizer + protected + + + + + + + + + + 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;