Commit 230b60e6 authored by Brian Sidebotham's avatar Brian Sidebotham

* Merge changes from trunk

parents a71823b4 24ed7f50
...@@ -35,36 +35,39 @@ set( USE_KIWAY_DLLS true ) # this is now mandatory, the code is the same anyway ...@@ -35,36 +35,39 @@ set( USE_KIWAY_DLLS true ) # this is now mandatory, the code is the same anyway
# have this option turned OFF, the xml export's referential integrity is broken # have this option turned OFF, the xml export's referential integrity is broken
# on library part name. Hence the default is ON now, as of 29-Jan-2014. # on library part name. Hence the default is ON now, as of 29-Jan-2014.
option( KICAD_KEEPCASE option( KICAD_KEEPCASE
"ON= case specific string matching on component names, OFF= match names as if they were spelt using uppercase." "Use case sensitive string matching for component names (default ON)."
ON ON
) )
option( USE_WX_GRAPHICS_CONTEXT option( USE_WX_GRAPHICS_CONTEXT
"Use wxGraphicsContext for rendering ( default OFF). Warning, this is experimental" ) "Use wxGraphicsContext for rendering (default OFF). Warning, this is experimental" )
option( USE_WX_OVERLAY option( USE_WX_OVERLAY
"Use wxOverlay: Always ON for MAC ( default OFF). Warning, this is experimental" ) "Use wxOverlay: Always ON for MAC (default OFF). Warning, this is experimental" )
option( KICAD_SCRIPTING option( KICAD_SCRIPTING
"set this option ON to build the scripting support inside kicad binaries" "Build the Python scripting support inside KiCad binaries (default OFF)."
) )
option( KICAD_SCRIPTING_MODULES option( KICAD_SCRIPTING_MODULES
"set this option ON to build kicad modules that can be used from scripting languages" "Build KiCad Python modules that can be used from scripting languages (default OFF)."
) )
option( KICAD_SCRIPTING_WXPYTHON option( KICAD_SCRIPTING_WXPYTHON
"set this option ON to build wxpython implementation for wx interface building in python and py.shell" "Build wxPython implementation for wx interface building in Python and py.shell (default OFF)."
) )
option( KICAD_BUILD_STATIC option( KICAD_BUILD_STATIC
"Builds Kicad and all libraries static" "Build dependencies as static libraries. OSX only. (default OFF)."
) )
option( KICAD_BUILD_DYNAMIC option( KICAD_BUILD_DYNAMIC
"Builds Kicad and all libraries dynamic (required for wxPython)" "Build dependencies as shared libraries. Required for wxPython support. OXS only. (default OFF)."
) )
option( USE_OSX_DEPS_BUILDER
"Build dependencies from source instead of dependencies installed on system. OSX only. (default OFF)."
)
# WARNING: KiCad developers strongly advise you to build Boost with supplied patches, # WARNING: KiCad developers strongly advise you to build Boost with supplied patches,
# as it is known to work with KiCad. Other versions may contain bugs that may result # as it is known to work with KiCad. Other versions may contain bugs that may result
...@@ -269,7 +272,6 @@ if( USE_WX_GRAPHICS_CONTEXT ) ...@@ -269,7 +272,6 @@ if( USE_WX_GRAPHICS_CONTEXT )
endif() endif()
# Allow user to override the default settings for adding images to menu items. By default # Allow user to override the default settings for adding images to menu items. By default
# images in menu items are enabled on all platforms except OSX. This can be over ridden by # images in menu items are enabled on all platforms except OSX. This can be over ridden by
# defining -DUSE_IMAGES_IN_MENUS=ON/OFF to force the preferred behavior. # defining -DUSE_IMAGES_IN_MENUS=ON/OFF to force the preferred behavior.
...@@ -353,9 +355,30 @@ include( ExternalProject ) ...@@ -353,9 +355,30 @@ include( ExternalProject )
#================================================ #================================================
include( CheckFindPackageResult ) include( CheckFindPackageResult )
##########################
# Find wxWidgets library #
##########################
# Here you can define what libraries of wxWidgets you need for your
# application. You can figure out what libraries you need here;
# http://www.wxwidgets.org/manuals/2.8/wx_librarieslist.html
# Turn on wxWidgets compatibility mode for some classes # Turn on wxWidgets compatibility mode for some classes
add_definitions( -DWX_COMPATIBILITY ) add_definitions( -DWX_COMPATIBILITY )
# See line 41 of CMakeModules/FindwxWidgets.cmake
set( wxWidgets_CONFIG_OPTIONS --static=no )
# On Apple only wxwidgets 2.9 or higher doesn't need to find aui part of base
# Seems no longer needed on wx-3
if( APPLE AND ( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES OR KICAD_SCRIPTING_WXPYTHON) )
find_package( wxWidgets 3.0.0 COMPONENTS gl adv html core net base xml REQUIRED )
else()
find_package( wxWidgets 3.0.0 COMPONENTS gl aui adv html core net base xml REQUIRED )
endif()
# Include wxWidgets macros.
include( ${wxWidgets_USE_FILE} )
####################### #######################
# Find OpenGL library # # Find OpenGL library #
####################### #######################
...@@ -372,7 +395,10 @@ check_find_package_result( OPENGL_FOUND "OpenGL" ) ...@@ -372,7 +395,10 @@ check_find_package_result( OPENGL_FOUND "OpenGL" )
# Always defined, empty if no libraries are to be built # Always defined, empty if no libraries are to be built
add_custom_target( lib-dependencies ) add_custom_target( lib-dependencies )
if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) # Only download and build all dependencies from source on OSX if the user specifically requests
# it. Otherwise, respect the developers wishes to use the dependencies already installed on
# their systme.
if( APPLE AND USE_OSX_DEPS_BUILDER )
# This should be built in all cases, if swig exec is not avaiable # This should be built in all cases, if swig exec is not avaiable
# will be impossible also enable SCRIPTING being for PCBNEW required immediately # will be impossible also enable SCRIPTING being for PCBNEW required immediately
...@@ -417,31 +443,24 @@ if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) ...@@ -417,31 +443,24 @@ if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC )
set( PYTHON_DEST ${LIBWXPYTHON_ROOT}/wxPython/lib/python2.6/site-packages ) set( PYTHON_DEST ${LIBWXPYTHON_ROOT}/wxPython/lib/python2.6/site-packages )
set(wxWidgets_BIN_DIR ${LIBWXPYTHON_ROOT}/bin/wxrc )
set(wxWidgets_CONFIG_EXECUTABLE ${LIBWXPYTHON_ROOT}/bin/wx-config )
set(wxWidgets_INCLUDE_DIRS ${LIBWXPYTHON_ROOT}/include/wx-3.0 )
set(wxWidgets_LIBRARY_DIRS ${LIBWXPYTHON_ROOT}/lib )
add_dependencies( lib-dependencies libwxpython ) add_dependencies( lib-dependencies libwxpython )
add_dependencies( lib-dependencies swig ) add_dependencies( lib-dependencies swig )
else() else()
include( download_wxwidgets ) include( download_wxwidgets )
add_dependencies( lib-dependencies libwx ) add_dependencies( lib-dependencies libwx )
endif() endif()
include( download_libpng ) include( download_libpng )
include( download_pkgconfig ) include( download_pkgconfig )
set( PKG_CONFIG_EXECUTABLE "${PKGCONFIG_ROOT}/bin/pkg-config" ) set( PKG_CONFIG_EXECUTABLE "${PKGCONFIG_ROOT}/bin/pkg-config" )
include( download_glew ) include( download_glew )
set( GLEW_GLEW_LIBRARY "${GLEW_ROOT}/lib/libGLEW.a" ) set( GLEW_GLEW_LIBRARY "${GLEW_ROOT}/lib/libGLEW.a" )
set( GLEW_INCLUDE_DIR "${GLEW_ROOT}/include" ) set( GLEW_INCLUDE_DIR "${GLEW_ROOT}/include" )
include( download_pixman ) include( download_pixman )
set( PIXMAN_LIBRARY "${PIXMAN_ROOT}/lib/libpixman-1.a" ) set( PIXMAN_LIBRARY "${PIXMAN_ROOT}/lib/libpixman-1.a" )
include( download_cairo ) include( download_cairo )
set( CAIRO_INCLUDE_DIR "${CAIRO_ROOT}/include/cairo" ) set( CAIRO_INCLUDE_DIR "${CAIRO_ROOT}/include/cairo" )
set( CAIRO_LIBRARY "${CAIRO_ROOT}/lib/libcairo.a" ) set( CAIRO_LIBRARY "${CAIRO_ROOT}/lib/libcairo.a" )
add_dependencies( lib-dependencies boost ) add_dependencies( lib-dependencies boost )
add_dependencies( lib-dependencies cairo ) add_dependencies( lib-dependencies cairo )
...@@ -450,11 +469,13 @@ if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC ) ...@@ -450,11 +469,13 @@ if( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC )
add_dependencies( lib-dependencies pkgconfig ) add_dependencies( lib-dependencies pkgconfig )
if( KICAD_BUILD_DYNAMIC AND APPLE ) if( KICAD_BUILD_DYNAMIC AND APPLE )
add_custom_target( osx_fix_bundles ALL DEPENDS cvpcb eeschema gerbview kicad pcbnew bitmap2component pcb_calculator pl_editor) add_custom_target( osx_fix_bundles ALL DEPENDS
add_custom_command(TARGET osx_fix_bundles POST_BUILD COMMAND ${PROJECT_SOURCE_DIR}/scripts/osx_fixbundle.sh ${PROJECT_SOURCE_DIR} COMMENT "Migrating dylibs to bundles") cvpcb eeschema gerbview kicad pcbnew bitmap2component pcb_calculator pl_editor)
add_custom_command(TARGET osx_fix_bundles
POST_BUILD COMMAND ${PROJECT_SOURCE_DIR}/scripts/osx_fixbundle.sh ${PROJECT_SOURCE_DIR}
COMMENT "Migrating dylibs to bundles")
endif() endif()
endif()
endif( KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC)
##################### #####################
# Find GLEW library # # Find GLEW library #
...@@ -492,31 +513,6 @@ else() ...@@ -492,31 +513,6 @@ else()
include( download_boost ) include( download_boost )
endif() endif()
##########################
# Find wxWidgets library #
##########################
# Here you can define what libraries of wxWidgets you need for your
# application. You can figure out what libraries you need here;
# http://www.wxwidgets.org/manuals/2.8/wx_librarieslist.html
# See line 41 of CMakeModules/FindwxWidgets.cmake
set( wxWidgets_CONFIG_OPTIONS --static=no )
# On Apple only wxwidgets 2.9 or higher doesn't need to find aui part of base
# Seems no more needed on wx-3
if( APPLE AND ( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES OR KICAD_SCRIPTING_WXPYTHON) )
find_package( wxWidgets COMPONENTS gl adv html core net base xml QUIET )
else()
find_package( wxWidgets COMPONENTS gl aui adv html core net base xml QUIET )
endif()
if( NOT (KICAD_BUILD_STATIC OR KICAD_BUILD_DYNAMIC) )
check_find_package_result( wxWidgets_FOUND "wxWidgets" )
endif()
# Include wxWidgets macros.
include( ${wxWidgets_USE_FILE} )
# Include MinGW resource compiler. # Include MinGW resource compiler.
include( MinGWResourceCompiler ) include( MinGWResourceCompiler )
...@@ -553,16 +549,8 @@ set( INC_AFTER ...@@ -553,16 +549,8 @@ set( INC_AFTER
# Find Python and other scripting resources # Find Python and other scripting resources
if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES )
if( APPLE )
set( PYTHON_LIBRARY /System/Library/Frameworks/Python.framework/Versions/2.6/Python )
set( PYTHON_INCLUDE_DIR /System/Library/Frameworks/Python.framework/Versions//2.6/include/python2.6 )
set( PythonInterp_FIND_VERSION 2.6 )
set( PythonLibs_FIND_VERSION 2.6 )
endif()
# force a python version < 3.0 # force a python version < 3.0
set( PythonInterp_FIND_VERSION 2.6) set( PythonInterp_FIND_VERSION 2.6 )
set( PythonLibs_FIND_VERSION 2.6 ) set( PythonLibs_FIND_VERSION 2.6 )
find_package( PythonInterp ) find_package( PythonInterp )
...@@ -572,6 +560,7 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES ) ...@@ -572,6 +560,7 @@ if( KICAD_SCRIPTING OR KICAD_SCRIPTING_MODULES )
if( NOT PYTHON_VERSION_MAJOR EQUAL 2 ) if( NOT PYTHON_VERSION_MAJOR EQUAL 2 )
message( FATAL_ERROR "Python 2.x is required." ) message( FATAL_ERROR "Python 2.x is required." )
endif() endif()
# Get the correct Python site package install path from the Python interpreter found by # Get the correct Python site package install path from the Python interpreter found by
# FindPythonInterp unless the user specifically defined a custom path. # FindPythonInterp unless the user specifically defined a custom path.
if( NOT PYTHON_SITE_PACKAGE_PATH ) if( NOT PYTHON_SITE_PACKAGE_PATH )
......
#.rst:
# CMakeParseArguments
# -------------------
#
#
#
# CMAKE_PARSE_ARGUMENTS(<prefix> <options> <one_value_keywords>
# <multi_value_keywords> args...)
#
# CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions
# for parsing the arguments given to that macro or function. It
# processes the arguments and defines a set of variables which hold the
# values of the respective options.
#
# The <options> argument contains all options for the respective macro,
# i.e. keywords which can be used when calling the macro without any
# value following, like e.g. the OPTIONAL keyword of the install()
# command.
#
# The <one_value_keywords> argument contains all keywords for this macro
# which are followed by one value, like e.g. DESTINATION keyword of the
# install() command.
#
# The <multi_value_keywords> argument contains all keywords for this
# macro which can be followed by more than one value, like e.g. the
# TARGETS or FILES keywords of the install() command.
#
# When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the
# keywords listed in <options>, <one_value_keywords> and
# <multi_value_keywords> a variable composed of the given <prefix>
# followed by "_" and the name of the respective keyword. These
# variables will then hold the respective value from the argument list.
# For the <options> keywords this will be TRUE or FALSE.
#
# All remaining arguments are collected in a variable
# <prefix>_UNPARSED_ARGUMENTS, this can be checked afterwards to see
# whether your macro was called with unrecognized parameters.
#
# As an example here a my_install() macro, which takes similar arguments
# as the real install() command:
#
# ::
#
# function(MY_INSTALL)
# set(options OPTIONAL FAST)
# set(oneValueArgs DESTINATION RENAME)
# set(multiValueArgs TARGETS CONFIGURATIONS)
# cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
# ...
#
#
#
# Assume my_install() has been called like this:
#
# ::
#
# my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub)
#
#
#
# After the cmake_parse_arguments() call the macro will have set the
# following variables:
#
# ::
#
# MY_INSTALL_OPTIONAL = TRUE
# MY_INSTALL_FAST = FALSE (this option was not used when calling my_install()
# MY_INSTALL_DESTINATION = "bin"
# MY_INSTALL_RENAME = "" (was not used)
# MY_INSTALL_TARGETS = "foo;bar"
# MY_INSTALL_CONFIGURATIONS = "" (was not used)
# MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (no value expected after "OPTIONAL"
#
#
#
# You can then continue and process these variables.
#
# Keywords terminate lists of values, e.g. if directly after a
# one_value_keyword another recognized keyword follows, this is
# interpreted as the beginning of the new option. E.g.
# my_install(TARGETS foo DESTINATION OPTIONAL) would result in
# MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION
# would be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor.
#=============================================================================
# Copyright 2010 Alexander Neundorf <neundorf@kde.org>
#
# 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(__CMAKE_PARSE_ARGUMENTS_INCLUDED)
return()
endif()
set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE)
function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames)
# first set all result variables to empty/FALSE
foreach(arg_name ${_singleArgNames} ${_multiArgNames})
set(${prefix}_${arg_name})
endforeach()
foreach(option ${_optionNames})
set(${prefix}_${option} FALSE)
endforeach()
set(${prefix}_UNPARSED_ARGUMENTS)
set(insideValues FALSE)
set(currentArgName)
# now iterate over all arguments and fill the result variables
foreach(currentArg ${ARGN})
list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword
list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword
list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword
if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1)
if(insideValues)
if("${insideValues}" STREQUAL "SINGLE")
set(${prefix}_${currentArgName} ${currentArg})
set(insideValues FALSE)
elseif("${insideValues}" STREQUAL "MULTI")
list(APPEND ${prefix}_${currentArgName} ${currentArg})
endif()
else()
list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg})
endif()
else()
if(NOT ${optionIndex} EQUAL -1)
set(${prefix}_${currentArg} TRUE)
set(insideValues FALSE)
elseif(NOT ${singleArgIndex} EQUAL -1)
set(currentArgName ${currentArg})
set(${prefix}_${currentArgName})
set(insideValues "SINGLE")
elseif(NOT ${multiArgIndex} EQUAL -1)
set(currentArgName ${currentArg})
set(${prefix}_${currentArgName})
set(insideValues "MULTI")
endif()
endif()
endforeach()
# propagate the result variables to the caller:
foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames})
set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE)
endforeach()
set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE)
endfunction()
#.rst:
# FindPackageMessage
# ------------------
#
#
#
# FIND_PACKAGE_MESSAGE(<name> "message for user" "find result details")
#
# This macro is intended to be used in FindXXX.cmake modules files. It
# will print a message once for each unique find result. This is useful
# for telling the user where a package was found. The first argument
# specifies the name (XXX) of the package. The second argument
# specifies the message to display. The third argument lists details
# about the find result so that if they change the message will be
# displayed again. The macro also obeys the QUIET argument to the
# find_package command.
#
# Example:
#
# ::
#
# if(X11_FOUND)
# FIND_PACKAGE_MESSAGE(X11 "Found X11: ${X11_X11_LIB}"
# "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]")
# else()
# ...
# endif()
#=============================================================================
# Copyright 2008-2009 Kitware, Inc.
#
# 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.)
function(FIND_PACKAGE_MESSAGE pkg msg details)
# Avoid printing a message repeatedly for the same find result.
if(NOT ${pkg}_FIND_QUIETLY)
string(REGEX REPLACE "[\n]" "" details "${details}")
set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg})
if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}")
# The message has not yet been printed.
message(STATUS "${msg}")
# Save the find details in the cache to avoid printing the same
# message again.
set("${DETAILS_VAR}" "${details}"
CACHE INTERNAL "Details about finding ${pkg}")
endif()
endif()
endfunction()
This diff is collapsed.
...@@ -119,8 +119,8 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, ...@@ -119,8 +119,8 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent,
m_showOriginAxis = false; // true to draw the grid origin m_showOriginAxis = false; // true to draw the grid origin
m_cursorShape = 0; m_cursorShape = 0;
m_LastGridSizeId = 0; m_LastGridSizeId = 0;
m_DrawGrid = true; // hide/Show grid. default = show m_drawGrid = true; // hide/Show grid. default = show
m_GridColor = DARKGRAY; // Grid color m_gridColor = DARKGRAY; // Default grid color
m_showPageLimits = false; m_showPageLimits = false;
m_drawBgColor = BLACK; // the background color of the draw canvas: m_drawBgColor = BLACK; // the background color of the draw canvas:
// BLACK for Pcbnew, BLACK or WHITE for eeschema // BLACK for Pcbnew, BLACK or WHITE for eeschema
......
...@@ -425,13 +425,13 @@ void PCB_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER&, int ) ...@@ -425,13 +425,13 @@ void PCB_SCREEN::ClearUndoORRedoList( UNDO_REDO_CONTAINER&, int )
bool DISPLAY_FOOTPRINTS_FRAME::IsGridVisible() const bool DISPLAY_FOOTPRINTS_FRAME::IsGridVisible() const
{ {
return m_DrawGrid; return m_drawGrid;
} }
void DISPLAY_FOOTPRINTS_FRAME::SetGridVisibility(bool aVisible) void DISPLAY_FOOTPRINTS_FRAME::SetGridVisibility(bool aVisible)
{ {
m_DrawGrid = aVisible; m_drawGrid = aVisible;
} }
......
...@@ -48,7 +48,7 @@ int LIB_EDIT_FRAME::BlockCommand( int key ) ...@@ -48,7 +48,7 @@ int LIB_EDIT_FRAME::BlockCommand( int key )
switch( key ) switch( key )
{ {
default: default:
cmd = key & 0x255; cmd = key & 0xFF;
break; break;
case -1: case -1:
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
static wxTreeItemId GetPrevItem( const wxTreeCtrl& tree, const wxTreeItemId& item ); static wxTreeItemId GetPrevItem( const wxTreeCtrl& tree, const wxTreeItemId& item );
static wxTreeItemId GetNextItem( const wxTreeCtrl& tree, const wxTreeItemId& item ); static wxTreeItemId GetNextItem( const wxTreeCtrl& tree, const wxTreeItemId& item );
DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle, DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const wxString& aTitle,
COMPONENT_TREE_SEARCH_CONTAINER* aContainer, COMPONENT_TREE_SEARCH_CONTAINER* aContainer,
int aDeMorganConvert ) int aDeMorganConvert )
: DIALOG_CHOOSE_COMPONENT_BASE( aParent, wxID_ANY, aTitle ), : DIALOG_CHOOSE_COMPONENT_BASE( aParent, wxID_ANY, aTitle ),
...@@ -44,6 +44,7 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxStr ...@@ -44,6 +44,7 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxStr
m_external_browser_requested( false ), m_external_browser_requested( false ),
m_received_doubleclick_in_tree( false ) m_received_doubleclick_in_tree( false )
{ {
m_parent = aParent;
m_search_container->SetTree( m_libraryComponentTree ); m_search_container->SetTree( m_libraryComponentTree );
m_searchBox->SetFocus(); m_searchBox->SetFocus();
m_componentDetails->SetEditable( false ); m_componentDetails->SetEditable( false );
...@@ -260,7 +261,8 @@ void DIALOG_CHOOSE_COMPONENT::OnHandlePreviewRepaint( wxPaintEvent& aRepaintEven ...@@ -260,7 +261,8 @@ void DIALOG_CHOOSE_COMPONENT::OnHandlePreviewRepaint( wxPaintEvent& aRepaintEven
void DIALOG_CHOOSE_COMPONENT::renderPreview( LIB_PART* aComponent, int aUnit ) void DIALOG_CHOOSE_COMPONENT::renderPreview( LIB_PART* aComponent, int aUnit )
{ {
wxPaintDC dc( m_componentView ); wxPaintDC dc( m_componentView );
dc.SetBackground( *wxWHITE_BRUSH ); EDA_COLOR_T bgcolor = m_parent->GetDrawBgColor();
dc.SetBackground( bgcolor == BLACK ? *wxBLACK_BRUSH : *wxWHITE_BRUSH );
dc.Clear(); dc.Clear();
if( aComponent == NULL ) if( aComponent == NULL )
......
...@@ -30,20 +30,27 @@ class COMPONENT_TREE_SEARCH_CONTAINER; ...@@ -30,20 +30,27 @@ class COMPONENT_TREE_SEARCH_CONTAINER;
class LIB_ALIAS; class LIB_ALIAS;
class LIB_PART; class LIB_PART;
class wxTreeItemId; class wxTreeItemId;
class SCH_BASE_FRAME;
class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE
{ {
SCH_BASE_FRAME* m_parent;
COMPONENT_TREE_SEARCH_CONTAINER* const m_search_container;
const int m_deMorganConvert;
bool m_external_browser_requested;
bool m_received_doubleclick_in_tree;
public: public:
/** /**
* Create dialog to choose component. * Create dialog to choose component.
* *
* @param aParent Parent window. * @param aParent a SCH_BASE_FRAME parent window.
* @param aTitle Dialog title. * @param aTitle Dialog title.
* @param aSearchContainer The tree selection search container. Needs to be pre-populated * @param aSearchContainer The tree selection search container. Needs to be pre-populated
* This dialog does not take over ownership of this object. * This dialog does not take over ownership of this object.
* @param aDeMorganConvert preferred deMorgan conversion (TODO: should happen in dialog) * @param aDeMorganConvert preferred deMorgan conversion (TODO: should happen in dialog)
*/ */
DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle, DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const wxString& aTitle,
COMPONENT_TREE_SEARCH_CONTAINER* aSearchContainer, COMPONENT_TREE_SEARCH_CONTAINER* aSearchContainer,
int aDeMorganConvert ); int aDeMorganConvert );
virtual ~DIALOG_CHOOSE_COMPONENT(); virtual ~DIALOG_CHOOSE_COMPONENT();
...@@ -80,11 +87,6 @@ private: ...@@ -80,11 +87,6 @@ private:
bool updateSelection(); bool updateSelection();
void selectIfValid( const wxTreeItemId& aTreeId ); void selectIfValid( const wxTreeItemId& aTreeId );
void renderPreview( LIB_PART* aComponent, int aUnit ); void renderPreview( LIB_PART* aComponent, int aUnit );
COMPONENT_TREE_SEARCH_CONTAINER* const m_search_container;
const int m_deMorganConvert;
bool m_external_browser_requested;
bool m_received_doubleclick_in_tree;
}; };
#endif /* DIALOG_CHOOSE_COMPONENT_H */ #endif /* DIALOG_CHOOSE_COMPONENT_H */
...@@ -3,14 +3,12 @@ ...@@ -3,14 +3,12 @@
*/ */
#include <fctsys.h> #include <fctsys.h>
#include <gr_basic.h>
#include <draw_frame.h> #include <draw_frame.h>
#include <class_drawpanel.h> #include <class_drawpanel.h>
#include <general.h> #include <general.h>
#include <dialog_color_config.h> #include <dialog_color_config.h>
#include <layers_id_colors_and_visibility.h>
#define ID_COLOR_SETUP 1800 #define ID_COLOR_SETUP 1800
...@@ -86,7 +84,7 @@ static BUTTONINDEX buttonGroups[] = { ...@@ -86,7 +84,7 @@ static BUTTONINDEX buttonGroups[] = {
}; };
static EDA_COLOR_T currentColors[ NB_SCH_LAYERS ]; static EDA_COLOR_T currentColors[ LAYERSCH_ID_COUNT ];
IMPLEMENT_DYNAMIC_CLASS( DIALOG_COLOR_CONFIG, wxDialog ) IMPLEMENT_DYNAMIC_CLASS( DIALOG_COLOR_CONFIG, wxDialog )
...@@ -188,7 +186,7 @@ void DIALOG_COLOR_CONFIG::CreateControls() ...@@ -188,7 +186,7 @@ void DIALOG_COLOR_CONFIG::CreateControls()
iconDC.SelectObject( bitmap ); iconDC.SelectObject( bitmap );
EDA_COLOR_T color = GetLayerColor( LayerNumber( buttons->m_Layer ) ); EDA_COLOR_T color = GetLayerColor( LAYERSCH_ID( buttons->m_Layer ) );
currentColors[ buttons->m_Layer ] = color; currentColors[ buttons->m_Layer ] = color;
iconDC.SetPen( *wxBLACK_PEN ); iconDC.SetPen( *wxBLACK_PEN );
...@@ -235,6 +233,9 @@ void DIALOG_COLOR_CONFIG::CreateControls() ...@@ -235,6 +233,9 @@ void DIALOG_COLOR_CONFIG::CreateControls()
m_SelBgColor->SetSelection( ( m_parent->GetDrawBgColor() == BLACK ) ? 1 : 0 ); m_SelBgColor->SetSelection( ( m_parent->GetDrawBgColor() == BLACK ) ? 1 : 0 );
m_columnBoxSizer->Add( m_SelBgColor, 1, wxGROW | wxRIGHT | wxTOP | wxBOTTOM, 5 ); m_columnBoxSizer->Add( m_SelBgColor, 1, wxGROW | wxRIGHT | wxTOP | wxBOTTOM, 5 );
currentColors[ LAYER_BACKGROUND ] = m_parent->GetDrawBgColor();
// Provide a line to separate all of the controls added so far from the // Provide a line to separate all of the controls added so far from the
// "OK", "Cancel", and "Apply" buttons (which will be added after that // "OK", "Cancel", and "Apply" buttons (which will be added after that
// line). // line).
...@@ -317,24 +318,27 @@ void DIALOG_COLOR_CONFIG::SetColor( wxCommandEvent& event ) ...@@ -317,24 +318,27 @@ void DIALOG_COLOR_CONFIG::SetColor( wxCommandEvent& event )
bool DIALOG_COLOR_CONFIG::UpdateColorsSettings() bool DIALOG_COLOR_CONFIG::UpdateColorsSettings()
{ {
// Update color of background // Update color of background
if( m_SelBgColor->GetSelection() == 0 ) EDA_COLOR_T bgcolor = WHITE;
m_parent->SetDrawBgColor( WHITE );
else if( m_SelBgColor->GetSelection() > 0 )
m_parent->SetDrawBgColor( BLACK ); bgcolor = BLACK;
m_parent->SetDrawBgColor( bgcolor );
currentColors[ LAYER_BACKGROUND ] = bgcolor;
bool warning = false; bool warning = false;
for( LayerNumber ii = LAYER_WIRE; ii < NB_SCH_LAYERS; ++ii ) for( LAYERSCH_ID clyr = LAYER_WIRE; clyr < LAYERSCH_ID_COUNT; ++clyr )
{ {
SetLayerColor( currentColors[ ii ], ii ); SetLayerColor( currentColors[ clyr ], clyr );
if( m_parent->GetDrawBgColor() == GetLayerColor( ii ) ) if( bgcolor == GetLayerColor( clyr ) && clyr != LAYER_BACKGROUND )
warning = true; warning = true;
} }
m_parent->SetGridColor( GetLayerColor( LAYER_GRID ) ); m_parent->SetGridColor( GetLayerColor( LAYER_GRID ) );
if( m_parent->GetDrawBgColor() == GetLayerColor( LAYER_GRID ) ) if( bgcolor == GetLayerColor( LAYER_GRID ) )
warning = true; warning = true;
return warning; return warning;
...@@ -348,7 +352,8 @@ void DIALOG_COLOR_CONFIG::OnOkClick( wxCommandEvent& event ) ...@@ -348,7 +352,8 @@ void DIALOG_COLOR_CONFIG::OnOkClick( wxCommandEvent& event )
// Prompt the user if an item has the same color as the background // Prompt the user if an item has the same color as the background
// because this item cannot be seen: // because this item cannot be seen:
if( warning ) if( warning )
wxMessageBox( _("Warning:\nSome items have the same color as the background\nand they will not be seen on screen") ); wxMessageBox( _("Warning:\nSome items have the same color as the background\n"
"and they will not be seen on screen") );
m_parent->GetCanvas()->Refresh(); m_parent->GetCanvas()->Refresh();
......
...@@ -70,7 +70,7 @@ static struct IFACE : public KIFACE_I ...@@ -70,7 +70,7 @@ static struct IFACE : public KIFACE_I
bool OnKifaceStart( PGM_BASE* aProgram, int aCtlBits ); bool OnKifaceStart( PGM_BASE* aProgram, int aCtlBits );
void OnKifaceEnd( PGM_BASE* aProgram ); void OnKifaceEnd();
wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 ) wxWindow* CreateWindow( wxWindow* aParent, int aClassId, KIWAY* aKiway, int aCtlBits = 0 )
{ {
...@@ -154,15 +154,15 @@ PGM_BASE& Pgm() ...@@ -154,15 +154,15 @@ PGM_BASE& Pgm()
} }
static EDA_COLOR_T s_layerColor[NB_SCH_LAYERS]; static EDA_COLOR_T s_layerColor[LAYERSCH_ID_COUNT];
EDA_COLOR_T GetLayerColor( LayerNumber aLayer ) EDA_COLOR_T GetLayerColor( LAYERSCH_ID aLayer )
{ {
wxASSERT( unsigned( aLayer ) < DIM( s_layerColor ) ); wxASSERT( unsigned( aLayer ) < DIM( s_layerColor ) );
return s_layerColor[aLayer]; return s_layerColor[aLayer];
} }
void SetLayerColor( EDA_COLOR_T aColor, int aLayer ) void SetLayerColor( EDA_COLOR_T aColor, LAYERSCH_ID aLayer )
{ {
wxASSERT( unsigned( aLayer ) < DIM( s_layerColor ) ); wxASSERT( unsigned( aLayer ) < DIM( s_layerColor ) );
s_layerColor[aLayer] = aColor; s_layerColor[aLayer] = aColor;
...@@ -178,7 +178,8 @@ static PARAM_CFG_ARRAY& cfg_params() ...@@ -178,7 +178,8 @@ static PARAM_CFG_ARRAY& cfg_params()
// These are KIFACE specific, they need to be loaded once when the // These are KIFACE specific, they need to be loaded once when the
// eeschema KIFACE comes in. // eeschema KIFACE comes in.
#define CLR(x, y, z) ca.push_back( new PARAM_CFG_SETCOLOR( true, wxT( x ), &s_layerColor[y], z )); #define CLR(x, y, z)\
ca.push_back( new PARAM_CFG_SETCOLOR( true, wxT( x ), &s_layerColor[y], z ) );
CLR( "ColorWireEx", LAYER_WIRE, GREEN ) CLR( "ColorWireEx", LAYER_WIRE, GREEN )
CLR( "ColorBusEx", LAYER_BUS, BLUE ) CLR( "ColorBusEx", LAYER_BUS, BLUE )
...@@ -204,6 +205,7 @@ static PARAM_CFG_ARRAY& cfg_params() ...@@ -204,6 +205,7 @@ static PARAM_CFG_ARRAY& cfg_params()
CLR( "ColorErcWEx", LAYER_ERC_WARN, GREEN ) CLR( "ColorErcWEx", LAYER_ERC_WARN, GREEN )
CLR( "ColorErcEEx", LAYER_ERC_ERR, RED ) CLR( "ColorErcEEx", LAYER_ERC_ERR, RED )
CLR( "ColorGridEx", LAYER_GRID, DARKGRAY ) CLR( "ColorGridEx", LAYER_GRID, DARKGRAY )
CLR( "ColorBgCanvasEx", LAYER_BACKGROUND, WHITE )
} }
return ca; return ca;
...@@ -220,23 +222,24 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits ) ...@@ -220,23 +222,24 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
// Give a default colour for all layers // Give a default colour for all layers
// (actual color will be initialized by config) // (actual color will be initialized by config)
for( int ii = 0; ii < NB_SCH_LAYERS; ii++ ) for( LAYERSCH_ID ii = LAYER_FIRST; ii < LAYERSCH_ID_COUNT; ++ii )
SetLayerColor( DARKGRAY, ii ); SetLayerColor( DARKGRAY, ii );
SetLayerColor( WHITE, LAYER_BACKGROUND );
// Must be called before creating the main frame in order to // Must be called before creating the main frame in order to
// display the real hotkeys in menus or tool tips // display the real hotkeys in menus or tool tips
ReadHotkeyConfig( wxT("SchematicFrame"), s_Eeschema_Hokeys_Descr ); ReadHotkeyConfig( wxT("SchematicFrame"), s_Eeschema_Hokeys_Descr );
wxConfigLoadSetups( KifaceSettings(), cfg_params() ); wxConfigLoadSetups( KifaceSettings(), cfg_params() );
return true; return true;
} }
void IFACE::OnKifaceEnd( PGM_BASE* aProgram ) void IFACE::OnKifaceEnd()
{ {
wxConfigSaveSetups( KifaceSettings(), cfg_params() ); wxConfigSaveSetups( KifaceSettings(), cfg_params() );
end_common(); end_common();
} }
...@@ -307,6 +307,7 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event ) ...@@ -307,6 +307,7 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event )
{ {
wxArrayString units; wxArrayString units;
GRIDS grid_list = GetScreen()->GetGrids(); GRIDS grid_list = GetScreen()->GetGrids();
bool saveProjectConfig = false;
DIALOG_EESCHEMA_OPTIONS dlg( this ); DIALOG_EESCHEMA_OPTIONS dlg( this );
...@@ -357,19 +358,33 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event ) ...@@ -357,19 +358,33 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event )
int sep, firstId; int sep, firstId;
dlg.GetRefIdSeparator( sep, firstId); dlg.GetRefIdSeparator( sep, firstId);
if( sep != (int)LIB_PART::GetSubpartIdSeparator() || if( sep != (int)LIB_PART::GetSubpartIdSeparator() ||
firstId != (int)LIB_PART::GetSubpartFirstId() ) firstId != (int)LIB_PART::GetSubpartFirstId() )
{ {
LIB_PART::SetSubpartIdNotation( sep, firstId ); LIB_PART::SetSubpartIdNotation( sep, firstId );
SaveProjectSettings( true ); saveProjectConfig = true;
} }
SetDefaultBusThickness( dlg.GetBusWidth() ); SetDefaultBusThickness( dlg.GetBusWidth() );
SetDefaultLineThickness( dlg.GetLineWidth() ); SetDefaultLineThickness( dlg.GetLineWidth() );
SetDefaultTextSize( dlg.GetTextSize() );
g_RepeatStep.x = dlg.GetRepeatHorizontal(); if( dlg.GetTextSize() != GetDefaultTextSize() )
g_RepeatStep.y = dlg.GetRepeatVertical(); {
g_RepeatDeltaLabel = dlg.GetRepeatLabel(); SetDefaultTextSize( dlg.GetTextSize() );
saveProjectConfig = true;
}
if( g_RepeatStep.x != dlg.GetRepeatHorizontal() ||
g_RepeatStep.y != dlg.GetRepeatVertical() ||
g_RepeatDeltaLabel != dlg.GetRepeatLabel() )
{
g_RepeatStep.x = dlg.GetRepeatHorizontal();
g_RepeatStep.y = dlg.GetRepeatVertical();
g_RepeatDeltaLabel = dlg.GetRepeatLabel();
saveProjectConfig = true;
}
SetAutoSaveInterval( dlg.GetAutoSaveInterval() * 60 ); SetAutoSaveInterval( dlg.GetAutoSaveInterval() * 60 );
SetGridVisibility( dlg.GetShowGrid() ); SetGridVisibility( dlg.GetShowGrid() );
m_showAllPins = dlg.GetShowHiddenPins(); m_showAllPins = dlg.GetShowHiddenPins();
...@@ -414,6 +429,9 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event ) ...@@ -414,6 +429,9 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event )
SaveSettings( config() ); // save values shared by eeschema applications. SaveSettings( config() ); // save values shared by eeschema applications.
if( saveProjectConfig )
SaveProjectSettings( true );
m_canvas->Refresh( true ); m_canvas->Refresh( true );
} }
...@@ -546,7 +564,6 @@ static const wxChar SimulatorCommandEntry[] = wxT( "SimCmdLine" ); ...@@ -546,7 +564,6 @@ static const wxChar SimulatorCommandEntry[] = wxT( "SimCmdLine" );
// Library editor wxConfig entry names. // Library editor wxConfig entry names.
static const wxChar lastLibExportPathEntry[] = wxT( "LastLibraryExportPath" ); static const wxChar lastLibExportPathEntry[] = wxT( "LastLibraryExportPath" );
static const wxChar lastLibImportPathEntry[] = wxT( "LastLibraryImportPath" ); static const wxChar lastLibImportPathEntry[] = wxT( "LastLibraryImportPath" );
static const wxChar libeditdrawBgColorEntry[] = wxT( "LibeditBgColor" );
static const wxChar defaultPinNumSizeEntry[] = wxT( "LibeditPinNumSize" ); static const wxChar defaultPinNumSizeEntry[] = wxT( "LibeditPinNumSize" );
static const wxChar defaultPinNameSizeEntry[] = wxT( "LibeditPinNameSize" ); static const wxChar defaultPinNameSizeEntry[] = wxT( "LibeditPinNameSize" );
static const wxChar DefaultPinLengthEntry[] = wxT( "DefaultPinLength" ); static const wxChar DefaultPinLengthEntry[] = wxT( "DefaultPinLength" );
...@@ -561,9 +578,6 @@ PARAM_CFG_ARRAY& SCH_EDIT_FRAME::GetConfigurationSettings() ...@@ -561,9 +578,6 @@ PARAM_CFG_ARRAY& SCH_EDIT_FRAME::GetConfigurationSettings()
&m_showPageLimits, true ) ); &m_showPageLimits, true ) );
m_configSettings.push_back( new PARAM_CFG_INT( true, wxT( "Units" ), m_configSettings.push_back( new PARAM_CFG_INT( true, wxT( "Units" ),
(int*)&g_UserUnit, MILLIMETRES ) ); (int*)&g_UserUnit, MILLIMETRES ) );
m_configSettings.push_back( new PARAM_CFG_SETCOLOR( true, wxT( "SchEditorBgColor" ),
&m_drawBgColor,
WHITE ) );
m_configSettings.push_back( new PARAM_CFG_BOOL( true, wxT( "PrintMonochrome" ), m_configSettings.push_back( new PARAM_CFG_BOOL( true, wxT( "PrintMonochrome" ),
&m_printMonochrome, true ) ); &m_printMonochrome, true ) );
...@@ -582,7 +596,8 @@ void SCH_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg ) ...@@ -582,7 +596,8 @@ void SCH_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg )
wxConfigLoadSetups( aCfg, GetConfigurationSettings() ); wxConfigLoadSetups( aCfg, GetConfigurationSettings() );
m_GridColor = GetLayerColor( LAYER_GRID ); SetGridColor( GetLayerColor( LAYER_GRID ) );
SetDrawBgColor( GetLayerColor( LAYER_BACKGROUND ) );
SetDefaultBusThickness( aCfg->Read( DefaultBusWidthEntry, DEFAULTBUSTHICKNESS ) ); SetDefaultBusThickness( aCfg->Read( DefaultBusWidthEntry, DEFAULTBUSTHICKNESS ) );
SetDefaultLineThickness( aCfg->Read( DefaultDrawLineWidthEntry, DEFAULTDRAWLINETHICKNESS ) ); SetDefaultLineThickness( aCfg->Read( DefaultDrawLineWidthEntry, DEFAULTDRAWLINETHICKNESS ) );
...@@ -744,8 +759,8 @@ void LIB_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg ) ...@@ -744,8 +759,8 @@ void LIB_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg )
wxConfigPathChanger cpc( aCfg, m_configPath ); wxConfigPathChanger cpc( aCfg, m_configPath );
EDA_COLOR_T itmp = ColorByName( aCfg->Read( libeditdrawBgColorEntry, wxT("WHITE") ) ); SetGridColor( GetLayerColor( LAYER_GRID ) );
SetDrawBgColor( itmp ); SetDrawBgColor( GetLayerColor( LAYER_BACKGROUND ) );
wxString pro_dir = Prj().GetProjectFullName(); wxString pro_dir = Prj().GetProjectFullName();
...@@ -765,7 +780,6 @@ void LIB_EDIT_FRAME::SaveSettings( wxConfigBase* aCfg ) ...@@ -765,7 +780,6 @@ void LIB_EDIT_FRAME::SaveSettings( wxConfigBase* aCfg )
wxConfigPathChanger cpc( aCfg, m_configPath ); wxConfigPathChanger cpc( aCfg, m_configPath );
aCfg->Write( libeditdrawBgColorEntry, ColorGetName( GetDrawBgColor() ) );
aCfg->Write( lastLibExportPathEntry, m_lastLibExportPath ); aCfg->Write( lastLibExportPathEntry, m_lastLibExportPath );
aCfg->Write( lastLibImportPathEntry, m_lastLibImportPath ); aCfg->Write( lastLibImportPathEntry, m_lastLibImportPath );
aCfg->Write( DefaultPinLengthEntry, (long) GetDefaultPinLength() ); aCfg->Write( DefaultPinLengthEntry, (long) GetDefaultPinLength() );
......
...@@ -36,8 +36,12 @@ class SCH_SHEET; ...@@ -36,8 +36,12 @@ class SCH_SHEET;
#define GR_DEFAULT_DRAWMODE GR_COPY #define GR_DEFAULT_DRAWMODE GR_COPY
// this enum is for color management // this enum is for color management
// Using here "LAYER" in name is due to historical reasons.
// Eeschema does not actually use layers. It just uses "LAYER_XX" as identifier
// mainly for item color
typedef enum { typedef enum {
LAYER_WIRE, LAYER_FIRST,
LAYER_WIRE = LAYER_FIRST,
LAYER_BUS, LAYER_BUS,
LAYER_JUNCTION, LAYER_JUNCTION,
LAYER_LOCLABEL, LAYER_LOCLABEL,
...@@ -61,12 +65,13 @@ typedef enum { ...@@ -61,12 +65,13 @@ typedef enum {
LAYER_ERC_ERR, LAYER_ERC_ERR,
LAYER_DEVICE_BACKGROUND, LAYER_DEVICE_BACKGROUND,
LAYER_GRID, LAYER_GRID,
NB_SCH_LAYERS LAYER_BACKGROUND,
} LayerNumber; LAYERSCH_ID_COUNT
} LAYERSCH_ID;
inline LayerNumber operator++( LayerNumber& a ) inline LAYERSCH_ID operator++( LAYERSCH_ID& a )
{ {
a = LayerNumber( int( a ) + 1 ); a = LAYERSCH_ID( int( a ) + 1 );
return a; return a;
} }
...@@ -104,7 +109,8 @@ void SetDefaultTextSize( int aSize ); ...@@ -104,7 +109,8 @@ void SetDefaultTextSize( int aSize );
int GetDefaultBusThickness(); int GetDefaultBusThickness();
void SetDefaultBusThickness( int aThickness ); void SetDefaultBusThickness( int aThickness );
EDA_COLOR_T GetLayerColor( LayerNumber aLayer ); EDA_COLOR_T GetLayerColor( LAYERSCH_ID aLayer );
void SetLayerColor( EDA_COLOR_T aColor, LAYERSCH_ID aLayer );
// Color to draw selected items // Color to draw selected items
EDA_COLOR_T GetItemSelectedColor(); EDA_COLOR_T GetItemSelectedColor();
...@@ -112,6 +118,4 @@ EDA_COLOR_T GetItemSelectedColor(); ...@@ -112,6 +118,4 @@ EDA_COLOR_T GetItemSelectedColor();
// Color to draw items flagged invisible, in libedit (they are invisible in Eeschema // Color to draw items flagged invisible, in libedit (they are invisible in Eeschema
EDA_COLOR_T GetInvisibleItemColor(); EDA_COLOR_T GetInvisibleItemColor();
void SetLayerColor( EDA_COLOR_T aColor, int aLayer );
#endif // _GENERAL_H_ #endif // _GENERAL_H_
...@@ -35,7 +35,6 @@ SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, ...@@ -35,7 +35,6 @@ SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent,
EDA_DRAW_FRAME( aKiway, aParent, aWindowType, aTitle, aPosition, EDA_DRAW_FRAME( aKiway, aParent, aWindowType, aTitle, aPosition,
aSize, aStyle, aFrameName ) aSize, aStyle, aFrameName )
{ {
SetDrawBgColor( WHITE ); // the background color of the draw canvas, BLACK or WHITE
} }
...@@ -47,6 +46,18 @@ void SCH_BASE_FRAME::OnOpenLibraryViewer( wxCommandEvent& event ) ...@@ -47,6 +46,18 @@ void SCH_BASE_FRAME::OnOpenLibraryViewer( wxCommandEvent& event )
viewlibFrame->Raise(); viewlibFrame->Raise();
} }
// Virtual from EDA_DRAW_FRAME
EDA_COLOR_T SCH_BASE_FRAME::GetDrawBgColor() const
{
return GetLayerColor( LAYER_BACKGROUND );
}
void SCH_BASE_FRAME::SetDrawBgColor( EDA_COLOR_T aColor)
{
m_drawBgColor= aColor;
SetLayerColor( aColor, LAYER_BACKGROUND );
}
SCH_SCREEN* SCH_BASE_FRAME::GetScreen() const SCH_SCREEN* SCH_BASE_FRAME::GetScreen() const
{ {
......
...@@ -504,7 +504,7 @@ bool SCH_SCREEN::Save( FILE* aFile ) const ...@@ -504,7 +504,7 @@ bool SCH_SCREEN::Save( FILE* aFile ) const
} }
// This section is not used, but written for file compatibility // This section is not used, but written for file compatibility
if( fprintf( aFile, "EELAYER %d %d\n", NB_SCH_LAYERS, 0 ) < 0 if( fprintf( aFile, "EELAYER %d %d\n", LAYERSCH_ID_COUNT, 0 ) < 0
|| fprintf( aFile, "EELAYER END\n" ) < 0 ) || fprintf( aFile, "EELAYER END\n" ) < 0 )
return false; return false;
......
...@@ -507,13 +507,13 @@ void LIB_VIEW_FRAME::LoadSettings( wxConfigBase* aCfg ) ...@@ -507,13 +507,13 @@ void LIB_VIEW_FRAME::LoadSettings( wxConfigBase* aCfg )
{ {
EDA_DRAW_FRAME::LoadSettings( aCfg ); EDA_DRAW_FRAME::LoadSettings( aCfg );
wxConfigPathChanger cpc( aCfg, m_configPath ); SetGridColor( GetLayerColor( LAYER_GRID ) );
SetDrawBgColor( GetLayerColor( LAYER_BACKGROUND ) );
EDA_COLOR_T itmp = ColorByName( aCfg->Read( LIBVIEW_BGCOLOR, wxT( "WHITE" ) ) ); wxConfigPathChanger cpc( aCfg, m_configPath );
SetDrawBgColor( itmp );
aCfg->Read( LIBLIST_WIDTH_KEY, &m_libListWidth, 100 ); aCfg->Read( LIBLIST_WIDTH_KEY, &m_libListWidth, 150 );
aCfg->Read( CMPLIST_WIDTH_KEY, &m_cmpListWidth, 100 ); aCfg->Read( CMPLIST_WIDTH_KEY, &m_cmpListWidth, 150 );
// Set parameters to a reasonable value. // Set parameters to a reasonable value.
if( m_libListWidth > m_FrameSize.x/2 ) if( m_libListWidth > m_FrameSize.x/2 )
...@@ -538,7 +538,6 @@ void LIB_VIEW_FRAME::SaveSettings( wxConfigBase* aCfg ) ...@@ -538,7 +538,6 @@ void LIB_VIEW_FRAME::SaveSettings( wxConfigBase* aCfg )
m_cmpListWidth = m_cmpList->GetSize().x; m_cmpListWidth = m_cmpList->GetSize().x;
aCfg->Write( CMPLIST_WIDTH_KEY, m_cmpListWidth ); aCfg->Write( CMPLIST_WIDTH_KEY, m_cmpListWidth );
aCfg->Write( LIBVIEW_BGCOLOR, ColorGetName( GetDrawBgColor() ) );
} }
......
...@@ -60,9 +60,9 @@ protected: ...@@ -60,9 +60,9 @@ protected:
int m_LastGridSizeId; // the command id offset (>= 0) of the last selected grid int m_LastGridSizeId; // the command id offset (>= 0) of the last selected grid
// 0 is for the grid corresponding to // 0 is for the grid corresponding to
// a wxCommand ID = ID_POPUP_GRID_LEVEL_1000. // a wxCommand ID = ID_POPUP_GRID_LEVEL_1000.
bool m_DrawGrid; // hide/Show grid bool m_drawGrid; // hide/Show grid
bool m_showPageLimits; ///< true to display the page limits bool m_showPageLimits; ///< true to display the page limits
EDA_COLOR_T m_GridColor; // Grid color EDA_COLOR_T m_gridColor; // Grid color
EDA_COLOR_T m_drawBgColor; ///< the background color of the draw canvas EDA_COLOR_T m_drawBgColor; ///< the background color of the draw canvas
///< BLACK for Pcbnew, BLACK or WHITE for eeschema ///< BLACK for Pcbnew, BLACK or WHITE for eeschema
...@@ -258,8 +258,16 @@ public: ...@@ -258,8 +258,16 @@ public:
virtual void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ) = 0; virtual void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ) = 0;
// the background color of the draw canvas: // the background color of the draw canvas:
EDA_COLOR_T GetDrawBgColor() const { return m_drawBgColor; } // Virtual because some frames can have a specific way to get/set the bg color
void SetDrawBgColor( EDA_COLOR_T aColor) { m_drawBgColor= aColor ; } /**
* @return the EDA_COLOR_T for the canvas background
*/
virtual EDA_COLOR_T GetDrawBgColor() const { return m_drawBgColor; }
/**
* @param aColor: the EDA_COLOR_T for the canvas background
*/
virtual void SetDrawBgColor( EDA_COLOR_T aColor) { m_drawBgColor= aColor ; }
int GetCursorShape() const { return m_cursorShape; } int GetCursorShape() const { return m_cursorShape; }
...@@ -355,7 +363,7 @@ public: ...@@ -355,7 +363,7 @@ public:
*/ */
virtual bool IsGridVisible() const virtual bool IsGridVisible() const
{ {
return m_DrawGrid; return m_drawGrid;
} }
/** /**
...@@ -365,7 +373,7 @@ public: ...@@ -365,7 +373,7 @@ public:
*/ */
virtual void SetGridVisibility( bool aVisible ) virtual void SetGridVisibility( bool aVisible )
{ {
m_DrawGrid = aVisible; m_drawGrid = aVisible;
} }
/** /**
...@@ -374,7 +382,7 @@ public: ...@@ -374,7 +382,7 @@ public:
*/ */
virtual EDA_COLOR_T GetGridColor() const virtual EDA_COLOR_T GetGridColor() const
{ {
return m_GridColor; return m_gridColor;
} }
/** /**
...@@ -383,7 +391,7 @@ public: ...@@ -383,7 +391,7 @@ public:
*/ */
virtual void SetGridColor( EDA_COLOR_T aColor ) virtual void SetGridColor( EDA_COLOR_T aColor )
{ {
m_GridColor = aColor; m_gridColor = aColor;
} }
/** /**
......
...@@ -68,6 +68,11 @@ public: ...@@ -68,6 +68,11 @@ public:
} }
void SetGridOrigin( const wxPoint& aPoint ) {} // overload EDA_DRAW_FRAME void SetGridOrigin( const wxPoint& aPoint ) {} // overload EDA_DRAW_FRAME
// Virtual from EDA_DRAW_FRAME
// the background color of the draw canvas:
EDA_COLOR_T GetDrawBgColor() const;
void SetDrawBgColor( EDA_COLOR_T aColor);
const TITLE_BLOCK& GetTitleBlock() const; // overload EDA_DRAW_FRAME const TITLE_BLOCK& GetTitleBlock() const; // overload EDA_DRAW_FRAME
void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ); // overload EDA_DRAW_FRAME void SetTitleBlock( const TITLE_BLOCK& aTitleBlock ); // overload EDA_DRAW_FRAME
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#include <general.h> #include <general.h>
#include <boost/ptr_container/ptr_vector.hpp> #include <boost/ptr_container/ptr_vector.hpp>
class SCH_ITEM; class SCH_ITEM;
class SCH_SHEET_PATH; class SCH_SHEET_PATH;
class LINE_READER; class LINE_READER;
...@@ -115,7 +115,7 @@ public: ...@@ -115,7 +115,7 @@ public:
class SCH_ITEM : public EDA_ITEM class SCH_ITEM : public EDA_ITEM
{ {
protected: protected:
LayerNumber m_Layer; LAYERSCH_ID m_Layer;
EDA_ITEMS m_connections; ///< List of items connected to this item. EDA_ITEMS m_connections; ///< List of items connected to this item.
public: public:
...@@ -145,14 +145,14 @@ public: ...@@ -145,14 +145,14 @@ public:
* Function GetLayer * Function GetLayer
* returns the layer this item is on. * returns the layer this item is on.
*/ */
LayerNumber GetLayer() const { return m_Layer; } LAYERSCH_ID GetLayer() const { return m_Layer; }
/** /**
* Function SetLayer * Function SetLayer
* sets the layer this item is on. * sets the layer this item is on.
* @param aLayer The layer number. * @param aLayer The layer number.
*/ */
void SetLayer( LayerNumber aLayer ) { m_Layer = aLayer; } void SetLayer( LAYERSCH_ID aLayer ) { m_Layer = aLayer; }
/** /**
* Function GetPenSize virtual pure * Function GetPenSize virtual pure
...@@ -293,7 +293,7 @@ public: ...@@ -293,7 +293,7 @@ public:
bool IsConnected( const wxPoint& aPoint ) const; bool IsConnected( const wxPoint& aPoint ) const;
/** @copydoc EDA_ITEM::HitTest(const wxPoint&) */ /** @copydoc EDA_ITEM::HitTest(const wxPoint&) */
virtual bool HitTest( const wxPoint& aPosition ) const virtual bool HitTest( const wxPoint& aPosition ) const
{ {
return HitTest( aPosition, 0 ); return HitTest( aPosition, 0 );
} }
......
...@@ -514,6 +514,19 @@ public: ...@@ -514,6 +514,19 @@ public:
*/ */
void ReCreateLayerBox( bool aForceResizeToolbar = true ); void ReCreateLayerBox( bool aForceResizeToolbar = true );
/**
* Function SetCurrentNetClass
* Must be called after a netclass selection (or after a netclass parameter change
* calls BOARD_DESIGN_SETTINGS::SetCurrentNetClass() and update trace width and via size
* combo boxes on main toolbar
* Initialize vias and tracks values displayed in comb boxes of the auxiliary toolbar
* and some others parameters (netclass name ....)
* @param aNetClassName = the new netclass name
* @return true if lists of tracks and vias sizes are modified
*/
bool SetCurrentNetClass( const wxString& aNetClassName );
/** /**
* Function OnModify * Function OnModify
* must be called after a board change to set the modified flag. * must be called after a board change to set the modified flag.
......
...@@ -166,6 +166,7 @@ set( PCBNEW_CLASS_SRCS ...@@ -166,6 +166,7 @@ set( PCBNEW_CLASS_SRCS
modview_frame.cpp modview_frame.cpp
pcbframe.cpp pcbframe.cpp
pcb_base_edit_frame.cpp pcb_base_edit_frame.cpp
append_board_to_current.cpp
attribut.cpp attribut.cpp
board_items_to_polygon_shape_transform.cpp board_items_to_polygon_shape_transform.cpp
board_undo_redo.cpp board_undo_redo.cpp
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004-2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 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 append_board_to_current.cpp
* @brief append a board to the currently edited board.
*/
#include <fctsys.h>
#include <confirm.h>
#include <wxPcbStruct.h>
#include <pcbnew.h>
#include <io_mgr.h>
#include <class_module.h>
#include <class_zone.h>
#include <class_board.h>
#include <pcb_draw_panel_gal.h>
// Defined in files.cpp:
extern IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl );
bool PCB_EDIT_FRAME::AppendBoardFile( const wxString& aFullFileName, int aCtl )
{
IO_MGR::PCB_FILE_T pluginType = plugin_type( aFullFileName, aCtl );
PLUGIN::RELEASER pi( IO_MGR::PluginFind( pluginType ) );
// keep trace of existing items, in order to know what are the new items
// (for undo command for instance)
// Tracks are inserted, not append, so mark existing tracks to know what are
// the new tracks
for( TRACK* track = GetBoard()->m_Track; track; track = track->Next() )
track->SetFlags( FLAG0 );
// Other items are append to the item list, so keep trace to the
// last existing item is enough
MODULE* module = GetBoard()->m_Modules.GetLast();
BOARD_ITEM* drawing = GetBoard()->m_Drawings.GetLast();
int zonescount = GetBoard()->GetAreaCount();
// Keep also the count of copper layers, because we can happen boards
// with different copper layers counts,
// and the enabled layers
int initialCopperLayerCount = GetBoard()->GetCopperLayerCount();
LSET initialEnabledLayers = GetBoard()->GetEnabledLayers();
try
{
PROPERTIES props;
char xbuf[30];
char ybuf[30];
// EAGLE_PLUGIN can use this info to center the BOARD, but it does not yet.
sprintf( xbuf, "%d", GetPageSizeIU().x );
sprintf( ybuf, "%d", GetPageSizeIU().y );
props["page_width"] = xbuf;
props["page_height"] = ybuf;
GetDesignSettings().m_NetClasses.Clear();
pi->Load( aFullFileName, GetBoard(), &props );
}
catch( const IO_ERROR& ioe )
{
for( TRACK* track = GetBoard()->m_Track; track; track = track->Next() )
track->ClearFlags( FLAG0 );
wxString msg = wxString::Format( _(
"Error loading board.\n%s" ),
GetChars( ioe.errorText )
);
DisplayError( this, msg );
return false;
}
// Now prepare a block move command to place the new items, and
// prepare the undo command.
BLOCK_SELECTOR& blockmove = GetScreen()->m_BlockLocate;
HandleBlockBegin( NULL, BLOCK_PRESELECT_MOVE, wxPoint( 0, 0) );
PICKED_ITEMS_LIST& blockitemsList = blockmove.GetItems();
PICKED_ITEMS_LIST undoListPicker;
ITEM_PICKER picker( NULL, UR_NEW );
EDA_RECT bbox; // the new items bounding box, for block move
bool bboxInit = true; // true until the bounding box is initialized
for( TRACK* track = GetBoard()->m_Track; track; track = track->Next() )
{
if( track->GetFlags() & FLAG0 )
{
track->ClearFlags( FLAG0 );
continue;
}
track->SetFlags( IS_MOVED );
picker.SetItem( track );
undoListPicker.PushItem( picker );
blockitemsList.PushItem( picker );
if( bboxInit )
bbox = track->GetBoundingBox();
else
bboxInit = false;
bbox.Merge(track->GetBoundingBox() );
}
if( module )
module = module->Next();
else
module = GetBoard()->m_Modules;
for( ; module; module = module->Next() )
{
module->SetFlags( IS_MOVED );
picker.SetItem( module );
undoListPicker.PushItem( picker );
blockitemsList.PushItem( picker );
if( bboxInit )
bbox = module->GetBoundingBox();
else
bbox.Merge(module->GetBoundingBox() );
bboxInit = false;
}
if( drawing )
drawing = drawing->Next();
else
drawing = GetBoard()->m_Drawings;
for( ; drawing; drawing = drawing->Next() )
{
drawing->SetFlags( IS_MOVED );
picker.SetItem( drawing );
undoListPicker.PushItem( picker );
blockitemsList.PushItem( picker );
if( bboxInit )
bbox = drawing->GetBoundingBox();
else
bbox.Merge(drawing->GetBoundingBox() );
bboxInit = false;
}
for( ZONE_CONTAINER* zone = GetBoard()->GetArea( zonescount ); zone;
zone = GetBoard()->GetArea( zonescount ) )
{
zone->SetFlags( IS_MOVED );
picker.SetItem( zone );
undoListPicker.PushItem( picker );
blockitemsList.PushItem( picker );
zonescount++;
if( bboxInit )
bbox = zone->GetBoundingBox();
else
bbox.Merge(zone->GetBoundingBox() );
bboxInit = false;
}
SaveCopyInUndoList( undoListPicker, UR_NEW );
// we should not ask PLUGINs to do these items:
int copperLayerCount = GetBoard()->GetCopperLayerCount();
if( copperLayerCount > initialCopperLayerCount )
GetBoard()->SetCopperLayerCount( copperLayerCount );
// Enable all used layers, and make them visible:
LSET enabledLayers = GetBoard()->GetEnabledLayers();
enabledLayers |= initialEnabledLayers;
GetBoard()->SetEnabledLayers( enabledLayers );
GetBoard()->SetVisibleLayers( enabledLayers );
ReCreateLayerBox();
ReFillLayerWidget();
if( IsGalCanvasActive() )
static_cast<PCB_DRAW_PANEL_GAL*>( GetGalCanvas() )->SyncLayersVisibility( GetBoard() );
GetBoard()->BuildListOfNets();
GetBoard()->SynchronizeNetsAndNetClasses();
SetStatusText( wxEmptyString );
BestZoom();
// Finish block move command:
wxPoint cpos = GetNearestGridPosition( bbox.Centre() );
blockmove.SetOrigin( bbox.GetOrigin() );
blockmove.SetSize( bbox.GetSize() );
blockmove.SetLastCursorPosition( cpos );
HandleBlockEnd( NULL );
return true;
}
...@@ -185,7 +185,7 @@ int PCB_EDIT_FRAME::BlockCommand( int aKey ) ...@@ -185,7 +185,7 @@ int PCB_EDIT_FRAME::BlockCommand( int aKey )
switch( aKey ) switch( aKey )
{ {
default: default:
cmd = aKey & 0x255; cmd = aKey & 0xFF;
break; break;
case 0: case 0:
...@@ -219,6 +219,8 @@ int PCB_EDIT_FRAME::BlockCommand( int aKey ) ...@@ -219,6 +219,8 @@ int PCB_EDIT_FRAME::BlockCommand( int aKey )
void PCB_EDIT_FRAME::HandleBlockPlace( wxDC* DC ) void PCB_EDIT_FRAME::HandleBlockPlace( wxDC* DC )
{ {
GetBoard()->m_Status_Pcb &= ~DO_NOT_SHOW_GENERAL_RASTNEST;
if( !m_canvas->IsMouseCaptured() ) if( !m_canvas->IsMouseCaptured() )
{ {
DisplayError( this, wxT( "Error in HandleBlockPLace : m_mouseCaptureCallback = NULL" ) ); DisplayError( this, wxT( "Error in HandleBlockPLace : m_mouseCaptureCallback = NULL" ) );
...@@ -274,7 +276,6 @@ bool PCB_EDIT_FRAME::HandleBlockEnd( wxDC* DC ) ...@@ -274,7 +276,6 @@ bool PCB_EDIT_FRAME::HandleBlockEnd( wxDC* DC )
{ {
bool nextcmd = false; // Will be set to true if a block place is needed bool nextcmd = false; // Will be set to true if a block place is needed
bool cancelCmd = false; bool cancelCmd = false;
// If coming here after cancel block, clean up and exit // If coming here after cancel block, clean up and exit
if( GetScreen()->m_BlockLocate.GetState() == STATE_NO_BLOCK ) if( GetScreen()->m_BlockLocate.GetState() == STATE_NO_BLOCK )
{ {
...@@ -369,6 +370,7 @@ bool PCB_EDIT_FRAME::HandleBlockEnd( wxDC* DC ) ...@@ -369,6 +370,7 @@ bool PCB_EDIT_FRAME::HandleBlockEnd( wxDC* DC )
if( ! nextcmd ) if( ! nextcmd )
{ {
GetBoard()->m_Status_Pcb |= DO_NOT_SHOW_GENERAL_RASTNEST;
GetScreen()->ClearBlockCommand(); GetScreen()->ClearBlockCommand();
m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString,
false ); false );
...@@ -562,6 +564,10 @@ static void drawMovingBlock( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a ...@@ -562,6 +564,10 @@ static void drawMovingBlock( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a
{ {
BASE_SCREEN* screen = aPanel->GetScreen(); BASE_SCREEN* screen = aPanel->GetScreen();
// do not show local module rastnest in block move, it is not usable.
bool tmp = g_Show_Module_Ratsnest;
g_Show_Module_Ratsnest = false;
if( aErase ) if( aErase )
{ {
if( screen->m_BlockLocate.GetMoveVector().x || screen->m_BlockLocate.GetMoveVector().y ) if( screen->m_BlockLocate.GetMoveVector().x || screen->m_BlockLocate.GetMoveVector().y )
...@@ -589,6 +595,8 @@ static void drawMovingBlock( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a ...@@ -589,6 +595,8 @@ static void drawMovingBlock( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a
if( blockDrawItems ) if( blockDrawItems )
drawPickedItems( aPanel, aDC, screen->m_BlockLocate.GetMoveVector() ); drawPickedItems( aPanel, aDC, screen->m_BlockLocate.GetMoveVector() );
} }
g_Show_Module_Ratsnest = tmp;
} }
...@@ -795,6 +803,7 @@ void PCB_EDIT_FRAME::Block_Move() ...@@ -795,6 +803,7 @@ void PCB_EDIT_FRAME::Block_Move()
BOARD_ITEM* item = (BOARD_ITEM*) itemsList->GetPickedItem( ii ); BOARD_ITEM* item = (BOARD_ITEM*) itemsList->GetPickedItem( ii );
itemsList->SetPickedItemStatus( UR_MOVED, ii ); itemsList->SetPickedItemStatus( UR_MOVED, ii );
item->Move( MoveVector ); item->Move( MoveVector );
item->ClearFlags( IS_MOVED );
switch( item->Type() ) switch( item->Type() )
{ {
......
...@@ -80,7 +80,7 @@ int FOOTPRINT_EDIT_FRAME::BlockCommand( int key ) ...@@ -80,7 +80,7 @@ int FOOTPRINT_EDIT_FRAME::BlockCommand( int key )
switch( key ) switch( key )
{ {
default: default:
cmd = key & 0x255; cmd = key & 0xFF;
break; break;
case - 1: case - 1:
...@@ -400,6 +400,11 @@ void CopyMarkedItems( MODULE* module, wxPoint offset ) ...@@ -400,6 +400,11 @@ void CopyMarkedItems( MODULE* module, wxPoint offset )
if( module == NULL ) if( module == NULL )
return; return;
// Reference and value cannot be copied, they are unique.
// Ensure they are not selected
module->Reference().ClearFlags();
module->Value().ClearFlags();
for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() ) for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() )
{ {
if( !pad->IsSelected() ) if( !pad->IsSelected() )
...@@ -440,6 +445,12 @@ void MoveMarkedItems( MODULE* module, wxPoint offset ) ...@@ -440,6 +445,12 @@ void MoveMarkedItems( MODULE* module, wxPoint offset )
if( module == NULL ) if( module == NULL )
return; return;
if( module->Reference().IsSelected() )
module->Reference().MoveTransformWithModule( offset );
if( module->Value().IsSelected() )
module->Value().MoveTransformWithModule( offset );
D_PAD* pad = module->Pads(); D_PAD* pad = module->Pads();
for( ; pad != NULL; pad = pad->Next() ) for( ; pad != NULL; pad = pad->Next() )
...@@ -461,7 +472,7 @@ void MoveMarkedItems( MODULE* module, wxPoint offset ) ...@@ -461,7 +472,7 @@ void MoveMarkedItems( MODULE* module, wxPoint offset )
switch( item->Type() ) switch( item->Type() )
{ {
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
static_cast<TEXTE_MODULE*>( item )->Move( offset ); static_cast<TEXTE_MODULE*>( item )->MoveTransformWithModule( offset );
break; break;
case PCB_MODULE_EDGE_T: case PCB_MODULE_EDGE_T:
...@@ -477,9 +488,9 @@ void MoveMarkedItems( MODULE* module, wxPoint offset ) ...@@ -477,9 +488,9 @@ void MoveMarkedItems( MODULE* module, wxPoint offset )
default: default:
; ;
} }
item->ClearFlags();
} }
ClearMarkItems( module );
} }
...@@ -518,6 +529,9 @@ void DeleteMarkedItems( MODULE* module ) ...@@ -518,6 +529,9 @@ void DeleteMarkedItems( MODULE* module )
item->DeleteStructure(); item->DeleteStructure();
} }
// Ref and value can be flagged, but cannot be deleted
ClearMarkItems( module );
} }
...@@ -534,6 +548,12 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset, bool force_all ) ...@@ -534,6 +548,12 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset, bool force_all )
if( module == NULL ) if( module == NULL )
return; return;
if( module->Reference().IsSelected() || force_all )
module->Reference().MirrorTransformWithModule( offset.x );
if( module->Value().IsSelected() || force_all )
module->Value().MirrorTransformWithModule( offset.x );
for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() ) for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() )
{ {
// Skip pads not selected, i.e. not inside the block to mirror: // Skip pads not selected, i.e. not inside the block to mirror:
...@@ -584,15 +604,15 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset, bool force_all ) ...@@ -584,15 +604,15 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset, bool force_all )
break; break;
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
static_cast<TEXTE_MODULE*>( item )->MirrorWithModule( offset.x ); static_cast<TEXTE_MODULE*>( item )->MirrorTransformWithModule( offset.x );
break; break;
default: default:
break; break;
} }
item->ClearFlags();
} }
ClearMarkItems( module );
} }
...@@ -607,6 +627,12 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all ) ...@@ -607,6 +627,12 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all )
if( module == NULL ) if( module == NULL )
return; return;
if( module->Reference().IsSelected() || force_all )
module->Reference().RotateTransformWithModule( offset, 900 );
if( module->Value().IsSelected() || force_all )
module->Value().RotateTransformWithModule( offset, 900 );
for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() ) for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() )
{ {
if( !pad->IsSelected() && !force_all ) if( !pad->IsSelected() && !force_all )
...@@ -622,7 +648,7 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all ) ...@@ -622,7 +648,7 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all )
for( EDA_ITEM* item = module->GraphicalItems(); item; item = item->Next() ) for( EDA_ITEM* item = module->GraphicalItems(); item; item = item->Next() )
{ {
if( !item->IsSelected() && !force_all) if( !item->IsSelected() && !force_all )
continue; continue;
switch( item->Type() ) switch( item->Type() )
...@@ -644,26 +670,27 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all ) ...@@ -644,26 +670,27 @@ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all )
break; break;
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
static_cast<TEXTE_MODULE*>( item )->RotateWithModule( wxPoint( 0, 0 ), 900 ); static_cast<TEXTE_MODULE*>( item )->RotateTransformWithModule( offset, 900 );
break; break;
default: default:
break; break;
} }
item->ClearFlags();
} }
ClearMarkItems( module );
} }
void ClearMarkItems( MODULE* module ) void ClearMarkItems( MODULE* module )
{ {
EDA_ITEM* item;
if( module == NULL ) if( module == NULL )
return; return;
item = module->GraphicalItems(); module->Reference().ClearFlags();
module->Value().ClearFlags();
EDA_ITEM* item = module->GraphicalItems();
for( ; item != NULL; item = item->Next() ) for( ; item != NULL; item = item->Next() )
{ {
...@@ -692,6 +719,24 @@ int MarkItemsInBloc( MODULE* module, EDA_RECT& Rect ) ...@@ -692,6 +719,24 @@ int MarkItemsInBloc( MODULE* module, EDA_RECT& Rect )
if( module == NULL ) if( module == NULL )
return 0; return 0;
ClearMarkItems( module ); // Just in case ...
pos = module->Reference().GetTextPosition();
if( Rect.Contains( pos ) )
{
module->Reference().SetFlags( SELECTED );
ItemsCount++;
}
pos = module->Value().GetTextPosition();
if( Rect.Contains( pos ) )
{
module->Value().SetFlags( SELECTED );
ItemsCount++;
}
pad = module->Pads(); pad = module->Pads();
for( ; pad != NULL; pad = pad->Next() ) for( ; pad != NULL; pad = pad->Next() )
......
...@@ -130,7 +130,6 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, ...@@ -130,7 +130,6 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
const wxPoint& offset ) const wxPoint& offset )
{ {
int ux0, uy0, dx, dy, radius, StAngle, EndAngle; int ux0, uy0, dx, dy, radius, StAngle, EndAngle;
int type_trace;
int typeaff; int typeaff;
LAYER_ID curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer; LAYER_ID curr_layer = ( (PCB_SCREEN*) panel->GetScreen() )->m_Active_Layer;
...@@ -154,8 +153,6 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, ...@@ -154,8 +153,6 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
PCB_BASE_FRAME* frame = (PCB_BASE_FRAME*) panel->GetParent(); PCB_BASE_FRAME* frame = (PCB_BASE_FRAME*) panel->GetParent();
type_trace = m_Shape;
ux0 = m_Start.x - offset.x; ux0 = m_Start.x - offset.x;
uy0 = m_Start.y - offset.y; uy0 = m_Start.y - offset.y;
...@@ -176,7 +173,7 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, ...@@ -176,7 +173,7 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
if( DC->LogicalToDeviceXRel( m_Width ) <= MIN_DRAW_WIDTH ) if( DC->LogicalToDeviceXRel( m_Width ) <= MIN_DRAW_WIDTH )
typeaff = LINE; typeaff = LINE;
switch( type_trace ) switch( m_Shape )
{ {
case S_SEGMENT: case S_SEGMENT:
if( typeaff == LINE ) if( typeaff == LINE )
...@@ -245,10 +242,9 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, ...@@ -245,10 +242,9 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
break; break;
case S_POLYGON: case S_POLYGON:
{
// We must compute true coordinates from m_PolyPoints // We must compute true coordinates from m_PolyPoints
// which are relative to module position, orientation 0 // which are relative to module position, orientation 0
std::vector<wxPoint> points = m_PolyPoints; std::vector<wxPoint> points = m_PolyPoints;
for( unsigned ii = 0; ii < points.size(); ii++ ) for( unsigned ii = 0; ii < points.size(); ii++ )
...@@ -260,6 +256,10 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode, ...@@ -260,6 +256,10 @@ void EDGE_MODULE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE draw_mode,
} }
GRPoly( panel->GetClipBox(), DC, points.size(), &points[0], true, m_Width, color, color ); GRPoly( panel->GetClipBox(), DC, points.size(), &points[0], true, m_Width, color, color );
}
break;
default:
break; break;
} }
} }
...@@ -312,3 +312,41 @@ EDA_ITEM* EDGE_MODULE::Clone() const ...@@ -312,3 +312,41 @@ EDA_ITEM* EDGE_MODULE::Clone() const
return new EDGE_MODULE( *this ); return new EDGE_MODULE( *this );
} }
void EDGE_MODULE::Flip(const wxPoint& aCentre )
{
wxPoint pt;
switch( GetShape() )
{
case S_ARC:
SetAngle( -GetAngle() );
//Fall through
default:
case S_SEGMENT:
pt = GetStart();
pt.y -= aCentre.y;
pt.y = -pt.y;
pt.y += aCentre.y;
SetStart( pt );
pt = GetEnd();
pt.y -= aCentre.y;
pt.y = -pt.y;
pt.y += aCentre.y;
SetEnd( pt );
NEGATE( m_Start0.y );
NEGATE( m_End0.y );
break;
case S_POLYGON:
// polygon corners coordinates are always relative to the
// footprint position, orientation 0
for( unsigned ii = 0; ii < m_PolyPoints.size(); ii++ )
NEGATE( m_PolyPoints[ii].y );
}
SetLayer( FlipLayer( GetLayer() ) );
}
...@@ -68,6 +68,9 @@ public: ...@@ -68,6 +68,9 @@ public:
SetLocalCoord(); SetLocalCoord();
} }
/// Flip entity relative to aCentre
void Flip( const wxPoint& aCentre );
void SetStart0( const wxPoint& aPoint ) { m_Start0 = aPoint; } void SetStart0( const wxPoint& aPoint ) { m_Start0 = aPoint; }
const wxPoint& GetStart0() const { return m_Start0; } const wxPoint& GetStart0() const { return m_Start0; }
......
...@@ -947,31 +947,7 @@ void MODULE::Flip( const wxPoint& aCentre ) ...@@ -947,31 +947,7 @@ void MODULE::Flip( const wxPoint& aCentre )
switch( item->Type() ) switch( item->Type() )
{ {
case PCB_MODULE_EDGE_T: case PCB_MODULE_EDGE_T:
{ ( (EDGE_MODULE*) item )->Flip( m_Pos );
EDGE_MODULE* em = (EDGE_MODULE*) item;
wxPoint s = em->GetStart();
s.y -= m_Pos.y;
s.y = -s.y;
s.y += m_Pos.y;
em->SetStart( s );
wxPoint e = em->GetEnd();
e.y -= m_Pos.y;
e.y = -e.y;
e.y += m_Pos.y;
em->SetEnd( e );
NEGATE( em->m_Start0.y );
NEGATE( em->m_End0.y );
if( em->GetShape() == S_ARC )
{
em->SetAngle( -em->GetAngle() );
}
em->SetLayer( FlipLayer( em->GetLayer() ) );
}
break; break;
case PCB_MODULE_TEXT_T: case PCB_MODULE_TEXT_T:
......
...@@ -105,33 +105,45 @@ void TEXTE_MODULE::Flip(const wxPoint& aCentre ) ...@@ -105,33 +105,45 @@ void TEXTE_MODULE::Flip(const wxPoint& aCentre )
void TEXTE_MODULE::FlipWithModule( int aOffset ) void TEXTE_MODULE::FlipWithModule( int aOffset )
{ {
// flipping the footprint is relative to the X axis
m_Pos.y = aOffset - (m_Pos.y - aOffset); m_Pos.y = aOffset - (m_Pos.y - aOffset);
NEGATE_AND_NORMALIZE_ANGLE_POS( m_Orient ); NEGATE_AND_NORMALIZE_ANGLE_POS( m_Orient );
wxPoint tmp = GetPos0();
tmp.y = -tmp.y;
SetPos0( tmp );
SetLayer( FlipLayer( GetLayer() ) ); SetLayer( FlipLayer( GetLayer() ) );
m_Mirror = IsBackLayer( GetLayer() ); m_Mirror = IsBackLayer( GetLayer() );
} }
void TEXTE_MODULE::MirrorWithModule( int aOffset ) void TEXTE_MODULE::MirrorTransformWithModule( int aOffset )
{ {
wxPoint tmp = GetTextPosition(); // Used in modedit, to transform the footprint
tmp.x = aOffset - (tmp.x - aOffset); // the mirror is relative to the Y axis
SetTextPosition( tmp ); // the position is mirrored, but the text itself is not mirrored
tmp.y = GetPos0().y; // Note also in module editor, m_Pos0 = m_Pos
SetPos0( tmp ); m_Pos.x = aOffset - (m_Pos.x - aOffset);
m_Pos0 = m_Pos;
NEGATE_AND_NORMALIZE_ANGLE_POS( m_Orient ); NEGATE_AND_NORMALIZE_ANGLE_POS( m_Orient );
} }
void TEXTE_MODULE::RotateWithModule( const wxPoint& aOffset, double aAngle ) void TEXTE_MODULE::RotateTransformWithModule( const wxPoint& aOffset, double aAngle )
{ {
wxPoint pos = GetTextPosition(); // Used in modedit, to transform the footprint
RotatePoint( &pos, aOffset, aAngle ); // Note also in module editor, m_Pos0 = m_Pos
SetTextPosition( pos ); RotatePoint( &m_Pos, aOffset, aAngle );
SetPos0( GetTextPosition() ); m_Pos0 = m_Pos;
SetOrientation( GetOrientation() + aAngle ); SetOrientation( GetOrientation() + aAngle );
} }
void TEXTE_MODULE::MoveTransformWithModule( const wxPoint& aMoveVector )
{
// Used in modedit, to transform the footprint
// Note also in module editor, m_Pos0 = m_Pos
m_Pos0 += aMoveVector;
m_Pos = m_Pos0;
}
void TEXTE_MODULE::Copy( TEXTE_MODULE* source ) void TEXTE_MODULE::Copy( TEXTE_MODULE* source )
{ {
......
...@@ -94,17 +94,21 @@ public: ...@@ -94,17 +94,21 @@ public:
void Flip( const wxPoint& aCentre ); void Flip( const wxPoint& aCentre );
/// Rotate entity during module rotation /// Rotate text during module rotation transform, in footprint editor
void RotateWithModule( const wxPoint& aOffset, double aAngle ); void RotateTransformWithModule( const wxPoint& aOffset, double aAngle );
/// Flip entity during module flip /// Flip entity during module flip
void FlipWithModule( int aOffset ); void FlipWithModule( int aOffset );
/// Mirror entiry during module mirroring /// Mirror text during module mirroring transform, in footprint editor
void MirrorWithModule( int aOffset ); /// the text itself is not mirrored, only position.
void MirrorTransformWithModule( int aOffset );
/// move text during module mirroring transform, in footprint editor
void MoveTransformWithModule( const wxPoint& aMoveVector );
/// @deprecated it seems (but the type is used to 'protect' /// @deprecated it seems (but the type is used to 'protect'
//reference and value from deletion, and for identification) // reference and value from deletion, and for identification)
void SetType( TEXT_TYPE aType ) { m_Type = aType; } void SetType( TEXT_TYPE aType ) { m_Type = aType; }
TEXT_TYPE GetType() const { return m_Type; } TEXT_TYPE GetType() const { return m_Type; }
......
...@@ -284,11 +284,11 @@ void DIALOG_COPPER_ZONE::initDialog() ...@@ -284,11 +284,11 @@ void DIALOG_COPPER_ZONE::initDialog()
// unfortunately this option does not work well both on // unfortunately this option does not work well both on
// wxWidgets 2.8 ( column witdth too small), and // wxWidgets 2.8 ( column witdth too small), and
// wxWidgets 2.9 ( column witdth too large) // wxWidgets 2.9 ( column witdth too large)
ctrlWidth += LAYER_BITMAP_SIZE_X + 16; // Add bitmap width + margin between bitmap and text ctrlWidth += LAYER_BITMAP_SIZE_X + 25; // Add bitmap width + margin between bitmap and text
m_LayerSelectionCtrl->SetColumnWidth( 0, ctrlWidth ); m_LayerSelectionCtrl->SetColumnWidth( 0, ctrlWidth );
ctrlWidth += 4; // add small margin between text and window borders ctrlWidth += 25; // add small margin between text and window borders
// and room for vertical scroll bar
m_LayerSelectionCtrl->SetMinSize( wxSize( ctrlWidth, -1 ) ); m_LayerSelectionCtrl->SetMinSize( wxSize( ctrlWidth, -1 ) );
wxString netNameDoNotShowFilter = wxT( "Net-*" ); wxString netNameDoNotShowFilter = wxT( "Net-*" );
......
...@@ -143,13 +143,15 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init() ...@@ -143,13 +143,15 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init()
wxImageList* imageList = new wxImageList( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y ); wxImageList* imageList = new wxImageList( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y );
m_LayerSelectionCtrl->AssignImageList( imageList, wxIMAGE_LIST_SMALL ); m_LayerSelectionCtrl->AssignImageList( imageList, wxIMAGE_LIST_SMALL );
int ii = 0;
int lyrSelect = ( (PCB_SCREEN*) m_parent->GetScreen() )->m_Active_Layer; int lyrSelect = ( (PCB_SCREEN*) m_parent->GetScreen() )->m_Active_Layer;
if( m_zone ) if( m_zone )
lyrSelect = m_zone->GetLayer(); lyrSelect = m_zone->GetLayer();
for( LSEQ seq = LSET::AllNonCuMask().Seq(); seq; ++seq, ++ii ) int ctrlWidth = 0; // Min width for m_LayerSelectionCtrl to show the layers names
int imgIdx = 0;
for( LSEQ seq = LSET::AllNonCuMask().Seq(); seq; ++seq, ++imgIdx )
{ {
LAYER_ID layer = *seq; LAYER_ID layer = *seq;
...@@ -160,11 +162,25 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init() ...@@ -160,11 +162,25 @@ void DIALOG_NON_COPPER_ZONES_EDITOR::Init()
msg.Trim(); msg.Trim();
int itemIndex = m_LayerSelectionCtrl->InsertItem( int itemIndex = m_LayerSelectionCtrl->InsertItem(
m_LayerSelectionCtrl->GetItemCount(), msg, ii ); m_LayerSelectionCtrl->GetItemCount(), msg, imgIdx );
if(lyrSelect == layer ) if(lyrSelect == layer )
m_LayerSelectionCtrl->Select( itemIndex ); m_LayerSelectionCtrl->Select( itemIndex );
wxSize tsize( GetTextSize( msg, m_LayerSelectionCtrl ) );
ctrlWidth = std::max( ctrlWidth, tsize.x );
} }
// The most easy way to ensure the right size is to use wxLIST_AUTOSIZE
// unfortunately this option does not work well both on
// wxWidgets 2.8 ( column witdth too small), and
// wxWidgets 2.9 ( column witdth too large)
ctrlWidth += LAYER_BITMAP_SIZE_X + 25; // Add bitmap width + margin between bitmap and text
m_LayerSelectionCtrl->SetColumnWidth( 0, ctrlWidth );
ctrlWidth += 25; // add small margin between text and window borders
// and room for vertical scroll bar
m_LayerSelectionCtrl->SetMinSize( wxSize( ctrlWidth, -1 ) );
} }
......
...@@ -167,7 +167,7 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC ) ...@@ -167,7 +167,7 @@ TRACK* PCB_EDIT_FRAME::Begin_Route( TRACK* aTrack, wxDC* aDC )
// Display info about track Net class, and init track and vias sizes: // Display info about track Net class, and init track and vias sizes:
g_CurrentTrackSegment->SetNetCode( GetBoard()->GetHighLightNetCode() ); g_CurrentTrackSegment->SetNetCode( GetBoard()->GetHighLightNetCode() );
GetDesignSettings().SetCurrentNetClass( g_CurrentTrackSegment->GetNetClassName() ); SetCurrentNetClass( g_CurrentTrackSegment->GetNetClassName() );
g_CurrentTrackSegment->SetLayer( GetScreen()->m_Active_Layer ); g_CurrentTrackSegment->SetLayer( GetScreen()->m_Active_Layer );
g_CurrentTrackSegment->SetWidth( GetDesignSettings().GetCurrentTrackWidth() ); g_CurrentTrackSegment->SetWidth( GetDesignSettings().GetCurrentTrackWidth() );
......
...@@ -69,10 +69,11 @@ static const wxChar autosavePrefix[] = wxT( "_autosave-" ); ...@@ -69,10 +69,11 @@ static const wxChar autosavePrefix[] = wxT( "_autosave-" );
* @param aCtl is where to put the OpenProjectFiles() control bits. * @param aCtl is where to put the OpenProjectFiles() control bits.
* *
* @param aFileName on entry is a probable choice, on return is the chosen filename. * @param aFileName on entry is a probable choice, on return is the chosen filename.
* @param aKicadFilesOnly true to list kiacad pcb files plugins only, false to list all plugins.
* *
* @return bool - true if chosen, else false if user aborted. * @return bool - true if chosen, else false if user aborted.
*/ */
bool AskLoadBoardFileName( wxWindow* aParent, int* aCtl, wxString* aFileName ) bool AskLoadBoardFileName( wxWindow* aParent, int* aCtl, wxString* aFileName, bool aKicadFilesOnly = false )
{ {
// This is a subset of all PLUGINs which are trusted to be able to // This is a subset of all PLUGINs which are trusted to be able to
// load a BOARD. User may occasionally use the wrong plugin to load a // load a BOARD. User may occasionally use the wrong plugin to load a
...@@ -93,7 +94,9 @@ bool AskLoadBoardFileName( wxWindow* aParent, int* aCtl, wxString* aFileName ) ...@@ -93,7 +94,9 @@ bool AskLoadBoardFileName( wxWindow* aParent, int* aCtl, wxString* aFileName )
wxFileName fileName( *aFileName ); wxFileName fileName( *aFileName );
wxString fileFilters; wxString fileFilters;
for( unsigned i=0; i<DIM( loaders ); ++i ) unsigned pluginsCount = aKicadFilesOnly ? 2 : DIM( loaders );
for( unsigned i=0; i < pluginsCount; ++i )
{ {
if( i > 0 ) if( i > 0 )
fileFilters += wxChar( '|' ); fileFilters += wxChar( '|' );
...@@ -291,10 +294,12 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event ) ...@@ -291,10 +294,12 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event )
int open_ctl; int open_ctl;
wxString fileName; wxString fileName;
if( !AskLoadBoardFileName( this, &open_ctl, &fileName ) ) if( !AskLoadBoardFileName( this, &open_ctl, &fileName, true ) )
break; break;
AppendBoardFile( fileName, open_ctl ); AppendBoardFile( fileName, open_ctl );
m_canvas->Refresh();
} }
break; break;
...@@ -343,7 +348,7 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event ) ...@@ -343,7 +348,7 @@ void PCB_EDIT_FRAME::Files_io( wxCommandEvent& event )
// The KIWAY_PLAYER::OpenProjectFiles() API knows nothing about plugins, so // The KIWAY_PLAYER::OpenProjectFiles() API knows nothing about plugins, so
// determine how to load the BOARD here, with minor assistance from KICTL_EAGLE_BRD // determine how to load the BOARD here, with minor assistance from KICTL_EAGLE_BRD
// bit flag. // bit flag.
static IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl ) IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl )
{ {
IO_MGR::PCB_FILE_T pluginType; IO_MGR::PCB_FILE_T pluginType;
...@@ -369,19 +374,6 @@ static IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl ) ...@@ -369,19 +374,6 @@ static IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl )
} }
bool PCB_EDIT_FRAME::AppendBoardFile( const wxString& aFullFileName, int aCtl )
{
return false;
// I'll never use it, and it was mucking up OpenProjectFiles() with
// complicated cruft. If you must, put it here separate from that important
// function.
// Actually I think this serves too many masters. Just do panelization in
// a good gerber file manager.
}
bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl ) bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
{ {
// This is for python: // This is for python:
...@@ -567,7 +559,7 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in ...@@ -567,7 +559,7 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
GetBoard()->m_Status_Pcb = 0; GetBoard()->m_Status_Pcb = 0;
// Update info shown by the horizontal toolbars // Update info shown by the horizontal toolbars
GetDesignSettings().SetCurrentNetClass( NETCLASS::Default ); SetCurrentNetClass( NETCLASS::Default );
ReFillLayerWidget(); ReFillLayerWidget();
ReCreateLayerBox(); ReCreateLayerBox();
...@@ -581,9 +573,6 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in ...@@ -581,9 +573,6 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
// See case RATSNEST_VISIBLE: in BOARD::SetElementVisibility() // See case RATSNEST_VISIBLE: in BOARD::SetElementVisibility()
GetBoard()->SetVisibleElements( GetBoard()->GetVisibleElements() ); GetBoard()->SetVisibleElements( GetBoard()->GetVisibleElements() );
updateTraceWidthSelectBox();
updateViaSizeSelectBox();
// Display the loaded board: // Display the loaded board:
Zoom_Automatique( false ); Zoom_Automatique( false );
...@@ -689,7 +678,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF ...@@ -689,7 +678,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF
// Select default Netclass before writing file. // Select default Netclass before writing file.
// Useful to save default values in headers // Useful to save default values in headers
GetDesignSettings().SetCurrentNetClass( NETCLASS::Default ); SetCurrentNetClass( NETCLASS::Default );
ClearMsgPanel(); ClearMsgPanel();
...@@ -713,7 +702,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF ...@@ -713,7 +702,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF
); );
DisplayError( this, msg ); DisplayError( this, msg );
lowerTxt = _( "Failed to create " ) + pcbFileName.GetFullPath(); lowerTxt.Printf( _( "Failed to create '%s'" ), GetChars( pcbFileName.GetFullPath() ) );
AppendMsgPanel( upperTxt, lowerTxt, CYAN ); AppendMsgPanel( upperTxt, lowerTxt, CYAN );
...@@ -739,9 +728,9 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF ...@@ -739,9 +728,9 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF
wxRemoveFile( autoSaveFileName.GetFullPath() ); wxRemoveFile( autoSaveFileName.GetFullPath() );
if( !!backupFileName ) if( !!backupFileName )
upperTxt = _( "Backup file: " ) + backupFileName; upperTxt.Printf( _( "Backup file: '%s'" ), GetChars( backupFileName ) );
lowerTxt = _( "Wrote board file: " ) + pcbFileName.GetFullPath(); lowerTxt.Printf( _( "Wrote board file: '%s'" ), GetChars( pcbFileName.GetFullPath() ) );
AppendMsgPanel( upperTxt, lowerTxt, CYAN ); AppendMsgPanel( upperTxt, lowerTxt, CYAN );
......
...@@ -668,7 +668,11 @@ bool PCB_EDIT_FRAME::OnHotkeyEditItem( int aIdCommand ) ...@@ -668,7 +668,11 @@ bool PCB_EDIT_FRAME::OnHotkeyEditItem( int aIdCommand )
case PCB_TRACE_T: case PCB_TRACE_T:
case PCB_VIA_T: case PCB_VIA_T:
if( aIdCommand == HK_EDIT_ITEM ) if( aIdCommand == HK_EDIT_ITEM )
{
// Be sure the corresponding netclass is selected before edit:
SetCurrentNetClass( ( (BOARD_CONNECTED_ITEM*)item )->GetNetClassName() );
evt_type = ID_POPUP_PCB_EDIT_TRACKSEG; evt_type = ID_POPUP_PCB_EDIT_TRACKSEG;
}
break; break;
......
...@@ -43,6 +43,7 @@ void PCB_EDIT_FRAME::ReCreateMenuBar() ...@@ -43,6 +43,7 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
{ {
wxString text; wxString text;
wxMenuBar* menuBar = GetMenuBar(); wxMenuBar* menuBar = GetMenuBar();
wxMenuItem * menutitem;
wxFileHistory& fhist = Kiface().GetFileHistory(); wxFileHistory& fhist = Kiface().GetFileHistory();
...@@ -95,10 +96,14 @@ void PCB_EDIT_FRAME::ReCreateMenuBar() ...@@ -95,10 +96,14 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
KiBitmap( open_project_xpm ) ); KiBitmap( open_project_xpm ) );
} }
AddMenuItem( filesMenu, ID_APPEND_FILE, menutitem = AddMenuItem( filesMenu, ID_APPEND_FILE,
_( "&Append Board" ), _( "&Append Board" ),
_( "Append another Pcbnew board to the current loaded board" ), _( "Append another Pcbnew board to the current loaded board. Available only when Pcbnew runs in stand alone mode" ),
KiBitmap( import_xpm ) ); KiBitmap( import_xpm ) );
if( ! Kiface().IsSingle() ) // disable when under a project mgr
menutitem->Enable( false );
filesMenu->AppendSeparator(); filesMenu->AppendSeparator();
text = AddHotkeyName( _( "&Save" ), g_Board_Editor_Hokeys_Descr, HK_SAVE_BOARD ); text = AddHotkeyName( _( "&Save" ), g_Board_Editor_Hokeys_Descr, HK_SAVE_BOARD );
......
...@@ -818,25 +818,13 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) ...@@ -818,25 +818,13 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform ) void FOOTPRINT_EDIT_FRAME::Transform( MODULE* module, int transform )
{ {
wxPoint pos;
double angle = 900; // Necessary +- 900 (+- 90 degrees).
// Be prudent: because RotateMarkedItems is used to rotate some items
// used the same value as RotateMarkedItems
switch( transform ) switch( transform )
{ {
case ID_MODEDIT_MODULE_ROTATE: case ID_MODEDIT_MODULE_ROTATE:
module->Reference().RotateWithModule( wxPoint(0,0), angle );
module->Value().RotateWithModule( wxPoint(0,0), angle );
RotateMarkedItems( module, wxPoint(0,0), true ); RotateMarkedItems( module, wxPoint(0,0), true );
break; break;
case ID_MODEDIT_MODULE_MIRROR: case ID_MODEDIT_MODULE_MIRROR:
module->Reference().MirrorWithModule( 0 );
module->Value().MirrorWithModule( 0 );
// Mirror pads and graphic items of the footprint:
MirrorMarkedItems( module, wxPoint(0,0), true ); MirrorMarkedItems( module, wxPoint(0,0), true );
break; break;
......
...@@ -166,10 +166,8 @@ void PCB_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition ) ...@@ -166,10 +166,8 @@ void PCB_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
case PCB_TRACE_T: case PCB_TRACE_T:
case PCB_VIA_T: case PCB_VIA_T:
case PCB_PAD_T: case PCB_PAD_T:
GetDesignSettings().SetCurrentNetClass( SetCurrentNetClass(
((BOARD_CONNECTED_ITEM*)DrawStruct)->GetNetClassName() ); ((BOARD_CONNECTED_ITEM*)DrawStruct)->GetNetClassName() );
updateTraceWidthSelectBox();
updateViaSizeSelectBox();
break; break;
default: default:
......
...@@ -464,9 +464,7 @@ void PCB_EDIT_FRAME::createPopupMenuForTracks( TRACK* Track, wxMenu* PopMenu ) ...@@ -464,9 +464,7 @@ void PCB_EDIT_FRAME::createPopupMenuForTracks( TRACK* Track, wxMenu* PopMenu )
wxPoint cursorPosition = GetCrossHairPosition(); wxPoint cursorPosition = GetCrossHairPosition();
wxString msg; wxString msg;
GetDesignSettings().SetCurrentNetClass( Track->GetNetClassName() ); SetCurrentNetClass( Track->GetNetClassName() );
updateTraceWidthSelectBox();
updateViaSizeSelectBox();
int flags = Track->GetFlags(); int flags = Track->GetFlags();
...@@ -834,12 +832,7 @@ void PCB_EDIT_FRAME::createPopUpMenuForFpPads( D_PAD* Pad, wxMenu* menu ) ...@@ -834,12 +832,7 @@ void PCB_EDIT_FRAME::createPopUpMenuForFpPads( D_PAD* Pad, wxMenu* menu )
if( flags ) // Currently in edit, no others commands possible if( flags ) // Currently in edit, no others commands possible
return; return;
if( GetDesignSettings().GetCurrentNetClassName() != Pad->GetNetClassName() ) SetCurrentNetClass( Pad->GetNetClassName() );
{
GetDesignSettings().SetCurrentNetClass( Pad->GetNetClassName() );
updateTraceWidthSelectBox();
updateViaSizeSelectBox();
}
wxString msg = Pad->GetSelectMenuText(); wxString msg = Pad->GetSelectMenuText();
......
...@@ -1079,3 +1079,17 @@ void PCB_EDIT_FRAME::ToPlotter( wxCommandEvent& event ) ...@@ -1079,3 +1079,17 @@ void PCB_EDIT_FRAME::ToPlotter( wxCommandEvent& event )
dlg.ShowModal(); dlg.ShowModal();
} }
bool PCB_EDIT_FRAME::SetCurrentNetClass( const wxString& aNetClassName )
{
bool change = GetDesignSettings().SetCurrentNetClass( aNetClassName );
if( change )
{
updateTraceWidthSelectBox();
updateViaSizeSelectBox();
}
return change;
}
...@@ -534,7 +534,13 @@ void ROUTER_TOOL::performRouting() ...@@ -534,7 +534,13 @@ void ROUTER_TOOL::performRouting()
frame->SetActiveLayer( ToLAYER_ID( m_startLayer ) ); frame->SetActiveLayer( ToLAYER_ID( m_startLayer ) );
if( m_startItem && m_startItem->Net() >= 0 ) if( m_startItem && m_startItem->Net() >= 0 )
{
highlightNet( true, m_startItem->Net() ); highlightNet( true, m_startItem->Net() );
// Update track width and via size shown in main toolbar comboboxes
frame->SetCurrentNetClass( m_startItem->Parent()->GetNetClass()->GetName() );
}
else
frame->SetCurrentNetClass( NETCLASS::Default );
ctls->ForceCursorPosition( false ); ctls->ForceCursorPosition( false );
ctls->SetAutoPan( true ); ctls->SetAutoPan( true );
......
...@@ -67,7 +67,7 @@ void FOOTPRINT_EDIT_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg ) ...@@ -67,7 +67,7 @@ void FOOTPRINT_EDIT_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg )
GRSetDrawMode( DC, GR_COPY ); GRSetDrawMode( DC, GR_COPY );
m_canvas->DrawBackGround( DC ); m_canvas->DrawBackGround( DC );
DrawWorkSheet( DC, screen, 0, IU_PER_MILS, wxEmptyString ); DrawWorkSheet( DC, screen, 0, IU_PER_MILS, wxEmptyString );
// Redraw the footprints // Redraw the footprints
for( MODULE* module = GetBoard()->m_Modules; module; module = module->Next() ) for( MODULE* module = GetBoard()->m_Modules; module; module = module->Next() )
...@@ -153,11 +153,19 @@ void BOARD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* DC, GR_DRAWMODE aDrawMode, const ...@@ -153,11 +153,19 @@ void BOARD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* DC, GR_DRAWMODE aDrawMode, const
*/ */
for( TRACK* track = m_Track; track; track = track->Next() ) for( TRACK* track = m_Track; track; track = track->Next() )
{ {
if( track->IsMoving() )
continue;
track->Draw( aPanel, DC, aDrawMode ); track->Draw( aPanel, DC, aDrawMode );
} }
// SEGZONE is outdated, only her for compatibility with
// very old designs
for( SEGZONE* zone = m_Zone; zone; zone = zone->Next() ) for( SEGZONE* zone = m_Zone; zone; zone = zone->Next() )
{ {
if( zone->IsMoving() )
continue;
zone->Draw( aPanel, DC, aDrawMode ); zone->Draw( aPanel, DC, aDrawMode );
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment