Commit 7774d684 authored by jean-pierre charras's avatar jean-pierre charras

Pcbnew: Added move and rotate hot keys in board editor. hotkeys.cpp code...

Pcbnew: Added move and rotate hot keys in board editor. hotkeys.cpp code cleaned. Fixed a bug that can crashes Pcbnew when switching track posture.
parent 0e7fa222
...@@ -281,18 +281,16 @@ public: ...@@ -281,18 +281,16 @@ public:
* Moves or drag the item (footprint, track, text .. ) found under the mouse cursor * Moves or drag the item (footprint, track, text .. ) found under the mouse cursor
* Only a footprint or a track can be dragged * Only a footprint or a track can be dragged
* @param aIdCommand = the hotkey command id * @param aIdCommand = the hotkey command id
* @param aDC = current device context
* @return true if an item was moved * @return true if an item was moved
*/ */
bool OnHotkeyMoveItem( int aIdCommand, wxDC* aDC ); bool OnHotkeyMoveItem( int aIdCommand );
/** Function OnHotkeyRotateItem /** Function OnHotkeyRotateItem
* Rotate the item (text or footprint) found under the mouse cursor * Rotate the item (text or footprint) found under the mouse cursor
* @param aIdCommand = the hotkey command id * @param aIdCommand = the hotkey command id
* @param aDC = current device context
* @return true if an item was moved * @return true if an item was moved
*/ */
bool OnHotkeyRotateItem( int aIdCommand, wxDC* aDC ); bool OnHotkeyRotateItem( int aIdCommand );
void OnCloseWindow( wxCloseEvent& Event ); void OnCloseWindow( wxCloseEvent& Event );
void Process_Special_Functions( wxCommandEvent& event ); void Process_Special_Functions( wxCommandEvent& event );
......
...@@ -45,23 +45,23 @@ void WinEDA_PcbFrame::AutoPlace( wxCommandEvent& event ) ...@@ -45,23 +45,23 @@ void WinEDA_PcbFrame::AutoPlace( wxCommandEvent& event )
switch( id ) switch( id )
{ {
case ID_TOOLBARH_PCB_AUTOPLACE: case ID_TOOLBARH_PCB_MODE_MODULE:
on_state = m_HToolBar->GetToolState( ID_TOOLBARH_PCB_AUTOPLACE ); on_state = m_HToolBar->GetToolState( ID_TOOLBARH_PCB_MODE_MODULE );
if( on_state ) if( on_state )
{ {
m_HToolBar->ToggleTool( ID_TOOLBARH_PCB_AUTOROUTE, FALSE ); m_HToolBar->ToggleTool( ID_TOOLBARH_PCB_MODE_TRACKS, FALSE );
m_HTOOL_current_state = ID_TOOLBARH_PCB_AUTOPLACE; m_HTOOL_current_state = ID_TOOLBARH_PCB_MODE_MODULE;
} }
else else
m_HTOOL_current_state = 0; m_HTOOL_current_state = 0;
return; return;
case ID_TOOLBARH_PCB_AUTOROUTE: case ID_TOOLBARH_PCB_MODE_TRACKS:
on_state = m_HToolBar->GetToolState( ID_TOOLBARH_PCB_AUTOROUTE ); on_state = m_HToolBar->GetToolState( ID_TOOLBARH_PCB_MODE_TRACKS );
if( on_state ) if( on_state )
{ {
m_HToolBar->ToggleTool( ID_TOOLBARH_PCB_AUTOPLACE, FALSE ); m_HToolBar->ToggleTool( ID_TOOLBARH_PCB_MODE_MODULE, FALSE );
m_HTOOL_current_state = ID_TOOLBARH_PCB_AUTOROUTE; m_HTOOL_current_state = ID_TOOLBARH_PCB_MODE_TRACKS;
} }
else else
m_HTOOL_current_state = 0; m_HTOOL_current_state = 0;
......
...@@ -83,7 +83,7 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay( int aHotKeyCode ) ...@@ -83,7 +83,7 @@ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay( int aHotKeyCode )
{ {
switch( m_HTOOL_current_state ) switch( m_HTOOL_current_state )
{ {
case ID_TOOLBARH_PCB_AUTOPLACE: case ID_TOOLBARH_PCB_MODE_MODULE:
scanList = GENERAL_COLLECTOR::ModuleItems; scanList = GENERAL_COLLECTOR::ModuleItems;
break; break;
......
...@@ -348,10 +348,13 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) ...@@ -348,10 +348,13 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_PCB_SWITCH_TRACK_POSTURE: case ID_POPUP_PCB_SWITCH_TRACK_POSTURE:
/* change the position of initial segment when creating new tracks /* change the position of initial segment when creating new tracks
* switch from _/ to -\ . * switch from _/ to -\ .
* If a track is in progress, it will be redrawn
*/ */
ShowNewTrackWhenMovingCursor( DrawPanel, &dc, false ); if( DrawPanel->ManageCurseur == ShowNewTrackWhenMovingCursor )
ShowNewTrackWhenMovingCursor( DrawPanel, &dc, false );
g_Alternate_Track_Posture = !g_Alternate_Track_Posture; g_Alternate_Track_Posture = !g_Alternate_Track_Posture;
ShowNewTrackWhenMovingCursor( DrawPanel, &dc, false ); if( DrawPanel->ManageCurseur == ShowNewTrackWhenMovingCursor )
ShowNewTrackWhenMovingCursor( DrawPanel, &dc, false );
break; break;
case ID_POPUP_PCB_PLACE_MICROVIA: case ID_POPUP_PCB_PLACE_MICROVIA:
......
...@@ -78,7 +78,7 @@ static Ki_HotkeyInfo HkFlipFootprint( wxT( "Flip Footprint" ), HK_FLIP_FOOTPRINT ...@@ -78,7 +78,7 @@ static Ki_HotkeyInfo HkFlipFootprint( wxT( "Flip Footprint" ), HK_FLIP_FOOTPRINT
'F' ); 'F' );
static Ki_HotkeyInfo HkRotateItem( wxT( "Rotate Item" ), HK_ROTATE_ITEM, 'R' ); static Ki_HotkeyInfo HkRotateItem( wxT( "Rotate Item" ), HK_ROTATE_ITEM, 'R' );
static Ki_HotkeyInfo HkMoveItem( wxT( "Move Item" ), HK_MOVE_ITEM, 'M' ); static Ki_HotkeyInfo HkMoveItem( wxT( "Move Item" ), HK_MOVE_ITEM, 'M' );
static Ki_HotkeyInfo HkDragFootprint( wxT( "Drag Footprint" ), HK_DRAG_FOOTPRINT_OR_TRACK, static Ki_HotkeyInfo HkDragFootprint( wxT( "Drag Footprint" ), HK_DRAG_ITEM,
'G' ); 'G' );
static Ki_HotkeyInfo HkGetAndMoveFootprint( wxT( "Get and Move Footprint" ), static Ki_HotkeyInfo HkGetAndMoveFootprint( wxT( "Get and Move Footprint" ),
HK_GET_AND_MOVE_FOOTPRINT, 'T' ); HK_GET_AND_MOVE_FOOTPRINT, 'T' );
...@@ -222,6 +222,7 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte ...@@ -222,6 +222,7 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte
bool itemCurrentlyEdited = (GetCurItem() && GetCurItem()->m_Flags); bool itemCurrentlyEdited = (GetCurItem() && GetCurItem()->m_Flags);
MODULE* module = NULL; MODULE* module = NULL;
int evt_type = 0; //Used to post a wxCommandEvent on demand
/* Convert lower to upper case /* Convert lower to upper case
* (the usual toupper function has problem with non ascii codes like function keys * (the usual toupper function has problem with non ascii codes like function keys
...@@ -315,33 +316,27 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte ...@@ -315,33 +316,27 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte
break; break;
case HK_ZOOM_IN: case HK_ZOOM_IN:
cmd.SetId( ID_POPUP_ZOOM_IN ); evt_type = ID_POPUP_ZOOM_IN;
GetEventHandler()->ProcessEvent( cmd );
break; break;
case HK_ZOOM_OUT: case HK_ZOOM_OUT:
cmd.SetId( ID_POPUP_ZOOM_OUT ); evt_type = ID_POPUP_ZOOM_OUT;
GetEventHandler()->ProcessEvent( cmd );
break; break;
case HK_ZOOM_REDRAW: case HK_ZOOM_REDRAW:
cmd.SetId( ID_ZOOM_REDRAW ); evt_type = ID_ZOOM_REDRAW;
GetEventHandler()->ProcessEvent( cmd );
break; break;
case HK_ZOOM_CENTER: case HK_ZOOM_AUTO:
cmd.SetId( ID_POPUP_ZOOM_CENTER ); evt_type = ID_ZOOM_PAGE;
GetEventHandler()->ProcessEvent( cmd );
break; break;
case HK_ADD_MODULE: case HK_ZOOM_CENTER:
cmd.SetId( ID_COMPONENT_BUTT ); evt_type = ID_POPUP_ZOOM_CENTER;
GetEventHandler()->ProcessEvent( cmd );
break; break;
case HK_ZOOM_AUTO: case HK_ADD_MODULE:
cmd.SetId( ID_ZOOM_PAGE ); evt_type = ID_COMPONENT_BUTT;
GetEventHandler()->ProcessEvent( cmd );
break; break;
case HK_UNDO: case HK_UNDO:
...@@ -374,13 +369,13 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte ...@@ -374,13 +369,13 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte
break; break;
case HK_BACK_SPACE: case HK_BACK_SPACE:
if( m_ID_current_state == ID_TRACK_BUTT && getActiveLayer() if( m_ID_current_state == ID_TRACK_BUTT && (getActiveLayer() <= LAYER_N_FRONT) )
<= LAYER_N_FRONT )
{ {
if( !itemCurrentlyEdited ) if( !itemCurrentlyEdited )
{ {
// no track is currently being edited - select a segment and remove it. // no track is currently being edited - select a segment and remove it.
// @todo: possibly? pass the HK command code to PcbGeneralLocateAndDisplay() so it can restrict its search to specific item types. // @todo: possibly? pass the HK command code to PcbGeneralLocateAndDisplay()
// so it can restrict its search to specific item types.
aItem = PcbGeneralLocateAndDisplay(); aItem = PcbGeneralLocateAndDisplay();
// don't let backspace delete modules!! // don't let backspace delete modules!!
...@@ -416,40 +411,22 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte ...@@ -416,40 +411,22 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte
case HK_GET_AND_MOVE_FOOTPRINT: case HK_GET_AND_MOVE_FOOTPRINT:
if( !itemCurrentlyEdited ) if( !itemCurrentlyEdited )
{ evt_type = ID_POPUP_PCB_GET_AND_MOVE_MODULE_REQUEST;
wxCommandEvent evt;
evt.SetId( ID_POPUP_PCB_GET_AND_MOVE_MODULE_REQUEST );
Process_Special_Functions( evt );
}
break; break;
case HK_FIND_ITEM: case HK_FIND_ITEM:
if( !itemCurrentlyEdited ) if( !itemCurrentlyEdited )
{ evt_type = ID_FIND_ITEMS;
wxCommandEvent evt;
evt.SetId( ID_FIND_ITEMS );
Process_Special_Functions( evt );
}
break; break;
case HK_LOAD_BOARD: case HK_LOAD_BOARD:
if( !itemCurrentlyEdited ) if( !itemCurrentlyEdited )
{ evt_type = ID_LOAD_FILE ;
// try not to duplicate save, load code etc.
wxCommandEvent evt;
evt.SetId( ID_LOAD_FILE );
Files_io( evt );
}
break; break;
case HK_SAVE_BOARD: case HK_SAVE_BOARD:
if( !itemCurrentlyEdited ) if( !itemCurrentlyEdited )
{ evt_type = ID_SAVE_BOARD;
// try not to duplicate save, load code etc.
wxCommandEvent evt;
evt.SetId( ID_SAVE_BOARD );
Files_io( evt );
}
break; break;
case HK_ADD_MICROVIA: // Place a micro via if a track is in progress case HK_ADD_MICROVIA: // Place a micro via if a track is in progress
...@@ -464,14 +441,7 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte ...@@ -464,14 +441,7 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte
// place micro via and switch layer // place micro via and switch layer
if( IsMicroViaAcceptable() ) if( IsMicroViaAcceptable() )
{ evt_type = ID_POPUP_PCB_PLACE_MICROVIA;
int v_type = GetBoard()->GetBoardDesignSettings()->m_CurrentViaType;
GetBoard()->GetBoardDesignSettings()->m_CurrentViaType = VIA_MICROVIA;
Other_Layer_Route( (TRACK*) GetCurItem(), aDC );
GetBoard()->GetBoardDesignSettings()->m_CurrentViaType = v_type;
if( DisplayOpt.ContrastModeDisplay )
DrawPanel->Refresh();
}
break; break;
case HK_ADD_VIA: // Switch to alternate layer and Place a via if a track is in progress case HK_ADD_VIA: // Switch to alternate layer and Place a via if a track is in progress
...@@ -486,19 +456,14 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte ...@@ -486,19 +456,14 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte
return; return;
if( (GetCurItem()->m_Flags & IS_NEW) == 0 ) if( (GetCurItem()->m_Flags & IS_NEW) == 0 )
return; return;
Other_Layer_Route( (TRACK*) GetCurItem(), aDC ); // place via and switch layer evt_type = ID_POPUP_PCB_PLACE_VIA;
if( DisplayOpt.ContrastModeDisplay )
DrawPanel->Refresh();
break; break;
case HK_SWITCH_TRACK_POSTURE: case HK_SWITCH_TRACK_POSTURE:
/* change the position of initial segment when creating new tracks /* change the position of initial segment when creating new tracks
* switch from _/ to -\ . * switch from _/ to -\ .
*/ */
ShowNewTrackWhenMovingCursor( DrawPanel, aDC, false ); evt_type = ID_POPUP_PCB_SWITCH_TRACK_POSTURE ;
g_Alternate_Track_Posture = !g_Alternate_Track_Posture;
ShowNewTrackWhenMovingCursor( DrawPanel, aDC, false );
break; break;
case HK_ADD_NEW_TRACK: // Start new track case HK_ADD_NEW_TRACK: // Start new track
...@@ -561,22 +526,30 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte ...@@ -561,22 +526,30 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* aDC, int aHotkeyCode, EDA_BaseStruct* aIte
} }
break; break;
case HK_DRAG_FOOTPRINT_OR_TRACK: // Start drag module or track segment case HK_DRAG_ITEM: // Start drag module or track segment
OnHotkeyMoveItem( HK_DRAG_FOOTPRINT_OR_TRACK, aDC ); OnHotkeyMoveItem( HK_DRAG_ITEM );
break; break;
case HK_MOVE_ITEM: // Start move item case HK_MOVE_ITEM: // Start move item
OnHotkeyMoveItem( HK_MOVE_ITEM, aDC ); OnHotkeyMoveItem( HK_MOVE_ITEM );
break; break;
case HK_ROTATE_ITEM: // Rotation case HK_ROTATE_ITEM: // Rotation
OnHotkeyRotateItem( HK_ROTATE_ITEM, aDC ); OnHotkeyRotateItem( HK_ROTATE_ITEM );
break; break;
case HK_FLIP_FOOTPRINT: // move to other side case HK_FLIP_FOOTPRINT: // move to other side
OnHotkeyRotateItem( HK_FLIP_FOOTPRINT, aDC ); OnHotkeyRotateItem( HK_FLIP_FOOTPRINT );
break; break;
} }
if( evt_type != 0 )
{
wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED );
evt.SetEventObject( this );
evt.SetId( evt_type );
wxPostEvent( this, evt );
}
} }
...@@ -592,7 +565,8 @@ void WinEDA_ModuleEditFrame::OnHotKey( wxDC* aDC, int hotkey, ...@@ -592,7 +565,8 @@ void WinEDA_ModuleEditFrame::OnHotKey( wxDC* aDC, int hotkey,
if( hotkey == 0 ) if( hotkey == 0 )
return; return;
bool ItemFree = (GetCurItem() == 0 || GetCurItem()->m_Flags == 0); BOARD_ITEM* item = GetCurItem();
bool ItemFree = (item == 0) || (item->m_Flags == 0);
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
cmd.SetEventObject( this ); cmd.SetEventObject( this );
...@@ -678,7 +652,8 @@ void WinEDA_ModuleEditFrame::OnHotKey( wxDC* aDC, int hotkey, ...@@ -678,7 +652,8 @@ void WinEDA_ModuleEditFrame::OnHotKey( wxDC* aDC, int hotkey,
*/ */
bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* aDC ) bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* aDC )
{ {
bool ItemFree = (GetCurItem() == NULL) || (GetCurItem()->m_Flags == 0); BOARD_ITEM* item = GetCurItem();
bool ItemFree = (item == NULL) || (item->m_Flags == 0);
switch( m_ID_current_state ) switch( m_ID_current_state )
{ {
...@@ -687,15 +662,15 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* aDC ) ...@@ -687,15 +662,15 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* aDC )
return false; return false;
if( ItemFree ) if( ItemFree )
{ {
BOARD_ITEM* DrawStruct = PcbGeneralLocateAndDisplay(); item = PcbGeneralLocateAndDisplay();
if( DrawStruct && DrawStruct->Type() != TYPE_TRACK ) if( item && item->Type() != TYPE_TRACK )
return false; return false;
Delete_Track( aDC, (TRACK*) DrawStruct ); Delete_Track( aDC, (TRACK*) item );
} }
else if( GetCurItem()->Type() == TYPE_TRACK ) else if( item->Type() == TYPE_TRACK )
{ {
// simple lines for debugger: // simple lines for debugger:
TRACK* track = (TRACK*) GetCurItem(); TRACK* track = (TRACK*) item;
track = Delete_Segment( aDC, track ); track = Delete_Segment( aDC, track );
SetCurItem( track ); SetCurItem( track );
OnModify(); OnModify();
...@@ -729,59 +704,37 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* aDC ) ...@@ -729,59 +704,37 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* aDC )
/** Function OnHotkeyMoveItem /** Function OnHotkeyMoveItem
* Moves or drag the item (footprint, track, text .. ) found under the mouse cursor * Move or drag the item (footprint, track, text .. ) found under the mouse cursor
* Only a footprint or a track can be dragged * An item can be moved (or dragged) only if there is no item currently edited
* Only a footprint, a pad or a track can be dragged
* @param aIdCommand = the hotkey command id * @param aIdCommand = the hotkey command id
* @param aDC = current device context
* @return true if an item was moved * @return true if an item was moved
*/ */
bool WinEDA_PcbFrame::OnHotkeyMoveItem( int aIdCommand, wxDC* aDC ) bool WinEDA_PcbFrame::OnHotkeyMoveItem( int aIdCommand )
{ {
bool itemCurrentlyEdited = (GetCurItem() && GetCurItem()->m_Flags); BOARD_ITEM* item = GetCurItem();
bool itemCurrentlyEdited = item && item->m_Flags;
if( itemCurrentlyEdited ) if( itemCurrentlyEdited )
return false; return false;
BOARD_ITEM* item = NULL; item = PcbGeneralLocateAndDisplay();
if( m_ID_current_state == ID_COMPONENT_BUTT )
{
item = Locate_Prefered_Module( GetBoard(), CURSEUR_OFF_GRILLE
| IGNORE_LOCKED | VISIBLE_ONLY
#if defined(USE_MATCH_LAYER)
| MATCH_LAYER
#endif
);
if( item == NULL ) // no footprint found
item = Locate_Prefered_Module( GetBoard(),
CURSEUR_OFF_GRILLE | VISIBLE_ONLY );
}
if( item == NULL )
item = PcbGeneralLocateAndDisplay();
if( item == NULL ) if( item == NULL )
return false; return false;
SetCurItem( item ); SetCurItem( item );
int evt_type = 0; //Used to post a wxCommandEvent on demand
switch( item->Type() ) switch( item->Type() )
{ {
case TYPE_TRACK: case TYPE_TRACK:
case TYPE_VIA: case TYPE_VIA:
if( aIdCommand == HK_MOVE_ITEM ) if( aIdCommand == HK_MOVE_ITEM )
{ evt_type = ID_POPUP_PCB_MOVE_TRACK_NODE;
Start_MoveOneNodeOrSegment( (TRACK*) item, aDC, if( aIdCommand == HK_DRAG_ITEM )
ID_POPUP_PCB_MOVE_TRACK_NODE ); evt_type = ID_POPUP_PCB_DRAG_TRACK_SEGMENT;
return true;
}
if( aIdCommand == HK_DRAG_FOOTPRINT_OR_TRACK )
{
//Start_DragTrackSegmentAndKeepSlope( (TRACK*) DrawStruct, aDC );
Start_MoveOneNodeOrSegment( (TRACK*) item, aDC,
ID_POPUP_PCB_DRAG_TRACK_SEGMENT );
return true;
}
break; break;
case TYPE_MODULE: case TYPE_MODULE:
...@@ -797,107 +750,119 @@ bool WinEDA_PcbFrame::OnHotkeyMoveItem( int aIdCommand, wxDC* aDC ) ...@@ -797,107 +750,119 @@ bool WinEDA_PcbFrame::OnHotkeyMoveItem( int aIdCommand, wxDC* aDC )
DisplayInfoMessage( this, msg ); DisplayInfoMessage( this, msg );
break; break;
} }
if( aIdCommand == HK_MOVE_ITEM )
evt_type = ID_POPUP_PCB_MOVE_MODULE_REQUEST;
if( aIdCommand == HK_DRAG_ITEM )
evt_type = ID_POPUP_PCB_DRAG_MODULE_REQUEST;
}
break;
// Send the module via socket to EESCHEMA's search facility. case TYPE_PAD:
SendMessageToEESCHEMA( module ); if( aIdCommand == HK_MOVE_ITEM )
evt_type = ID_POPUP_PCB_MOVE_PAD_REQUEST;
if( aIdCommand == HK_DRAG_ITEM )
evt_type = ID_POPUP_PCB_DRAG_PAD_REQUEST;
break;
// Start move module case TYPE_TEXTE:
GetScreen()->m_Curseur = module->m_Pos; evt_type = ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST;
DrawPanel->MouseToCursorSchema(); break;
if( aIdCommand == HK_DRAG_FOOTPRINT_OR_TRACK )
g_Drag_Pistes_On = true;
StartMove_Module( module, aDC ); case TYPE_MIRE:
} evt_type = ID_POPUP_PCB_MOVE_MIRE_REQUEST;
return true; break;
case TYPE_ZONE_CONTAINER:
evt_type = ID_POPUP_PCB_MOVE_ZONE_OUTLINES;
break;
case TYPE_TEXTE_MODULE:
evt_type = ID_POPUP_PCB_MOVE_TEXTMODULE_REQUEST;
break;
case TYPE_DRAWSEGMENT:
evt_type = ID_POPUP_PCB_MOVE_DRAWING_REQUEST;
break;
default: default:
break; break;
} }
if( evt_type != 0 )
{
wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED );
evt.SetEventObject( this );
evt.SetId( evt_type );
wxPostEvent( this, evt );
return true;
}
return false; return false;
} }
/** Function OnHotkeyRotateItem /** Function OnHotkeyRotateItem
* Rotate the item (text or footprint) found under the mouse cursor * Rotate the item (text or footprint) found under the mouse cursor
* Note:
* this command can be used with an item currently in edit
* Only some items can be rotated (footprints and texts)
* @param aIdCommand = the hotkey command id * @param aIdCommand = the hotkey command id
* @param aDC = current device context
* @return true if an item was moved * @return true if an item was moved
*/ */
bool WinEDA_PcbFrame::OnHotkeyRotateItem( int aIdCommand, wxDC* aDC ) bool WinEDA_PcbFrame::OnHotkeyRotateItem( int aIdCommand )
{ {
bool itemCurrentlyEdited = (GetCurItem() && GetCurItem()->m_Flags); BOARD_ITEM* item = GetCurItem();
bool itemCurrentlyEdited = item && item->m_Flags;
MODULE* module = NULL; int evt_type = 0; // Used to post a wxCommandEvent on demand
if( !itemCurrentlyEdited ) if( !itemCurrentlyEdited )
{ item = PcbGeneralLocateAndDisplay();
module = Locate_Prefered_Module( GetBoard(), CURSEUR_OFF_GRILLE
| IGNORE_LOCKED | VISIBLE_ONLY
#if defined(USE_MATCH_LAYER)
| MATCH_LAYER
#endif
);
if( module == NULL ) // no footprint found
{
module = Locate_Prefered_Module( GetBoard(),
CURSEUR_OFF_GRILLE | VISIBLE_ONLY );
if( module )
{
// a footprint is found, but locked or on an other layer
if( module->IsLocked() )
{
wxString msg;
msg.Printf( _( "Footprint %s found, but locked" ),
module->m_Reference->m_Text.GetData() );
DisplayInfoMessage( this, msg );
}
module = NULL;
}
}
}
else if( GetCurItem()->Type() == TYPE_MODULE )
{
module = (MODULE*) GetCurItem();
// @todo: might need to add a layer check in if() below if( item == NULL )
if( (GetCurItem()->m_Flags == 0) && module->IsLocked() )
module = NULL; // do not move, rotate ... it.
}
if( module == NULL )
return false; return false;
/* I'd like to make sending to EESCHEMA edge triggered, but the SetCurItem( item );
* simple mouse click on a module when the arrow icon is in play
* does not set GetCurItem() at this time, nor does a mouse click switch( item->Type() )
* when the local ratsnest icon is in play set GetCurItem(), and these
* actions also call SendMessageToEESCHEMA().
* if( GetCurItem() != module )
*/
{ {
// Send the module via socket to EESCHEMA's search facility. case TYPE_MODULE:
SendMessageToEESCHEMA( module ); {
SetCurItem( module ); MODULE* module = (MODULE*) item;
if( module->IsLocked() )
{
wxString msg;
msg.Printf( _( "Footprint %s is locked" ),
module->m_Reference->m_Text.GetData() );
DisplayInfoMessage( this, msg );
break;
}
if( aIdCommand == HK_ROTATE_ITEM ) // Rotation
evt_type = ID_POPUP_PCB_ROTATE_MODULE_COUNTERCLOCKWISE;
if( aIdCommand == HK_FLIP_FOOTPRINT ) // move to other side
evt_type = ID_POPUP_PCB_CHANGE_SIDE_MODULE;
} }
break;
switch( aIdCommand ) case TYPE_TEXTE:
{ evt_type = ID_POPUP_PCB_ROTATE_TEXTEPCB;
case HK_ROTATE_ITEM: // Rotation break;
if( module->m_Flags == 0 ) // not currently in edit, prepare undo command
SaveCopyInUndoList( module, UR_ROTATED, module->m_Pos ); case TYPE_TEXTE_MODULE:
Rotate_Module( aDC, module, 900, true ); evt_type = ID_POPUP_PCB_ROTATE_TEXTMODULE;
break; break;
case HK_FLIP_FOOTPRINT: // move to other side default:
if( module->m_Flags == 0 ) // not currently in edit, prepare undo command
SaveCopyInUndoList( module, UR_FLIPPED, module->m_Pos );
Change_Side_Module( module, aDC );
break; break;
} }
module->DisplayInfo( this ); if( evt_type != 0 )
{
wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED );
evt.SetEventObject( this );
evt.SetId( evt_type );
wxPostEvent( this, evt );
return true;
}
return true; return false;
} }
...@@ -15,7 +15,7 @@ enum hotkey_id_commnand { ...@@ -15,7 +15,7 @@ enum hotkey_id_commnand {
HK_BACK_SPACE, HK_BACK_SPACE,
HK_ROTATE_ITEM, HK_ROTATE_ITEM,
HK_MOVE_ITEM, HK_MOVE_ITEM,
HK_DRAG_FOOTPRINT_OR_TRACK, HK_DRAG_ITEM,
HK_FLIP_FOOTPRINT, HK_FLIP_FOOTPRINT,
HK_GET_AND_MOVE_FOOTPRINT, HK_GET_AND_MOVE_FOOTPRINT,
HK_LOCK_UNLOCK_FOOTPRINT, HK_LOCK_UNLOCK_FOOTPRINT,
......
...@@ -120,7 +120,7 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) ...@@ -120,7 +120,7 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
case TYPE_MODULE: case TYPE_MODULE:
createPopUpMenuForFootprints( (MODULE*) item, aPopMenu ); createPopUpMenuForFootprints( (MODULE*) item, aPopMenu );
if( m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOPLACE ) if( m_HTOOL_current_state == ID_TOOLBARH_PCB_MODE_MODULE )
{ {
aPopMenu->AppendSeparator(); aPopMenu->AppendSeparator();
...@@ -146,7 +146,7 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) ...@@ -146,7 +146,7 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
_( "Auto Place Module" ) ); _( "Auto Place Module" ) );
} }
if( m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOROUTE ) if( m_HTOOL_current_state == ID_TOOLBARH_PCB_MODE_TRACKS )
{ {
if( !flags ) if( !flags )
aPopMenu->Append( ID_POPUP_PCB_AUTOROUTE_MODULE, _( "Autoroute Module" ) ); aPopMenu->Append( ID_POPUP_PCB_AUTOROUTE_MODULE, _( "Autoroute Module" ) );
...@@ -318,7 +318,7 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) ...@@ -318,7 +318,7 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
break; break;
case 0: case 0:
if( m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOPLACE ) if( m_HTOOL_current_state == ID_TOOLBARH_PCB_MODE_MODULE )
{ {
wxMenu* commands = new wxMenu; wxMenu* commands = new wxMenu;
ADD_MENUITEM_WITH_SUBMENU( aPopMenu, commands, ADD_MENUITEM_WITH_SUBMENU( aPopMenu, commands,
...@@ -342,7 +342,7 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) ...@@ -342,7 +342,7 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu )
aPopMenu->AppendSeparator(); aPopMenu->AppendSeparator();
} }
if( m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOROUTE ) if( m_HTOOL_current_state == ID_TOOLBARH_PCB_MODE_TRACKS )
{ {
wxMenu* commands = new wxMenu; wxMenu* commands = new wxMenu;
aPopMenu->Append( ID_POPUP_PCB_AUTOROUTE_COMMANDS, _( "Autoroute" ), commands ); aPopMenu->Append( ID_POPUP_PCB_AUTOROUTE_COMMANDS, _( "Autoroute" ), commands );
...@@ -641,7 +641,7 @@ void WinEDA_PcbFrame::createPopUpMenuForFootprints( MODULE* aModule, wxMenu* men ...@@ -641,7 +641,7 @@ void WinEDA_PcbFrame::createPopUpMenuForFootprints( MODULE* aModule, wxMenu* men
msg = AddHotkeyName( _( "Move" ), s_Board_Editor_Hokeys_Descr, HK_MOVE_ITEM ); msg = AddHotkeyName( _( "Move" ), s_Board_Editor_Hokeys_Descr, HK_MOVE_ITEM );
ADD_MENUITEM( sub_menu_footprint, ID_POPUP_PCB_MOVE_MODULE_REQUEST, ADD_MENUITEM( sub_menu_footprint, ID_POPUP_PCB_MOVE_MODULE_REQUEST,
msg, move_module_xpm ); msg, move_module_xpm );
msg = AddHotkeyName( _( "Drag" ), s_Board_Editor_Hokeys_Descr, HK_DRAG_FOOTPRINT_OR_TRACK ); msg = AddHotkeyName( _( "Drag" ), s_Board_Editor_Hokeys_Descr, HK_DRAG_ITEM );
ADD_MENUITEM( sub_menu_footprint, ID_POPUP_PCB_DRAG_MODULE_REQUEST, ADD_MENUITEM( sub_menu_footprint, ID_POPUP_PCB_DRAG_MODULE_REQUEST,
msg, drag_module_xpm ); msg, drag_module_xpm );
} }
...@@ -689,8 +689,9 @@ void WinEDA_PcbFrame::createPopUpMenuForFpTexts( TEXTE_MODULE* FpText, wxMenu* m ...@@ -689,8 +689,9 @@ void WinEDA_PcbFrame::createPopUpMenuForFpTexts( TEXTE_MODULE* FpText, wxMenu* m
msg, move_field_xpm ); msg, move_field_xpm );
} }
msg = AddHotkeyName( _( "Rotate" ), s_Board_Editor_Hokeys_Descr, HK_ROTATE_ITEM );
ADD_MENUITEM( sub_menu_Fp_text, ID_POPUP_PCB_ROTATE_TEXTMODULE, ADD_MENUITEM( sub_menu_Fp_text, ID_POPUP_PCB_ROTATE_TEXTMODULE,
_( "Rotate" ), rotate_field_xpm ); msg, rotate_field_xpm );
if( !flags ) if( !flags )
{ {
msg = AddHotkeyName( _( "Edit" ), s_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM ); msg = AddHotkeyName( _( "Edit" ), s_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM );
...@@ -742,8 +743,9 @@ void WinEDA_PcbFrame::createPopUpMenuForFpPads( D_PAD* Pad, wxMenu* menu ) ...@@ -742,8 +743,9 @@ void WinEDA_PcbFrame::createPopUpMenuForFpPads( D_PAD* Pad, wxMenu* menu )
msg = AddHotkeyName( _( "Move" ), s_Board_Editor_Hokeys_Descr, HK_MOVE_ITEM ); msg = AddHotkeyName( _( "Move" ), s_Board_Editor_Hokeys_Descr, HK_MOVE_ITEM );
ADD_MENUITEM( sub_menu_Pad, ID_POPUP_PCB_MOVE_PAD_REQUEST, ADD_MENUITEM( sub_menu_Pad, ID_POPUP_PCB_MOVE_PAD_REQUEST,
msg, move_pad_xpm ); msg, move_pad_xpm );
msg = AddHotkeyName( _( "Drag" ), s_Board_Editor_Hokeys_Descr, HK_DRAG_ITEM );
ADD_MENUITEM( sub_menu_Pad, ID_POPUP_PCB_DRAG_PAD_REQUEST, ADD_MENUITEM( sub_menu_Pad, ID_POPUP_PCB_DRAG_PAD_REQUEST,
_( "Drag" ), drag_pad_xpm ); msg, drag_pad_xpm );
msg = AddHotkeyName( _( "Edit Pad" ), s_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM ); msg = AddHotkeyName( _( "Edit Pad" ), s_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM );
ADD_MENUITEM( sub_menu_Pad, ID_POPUP_PCB_EDIT_PAD, msg, options_pad_xpm ); ADD_MENUITEM( sub_menu_Pad, ID_POPUP_PCB_EDIT_PAD, msg, options_pad_xpm );
...@@ -767,7 +769,7 @@ void WinEDA_PcbFrame::createPopUpMenuForFpPads( D_PAD* Pad, wxMenu* menu ) ...@@ -767,7 +769,7 @@ void WinEDA_PcbFrame::createPopUpMenuForFpPads( D_PAD* Pad, wxMenu* menu )
ADD_MENUITEM( sub_menu_Pad, ID_POPUP_PCB_DELETE_PAD, ADD_MENUITEM( sub_menu_Pad, ID_POPUP_PCB_DELETE_PAD,
_( "Delete" ), delete_pad_xpm ); _( "Delete" ), delete_pad_xpm );
if( m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOROUTE ) if( m_HTOOL_current_state == ID_TOOLBARH_PCB_MODE_TRACKS )
{ {
menu->Append( ID_POPUP_PCB_AUTOROUTE_PAD, _( "Autoroute Pad" ) ); menu->Append( ID_POPUP_PCB_AUTOROUTE_PAD, _( "Autoroute Pad" ) );
menu->Append( ID_POPUP_PCB_AUTOROUTE_NET, _( "Autoroute Net" ) ); menu->Append( ID_POPUP_PCB_AUTOROUTE_NET, _( "Autoroute Net" ) );
...@@ -801,8 +803,9 @@ void WinEDA_PcbFrame::createPopUpMenuForTexts( TEXTE_PCB* Text, wxMenu* menu ) ...@@ -801,8 +803,9 @@ void WinEDA_PcbFrame::createPopUpMenuForTexts( TEXTE_PCB* Text, wxMenu* menu )
ADD_MENUITEM( sub_menu_Text, ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST, ADD_MENUITEM( sub_menu_Text, ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST,
msg, move_text_xpm ); msg, move_text_xpm );
} }
msg = AddHotkeyName( _( "Rotate" ), s_Board_Editor_Hokeys_Descr, HK_ROTATE_ITEM );
ADD_MENUITEM( sub_menu_Text, ID_POPUP_PCB_ROTATE_TEXTEPCB, ADD_MENUITEM( sub_menu_Text, ID_POPUP_PCB_ROTATE_TEXTEPCB,
_( "Rotate" ), rotate_pos_xpm ); msg, rotate_pos_xpm );
msg = AddHotkeyName( _( "Edit" ), s_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM ); msg = AddHotkeyName( _( "Edit" ), s_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM );
ADD_MENUITEM( sub_menu_Text, ID_POPUP_PCB_EDIT_TEXTEPCB, ADD_MENUITEM( sub_menu_Text, ID_POPUP_PCB_EDIT_TEXTEPCB,
msg, edit_text_xpm ); msg, edit_text_xpm );
......
...@@ -183,8 +183,8 @@ BEGIN_EVENT_TABLE( WinEDA_PcbFrame, WinEDA_BasePcbFrame ) ...@@ -183,8 +183,8 @@ BEGIN_EVENT_TABLE( WinEDA_PcbFrame, WinEDA_BasePcbFrame )
WinEDA_PcbFrame::Tracks_and_Vias_Size_Event ) WinEDA_PcbFrame::Tracks_and_Vias_Size_Event )
EVT_KICAD_CHOICEBOX( ID_AUX_TOOLBAR_PCB_VIA_SIZE, EVT_KICAD_CHOICEBOX( ID_AUX_TOOLBAR_PCB_VIA_SIZE,
WinEDA_PcbFrame::Tracks_and_Vias_Size_Event ) WinEDA_PcbFrame::Tracks_and_Vias_Size_Event )
EVT_TOOL( ID_TOOLBARH_PCB_AUTOPLACE, WinEDA_PcbFrame::AutoPlace ) EVT_TOOL( ID_TOOLBARH_PCB_MODE_MODULE, WinEDA_PcbFrame::AutoPlace )
EVT_TOOL( ID_TOOLBARH_PCB_AUTOROUTE, WinEDA_PcbFrame::AutoPlace ) EVT_TOOL( ID_TOOLBARH_PCB_MODE_TRACKS, WinEDA_PcbFrame::AutoPlace )
EVT_TOOL( ID_TOOLBARH_PCB_FREEROUTE_ACCESS, EVT_TOOL( ID_TOOLBARH_PCB_FREEROUTE_ACCESS,
WinEDA_PcbFrame::Access_to_External_Tool ) WinEDA_PcbFrame::Access_to_External_Tool )
......
...@@ -215,8 +215,8 @@ enum pcbnew_ids ...@@ -215,8 +215,8 @@ enum pcbnew_ids
ID_MENU_PCB_SWAP_LAYERS, ID_MENU_PCB_SWAP_LAYERS,
ID_GEN_EXPORT_FILE_VRML, ID_GEN_EXPORT_FILE_VRML,
ID_TOOLBARH_PCB_AUTOPLACE, ID_TOOLBARH_PCB_MODE_MODULE,
ID_TOOLBARH_PCB_AUTOROUTE, ID_TOOLBARH_PCB_MODE_TRACKS,
ID_TOOLBARH_PCB_FREEROUTE_ACCESS, ID_TOOLBARH_PCB_FREEROUTE_ACCESS,
ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR, ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR,
......
...@@ -274,11 +274,11 @@ void WinEDA_PcbFrame::ReCreateHToolbar() ...@@ -274,11 +274,11 @@ void WinEDA_PcbFrame::ReCreateHToolbar()
*LayerPairBitmap, SEL_LAYER_HELP ); *LayerPairBitmap, SEL_LAYER_HELP );
m_HToolBar->AddSeparator(); m_HToolBar->AddSeparator();
m_HToolBar->AddTool( ID_TOOLBARH_PCB_AUTOPLACE, wxEmptyString, m_HToolBar->AddTool( ID_TOOLBARH_PCB_MODE_MODULE, wxEmptyString,
wxBitmap( mode_module_xpm ), wxBitmap( mode_module_xpm ),
_( "Mode footprint: manual and automatic move and place modules" ), _( "Mode footprint: manual and automatic move and place modules" ),
wxITEM_CHECK ); wxITEM_CHECK );
m_HToolBar->AddTool( ID_TOOLBARH_PCB_AUTOROUTE, wxEmptyString, m_HToolBar->AddTool( ID_TOOLBARH_PCB_MODE_TRACKS, wxEmptyString,
wxBitmap( mode_track_xpm ), wxBitmap( mode_track_xpm ),
_( "Mode track: autorouting" ), wxITEM_CHECK ); _( "Mode track: autorouting" ), wxITEM_CHECK );
......
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