From cb49ea8989a555ccbc9a9f9249fe1fc0f5f55593 Mon Sep 17 00:00:00 2001 From: dickelbeck Date: Wed, 12 Sep 2007 02:14:07 +0000 Subject: [PATCH] see change_log.txt for 2007-Sep-11 UPDATE --- change_log.txt | 21 ++- common/base_screen.cpp | 10 -- include/base_struct.h | 15 ++ include/drawpanel_wxstruct.h | 12 +- include/id.h | 7 +- include/pcbstruct.h | 4 +- include/wxstruct.h | 62 ++++++- pcbnew/basepcbframe.cpp | 65 +++++-- pcbnew/bitmaps/Footprint_Text.xpm | 3 +- pcbnew/block.cpp | 2 +- pcbnew/block_module_editor.cpp | 4 +- pcbnew/class_board.cpp | 4 +- pcbnew/class_module.cpp | 3 +- pcbnew/collectors.cpp | 29 ++- pcbnew/collectors.h | 32 ++++ pcbnew/controle.cpp | 289 +++++++++++++++++++++++++++--- pcbnew/cotation.cpp | 2 +- pcbnew/deltrack.cpp | 2 +- pcbnew/dialog_edit_module.cpp | 2 +- pcbnew/edgemod.cpp | 4 +- pcbnew/edit.cpp | 230 ++++++++++++------------ pcbnew/editedge.cpp | 16 +- pcbnew/editmod.cpp | 2 +- pcbnew/editrack.cpp | 8 +- pcbnew/edtxtmod.cpp | 2 +- pcbnew/files.cpp | 2 +- pcbnew/hotkeys.cpp | 54 +++--- pcbnew/initpcb.cpp | 4 +- pcbnew/loadcmp.cpp | 2 +- pcbnew/mirepcb.cpp | 4 +- pcbnew/modedit.cpp | 22 +-- pcbnew/modedit_onclick.cpp | 29 +-- pcbnew/modedit_undo_redo.cpp | 4 +- pcbnew/moduleframe.cpp | 2 +- pcbnew/modules.cpp | 4 +- pcbnew/move_copy_track.cpp | 4 +- pcbnew/move_or_drag_track.cpp | 3 +- pcbnew/muonde.cpp | 2 +- pcbnew/onrightclick.cpp | 64 ++++--- pcbnew/pcbframe.cpp | 5 +- pcbnew/pcbtexte.cpp | 8 +- pcbnew/zones.cpp | 8 +- todo.txt | 8 +- 43 files changed, 739 insertions(+), 320 deletions(-) diff --git a/change_log.txt b/change_log.txt index 7fcc143a25..e554759f27 100644 --- a/change_log.txt +++ b/change_log.txt @@ -5,13 +5,32 @@ Please add newer entries at the top, list the date and your name with email address. +2007-Sep-11 UPDATE Dick Hollenbeck +================================================================================ ++ pcbnew + * Changed PcbLocateAndDisplay() to be tool specific in its search and to present + a popup menu when there are multiple items under the mouse. It is also + a framework for future enhancements. + @todo: grep for @todo and finish off those tasks. + * Introduced a formal notion of "selected item". This is done with the addition + of the WinEDA_BasePcbFrame::SetCurItem() function. So now you have to first + select an item with the left mouse button before you attempt to use the + right button popup menu. Right button no longer has an effect on the + currently selected item. The currently selected item is shown in the MsgPanel. + When none is selected, the m_Pcb is shown. + * Tweaked the OnRightClick() popup menus so that the most likely choices are + at the top. + * Added wxString BOARD_ITEM::MenuText() const and BOARD_ITEM::MenuIcon() and + both need more work, work which I will not have time to do. + + 2007-Sep-10 UPDATE Dick Hollenbeck ================================================================================ + pcbnew * Searched and did not see any usage of TRACK::Copy(int), where int was other than '1', so renamed it to TRACK::CopyList(int) and commented it out because with int==1, this makes Copy(1) equivalent to the new Copy(void). - * Made TRACK::Copy() capable or copying SEGZONE too. + * Made TRACK::Copy() capable of copying SEGZONE too. 2007-sept-10 UPDATE Jean-Pierre Charras diff --git a/common/base_screen.cpp b/common/base_screen.cpp index a45b5ba2c5..f10466fd75 100644 --- a/common/base_screen.cpp +++ b/common/base_screen.cpp @@ -555,13 +555,3 @@ EDA_BaseStruct* BASE_SCREEN::GetItemFromRedoList() return item; } - -void BASE_SCREEN::SetCurItem( EDA_BaseStruct* aCurItem ) -{ - -#if 0 && defined(DEBUG) - printf( "SetCurItem(%p)\n", aCurItem ); -#endif - - m_CurrentItem = aCurItem; -} diff --git a/include/base_struct.h b/include/base_struct.h index d2ce1db782..05dca12991 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -477,6 +477,21 @@ public: return false; // only MODULEs can be locked at this time. } + /** + * Function MenuText + * @return wxString - The text to use in any menu type UI control which + * must identify this item. + * @todo: make this virtual and split into each derived class + */ + wxString MenuText() const; + + /** + * Function MenuIcon + * @return const char** - The XPM to use in any UI control which can help + * identify this item. + * @todo: make this virtual and split into each derived class + */ + const char** MenuIcon() const; }; diff --git a/include/drawpanel_wxstruct.h b/include/drawpanel_wxstruct.h index 1d6b75b90d..264a19ce6b 100644 --- a/include/drawpanel_wxstruct.h +++ b/include/drawpanel_wxstruct.h @@ -215,7 +215,7 @@ private: char m_FlagRefreshReq; /* indique que l'ecran doit redessine */ char m_FlagModified; // indique modif du PCB,utilise pour eviter une sortie sans sauvegarde char m_FlagSave; // indique sauvegarde auto faite - EDA_BaseStruct* m_CurrentItem; /* Current selected object */ + EDA_BaseStruct* m_CurrentItem; ///< Current selected object /* Valeurs du pas de grille et du zoom */ public: @@ -232,7 +232,7 @@ public: BASE_SCREEN( int idscreen, KICAD_T aType = SCREEN_STRUCT_TYPE ); ~BASE_SCREEN(); - void InitDatas();/* Inits completes des variables */ + void InitDatas(); /* Inits completes des variables */ wxSize ReturnPageSize(); int GetInternalUnits(); @@ -264,7 +264,11 @@ public: * activity easier in base_screen.cpp. * @param current Any object derived from EDA_BaseStruct */ - void SetCurItem( EDA_BaseStruct* current ); + void SetCurItem( EDA_BaseStruct* current ) + { + m_CurrentItem = current; + } + EDA_BaseStruct* GetCurItem() const { return m_CurrentItem; } /* fonctions relatives au zoom */ @@ -290,7 +294,7 @@ public: * Function RefPos * returns the reference position, coming from either the mouse position or the * the cursor position. - * @param useMouse If true, return mouse posistion, else cursor's. + * @param useMouse If true, return mouse position, else cursor's. * @return wxPoint - The reference point, either the mouse position or * the cursor position. */ diff --git a/include/id.h b/include/id.h index 2ff8cbfa56..d08226b63f 100644 --- a/include/id.h +++ b/include/id.h @@ -2,6 +2,8 @@ #ifndef ID_H #define ID_H +#define MAX_ITEMS_IN_PICKER 15 ///< max no. items in the popup menu for item selection + enum main_id { ID_MAIN_FRAME = 100, ID_LEFT_FRAME, @@ -635,6 +637,10 @@ enum main_id { ID_POPUP_PCB_END_RANGE, + // reserve a block of MAX_ITEMS_IN_PICKER ids for the item selection popup + ID_POPUP_PCB_ITEM_SELECTION_START, + ID_POPUP_PCB_ITEM_SELECTION_END = MAX_ITEMS_IN_PICKER + ID_POPUP_PCB_ITEM_SELECTION_START, + ID_POPUP_PCB_AUTOPLACE_START_RANGE, ID_POPUP_PCB_AUTOPLACE_FIXE_MODULE, @@ -858,7 +864,6 @@ enum main_id { ID_PCB_MUWAVE_END_CMD, ID_END_LIST - }; #endif /* define ID_H */ diff --git a/include/pcbstruct.h b/include/pcbstruct.h index 097f78d1a1..86f1d61603 100644 --- a/include/pcbstruct.h +++ b/include/pcbstruct.h @@ -276,9 +276,9 @@ public: * returned, otherwise any visible Pad or Module on any other layer. * The provided layer must be visible. * @param refPos The wxPoint to hit-test. - * @return EDA_BaseStruct* - if a direct hit, else NULL. + * @return BOARD_ITEM* - if a direct hit, else NULL. */ - EDA_BaseStruct* FindPadOrModule( const wxPoint& refPos, int layer ); +// BOARD_ITEM* FindPadOrModule( const wxPoint& refPos, int layer ); /** diff --git a/include/wxstruct.h b/include/wxstruct.h index de315a6925..c79f5e666c 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -340,9 +340,7 @@ public: WinEDA3D_DrawFrame* m_Draw3DFrame; protected: -#if defined(DEBUG) GENERAL_COLLECTOR* m_Collector; -#endif public: @@ -392,17 +390,39 @@ public: // Gestion du PCB bool Clear_Pcb( wxDC* DC, bool query ); - BOARD_ITEM* PcbGeneralLocateAndDisplay(); - BOARD_ITEM* Locate( int typeloc, int LayerSearch ); - -#if defined(DEBUG) + /** + * Function PcbGeneralLocateAndDisplay + * searches for an item under the mouse cursor. + * Items are searched first on the current working layer. + * If nothing found, an item will be searched without layer restriction. If + * more than one item is found meeting the current working layer criterion, then + * a popup menu is shown which allows the user to pick which item he/she is + * interested in. Once an item is chosen, then it is make the "current item" + * and the status window is updated to reflect this. + */ + BOARD_ITEM* PcbGeneralLocateAndDisplay(); + + BOARD_ITEM* Locate( int typeloc, int LayerSearch ); + void ProcessItemSelection( wxCommandEvent& event ); + + /** + * Function SetCurItem + * sets the currently selected item and displays it in the MsgPanel. + * If the given item is NULL then the MsgPanel is erased and there is no + * currently selected item. This function is intended to make the process + * of "selecting" an item more formal, and to indivisibly tie the operation + * of selecting an item to displaying it using BOARD_ITEM::Display_Infos(). + * @param aItem The BOARD_ITEM to make the selected item or NULL if none. + */ + void SetCurItem( BOARD_ITEM* aItem ); + BOARD_ITEM* GetCurItem(); + /** * Function GetCollectorsGuide * @return GENERAL_COLLECTORS_GUIDE - that considers the global configuration options. */ GENERAL_COLLECTORS_GUIDE GetCollectorsGuide(); -#endif // Gestion du curseur void place_marqueur( wxDC* DC, const wxPoint& pos, char* pt_bitmap, @@ -456,9 +476,11 @@ public: // Chargement de modules MODULE* Get_Librairie_Module( wxWindow* winaff, const wxString& library, const wxString& ModuleName, bool show_msg_err ); + wxString Select_1_Module_From_List( WinEDA_DrawFrame* active_window, const wxString& Library, const wxString& Mask, const wxString& KeyWord ); + MODULE* Load_Module_From_Library( const wxString& library, wxDC* DC ); // Gestion des chevelus (ratsnest) @@ -514,6 +536,8 @@ public: // divers void AddHistory( int value, KICAD_T type ); // Add value in data list history void InstallGridFrame( const wxPoint& pos ); + + DECLARE_EVENT_TABLE() }; @@ -533,7 +557,28 @@ private: bool m_SelViaSizeBox_Changed; wxMenu* m_FilesMenu; +#if 0 && defined(DEBUG) + /** + * Function onRightClickBuilder + * is a helper function for private use by OnRightClick(). It helps build + * the hierarchical menu. + * @param collectorNdx The index into the COLLECTOR that \a aItem represents. + * @param aItem The BOARD_ITEM to provide menu support for, or NULL if + * nothing was under the mouse. + * @param pPopMenu What to populate with choices. + */ + void onRightClickBuilder( int collectorNdx, BOARD_ITEM* aItem, wxMenu* aPopMenu ); + void popUpMenuForFootprints( int collectorNdx, MODULE* aModule, wxMenu* aPopMenu ); + + void popUpMenuForFpTexts( int collectorNdx, TEXTE_MODULE* aText, wxMenu* aPopMenu ); + + void popUpMenuForFpPads( int collectorNdx, D_PAD* aPad, wxMenu* aPopMenu ); + + void popupMenuForTracks( int collectorNdx, TRACK* aTrack, wxMenu* aPopMenu ); +#endif + + public: WinEDA_PcbFrame( wxWindow* father, WinEDA_App* parent, const wxString& title, const wxPoint& pos, const wxSize& size ); @@ -549,6 +594,7 @@ public: void OnCloseWindow( wxCloseEvent& Event ); void Process_Special_Functions( wxCommandEvent& event ); + void ProcessMuWaveFunctions( wxCommandEvent& event ); void MuWaveCommand( wxDC* DC, const wxPoint& MousePos ); @@ -898,7 +944,7 @@ public: virtual void HandleBlockPlace( wxDC* DC ); virtual int HandleBlockEnd( wxDC* DC ); - EDA_BaseStruct* ModeditLocateAndDisplay(); + BOARD_ITEM* ModeditLocateAndDisplay(); public: void SaveCopyInUndoList( EDA_BaseStruct* ItemToCopy, int flag_type_command = 0 ); diff --git a/pcbnew/basepcbframe.cpp b/pcbnew/basepcbframe.cpp index 66a95f4675..42db15ae9c 100644 --- a/pcbnew/basepcbframe.cpp +++ b/pcbnew/basepcbframe.cpp @@ -15,15 +15,24 @@ #include "protos.h" #include "id.h" -#if defined(DEBUG) #include "collectors.h" -#endif /*******************************/ /* class WinEDA_BasePcbFrame */ /*******************************/ +BEGIN_EVENT_TABLE( WinEDA_BasePcbFrame, WinEDA_DrawFrame ) + + COMMON_EVENTS_DRAWFRAME + + EVT_MENU_RANGE( ID_POPUP_PCB_ITEM_SELECTION_START, ID_POPUP_PCB_ITEM_SELECTION_END, + WinEDA_BasePcbFrame::ProcessItemSelection ) + +END_EVENT_TABLE() + + + /****************/ /* Constructeur */ /****************/ @@ -48,18 +57,13 @@ WinEDA_BasePcbFrame::WinEDA_BasePcbFrame( wxWindow* father, m_DisplayPcbTrackFill = TRUE; /* FALSE = sketch , TRUE = filled */ m_Draw3DFrame = NULL; // Display Window in 3D mode (OpenGL) -#if defined(DEBUG) m_Collector = new GENERAL_COLLECTOR(); -#endif - } WinEDA_BasePcbFrame::~WinEDA_BasePcbFrame( void ) { -#if defined(DEBUG) delete m_Collector; -#endif } @@ -168,7 +172,51 @@ void WinEDA_BasePcbFrame::SwitchLayer( wxDC* DC, int layer ) GetScreen()->SetRefreshReq(); } + + +/*****************************************************************/ +void WinEDA_BasePcbFrame::ProcessItemSelection( wxCommandEvent& event ) +/*****************************************************************/ +{ + int id = event.GetId(); + + // index into the collector list: + int itemNdx = id - ID_POPUP_PCB_ITEM_SELECTION_START; + + BOARD_ITEM* item = (*m_Collector)[itemNdx]; + #if defined(DEBUG) + item->Show( 0, std::cout ); +#endif + + SetCurItem( item ); +} + + +/*****************************************************************/ +void WinEDA_BasePcbFrame::SetCurItem( BOARD_ITEM* aItem ) +/*****************************************************************/ +{ + m_CurrentScreen->SetCurItem( aItem ); + if( aItem ) + aItem->Display_Infos(this); + else + { + // we can use either of these: + //MsgPanel->EraseMsgBox(); + m_Pcb->Display_Infos(this); + } +} + + +/*****************************************************************/ +BOARD_ITEM* WinEDA_BasePcbFrame::GetCurItem() +/*****************************************************************/ +{ + return (BOARD_ITEM*) m_CurrentScreen->GetCurItem(); +} + + /****************************************************************/ GENERAL_COLLECTORS_GUIDE WinEDA_BasePcbFrame::GetCollectorsGuide() /****************************************************************/ @@ -185,6 +233,3 @@ GENERAL_COLLECTORS_GUIDE WinEDA_BasePcbFrame::GetCollectorsGuide() return guide; } - -#endif - diff --git a/pcbnew/bitmaps/Footprint_Text.xpm b/pcbnew/bitmaps/Footprint_Text.xpm index 0dc450eb47..c6a441ba82 100644 --- a/pcbnew/bitmaps/Footprint_Text.xpm +++ b/pcbnew/bitmaps/Footprint_Text.xpm @@ -1,5 +1,5 @@ /* XPM */ -char * footprint_text_xpm[] = { +static char * footprint_text_xpm[] = { "16 16 4 1", " c None", ". c #009B9B", @@ -21,4 +21,3 @@ char * footprint_text_xpm[] = { " .....+ ", " ........ ", " "}; - diff --git a/pcbnew/block.cpp b/pcbnew/block.cpp index 48e1f24cc4..d6d91aaae9 100644 --- a/pcbnew/block.cpp +++ b/pcbnew/block.cpp @@ -439,7 +439,7 @@ void WinEDA_BasePcbFrame::Block_Delete( wxDC* DC ) GetScreen()->SetModify(); GetScreen()->BlockLocate.Normalize(); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); /* Effacement des modules */ if( Block_Include_Modules ) diff --git a/pcbnew/block_module_editor.cpp b/pcbnew/block_module_editor.cpp index bc6826ac67..68bad2cb34 100644 --- a/pcbnew/block_module_editor.cpp +++ b/pcbnew/block_module_editor.cpp @@ -192,7 +192,7 @@ int WinEDA_ModuleEditFrame::HandleBlockEnd( wxDC* DC ) GetScreen()->BlockLocate.m_Command = BLOCK_IDLE; DrawPanel->ManageCurseur = NULL; DrawPanel->ForceCloseManageCurseur = NULL; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); SetToolID( m_ID_current_state, DrawPanel->m_PanelDefaultCursor, wxEmptyString ); DrawPanel->Refresh( TRUE ); } @@ -275,7 +275,7 @@ void WinEDA_ModuleEditFrame::HandleBlockPlace( wxDC* DC ) GetScreen()->BlockLocate.m_Flags = 0; GetScreen()->BlockLocate.m_State = STATE_NO_BLOCK; GetScreen()->BlockLocate.m_Command = BLOCK_IDLE; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); DrawPanel->Refresh( TRUE ); SetToolID( m_ID_current_state, DrawPanel->m_PanelDefaultCursor, wxEmptyString ); diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp index f7b6c9bd95..c311c20854 100644 --- a/pcbnew/class_board.cpp +++ b/pcbnew/class_board.cpp @@ -440,8 +440,9 @@ SEARCH_RESULT BOARD::Visit( INSPECTOR* inspector, const void* testData, } +/* // see pcbstruct.h -EDA_BaseStruct* BOARD::FindPadOrModule( const wxPoint& refPos, int layer ) +BOARD_ITEM* BOARD::FindPadOrModule( const wxPoint& refPos, int layer ) { class PadOrModule : public INSPECTOR { @@ -514,6 +515,7 @@ EDA_BaseStruct* BOARD::FindPadOrModule( const wxPoint& refPos, int layer ) return inspector.found; } +*/ /** diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp index 83b13e4c5d..78dae0d819 100644 --- a/pcbnew/class_module.cpp +++ b/pcbnew/class_module.cpp @@ -1170,6 +1170,7 @@ bool MODULE::HitTest( const wxPoint& refPos ) if( m_BoundaryBox.Inside( spot_cX, spot_cY ) ) return true; +/* no // The GENERAL_COLLECTOR needs these two tests in order to find a MODULE // when the user clicks on its text. Keep these 2, needed in OnRightClick(). if( m_Reference->HitTest( refPos ) ) @@ -1177,7 +1178,7 @@ bool MODULE::HitTest( const wxPoint& refPos ) if( m_Value->HitTest( refPos ) ) return true; - +*/ return false; } diff --git a/pcbnew/collectors.cpp b/pcbnew/collectors.cpp index cfce74ec7b..01444236c9 100644 --- a/pcbnew/collectors.cpp +++ b/pcbnew/collectors.cpp @@ -22,8 +22,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -#if defined(DEBUG) - #include "collectors.h" #include "pcbnew.h" // class BOARD @@ -60,6 +58,26 @@ const KICAD_T GENERAL_COLLECTOR::PrimaryItems[] = { }; +const KICAD_T GENERAL_COLLECTOR::ModuleItems[] = { + TYPEMODULE, + EOT +}; + + +const KICAD_T GENERAL_COLLECTOR::PadsOrModules[] = { + TYPEPAD, + TYPEMODULE, + EOT +}; + + +const KICAD_T GENERAL_COLLECTOR::Tracks[] = { + TYPETRACK, + TYPEVIA, + EOT +}; + + /** * Function Inspect * is the examining function within the INSPECTOR which is passed to the @@ -77,7 +95,7 @@ SEARCH_RESULT GENERAL_COLLECTOR::Inspect( EDA_BaseStruct* testItem, const void* BOARD_ITEM* item = (BOARD_ITEM*) testItem; MODULE* module = NULL; -#if 1 // debugging +#if 0 // debugging static int breakhere = 0; switch( item->Type() ) { @@ -258,6 +276,9 @@ void GENERAL_COLLECTOR::Collect( BOARD_ITEM* aItem, const KICAD_T aScanList[], m_ScanTypes); SetTimeNow(); // when snapshot was taken + + // record the length of the primary list before concatonating on to it. + m_PrimaryLength = m_List.size(); // append 2nd list onto end of the first list for( unsigned i=0; iType() ) + { + case PCB_EQUIPOT_STRUCT_TYPE: + text << _("Net") << ((EQUIPOT*)item)->m_Netname << wxT(" ") << ((EQUIPOT*)item)->m_NetCode; + break; + + case TYPEMODULE: + text << _("Footprint") << wxT(" ") << ((MODULE*)item)->GetReference(); + break; + + case TYPEPAD: + text << _("Pad") << wxT(" ") << ((D_PAD*)item)->ReturnStringPadName() << _(" of ") << GetParent()->MenuText(); + break; + + case TYPEDRAWSEGMENT: + text << _("PGraphic"); + break; + + case TYPETEXTE: + text << _("Pcb Text") << wxT(" ");; + if( ((TEXTE_PCB*)item)->m_Text.Len() < 12 ) + text << ((TEXTE_PCB*)item)->m_Text; + else + text += ((TEXTE_PCB*)item)->m_Text.Left( 10 ) + wxT( ".." ); + break; + + case TYPETEXTEMODULE: + switch( ((TEXTE_MODULE*)item)->m_Type ) + { + case TEXT_is_REFERENCE: + text << _( "Reference" ) << wxT( " " ) << ((TEXTE_MODULE*)item)->m_Text; + break; + + case TEXT_is_VALUE: + text << _( "Value" ) << wxT( " " ) << ((TEXTE_MODULE*)item)->m_Text << _(" of ") << GetParent()->MenuText(); + break; + + default: + text << _( "Text" ) << wxT( " " ) << ((TEXTE_MODULE*)item)->m_Text << _(" of ") << GetParent()->MenuText(); + break; + } + break; + + case TYPEEDGEMODULE: + text << _("MGraphic"); // @todo: expand on the text + break; + + case TYPETRACK: + text << _("Track"); // @todo: expand on the text + break; + + case TYPEZONE: + text << _("Zone"); // @todo: expand on the text + break; + + case TYPEVIA: + text << _("Via"); // @todo: expand on text + break; + + case TYPEMARQUEUR: + text << _("Marker"); + break; + + case TYPECOTATION: + text << _("Dimension"); // @todo: extend text + break; + + case TYPEMIRE: + text << _("Mire"); // @todo: extend text, Mire is not an english word! + break; + + case TYPEEDGEZONE: + text << _("Graphic"); // @todo: extend text + break; + + default: + text << item->ReturnClassName() << wxT(" BUG!!"); + break; + } + + return text; +} + + +// @todo: move this to proper source file. +const char** BOARD_ITEM::MenuIcon() const +{ + char** xpm; + const BOARD_ITEM* item = this; + + switch( item->Type() ) + { + case PCB_EQUIPOT_STRUCT_TYPE: + xpm = module_xpm; // @todo: use net icon + break; + + case TYPEMODULE: + xpm = module_xpm; + break; + + case TYPEPAD: + xpm = pad_xpm; + break; + + case TYPEDRAWSEGMENT: + xpm = module_xpm; // @todo: use draw segment icon & expand on text + break; + + case TYPETEXTE: + xpm = add_text_xpm; + break; + + case TYPETEXTEMODULE: + xpm = footprint_text_xpm; + break; + + case TYPEEDGEMODULE: + xpm = show_mod_edge_xpm; + break; + + case TYPETRACK: + xpm = showtrack_xpm; + break; + + case TYPEZONE: + xpm = add_zone_xpm; + break; + + case TYPEVIA: + xpm = showtrack_xpm; // @todo: use via specific xpm + break; + + case TYPEMARQUEUR: + xpm = pad_xpm; // @todo: create and use marker xpm + break; + + case TYPECOTATION: + xpm = add_cotation_xpm; + break; + + case TYPEMIRE: + xpm = add_mires_xpm; + break; + + case TYPEEDGEZONE: + xpm = show_mod_edge_xpm; // @todo: pcb edge xpm + break; + + default: + xpm = 0; + break; + } + + return (const char**) xpm; +} + + + /***********************************************************************/ BOARD_ITEM* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay() /***********************************************************************/ - -/* Search an item under the mouse cursor. - * items are searched first on the current working layer. - * if nothing found, an item will be searched without layer restriction - */ { - BOARD_ITEM* item; + BOARD_ITEM* item; -#if defined(DEBUG) - - // test scaffolding for Collect(): GENERAL_COLLECTORS_GUIDE guide = GetCollectorsGuide(); - - m_Collector->Collect( m_Pcb, - GetScreen()->RefPos(true), - &guide ); - // use only the first one collected for now. - item = (*m_Collector)[0]; // grab first one, may be NULL + // Assign to scanList the proper item types desired based on tool type. + // May need to pass a hot key code to this function to support hot keys too. - std::cout << "collected " << m_Collector->GetCount() << '\n'; // debugging only + const KICAD_T* scanList; - if( item ) + if( m_ID_current_state == 0 ) { - item->Display_Infos( this ); - - // debugging: print out the collected items, showing their priority order too. - for( unsigned i=0; iGetCount(); ++i ) - (*m_Collector)[i]->Show( 0, std::cout ); + switch( m_HTOOL_current_state ) + { + case ID_TOOLBARH_PCB_AUTOPLACE: + scanList = GENERAL_COLLECTOR::ModuleItems; + break; + + default: + scanList = GENERAL_COLLECTOR::AllBoardItems; + break; + } } + else + { + switch( m_ID_current_state ) + { + case ID_PCB_SHOW_1_RATSNEST_BUTT: + scanList = GENERAL_COLLECTOR::PadsOrModules; + break; + + case ID_TRACK_BUTT: + scanList = GENERAL_COLLECTOR::Tracks; + break; + + case ID_COMPONENT_BUTT: + scanList = GENERAL_COLLECTOR::ModuleItems; + break; + + default: + scanList = GENERAL_COLLECTOR::AllBoardItems; + } + } + + m_Collector->Collect( m_Pcb, scanList, GetScreen()->RefPos(true), guide ); + + /* debugging: print out the collected items, showing their priority order too. + for( unsigned i=0; iGetCount(); ++i ) + (*m_Collector)[i]->Show( 0, std::cout ); + */ + + if( m_Collector->GetCount() <= 1 ) + { + item = (*m_Collector)[0]; + SetCurItem( item ); + } + + // If the first item is a pad or moduletext, and the 2nd item is its parent module: + else if( m_Collector->GetCount() == 2 && + ( (*m_Collector)[0]->Type() == TYPEPAD || (*m_Collector)[0]->Type() == TYPETEXTEMODULE) && + (*m_Collector)[1]->Type() == TYPEMODULE && (*m_Collector)[0]->GetParent()==(*m_Collector)[1] ) + { + item = (*m_Collector)[0]; + SetCurItem( item ); + } + else // show a popup menu + { + wxMenu itemMenu; + + int limit = MIN( MAX_ITEMS_IN_PICKER, m_Collector->GetCount() ); + + itemMenu.SetTitle( _("Selection Clarification") ); // does this work? not under Linux! + + for( int i=0; iMenuText(); + xpm = item->MenuIcon(); + + ADD_MENUITEM( &itemMenu, ID_POPUP_PCB_ITEM_SELECTION_START+i, text, xpm ); + } + + DrawPanel->m_IgnoreMouseEvents = TRUE; + + // this menu's handler is void WinEDA_BasePcbFrame::ProcessItemSelection() + // and it calls SetCurItem() which in turn calls Display_Infos() on the item. + PopupMenu( &itemMenu ); + + DrawPanel->MouseToCursorSchema(); + + DrawPanel->m_IgnoreMouseEvents = FALSE; + + // The function ProcessItemSelection() has set the current item, return it. + item = GetCurItem(); + } + return item; -#else +/* old way: item = Locate( CURSEUR_OFF_GRILLE, GetScreen()->m_Active_Layer ); if( item == NULL ) item = Locate( CURSEUR_OFF_GRILLE, -1 ); return item; -#endif +*/ } diff --git a/pcbnew/cotation.cpp b/pcbnew/cotation.cpp index daf92a85f7..9a022e64cf 100644 --- a/pcbnew/cotation.cpp +++ b/pcbnew/cotation.cpp @@ -219,7 +219,7 @@ static void Exit_EditCotation( WinEDA_DrawPanel* Panel, wxDC* DC ) status_cotation = 0; Panel->ManageCurseur = NULL; Panel->ForceCloseManageCurseur = NULL; - Panel->GetScreen()->SetCurItem( NULL ); + ((WinEDA_PcbFrame*)Panel->m_Parent)->SetCurItem(NULL); } diff --git a/pcbnew/deltrack.cpp b/pcbnew/deltrack.cpp index 5ee619a815..1c38113eea 100644 --- a/pcbnew/deltrack.cpp +++ b/pcbnew/deltrack.cpp @@ -96,7 +96,7 @@ TRACK* WinEDA_PcbFrame::Delete_Segment( wxDC* DC, TRACK* Track ) Hight_Light( DC ); g_CurrentTrackSegment = NULL; g_FirstTrackSegment = NULL; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); return NULL; } else diff --git a/pcbnew/dialog_edit_module.cpp b/pcbnew/dialog_edit_module.cpp index e1e2625d6a..70b60cc1d1 100644 --- a/pcbnew/dialog_edit_module.cpp +++ b/pcbnew/dialog_edit_module.cpp @@ -622,7 +622,7 @@ void WinEDA_ModulePropertiesFrame::ExchangeModule( wxCommandEvent& event ) m_DC, wxPoint( -1, -1 ) ); // Attention: si il y a eu echange, m_CurrentModule a été delete! - m_Parent->GetScreen()->SetCurItem( NULL ); + m_Parent->SetCurItem( NULL ); Close( TRUE ); } diff --git a/pcbnew/edgemod.cpp b/pcbnew/edgemod.cpp index edec02fbaa..c0849707f6 100644 --- a/pcbnew/edgemod.cpp +++ b/pcbnew/edgemod.cpp @@ -48,7 +48,7 @@ void WinEDA_ModuleEditFrame::Start_Move_EdgeMod( EDGE_MODULE* Edge, wxDC* DC ) CursorInitialPosition = GetScreen()->m_Curseur; DrawPanel->ManageCurseur = Move_Segment; DrawPanel->ForceCloseManageCurseur = Exit_EditEdge_Module; - GetScreen()->SetCurItem( Edge ); + SetCurItem( Edge ); DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); } @@ -77,7 +77,7 @@ void WinEDA_ModuleEditFrame::Place_EdgeMod( EDGE_MODULE* Edge, wxDC* DC ) Edge->m_Flags = 0; DrawPanel->ManageCurseur = NULL; DrawPanel->ForceCloseManageCurseur = NULL; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); GetScreen()->SetModify(); MODULE* Module = (MODULE*) Edge->m_Parent; Module->Set_Rectangle_Encadrement(); diff --git a/pcbnew/edit.cpp b/pcbnew/edit.cpp index becc74ea9b..09e894d361 100644 --- a/pcbnew/edit.cpp +++ b/pcbnew/edit.cpp @@ -15,8 +15,6 @@ #include "eda_dde.h" -#define CURRENT_ITEM (GetScreen()->GetCurItem()) - static void Process_Move_Item( WinEDA_PcbFrame* frame, EDA_BaseStruct* DrawStruct, wxDC* DC ); @@ -29,7 +27,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) * quand un outil est deja selectionn� */ { - EDA_BaseStruct* DrawStruct = CURRENT_ITEM; + BOARD_ITEM* DrawStruct = GetCurItem(); DrawPanel->m_IgnoreMouseEvents = TRUE; DrawPanel->CursorOff( DC ); @@ -128,8 +126,12 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) break; case ID_PCB_SHOW_1_RATSNEST_BUTT: +#if 0 DrawStruct = m_Pcb->FindPadOrModule( GetScreen()->RefPos(true), GetScreen()->m_Active_Layer ); +#else + DrawStruct = PcbGeneralLocateAndDisplay(); +#endif Show_1_Ratsnest( DrawStruct, DC ); if( DrawStruct ) @@ -139,7 +141,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) case ID_PCB_MIRE_BUTT: if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) { - GetScreen()->SetCurItem( Create_Mire( DC ) ); + SetCurItem( Create_Mire( DC ) ); DrawPanel->MouseToCursorSchema(); } else if( DrawStruct->Type() == TYPEMIRE ) @@ -168,7 +170,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) { DrawStruct = Begin_DrawSegment( NULL, shape, DC ); - GetScreen()->SetCurItem( DrawStruct ); + SetCurItem( DrawStruct ); DrawPanel->m_AutoPAN_Request = TRUE; } else if( DrawStruct @@ -176,7 +178,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) && (DrawStruct->m_Flags & IS_NEW) ) { DrawStruct = Begin_DrawSegment( (DRAWSEGMENT*) DrawStruct, shape, DC ); - GetScreen()->SetCurItem( DrawStruct ); + SetCurItem( DrawStruct ); DrawPanel->m_AutoPAN_Request = TRUE; } break; @@ -192,7 +194,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) { DrawStruct = Begin_Route( NULL, DC ); - GetScreen()->SetCurItem( DrawStruct ); + SetCurItem( DrawStruct ); if( DrawStruct ) DrawPanel->m_AutoPAN_Request = TRUE; } @@ -203,7 +205,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) { TRACK* track = Begin_Route( (TRACK*) DrawStruct, DC ); if( track ) // c'est a dire si OK - GetScreen()->SetCurItem( DrawStruct = track ); + SetCurItem( DrawStruct = track ); DrawPanel->m_AutoPAN_Request = TRUE; } break; @@ -212,13 +214,13 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) case ID_PCB_ZONES_BUTT: if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) { - GetScreen()->SetCurItem( DrawStruct = Begin_Zone() ); + SetCurItem( DrawStruct = Begin_Zone() ); } else if( DrawStruct && (DrawStruct->Type() == TYPEEDGEZONE) && (DrawStruct->m_Flags & IS_NEW) ) { - GetScreen()->SetCurItem( DrawStruct = Begin_Zone() ); + SetCurItem( DrawStruct = Begin_Zone() ); } else DisplayError( this, wxT( "Edit: zone internal error" ) ); @@ -227,7 +229,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) case ID_TEXT_COMMENT_BUTT: if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) { - GetScreen()->SetCurItem( Create_Texte_Pcb( DC ) ); + SetCurItem( Create_Texte_Pcb( DC ) ); DrawPanel->MouseToCursorSchema(); DrawPanel->m_AutoPAN_Request = TRUE; } @@ -245,7 +247,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) { DrawPanel->MouseToCursorSchema(); DrawStruct = Load_Module_From_Library( wxEmptyString, DC ); - GetScreen()->SetCurItem( DrawStruct ); + SetCurItem( DrawStruct ); if( DrawStruct ) StartMove_Module( (MODULE*) DrawStruct, DC ); } @@ -267,7 +269,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) { DrawStruct = Begin_Cotation( NULL, DC ); - GetScreen()->SetCurItem( DrawStruct ); + SetCurItem( DrawStruct ); DrawPanel->m_AutoPAN_Request = TRUE; } else if( DrawStruct @@ -275,7 +277,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) && (DrawStruct->m_Flags & IS_NEW) ) { DrawStruct = Begin_Cotation( (COTATION*) DrawStruct, DC ); - GetScreen()->SetCurItem( DrawStruct ); + SetCurItem( DrawStruct ); DrawPanel->m_AutoPAN_Request = TRUE; } else @@ -289,7 +291,7 @@ void WinEDA_PcbFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) if( DrawStruct && (DrawStruct->m_Flags == 0) ) { RemoveStruct( DrawStruct, DC ); - GetScreen()->SetCurItem( DrawStruct = NULL ); + SetCurItem( DrawStruct = NULL ); } } break; @@ -632,25 +634,25 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_PCB_EDIT_TRACK: - if( CURRENT_ITEM == NULL ) + if( GetCurItem() == NULL ) break; - Edit_Track_Width( &dc, (TRACK*) CURRENT_ITEM ); + Edit_Track_Width( &dc, (TRACK*) GetCurItem() ); DrawPanel->MouseToCursorSchema(); GetScreen()->SetModify(); break; case ID_POPUP_PCB_EDIT_TRACKSEG: - if( CURRENT_ITEM == NULL ) + if( GetCurItem() == NULL ) break; - Edit_TrackSegm_Width( &dc, (TRACK*) CURRENT_ITEM ); + Edit_TrackSegm_Width( &dc, (TRACK*) GetCurItem() ); DrawPanel->MouseToCursorSchema(); GetScreen()->SetModify(); break; case ID_POPUP_PCB_EDIT_NET: - if( CURRENT_ITEM == NULL ) + if( GetCurItem() == NULL ) break; - Edit_Net_Width( &dc, ( (TRACK*) CURRENT_ITEM )->m_NetCode ); + Edit_Net_Width( &dc, ( (TRACK*) GetCurItem() )->m_NetCode ); DrawPanel->MouseToCursorSchema(); GetScreen()->SetModify(); break; @@ -658,7 +660,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_EDIT_ALL_VIAS_AND_TRACK_SIZE: case ID_POPUP_PCB_EDIT_ALL_VIAS_SIZE: case ID_POPUP_PCB_EDIT_ALL_TRACK_SIZE: - if( CURRENT_ITEM == NULL ) + if( GetCurItem() == NULL ) break; { bool resize_vias = TRUE, resize_track = TRUE; @@ -674,77 +676,77 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_END_TRACK: DrawPanel->MouseToCursorSchema(); - End_Route( (TRACK*) CURRENT_ITEM, &dc ); + End_Route( (TRACK*) GetCurItem(), &dc ); break; case ID_POPUP_PCB_PLACE_MOVED_TRACK_NODE: DrawPanel->MouseToCursorSchema(); - if( CURRENT_ITEM->m_Flags & IS_DRAGGED ) + if( GetCurItem()->m_Flags & IS_DRAGGED ) { - PlaceDraggedTrackSegment( (TRACK*) CURRENT_ITEM, &dc ); + PlaceDraggedTrackSegment( (TRACK*) GetCurItem(), &dc ); } break; case ID_POPUP_PCB_PLACE_VIA: DrawPanel->MouseToCursorSchema(); - if( CURRENT_ITEM->m_Flags & IS_DRAGGED ) + if( GetCurItem()->m_Flags & IS_DRAGGED ) { - PlaceDraggedTrackSegment( (TRACK*) CURRENT_ITEM, &dc ); + PlaceDraggedTrackSegment( (TRACK*) GetCurItem(), &dc ); } else { - Other_Layer_Route( (TRACK*) CURRENT_ITEM, &dc ); + Other_Layer_Route( (TRACK*) GetCurItem(), &dc ); if( DisplayOpt.ContrastModeDisplay ) GetScreen()->SetRefreshReq(); } break; case ID_POPUP_PCB_DELETE_TRACKSEG: - if( CURRENT_ITEM == NULL ) + if( GetCurItem() == NULL ) break; DrawPanel->MouseToCursorSchema(); - GetScreen()->SetCurItem( Delete_Segment( &dc, (TRACK*) CURRENT_ITEM ) ); + SetCurItem( Delete_Segment( &dc, (TRACK*) GetCurItem() ) ); GetScreen()->SetModify(); break; case ID_POPUP_PCB_DELETE_TRACK: - if( CURRENT_ITEM == NULL ) + if( GetCurItem() == NULL ) break; DrawPanel->MouseToCursorSchema(); - Delete_Track( &dc, (TRACK*) CURRENT_ITEM ); - GetScreen()->SetCurItem( NULL ); + Delete_Track( &dc, (TRACK*) GetCurItem() ); + SetCurItem( NULL ); GetScreen()->SetModify(); break; case ID_POPUP_PCB_DELETE_TRACKNET: DrawPanel->MouseToCursorSchema(); - Delete_net( &dc, (TRACK*) CURRENT_ITEM ); - GetScreen()->SetCurItem( NULL ); + Delete_net( &dc, (TRACK*) GetCurItem() ); + SetCurItem( NULL ); GetScreen()->SetModify(); break; case ID_POPUP_PCB_LOCK_ON_TRACKSEG: - Attribut_Segment( (TRACK*) CURRENT_ITEM, &dc, TRUE ); + Attribut_Segment( (TRACK*) GetCurItem(), &dc, TRUE ); break; case ID_POPUP_PCB_LOCK_OFF_TRACKSEG: - Attribut_Segment( (TRACK*) CURRENT_ITEM, &dc, FALSE ); + Attribut_Segment( (TRACK*) GetCurItem(), &dc, FALSE ); break; case ID_POPUP_PCB_LOCK_ON_TRACK: - Attribut_Track( (TRACK*) CURRENT_ITEM, &dc, TRUE ); + Attribut_Track( (TRACK*) GetCurItem(), &dc, TRUE ); break; case ID_POPUP_PCB_LOCK_OFF_TRACK: - Attribut_Track( (TRACK*) CURRENT_ITEM, &dc, FALSE ); + Attribut_Track( (TRACK*) GetCurItem(), &dc, FALSE ); break; case ID_POPUP_PCB_LOCK_ON_NET: - Attribut_net( &dc, ( (TRACK*) CURRENT_ITEM )->m_NetCode, TRUE ); + Attribut_net( &dc, ( (TRACK*) GetCurItem() )->m_NetCode, TRUE ); break; case ID_POPUP_PCB_LOCK_OFF_NET: - Attribut_net( &dc, ( (TRACK*) CURRENT_ITEM )->m_NetCode, FALSE ); + Attribut_net( &dc, ( (TRACK*) GetCurItem() )->m_NetCode, FALSE ); break; case ID_POPUP_PCB_SETFLAGS_TRACK_MNU: @@ -752,17 +754,17 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_DELETE_ZONE: DrawPanel->MouseToCursorSchema(); - if( CURRENT_ITEM == NULL ) + if( GetCurItem() == NULL ) break; - Delete_Zone( &dc, (SEGZONE*) CURRENT_ITEM ); - GetScreen()->SetCurItem( NULL ); + Delete_Zone( &dc, (SEGZONE*) GetCurItem() ); + SetCurItem( NULL ); break; case ID_POPUP_PCB_EDIT_ZONE: DrawPanel->MouseToCursorSchema(); - if( CURRENT_ITEM == NULL ) + if( GetCurItem() == NULL ) break; - Edit_Zone_Width( &dc, (SEGZONE*) CURRENT_ITEM ); + Edit_Zone_Width( &dc, (SEGZONE*) GetCurItem() ); break; case ID_POPUP_PCB_DELETE_ZONE_LIMIT: @@ -775,7 +777,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST: - Process_Move_Item( this, CURRENT_ITEM, &dc ); + Process_Move_Item( this, GetCurItem(), &dc ); DrawPanel->m_AutoPAN_Request = TRUE; break; @@ -785,23 +787,23 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_MOVE_MODULE_REQUEST: // If the current Item is a pad, text module ...: Get the parent - if( CURRENT_ITEM->Type() != TYPEMODULE ) - GetScreen()->SetCurItem( CURRENT_ITEM->m_Parent ); - if( !CURRENT_ITEM || CURRENT_ITEM->Type() != TYPEMODULE ) + if( GetCurItem()->Type() != TYPEMODULE ) + SetCurItem( GetCurItem()->GetParent() ); + if( !GetCurItem() || GetCurItem()->Type() != TYPEMODULE ) { g_Drag_Pistes_On = FALSE; break; } DrawPanel->MouseToCursorSchema(); - StartMove_Module( (MODULE*) CURRENT_ITEM, &dc ); + StartMove_Module( (MODULE*) GetCurItem(), &dc ); break; case ID_POPUP_PCB_GET_AND_MOVE_MODULE_REQUEST: /* get module by name and move it */ - GetScreen()->SetCurItem( GetModuleByName() ); - if( CURRENT_ITEM ) + SetCurItem( GetModuleByName() ); + if( GetCurItem() ) { DrawPanel->MouseToCursorSchema(); - StartMove_Module( (MODULE*) CURRENT_ITEM, &dc ); + StartMove_Module( (MODULE*) GetCurItem(), &dc ); } break; @@ -809,14 +811,14 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) DrawPanel->MouseToCursorSchema(); // If the current Item is a pad, text module ...: Get the parent - if( CURRENT_ITEM->Type() != TYPEMODULE ) - GetScreen()->SetCurItem( CURRENT_ITEM->m_Parent ); + if( GetCurItem()->Type() != TYPEMODULE ) + SetCurItem( GetCurItem()->GetParent() ); - if( !CURRENT_ITEM || CURRENT_ITEM->Type() != TYPEMODULE ) + if( !GetCurItem() || GetCurItem()->Type() != TYPEMODULE ) break; - if( Delete_Module( (MODULE*) CURRENT_ITEM, &dc ) ) + if( Delete_Module( (MODULE*) GetCurItem(), &dc ) ) { - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); } break; @@ -824,44 +826,44 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) DrawPanel->MouseToCursorSchema(); // If the current Item is a pad, text module ...: Get the parent - if( CURRENT_ITEM->Type() != TYPEMODULE ) - GetScreen()->SetCurItem( CURRENT_ITEM->m_Parent ); + if( GetCurItem()->Type() != TYPEMODULE ) + SetCurItem( GetCurItem()->GetParent() ); - if( !CURRENT_ITEM || CURRENT_ITEM->Type() != TYPEMODULE ) + if( !GetCurItem() || GetCurItem()->Type() != TYPEMODULE ) break; - Rotate_Module( &dc, (MODULE*) CURRENT_ITEM, -900, TRUE ); + Rotate_Module( &dc, (MODULE*) GetCurItem(), -900, TRUE ); break; case ID_POPUP_PCB_ROTATE_MODULE_CLOCKWISE: DrawPanel->MouseToCursorSchema(); // If the current Item is a pad, text module ...: Get the parent - if( CURRENT_ITEM->Type() != TYPEMODULE ) - GetScreen()->SetCurItem( CURRENT_ITEM->m_Parent ); + if( GetCurItem()->Type() != TYPEMODULE ) + SetCurItem( GetCurItem()->GetParent() ); - if( !CURRENT_ITEM || CURRENT_ITEM->Type() != TYPEMODULE ) + if( !GetCurItem() || GetCurItem()->Type() != TYPEMODULE ) break; - Rotate_Module( &dc, (MODULE*) CURRENT_ITEM, 900, TRUE ); + Rotate_Module( &dc, (MODULE*) GetCurItem(), 900, TRUE ); break; case ID_POPUP_PCB_CHANGE_SIDE_MODULE: DrawPanel->MouseToCursorSchema(); // If the current Item is a pad, text module ...: Get the parent - if( CURRENT_ITEM->Type() != TYPEMODULE ) - GetScreen()->SetCurItem( CURRENT_ITEM->m_Parent ); - if( !CURRENT_ITEM || CURRENT_ITEM->Type() != TYPEMODULE ) + if( GetCurItem()->Type() != TYPEMODULE ) + SetCurItem( GetCurItem()->GetParent() ); + if( !GetCurItem() || GetCurItem()->Type() != TYPEMODULE ) break; - Change_Side_Module( (MODULE*) CURRENT_ITEM, &dc ); + Change_Side_Module( (MODULE*) GetCurItem(), &dc ); break; case ID_POPUP_PCB_EDIT_MODULE: // If the current Item is a pad, text module ...: Get the parent - if( CURRENT_ITEM->Type() != TYPEMODULE ) - GetScreen()->SetCurItem( CURRENT_ITEM->m_Parent ); - if( !CURRENT_ITEM || CURRENT_ITEM->Type() != TYPEMODULE ) + if( GetCurItem()->Type() != TYPEMODULE ) + SetCurItem( GetCurItem()->GetParent() ); + if( !GetCurItem() || GetCurItem()->Type() != TYPEMODULE ) break; - InstallModuleOptionsFrame( (MODULE*) CURRENT_ITEM, &dc, pos ); + InstallModuleOptionsFrame( (MODULE*) GetCurItem(), &dc, pos ); DrawPanel->MouseToCursorSchema(); break; @@ -870,54 +872,54 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_MOVE_PAD_REQUEST: DrawPanel->MouseToCursorSchema(); - StartMovePad( (D_PAD*) CURRENT_ITEM, &dc ); + StartMovePad( (D_PAD*) GetCurItem(), &dc ); break; case ID_POPUP_PCB_EDIT_PAD: - InstallPadOptionsFrame( (D_PAD*) CURRENT_ITEM, &dc, pos ); + InstallPadOptionsFrame( (D_PAD*) GetCurItem(), &dc, pos ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_IMPORT_PAD_SETTINGS: DrawPanel->MouseToCursorSchema(); - Import_Pad_Settings( (D_PAD*) CURRENT_ITEM, &dc ); + Import_Pad_Settings( (D_PAD*) GetCurItem(), &dc ); break; case ID_POPUP_PCB_GLOBAL_IMPORT_PAD_SETTINGS: DrawPanel->MouseToCursorSchema(); - Global_Import_Pad_Settings( (D_PAD*) CURRENT_ITEM, &dc ); + Global_Import_Pad_Settings( (D_PAD*) GetCurItem(), &dc ); break; case ID_POPUP_PCB_EXPORT_PAD_SETTINGS: DrawPanel->MouseToCursorSchema(); - Export_Pad_Settings( (D_PAD*) CURRENT_ITEM ); + Export_Pad_Settings( (D_PAD*) GetCurItem() ); break; case ID_POPUP_PCB_DELETE_PAD: - DeletePad( (D_PAD*) CURRENT_ITEM, &dc ); - GetScreen()->SetCurItem( NULL ); + DeletePad( (D_PAD*) GetCurItem(), &dc ); + SetCurItem( NULL ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_EDIT_TEXTMODULE: - InstallTextModOptionsFrame( (TEXTE_MODULE*) CURRENT_ITEM, &dc, pos ); + InstallTextModOptionsFrame( (TEXTE_MODULE*) GetCurItem(), &dc, pos ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_MOVE_TEXTMODULE_REQUEST: DrawPanel->MouseToCursorSchema(); - StartMoveTexteModule( (TEXTE_MODULE*) CURRENT_ITEM, &dc ); + StartMoveTexteModule( (TEXTE_MODULE*) GetCurItem(), &dc ); break; case ID_POPUP_PCB_ROTATE_TEXTMODULE: - RotateTextModule( (TEXTE_MODULE*) CURRENT_ITEM, + RotateTextModule( (TEXTE_MODULE*) GetCurItem(), &dc ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_DELETE_TEXTMODULE: - DeleteTextModule( (TEXTE_MODULE*) CURRENT_ITEM, &dc ); - GetScreen()->SetCurItem( NULL ); + DeleteTextModule( (TEXTE_MODULE*) GetCurItem(), &dc ); + SetCurItem( NULL ); DrawPanel->MouseToCursorSchema(); break; @@ -958,93 +960,93 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_PCB_EDIT_TEXTEPCB: - InstallTextPCBOptionsFrame( (TEXTE_PCB*) CURRENT_ITEM, + InstallTextPCBOptionsFrame( (TEXTE_PCB*) GetCurItem(), &dc, pos ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_ROTATE_TEXTEPCB: - Rotate_Texte_Pcb( (TEXTE_PCB*) CURRENT_ITEM, &dc ); + Rotate_Texte_Pcb( (TEXTE_PCB*) GetCurItem(), &dc ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_DELETE_TEXTEPCB: - Delete_Texte_Pcb( (TEXTE_PCB*) CURRENT_ITEM, &dc ); + Delete_Texte_Pcb( (TEXTE_PCB*) GetCurItem(), &dc ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_MOVE_MIRE_REQUEST: - StartMove_Mire( (MIREPCB*) CURRENT_ITEM, &dc ); + StartMove_Mire( (MIREPCB*) GetCurItem(), &dc ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_EDIT_MIRE: - InstallMireOptionsFrame( (MIREPCB*) CURRENT_ITEM, &dc, pos ); + InstallMireOptionsFrame( (MIREPCB*) GetCurItem(), &dc, pos ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_DELETE_MIRE: DrawPanel->MouseToCursorSchema(); - Delete_Mire( (MIREPCB*) CURRENT_ITEM, &dc ); - GetScreen()->SetCurItem( NULL ); + Delete_Mire( (MIREPCB*) GetCurItem(), &dc ); + SetCurItem( NULL ); break; case ID_POPUP_PCB_DELETE_COTATION: DrawPanel->MouseToCursorSchema(); - Delete_Cotation( (COTATION*) CURRENT_ITEM, &dc ); - GetScreen()->SetCurItem( NULL ); + Delete_Cotation( (COTATION*) GetCurItem(), &dc ); + SetCurItem( NULL ); break; case ID_POPUP_PCB_EDIT_COTATION: - Install_Edit_Cotation( (COTATION*) CURRENT_ITEM, &dc, pos ); + Install_Edit_Cotation( (COTATION*) GetCurItem(), &dc, pos ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_DELETE_DRAWING: - Delete_Segment_Edge( (DRAWSEGMENT*) CURRENT_ITEM, &dc ); + Delete_Segment_Edge( (DRAWSEGMENT*) GetCurItem(), &dc ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_DELETE_DRAWING_LAYER: - Delete_Drawings_All_Layer( (DRAWSEGMENT*) CURRENT_ITEM, &dc ); - GetScreen()->SetCurItem( NULL ); + Delete_Drawings_All_Layer( (DRAWSEGMENT*) GetCurItem(), &dc ); + SetCurItem( NULL ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_EDIT_DRAWING: - Drawing_SetNewWidth( (DRAWSEGMENT*) CURRENT_ITEM, &dc ); + Drawing_SetNewWidth( (DRAWSEGMENT*) GetCurItem(), &dc ); DrawPanel->MouseToCursorSchema(); break; case ID_POPUP_PCB_MOVE_DRAWING_REQUEST: DrawPanel->MouseToCursorSchema(); - Start_Move_DrawItem( (DRAWSEGMENT*) CURRENT_ITEM, &dc ); + Start_Move_DrawItem( (DRAWSEGMENT*) GetCurItem(), &dc ); break; case ID_POPUP_PCB_STOP_CURRENT_DRAWING: DrawPanel->MouseToCursorSchema(); - if( CURRENT_ITEM && (CURRENT_ITEM->m_Flags & IS_NEW) ) + if( GetCurItem() && (GetCurItem()->m_Flags & IS_NEW) ) { - End_Edge( (DRAWSEGMENT*) CURRENT_ITEM, &dc ); - GetScreen()->SetCurItem( NULL ); + End_Edge( (DRAWSEGMENT*) GetCurItem(), &dc ); + SetCurItem( NULL ); } break; case ID_POPUP_PCB_STOP_CURRENT_EDGE_ZONE: DrawPanel->MouseToCursorSchema(); - if( CURRENT_ITEM && (CURRENT_ITEM->m_Flags & IS_NEW) ) + if( GetCurItem() && (GetCurItem()->m_Flags & IS_NEW) ) { End_Zone( &dc ); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); } break; case ID_POPUP_PCB_DELETE_EDGE_ZONE: DrawPanel->MouseToCursorSchema(); - if( CURRENT_ITEM && (CURRENT_ITEM->m_Flags & IS_NEW) ) + if( GetCurItem() && (GetCurItem()->m_Flags & IS_NEW) ) { - GetScreen()->SetCurItem( Del_SegmEdgeZone( &dc, - (EDGE_ZONE*) CURRENT_ITEM ) ); + SetCurItem( Del_SegmEdgeZone( &dc, + (EDGE_ZONE*) GetCurItem() ) ); } break; @@ -1235,7 +1237,7 @@ void WinEDA_PcbFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) * termine la connexion */ { - EDA_BaseStruct* DrawStruct = CURRENT_ITEM; + BOARD_ITEM* DrawStruct = GetCurItem(); wxPoint pos = GetPosition(); wxClientDC dc( DrawPanel ); @@ -1253,7 +1255,7 @@ void WinEDA_PcbFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) break; // Element localis� - GetScreen()->SetCurItem( DrawStruct ); + SetCurItem( DrawStruct ); switch( DrawStruct->Type() ) { @@ -1320,7 +1322,7 @@ void WinEDA_PcbFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) case ID_PCB_ZONES_BUTT: End_Zone( DC ); DrawPanel->m_AutoPAN_Request = FALSE; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); break; case ID_LINE_COMMENT_BUTT: @@ -1338,7 +1340,7 @@ void WinEDA_PcbFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) { End_Edge( (DRAWSEGMENT*) DrawStruct, &dc ); DrawPanel->m_AutoPAN_Request = FALSE; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); } break; } diff --git a/pcbnew/editedge.cpp b/pcbnew/editedge.cpp index 67a6bb0352..16009225b0 100644 --- a/pcbnew/editedge.cpp +++ b/pcbnew/editedge.cpp @@ -36,7 +36,7 @@ void WinEDA_PcbFrame::Start_Move_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC ) drawitem->Display_Infos( this ); DrawPanel->ManageCurseur = Move_Segment; DrawPanel->ForceCloseManageCurseur = Exit_EditEdge; - GetScreen()->SetCurItem( drawitem ); + SetCurItem( drawitem ); DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); } @@ -55,7 +55,7 @@ void WinEDA_PcbFrame::Place_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC ) Trace_DrawSegmentPcb( DrawPanel, DC, drawitem, GR_OR ); DrawPanel->ManageCurseur = NULL; DrawPanel->ForceCloseManageCurseur = NULL; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); GetScreen()->SetModify(); drawitem->m_Flags = 0; } @@ -113,14 +113,14 @@ void WinEDA_PcbFrame::Delete_Segment_Edge( DRAWSEGMENT* Segment, wxDC* DC ) if( PtStruct && (PtStruct->Type() == TYPEDRAWSEGMENT ) ) Segment = (DRAWSEGMENT*) PtStruct; DisplayOpt.DisplayDrawItems = track_fill_copy; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); } else { Trace_DrawSegmentPcb( DrawPanel, DC, (DRAWSEGMENT*) Segment, GR_XOR ); Segment->m_Flags = 0; DeleteStructure( Segment ); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); GetScreen()->SetModify(); } } @@ -248,7 +248,7 @@ static void Exit_EditEdge( WinEDA_DrawPanel* Panel, wxDC* DC ) } Panel->ManageCurseur = NULL; Panel->ForceCloseManageCurseur = NULL; - Panel->GetScreen()->SetCurItem( NULL ); + ((WinEDA_PcbFrame*)Panel->m_Parent)->SetCurItem( NULL ); } @@ -275,7 +275,7 @@ DRAWSEGMENT* WinEDA_PcbFrame::Begin_DrawSegment( DRAWSEGMENT* Segment, if( Segment == NULL ) /* debut reel du trace */ { - GetScreen()->SetCurItem( Segment = new DRAWSEGMENT( m_Pcb ) ); + SetCurItem( Segment = new DRAWSEGMENT( m_Pcb ) ); Segment->m_Flags = IS_NEW; Segment->SetLayer( GetScreen()->m_Active_Layer ); Segment->m_Width = s_large; @@ -305,7 +305,7 @@ DRAWSEGMENT* WinEDA_PcbFrame::Begin_DrawSegment( DRAWSEGMENT* Segment, DrawItem = Segment; - GetScreen()->SetCurItem( Segment = new DRAWSEGMENT( m_Pcb ) ); + SetCurItem( Segment = new DRAWSEGMENT( m_Pcb ) ); Segment->m_Flags = IS_NEW; Segment->SetLayer( DrawItem->GetLayer() ); @@ -353,7 +353,7 @@ void WinEDA_PcbFrame::End_Edge( DRAWSEGMENT* Segment, wxDC* DC ) DrawPanel->ManageCurseur = NULL; DrawPanel->ForceCloseManageCurseur = NULL; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); } diff --git a/pcbnew/editmod.cpp b/pcbnew/editmod.cpp index 98ec5f0e5b..853c2a53a3 100644 --- a/pcbnew/editmod.cpp +++ b/pcbnew/editmod.cpp @@ -50,7 +50,7 @@ void WinEDA_BasePcbFrame::InstallModuleOptionsFrame( MODULE* Module, m_Parent->m_ModuleEditFrame->Load_Module_Module_From_BOARD( (MODULE*) GetScreen()->GetCurItem() ); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); GoToEditor = FALSE; m_Parent->m_ModuleEditFrame->Show( TRUE ); diff --git a/pcbnew/editrack.cpp b/pcbnew/editrack.cpp index b3169d0aa4..4b456c6166 100644 --- a/pcbnew/editrack.cpp +++ b/pcbnew/editrack.cpp @@ -61,7 +61,7 @@ static void Exit_Editrack( WinEDA_DrawPanel* Panel, wxDC* DC ) } Panel->ManageCurseur = NULL; Panel->ForceCloseManageCurseur = NULL; - frame->GetScreen()->SetCurItem( NULL ); + frame->SetCurItem( NULL ); } @@ -156,7 +156,7 @@ TRACK* WinEDA_PcbFrame::Begin_Route( TRACK* track, wxDC* DC ) g_FirstTrackSegment->SetState( BEGIN_ONPAD | END_ONPAD, OFF ); } g_CurrentTrackSegment->Display_Infos( this ); - GetScreen()->SetCurItem( g_CurrentTrackSegment ); + SetCurItem( g_CurrentTrackSegment ); DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); if( Drc_On && (Drc( this, DC, g_CurrentTrackSegment, m_Pcb->m_Track, 1 ) == BAD_DRC) ) { @@ -221,7 +221,7 @@ TRACK* WinEDA_PcbFrame::Begin_Route( TRACK* track, wxDC* DC ) g_CurrentTrackSegment->Display_Infos( this ); } - GetScreen()->SetCurItem( g_CurrentTrackSegment ); + SetCurItem( g_CurrentTrackSegment ); return g_CurrentTrackSegment; } @@ -472,7 +472,7 @@ void WinEDA_PcbFrame::End_Route( TRACK* track, wxDC* DC ) DrawPanel->ManageCurseur = NULL; DrawPanel->ForceCloseManageCurseur = NULL; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); } diff --git a/pcbnew/edtxtmod.cpp b/pcbnew/edtxtmod.cpp index dbfdafbb19..0f06b49a93 100644 --- a/pcbnew/edtxtmod.cpp +++ b/pcbnew/edtxtmod.cpp @@ -171,7 +171,7 @@ void WinEDA_BasePcbFrame::StartMoveTexteModule( TEXTE_MODULE* Text, wxDC* DC ) Text->Display_Infos( this ); - GetScreen()->SetCurItem( Text ); + SetCurItem( Text ); DrawPanel->ManageCurseur = Show_MoveTexte_Module; DrawPanel->ForceCloseManageCurseur = ExitTextModule; diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp index 71236c0a02..be5c056108 100644 --- a/pcbnew/files.cpp +++ b/pcbnew/files.cpp @@ -235,7 +235,7 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, wxDC* DC, boo g_SaveTime = time( NULL ); -#if 1 && defined(DEBUG) +#if 0 && defined(DEBUG) // note this seems to freeze up pcbnew when run under the kicad project // manager. runs fine from command prompt. // output the board object tree to stdout: diff --git a/pcbnew/hotkeys.cpp b/pcbnew/hotkeys.cpp index 8ce8678f5d..b35dfc4e9a 100644 --- a/pcbnew/hotkeys.cpp +++ b/pcbnew/hotkeys.cpp @@ -165,11 +165,9 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, */ { - bool PopupOn = GetScreen()->GetCurItem() - && GetScreen()->GetCurItem()->m_Flags; + bool PopupOn = (GetCurItem() && GetCurItem()->m_Flags); - bool ItemFree = (GetScreen()->GetCurItem() == 0 ) - || (GetScreen()->GetCurItem()->m_Flags == 0); + bool ItemFree = (GetCurItem()==0 || GetCurItem()->m_Flags==0); if( hotkey == 0 ) return; @@ -296,11 +294,15 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, case HK_BACK_SPACE: if( m_ID_current_state == ID_TRACK_BUTT && GetScreen()->m_Active_Layer <= CMP_N ) { - bool ItemFree = (GetScreen()->GetCurItem() == NULL ) - || (GetScreen()->GetCurItem()->m_Flags == 0); + bool ItemFree = GetCurItem()==NULL || GetCurItem()->m_Flags==0; if( ItemFree ) { // 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: use PcbGeneralLocateAndDisplay() everywhere in this source file. + DrawStruct = PcbGeneralLocateAndDisplay(); // don't let backspace delete modules!! @@ -309,10 +311,10 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, Delete_Segment( DC, (TRACK*) DrawStruct ); GetScreen()->SetModify(); } - else if( GetScreen()->GetCurItem()->Type() == TYPETRACK ) + else if( GetCurItem()->Type() == TYPETRACK ) { // then an element is being edited - remove the last segment. - GetScreen()->SetCurItem( Delete_Segment( DC, (TRACK*) GetScreen()->GetCurItem() ) ); + SetCurItem( Delete_Segment( DC, (TRACK*) GetCurItem() ) ); GetScreen()->SetModify(); } } @@ -320,7 +322,7 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, case HK_END_TRACK: DrawPanel->MouseToCursorSchema(); - End_Route( (TRACK*) ( GetScreen()->GetCurItem() ), DC ); + End_Route( (TRACK*) ( GetCurItem() ), DC ); break; case HK_FIND_ITEM: @@ -357,11 +359,11 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, Other_Layer_Route( NULL, DC ); break; } - if( GetScreen()->GetCurItem()->Type() != TYPETRACK ) + if( GetCurItem()->Type() != TYPETRACK ) return; - if( (GetScreen()->GetCurItem()->m_Flags & IS_NEW) == 0 ) + if( (GetCurItem()->m_Flags & IS_NEW) == 0 ) return; - Other_Layer_Route( (TRACK*) GetScreen()->GetCurItem(), DC ); + Other_Layer_Route( (TRACK*) GetCurItem(), DC ); if( DisplayOpt.ContrastModeDisplay ) GetScreen()->SetRefreshReq(); break; @@ -371,11 +373,11 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, // get any module, locked or not locked and toggle its locked status if( ItemFree ) module = Locate_Prefered_Module( m_Pcb, CURSEUR_OFF_GRILLE | VISIBLE_ONLY ); - else if( GetScreen()->GetCurItem()->Type() == TYPEMODULE ) - module = (MODULE*) GetScreen()->GetCurItem(); + else if( GetCurItem()->Type() == TYPEMODULE ) + module = (MODULE*) GetCurItem(); if( module ) { - GetScreen()->SetCurItem( module ); + SetCurItem( module ); module->SetLocked( !module->IsLocked() ); module->Display_Infos( this ); } @@ -415,12 +417,12 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, } } } - else if( GetScreen()->GetCurItem()->Type() == TYPEMODULE ) + else if( GetCurItem()->Type() == TYPEMODULE ) { - module = (MODULE*) GetScreen()->GetCurItem(); + module = (MODULE*) GetCurItem(); // @todo: might need to add a layer check in if() below - if( (GetScreen()->GetCurItem()->m_Flags == 0) + if( (GetCurItem()->m_Flags == 0) && module->IsLocked() ) module = NULL; // do not move, rotate ... it. } @@ -432,13 +434,13 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, * does not set GetCurItem() at this time, nor does a mouse click * when the local ratsnest icon is in play set GetCurItem(), and these * actions also call SendMessageToEESCHEMA(). - * if( GetScreen()->GetCurItem() != module ) + * if( GetCurItem() != module ) */ { // Send the module via socket to EESCHEMA's search facility. SendMessageToEESCHEMA( module ); - GetScreen()->SetCurItem( module ); + SetCurItem( module ); } switch( CommandCode ) @@ -538,8 +540,8 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* DC, EDA_BaseStruct* DrawStruct ) * Delete the module. */ { - bool ItemFree = (GetScreen()->GetCurItem() == NULL ) - || (GetScreen()->GetCurItem()->m_Flags == 0); + bool ItemFree = (GetCurItem() == NULL ) + || (GetCurItem()->m_Flags == 0); switch( m_ID_current_state ) { @@ -553,10 +555,10 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* DC, EDA_BaseStruct* DrawStruct ) return FALSE; Delete_Track( DC, (TRACK*) DrawStruct ); } - else if( GetScreen()->GetCurItem()->Type() == TYPETRACK ) + else if( GetCurItem()->Type() == TYPETRACK ) { - GetScreen()->SetCurItem( - Delete_Segment( DC, (TRACK*) GetScreen()->GetCurItem() ) ); + SetCurItem( + Delete_Segment( DC, (TRACK*) GetCurItem() ) ); GetScreen()->SetModify(); return TRUE; } @@ -581,6 +583,6 @@ bool WinEDA_PcbFrame::OnHotkeyDeleteItem( wxDC* DC, EDA_BaseStruct* DrawStruct ) } GetScreen()->SetModify(); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); return TRUE; } diff --git a/pcbnew/initpcb.cpp b/pcbnew/initpcb.cpp index 7f6e850c48..2f695759ee 100644 --- a/pcbnew/initpcb.cpp +++ b/pcbnew/initpcb.cpp @@ -99,7 +99,7 @@ void WinEDA_PcbGlobalDeleteFrame::AcceptPcbDelete( wxCommandEvent& event ) if( redraw ) { - m_Parent->GetScreen()->SetCurItem( NULL ); + m_Parent->SetCurItem( NULL ); m_Parent->ReDrawPanel(); } @@ -182,7 +182,7 @@ bool WinEDA_BasePcbFrame::Clear_Pcb( wxDC* DC, bool query ) m_Pcb->m_NbNoconnect = 0; m_Pcb->m_NbSegmTrack = 0; m_Pcb->m_NbSegmZone = 0; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); /* Init parametres de gestion */ GetScreen()->Init(); diff --git a/pcbnew/loadcmp.cpp b/pcbnew/loadcmp.cpp index 0c8ba72788..f3081c0c44 100644 --- a/pcbnew/loadcmp.cpp +++ b/pcbnew/loadcmp.cpp @@ -59,7 +59,7 @@ void WinEDA_ModuleEditFrame::Load_Module_Module_From_BOARD( MODULE* Module ) if( Module == NULL ) return; - m_CurrentScreen->SetCurItem( NULL ); + SetCurItem( NULL ); Clear_Pcb( NULL, TRUE ); diff --git a/pcbnew/mirepcb.cpp b/pcbnew/mirepcb.cpp index 9ed1b9e769..01c6166270 100644 --- a/pcbnew/mirepcb.cpp +++ b/pcbnew/mirepcb.cpp @@ -243,7 +243,7 @@ void WinEDA_PcbFrame::StartMove_Mire( MIREPCB* MirePcb, wxDC* DC ) MirePcb->m_Flags |= IS_MOVED; DrawPanel->ManageCurseur = Montre_Position_Mire; DrawPanel->ForceCloseManageCurseur = Exit_EditMire; - GetScreen()->SetCurItem( MirePcb ); + SetCurItem( MirePcb ); } @@ -259,7 +259,7 @@ void WinEDA_PcbFrame::Place_Mire( MIREPCB* MirePcb, wxDC* DC ) MirePcb->m_Flags = 0; DrawPanel->ManageCurseur = NULL; DrawPanel->ForceCloseManageCurseur = NULL; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); GetScreen()->SetModify(); } diff --git a/pcbnew/modedit.cpp b/pcbnew/modedit.cpp index 0e847cd68c..55fc3eb723 100644 --- a/pcbnew/modedit.cpp +++ b/pcbnew/modedit.cpp @@ -19,10 +19,10 @@ /*********************************************************************/ -EDA_BaseStruct* WinEDA_ModuleEditFrame::ModeditLocateAndDisplay() +BOARD_ITEM* WinEDA_ModuleEditFrame::ModeditLocateAndDisplay() /*********************************************************************/ { - EDA_BaseStruct* DrawStruct = GetScreen()->GetCurItem(); + BOARD_ITEM* DrawStruct = GetCurItem(); MODULE* Module = m_Pcb->m_Modules; if( Module == NULL ) @@ -129,7 +129,7 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_MODEDIT_NEW_MODULE: Clear_Pcb( &dc, TRUE ); GetScreen()->ClearUndoRedoList(); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); GetScreen()->m_Curseur = wxPoint( 0, 0 ); Create_1_Module( &dc, wxEmptyString ); if( m_Pcb->m_Modules ) @@ -224,14 +224,14 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event ) newmodule->m_Flags = 0; GetScreen()->ClrModify(); - pcbframe->GetScreen()->SetCurItem( NULL ); + pcbframe->SetCurItem( NULL ); mainpcb->m_Status_Pcb = 0; } break; case ID_LIBEDIT_IMPORT_PART: GetScreen()->ClearUndoRedoList(); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); Clear_Pcb( &dc, TRUE ); GetScreen()->m_Curseur = wxPoint( 0, 0 ); Import_Module( &dc ); @@ -259,7 +259,7 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_MODEDIT_LOAD_MODULE: { GetScreen()->ClearUndoRedoList(); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); Clear_Pcb( &dc, TRUE ); GetScreen()->m_Curseur = wxPoint( 0, 0 ); Load_Module_From_Library( m_CurrentLib, &dc ); @@ -301,7 +301,7 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_MODEDIT_EDIT_MODULE_PROPERTIES: if( m_Pcb->m_Modules ) { - GetScreen()->SetCurItem( m_Pcb->m_Modules ); + SetCurItem( m_Pcb->m_Modules ); InstallModuleOptionsFrame( (MODULE*) GetScreen()->GetCurItem(), &dc, pos ); GetScreen()->GetCurItem()->m_Flags = 0; @@ -375,7 +375,7 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_DELETE_PAD: SaveCopyInUndoList( m_Pcb->m_Modules ); DeletePad( (D_PAD*) GetScreen()->GetCurItem(), &dc ); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); DrawPanel->MouseToCursorSchema(); break; @@ -418,7 +418,7 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event ) SaveCopyInUndoList( m_Pcb->m_Modules ); DeleteTextModule( (TEXTE_MODULE*) GetScreen()->GetCurItem(), &dc ); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); DrawPanel->MouseToCursorSchema(); break; @@ -432,7 +432,7 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event ) if( (GetScreen()->GetCurItem()->m_Flags & IS_NEW) ) { End_Edge_Module( (EDGE_MODULE*) GetScreen()->GetCurItem(), &dc ); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); } break; @@ -474,7 +474,7 @@ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event ) SaveCopyInUndoList( m_Pcb->m_Modules ); DrawPanel->MouseToCursorSchema(); RemoveStruct( GetScreen()->GetCurItem(), &dc ); - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); break; case ID_MODEDIT_MODULE_ROTATE: diff --git a/pcbnew/modedit_onclick.cpp b/pcbnew/modedit_onclick.cpp index 1f61b6056e..e12f10652b 100644 --- a/pcbnew/modedit_onclick.cpp +++ b/pcbnew/modedit_onclick.cpp @@ -34,7 +34,7 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) * quand un outil est deja selectionné */ { - EDA_BaseStruct* DrawStruct = m_CurrentScreen->GetCurItem(); + BOARD_ITEM* DrawStruct = GetCurItem(); DrawPanel->CursorOff( DC ); if( m_ID_current_state == 0 ) @@ -72,10 +72,11 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) } } - DrawStruct = m_CurrentScreen->GetCurItem(); + DrawStruct = GetCurItem(); if( !DrawStruct || (DrawStruct->m_Flags == 0) ) { - m_CurrentScreen->SetCurItem( DrawStruct = ModeditLocateAndDisplay() ); + DrawStruct = (BOARD_ITEM*) ModeditLocateAndDisplay(); + SetCurItem( DrawStruct ); } switch( m_ID_current_state ) @@ -97,7 +98,7 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) if( m_ID_current_state == ID_PCB_ARC_BUTT ) shape = S_ARC; - m_CurrentScreen->SetCurItem( + SetCurItem( Begin_Edge_Module( (EDGE_MODULE*) NULL, DC, shape ) ); } else if( (DrawStruct->m_Flags & IS_NEW) ) @@ -105,16 +106,16 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) if( ( (EDGE_MODULE*) DrawStruct )->m_Shape == S_CIRCLE ) { End_Edge_Module( (EDGE_MODULE*) DrawStruct, DC ); - m_CurrentScreen->SetCurItem( NULL ); + SetCurItem( NULL ); } else if( ( (EDGE_MODULE*) DrawStruct )->m_Shape == S_ARC ) { End_Edge_Module( (EDGE_MODULE*) DrawStruct, DC ); - m_CurrentScreen->SetCurItem( NULL ); + SetCurItem( NULL ); } else if( ( (EDGE_MODULE*) DrawStruct )->m_Shape == S_SEGMENT ) { - m_CurrentScreen->SetCurItem( + SetCurItem( Begin_Edge_Module( (EDGE_MODULE*) DrawStruct, DC, 0 ) ); } else @@ -130,7 +131,7 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) { SaveCopyInUndoList( m_Pcb->m_Modules ); RemoveStruct( DrawStruct, DC ); - m_CurrentScreen->SetCurItem( DrawStruct = NULL ); + SetCurItem( DrawStruct = NULL ); } } break; @@ -144,7 +145,7 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) Place_Module( m_Pcb->m_Modules, DC ); RedrawActiveWindow( DC, TRUE ); SetToolID( 0, wxCURSOR_ARROW, wxEmptyString ); - m_CurrentScreen->SetCurItem( NULL ); + SetCurItem( NULL ); break; case ID_TEXT_COMMENT_BUTT: @@ -181,7 +182,7 @@ void WinEDA_ModuleEditFrame::OnRightClick( const wxPoint& MousePos, * Ce menu est ensuite complété par la liste des commandes de ZOOM */ { - EDA_BaseStruct* DrawStruct = m_CurrentScreen->GetCurItem(); + BOARD_ITEM* DrawStruct = GetCurItem(); wxString msg; bool append_set_width = FALSE; bool BlockActive = (m_CurrentScreen->BlockLocate.m_Command != BLOCK_IDLE); @@ -189,7 +190,7 @@ void WinEDA_ModuleEditFrame::OnRightClick( const wxPoint& MousePos, // Simple localisation des elements si possible if( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) ) { - m_CurrentScreen->SetCurItem( DrawStruct = ModeditLocateAndDisplay() ); + SetCurItem( DrawStruct = ModeditLocateAndDisplay() ); } // Si commande en cours: affichage fin de commande @@ -378,7 +379,7 @@ void WinEDA_ModuleEditFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) * appel de l'editeur correspondant. */ { - EDA_BaseStruct* DrawStruct = m_CurrentScreen->GetCurItem(); + BOARD_ITEM* DrawStruct = GetCurItem(); wxPoint pos = GetPosition(); wxClientDC dc( DrawPanel ); @@ -396,7 +397,7 @@ void WinEDA_ModuleEditFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) break; // Element localisé - m_CurrentScreen->SetCurItem( DrawStruct ); + SetCurItem( DrawStruct ); switch( DrawStruct->Type() ) { @@ -429,7 +430,7 @@ void WinEDA_ModuleEditFrame::OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) if( DrawStruct && (DrawStruct->m_Flags & IS_NEW) ) { End_Edge_Module( (EDGE_MODULE*) DrawStruct, DC ); - m_CurrentScreen->SetCurItem( NULL ); + SetCurItem( NULL ); } break; } diff --git a/pcbnew/modedit_undo_redo.cpp b/pcbnew/modedit_undo_redo.cpp index f42a086bef..ef46980e6e 100644 --- a/pcbnew/modedit_undo_redo.cpp +++ b/pcbnew/modedit_undo_redo.cpp @@ -56,7 +56,7 @@ void WinEDA_ModuleEditFrame::GetComponentFromRedoList() (MODULE*) GetScreen()->GetItemFromRedoList(); if( m_Pcb->m_Modules ) m_Pcb->m_Modules->Pnext = NULL; - GetScreen()->SetCurItem( NULL );; + SetCurItem( NULL );; GetScreen()->SetModify(); ReCreateHToolbar(); SetToolbars(); @@ -82,7 +82,7 @@ void WinEDA_ModuleEditFrame::GetComponentFromUndoList() if( m_Pcb->m_Modules ) m_Pcb->m_Modules->Pnext = NULL; GetScreen()->SetModify(); - GetScreen()->SetCurItem( NULL );; + SetCurItem( NULL );; ReCreateHToolbar(); SetToolbars(); } diff --git a/pcbnew/moduleframe.cpp b/pcbnew/moduleframe.cpp index 91f3733c98..54c3883092 100644 --- a/pcbnew/moduleframe.cpp +++ b/pcbnew/moduleframe.cpp @@ -131,7 +131,7 @@ WinEDA_ModuleEditFrame::WinEDA_ModuleEditFrame( wxWindow* father, WinEDA_App* pa m_Pcb->m_PcbFrame = this; m_CurrentScreen = ScreenModule; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); GetSettings(); wxSize GridSize( 500, 500 ); diff --git a/pcbnew/modules.cpp b/pcbnew/modules.cpp index 907cd87170..994aa8a4a5 100644 --- a/pcbnew/modules.cpp +++ b/pcbnew/modules.cpp @@ -100,7 +100,7 @@ void WinEDA_PcbFrame::StartMove_Module( MODULE* module, wxDC* DC ) if( module == NULL ) return; - m_CurrentScreen->SetCurItem( module ); + SetCurItem( module ); m_Pcb->m_Status_Pcb &= ~CHEVELU_LOCAL_OK; module->m_Flags |= IS_MOVED; ModuleInitOrient = module->m_Orient; @@ -199,7 +199,7 @@ void Exit_Module( WinEDA_DrawPanel* Panel, wxDC* DC ) g_Drag_Pistes_On = FALSE; Panel->ManageCurseur = NULL; Panel->ForceCloseManageCurseur = NULL; - pcbframe->m_CurrentScreen->SetCurItem( NULL ); + pcbframe->SetCurItem( NULL ); } diff --git a/pcbnew/move_copy_track.cpp b/pcbnew/move_copy_track.cpp index 5c81456ac0..6a9ada0837 100644 --- a/pcbnew/move_copy_track.cpp +++ b/pcbnew/move_copy_track.cpp @@ -93,8 +93,8 @@ static void Exit_MoveTrack( WinEDA_DrawPanel* Panel, wxDC* DC ) Panel->ManageCurseur = NULL; Panel->ForceCloseManageCurseur = NULL; - Panel->GetScreen()->SetCurItem( NULL ); - Panel->m_Parent->EraseMsgBox(); + Panel->SetCurItem( NULL ); +// Panel->m_Parent->EraseMsgBox(); SeCurItem() does this /* Annulation deplacement et Redessin des segments dragges */ DRAG_SEGM* pt_drag = g_DragSegmentList; diff --git a/pcbnew/move_or_drag_track.cpp b/pcbnew/move_or_drag_track.cpp index 9f556be89e..4ee8bbef70 100644 --- a/pcbnew/move_or_drag_track.cpp +++ b/pcbnew/move_or_drag_track.cpp @@ -95,8 +95,7 @@ static void Abort_MoveTrack( WinEDA_DrawPanel* Panel, wxDC* DC ) Panel->ManageCurseur = NULL; Panel->ForceCloseManageCurseur = NULL; - Panel->GetScreen()->SetCurItem( NULL ); - Panel->m_Parent->EraseMsgBox(); + ((WinEDA_PcbFrame*)Panel->m_Parent)->SetCurItem(NULL); /* Annulation deplacement et Redessin des segments dragges */ DRAG_SEGM* pt_drag = g_DragSegmentList; diff --git a/pcbnew/muonde.cpp b/pcbnew/muonde.cpp index 3f105a79d7..229c07cebe 100644 --- a/pcbnew/muonde.cpp +++ b/pcbnew/muonde.cpp @@ -113,7 +113,7 @@ static void Exit_Muonde( WinEDA_DrawFrame* frame, wxDC* DC ) frame->DrawPanel->ManageCurseur = NULL; frame->DrawPanel->ForceCloseManageCurseur = NULL; - frame->m_CurrentScreen->SetCurItem( NULL ); + frame->SetCurItem( NULL ); } diff --git a/pcbnew/onrightclick.cpp b/pcbnew/onrightclick.cpp index f3d2b998f8..f6113a2eba 100644 --- a/pcbnew/onrightclick.cpp +++ b/pcbnew/onrightclick.cpp @@ -131,25 +131,23 @@ void WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) bool BlockActive = (m_CurrentScreen->BlockLocate.m_Command != BLOCK_IDLE); wxClientDC dc( DrawPanel ); - BOARD_ITEM* item = GetScreen()->GetCurItem(); + BOARD_ITEM* item = GetCurItem(); DrawPanel->CursorOff( &dc ); DrawPanel->m_CanStartBlock = -1; // Ne pas engager un debut de bloc sur validation menu - // Simple localisation des elements si possible - if( item == NULL || item->m_Flags == 0 ) + + /* The user must now left click to first make the selection. OnRightClick() + is now only an action mechanism, not a selection mechanism. The selection + mechanism sometimes involves a popup menu, so it is too complex to try + and do that here. + + // Only offer user a new selection if there is currently none. + if( item == NULL ) { - if( m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOPLACE ) - { - item = Locate_Prefered_Module( m_Pcb, CURSEUR_OFF_GRILLE | VISIBLE_ONLY ); - if( item ) - item->Display_Infos( this ); - else - item = PcbGeneralLocateAndDisplay(); - } - else - item = PcbGeneralLocateAndDisplay(); + item = PcbGeneralLocateAndDisplay(); } + */ // If command in progress: Put the Cancel command (if needed) and End command if( m_ID_current_state ) @@ -187,19 +185,11 @@ void WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) return; } - m_CurrentScreen->SetCurItem( item ); - if( item ) flags = item->m_Flags; else flags = 0; - if( !flags ) - { - ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_GET_AND_MOVE_MODULE_REQUEST, - _( "Get and Move Footprint" ), Move_Module_xpm ); - } - if( item ) { switch( item->Type() ) @@ -230,15 +220,6 @@ void WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) break; case TYPEPAD: - if( !flags ) - { - MODULE* module = (MODULE*) item->m_Parent; - if( module ) - { - CreatePopUpMenuForFootprints( module, aPopMenu, TRUE ); - aPopMenu->AppendSeparator(); - } - } CreatePopUpMenuForPads( (D_PAD*) item, aPopMenu ); if( m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOROUTE ) { @@ -248,19 +229,28 @@ void WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) aPopMenu->Append( ID_POPUP_PCB_AUTOROUTE_NET, _( "Autoroute Net" ) ); } } - break; - - case TYPETEXTEMODULE: if( !flags ) { MODULE* module = (MODULE*) item->m_Parent; if( module ) { - CreatePopUpMenuForFootprints( module, aPopMenu, TRUE ); aPopMenu->AppendSeparator(); + CreatePopUpMenuForFootprints( module, aPopMenu, TRUE ); } } + break; + + case TYPETEXTEMODULE: CreatePopUpMenuForFpTexts( (TEXTE_MODULE*) item, aPopMenu ); + if( !flags ) + { + MODULE* module = (MODULE*) item->m_Parent; + if( module ) + { + aPopMenu->AppendSeparator(); + CreatePopUpMenuForFootprints( module, aPopMenu, TRUE ); + } + } break; case TYPEDRAWSEGMENT: @@ -355,6 +345,12 @@ void WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) aPopMenu->AppendSeparator(); } + if( !flags ) + { + ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_GET_AND_MOVE_MODULE_REQUEST, + _( "Get and Move Footprint" ), Move_Module_xpm ); + } + /* Traitement des fonctions specifiques */ switch( m_ID_current_state ) { diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp index 2f5049e48e..32aa47b8cd 100644 --- a/pcbnew/pcbframe.cpp +++ b/pcbnew/pcbframe.cpp @@ -6,6 +6,7 @@ #include "common.h" #include "pcbnew.h" +#include "collectors.h" #include "bitmaps.h" #include "protos.h" @@ -16,7 +17,7 @@ /* class WinEDA_PcbFrame */ /*******************************/ -BEGIN_EVENT_TABLE( WinEDA_PcbFrame, wxFrame ) +BEGIN_EVENT_TABLE( WinEDA_PcbFrame, WinEDA_BasePcbFrame ) COMMON_EVENTS_DRAWFRAME EVT_SOCKET( ID_EDA_SOCKET_EVENT_SERV, WinEDA_PcbFrame::OnSockRequestServer ) @@ -159,7 +160,7 @@ BEGIN_EVENT_TABLE( WinEDA_PcbFrame, wxFrame ) // Annulation de commande en cours EVT_MENU_RANGE( ID_POPUP_GENERAL_START_RANGE, ID_POPUP_GENERAL_END_RANGE, WinEDA_PcbFrame::Process_Special_Functions ) - + // PopUp Menus pour Zooms traites dans drawpanel.cpp END_EVENT_TABLE() diff --git a/pcbnew/pcbtexte.cpp b/pcbnew/pcbtexte.cpp index c68ba1b4c6..b859293cfc 100644 --- a/pcbnew/pcbtexte.cpp +++ b/pcbnew/pcbtexte.cpp @@ -251,7 +251,7 @@ void Exit_Texte_Pcb( WinEDA_DrawPanel* Panel, wxDC* DC ) Panel->ManageCurseur = NULL; Panel->ForceCloseManageCurseur = NULL; - Panel->GetScreen()->SetCurItem( NULL ); + ((WinEDA_PcbFrame*)Panel->m_Parent)->SetCurItem( NULL ); } @@ -270,7 +270,7 @@ void WinEDA_PcbFrame::Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC ) TextePcb->Draw( DrawPanel, DC, wxPoint( 0, 0 ), GR_OR ); DrawPanel->ManageCurseur = NULL; DrawPanel->ForceCloseManageCurseur = NULL; - m_CurrentScreen->SetCurItem( NULL ); + SetCurItem( NULL ); m_CurrentScreen->SetModify(); TextePcb->m_Flags = 0; } @@ -291,7 +291,7 @@ void WinEDA_PcbFrame::StartMoveTextePcb( TEXTE_PCB* TextePcb, wxDC* DC ) TextePcb->Display_Infos( this ); DrawPanel->ManageCurseur = Move_Texte_Pcb; DrawPanel->ForceCloseManageCurseur = Exit_Texte_Pcb; - m_CurrentScreen->SetCurItem( TextePcb ); + SetCurItem( TextePcb ); DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); } @@ -332,7 +332,7 @@ void WinEDA_PcbFrame::Delete_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC ) DeleteStructure( TextePcb ); DrawPanel->ManageCurseur = NULL; DrawPanel->ForceCloseManageCurseur = NULL; - m_CurrentScreen->SetCurItem( NULL ); + SetCurItem( NULL ); } diff --git a/pcbnew/zones.cpp b/pcbnew/zones.cpp index 49b9ec8edc..1541270d20 100644 --- a/pcbnew/zones.cpp +++ b/pcbnew/zones.cpp @@ -495,7 +495,7 @@ EDGE_ZONE* WinEDA_PcbFrame::Del_SegmEdgeZone( wxDC* DC, EDGE_ZONE* edge_zone ) Segm = previous_segm; m_Pcb->m_CurrentLimitZone = Segm; - GetScreen()->SetCurItem( Segm ); + SetCurItem( Segm ); if( Segm ) { @@ -507,7 +507,7 @@ EDGE_ZONE* WinEDA_PcbFrame::Del_SegmEdgeZone( wxDC* DC, EDGE_ZONE* edge_zone ) { DrawPanel->ManageCurseur = NULL; DrawPanel->ForceCloseManageCurseur = NULL; - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); } return Segm; } @@ -626,7 +626,7 @@ static void Exit_Zones( WinEDA_DrawPanel* Panel, wxDC* DC ) Panel->ManageCurseur = NULL; Panel->ForceCloseManageCurseur = NULL; - pcbframe->GetScreen()->SetCurItem( NULL ); + pcbframe->SetCurItem( NULL ); } @@ -656,7 +656,7 @@ void WinEDA_BasePcbFrame::DelLimitesZone( wxDC* DC, bool Redraw ) segment->Pnext = NULL; delete segment; } - GetScreen()->SetCurItem( NULL ); + SetCurItem( NULL ); m_Pcb->m_CurrentLimitZone = NULL; } diff --git a/todo.txt b/todo.txt index e7b9ddeac7..c075b8696c 100644 --- a/todo.txt +++ b/todo.txt @@ -7,6 +7,10 @@ folks will see these items and volunteer to do them. // @todo: bug? memory leak at this point: about line 418 this definitely looks like a memory leak. +*** footprint_text_xpm is included more than once into the link image of pcbnew. + +*** @todo: grep for @todo and finish off those tasks. + *** make the ADD_MENUITEM macros in include/macros.h be static inline functions instead of macros. e.g. w/o argument types: @@ -18,10 +22,6 @@ static inline void ADD_MENUITEM(menu, id, text, icon) } -*** Add hierarchical menu to right mouse click in PCBNEW for the case when -multiple items are under the mouse cursor. - - *** Set up a DOXYGEN environment starting with a configuration file that: - understands the JavaDoc style comments that we have started using - gives preference to comments in header files over *.cpp files