From eec9f1f4286164bbba0778a0e76e1e782c23a497 Mon Sep 17 00:00:00 2001 From: dickelbeck Date: Fri, 2 Nov 2007 18:21:43 +0000 Subject: [PATCH] fixed track delete bug --- change_log.txt | 40 ++++-- pcbnew/class_track.cpp | 2 + pcbnew/class_track.h | 15 ++- pcbnew/deltrack.cpp | 12 +- pcbnew/drag.h | 62 +++++---- pcbnew/dragsegm.cpp | 293 +++++++++++++++++++++++------------------ pcbnew/hotkeys.cpp | 33 ++++- 7 files changed, 276 insertions(+), 181 deletions(-) diff --git a/change_log.txt b/change_log.txt index 25157de081..fac7aec2fc 100644 --- a/change_log.txt +++ b/change_log.txt @@ -4,14 +4,30 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. -2007-Nov-032 UPDATE Jean-Pierre Charras + +2007-Nov-2 UPDATE Dick Hollenbeck +================================================================================ ++ pcbnew + fixed a crashing bug which happened if you "dragged" a module with + tracks. Then deleted one of the pad connected tracks, then deleted the + next track attached to the first one. Memory was being corrupted because + PcbGeneralLocate() and display was not being called on the 2nd track to + be deleted because the m_Flags test: + bool ItemFree = (GetCurItem()==0 || GetCurItem()->m_Flags==0); + was returning false. Solution was to SetCurItem(NULL) after deleting a + TRACK. This makes sense, SetCurItem() is used for designating a "selected" + item, and a deleted TRACK is not even in the BOARD anymore and should not + be selected or selectable. I think this bug may have been causing spurious + crashes for the last couple of months. + + +2007-Nov-02 UPDATE Jean-Pierre Charras ================================================================================ +all: - solved: eeschema, pcbnew and cvpcb did not find libraries when they were - in the default library path, but in a subdirectory - (this is because the default path was not added to the name if the name had - already a path) - + solved: eeschema, pcbnew and cvpcb did not find libraries when they were + in the default library path, but in a subdirectory + (this is because the default path was not added to the name if the name had + already a path) 2007-Nov-02 UPDATE Geoff Harland @@ -49,11 +65,11 @@ email address. 2007-Oct-31 UPDATE Jean-Pierre Charras ================================================================================ +kicad: - rename mdiframe.cpp to mainframe.cpp - create commandframe.cpp to handle the command frame (which have the 4 "fast launch" buttons) + rename mdiframe.cpp to mainframe.cpp + create commandframe.cpp to handle the command frame (which have the 4 "fast launch" buttons) -2007-Oct-31 UPDATE Dick Hollenbeck +2007-Oct-31 UPDATE Dick Hollenbeck ================================================================================ + all * Added Doxygen configuration file, whose standard name is Doxyfile. Output @@ -1124,7 +1140,7 @@ email address. better hotkey.cpp (code cleaning and info messages) -2007-June-19 UPDATE Dick Hollenbeck +2007-June-19 UPDATE Dick Hollenbeck ================================================================================ + pcbnew After locking a module with 'L', update the status window with the locked @@ -1140,7 +1156,7 @@ email address. add install targets for resources and docs -2007-June-15 UPDATE Dick Hollenbeck +2007-June-15 UPDATE Dick Hollenbeck ================================================================================ + pcbnew ** only modules on the present layer are subject to individual module @@ -1194,7 +1210,7 @@ email address. line e.g. "make -f makefile.gtk KICAD_STATIC_LINK=0" -2007-June-11 UPDATE Dick Hollenbeck +2007-June-11 UPDATE Dick Hollenbeck ================================================================================ + Started this change log file. diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index 59dfeec8ae..d219ccde11 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -447,6 +447,7 @@ TRACK* TRACK::GetBestInsertPoint( BOARD* Pcb ) /* Traitement du debut de liste */ if( track == NULL ) return NULL; /* No tracks ! */ + if( GetNet() < track->GetNet() ) /* no net code or net code = 0 (track not connected) */ return NULL; @@ -454,6 +455,7 @@ TRACK* TRACK::GetBestInsertPoint( BOARD* Pcb ) { if( NextTrack->GetNet() > this->GetNet() ) break; + track = NextTrack; } diff --git a/pcbnew/class_track.h b/pcbnew/class_track.h index 9f1da9b309..a1113c5317 100644 --- a/pcbnew/class_track.h +++ b/pcbnew/class_track.h @@ -68,25 +68,28 @@ public: */ bool Save( FILE* aFile ) const; - /** * Function Insert - * inserts a TRACK, SEGVIA or SEGZONE into its proper list, either at the + * inserts a single TRACK, SEGVIA or SEGZONE, or a list of such, + * into the proper list within a BOARD, either at the * list's front or immediately after the InsertPoint. * If Insertpoint == NULL, then insert at the beginning of the proper list. * If InsertPoint != NULL, then insert immediately after InsertPoint. * TRACKs and SEGVIAs are put on the m_Track list, SEGZONE on the m_Zone list. + * @param aPcb The BOARD to insert into. * @param InsertPoint See above */ - void Insert( BOARD* Pcb, BOARD_ITEM* InsertPoint ); - + void Insert( BOARD* aPcb, BOARD_ITEM* InsertPoint ); + /** * Function GetBestInsertPoint * searches the "best" insertion point within the track linked list. - * The best point is the of the corresponding net code section. + * The best point is the begging of the corresponding net code section. + * (The BOARD::m_Track and BOARD::m_Zone lists are sorted by netcode.) + * @param aPcb The BOARD to search for the insertion point. * @return TRACK* - the item found in the linked list (or NULL if no track) */ - TRACK* GetBestInsertPoint( BOARD* Pcb ); + TRACK* GetBestInsertPoint( BOARD* aPcb ); /* Search (within the track linked list) the first segment matching the netcode * ( the linked list is always sorted by net codes ) diff --git a/pcbnew/deltrack.cpp b/pcbnew/deltrack.cpp index 0185a4e65e..24d353da05 100644 --- a/pcbnew/deltrack.cpp +++ b/pcbnew/deltrack.cpp @@ -31,6 +31,14 @@ TRACK* WinEDA_PcbFrame::Delete_Segment( wxDC* DC, TRACK* Track ) if( Track == NULL ) return NULL; + + if( Track->GetState(DELETED) ) + { +#if defined(DEBUG) + printf("WinEDA_PcbFrame::Delete_Segment(): bug deleted already deleted TRACK\n"); +#endif + return NULL; + } if( Track->m_Flags & IS_NEW ) // Trace en cours, on peut effacer le dernier segment { @@ -48,7 +56,8 @@ TRACK* WinEDA_PcbFrame::Delete_Segment( wxDC* DC, TRACK* Track ) g_TrackSegmentCount--; if( g_TwoSegmentTrackBuild ) - { // g_CurrentTrackSegment->Pback must not be a via, or we want delete also the via + { + // g_CurrentTrackSegment->Pback must not be a via, or we want delete also the via if( (g_TrackSegmentCount >= 2) && (g_CurrentTrackSegment->Type() != TYPEVIA) && (g_CurrentTrackSegment->Pback->Type() == TYPEVIA) ) @@ -132,7 +141,6 @@ void WinEDA_PcbFrame::Delete_Track( wxDC* DC, TRACK* Track ) Supprime_Une_Piste( DC, Track ); GetScreen()->SetModify(); test_1_net_connexion( DC, current_net_code ); - m_Pcb->Display_Infos( this ); } } diff --git a/pcbnew/drag.h b/pcbnew/drag.h index eb98f71132..568d1be816 100644 --- a/pcbnew/drag.h +++ b/pcbnew/drag.h @@ -1,45 +1,49 @@ - /***************************************************************/ - /* Edition des Modules: Structures et variables de gestion des */ - /* fonctions de "DRAG" des segments de piste */ - /***************************************************************/ +/***************************************************************/ +/* Edition des Modules: Structures et variables de gestion des */ +/* fonctions de "DRAG" des segments de piste */ +/***************************************************************/ /*** Class to handle a list of track segments to drag ***/ class DRAG_SEGM { public: - - DRAG_SEGM * Pnext; /* Pointeur de chainage */ - TRACK * m_Segm; /* pointeur sur le segment a "dragger */ - D_PAD * m_Pad_Start; /* pointeur sur le Pad origine si origine segment sur pad */ - D_PAD * m_Pad_End; /* pointeur sur le Pad fin si fin segment sur pad */ - int m_Flag; /* indicateur divers */ + + DRAG_SEGM* Pnext; /* Pointeur de chainage */ + TRACK* m_Segm; /* pointeur sur le segment a "dragger */ + D_PAD* m_Pad_Start; /* pointeur sur le Pad origine si origine segment sur pad */ + D_PAD* m_Pad_End; /* pointeur sur le Pad fin si fin segment sur pad */ + int m_Flag; /* indicateur divers */ private: - wxPoint m_StartInitialValue; - wxPoint m_EndInitialValue; /* For abort: initial m_Start and m_End values for m_Segm */ - + wxPoint m_StartInitialValue; + wxPoint m_EndInitialValue; /* For abort: initial m_Start and m_End values for m_Segm */ + public: - DRAG_SEGM(TRACK * segm); - ~DRAG_SEGM(); - - void SetInitialValues(); + DRAG_SEGM( TRACK * segm ); + ~DRAG_SEGM(); + void SetInitialValues(); }; - /* Variables */ +/* Variables */ -eda_global DRAG_SEGM * g_DragSegmentList; /* pointe le debut de la liste - des structures DRAG_SEGM */ +eda_global DRAG_SEGM* g_DragSegmentList; /* pointe le debut de la liste + * des structures DRAG_SEGM */ /* routines specifiques */ -void Dessine_Segments_Dragges(WinEDA_DrawPanel * panel, wxDC * DC); -void Build_Drag_Liste(WinEDA_DrawPanel * panel, wxDC * DC, MODULE * Module); -void Build_1_Pad_SegmentsToDrag(WinEDA_DrawPanel * panel, wxDC * DC, D_PAD * PtPad ); -void Collect_TrackSegmentsToDrag(WinEDA_DrawPanel * panel, wxDC * DC, - wxPoint & point, int MasqueLayer, int net_code); -void EraseDragListe(); -void AddSegmentToDragList(WinEDA_DrawPanel * panel, wxDC * DC, - int flag, TRACK * Track); /* Add the segment"Track" to the drag list, and erase it from screen - flag = STARTPOINT (if the point to drag is the start point of Track) or ENDPOINT */ +void Dessine_Segments_Dragges( WinEDA_DrawPanel* panel, wxDC* DC ); +void Build_Drag_Liste( WinEDA_DrawPanel* panel, wxDC* DC, MODULE* Module ); +void Build_1_Pad_SegmentsToDrag( WinEDA_DrawPanel* panel, wxDC* DC, D_PAD* PtPad ); +void Collect_TrackSegmentsToDrag( WinEDA_DrawPanel* panel, wxDC* DC, + wxPoint& point, int MasqueLayer, int net_code ); +void EraseDragListe(); + + +/* Add the segment"Track" to the drag list, and erase it from screen + * flag = STARTPOINT (if the point to drag is the start point of Track) + * or ENDPOINT + */ +void AddSegmentToDragList( WinEDA_DrawPanel* panel, wxDC* DC, + int flag, TRACK* Track ); diff --git a/pcbnew/dragsegm.cpp b/pcbnew/dragsegm.cpp index 196132d4ee..8f0db41f27 100644 --- a/pcbnew/dragsegm.cpp +++ b/pcbnew/dragsegm.cpp @@ -1,8 +1,8 @@ - /*********************************************************/ - /* Routines relatives a la gestions des pistes en "DRAG" */ - /*********************************************************/ +/*********************************************************/ +/* Routines relatives a la gestions des pistes en "DRAG" */ +/*********************************************************/ - /* Fichier dragsegm.cpp */ +/* Fichier dragsegm.cpp */ #include "fctsys.h" #include "gr_basic.h" @@ -18,14 +18,14 @@ /* fonctions locales */ -DRAG_SEGM::DRAG_SEGM(TRACK * segm) +DRAG_SEGM::DRAG_SEGM( TRACK* segm ) { - m_Segm = segm; - m_StartInitialValue = m_Segm->m_Start; - m_EndInitialValue = m_Segm->m_End; + m_Segm = segm; + m_StartInitialValue = m_Segm->m_Start; + m_EndInitialValue = m_Segm->m_End; - m_Pad_Start = m_Pad_End = NULL; - m_Flag = 0; + m_Pad_Start = m_Pad_End = NULL; + m_Flag = 0; } @@ -36,172 +36,213 @@ DRAG_SEGM::~DRAG_SEGM() void DRAG_SEGM::SetInitialValues() { - m_Segm->m_Start = m_StartInitialValue; - m_Segm->m_End = m_EndInitialValue; + m_Segm->m_Start = m_StartInitialValue; + m_Segm->m_End = m_EndInitialValue; } + /*******************************************************************/ -void Dessine_Segments_Dragges(WinEDA_DrawPanel * panel, wxDC * DC) +void Dessine_Segments_Dragges( WinEDA_DrawPanel* panel, wxDC* DC ) /*******************************************************************/ /* Redraw the list of segments starting in g_DragSegmentList, while moving a footprint */ { -D_PAD* pt_pad; -TRACK * Track; -DRAG_SEGM * pt_drag; + D_PAD* pt_pad; + TRACK* Track; + DRAG_SEGM* pt_drag; - if(g_DragSegmentList == NULL ) return; + if( g_DragSegmentList == NULL ) + return; - pt_drag = g_DragSegmentList; - for( ; pt_drag; pt_drag = pt_drag->Pnext) - { - int px, py; + pt_drag = g_DragSegmentList; + for( ; pt_drag; pt_drag = pt_drag->Pnext ) + { + int px, py; - Track = pt_drag->m_Segm; + Track = pt_drag->m_Segm; - Track->Draw(panel, DC, GR_XOR); /* effacement */ + Track->Draw( panel, DC, GR_XOR ); // erase from screen at old position - pt_pad = pt_drag->m_Pad_Start; - if( pt_pad) - { - px = pt_pad->m_Pos.x - g_Offset_Module.x; - py = pt_pad->m_Pos.y - g_Offset_Module.y; - Track->m_Start.x = px; Track->m_Start.y = py; - } - pt_pad = pt_drag->m_Pad_End; - if( pt_pad) - { - px = pt_pad->m_Pos.x - g_Offset_Module.x; - py = pt_pad->m_Pos.y - g_Offset_Module.y; - Track->m_End.x = px; Track->m_End.y = py; - } - Track->Draw(panel, DC, GR_XOR); - } + pt_pad = pt_drag->m_Pad_Start; + if( pt_pad ) + { + px = pt_pad->m_Pos.x - g_Offset_Module.x; + py = pt_pad->m_Pos.y - g_Offset_Module.y; + + Track->m_Start.x = px; + Track->m_Start.y = py; + } + + pt_pad = pt_drag->m_Pad_End; + if( pt_pad ) + { + px = pt_pad->m_Pos.x - g_Offset_Module.x; + py = pt_pad->m_Pos.y - g_Offset_Module.y; + + Track->m_End.x = px; + Track->m_End.y = py; + } + + Track->Draw( panel, DC, GR_XOR ); + } } /*************************************************************************/ -void Build_Drag_Liste(WinEDA_DrawPanel * panel, wxDC * DC, MODULE * Module) +void Build_Drag_Liste( WinEDA_DrawPanel* panel, wxDC* DC, MODULE* Module ) /*************************************************************************/ + /* Construit la liste des segments connectes aus pads du module Module - pour le drag de ces segments - la liste est mise a l'adresse pointee par pt_drag. - la variable globale nb_drag_segment est incrementee du nombre de segments - Met l'attribut EDIT sur les segments selectionnes - et les affiche en mode EDIT (sketch) -*/ + * pour le drag de ces segments + * la liste est mise a l'adresse pointee par pt_drag. + * la variable globale nb_drag_segment est incrementee du nombre de segments + * Met l'attribut EDIT sur les segments selectionnes + * et les affiche en mode EDIT (sketch) + */ { -D_PAD * pt_pad; + D_PAD* pt_pad; - pt_pad = Module->m_Pads; - for( ; pt_pad != NULL ; pt_pad = (D_PAD *) pt_pad->Pnext) - { - Build_1_Pad_SegmentsToDrag(panel, DC, pt_pad); - } - return; + pt_pad = Module->m_Pads; + for( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext ) + { + Build_1_Pad_SegmentsToDrag( panel, DC, pt_pad ); + } + + return; } /**********************************************************************************/ -void Build_1_Pad_SegmentsToDrag(WinEDA_DrawPanel * panel, wxDC * DC, D_PAD * PtPad) +void Build_1_Pad_SegmentsToDrag( WinEDA_DrawPanel* panel, wxDC* DC, D_PAD* PtPad ) /**********************************************************************************/ + /* Routine construisant la liste les segments de piste connectes au pad PtPad - Les net_codes sont supposes a jour. -*/ + * Les net_codes sont supposes a jour. + */ { -TRACK * Track; -int net_code = PtPad->GetNet(); -int MasqueLayer; -wxPoint pos; -BOARD * pcb = ((WinEDA_BasePcbFrame*)(panel->m_Parent))->m_Pcb; + TRACK* Track; + int net_code = PtPad->GetNet(); + int MasqueLayer; + wxPoint pos; + BOARD* pcb = ( (WinEDA_BasePcbFrame*) (panel->m_Parent) )->m_Pcb; - Track = pcb->m_Track->GetStartNetCode(net_code); + Track = pcb->m_Track->GetStartNetCode( net_code ); - pos = PtPad->m_Pos; - MasqueLayer = PtPad->m_Masque_Layer; - for( ; Track != NULL; Track = (TRACK*)Track->Pnext ) - { - if( Track->GetNet() != net_code ) break; /* hors zone */ - if( (MasqueLayer & Track->ReturnMaskLayer()) == 0 ) continue; /* couches differentes */ - if( pos == Track->m_Start ) - { - AddSegmentToDragList(panel, DC, STARTPOINT, Track); - g_DragSegmentList->m_Pad_Start = PtPad; - } - if( pos == Track->m_End ) - { - AddSegmentToDragList(panel, DC, ENDPOINT, Track); - g_DragSegmentList->m_Pad_End = PtPad; - } - } + pos = PtPad->m_Pos; + MasqueLayer = PtPad->m_Masque_Layer; + for( ; Track; Track = Track->Next() ) + { + if( Track->GetNet() != net_code ) + break; /* hors zone */ + + if( ( MasqueLayer & Track->ReturnMaskLayer() ) == 0 ) + continue; /* couches differentes */ + + if( pos == Track->m_Start ) + { + AddSegmentToDragList( panel, DC, STARTPOINT, Track ); + g_DragSegmentList->m_Pad_Start = PtPad; + } + + if( pos == Track->m_End ) + { + AddSegmentToDragList( panel, DC, ENDPOINT, Track ); + g_DragSegmentList->m_Pad_End = PtPad; + } + } } + /******************************************************************/ -void AddSegmentToDragList(WinEDA_DrawPanel * panel, wxDC * DC, - int flag, TRACK * Track) +void AddSegmentToDragList( WinEDA_DrawPanel* panel, wxDC* DC, + int flag, TRACK* Track ) /******************************************************************/ + /* Add the segment"Track" to the drag list, and erase it from screen - flag = STARTPOINT (if the point to drag is the start point of Track) or ENDPOINT -*/ + * flag = STARTPOINT (if the point to drag is the start point of Track) or ENDPOINT + */ { -DRAG_SEGM * pt_drag; + DRAG_SEGM* pt_drag; - pt_drag = new DRAG_SEGM(Track); - pt_drag->Pnext = g_DragSegmentList; - g_DragSegmentList = pt_drag; - if ( (flag & STARTPOINT) ) pt_drag->m_Flag |= 1; - if ( (flag & ENDPOINT) ) pt_drag->m_Flag |= 2; - Track->Draw(panel, DC, GR_XOR); - Track->SetState(EDIT,ON); - if ( (flag & STARTPOINT) ) Track->m_Flags |= STARTPOINT; - if ( (flag & ENDPOINT) ) Track->m_Flags |= ENDPOINT; - Track->Draw(panel, DC, GR_XOR); + pt_drag = new DRAG_SEGM( Track ); + + pt_drag->Pnext = g_DragSegmentList; + g_DragSegmentList = pt_drag; + + if( (flag & STARTPOINT) ) + pt_drag->m_Flag |= 1; + + if( (flag & ENDPOINT) ) + pt_drag->m_Flag |= 2; + + Track->Draw( panel, DC, GR_XOR ); + Track->SetState( EDIT, ON ); + + if( (flag & STARTPOINT) ) + Track->m_Flags |= STARTPOINT; + + if( (flag & ENDPOINT) ) + Track->m_Flags |= ENDPOINT; + + Track->Draw( panel, DC, GR_XOR ); } + /**********************************************************************************/ -void Collect_TrackSegmentsToDrag(WinEDA_DrawPanel * panel, wxDC * DC, - wxPoint & point, int MasqueLayer, int net_code) +void Collect_TrackSegmentsToDrag( WinEDA_DrawPanel* panel, wxDC* DC, + wxPoint& point, int MasqueLayer, int net_code ) /**********************************************************************************/ + /* Routine construisant la liste les segments de piste connectes a la via Via - Les net_codes sont supposes a jour. -*/ + * Les net_codes sont supposes a jour. + */ { -TRACK * Track; -BOARD * pcb = ((WinEDA_BasePcbFrame*)(panel->m_Parent))->m_Pcb; + BOARD* pcb = ( (WinEDA_BasePcbFrame*) (panel->m_Parent) )->m_Pcb; - Track = pcb->m_Track->GetStartNetCode(net_code); - - for( ; Track != NULL; Track = (TRACK*)Track->Pnext ) - { - if( Track->GetNet() != net_code ) break; /* hors zone */ - if( (MasqueLayer & Track->ReturnMaskLayer()) == 0 ) continue; /* couches differentes */ - if ( Track->m_Flags & IS_DRAGGED) continue; // already in list - if( Track->m_Start == point ) - { - AddSegmentToDragList(panel, DC, STARTPOINT, Track); - } - if( Track->m_End == point ) - { - AddSegmentToDragList(panel, DC, ENDPOINT, Track); - } - } + TRACK* Track = pcb->m_Track->GetStartNetCode( net_code ); + for( ; Track; Track = Track->Next() ) + { + if( Track->GetNet() != net_code ) + break; /* hors zone */ + + if( ( MasqueLayer & Track->ReturnMaskLayer() ) == 0 ) + continue; /* couches differentes */ + + if( Track->m_Flags & IS_DRAGGED ) + continue; // already in list + + if( Track->m_Start == point ) + { + AddSegmentToDragList( panel, DC, STARTPOINT, Track ); + } + + if( Track->m_End == point ) + { + AddSegmentToDragList( panel, DC, ENDPOINT, Track ); + } + } } /*****************************/ void EraseDragListe() /*****************************/ + /* Routine de liberation memoire de la liste des structures DRAG_SEGM - remet a zero le pointeur global g_DragSegmentList -*/ + * remet a zero le pointeur global g_DragSegmentList + */ { -DRAG_SEGM * pt_drag, * NextStruct; + DRAG_SEGM* pt_drag; + DRAG_SEGM* NextStruct; - if( g_DragSegmentList == NULL ) return; + if( g_DragSegmentList == NULL ) + return; - pt_drag = g_DragSegmentList; - for( ; pt_drag != NULL; pt_drag = NextStruct) - { - NextStruct = pt_drag->Pnext; delete pt_drag; - } - g_DragSegmentList = NULL; + pt_drag = g_DragSegmentList; + for( ; pt_drag != NULL; pt_drag = NextStruct ) + { + NextStruct = pt_drag->Pnext; + delete pt_drag; + } + + g_DragSegmentList = NULL; } diff --git a/pcbnew/hotkeys.cpp b/pcbnew/hotkeys.cpp index c6028ca52f..254ed537d1 100644 --- a/pcbnew/hotkeys.cpp +++ b/pcbnew/hotkeys.cpp @@ -313,14 +313,24 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, // don't let backspace delete modules!! if( DrawStruct && (DrawStruct->Type() == TYPETRACK - || DrawStruct->Type() == TYPEVIA) ) + || DrawStruct->Type() == TYPEVIA) ) + { Delete_Segment( DC, (TRACK*) DrawStruct ); + SetCurItem(NULL); + // this is an exception to the new rule that only the "selected" item + // gets its Infos displayed, but we cannot "select" a deleted item. + DrawStruct->Display_Infos(this); + } GetScreen()->SetModify(); } else if( GetCurItem()->Type() == TYPETRACK ) { // then an element is being edited - remove the last segment. - SetCurItem( Delete_Segment( DC, (TRACK*) GetCurItem() ) ); + Delete_Segment( DC, (TRACK*) GetCurItem() ); + SetCurItem(NULL); + // this is an exception to the new rule that only the "selected" item + // gets its Infos displayed, but we cannot "select" a deleted item. + DrawStruct->Display_Infos(this); GetScreen()->SetModify(); } } @@ -385,6 +395,7 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, return; if( (GetCurItem()->m_Flags & IS_NEW) == 0 ) return; + Other_Layer_Route( (TRACK*) GetCurItem(), DC ); // place via and switch layer if( DisplayOpt.ContrastModeDisplay ) GetScreen()->SetRefreshReq(); @@ -564,25 +575,33 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* DC, EDA_BaseStruct* DrawStruct ) * Delete the module. */ { - bool ItemFree = (GetCurItem() == NULL ) - || (GetCurItem()->m_Flags == 0); + bool ItemFree = (GetCurItem() == NULL ) || (GetCurItem()->m_Flags == 0); switch( m_ID_current_state ) { case ID_TRACK_BUTT: if( GetScreen()->m_Active_Layer > LAST_COPPER_LAYER ) return FALSE; + if( ItemFree ) { DrawStruct = PcbGeneralLocateAndDisplay(); if( DrawStruct && DrawStruct->Type() != TYPETRACK ) return FALSE; + Delete_Track( DC, (TRACK*) DrawStruct ); + SetCurItem(NULL); + // this is an exception to the rule that only the "selected" item + // gets its Infos displayed, but we cannot "select" a deleted item. + DrawStruct->Display_Infos(this); } else if( GetCurItem()->Type() == TYPETRACK ) { - SetCurItem( - Delete_Segment( DC, (TRACK*) GetCurItem() ) ); + Delete_Segment( DC, (TRACK*) GetCurItem() ); + SetCurItem(NULL); + // this is an exception to the new rule that only the "selected" item + // gets its Infos displayed, but we cannot "select" a deleted item. + DrawStruct->Display_Infos(this); GetScreen()->SetModify(); return TRUE; } @@ -594,8 +613,10 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* DC, EDA_BaseStruct* DrawStruct ) MODULE* module = Locate_Prefered_Module( m_Pcb, CURSEUR_ON_GRILLE ); if( module == NULL ) return FALSE; + if( !IsOK( this, _( "Delete module?" ) ) ) return FALSE; + RemoveStruct( module, DC ); } else