bool GERBVIEW_FRAME::HandleBlockEnd( wxDC* DC ) { bool nextcmd = false; bool zoom_command = false; if( m_canvas->IsMouseCaptured() ) switch( GetScreen()->m_BlockLocate.GetCommand() ) { case BLOCK_MOVE: /* Move */ GetScreen()->m_BlockLocate.SetState( STATE_BLOCK_MOVE ); nextcmd = true; m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); m_canvas->SetMouseCaptureCallback( DrawMovingBlockOutlines ); m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); break; case BLOCK_ZOOM: /* Window Zoom */ zoom_command = true; break; default: wxFAIL_MSG( wxT("HandleBlockEnd: Unexpected block command") ); break; } if( ! nextcmd ) { GetScreen()->ClearBlockCommand(); m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, false ); } if( zoom_command ) Window_Zoom( GetScreen()->m_BlockLocate ); return nextcmd ; }
bool PCB_EDIT_FRAME::HandleBlockEnd( wxDC* DC ) { bool nextcmd = false; // Will be set to true if a block place is needed bool cancelCmd = false; // If coming here after cancel block, clean up and exit if( GetScreen()->m_BlockLocate.GetState() == STATE_NO_BLOCK ) { m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, false ); GetScreen()->ClearBlockCommand(); return false; } // Show dialog if there are no selected items and we're not zooming if( !GetScreen()->m_BlockLocate.GetCount() && GetScreen()->m_BlockLocate.GetCommand() != BLOCK_ZOOM ) { if( InstallBlockCmdFrame( this, _( "Block Operation" ) ) == false ) { cancelCmd = true; // undraw block outline m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); } else { DrawAndSizingBlockOutlines( m_canvas, DC, wxDefaultPosition, false ); Block_SelectItems(); // Exit if no items found if( !GetScreen()->m_BlockLocate.GetCount() ) cancelCmd = true; } } if( !cancelCmd && m_canvas->IsMouseCaptured() ) { switch( GetScreen()->m_BlockLocate.GetCommand() ) { case BLOCK_IDLE: DisplayError( this, wxT( "Error in HandleBlockPLace" ) ); break; case BLOCK_DRAG: // Drag (not used, for future enhancements) case BLOCK_MOVE: // Move case BLOCK_COPY: // Copy case BLOCK_COPY_AND_INCREMENT: // Copy and increment relevant references case BLOCK_PRESELECT_MOVE: // Move with preselection list GetScreen()->m_BlockLocate.SetState( STATE_BLOCK_MOVE ); nextcmd = true; m_canvas->SetMouseCaptureCallback( drawMovingBlock ); m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); break; case BLOCK_DELETE: // Delete m_canvas->SetMouseCaptureCallback( NULL ); GetScreen()->m_BlockLocate.SetState( STATE_BLOCK_STOP ); Block_Delete(); break; case BLOCK_ROTATE: // Rotation m_canvas->SetMouseCaptureCallback( NULL ); GetScreen()->m_BlockLocate.SetState( STATE_BLOCK_STOP ); Block_Rotate(); break; case BLOCK_FLIP: // Flip m_canvas->SetMouseCaptureCallback( NULL ); GetScreen()->m_BlockLocate.SetState( STATE_BLOCK_STOP ); Block_Flip(); break; case BLOCK_SAVE: // Save (not used, for future enhancements) GetScreen()->m_BlockLocate.SetState( STATE_BLOCK_STOP ); if( GetScreen()->m_BlockLocate.GetCount() ) { // @todo (if useful) Save_Block( ); } break; case BLOCK_PASTE: break; case BLOCK_ZOOM: // Window Zoom // Turn off the redraw block routine now so it is not displayed // with one corner at the new center of the screen m_canvas->SetMouseCaptureCallback( NULL ); Window_Zoom( GetScreen()->m_BlockLocate ); break; default: break; } } if( ! nextcmd ) { GetBoard()->m_Status_Pcb |= DO_NOT_SHOW_GENERAL_RASTNEST; GetScreen()->ClearBlockCommand(); m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, false ); } return nextcmd; }
bool SCH_EDIT_FRAME::HandleBlockEnd( wxDC* aDC ) { bool nextcmd = false; bool zoom_command = false; BLOCK_SELECTOR* block = &GetScreen()->m_BlockLocate; if( block->GetCount() ) { BLOCK_STATE_T state = block->GetState(); BLOCK_COMMAND_T command = block->GetCommand(); m_canvas->CallEndMouseCapture( aDC ); block->SetState( state ); block->SetCommand( command ); m_canvas->SetMouseCapture( DrawAndSizingBlockOutlines, AbortBlockCurrentCommand ); SetCrossHairPosition( block->GetEnd() ); if( block->GetCommand() != BLOCK_ABORT ) m_canvas->MoveCursorToCrossHair(); } if( m_canvas->IsMouseCaptured() ) { switch( block->GetCommand() ) { case BLOCK_IDLE: DisplayError( this, wxT( "Error in HandleBlockPLace()" ) ); break; case BLOCK_ROTATE: GetScreen()->UpdatePickList(); DrawAndSizingBlockOutlines( m_canvas, aDC, wxDefaultPosition, false ); if( block->GetCount() ) { // Compute the rotation center and put it on grid: wxPoint rotationPoint = block->Centre(); rotationPoint = GetNearestGridPosition( rotationPoint ); SetCrossHairPosition( rotationPoint ); SaveCopyInUndoList( block->GetItems(), UR_ROTATED, rotationPoint ); RotateListOfItems( block->GetItems(), rotationPoint ); OnModify(); } block->ClearItemsList(); GetScreen()->TestDanglingEnds( m_canvas, aDC ); m_canvas->Refresh(); break; case BLOCK_DRAG: case BLOCK_DRAG_ITEM: // Drag from a drag command GetScreen()->BreakSegmentsOnJunctions(); // fall through case BLOCK_MOVE: case BLOCK_COPY: if( block->GetCommand() == BLOCK_DRAG_ITEM && GetScreen()->GetCurItem() != NULL ) { // This is a drag command, not a mouse block command // Only this item is put in list ITEM_PICKER picker; picker.SetItem( GetScreen()->GetCurItem() ); block->PushItem( picker ); } else { // Collect all items in the locate block GetScreen()->UpdatePickList(); } // fall through case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/ if( block->GetCount() ) { nextcmd = true; GetScreen()->SelectBlockItems(); m_canvas->CallMouseCapture( aDC, wxDefaultPosition, false ); m_canvas->SetMouseCaptureCallback( DrawMovingBlockOutlines ); m_canvas->CallMouseCapture( aDC, wxDefaultPosition, false ); block->SetState( STATE_BLOCK_MOVE ); } else { m_canvas->CallMouseCapture( aDC, wxDefaultPosition, false ); m_canvas->SetMouseCapture( NULL, NULL ); } break; case BLOCK_DELETE: GetScreen()->UpdatePickList(); DrawAndSizingBlockOutlines( m_canvas, aDC, wxDefaultPosition, false ); if( block->GetCount() ) { DeleteItemsInList( m_canvas, block->GetItems() ); OnModify(); } block->ClearItemsList(); GetScreen()->TestDanglingEnds( m_canvas, aDC ); m_canvas->Refresh(); break; case BLOCK_SAVE: // Save a copy of items in paste buffer GetScreen()->UpdatePickList(); DrawAndSizingBlockOutlines( m_canvas, aDC, wxDefaultPosition, false ); if( block->GetCount() ) { wxPoint move_vector = -GetScreen()->m_BlockLocate.GetLastCursorPosition(); copyBlockItems( block->GetItems() ); MoveItemsInList( m_blockItems.GetItems(), move_vector ); } block->ClearItemsList(); break; case BLOCK_PASTE: block->SetState( STATE_BLOCK_MOVE ); break; case BLOCK_ZOOM: zoom_command = true; break; case BLOCK_MIRROR_X: GetScreen()->UpdatePickList(); DrawAndSizingBlockOutlines( m_canvas, aDC, wxDefaultPosition, false ); if( block->GetCount() ) { // Compute the mirror center and put it on grid. wxPoint mirrorPoint = block->Centre(); mirrorPoint = GetNearestGridPosition( mirrorPoint ); SetCrossHairPosition( mirrorPoint ); SaveCopyInUndoList( block->GetItems(), UR_MIRRORED_X, mirrorPoint ); MirrorX( block->GetItems(), mirrorPoint ); OnModify(); } GetScreen()->TestDanglingEnds( m_canvas, aDC ); m_canvas->Refresh(); break; case BLOCK_MIRROR_Y: GetScreen()->UpdatePickList(); DrawAndSizingBlockOutlines( m_canvas, aDC, wxDefaultPosition, false ); if( block->GetCount() ) { // Compute the mirror center and put it on grid. wxPoint mirrorPoint = block->Centre(); mirrorPoint = GetNearestGridPosition( mirrorPoint ); SetCrossHairPosition( mirrorPoint ); SaveCopyInUndoList( block->GetItems(), UR_MIRRORED_Y, mirrorPoint ); MirrorY( block->GetItems(), mirrorPoint ); OnModify(); } GetScreen()->TestDanglingEnds( m_canvas, aDC ); m_canvas->Refresh(); break; default: break; } } if( block->GetCommand() == BLOCK_ABORT ) { GetScreen()->ClearDrawingState(); m_canvas->Refresh(); } if( ! nextcmd ) { block->SetState( STATE_NO_BLOCK ); block->SetCommand( BLOCK_IDLE ); GetScreen()->SetCurItem( NULL ); m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, false ); } if( zoom_command ) Window_Zoom( GetScreen()->m_BlockLocate ); return nextcmd; }
void WinEDA_SchematicFrame::HandleBlockEndByPopUp(int Command, wxDC * DC) /***********************************************************************/ /* Routine de gestion de la commande BLOCK END by PopUp Appelee apres HandleBlockEnd. A partir de la commande bloc move, peut executer une commande autre que bloc move. */ { int ii = 0; if( GetScreen()->BlockLocate.m_Command != BLOCK_MOVE ) return; if( Command == BLOCK_MOVE ) return; GetScreen()->BlockLocate.m_Command = (CmdBlockType) Command; GetScreen()->BlockLocate.SetMessageBlock(this); switch( GetScreen()->BlockLocate.m_Command ) { case BLOCK_COPY: /* move to copy */ GetScreen()->BlockLocate.m_State = STATE_BLOCK_MOVE; ii = 1; break; case BLOCK_DRAG: /* move to Drag */ /* Effacement de la liste des structures de pointage, qui est devenue erronnee */ if(GetScreen()->ManageCurseur) GetScreen()->ManageCurseur(DrawPanel, DC, FALSE); if( GetScreen()->BlockLocate.m_BlockDrawStruct ) { if(GetScreen()->BlockLocate.m_BlockDrawStruct->m_StructType == DRAW_PICK_ITEM_STRUCT_TYPE) { /* Delete the picked wrapper if this is a picked list. */ DrawPickedStruct * PickedList; PickedList = (DrawPickedStruct*)GetScreen()->BlockLocate.m_BlockDrawStruct; PickedList->DeleteWrapperList(); } GetScreen()->BlockLocate.m_BlockDrawStruct = NULL; } BreakSegmentOnJunction(GetScreen() ); GetScreen()->BlockLocate.m_BlockDrawStruct = PickStruct(GetScreen()->BlockLocate, GetScreen()->EEDrawList, SEARCHALL); if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL) { ii = 1; CollectStructsToDrag(GetScreen()); if(GetScreen()->ManageCurseur) GetScreen()->ManageCurseur(DrawPanel, DC, FALSE); GetScreen()->BlockLocate.m_State = STATE_BLOCK_MOVE; } break; case BLOCK_DELETE: /* move to Delete */ if(GetScreen()->ManageCurseur) GetScreen()->ManageCurseur(DrawPanel, DC, FALSE); if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL) { ii = -1; DeleteStruct(DrawPanel, DC, GetScreen()->BlockLocate.m_BlockDrawStruct); SetFlagModify(GetScreen()); } TestDanglingEnds(GetScreen()->EEDrawList, DC); break; case BLOCK_SAVE: /* Save */ if(GetScreen()->ManageCurseur) GetScreen()->ManageCurseur(DrawPanel, DC, FALSE); if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL) { wxPoint oldpos = GetScreen()->m_Curseur; GetScreen()->m_Curseur = wxPoint(0,0); EDA_BaseStruct *DrawStructCopy = SaveStructListForPaste(GetScreen()->BlockLocate.m_BlockDrawStruct); PlaceStruct( GetScreen(), DrawStructCopy); GetScreen()->m_Curseur = oldpos; ii = -1; } break; case BLOCK_ZOOM: /* Window Zoom */ GetScreen()->ForceCloseManageCurseur(this, DC); DrawPanel->SetCursor(DrawPanel->m_PanelCursor = DrawPanel->m_PanelDefaultCursor); Window_Zoom( GetScreen()->BlockLocate); break; default: break; } if ( ii <= 0 ) { GetScreen()->BlockLocate.m_BlockDrawStruct = NULL; GetScreen()->BlockLocate.m_Flags = 0; GetScreen()->BlockLocate.m_State = STATE_NO_BLOCK; GetScreen()->BlockLocate.m_Command = BLOCK_IDLE; GetScreen()->ManageCurseur = NULL; GetScreen()->ForceCloseManageCurseur = NULL; GetScreen()->m_CurrentItem = NULL; SetToolID(m_ID_current_state, DrawPanel->m_PanelDefaultCursor, wxEmptyString ); } }
int WinEDA_SchematicFrame::HandleBlockEnd(wxDC * DC) /****************************************************/ /* Routine de gestion de la commande BLOCK END retourne : 0 si aucun composant selectionne 1 sinon -1 si commande terminée et composants trouvés (block delete, block save) */ { int ii = 0; bool zoom_command = FALSE; if ( GetScreen()->BlockLocate.m_BlockDrawStruct ) { BlockState state = GetScreen()->BlockLocate.m_State; CmdBlockType command = GetScreen()->BlockLocate.m_Command; if ( GetScreen()->ForceCloseManageCurseur ) GetScreen()->ForceCloseManageCurseur(this, DC); GetScreen()->BlockLocate.m_State = state; GetScreen()->BlockLocate.m_Command = command; GetScreen()->ManageCurseur = DrawAndSizingBlockOutlines; GetScreen()->ForceCloseManageCurseur = AbortBlockCurrentCommand; GetScreen()->m_Curseur.x = GetScreen()->BlockLocate.GetRight(); GetScreen()->m_Curseur.y = GetScreen()->BlockLocate.GetBottom(); if ( GetScreen()->BlockLocate.m_Command != BLOCK_ABORT ) DrawPanel->MouseToCursorSchema(); } if(GetScreen()->ManageCurseur != NULL) switch( GetScreen()->BlockLocate.m_Command ) { case BLOCK_IDLE: DisplayError(this, wxT("Error in HandleBlockPLace()") ); break; case BLOCK_DRAG: /* Drag */ BreakSegmentOnJunction(GetScreen() ); case BLOCK_MOVE: /* Move */ case BLOCK_COPY: /* Copy */ GetScreen()->BlockLocate.m_BlockDrawStruct = PickStruct(GetScreen()->BlockLocate, GetScreen()->EEDrawList, SEARCHALL); case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/ if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL) { ii = 1; CollectStructsToDrag(GetScreen()); GetScreen()->ManageCurseur(DrawPanel, DC, FALSE); GetScreen()->ManageCurseur = DrawMovingBlockOutlines; GetScreen()->ManageCurseur(DrawPanel, DC, FALSE); GetScreen()->BlockLocate.m_State = STATE_BLOCK_MOVE; } else { GetScreen()->ManageCurseur(DrawPanel, DC, FALSE); GetScreen()->ManageCurseur = NULL; GetScreen()->ForceCloseManageCurseur = NULL; } break; case BLOCK_DELETE: /* Delete */ GetScreen()->BlockLocate.m_BlockDrawStruct = PickStruct(GetScreen()->BlockLocate, GetScreen()->EEDrawList, SEARCHALL); DrawAndSizingBlockOutlines(DrawPanel, DC, FALSE); if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL) { ii = -1; DeleteStruct(DrawPanel, DC, GetScreen()->BlockLocate.m_BlockDrawStruct); SetFlagModify(GetScreen()); } GetScreen()->BlockLocate.m_BlockDrawStruct = NULL; TestDanglingEnds(GetScreen()->EEDrawList, DC); break; case BLOCK_SAVE: /* Save */ GetScreen()->BlockLocate.m_BlockDrawStruct = PickStruct(GetScreen()->BlockLocate, GetScreen()->EEDrawList, SEARCHALL); DrawAndSizingBlockOutlines(DrawPanel, DC, FALSE); if( GetScreen()->BlockLocate.m_BlockDrawStruct != NULL) { wxPoint oldpos = GetScreen()->m_Curseur; GetScreen()->m_Curseur = wxPoint(0,0); EDA_BaseStruct *DrawStructCopy = SaveStructListForPaste(GetScreen()->BlockLocate.m_BlockDrawStruct); PlaceStruct( GetScreen(), DrawStructCopy); GetScreen()->m_Curseur = oldpos; ii = -1; } GetScreen()->BlockLocate.m_BlockDrawStruct = NULL; break; case BLOCK_PASTE: GetScreen()->BlockLocate.m_State = STATE_BLOCK_MOVE; break; case BLOCK_ROTATE: case BLOCK_INVERT: /* pcbnew only! */ break; case BLOCK_ZOOM: /* Window Zoom */ zoom_command = TRUE; break; case BLOCK_SELECT_ITEMS_ONLY: /* Not used */ case BLOCK_ABORT: /* not executed here */ break; } if ( GetScreen()->BlockLocate.m_Command == BLOCK_ABORT ) { /* clear struct.m_Flags */ EDA_BaseStruct * Struct; for(Struct = GetScreen()->EEDrawList; Struct != NULL; Struct=Struct->Pnext) Struct->m_Flags = 0; } if ( ii <= 0 ) { GetScreen()->BlockLocate.m_Flags = 0; GetScreen()->BlockLocate.m_State = STATE_NO_BLOCK; GetScreen()->BlockLocate.m_Command = BLOCK_IDLE; GetScreen()->ManageCurseur = NULL; GetScreen()->ForceCloseManageCurseur = NULL; GetScreen()->m_CurrentItem = NULL; SetToolID(m_ID_current_state, DrawPanel->m_PanelDefaultCursor, wxEmptyString ); } if ( zoom_command) Window_Zoom( GetScreen()->BlockLocate); return(ii); }
void SCH_EDIT_FRAME::HandleBlockEndByPopUp( int Command, wxDC* DC ) { bool blockCmdFinished = true; /* set to false for block command which * have a next step * and true if the block command is finished here */ BLOCK_SELECTOR* block = &GetScreen()->m_BlockLocate; // can convert only a block move command to an other command if( block->m_Command != BLOCK_MOVE ) return; // Useless if the new command is block move because we are already in block move. if( Command == BLOCK_MOVE ) return; block->m_Command = (CmdBlockType) Command; block->SetMessageBlock( this ); switch( block->m_Command ) { case BLOCK_COPY: /* move to copy */ block->m_State = STATE_BLOCK_MOVE; blockCmdFinished = false; break; case BLOCK_DRAG: /* move to Drag */ if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); // Clear list of items to move, and rebuild it with items to drag: block->ClearItemsList(); GetScreen()->BreakSegmentsOnJunctions(); GetScreen()->UpdatePickList(); if( block->GetCount() ) { blockCmdFinished = false; GetScreen()->SelectBlockItems(); if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); block->m_State = STATE_BLOCK_MOVE; } break; case BLOCK_DELETE: /* move to Delete */ if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); if( block->GetCount() ) { DeleteItemsInList( m_canvas, block->m_ItemsSelection ); OnModify(); } GetScreen()->TestDanglingEnds( m_canvas, DC ); m_canvas->Refresh(); break; case BLOCK_SAVE: /* Save list in paste buffer*/ if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); if( block->GetCount() ) { wxPoint move_vector = -GetScreen()->m_BlockLocate.m_BlockLastCursorPosition; copyBlockItems( block->m_ItemsSelection ); MoveItemsInList( m_blockItems.m_ItemsSelection, move_vector ); } break; case BLOCK_ZOOM: /* Window Zoom */ m_canvas->CallEndMouseCapture( DC ); m_canvas->SetCursor( (wxStockCursor) m_canvas->GetDefaultCursor() ); Window_Zoom( GetScreen()->m_BlockLocate ); break; case BLOCK_ROTATE: if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); if( block->GetCount() ) { /* Compute the rotation center and put it on grid */ wxPoint rotationPoint = block->Centre(); rotationPoint = GetScreen()->GetNearestGridPosition( rotationPoint ); GetScreen()->SetCrossHairPosition( rotationPoint ); SaveCopyInUndoList( block->m_ItemsSelection, UR_ROTATED, rotationPoint ); RotateListOfItems( block->m_ItemsSelection, rotationPoint ); OnModify(); } GetScreen()->TestDanglingEnds( m_canvas, DC ); m_canvas->Refresh(); break; case BLOCK_MIRROR_X: if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); if( block->GetCount() ) { /* Compute the mirror center and put it on grid */ wxPoint mirrorPoint = block->Centre(); mirrorPoint = GetScreen()->GetNearestGridPosition( mirrorPoint ); GetScreen()->SetCrossHairPosition( mirrorPoint ); SaveCopyInUndoList( block->m_ItemsSelection, UR_MIRRORED_X, mirrorPoint ); MirrorX( block->m_ItemsSelection, mirrorPoint ); OnModify(); } GetScreen()->TestDanglingEnds( m_canvas, DC ); m_canvas->Refresh(); break; case BLOCK_MIRROR_Y: if( m_canvas->IsMouseCaptured() ) m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); if( block->GetCount() ) { /* Compute the mirror center and put it on grid */ wxPoint mirrorPoint = block->Centre(); mirrorPoint = GetScreen()->GetNearestGridPosition( mirrorPoint ); GetScreen()->SetCrossHairPosition( mirrorPoint ); SaveCopyInUndoList( block->m_ItemsSelection, UR_MIRRORED_Y, mirrorPoint ); MirrorY( block->m_ItemsSelection, mirrorPoint ); OnModify(); } GetScreen()->TestDanglingEnds( m_canvas, DC ); m_canvas->Refresh(); break; default: break; } if( blockCmdFinished ) { block->Clear(); GetScreen()->SetCurItem( NULL ); m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, false ); } }
bool FOOTPRINT_EDIT_FRAME::HandleBlockEnd( wxDC* DC ) { int itemsCount = 0; bool nextcmd = false; MODULE* currentModule = GetBoard()->m_Modules; if( GetScreen()->m_BlockLocate.GetCount() ) { BLOCK_STATE_T state = GetScreen()->m_BlockLocate.GetState(); BLOCK_COMMAND_T command = GetScreen()->m_BlockLocate.GetCommand(); m_canvas->CallEndMouseCapture( DC ); GetScreen()->m_BlockLocate.SetState( state ); GetScreen()->m_BlockLocate.SetCommand( command ); m_canvas->SetMouseCapture( DrawAndSizingBlockOutlines, AbortBlockCurrentCommand ); SetCrossHairPosition( wxPoint( GetScreen()->m_BlockLocate.GetRight(), GetScreen()->m_BlockLocate.GetBottom() ) ); m_canvas->MoveCursorToCrossHair(); } switch( GetScreen()->m_BlockLocate.GetCommand() ) { case BLOCK_IDLE: DisplayError( this, wxT( "Error in HandleBlockPLace" ) ); break; case BLOCK_DRAG: // Drag case BLOCK_MOVE: // Move case BLOCK_COPY: // Copy itemsCount = MarkItemsInBloc( currentModule, GetScreen()->m_BlockLocate ); if( itemsCount ) { nextcmd = true; if( m_canvas->IsMouseCaptured() ) { m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); m_canvas->SetMouseCaptureCallback( DrawMovingBlockOutlines ); m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); } GetScreen()->m_BlockLocate.SetState( STATE_BLOCK_MOVE ); m_canvas->Refresh( true ); } break; case BLOCK_PRESELECT_MOVE: // Move with preselection list nextcmd = true; m_canvas->SetMouseCaptureCallback( DrawMovingBlockOutlines ); GetScreen()->m_BlockLocate.SetState( STATE_BLOCK_MOVE ); break; case BLOCK_DELETE: // Delete itemsCount = MarkItemsInBloc( currentModule, GetScreen()->m_BlockLocate ); if( itemsCount ) SaveCopyInUndoList( currentModule, UR_MODEDIT ); DeleteMarkedItems( currentModule ); break; case BLOCK_SAVE: // Save case BLOCK_PASTE: break; case BLOCK_ROTATE: itemsCount = MarkItemsInBloc( currentModule, GetScreen()->m_BlockLocate ); if( itemsCount ) SaveCopyInUndoList( currentModule, UR_MODEDIT ); RotateMarkedItems( currentModule, GetScreen()->m_BlockLocate.Centre() ); break; case BLOCK_MIRROR_X: case BLOCK_MIRROR_Y: case BLOCK_FLIP: // mirror itemsCount = MarkItemsInBloc( currentModule, GetScreen()->m_BlockLocate ); if( itemsCount ) SaveCopyInUndoList( currentModule, UR_MODEDIT ); MirrorMarkedItems( currentModule, GetScreen()->m_BlockLocate.Centre() ); break; case BLOCK_ZOOM: // Window Zoom Window_Zoom( GetScreen()->m_BlockLocate ); break; case BLOCK_ABORT: break; case BLOCK_SELECT_ITEMS_ONLY: break; } if( !nextcmd ) { if( GetScreen()->m_BlockLocate.GetCommand() != BLOCK_SELECT_ITEMS_ONLY ) { ClearMarkItems( currentModule ); } GetScreen()->ClearBlockCommand(); SetCurItem( NULL ); m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, false ); m_canvas->Refresh( true ); } return nextcmd; }
bool SCH_EDIT_FRAME::HandleBlockEnd( wxDC* DC ) { bool nextcmd = false; bool zoom_command = false; BLOCK_SELECTOR* block = &GetScreen()->m_BlockLocate; if( block->GetCount() ) { BlockState state = block->m_State; CmdBlockType command = block->m_Command; m_canvas->CallEndMouseCapture( DC ); block->m_State = state; block->m_Command = command; m_canvas->SetMouseCapture( DrawAndSizingBlockOutlines, AbortBlockCurrentCommand ); GetScreen()->SetCrossHairPosition( block->GetEnd() ); if( block->m_Command != BLOCK_ABORT ) m_canvas->MoveCursorToCrossHair(); } if( m_canvas->IsMouseCaptured() ) { switch( block->m_Command ) { case BLOCK_IDLE: DisplayError( this, wxT( "Error in HandleBlockPLace()" ) ); break; case BLOCK_DRAG: /* Drag */ GetScreen()->BreakSegmentsOnJunctions(); // fall through case BLOCK_ROTATE: case BLOCK_MIRROR_X: case BLOCK_MIRROR_Y: case BLOCK_MOVE: /* Move */ case BLOCK_COPY: /* Copy */ GetScreen()->UpdatePickList(); // fall through case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/ if( block->GetCount() ) { nextcmd = true; GetScreen()->SelectBlockItems(); m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); m_canvas->SetMouseCaptureCallback( DrawMovingBlockOutlines ); m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); block->m_State = STATE_BLOCK_MOVE; } else { m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); m_canvas->SetMouseCapture( NULL, NULL ); } break; case BLOCK_DELETE: /* Delete */ GetScreen()->UpdatePickList(); DrawAndSizingBlockOutlines( m_canvas, DC, wxDefaultPosition, false ); if( block->GetCount() ) { DeleteItemsInList( m_canvas, block->m_ItemsSelection ); OnModify(); } block->ClearItemsList(); GetScreen()->TestDanglingEnds( m_canvas, DC ); m_canvas->Refresh(); break; case BLOCK_SAVE: /* Save */ GetScreen()->UpdatePickList(); DrawAndSizingBlockOutlines( m_canvas, DC, wxDefaultPosition, false ); if( block->GetCount() ) { wxPoint move_vector = -GetScreen()->m_BlockLocate.m_BlockLastCursorPosition; copyBlockItems( block->m_ItemsSelection ); MoveItemsInList( m_blockItems.m_ItemsSelection, move_vector ); } block->ClearItemsList(); break; case BLOCK_PASTE: block->m_State = STATE_BLOCK_MOVE; break; case BLOCK_FLIP: /* Pcbnew only! */ break; case BLOCK_ZOOM: /* Window Zoom */ zoom_command = true; break; case BLOCK_SELECT_ITEMS_ONLY: /* Not used */ case BLOCK_ABORT: /* not executed here */ break; } } if( block->m_Command == BLOCK_ABORT ) { GetScreen()->ClearDrawingState(); m_canvas->Refresh(); } if( ! nextcmd ) { block->ClearFlags(); block->m_State = STATE_NO_BLOCK; block->m_Command = BLOCK_IDLE; GetScreen()->SetCurItem( NULL ); m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, false ); } if( zoom_command ) Window_Zoom( GetScreen()->m_BlockLocate ); return nextcmd; }
bool LIB_EDIT_FRAME::HandleBlockEnd( wxDC* DC ) { int ItemCount = 0; int nextCmd = false; wxPoint pt; if( GetScreen()->m_BlockLocate.GetCount() ) { BlockState state = GetScreen()->m_BlockLocate.m_State; CmdBlockType command = GetScreen()->m_BlockLocate.m_Command; m_canvas->CallEndMouseCapture( DC ); GetScreen()->m_BlockLocate.m_State = state; GetScreen()->m_BlockLocate.m_Command = command; m_canvas->SetMouseCapture( DrawAndSizingBlockOutlines, AbortBlockCurrentCommand ); GetScreen()->SetCrossHairPosition( wxPoint( GetScreen()->m_BlockLocate.GetRight(), GetScreen()->m_BlockLocate.GetBottom() ) ); m_canvas->MoveCursorToCrossHair(); } switch( GetScreen()->m_BlockLocate.m_Command ) { case BLOCK_IDLE: DisplayError( this, wxT( "Error in HandleBlockPLace" ) ); break; case BLOCK_DRAG: /* Drag */ case BLOCK_MOVE: /* Move */ case BLOCK_COPY: /* Copy */ if ( m_component ) ItemCount = m_component->SelectItems( GetScreen()->m_BlockLocate, m_unit, m_convert, m_editPinsPerPartOrConvert ); if( ItemCount ) { nextCmd = true; if( m_canvas->IsMouseCaptured() ) { m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); m_canvas->SetMouseCaptureCallback( DrawMovingBlockOutlines ); m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); } GetScreen()->m_BlockLocate.m_State = STATE_BLOCK_MOVE; m_canvas->Refresh( true ); } break; case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/ nextCmd = true; m_canvas->SetMouseCaptureCallback( DrawMovingBlockOutlines ); GetScreen()->m_BlockLocate.m_State = STATE_BLOCK_MOVE; break; case BLOCK_DELETE: /* Delete */ if ( m_component ) ItemCount = m_component->SelectItems( GetScreen()->m_BlockLocate, m_unit, m_convert, m_editPinsPerPartOrConvert ); if( ItemCount ) SaveCopyInUndoList( m_component ); if ( m_component ) { m_component->DeleteSelectedItems(); OnModify(); } break; case BLOCK_SAVE: /* Save */ case BLOCK_PASTE: case BLOCK_FLIP: break; case BLOCK_ROTATE: case BLOCK_MIRROR_X: case BLOCK_MIRROR_Y: if ( m_component ) ItemCount = m_component->SelectItems( GetScreen()->m_BlockLocate, m_unit, m_convert, m_editPinsPerPartOrConvert ); if( ItemCount ) SaveCopyInUndoList( m_component ); pt = GetScreen()->m_BlockLocate.Centre(); pt.y *= -1; if ( m_component ) { OnModify(); int block_cmd = GetScreen()->m_BlockLocate.m_Command; if( block_cmd == BLOCK_MIRROR_Y) m_component->MirrorSelectedItemsH( pt ); else if( block_cmd == BLOCK_MIRROR_X) m_component->MirrorSelectedItemsV( pt ); else if( block_cmd == BLOCK_ROTATE) m_component->RotateSelectedItems( pt ); } break; case BLOCK_ZOOM: /* Window Zoom */ Window_Zoom( GetScreen()->m_BlockLocate ); break; case BLOCK_ABORT: break; case BLOCK_SELECT_ITEMS_ONLY: break; } if( ! nextCmd ) { if( GetScreen()->m_BlockLocate.m_Command != BLOCK_SELECT_ITEMS_ONLY && m_component ) m_component->ClearSelectedItems(); GetScreen()->m_BlockLocate.ClearFlags(); GetScreen()->m_BlockLocate.m_State = STATE_NO_BLOCK; GetScreen()->m_BlockLocate.m_Command = BLOCK_IDLE; GetScreen()->SetCurItem( NULL ); m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, false ); m_canvas->Refresh( true ); } return nextCmd; }
int WinEDA_GerberFrame::HandleBlockEnd(wxDC * DC) /**********************************************/ /* Routine de gestion de la commande BLOCK END returne : 0 si aucun compos ant selectionne 1 sinon -1 si commande terminée et composants trouvés (block delete, block save) */ { int endcommande = TRUE; bool zoom_command = FALSE; if(GetScreen()->ManageCurseur ) switch( GetScreen()->BlockLocate.m_Command ) { case BLOCK_IDLE: DisplayError(this, "Error in HandleBlockPLace"); break; case BLOCK_DRAG: /* Drag (not used, for future enhancements)*/ case BLOCK_MOVE: /* Move */ case BLOCK_COPY: /* Copy */ case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/ GetScreen()->BlockLocate.m_State = STATE_BLOCK_MOVE; endcommande = FALSE; GetScreen()->ManageCurseur(DrawPanel, DC, FALSE); GetScreen()->ManageCurseur = DrawMovingBlockOutlines; GetScreen()->ManageCurseur(DrawPanel, DC, FALSE); break; case BLOCK_DELETE: /* Delete */ GetScreen()->BlockLocate.m_State = STATE_BLOCK_STOP; GetScreen()->ManageCurseur(DrawPanel, DC, FALSE); Block_Delete(DC); break; case BLOCK_ROTATE: /* Unused */ break; case BLOCK_INVERT: /* Fip */ break; case BLOCK_SAVE: /* Save (not used)*/ break; case BLOCK_PASTE: break; case BLOCK_ZOOM: /* Window Zoom */ zoom_command = TRUE; break; case BLOCK_ABORT: case BLOCK_SELECT_ITEMS_ONLY: break; } if ( endcommande == TRUE ) { GetScreen()->BlockLocate.m_Flags = 0; GetScreen()->BlockLocate.m_State = STATE_NO_BLOCK; GetScreen()->BlockLocate.m_Command = BLOCK_IDLE; GetScreen()->BlockLocate.m_BlockDrawStruct = NULL; GetScreen()->ManageCurseur = NULL; GetScreen()->ForceCloseManageCurseur = NULL; DisplayToolMsg(""); } if ( zoom_command ) Window_Zoom( GetScreen()->BlockLocate ); return(endcommande); }
bool FOOTPRINT_EDIT_FRAME::HandleBlockEnd( wxDC* DC ) { int itemsCount = 0; bool nextcmd = false; MODULE* currentModule = GetBoard()->m_Modules; if( GetScreen()->m_BlockLocate.GetCount() ) { // Set the SELECTED flag of all preselected items, and clear preselect list ClearMarkItems( currentModule ); PICKED_ITEMS_LIST* list = &GetScreen()->m_BlockLocate.GetItems(); for( unsigned ii = 0, e = list->GetCount(); ii < e; ++ii ) { BOARD_ITEM* item = (BOARD_ITEM*) list->GetPickedItem( ii ); item->SetFlags( SELECTED ); ++itemsCount; } GetScreen()->m_BlockLocate.ClearItemsList(); } switch( GetScreen()->m_BlockLocate.GetCommand() ) { case BLOCK_IDLE: DisplayError( this, wxT( "Error in HandleBlockPLace" ) ); break; case BLOCK_DRAG: // Drag case BLOCK_DRAG_ITEM: // Drag a given item (not used here) case BLOCK_MOVE: // Move case BLOCK_COPY: // Copy case BLOCK_COPY_AND_INCREMENT: // Specific to duplicate with increment command // Find selected items if we didn't already set them manually if( itemsCount == 0 ) itemsCount = MarkItemsInBloc( currentModule, GetScreen()->m_BlockLocate ); if( itemsCount ) { nextcmd = true; if( m_canvas->IsMouseCaptured() ) { m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); m_canvas->SetMouseCaptureCallback( DrawMovingBlockOutlines ); m_canvas->CallMouseCapture( DC, wxDefaultPosition, false ); } GetScreen()->m_BlockLocate.SetState( STATE_BLOCK_MOVE ); m_canvas->Refresh( true ); } break; case BLOCK_MOVE_EXACT: itemsCount = MarkItemsInBloc( currentModule, GetScreen()->m_BlockLocate ); if( itemsCount ) { wxPoint translation; double rotation = 0; DIALOG_MOVE_EXACT dialog( this, translation, rotation ); int ret = dialog.ShowModal(); if( ret == wxID_OK ) { SaveCopyInUndoList( currentModule, UR_MODEDIT ); const wxPoint blockCentre = GetScreen()->m_BlockLocate.Centre(); MoveMarkedItemsExactly( currentModule, blockCentre, translation, rotation ); } } break; case BLOCK_PRESELECT_MOVE: // Move with preselection list nextcmd = true; m_canvas->SetMouseCaptureCallback( DrawMovingBlockOutlines ); GetScreen()->m_BlockLocate.SetState( STATE_BLOCK_MOVE ); break; case BLOCK_DELETE: // Delete itemsCount = MarkItemsInBloc( currentModule, GetScreen()->m_BlockLocate ); if( itemsCount ) SaveCopyInUndoList( currentModule, UR_MODEDIT ); DeleteMarkedItems( currentModule ); break; case BLOCK_SAVE: // Save case BLOCK_PASTE: break; case BLOCK_ROTATE: itemsCount = MarkItemsInBloc( currentModule, GetScreen()->m_BlockLocate ); if( itemsCount ) SaveCopyInUndoList( currentModule, UR_MODEDIT ); RotateMarkedItems( currentModule, GetScreen()->m_BlockLocate.Centre() ); break; case BLOCK_MIRROR_X: case BLOCK_MIRROR_Y: case BLOCK_FLIP: // mirror itemsCount = MarkItemsInBloc( currentModule, GetScreen()->m_BlockLocate ); if( itemsCount ) SaveCopyInUndoList( currentModule, UR_MODEDIT ); MirrorMarkedItems( currentModule, GetScreen()->m_BlockLocate.Centre() ); break; case BLOCK_ZOOM: // Window Zoom Window_Zoom( GetScreen()->m_BlockLocate ); break; case BLOCK_ABORT: break; case BLOCK_SELECT_ITEMS_ONLY: break; } if( !nextcmd ) { if( GetScreen()->m_BlockLocate.GetCommand() != BLOCK_SELECT_ITEMS_ONLY ) { ClearMarkItems( currentModule ); } GetScreen()->ClearBlockCommand(); SetCurItem( NULL ); m_canvas->EndMouseCapture( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString, false ); m_canvas->Refresh( true ); } return nextcmd; }
bool LIB_EDIT_FRAME::HandleBlockEnd( wxDC* aDC ) { int ItemCount = 0; bool nextCmd = false; BLOCK_SELECTOR* block = &GetScreen()->m_BlockLocate; wxPoint pt; auto panel =static_cast<SCH_DRAW_PANEL*>(m_canvas); auto view = panel->GetView(); auto area = view->GetSelectionArea(); auto start = area->GetOrigin(); auto end = area->GetEnd(); block->SetOrigin( wxPoint( start.x, start.y ) ); block->SetEnd( wxPoint( end.x, end.y ) ); view->ShowSelectionArea( false ); view->ClearHiddenFlags(); if( block->GetCount() ) { BLOCK_STATE_T state = block->GetState(); BLOCK_COMMAND_T command = block->GetCommand(); m_canvas->CallEndMouseCapture( aDC ); block->SetState( state ); block->SetCommand( command ); m_canvas->SetMouseCapture( DrawAndSizingBlockOutlines, AbortBlockCurrentCommand ); if( block->GetCommand() != BLOCK_ABORT && block->GetCommand() != BLOCK_DUPLICATE && block->GetCommand() != BLOCK_COPY && block->GetCommand() != BLOCK_CUT && block->GetCommand() != BLOCK_DELETE ) { SetCrossHairPosition( block->GetEnd() ); m_canvas->MoveCursorToCrossHair(); } } if( m_canvas->IsMouseCaptured() ) { switch( block->GetCommand() ) { case BLOCK_IDLE: DisplayError( this, wxT( "Error in HandleBlockPLace" ) ); break; case BLOCK_DRAG: // Drag case BLOCK_DRAG_ITEM: case BLOCK_MOVE: // Move case BLOCK_DUPLICATE: // Duplicate if( GetCurPart() ) ItemCount = BlockSelectItems( GetCurPart(), block, m_unit, m_convert, m_syncPinEdit ); if( ItemCount ) { nextCmd = true; block->SetState( STATE_BLOCK_MOVE ); if( block->GetCommand() == BLOCK_DUPLICATE ) { if( block->AppendUndo() ) ; // UR_LIBEDIT saves entire state, so no need to append anything more else { SaveCopyInUndoList( GetCurPart(), UR_LIBEDIT ); block->SetAppendUndo(); } BlockCopySelectedItems( pt, GetCurPart(), block ); block->SetLastCursorPosition( GetCrossHairPosition( true ) ); } m_canvas->SetMouseCaptureCallback( DrawMovingBlockOutlines ); m_canvas->CallMouseCapture( aDC, wxDefaultPosition, false ); } else { m_canvas->CallMouseCapture( aDC, wxDefaultPosition, false ); m_canvas->SetMouseCapture( NULL, NULL ); } break; case BLOCK_COPY: // Save a copy of items in the clipboard buffer case BLOCK_CUT: if( GetCurPart() ) ItemCount = BlockSelectItems( GetCurPart(), block, m_unit, m_convert, m_syncPinEdit ); if( ItemCount ) { copySelectedItems(); auto cmd = block->GetCommand(); if( cmd == BLOCK_COPY ) { BlockClearSelectedItems( GetCurPart(), block ); block->ClearItemsList(); } else if( cmd == BLOCK_CUT ) { if( block->AppendUndo() ) ; // UR_LIBEDIT saves entire state, so no need to append anything more else { SaveCopyInUndoList( GetCurPart(), UR_LIBEDIT ); block->SetAppendUndo(); } BlockDeleteSelectedItems( GetCurPart(), block ); RebuildView(); GetCanvas()->Refresh(); OnModify(); } } break; case BLOCK_DELETE: // Delete if( GetCurPart() ) ItemCount = BlockSelectItems( GetCurPart(), block, m_unit, m_convert, m_syncPinEdit ); if( block->AppendUndo() ) ; // UR_LIBEDIT saves entire state, so no need to append anything more else if( ItemCount ) { SaveCopyInUndoList( GetCurPart(), UR_LIBEDIT ); block->SetAppendUndo(); } if( GetCurPart() ) { BlockDeleteSelectedItems( GetCurPart(), block ); RebuildView(); GetCanvas()->Refresh(); OnModify(); } break; case BLOCK_PASTE: case BLOCK_ROTATE: case BLOCK_MIRROR_X: case BLOCK_MIRROR_Y: case BLOCK_FLIP: wxFAIL; // should not happen break; case BLOCK_ZOOM: // Window Zoom Window_Zoom( *block ); break; case BLOCK_ABORT: break; case BLOCK_SELECT_ITEMS_ONLY: break; case BLOCK_PRESELECT_MOVE: // not used in LibEdit case BLOCK_DUPLICATE_AND_INCREMENT: // not used in Eeschema case BLOCK_MOVE_EXACT: // not used in Eeschema break; } } if( block->GetCommand() == BLOCK_ABORT ) { GetScreen()->ClearDrawingState(); } if( !nextCmd ) { if( block->GetCommand() != BLOCK_SELECT_ITEMS_ONLY && GetCurPart() ) BlockClearSelectedItems( GetCurPart(), block ); GetScreen()->ClearBlockCommand(); GetScreen()->SetCurItem( NULL ); m_canvas->EndMouseCapture( GetToolId(), GetGalCanvas()->GetCurrentCursor(), wxEmptyString, false ); } view->ShowSelectionArea( false ); view->ShowPreview( nextCmd ); return nextCmd; }