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; }
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); }
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; }
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; }