Commit 3084c0aa authored by jean-pierre charras's avatar jean-pierre charras

Eeschema: add missing rotate and mirror sheet in sheet context menu (these...

Eeschema: add missing rotate and mirror sheet in sheet context menu (these transforms were possible in block commands, but  not from the sheet menu).
Fix a i18n issue in field names when loading a component, if the language was changed during a session, and kicad not restarted (see Bug #1448654).
However changing the language needs restarting kicad, in order to have all messages or menus translated.
parent 26c320db
......@@ -162,9 +162,9 @@ static EDA_HOTKEY HkAddGraphicPolyLine( _HKI( "Add Graphic PolyLine" ), HK_ADD_G
'I', ID_LINE_COMMENT_BUTT );
static EDA_HOTKEY HkAddGraphicText( _HKI( "Add Graphic Text" ), HK_ADD_GRAPHIC_TEXT, 'T',
ID_TEXT_COMMENT_BUTT );
static EDA_HOTKEY HkMirrorY( _HKI( "Mirror Y Component" ), HK_MIRROR_Y_COMPONENT, 'Y',
static EDA_HOTKEY HkMirrorY( _HKI( "Mirror Y" ), HK_MIRROR_Y, 'Y',
ID_SCH_MIRROR_Y );
static EDA_HOTKEY HkMirrorX( _HKI( "Mirror X Component" ), HK_MIRROR_X_COMPONENT, 'X',
static EDA_HOTKEY HkMirrorX( _HKI( "Mirror X" ), HK_MIRROR_X, 'X',
ID_SCH_MIRROR_X );
static EDA_HOTKEY HkOrientNormalComponent( _HKI( "Orient Normal Component" ),
HK_ORIENT_NORMAL_COMPONENT, 'N', ID_SCH_ORIENT_NORMAL );
......@@ -556,8 +556,8 @@ bool SCH_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
case HK_EDIT_COMPONENT_VALUE: // Edit component value field.
case HK_EDIT_COMPONENT_REFERENCE: // Edit component value reference.
case HK_EDIT_COMPONENT_FOOTPRINT: // Edit component footprint field.
case HK_MIRROR_Y_COMPONENT: // Mirror Y
case HK_MIRROR_X_COMPONENT: // Mirror X
case HK_MIRROR_Y: // Mirror Y
case HK_MIRROR_X: // Mirror X
case HK_ORIENT_NORMAL_COMPONENT: // Orient 0, no mirror (Component)
case HK_ROTATE: // Rotate schematic item.
case HK_EDIT_COMPONENT_WITH_LIBEDIT: // Call Libedit and load the current component
......
......@@ -51,8 +51,8 @@ enum hotkey_id_commnand {
HK_EDIT_COMPONENT_REFERENCE,
HK_EDIT_COMPONENT_FOOTPRINT,
HK_EDIT_COMPONENT_WITH_LIBEDIT,
HK_MIRROR_X_COMPONENT,
HK_MIRROR_Y_COMPONENT,
HK_MIRROR_X,
HK_MIRROR_Y,
HK_ORIENT_NORMAL_COMPONENT,
HK_MOVE_COMPONENT_OR_ITEM,
HK_COPY_COMPONENT_OR_LABEL,
......
......@@ -100,15 +100,6 @@ bool LIB_FIELD::Save( OUTPUTFORMATTER& aFormatter )
else if( m_VJustify == GR_TEXT_VJUSTIFY_TOP )
vjustify = 'T';
/* Dick 24-May-2013:
What the hell is this?. There was no comment here.
Hell no. You don't want this in the *.lib files, it is crap. Fields get read
back in and they have a tilda in them.
if( text.IsEmpty() )
text = wxT( "~" );
*/
aFormatter.Print( 0, "F%d %s %d %d %d %c %c %c %c%c%c",
m_id,
EscapedUTF8( text ).c_str(), // wraps in quotes
......
......@@ -373,9 +373,9 @@ void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, PART_LIBS*
AddMenuItem( orientmenu, ID_SCH_ROTATE_CLOCKWISE, msg, KiBitmap( rotate_cw_xpm ) );
AddMenuItem( orientmenu, ID_SCH_ROTATE_COUNTERCLOCKWISE, _( "Rotate Counterclockwise" ),
KiBitmap( rotate_ccw_xpm ) );
msg = AddHotkeyName( _( "Mirror --" ), g_Schematic_Hokeys_Descr, HK_MIRROR_X_COMPONENT );
msg = AddHotkeyName( _( "Mirror --" ), g_Schematic_Hokeys_Descr, HK_MIRROR_X );
AddMenuItem( orientmenu, ID_SCH_MIRROR_X, msg, KiBitmap( mirror_v_xpm ) );
msg = AddHotkeyName( _( "Mirror ||" ), g_Schematic_Hokeys_Descr, HK_MIRROR_Y_COMPONENT );
msg = AddHotkeyName( _( "Mirror ||" ), g_Schematic_Hokeys_Descr, HK_MIRROR_Y );
AddMenuItem( orientmenu, ID_SCH_MIRROR_Y, msg, KiBitmap( mirror_h_xpm ) );
msg = AddHotkeyName( _( "Normal" ), g_Schematic_Hokeys_Descr, HK_ORIENT_NORMAL_COMPONENT );
AddMenuItem( orientmenu, ID_SCH_ORIENT_NORMAL, msg, KiBitmap( normal_xpm ) );
......@@ -757,6 +757,21 @@ void AddMenusForHierchicalSheet( wxMenu* PopMenu, SCH_SHEET* Sheet )
msg = AddHotkeyName( _( "Drag Sheet" ), g_Schematic_Hokeys_Descr, HK_DRAG );
AddMenuItem( PopMenu, ID_SCH_DRAG_ITEM, msg, KiBitmap( move_sheet_xpm ) );
wxMenu* orientmenu = new wxMenu;
msg = AddHotkeyName( _( "Rotate Sheet CW" ), g_Schematic_Hokeys_Descr, HK_ROTATE );
AddMenuItem( orientmenu, ID_SCH_ROTATE_CLOCKWISE, msg, KiBitmap( rotate_cw_xpm ) );
AddMenuItem( orientmenu, ID_SCH_ROTATE_COUNTERCLOCKWISE, _( "Rotate Sheet CCW" ),
KiBitmap( rotate_ccw_xpm ) );
msg = AddHotkeyName( _( "Mirror --" ), g_Schematic_Hokeys_Descr, HK_MIRROR_X );
AddMenuItem( orientmenu, ID_SCH_MIRROR_X, msg, KiBitmap( mirror_v_xpm ) );
msg = AddHotkeyName( _( "Mirror ||" ), g_Schematic_Hokeys_Descr, HK_MIRROR_Y );
AddMenuItem( orientmenu, ID_SCH_MIRROR_Y, msg, KiBitmap( mirror_h_xpm ) );
AddMenuItem( PopMenu, orientmenu, ID_POPUP_SCH_GENERIC_ORIENT_CMP,
_( "Orient Sheet" ), KiBitmap( orient_xpm ) );
}
if( Sheet->GetFlags() )
......@@ -831,10 +846,10 @@ void AddMenusForBlock( wxMenu* PopMenu, SCH_EDIT_FRAME* frame )
AddMenuItem( PopMenu, ID_POPUP_DRAG_BLOCK, msg, KiBitmap( move_xpm ) );
AddMenuItem( PopMenu, ID_POPUP_DELETE_BLOCK, _( "Delete Block" ), KiBitmap( delete_xpm ) );
msg = AddHotkeyName( _( "Mirror Block ||" ), g_Schematic_Hokeys_Descr,
HK_MIRROR_Y_COMPONENT );
HK_MIRROR_Y );
AddMenuItem( PopMenu, ID_SCH_MIRROR_Y, msg, KiBitmap( mirror_h_xpm ) );
msg = AddHotkeyName( _( "Mirror Block --" ), g_Schematic_Hokeys_Descr,
HK_MIRROR_X_COMPONENT );
HK_MIRROR_X );
AddMenuItem( PopMenu, ID_SCH_MIRROR_X, msg, KiBitmap( mirror_v_xpm ) );
msg = AddHotkeyName( _( "Rotate Block CCW" ), g_Schematic_Hokeys_Descr, HK_ROTATE );
AddMenuItem( PopMenu, ID_SCH_ROTATE_CLOCKWISE, msg, KiBitmap( rotate_ccw_xpm ) );
......@@ -871,10 +886,10 @@ void AddMenusForBitmap( wxMenu* aPopMenu, SCH_BITMAP * aBitmap )
msg = AddHotkeyName( _( "Rotate Image" ), g_Schematic_Hokeys_Descr, HK_ROTATE );
AddMenuItem( aPopMenu, ID_SCH_ROTATE_CLOCKWISE, msg, KiBitmap( rotate_ccw_xpm ) );
msg = AddHotkeyName( _( "Mirror --" ), g_Schematic_Hokeys_Descr,
HK_MIRROR_X_COMPONENT );
HK_MIRROR_X );
AddMenuItem( aPopMenu, ID_SCH_MIRROR_X, msg, KiBitmap( mirror_v_xpm ) );
msg = AddHotkeyName( _( "Mirror ||" ), g_Schematic_Hokeys_Descr,
HK_MIRROR_Y_COMPONENT );
HK_MIRROR_Y );
AddMenuItem( aPopMenu, ID_SCH_MIRROR_Y, msg, KiBitmap( mirror_h_xpm ) );
msg = AddHotkeyName( _( "Edit Image" ), g_Schematic_Hokeys_Descr, HK_EDIT );
AddMenuItem( aPopMenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( image_xpm ) );
......
......@@ -194,6 +194,7 @@ const KICAD_T SCH_COLLECTOR::SheetsAndSheetLabels[] = {
const KICAD_T SCH_COLLECTOR::OrientableItems[] = {
SCH_COMPONENT_T,
SCH_BITMAP_T,
SCH_SHEET_T,
EOT
};
......
......@@ -148,8 +148,18 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET_PATH* sheet, int unit,
if( it->GetName().IsEmpty() )
continue;
// See if field by same name already exists.
SCH_FIELD* schField = FindField( it->GetName() );
// See if field already exists (mandatory fields always exist).
// for mandatory fields, the name and field id are fixed, so we use the
// known and fixed id to get them (more reliable than names, which can be translated)
// for other fields (custom fields), locate the field by same name
// (field id has no known meaning for custom fields)
int idx = it->GetId();
SCH_FIELD* schField;
if( idx < MANDATORY_FIELDS )
schField = GetField( idx );
else
schField = FindField( it->GetName() );
if( !schField )
{
......@@ -158,9 +168,7 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_PART& aPart, SCH_SHEET_PATH* sheet, int unit,
}
schField->SetTextPosition( m_Pos + it->GetTextPosition() );
schField->ImportValues( *it );
schField->SetText( it->GetText() );
}
......@@ -232,7 +240,7 @@ void SCH_COMPONENT::Init( const wxPoint& pos )
AddField( field );
}
m_prefix = wxString( _( "U" ) );
m_prefix = wxString( wxT( "U" ) );
}
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2008-2013 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2004-2013 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 2004-2015 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
......@@ -457,14 +457,12 @@ void SCH_EDIT_FRAME::OnMoveItem( wxCommandEvent& aEvent )
case SCH_MARKER_T:
// Moving a marker has no sense
wxFAIL_MSG( wxString::Format( wxT( "Cannot move item type %s" ),
GetChars( item->GetClass() ) ) );
break;
default:
// Unknown items cannot be moved
wxFAIL_MSG( wxString::Format(
wxT( "Cannot move unknown item type %d" ), item->Type() ) );
wxT( "Cannot move item type %d" ), item->Type() ) );
break;
}
......@@ -841,8 +839,25 @@ void SCH_EDIT_FRAME::OnRotate( wxCommandEvent& aEvent )
RotateImage( (SCH_BITMAP*) item );
break;
case SCH_SHEET_T: /// @todo allow sheet rotate on hotkey
case SCH_SHEET_T:
if( !item->IsNew() ) // rotate a sheet during its creation has no sense
{
bool retCCW = ( aEvent.GetId() == ID_SCH_ROTATE_COUNTERCLOCKWISE );
RotateHierarchicalSheet( static_cast<SCH_SHEET*>( item ), retCCW );
}
break;
case SCH_JUNCTION_T:
case SCH_NO_CONNECT_T:
// these items are not rotated, because rotation does not change them.
break;
default:
// Other items (wires...) cannot be rotated, at least during creation
if( item->IsNew() )
break;
wxFAIL_MSG( wxString::Format( wxT( "Cannot rotate schematic item type %s." ),
GetChars( item->GetClass() ) ) );
}
......@@ -1112,6 +1127,14 @@ void SCH_EDIT_FRAME::OnOrient( wxCommandEvent& aEvent )
break;
case SCH_SHEET_T:
if( aEvent.GetId() == ID_SCH_MIRROR_X )
MirrorSheet( (SCH_SHEET*) item, true );
else if( aEvent.GetId() == ID_SCH_MIRROR_Y )
MirrorSheet( (SCH_SHEET*) item, false );
break;
default:
wxFAIL_MSG( wxString::Format( wxT( "Schematic object type %s cannot be oriented." ),
GetChars( item->GetClass() ) ) );
......
......@@ -930,6 +930,25 @@ private:
SCH_SHEET* CreateSheet( wxDC* DC );
void ReSizeSheet( SCH_SHEET* Sheet, wxDC* DC );
/**
* Rotate a sheet on itself. Sheets do not have a anchor point.
* Because rotating it from its origin or its end is not friendly,
* Rotation is made around its centre
* @param aSheet the hierarchical sheet to rotate
* @param aRotCCW = true to rotate CCW, false to rotate CW
*/
void RotateHierarchicalSheet( SCH_SHEET* aSheet, bool aRotCCW );
/**
* Function MirrorSheet
* Mirror a hierarchical sheet
* Mirroring is made around its centre
* @param aSheet = the SCH_SHEET to mirror
* @param aFromXaxis = true to mirror relative to Horizontal axis
* false to mirror relative to vertical axis
*/
void MirrorSheet( SCH_SHEET* aSheet, bool aFromXaxis );
/// Loads the cache library associated to the aFileName
bool LoadCacheLibrary( const wxString& aFileName );
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2006 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2004-2011 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
......@@ -392,3 +392,52 @@ void SCH_EDIT_FRAME::ReSizeSheet( SCH_SHEET* aSheet, wxDC* aDC )
SetUndoItem( aSheet );
}
#define GRID_SIZE_REF 50
void SCH_EDIT_FRAME::RotateHierarchicalSheet( SCH_SHEET* aSheet, bool aRotCCW )
{
if( aSheet == NULL )
return;
// Save old sheet in undo list if not already in edit, or moving.
if( aSheet->GetFlags() == 0 )
SaveCopyInUndoList( aSheet, UR_CHANGED );
// Rotate the sheet on itself. Sheets do not have a anchor point.
// Rotation is made around it center
wxPoint rotPoint = aSheet->GetBoundingBox().Centre();
// rotate CCW, or CW. to rotate CW, rotate 3 times
aSheet->Rotate( rotPoint );
if( !aRotCCW )
{
aSheet->Rotate( rotPoint );
aSheet->Rotate( rotPoint );
}
GetCanvas()->Refresh();
OnModify();
}
void SCH_EDIT_FRAME::MirrorSheet( SCH_SHEET* aSheet, bool aFromXaxis )
{
if( aSheet == NULL )
return;
// Save old sheet in undo list if not already in edit, or moving.
if( aSheet->GetFlags() == 0 )
SaveCopyInUndoList( aSheet, UR_CHANGED );
// Mirror the sheet on itself. Sheets do not have a anchor point.
// Mirroring is made around it center
wxPoint mirrorPoint = aSheet->GetBoundingBox().Centre();
if( aFromXaxis ) // mirror relative to Horizontal axis
aSheet->MirrorX( mirrorPoint.y );
else // Mirror relative to vertical axis
aSheet->MirrorY( mirrorPoint.x );
GetCanvas()->Refresh();
OnModify();
}
......@@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2014 KiCad Developers, see CHANGELOG.TXT for contributors.
* Copyright (C) 2015 KiCad Developers, see CHANGELOG.TXT for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
......@@ -29,27 +29,32 @@
using namespace TFIELD_T;
wxString TEMPLATE_FIELDNAME::GetDefaultFieldName( int aFieldNdx )
const wxString TEMPLATE_FIELDNAME::GetDefaultFieldName( int aFieldNdx )
{
// Fixed values for the first few default fields used by EESCHEMA
static const wxString fixedNames[] = {
_( "Reference" ), // The component reference, R1, C1, etc.
_( "Value" ), // The component value + name
_( "Footprint" ), // The footprint for use with Pcbnew
_( "Datasheet" ), // Link to a datasheet for component
};
// (mandatory fields)
switch( aFieldNdx )
{
case REFERENCE:
return _( "Reference" ); // The component reference, R1, C1, etc.
if( (unsigned) aFieldNdx < DIM(fixedNames) )
return fixedNames[aFieldNdx];
case VALUE:
return _( "Value" ); // The component value + name
else
{
wxString fieldName = _( "Field" );
case FOOTPRINT:
return _( "Footprint" ); // The footprint for use with Pcbnew
fieldName << aFieldNdx;
case DATASHEET:
return _( "Datasheet" ); // Link to a datasheet for component
return fieldName;
default:
break;
}
// Other fields are use fields, give a default name:
wxString fieldName = _( "Field" );
fieldName << aFieldNdx;
return fieldName;
}
void TEMPLATE_FIELDNAME::Format( OUTPUTFORMATTER* out, int nestLevel ) const throw( IO_ERROR )
......
......@@ -120,7 +120,7 @@ struct TEMPLATE_FIELDNAME
* These fieldnames are not modifiable, but template fieldnames are.
* @param aFieldNdx The field number index, > 0
*/
static wxString GetDefaultFieldName( int aFieldNdx );
static const wxString GetDefaultFieldName( int aFieldNdx );
};
typedef std::vector< TEMPLATE_FIELDNAME > TEMPLATE_FIELDNAMES;
......
......@@ -53,7 +53,7 @@ FOOTPRINT_WIZARD* FOOTPRINT_WIZARDS::GetWizard( int aIndex )
FOOTPRINT_WIZARD* FOOTPRINT_WIZARDS::GetWizard( wxString aName )
{
int max = GetSize();
int max = GetWizardsCount();
for( int i = 0; i<max; i++ )
{
......@@ -69,7 +69,7 @@ FOOTPRINT_WIZARD* FOOTPRINT_WIZARDS::GetWizard( wxString aName )
}
int FOOTPRINT_WIZARDS::GetSize()
int FOOTPRINT_WIZARDS::GetWizardsCount()
{
return m_FootprintWizards.size();
}
......@@ -85,7 +85,7 @@ void FOOTPRINT_WIZARDS::register_wizard( FOOTPRINT_WIZARD* aWizard )
bool FOOTPRINT_WIZARDS::deregister_object( void* aObject )
{
int max = GetSize();
int max = GetWizardsCount();
for( int i = 0; i<max; i++ )
{
......
......@@ -24,7 +24,7 @@
/**
* @file pcbnew_footprint_wizards.h
* @file class_footprint_wizard.h
* @brief Class PCBNEW_FOOTPRINT_WIZARDS
*/
......@@ -130,7 +130,6 @@ public:
* Function register_wizard
* It's the standard method of a "FOOTPRINT_WIZARD" to register itself into
* the FOOTPRINT_WIZARDS singleton manager
*
*/
void register_wizard();
};
......@@ -143,6 +142,7 @@ private:
* FOOTPRINT_WIZARD system wide static list
*/
static std::vector<FOOTPRINT_WIZARD*> m_FootprintWizards;
public:
/**
......@@ -151,7 +151,6 @@ public:
* into the system wizards
*
* @param aWizard is the footprint wizard to be registered
*
*/
static void register_wizard( FOOTPRINT_WIZARD* aWizard );
......@@ -162,7 +161,6 @@ public:
* and deleted
*
* @param aObject is the footprint wizard object to be deregistered
*
*/
static bool deregister_object( void* aObject );
......@@ -170,7 +168,6 @@ public:
* Function GetWizard
* @param aName is the footprint wizard name
* @return a wizard object by it's name or NULL if it isn't available.
*
*/
static FOOTPRINT_WIZARD* GetWizard( wxString aName );
......@@ -178,15 +175,14 @@ public:
* Function GetWizard
* @return a wizard object by it's number or NULL if it isn't available.
* @param aIndex is the wizard index in list
*
*/
static FOOTPRINT_WIZARD* GetWizard( int aIndex );
/**
* Function GetSize
* Function GetWizardsCount
* @return the number of wizards available into the system
*/
static int GetSize();
static int GetWizardsCount();
};
#endif /* PCBNEW_FOOTPRINT_WIZARDS_H */
......@@ -41,7 +41,7 @@
DIALOG_FOOTPRINT_WIZARD_LIST::DIALOG_FOOTPRINT_WIZARD_LIST( wxWindow* aParent )
: DIALOG_FOOTPRINT_WIZARD_LIST_BASE( aParent )
{
int n_wizards = FOOTPRINT_WIZARDS::GetSize();
int n_wizards = FOOTPRINT_WIZARDS::GetWizardsCount();
// Current wizard selection, empty or first
m_FootprintWizard = NULL;
......
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