Commit 16784384 authored by stambaughw's avatar stambaughw

Fix EESchema hot key bugs, fixes bug #1896790.

parent 073d0767
...@@ -5,6 +5,17 @@ Started 2007-June-11 ...@@ -5,6 +5,17 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with
email address. email address.
2009-Feb-25 UPDATE Wayne Stambaugh <stambaughw@verizon.net>
================================================================================
++EESchema
* Fixed hot key bug that caused undo and redo events in the library editor
to be passed to the schematic frame. Fixes bug #1896790.
* Fixed hot key bug that allowed new wire to be placed during block move
causing a manage cursor message box to pop up.
* Fixed hot key bug that allows an object in block to be deleted during
a move or drag operation.
2009-Feb-25 UPDATE Dick Hollenbeck <dick@softplc.com> 2009-Feb-25 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================ ================================================================================
++pcbnew ++pcbnew
...@@ -116,7 +127,6 @@ email address. ...@@ -116,7 +127,6 @@ email address.
automatically scrolling the drawing. automatically scrolling the drawing.
>>>>>>> .r1562
2009-Feb-4 UPDATE Vesa Solonen <vesa.solonen@hut.fi> 2009-Feb-4 UPDATE Vesa Solonen <vesa.solonen@hut.fi>
================================================================================ ================================================================================
++pcbnew: ++pcbnew:
......
...@@ -16,22 +16,31 @@ ...@@ -16,22 +16,31 @@
#include "protos.h" #include "protos.h"
/* How to add a new hotkey: /* How to add a new hotkey:
* add a new id in the enum hotkey_id_commnand like MY_NEW_ID_FUNCTION (see hotkeys.h). * add a new id in the enum hotkey_id_commnand like MY_NEW_ID_FUNCTION (see
* add a new Ki_HotkeyInfo entry like: * hotkeys.h).
* static Ki_HotkeyInfo HkMyNewEntry(wxT("Command Label"), MY_NEW_ID_FUNCTION, default key value); * add a new Ki_HotkeyInfo entry like:
* "Command Label" is the name used in hotkey list display, and the identifier in the hotkey list file * static Ki_HotkeyInfo HkMyNewEntry(wxT("Command Label"), MY_NEW_ID_FUNCTION,
* MY_NEW_ID_FUNCTION is an equivalent id function used in the switch in OnHotKey() function. * default key value);
* default key value is the default hotkey for this command. Can be overrided by the user hotkey list file * wxT("Command Label") is the name used in hotkey list display, and the
* add the HkMyNewEntry pointer in the s_Schematic_Hotkey_List list or the s_LibEdit_Hotkey_List list * identifier in the hotkey list file
* ( or s_Common_Hotkey_List if the same command is added both in eeschema and libedit) * MY_NEW_ID_FUNCTION is an equivalent id function used in the switch in
* Add the new code in the switch in OnHotKey() function. * OnHotKey() function.
* when the variable ItemInEdit is true, an item is currently edited. * default key value is the default hotkey for this command. Can be overridden
* This can be usefull if the new function cannot be executed while an item is currently being edited * by the user hotkey list file
* ( For example, one cannot start a new wire when a component is moving.) * add the HkMyNewEntry pointer in the s_Schematic_Hotkey_List list or the
* s_LibEdit_Hotkey_List list or s_Common_Hotkey_List if the same command is
* added both in eeschema and libedit)
* Add the new code in the switch in OnHotKey() function.
* when the variable ItemInEdit is true, an item is currently edited.
* This can be usefull if the new function cannot be executed while an item is
* currently being edited
* ( For example, one cannot start a new wire when a component is moving.)
*
* Note: If an hotkey is a special key be sure the corresponding wxWidget
* keycode (WXK_XXXX) is handled in the hotkey_name_descr
* s_Hotkey_Name_List list (see hotkeys_basic.cpp) and see this list
* for some ascii keys (space ...)
* *
* Note: If an hotkey is a special key be sure the corresponding wxWidget keycode (WXK_XXXX)
* is handled in the hotkey_name_descr s_Hotkey_Name_List list (see hotkeys_basic.cpp)
* and see this list for some ascii keys (space ...)
* Key modifier are: GR_KB_CTRL GR_KB_ALT * Key modifier are: GR_KB_CTRL GR_KB_ALT
*/ */
...@@ -40,61 +49,80 @@ ...@@ -40,61 +49,80 @@
/* Hotkey list: */ /* Hotkey list: */
// Common commands // Common commands
static Ki_HotkeyInfo HkZoomCenter( wxT( "Zoom Center" ), HK_ZOOM_CENTER, WXK_F4 ); static Ki_HotkeyInfo HkZoomCenter( wxT( "Zoom Center" ), HK_ZOOM_CENTER,
static Ki_HotkeyInfo HkZoomRedraw( wxT( "Zoom Redraw" ), HK_ZOOM_REDRAW, WXK_F3 ); WXK_F4 );
static Ki_HotkeyInfo HkZoomOut( wxT( "Zoom Out" ), HK_ZOOM_OUT, WXK_F2 ); static Ki_HotkeyInfo HkZoomRedraw( wxT( "Zoom Redraw" ), HK_ZOOM_REDRAW,
static Ki_HotkeyInfo HkZoomIn( wxT( "Zoom In" ), HK_ZOOM_IN, WXK_F1 ); WXK_F3 );
static Ki_HotkeyInfo HkHelp( wxT( "Help: this message" ), HK_HELP, '?' ); static Ki_HotkeyInfo HkZoomOut( wxT( "Zoom Out" ), HK_ZOOM_OUT, WXK_F2 );
static Ki_HotkeyInfo HkResetLocalCoord( wxT( "Reset local coord." ), HK_RESET_LOCAL_COORD, ' ' ); static Ki_HotkeyInfo HkZoomIn( wxT( "Zoom In" ), HK_ZOOM_IN, WXK_F1 );
static Ki_HotkeyInfo HkUndo( wxT( "Undo" ), HK_UNDO, GR_KB_CTRL + 'Z', (int)ID_SCHEMATIC_UNDO ); static Ki_HotkeyInfo HkHelp( wxT( "Help: this message" ), HK_HELP, '?' );
static Ki_HotkeyInfo HkRedo( wxT( "Redo" ), HK_REDO, GR_KB_CTRL + 'Y', (int)ID_SCHEMATIC_REDO ); static Ki_HotkeyInfo HkResetLocalCoord( wxT( "Reset local coord." ),
HK_RESET_LOCAL_COORD, ' ' );
static Ki_HotkeyInfo HkUndo( wxT( "Undo" ), HK_UNDO, GR_KB_CTRL + 'Z',
(int) ID_SCHEMATIC_UNDO );
static Ki_HotkeyInfo HkRedo( wxT( "Redo" ), HK_REDO, GR_KB_CTRL + 'Y',
(int) ID_SCHEMATIC_REDO );
// Schematic editor // Schematic editor
static Ki_HotkeyInfo HkBeginWire( wxT( "begin Wire" ), HK_BEGIN_WIRE, 'W' ); static Ki_HotkeyInfo HkBeginWire( wxT( "begin Wire" ), HK_BEGIN_WIRE, 'W' );
static Ki_HotkeyInfo HkAddComponent( wxT( "Add Component" ), HK_ADD_NEW_COMPONENT, 'A' ); static Ki_HotkeyInfo HkAddComponent( wxT( "Add Component" ),
static Ki_HotkeyInfo HkMirrorYComponent( wxT( HK_ADD_NEW_COMPONENT, 'A' );
"Mirror Y Component" ), HK_MIRROR_Y_COMPONENT, 'Y' ); static Ki_HotkeyInfo HkMirrorYComponent( wxT( "Mirror Y Component" ),
static Ki_HotkeyInfo HkMirrorXComponent( wxT( HK_MIRROR_Y_COMPONENT, 'Y' );
"Mirror X Component" ), HK_MIRROR_X_COMPONENT, 'X' ); static Ki_HotkeyInfo HkMirrorXComponent( wxT( "Mirror X Component" ),
static Ki_HotkeyInfo HkOrientNormalComponent( wxT( HK_MIRROR_X_COMPONENT, 'X' );
"Orient Normal Component" ), static Ki_HotkeyInfo HkOrientNormalComponent( wxT( "Orient Normal Component" ),
HK_ORIENT_NORMAL_COMPONENT, 'N' ); HK_ORIENT_NORMAL_COMPONENT, 'N' );
static Ki_HotkeyInfo HkRotateComponent( wxT( "Rotate Component" ), HK_ROTATE_COMPONENT, 'R' ); static Ki_HotkeyInfo HkRotateComponent( wxT( "Rotate Component" ),
static Ki_HotkeyInfo HkEditComponentValue( wxT( "Edit Component Value" ), HK_EDIT_COMPONENT_VALUE, 'V' ); HK_ROTATE_COMPONENT, 'R' );
static Ki_HotkeyInfo HkEditComponentFootprint( wxT( "Edit Component Footprint" ), HK_EDIT_COMPONENT_FOOTPRINT, 'F' ); static Ki_HotkeyInfo HkEditComponentValue( wxT( "Edit Component Value" ),
static Ki_HotkeyInfo HkMoveComponent( wxT( "Move Component" ), HK_MOVE_COMPONENT, 'M', ID_POPUP_SCH_MOVE_CMP_REQUEST ); HK_EDIT_COMPONENT_VALUE, 'V' );
static Ki_HotkeyInfo HkDragComponent( wxT( "Drag Component" ), HK_DRAG_COMPONENT, 'G', ID_POPUP_SCH_DRAG_CMP_REQUEST ); static Ki_HotkeyInfo HkEditComponentFootprint( wxT( "Edit Component Footprint" ),
static Ki_HotkeyInfo HkMove2Drag( wxT( HK_EDIT_COMPONENT_FOOTPRINT,
"Switch move block to drag block" ), 'F' );
HK_MOVEBLOCK_TO_DRAGBLOCK, '\t' ); static Ki_HotkeyInfo HkMoveComponent( wxT( "Move Component" ),
static Ki_HotkeyInfo HkInsert( wxT( "Repeat Last Item" ), HK_REPEAT_LAST, WXK_INSERT ); HK_MOVE_COMPONENT, 'M',
static Ki_HotkeyInfo HkDelete( wxT( "Delete Item" ), HK_DELETE, WXK_DELETE ); ID_POPUP_SCH_MOVE_CMP_REQUEST );
static Ki_HotkeyInfo HkNextSearch( wxT( "Next Search" ), HK_NEXT_SEARCH, WXK_F5 ); static Ki_HotkeyInfo HkDragComponent( wxT( "Drag Component" ),
HK_DRAG_COMPONENT, 'G',
ID_POPUP_SCH_DRAG_CMP_REQUEST );
static Ki_HotkeyInfo HkMove2Drag( wxT( "Switch move block to drag block" ),
HK_MOVEBLOCK_TO_DRAGBLOCK, '\t' );
static Ki_HotkeyInfo HkInsert( wxT( "Repeat Last Item" ), HK_REPEAT_LAST,
WXK_INSERT );
static Ki_HotkeyInfo HkDelete( wxT( "Delete Item" ), HK_DELETE, WXK_DELETE );
static Ki_HotkeyInfo HkNextSearch( wxT( "Next Search" ), HK_NEXT_SEARCH,
WXK_F5 );
// Library editor: // Library editor:
static Ki_HotkeyInfo HkInsertPin( wxT( "Repeat Pin" ), HK_REPEAT_LAST, WXK_INSERT ); static Ki_HotkeyInfo HkInsertPin( wxT( "Repeat Pin" ), HK_REPEAT_LAST,
static Ki_HotkeyInfo HkEditPin( wxT( "Edit Pin" ), HK_EDIT_PIN, 'E' ); WXK_INSERT );
static Ki_HotkeyInfo HkMovePin( wxT( "Move Pin" ), HK_MOVE_PIN, 'M' ); static Ki_HotkeyInfo HkEditPin( wxT( "Edit Pin" ), HK_EDIT_PIN, 'E' );
static Ki_HotkeyInfo HkDeletePin( wxT( "Delete Pin" ), HK_DELETE_PIN, WXK_DELETE ); static Ki_HotkeyInfo HkMovePin( wxT( "Move Pin" ), HK_MOVE_PIN, 'M' );
static Ki_HotkeyInfo HkDeletePin( wxT( "Delete Pin" ), HK_DELETE_PIN,
WXK_DELETE );
// List of common hotkey descriptors // List of common hotkey descriptors
Ki_HotkeyInfo* s_Common_Hotkey_List[] = Ki_HotkeyInfo* s_Common_Hotkey_List[] =
{ {
&HkHelp, &HkHelp,
&HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, &HkZoomIn, &HkZoomOut, &HkZoomRedraw,
&HkZoomCenter,
&HkResetLocalCoord, &HkResetLocalCoord,
&HkUndo, &HkRedo, &HkUndo, &HkRedo,
NULL NULL
}; };
// List of hotkey descriptors for schematic // List of hotkey descriptors for schematic
Ki_HotkeyInfo* s_Schematic_Hotkey_List[] = { Ki_HotkeyInfo* s_Schematic_Hotkey_List[] =
{
&HkNextSearch, &HkNextSearch,
&HkDelete, &HkInsert, &HkMove2Drag, &HkDelete, &HkInsert, &HkMove2Drag,
&HkMoveComponent, &HkDragComponent, &HkAddComponent, &HkMoveComponent, &HkDragComponent, &HkAddComponent,
&HkRotateComponent, &HkMirrorXComponent, &HkMirrorYComponent, &HkOrientNormalComponent, &HkRotateComponent, &HkMirrorXComponent, &HkMirrorYComponent,
&HkEditComponentValue, &HkEditComponentFootprint, &HkOrientNormalComponent,
&HkEditComponentValue,&HkEditComponentFootprint,
&HkBeginWire, &HkBeginWire,
NULL NULL
}; };
...@@ -109,64 +137,71 @@ Ki_HotkeyInfo* s_LibEdit_Hotkey_List[] = ...@@ -109,64 +137,71 @@ Ki_HotkeyInfo* s_LibEdit_Hotkey_List[] =
NULL NULL
}; };
// list of sections and corresponding hotkey list for eeschema (used to create an hotkey config file) // list of sections and corresponding hotkey list for eeschema (used to create
// an hotkey config file)
struct Ki_HotkeyInfoSectionDescriptor s_Eeschema_Hokeys_Descr[] = struct Ki_HotkeyInfoSectionDescriptor s_Eeschema_Hokeys_Descr[] =
{ {
{ &g_CommonSectionTag, s_Common_Hotkey_List, "Common keys" }, { &g_CommonSectionTag, s_Common_Hotkey_List, "Common keys" },
{ &g_SchematicSectionTag, s_Schematic_Hotkey_List, "Schematic editor keys" }, { &g_SchematicSectionTag, s_Schematic_Hotkey_List, "Schematic editor keys" },
{ &g_LibEditSectionTag, s_LibEdit_Hotkey_List, "library editor keys" }, { &g_LibEditSectionTag, s_LibEdit_Hotkey_List, "library editor keys" },
{ NULL, NULL } { NULL, NULL, NULL }
}; };
// list of sections and corresponding hotkey list for the schematic editor (used to list current hotkeys) // list of sections and corresponding hotkey list for the schematic editor
// (used to list current hotkeys)
struct Ki_HotkeyInfoSectionDescriptor s_Schematic_Hokeys_Descr[] = struct Ki_HotkeyInfoSectionDescriptor s_Schematic_Hokeys_Descr[] =
{ {
{ &g_CommonSectionTag, s_Common_Hotkey_List, NULL }, { &g_CommonSectionTag, s_Common_Hotkey_List, NULL },
{ &g_SchematicSectionTag, s_Schematic_Hotkey_List, NULL }, { &g_SchematicSectionTag, s_Schematic_Hotkey_List, NULL },
{ NULL, NULL, NULL } { NULL, NULL, NULL }
}; };
// list of sections and corresponding hotkey list for the component editor (used to list current hotkeys) // list of sections and corresponding hotkey list for the component editor
// (used to list current hotkeys)
struct Ki_HotkeyInfoSectionDescriptor s_Libedit_Hokeys_Descr[] = struct Ki_HotkeyInfoSectionDescriptor s_Libedit_Hokeys_Descr[] =
{ {
{ &g_CommonSectionTag, s_Common_Hotkey_List, NULL }, { &g_CommonSectionTag, s_Common_Hotkey_List, NULL },
{ &g_LibEditSectionTag, s_LibEdit_Hotkey_List, NULL }, { &g_LibEditSectionTag, s_LibEdit_Hotkey_List, NULL },
{ NULL, NULL, NULL } { NULL, NULL, NULL }
}; };
/***********************************************************/ /*
* Hot keys. Some commands are relative to the item under the mouse cursor
* Commands are case insensitive
*/
void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
EDA_BaseStruct* DrawStruct ) EDA_BaseStruct* DrawStruct )
/***********************************************************/
/* Hot keys. Some commands are relative to the item under the mouse cursor
* Commands are case insensitive
*/
{ {
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
cmd.SetEventObject( this ); cmd.SetEventObject( this );
bool ItemInEdit = GetScreen()->GetCurItem() bool ItemInEdit = GetScreen()->GetCurItem()
&& GetScreen()->GetCurItem()->m_Flags; && GetScreen()->GetCurItem()->m_Flags;
bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified bool RefreshToolBar = FALSE;
SCH_SCREEN* screen = GetScreen();
if( hotkey == 0 ) if( hotkey == 0 )
return; return;
wxPoint MousePos = GetScreen()->m_MousePosition; wxPoint MousePos = GetScreen()->m_MousePosition;
// Remap the control key Ctrl A (0x01) to GR_KB_CTRL + 'A' (easier to handle...) // Remap the control key Ctrl A (0x01) to GR_KB_CTRL + 'A' (easier to
// handle...)
if( (hotkey & GR_KB_CTRL) != 0 ) if( (hotkey & GR_KB_CTRL) != 0 )
hotkey += 'A' - 1; hotkey += 'A' - 1;
/* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ /* Convert lower to upper case (the usual toupper function has problem
* with non ascii codes like function keys */
if( (hotkey >= 'a') && (hotkey <= 'z') ) if( (hotkey >= 'a') && (hotkey <= 'z') )
hotkey += 'A' - 'a'; hotkey += 'A' - 'a';
// Search command from key : // Search command from key :
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Common_Hotkey_List ); Ki_HotkeyInfo* HK_Descr = GetDescriptorFromHotkey( hotkey,
s_Common_Hotkey_List );
if( HK_Descr == NULL ) if( HK_Descr == NULL )
HK_Descr = GetDescriptorFromHotkey( hotkey, s_Schematic_Hotkey_List ); HK_Descr = GetDescriptorFromHotkey( hotkey, s_Schematic_Hotkey_List );
if( HK_Descr == NULL ) return; if( HK_Descr == NULL )
return;
switch( HK_Descr->m_Idcommand ) switch( HK_Descr->m_Idcommand )
{ {
...@@ -204,83 +239,85 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, ...@@ -204,83 +239,85 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
case HK_UNDO: case HK_UNDO:
case HK_REDO: case HK_REDO:
if( ItemInEdit ) if( !ItemInEdit )
break; {
{ wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED,
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent ); HK_Descr->m_IdMenuEvent );
wxPostEvent( this, event );
wxPostEvent( this, event ); }
}
break; break;
case HK_MOVEBLOCK_TO_DRAGBLOCK: // Switch to drag mode, when block moving case HK_MOVEBLOCK_TO_DRAGBLOCK: // Switch to drag mode, when block moving
HandleBlockEndByPopUp( BLOCK_DRAG, DC ); HandleBlockEndByPopUp( BLOCK_DRAG, DC );
break; break;
case HK_DELETE: case HK_DELETE:
if( ItemInEdit ) if( !ItemInEdit && screen->BlockLocate.m_State == STATE_NO_BLOCK )
break; {
RefreshToolBar = LocateAndDeleteItem( this, DC ); RefreshToolBar = LocateAndDeleteItem( this, DC );
GetScreen()->SetModify(); GetScreen()->SetModify();
GetScreen()->SetCurItem( NULL ); GetScreen()->SetCurItem( NULL );
TestDanglingEnds( GetScreen()->EEDrawList, DC ); TestDanglingEnds( GetScreen()->EEDrawList, DC );
}
break; break;
case HK_REPEAT_LAST: case HK_REPEAT_LAST:
if( ItemInEdit ) if( !ItemInEdit && g_ItemToRepeat && ( g_ItemToRepeat->m_Flags == 0 ) )
break;
if( g_ItemToRepeat && (g_ItemToRepeat->m_Flags == 0) )
{
RepeatDrawItem( DC ); RepeatDrawItem( DC );
}
break; break;
case HK_NEXT_SEARCH: case HK_NEXT_SEARCH:
if( ItemInEdit ) if( !ItemInEdit )
break; {
if( g_LastSearchIsMarker ) if( g_LastSearchIsMarker )
WinEDA_SchematicFrame::FindMarker( 1 ); WinEDA_SchematicFrame::FindMarker( 1 );
else else
FindSchematicItem( wxEmptyString, 2 ); FindSchematicItem( wxEmptyString, 2 );
}
break; break;
case HK_ADD_NEW_COMPONENT: // Add component case HK_ADD_NEW_COMPONENT: // Add component
if( ItemInEdit ) if( !ItemInEdit )
break; {
// switch to m_ID_current_state = ID_COMPONENT_BUTT;
// switch to m_ID_current_state = ID_COMPONENT_BUTT; if( m_ID_current_state != ID_COMPONENT_BUTT )
if( m_ID_current_state != ID_COMPONENT_BUTT ) SetToolID( ID_COMPONENT_BUTT, wxCURSOR_PENCIL,
SetToolID( ID_COMPONENT_BUTT, wxCURSOR_PENCIL, _( "Add Component" ) ); _( "Add Component" ) );
OnLeftClick( DC, MousePos ); OnLeftClick( DC, MousePos );
}
break; break;
case HK_BEGIN_WIRE: // Add wire case HK_BEGIN_WIRE:
if( DrawStruct ) // An item is selected. If edited and not a wire, a new command is not possible /* An item is selected. If edited and not a wire, a new command is not
* possible */
if( !ItemInEdit && screen->BlockLocate.m_State == STATE_NO_BLOCK )
{ {
if( DrawStruct->m_Flags ) // Item selected and edition in progress if( DrawStruct && DrawStruct->m_Flags )
{ {
if( DrawStruct->Type() == DRAW_SEGMENT_STRUCT_TYPE ) if( DrawStruct->Type() == DRAW_SEGMENT_STRUCT_TYPE )
{ {
EDA_DrawLineStruct* segment = (EDA_DrawLineStruct*) DrawStruct; EDA_DrawLineStruct* segment =
(EDA_DrawLineStruct*) DrawStruct;
if( segment->GetLayer() != LAYER_WIRE ) if( segment->GetLayer() != LAYER_WIRE )
break; break;
} }
else else
break; break;
} }
}
// switch to m_ID_current_state = ID_WIRE_BUTT; // switch to m_ID_current_state = ID_WIRE_BUTT;
if( m_ID_current_state != ID_WIRE_BUTT ) if( m_ID_current_state != ID_WIRE_BUTT )
SetToolID( ID_WIRE_BUTT, wxCURSOR_PENCIL, _( "Add Wire" ) ); SetToolID( ID_WIRE_BUTT, wxCURSOR_PENCIL, _( "Add Wire" ) );
OnLeftClick( DC, MousePos ); OnLeftClick( DC, MousePos );
}
break; break;
case HK_ROTATE_COMPONENT: // Component Rotation case HK_ROTATE_COMPONENT: // Component Rotation
if( DrawStruct == NULL ) if( DrawStruct == NULL )
{ {
DrawStruct = PickStruct( GetScreen()->m_Curseur, DrawStruct = PickStruct( GetScreen()->m_Curseur,
GetScreen(), LIBITEM | TEXTITEM | LABELITEM ); GetScreen(), LIBITEM | TEXTITEM |
LABELITEM );
if( DrawStruct == NULL ) if( DrawStruct == NULL )
break; break;
if( DrawStruct->Type() == TYPE_SCH_COMPONENT ) if( DrawStruct->Type() == TYPE_SCH_COMPONENT )
...@@ -298,8 +335,8 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, ...@@ -298,8 +335,8 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
RefreshToolBar = TRUE; RefreshToolBar = TRUE;
} }
CmpRotationMiroir( CmpRotationMiroir( (SCH_COMPONENT*) DrawStruct, DC,
(SCH_COMPONENT*) DrawStruct, DC, CMP_ROTATE_COUNTERCLOCKWISE ); CMP_ROTATE_COUNTERCLOCKWISE );
break; break;
case TYPE_SCH_TEXT: case TYPE_SCH_TEXT:
...@@ -322,7 +359,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, ...@@ -322,7 +359,7 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
case HK_MIRROR_Y_COMPONENT: // Mirror Y (Component) case HK_MIRROR_Y_COMPONENT: // Mirror Y (Component)
if( DrawStruct == NULL ) if( DrawStruct == NULL )
DrawStruct = LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ); DrawStruct = LocateSmallestComponent( (SCH_SCREEN*) GetScreen() );
if( DrawStruct ) if( DrawStruct )
{ {
if( DrawStruct->m_Flags == 0 ) if( DrawStruct->m_Flags == 0 )
...@@ -341,11 +378,10 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, ...@@ -341,11 +378,10 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
{ {
if( DrawStruct->m_Flags == 0 ) if( DrawStruct->m_Flags == 0 )
{ {
SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, IS_CHANGED ); SaveCopyInUndoList( (SCH_ITEM*) DrawStruct, IS_CHANGED );
RefreshToolBar = TRUE; RefreshToolBar = TRUE;
} }
CmpRotationMiroir( CmpRotationMiroir( (SCH_COMPONENT*) DrawStruct, DC, CMP_MIROIR_X );
(SCH_COMPONENT*) DrawStruct, DC, CMP_MIROIR_X );
} }
break; break;
...@@ -373,20 +409,21 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, ...@@ -373,20 +409,21 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
if( DrawStruct && (DrawStruct->m_Flags ==0) ) if( DrawStruct && (DrawStruct->m_Flags ==0) )
{ {
GetScreen()->SetCurItem( (SCH_ITEM*) DrawStruct ); GetScreen()->SetCurItem( (SCH_ITEM*) DrawStruct );
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent ); wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED,
HK_Descr->m_IdMenuEvent );
wxPostEvent( this, event ); wxPostEvent( this, event );
} }
break; break;
case HK_EDIT_COMPONENT_VALUE: case HK_EDIT_COMPONENT_VALUE:
if( ItemInEdit ) if( ItemInEdit )
break; break;
if( DrawStruct == NULL ) if( DrawStruct == NULL )
DrawStruct = LocateSmallestComponent( GetScreen() ); DrawStruct = LocateSmallestComponent( GetScreen() );
if(DrawStruct) if( DrawStruct )
{ {
EditComponentValue( EditComponentValue( (SCH_COMPONENT*) DrawStruct, DC );
(SCH_COMPONENT*) DrawStruct, DC );
} }
break; break;
...@@ -395,10 +432,9 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, ...@@ -395,10 +432,9 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
break; break;
if( DrawStruct == NULL ) if( DrawStruct == NULL )
DrawStruct = LocateSmallestComponent( GetScreen() ); DrawStruct = LocateSmallestComponent( GetScreen() );
if(DrawStruct) if( DrawStruct )
{ {
EditComponentFootprint( EditComponentFootprint( (SCH_COMPONENT*) DrawStruct, DC );
(SCH_COMPONENT*) DrawStruct, DC );
} }
break; break;
} }
...@@ -408,39 +444,46 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, ...@@ -408,39 +444,46 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey,
} }
/***********************************************************/ /*
* Hot keys for the component editor. Some commands are relatives to the item
* under the mouse cursor
* Commands are case insensitive
*/
void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey, void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey,
EDA_BaseStruct* DrawStruct ) EDA_BaseStruct* DrawStruct )
/***********************************************************/
/* Hot keys for the component editor. Some commands are relatives to the item under the mouse cursor
* Commands are case insensitive
*/
{ {
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
wxCommandEvent toolCmd( wxEVT_COMMAND_TOOL_CLICKED );
cmd.SetEventObject( this ); cmd.SetEventObject( this );
bool ItemInEdit = GetScreen()->GetCurItem() bool ItemInEdit = GetScreen()->GetCurItem()
&& GetScreen()->GetCurItem()->m_Flags; && GetScreen()->GetCurItem()->m_Flags;
bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified bool RefreshToolBar = FALSE; /* Refresh tool bar when the undo/redo
* tool state is modified. */
if( hotkey == 0 ) if( hotkey == 0 )
return; return;
wxPoint MousePos = GetScreen()->m_MousePosition; wxPoint MousePos = GetScreen()->m_MousePosition;
LibEDA_BaseStruct* DrawEntry = LocateItemUsingCursor(); LibEDA_BaseStruct* DrawEntry = LocateItemUsingCursor();
// Remap the control key Ctrl A (0x01) to GR_KB_CTRL + 'A' (easier to handle...) // Remap the control key Ctrl A (0x01) to GR_KB_CTRL + 'A' (easier to
// handle...)
if( (hotkey & GR_KB_CTRL) != 0 ) if( (hotkey & GR_KB_CTRL) != 0 )
hotkey += 'A' - 1; hotkey += 'A' - 1;
/* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */
/* Convert lower to upper case (the usual toupper function has problem
* with non ascii codes like function keys */
if( (hotkey >= 'a') && (hotkey <= 'z') ) if( (hotkey >= 'a') && (hotkey <= 'z') )
hotkey += 'A' - 'a'; hotkey += 'A' - 'a';
Ki_HotkeyInfo * HK_Descr = GetDescriptorFromHotkey( hotkey, s_Common_Hotkey_List ); Ki_HotkeyInfo* HK_Descr = GetDescriptorFromHotkey( hotkey,
s_Common_Hotkey_List );
if( HK_Descr == NULL ) if( HK_Descr == NULL )
HK_Descr = GetDescriptorFromHotkey( hotkey, s_LibEdit_Hotkey_List ); HK_Descr = GetDescriptorFromHotkey( hotkey, s_LibEdit_Hotkey_List );
if( HK_Descr == NULL ) return; if( HK_Descr == NULL )
return;
switch( HK_Descr->m_Idcommand ) switch( HK_Descr->m_Idcommand )
{ {
...@@ -478,14 +521,19 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey, ...@@ -478,14 +521,19 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey,
break; break;
case HK_UNDO: case HK_UNDO:
case HK_REDO: if( !ItemInEdit )
if( ItemInEdit ) {
break; toolCmd.SetId( ID_LIBEDIT_UNDO );
{ GetEventHandler()->ProcessEvent( toolCmd );
wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent ); }
break;
wxPostEvent( this, event ); case HK_REDO:
} if( !ItemInEdit )
{
toolCmd.SetId( ID_LIBEDIT_REDO );
GetEventHandler()->ProcessEvent( toolCmd );
}
break; break;
case HK_REPEAT_LAST: case HK_REPEAT_LAST:
...@@ -497,36 +545,40 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey, ...@@ -497,36 +545,40 @@ void WinEDA_LibeditFrame::OnHotKey( wxDC* DC, int hotkey,
else else
wxBell(); wxBell();
break; break;
case HK_EDIT_PIN: case HK_EDIT_PIN:
if(DrawEntry) if( DrawEntry )
CurrentDrawItem = DrawEntry; CurrentDrawItem = DrawEntry;
if(CurrentDrawItem) if( CurrentDrawItem )
{ {
if(CurrentDrawItem->Type() == COMPONENT_PIN_DRAW_TYPE) if( CurrentDrawItem->Type() == COMPONENT_PIN_DRAW_TYPE )
InstallPineditFrame( this, DC, MousePos ); InstallPineditFrame( this, DC, MousePos );
} }
break; break;
case HK_DELETE_PIN: case HK_DELETE_PIN:
if(DrawEntry) if( DrawEntry )
CurrentDrawItem = DrawEntry; CurrentDrawItem = DrawEntry;
if(CurrentDrawItem) if( CurrentDrawItem )
{ {
wxCommandEvent evt; wxCommandEvent evt;
evt.SetId(ID_POPUP_LIBEDIT_DELETE_ITEM); evt.SetId( ID_POPUP_LIBEDIT_DELETE_ITEM );
Process_Special_Functions(evt); Process_Special_Functions( evt );
} }
break; break;
case HK_MOVE_PIN: case HK_MOVE_PIN:
if(DrawEntry) if( DrawEntry )
CurrentDrawItem = DrawEntry; CurrentDrawItem = DrawEntry;
if(CurrentDrawItem) if( CurrentDrawItem )
{ {
wxCommandEvent evt; wxCommandEvent evt;
evt.SetId(ID_POPUP_LIBEDIT_MOVE_ITEM_REQUEST); evt.SetId( ID_POPUP_LIBEDIT_MOVE_ITEM_REQUEST );
Process_Special_Functions(evt); Process_Special_Functions( evt );
} }
break; break;
} }
if( RefreshToolBar ) if( RefreshToolBar )
SetToolbars(); SetToolbars();
} }
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