760 lines
23 KiB
C++
760 lines
23 KiB
C++
/********************************************************************************/
|
||
/* onrightclick.cpp: fonctions de l'edition du PCB appel<65>es par le bouton droit */
|
||
/********************************************************************************/
|
||
|
||
#include "fctsys.h"
|
||
|
||
#include "gr_basic.h"
|
||
#include "macros.h"
|
||
|
||
#include "common.h"
|
||
#include "pcbnew.h"
|
||
#include "autorout.h"
|
||
|
||
#include "id.h"
|
||
|
||
#include "protos.h"
|
||
|
||
/* Bitmaps */
|
||
#include "bitmaps.h"
|
||
|
||
|
||
/* Specific bitmaps */
|
||
#include "Break_Line.xpm"
|
||
#include "Delete_Net.xpm"
|
||
#include "Delete_Line.xpm"
|
||
#include "Delete_Track.xpm"
|
||
#include "Move_Module.xpm"
|
||
//#include "Move_Track_Segment.xpm"
|
||
#include "Drag_Track_Segment.xpm"
|
||
#include "Drag_Segment_WithSlope.xpm"
|
||
#include "Drag_Module.xpm"
|
||
#include "Edit_Module.xpm"
|
||
#include "Rotate_Module+.xpm"
|
||
#include "Rotate_Module-.xpm"
|
||
#include "Delete_Module.xpm"
|
||
#include "Invert_Module.xpm"
|
||
#include "Locked.xpm"
|
||
#include "Unlocked.xpm"
|
||
#include "Move_Field.xpm"
|
||
#include "Rotate_Field.xpm"
|
||
#include "Move_Pad.xpm"
|
||
#include "Drag_Pad.xpm"
|
||
#include "Global_Options_Pad.xpm"
|
||
#include "Delete_Pad.xpm"
|
||
#include "Export_Options_Pad.xpm"
|
||
#include "Select_W_Layer.xpm"
|
||
#include "Width_Track.xpm"
|
||
#include "Width_Vias.xpm"
|
||
#include "Width_Segment.xpm"
|
||
#include "Width_Net.xpm"
|
||
#include "Width_Track_Via.xpm"
|
||
#include "Select_Layer_Pair.xpm"
|
||
#include "Footprint_Text.xpm"
|
||
|
||
#include "Flag.xpm"
|
||
|
||
|
||
|
||
/* local functions */
|
||
static void CreatePopupMenuForTracks(TRACK * Track, wxPoint CursorPosition,
|
||
wxMenu * PopMenu);
|
||
static void CreatePopUpMenuForFootprints(MODULE * Footprint, wxMenu * menu, bool full_menu);
|
||
static void CreatePopUpMenuForFpTexts(TEXTE_MODULE * FpText, wxMenu * menu);
|
||
static void CreatePopUpMenuForPads(D_PAD * Pad, wxMenu * menu);
|
||
static void CreatePopUpMenuForTexts(TEXTE_PCB * Text, wxMenu * menu);
|
||
static void CreatePopUpBlockMenu(wxMenu * menu);
|
||
|
||
|
||
|
||
/*****/
|
||
|
||
|
||
/********************************************/
|
||
static wxMenu * Append_Track_Width_List(void)
|
||
/********************************************/
|
||
/* Ajoute au menu wxMenu * menu un sous-menu liste des epaisseurs de pistes
|
||
disponibles
|
||
*/
|
||
{
|
||
int ii;
|
||
wxString msg;
|
||
wxMenu * trackwidth;
|
||
double value;
|
||
|
||
trackwidth = new wxMenu;
|
||
for ( ii = 0; ii < 6; ii++ )
|
||
{
|
||
if ( g_DesignSettings.m_TrackWidhtHistory[ii] == 0 ) break;
|
||
value = To_User_Unit(g_UnitMetric, g_DesignSettings.m_TrackWidhtHistory[ii], PCB_INTERNAL_UNIT);
|
||
if ( g_UnitMetric == INCHES ) // Affichage en mils
|
||
msg.Printf(_("Track %.1f"), value * 1000);
|
||
else
|
||
msg.Printf(_("Track %.3f"), value);
|
||
|
||
trackwidth->Append(ID_POPUP_PCB_SELECT_WIDTH1 + ii, msg, wxEmptyString, TRUE);
|
||
if( g_DesignSettings.m_TrackWidhtHistory[ii] == g_DesignSettings.m_CurrentTrackWidth )
|
||
trackwidth->Check( ID_POPUP_PCB_SELECT_WIDTH1 + ii, TRUE);
|
||
}
|
||
|
||
trackwidth->AppendSeparator();
|
||
for ( ii = 0; ii < 4; ii++ )
|
||
{
|
||
if ( g_DesignSettings.m_ViaSizeHistory[ii] == 0 ) break;
|
||
value = To_User_Unit(g_UnitMetric, g_DesignSettings.m_ViaSizeHistory[ii], PCB_INTERNAL_UNIT);
|
||
if ( g_UnitMetric == INCHES )
|
||
msg.Printf(_("Via %.1f"), value * 1000);
|
||
else
|
||
msg.Printf(_("Via %.3f"), value);
|
||
trackwidth->Append( ID_POPUP_PCB_SELECT_VIASIZE1 + ii, msg, wxEmptyString, TRUE);
|
||
if( g_DesignSettings.m_ViaSizeHistory[ii] == g_DesignSettings.m_CurrentViaSize )
|
||
trackwidth->Check( ID_POPUP_PCB_SELECT_VIASIZE1 + ii, TRUE);
|
||
}
|
||
return trackwidth;
|
||
}
|
||
|
||
|
||
/****************************************************************************/
|
||
void WinEDA_PcbFrame::OnRightClick(const wxPoint& MousePos, wxMenu * PopMenu)
|
||
/****************************************************************************/
|
||
/* Create the PopUp menu (click on right mouse button)
|
||
de la souris.
|
||
The ZOOM menu is added to this menu
|
||
*/
|
||
{
|
||
EDA_BaseStruct *DrawStruct = m_CurrentScreen->m_CurrentItem;
|
||
wxString msg;
|
||
int flags = 0;
|
||
bool locate_track = FALSE;
|
||
bool BlockActive = (m_CurrentScreen->BlockLocate.m_Command != BLOCK_IDLE);
|
||
wxClientDC dc(DrawPanel);
|
||
|
||
DrawPanel->CursorOff(&dc);
|
||
DrawPanel->m_CanStartBlock = -1; // Ne pas engager un debut de bloc sur validation menu
|
||
|
||
// Simple localisation des elements si possible
|
||
if ( (DrawStruct == NULL) || (DrawStruct->m_Flags == 0) )
|
||
{
|
||
if (m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOPLACE)
|
||
{
|
||
DrawStruct = Locate_Prefered_Module(m_Pcb, CURSEUR_OFF_GRILLE | VISIBLE_ONLY);
|
||
if ( DrawStruct ) ((MODULE*)DrawStruct)->Display_Infos(this);
|
||
else DrawStruct = PcbGeneralLocateAndDisplay();
|
||
}
|
||
else DrawStruct = PcbGeneralLocateAndDisplay();
|
||
}
|
||
|
||
// If command in progress: Put the Cancel command (if needed) and End command
|
||
if ( m_ID_current_state )
|
||
{
|
||
if ( DrawStruct && DrawStruct->m_Flags )
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_CANCEL_CURRENT_COMMAND,
|
||
_("Cancel"), cancel_xpm);
|
||
}
|
||
else
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_CLOSE_CURRENT_TOOL,
|
||
_("End Tool"), cancel_tool_xpm);
|
||
}
|
||
PopMenu->AppendSeparator();
|
||
}
|
||
|
||
else
|
||
{
|
||
if ( (DrawStruct && DrawStruct->m_Flags) || BlockActive )
|
||
{
|
||
if ( BlockActive )
|
||
CreatePopUpBlockMenu(PopMenu);
|
||
else
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_CANCEL_CURRENT_COMMAND,
|
||
_("Cancel"), cancel_xpm);
|
||
}
|
||
PopMenu->AppendSeparator();
|
||
}
|
||
}
|
||
|
||
if ( BlockActive )
|
||
{
|
||
DrawPanel->CursorOn(&dc); return;
|
||
}
|
||
|
||
m_CurrentScreen->m_CurrentItem = DrawStruct;
|
||
|
||
if ( DrawStruct ) flags = DrawStruct->m_Flags;
|
||
else flags = 0;
|
||
if( !flags )
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_GET_AND_MOVE_MODULE_REQUEST,
|
||
_("Get and Move Footprint"), Move_Module_xpm);
|
||
}
|
||
if ( DrawStruct )
|
||
{
|
||
switch ( DrawStruct->m_StructType )
|
||
{
|
||
case TYPEMODULE:
|
||
if( !flags ) CreatePopUpMenuForFootprints((MODULE *) DrawStruct, PopMenu, TRUE);
|
||
else CreatePopUpMenuForFootprints((MODULE *) DrawStruct, PopMenu, FALSE);
|
||
|
||
if (m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOPLACE)
|
||
{
|
||
PopMenu->AppendSeparator();
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_AUTOPLACE_FIXE_MODULE, _("Lock Module"),
|
||
Locked_xpm);
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_AUTOPLACE_FREE_MODULE, _("Free Module"),
|
||
Unlocked_xpm);
|
||
if( !flags )
|
||
PopMenu->Append( ID_POPUP_PCB_AUTOPLACE_CURRENT_MODULE,
|
||
_("Auto place Module"));
|
||
}
|
||
|
||
if (m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOROUTE)
|
||
{
|
||
if( !flags )
|
||
PopMenu->Append( ID_POPUP_PCB_AUTOROUTE_MODULE, _("Autoroute"));
|
||
}
|
||
break;
|
||
|
||
case TYPEPAD:
|
||
if( !flags )
|
||
{
|
||
MODULE * Module = (MODULE *) DrawStruct->m_Parent;
|
||
if (Module)
|
||
{
|
||
CreatePopUpMenuForFootprints(Module, PopMenu, TRUE);
|
||
PopMenu->AppendSeparator();
|
||
}
|
||
}
|
||
CreatePopUpMenuForPads( (D_PAD *)DrawStruct, PopMenu);
|
||
if (m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOROUTE)
|
||
{
|
||
if( !flags )
|
||
{
|
||
PopMenu->Append( ID_POPUP_PCB_AUTOROUTE_PAD, _("Autoroute Pad"));
|
||
PopMenu->Append( ID_POPUP_PCB_AUTOROUTE_NET, _("Autoroute Net"));
|
||
}
|
||
}
|
||
break;
|
||
|
||
case TYPETEXTEMODULE:
|
||
if( !flags )
|
||
{
|
||
MODULE * Module = (MODULE *) DrawStruct->m_Parent;
|
||
if (Module)
|
||
{
|
||
CreatePopUpMenuForFootprints(Module, PopMenu, TRUE);
|
||
PopMenu->AppendSeparator();
|
||
}
|
||
}
|
||
CreatePopUpMenuForFpTexts( (TEXTE_MODULE *) DrawStruct, PopMenu);
|
||
break;
|
||
|
||
case TYPEDRAWSEGMENT:
|
||
if( !flags )
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_MOVE_DRAWING_REQUEST,
|
||
_("Move Drawing"), move_xpm);
|
||
}
|
||
if( flags & IS_NEW )
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_STOP_CURRENT_DRAWING,
|
||
_("End Drawing"), apply_xpm);
|
||
}
|
||
PopMenu->Append(ID_POPUP_PCB_EDIT_DRAWING, _("Edit Drawing"));
|
||
PopMenu->Append(ID_POPUP_PCB_DELETE_DRAWING, _("Delete Drawing"));
|
||
break;
|
||
|
||
case TYPEEDGEZONE:
|
||
if( flags & IS_NEW )
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_STOP_CURRENT_EDGE_ZONE,
|
||
_("End edge zone"), apply_xpm);
|
||
}
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_DELETE_EDGE_ZONE,
|
||
_("Delete edge zone"), delete_xpm);
|
||
break;
|
||
|
||
case TYPETEXTE:
|
||
CreatePopUpMenuForTexts( (TEXTE_PCB *) DrawStruct, PopMenu);
|
||
break;
|
||
|
||
case TYPETRACK:
|
||
case TYPEVIA:
|
||
locate_track = TRUE;
|
||
CreatePopupMenuForTracks( (TRACK *) DrawStruct, GetScreen()->m_Curseur,
|
||
PopMenu);
|
||
break;
|
||
|
||
case TYPEZONE:
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_EDIT_ZONE,
|
||
_("Edit Zone"), edit_xpm);
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_DELETE_ZONE,
|
||
_("Delete Zone"), delete_xpm);
|
||
break;
|
||
|
||
case TYPEMARQUEUR:
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_DELETE_MARKER,
|
||
_("Delete Marker"), delete_xpm);
|
||
break;
|
||
|
||
case TYPECOTATION:
|
||
if( !flags )
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_EDIT_COTATION,
|
||
_("Edit Cotation"), edit_xpm);
|
||
}
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_DELETE_COTATION,
|
||
_("Delete Cotation"), delete_xpm);
|
||
break;
|
||
|
||
case TYPEMIRE:
|
||
if( !flags )
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_MOVE_MIRE_REQUEST,
|
||
_("Move Mire"), move_xpm );
|
||
}
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_EDIT_MIRE,
|
||
_("Edit Mire"), edit_xpm);
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_DELETE_MIRE,
|
||
_("Delete Mire"), delete_xpm);
|
||
break;
|
||
|
||
case TYPEEDGEMODULE:
|
||
case TYPESCREEN:
|
||
case TYPE_NOT_INIT:
|
||
case TYPEPCB:
|
||
case PCB_EQUIPOT_STRUCT_TYPE:
|
||
msg.Printf(
|
||
wxT("WinEDA_PcbFrame::OnRightClick() Error: illegal DrawType %d"),
|
||
DrawStruct->m_StructType);
|
||
DisplayError(this, msg );
|
||
break;
|
||
|
||
default:
|
||
msg.Printf(
|
||
wxT("WinEDA_PcbFrame::OnRightClick() Error: unknown DrawType %d"),
|
||
DrawStruct->m_StructType);
|
||
DisplayError(this, msg );
|
||
break;
|
||
}
|
||
PopMenu->AppendSeparator();
|
||
}
|
||
|
||
/* Traitement des fonctions specifiques */
|
||
switch ( m_ID_current_state )
|
||
{
|
||
case ID_PCB_ZONES_BUTT:
|
||
{
|
||
bool add_separator = FALSE;
|
||
PopMenu->Append(ID_POPUP_PCB_FILL_ZONE, _("Fill zone") );
|
||
|
||
if ( DrawStruct &&
|
||
( (DrawStruct->m_StructType == TYPEPAD) ||
|
||
(DrawStruct->m_StructType == TYPETRACK) ||
|
||
(DrawStruct->m_StructType == TYPEVIA) ) )
|
||
{
|
||
add_separator = TRUE;
|
||
PopMenu->Append(ID_POPUP_PCB_SELECT_NET_ZONE, _("Select Net"));
|
||
}
|
||
if( m_Pcb->m_CurrentLimitZone )
|
||
{
|
||
add_separator = TRUE;
|
||
PopMenu->Append(ID_POPUP_PCB_DELETE_ZONE_LIMIT, _("Delete Zone Limit"));
|
||
}
|
||
if ( add_separator ) PopMenu->AppendSeparator();
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_SELECT_LAYER,
|
||
_("Select Working Layer"), Select_W_Layer_xpm);
|
||
PopMenu->AppendSeparator();
|
||
}
|
||
break;
|
||
|
||
case ID_TRACK_BUTT:
|
||
{
|
||
ADD_MENUITEM_WITH_SUBMENU( PopMenu, Append_Track_Width_List(),
|
||
ID_POPUP_PCB_SELECT_WIDTH,
|
||
_("Select Track Width"), width_track_xpm);
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_SELECT_CU_LAYER,
|
||
_("Select Working Layer"), Select_W_Layer_xpm);
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_SELECT_LAYER_PAIR,
|
||
_("Select layer pair for vias"), select_layer_pair_xpm);
|
||
PopMenu->AppendSeparator();
|
||
}
|
||
break;
|
||
|
||
case ID_PCB_CIRCLE_BUTT:
|
||
case ID_PCB_ARC_BUTT:
|
||
case ID_TEXT_COMMENT_BUTT:
|
||
case ID_LINE_COMMENT_BUTT:
|
||
case ID_PCB_COTATION_BUTT:
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_SELECT_NO_CU_LAYER,
|
||
_("Select Working Layer"), Select_W_Layer_xpm);
|
||
PopMenu->AppendSeparator();
|
||
break;
|
||
|
||
case ID_COMPONENT_BUTT:
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_DISPLAY_FOOTPRINT_DOC,
|
||
_("Footprint documentation"), book_xpm);
|
||
PopMenu->AppendSeparator();
|
||
break;
|
||
|
||
case 0:
|
||
if (m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOPLACE)
|
||
{
|
||
wxMenu * commands = new wxMenu;
|
||
ADD_MENUITEM_WITH_SUBMENU(PopMenu, commands,
|
||
ID_POPUP_PCB_AUTOPLACE_COMMANDS, _("Glob Move and Place"), move_xpm);
|
||
ADD_MENUITEM(commands, ID_POPUP_PCB_AUTOPLACE_FREE_ALL_MODULES,
|
||
_("Free All Modules"), Unlocked_xpm);
|
||
ADD_MENUITEM(commands, ID_POPUP_PCB_AUTOPLACE_FIXE_ALL_MODULES,
|
||
_("Fixe All Modules"), Locked_xpm);
|
||
commands->AppendSeparator();
|
||
ADD_MENUITEM(commands, ID_POPUP_PCB_AUTOMOVE_ALL_MODULES,
|
||
_("Move All Modules"), move_xpm);
|
||
commands->Append( ID_POPUP_PCB_AUTOMOVE_NEW_MODULES, _("Move New Modules"));
|
||
commands->AppendSeparator();
|
||
commands->Append( ID_POPUP_PCB_AUTOPLACE_ALL_MODULES, _("Autoplace All Modules"));
|
||
commands->Append( ID_POPUP_PCB_AUTOPLACE_NEW_MODULES, _("Autoplace New Modules"));
|
||
commands->Append( ID_POPUP_PCB_AUTOPLACE_NEXT_MODULE, _("Autoplace Next Module"));
|
||
commands->AppendSeparator();
|
||
ADD_MENUITEM(commands, ID_POPUP_PCB_REORIENT_ALL_MODULES,
|
||
_("Orient All Modules"), rotate_module_pos_xpm);
|
||
PopMenu->AppendSeparator();
|
||
}
|
||
if (m_HTOOL_current_state == ID_TOOLBARH_PCB_AUTOROUTE)
|
||
{
|
||
wxMenu * commands = new wxMenu;
|
||
PopMenu->Append(ID_POPUP_PCB_AUTOROUTE_COMMANDS, _("Global Autoroute"), commands);
|
||
ADD_MENUITEM(commands, ID_POPUP_PCB_SELECT_LAYER_PAIR,
|
||
_("Select layer pair"), select_layer_pair_xpm);
|
||
commands->AppendSeparator();
|
||
commands->Append( ID_POPUP_PCB_AUTOROUTE_ALL_MODULES, _("Autoroute All Modules"));
|
||
commands->AppendSeparator();
|
||
commands->Append( ID_POPUP_PCB_AUTOROUTE_RESET_UNROUTED, _("Reset Unrouted"));
|
||
if ( m_Pcb->m_Modules )
|
||
{
|
||
commands->AppendSeparator();
|
||
commands->Append( ID_POPUP_PCB_AUTOROUTE_GET_AUTOROUTER,
|
||
_("Global AutoRouter"));
|
||
commands->Append( ID_POPUP_PCB_AUTOROUTE_GET_AUTOROUTER_DATA,
|
||
_("Read Global AutoRouter Data"));
|
||
}
|
||
PopMenu->AppendSeparator();
|
||
}
|
||
|
||
if ( locate_track )
|
||
ADD_MENUITEM_WITH_SUBMENU(PopMenu, Append_Track_Width_List(),
|
||
ID_POPUP_PCB_SELECT_WIDTH, _("Select Track Width"),
|
||
width_track_xpm);
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_SELECT_LAYER,
|
||
_("Select Working Layer"), Select_W_Layer_xpm);
|
||
PopMenu->AppendSeparator();
|
||
break;
|
||
|
||
}
|
||
|
||
DrawPanel->CursorOn(&dc);
|
||
}
|
||
|
||
|
||
/****************************************/
|
||
void CreatePopUpBlockMenu(wxMenu * menu)
|
||
/****************************************/
|
||
/* Create Pop sub menu for block commands
|
||
*/
|
||
{
|
||
ADD_MENUITEM(menu, ID_POPUP_CANCEL_CURRENT_COMMAND,
|
||
_("Cancel Block"), cancel_xpm );
|
||
ADD_MENUITEM(menu, ID_POPUP_ZOOM_BLOCK,
|
||
_("Zoom Block (Midd butt drag)"), zoom_selected_xpm );
|
||
menu->AppendSeparator();
|
||
ADD_MENUITEM(menu, ID_POPUP_PLACE_BLOCK,
|
||
_("Place Block"), apply_xpm );
|
||
ADD_MENUITEM(menu, ID_POPUP_COPY_BLOCK,
|
||
_("Copy Block (shift + drag mouse)"), copyblock_xpm );
|
||
ADD_MENUITEM(menu, ID_POPUP_INVERT_BLOCK,
|
||
_("Flip Block (alt + drag mouse)"), invert_module_xpm );
|
||
ADD_MENUITEM(menu, ID_POPUP_ROTATE_BLOCK,
|
||
_("Rotate Block (ctrl + drag mouse)"), rotate_pos_xpm );
|
||
ADD_MENUITEM(menu, ID_POPUP_DELETE_BLOCK,
|
||
_("Delete Block (shift+ctrl + drag mouse)"), delete_xpm );
|
||
}
|
||
|
||
|
||
/********************************************************************/
|
||
void CreatePopupMenuForTracks(TRACK * Track, wxPoint CursorPosition,
|
||
wxMenu * PopMenu)
|
||
/*******************************************************************/
|
||
/* Create command lines for a popup menu, for track editing
|
||
*/
|
||
{
|
||
int flags = Track->m_Flags;
|
||
|
||
if ( flags == 0 )
|
||
{
|
||
if ( Track->m_StructType == TYPEVIA)
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_MOVE_TRACK_NODE, _("Drag Via"), move_xpm);
|
||
wxMenu * via_mnu= new wxMenu();
|
||
ADD_MENUITEM_WITH_SUBMENU(PopMenu, via_mnu,
|
||
ID_POPUP_PCB_VIA_EDITING, _("Edit Via"), edit_xpm);
|
||
ADD_MENUITEM(via_mnu, ID_POPUP_PCB_VIA_HOLE_TO_DEFAULT,
|
||
_("Set via hole to Default"), apply_xpm);
|
||
ADD_MENUITEM(via_mnu, ID_POPUP_PCB_VIA_HOLE_TO_VALUE, _("Set via hole to alt value"), options_new_pad_xpm);
|
||
ADD_MENUITEM(via_mnu, ID_POPUP_PCB_VIA_HOLE_ENTER_VALUE, _("Set the via hole alt value"), edit_xpm);
|
||
ADD_MENUITEM(via_mnu, ID_POPUP_PCB_VIA_HOLE_EXPORT, _("Export Via hole to alt value"), Export_Options_Pad_xpm);
|
||
ADD_MENUITEM(via_mnu, ID_POPUP_PCB_VIA_HOLE_EXPORT_TO_OTHERS, _("Export via hole to others id vias"), global_options_pad_xpm);
|
||
ADD_MENUITEM(via_mnu, ID_POPUP_PCB_VIA_HOLE_RESET_TO_DEFAULT, _("Set ALL via holes to default"), apply_xpm);
|
||
if ( Track->m_Drill <= 0 )
|
||
{
|
||
via_mnu->Enable(ID_POPUP_PCB_VIA_HOLE_EXPORT,FALSE);
|
||
}
|
||
if ( g_ViaHoleLastValue <= 0 )
|
||
via_mnu->Enable(ID_POPUP_PCB_VIA_HOLE_TO_VALUE,FALSE);
|
||
}
|
||
else
|
||
{
|
||
if ( Track->IsPointOnEnds(CursorPosition, -1) != 0 )
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_MOVE_TRACK_NODE,
|
||
_("Move Node"), move_xpm);
|
||
}
|
||
else
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_DRAG_TRACK_SEGMENT_KEEP_SLOPE,
|
||
_("Drag Segments, keep slope"), drag_segment_withslope_xpm);
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_DRAG_TRACK_SEGMENT,
|
||
_("Drag Segment"), drag_track_segment_xpm);
|
||
#if 0
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_MOVE_TRACK_SEGMENT,
|
||
_("Move Segment"), move_track_segment_xpm);
|
||
#endif
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_BREAK_TRACK,
|
||
_("Break Track"), Break_Line_xpm);
|
||
}
|
||
}
|
||
}
|
||
|
||
else if( flags & IS_DRAGGED ) // Drag via or node in progress
|
||
{
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_PLACE_MOVED_TRACK_NODE,
|
||
_("Place Node"), apply_xpm);
|
||
return;
|
||
}
|
||
|
||
else // Edition in progress
|
||
{
|
||
if( flags & IS_NEW )
|
||
ADD_MENUITEM(PopMenu, ID_POPUP_PCB_END_TRACK, _("End Track (end)"), apply_xpm);
|
||
PopMenu->Append(ID_POPUP_PCB_PLACE_VIA, _("Place Via (V)"));
|
||
}
|
||
|
||
// track Width control :
|
||
wxMenu * track_mnu = new wxMenu;
|
||
ADD_MENUITEM_WITH_SUBMENU(PopMenu, track_mnu,
|
||
ID_POPUP_PCB_EDIT_TRACK_MNU, _("Change Width"), width_track_xpm);
|
||
ADD_MENUITEM(track_mnu, ID_POPUP_PCB_EDIT_TRACKSEG,
|
||
_("Edit Segment"), width_segment_xpm);
|
||
if( !flags )
|
||
{
|
||
ADD_MENUITEM(track_mnu, ID_POPUP_PCB_EDIT_TRACK,
|
||
_("Edit Track"), width_track_xpm);
|
||
ADD_MENUITEM(track_mnu, ID_POPUP_PCB_EDIT_NET,
|
||
_("Edit Net"), width_net_xpm);
|
||
ADD_MENUITEM(track_mnu, ID_POPUP_PCB_EDIT_ALL_VIAS_AND_TRACK_SIZE,
|
||
_("Edit ALL Tracks and Vias"), width_track_via_xpm);
|
||
ADD_MENUITEM(track_mnu, ID_POPUP_PCB_EDIT_ALL_VIAS_SIZE,
|
||
_("Edit ALL Vias (no track)"), width_vias_xpm);
|
||
ADD_MENUITEM(track_mnu, ID_POPUP_PCB_EDIT_ALL_TRACK_SIZE,
|
||
_("Edit ALL Tracks (no via)"), width_track_xpm);
|
||
}
|
||
|
||
// Delete control:
|
||
track_mnu = new wxMenu;
|
||
ADD_MENUITEM_WITH_SUBMENU( PopMenu, track_mnu,
|
||
ID_POPUP_PCB_DELETE_TRACK_MNU, _("Delete"), delete_xpm);
|
||
ADD_MENUITEM(track_mnu, ID_POPUP_PCB_DELETE_TRACKSEG,
|
||
_("Delete Segment (backspace)"), Delete_Line_xpm);
|
||
if( !flags )
|
||
{
|
||
ADD_MENUITEM(track_mnu, ID_POPUP_PCB_DELETE_TRACK,
|
||
_("Delete Track (delete)"), Delete_Track_xpm);
|
||
ADD_MENUITEM(track_mnu, ID_POPUP_PCB_DELETE_TRACKNET,
|
||
_("Delete Net"), Delete_Net_xpm);
|
||
}
|
||
track_mnu = new wxMenu;
|
||
ADD_MENUITEM_WITH_SUBMENU( PopMenu, track_mnu,
|
||
ID_POPUP_PCB_SETFLAGS_TRACK_MNU, _("Set Flags"), Flag_xpm);
|
||
track_mnu->Append(ID_POPUP_PCB_LOCK_ON_TRACKSEG, _("Locked: Yes"), wxEmptyString, TRUE);
|
||
track_mnu->Append(ID_POPUP_PCB_LOCK_OFF_TRACKSEG, _("Locked: No"), wxEmptyString, TRUE);
|
||
if( Track->GetState(SEGM_FIXE) )
|
||
track_mnu->Check( ID_POPUP_PCB_LOCK_ON_TRACKSEG, TRUE);
|
||
else track_mnu->Check( ID_POPUP_PCB_LOCK_OFF_TRACKSEG, TRUE);
|
||
|
||
if( !flags )
|
||
{
|
||
track_mnu->AppendSeparator();
|
||
track_mnu->Append(ID_POPUP_PCB_LOCK_ON_TRACK, _("Track Locked: Yes"));
|
||
track_mnu->Append(ID_POPUP_PCB_LOCK_OFF_TRACK, _("Track Locked: No"));
|
||
track_mnu->AppendSeparator();
|
||
track_mnu->Append(ID_POPUP_PCB_LOCK_ON_NET, _("Net Locked: Yes"));
|
||
track_mnu->Append(ID_POPUP_PCB_LOCK_OFF_NET, _("Net Locked: No"));
|
||
}
|
||
}
|
||
|
||
/*********************************************************************************/
|
||
void CreatePopUpMenuForFootprints(MODULE * Module, wxMenu * menu, bool full_menu)
|
||
/*********************************************************************************/
|
||
/* Create the wxMenuitem list for footprint editing
|
||
*/
|
||
{
|
||
wxMenu * sub_menu_footprint;
|
||
wxString msg;
|
||
int flags = Module->m_Flags;
|
||
|
||
msg = _("Footprint");
|
||
msg << wxT(" ") << Module->m_Reference->m_Text;
|
||
|
||
sub_menu_footprint = new wxMenu;
|
||
ADD_MENUITEM_WITH_SUBMENU(menu, sub_menu_footprint, -1, msg, module_xpm)
|
||
if ( full_menu )
|
||
{
|
||
ADD_MENUITEM(sub_menu_footprint, ID_POPUP_PCB_MOVE_MODULE_REQUEST,
|
||
_("Move (M)"), Move_Module_xpm)
|
||
ADD_MENUITEM(sub_menu_footprint, ID_POPUP_PCB_DRAG_MODULE_REQUEST,
|
||
_("Drag (G)"), Drag_Module_xpm);
|
||
}
|
||
ADD_MENUITEM(sub_menu_footprint, ID_POPUP_PCB_ROTATE_MODULE_CLOCKWISE,
|
||
_("Rotate + (R)"), rotate_module_pos_xpm);
|
||
ADD_MENUITEM(sub_menu_footprint, ID_POPUP_PCB_ROTATE_MODULE_COUNTERCLOCKWISE,
|
||
_("Rotate -"), rotate_module_neg_xpm);
|
||
ADD_MENUITEM(sub_menu_footprint, ID_POPUP_PCB_CHANGE_SIDE_MODULE,
|
||
_("Flip (S)"), invert_module_xpm);
|
||
ADD_MENUITEM(sub_menu_footprint, ID_POPUP_PCB_EDIT_MODULE,
|
||
_("Edit"), Edit_Module_xpm);
|
||
|
||
if( !flags )
|
||
{
|
||
sub_menu_footprint->AppendSeparator();
|
||
ADD_MENUITEM(sub_menu_footprint, ID_POPUP_PCB_DELETE_MODULE,
|
||
_("Delete Module"), Delete_Module_xpm);
|
||
}
|
||
}
|
||
|
||
|
||
/********************************************************************/
|
||
void CreatePopUpMenuForFpTexts(TEXTE_MODULE * FpText, wxMenu * menu)
|
||
/********************************************************************/
|
||
/* Create the wxMenuitem list for editing texts on footprints
|
||
*/
|
||
{
|
||
wxMenu * sub_menu_Fp_text;
|
||
wxString msg;
|
||
int flags = FpText->m_Flags;
|
||
|
||
switch ( FpText->m_Type )
|
||
{
|
||
case TEXT_is_REFERENCE:
|
||
msg = _("Footprint ref");
|
||
break;
|
||
|
||
case TEXT_is_VALUE:
|
||
msg = _("Footprint value");
|
||
break;
|
||
|
||
default:
|
||
msg = _("Footprint text");
|
||
break;
|
||
}
|
||
msg << wxT(" ") << FpText->m_Text;
|
||
|
||
sub_menu_Fp_text = new wxMenu;
|
||
ADD_MENUITEM_WITH_SUBMENU(menu, sub_menu_Fp_text, -1, msg, footprint_text_xpm)
|
||
|
||
if( !flags )
|
||
ADD_MENUITEM(sub_menu_Fp_text, ID_POPUP_PCB_MOVE_TEXTMODULE_REQUEST,
|
||
_("Move"), Move_Field_xpm);
|
||
|
||
ADD_MENUITEM(sub_menu_Fp_text, ID_POPUP_PCB_ROTATE_TEXTMODULE,
|
||
_("Rotate"), Rotate_Field_xpm);
|
||
ADD_MENUITEM(sub_menu_Fp_text, ID_POPUP_PCB_EDIT_TEXTMODULE,
|
||
_("Edit"), edit_text_xpm);
|
||
if ( FpText->m_Type == TEXT_is_DIVERS)
|
||
ADD_MENUITEM(sub_menu_Fp_text, ID_POPUP_PCB_DELETE_TEXTMODULE,
|
||
_("Delete"), delete_xpm);
|
||
}
|
||
|
||
|
||
/***************************************************************/
|
||
void CreatePopUpMenuForPads( D_PAD * Pad, wxMenu * menu)
|
||
/***************************************************************/
|
||
/* Create pop menu for pads */
|
||
{
|
||
wxMenu * sub_menu_Pad;
|
||
wxString msg;
|
||
int flags = Pad->m_Flags;
|
||
|
||
msg = _("Pad");
|
||
msg << wxT(" ") << Pad->ReturnStringPadName();
|
||
|
||
sub_menu_Pad = new wxMenu;
|
||
ADD_MENUITEM_WITH_SUBMENU(menu, sub_menu_Pad, -1, msg, pad_xpm)
|
||
if( !flags )
|
||
{
|
||
ADD_MENUITEM(sub_menu_Pad, ID_POPUP_PCB_MOVE_PAD_REQUEST,
|
||
_("Move"), move_pad_xpm);
|
||
ADD_MENUITEM(sub_menu_Pad, ID_POPUP_PCB_DRAG_PAD_REQUEST,
|
||
_("Drag"), drag_pad_xpm);
|
||
}
|
||
ADD_MENUITEM(sub_menu_Pad, ID_POPUP_PCB_EDIT_PAD, _("Edit Pad"), options_pad_xpm);
|
||
sub_menu_Pad->AppendSeparator();
|
||
ADD_MENUITEM(sub_menu_Pad, ID_POPUP_PCB_IMPORT_PAD_SETTINGS,
|
||
_("New Pad Settings"), options_new_pad_xpm);
|
||
ADD_MENUITEM(sub_menu_Pad, ID_POPUP_PCB_EXPORT_PAD_SETTINGS,
|
||
_("Export Pad Settings"), Export_Options_Pad_xpm);
|
||
|
||
if( !flags )
|
||
{
|
||
ADD_MENUITEM(sub_menu_Pad, ID_POPUP_PCB_GLOBAL_IMPORT_PAD_SETTINGS,
|
||
_("Global Pad Settings"), global_options_pad_xpm);
|
||
sub_menu_Pad->AppendSeparator();
|
||
ADD_MENUITEM(sub_menu_Pad, ID_POPUP_PCB_DELETE_PAD,
|
||
_("delete"), Delete_Pad_xpm);
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************************************/
|
||
void CreatePopUpMenuForTexts(TEXTE_PCB * Text, wxMenu * menu)
|
||
/*************************************************************/
|
||
/* Create pop menu for pcb texts */
|
||
{
|
||
wxMenu * sub_menu_Text;
|
||
wxString msg;
|
||
int flags = Text->m_Flags;
|
||
|
||
msg = _("Pcb Text");msg << wxT(" ");
|
||
if ( Text->m_Text.Len() < 8 )
|
||
msg << Text->m_Text;
|
||
else
|
||
msg += Text->m_Text.Left(5) + wxT("..");
|
||
|
||
sub_menu_Text = new wxMenu;
|
||
ADD_MENUITEM_WITH_SUBMENU(menu, sub_menu_Text, -1, msg, add_text_xpm)
|
||
|
||
if( !flags )
|
||
{
|
||
ADD_MENUITEM(sub_menu_Text, ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST,
|
||
_("Move"), move_text_xpm);
|
||
}
|
||
ADD_MENUITEM(sub_menu_Text, ID_POPUP_PCB_ROTATE_TEXTEPCB,
|
||
_("Rotate"), rotate_pos_xpm);
|
||
ADD_MENUITEM(sub_menu_Text, ID_POPUP_PCB_EDIT_TEXTEPCB,
|
||
_("Edit"), edit_text_xpm);
|
||
|
||
sub_menu_Text->AppendSeparator();
|
||
ADD_MENUITEM(sub_menu_Text, ID_POPUP_PCB_DELETE_TEXTEPCB,
|
||
_("Delete"), delete_text_xpm);
|
||
}
|
||
|