You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

349 lines
16 KiB

  1. /*
  2. * This program source code file is part of KiCad, a free EDA CAD application.
  3. *
  4. * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
  5. * Copyright (C) 2015 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
  6. * Copyright (C) 2015 Wayne Stambaugh <stambaughw@gmail.com>
  7. * Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * as published by the Free Software Foundation; either version 2
  12. * of the License, or (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, you may find one here:
  21. * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
  22. * or you may search the http://www.gnu.org website for the version 2 license,
  23. * or you may write to the Free Software Foundation, Inc.,
  24. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  25. */
  26. #include "footprint_edit_frame.h"
  27. #include <advanced_config.h>
  28. #include <menus_helpers.h>
  29. #include <pgm_base.h>
  30. #include <tool/tool_manager.h>
  31. #include <tool/conditional_menu.h>
  32. #include <tool/actions.h>
  33. #include <tools/selection_tool.h>
  34. #include <tools/pcb_actions.h>
  35. #include "help_common_strings.h"
  36. #include "hotkeys.h"
  37. #include "pcbnew.h"
  38. #include "pcbnew_id.h"
  39. void FOOTPRINT_EDIT_FRAME::ReCreateMenuBar()
  40. {
  41. SELECTION_TOOL* selTool = m_toolManager->GetTool<SELECTION_TOOL>();
  42. // wxWidgets handles the Mac Application menu behind the scenes, but that means
  43. // we always have to start from scratch with a new wxMenuBar.
  44. wxMenuBar* oldMenuBar = GetMenuBar();
  45. wxMenuBar* menuBar = new wxMenuBar();
  46. auto modifiedDocumentCondition = [this]( const SELECTION& sel ) {
  47. return !GetBoard()->Modules().empty() && GetScreen()->IsModify();
  48. };
  49. auto libraryPartCondition = [ this ] ( const SELECTION& sel ) {
  50. LIB_ID libId = getTargetFPID();
  51. const wxString& libName = libId.GetLibNickname();
  52. const wxString& partName = libId.GetLibItemName();
  53. return( !libName.IsEmpty() || !partName.IsEmpty() );
  54. };
  55. //-- File menu -----------------------------------------------
  56. //
  57. CONDITIONAL_MENU* fileMenu = new CONDITIONAL_MENU( false, selTool );
  58. fileMenu->AddItem( ID_MODEDIT_CREATE_NEW_LIB,
  59. _( "New Library..." ),
  60. _( "Creates an empty library" ),
  61. new_library_xpm, SELECTION_CONDITIONS::ShowAlways );
  62. fileMenu->AddItem( ID_MODEDIT_ADD_LIBRARY,
  63. _( "Add Library..." ),
  64. _( "Adds a previously created library" ),
  65. add_library_xpm, SELECTION_CONDITIONS::ShowAlways );
  66. fileMenu->AddItem( ID_MODEDIT_NEW_MODULE,
  67. AddHotkeyName( _( "&New Footprint..." ), m_hotkeysDescrList, HK_NEW ),
  68. _( "Create a new footprint" ),
  69. new_footprint_xpm, SELECTION_CONDITIONS::ShowAlways );
  70. #ifdef KICAD_SCRIPTING
  71. fileMenu->AddItem( ID_MODEDIT_NEW_MODULE_FROM_WIZARD,
  72. _( "&Create Footprint..." ),
  73. _( "Create a new footprint using the footprint wizard" ),
  74. module_wizard_xpm, SELECTION_CONDITIONS::ShowAlways );
  75. #endif
  76. fileMenu->AddSeparator();
  77. fileMenu->AddItem( ACTIONS::save, modifiedDocumentCondition );
  78. fileMenu->AddItem( ACTIONS::saveAs, libraryPartCondition );
  79. fileMenu->AddItem( ID_MODEDIT_REVERT_PART,
  80. _( "Revert" ),
  81. _( "Throw away changes" ),
  82. undo_xpm, modifiedDocumentCondition );
  83. fileMenu->AddSeparator();
  84. ACTION_MENU* submenuImport = new ACTION_MENU();
  85. submenuImport->SetTool( selTool );
  86. submenuImport->SetTitle( _( "Import" ) );
  87. submenuImport->SetIcon( import_xpm );
  88. submenuImport->Add( _( "&Footprint..." ),
  89. _( "Import a footprint from file" ),
  90. ID_MODEDIT_IMPORT_PART, import_module_xpm );
  91. submenuImport->Add( _( "&Graphics..." ),
  92. _( "Import 2D Drawing file to Footprint Editor on Drawings layer" ),
  93. ID_GEN_IMPORT_GRAPHICS_FILE, import_vector_xpm );
  94. fileMenu->AddMenu( submenuImport, SELECTION_CONDITIONS::ShowAlways );
  95. CONDITIONAL_MENU* submenuExport = new CONDITIONAL_MENU( false, selTool );
  96. submenuExport->SetTitle( _( "Export" ) );
  97. submenuExport->SetIcon( export_xpm );
  98. submenuExport->AddItem( ID_MODEDIT_EXPORT_PART, _( "&Footprint..." ),
  99. _( "Export current footprint to a file" ),
  100. export_module_xpm, modifiedDocumentCondition );
  101. submenuExport->AddItem( ID_MODEDIT_SAVE_PNG, _( "View as &PNG..." ),
  102. _( "Create a PNG file from the current view" ),
  103. plot_xpm, SELECTION_CONDITIONS::ShowAlways );
  104. fileMenu->AddMenu( submenuExport, SELECTION_CONDITIONS::ShowAlways );
  105. fileMenu->AddSeparator();
  106. fileMenu->AddItem( ACTIONS::print, SELECTION_CONDITIONS::ShowAlways );
  107. fileMenu->AddSeparator();
  108. // Don't use ACTIONS::quit; wxWidgets moves this on OSX and expects to find it via wxID_EXIT
  109. fileMenu->AddItem( wxID_EXIT, _( "Quit" ), "", exit_xpm, SELECTION_CONDITIONS::ShowAlways );
  110. //-- Edit menu -----------------------------------------------
  111. //
  112. CONDITIONAL_MENU* editMenu = new CONDITIONAL_MENU( false, selTool );
  113. auto enableUndoCondition = [ this ] ( const SELECTION& sel ) {
  114. return GetScreen() && GetScreen()->GetUndoCommandCount() > 0;
  115. };
  116. auto enableRedoCondition = [ this ] ( const SELECTION& sel ) {
  117. return GetScreen() && GetScreen()->GetRedoCommandCount() > 0;
  118. };
  119. auto noActiveToolCondition = [ this ] ( const SELECTION& aSelection ) {
  120. return GetToolId() == ID_NO_TOOL_SELECTED;
  121. };
  122. editMenu->AddItem( ACTIONS::undo, enableUndoCondition );
  123. editMenu->AddItem( ACTIONS::redo, enableRedoCondition );
  124. editMenu->AddSeparator();
  125. editMenu->AddItem( ACTIONS::cut, SELECTION_CONDITIONS::NotEmpty );
  126. editMenu->AddItem( ACTIONS::copy, SELECTION_CONDITIONS::NotEmpty );
  127. editMenu->AddItem( ACTIONS::paste, noActiveToolCondition );
  128. // Properties
  129. AddMenuItem( editMenu, ID_MODEDIT_EDIT_MODULE_PROPERTIES,
  130. _( "&Footprint Properties..." ),
  131. _( "Edit footprint properties" ),
  132. KiBitmap( module_options_xpm ) );
  133. AddMenuItem( editMenu, ID_MODEDIT_PAD_SETTINGS,
  134. _( "Default Pad Properties..." ),
  135. _( "Edit default pad properties" ),
  136. KiBitmap( options_pad_xpm ) );
  137. editMenu->AppendSeparator();
  138. AddMenuItem( editMenu, ID_MODEDIT_DELETE_PART,
  139. _( "&Delete Footprint from Library" ),
  140. _( "Delete the current footprint" ),
  141. KiBitmap( delete_xpm ) );
  142. //-- View menu -----------------------------------------------
  143. //
  144. CONDITIONAL_MENU* viewMenu = new CONDITIONAL_MENU( false, selTool );
  145. auto gridShownCondition = [ this ] ( const SELECTION& aSel ) {
  146. return IsGridVisible();
  147. };
  148. auto polarCoordsCondition = [ this ] ( const SELECTION& aSel ) {
  149. return GetShowPolarCoords();
  150. };
  151. auto imperialUnitsCondition = [ this ] ( const SELECTION& aSel ) {
  152. return GetUserUnits() == INCHES;
  153. };
  154. auto metricUnitsCondition = [ this ] ( const SELECTION& aSel ) {
  155. return GetUserUnits() == MILLIMETRES;
  156. };
  157. auto fullCrosshairCondition = [ this ] ( const SELECTION& aSel ) {
  158. return GetGalDisplayOptions().m_fullscreenCursor;
  159. };
  160. auto sketchPadsCondition = [ this ] ( const SELECTION& aSel ) {
  161. return !( (PCB_DISPLAY_OPTIONS*) GetDisplayOptions() )->m_DisplayPadFill;
  162. };
  163. auto sketchEdgesCondition = [ this ] ( const SELECTION& aSel ) {
  164. return !( (PCB_DISPLAY_OPTIONS*) GetDisplayOptions() )->m_DisplayModEdgeFill;
  165. };
  166. auto contrastModeCondition = [ this ] ( const SELECTION& aSel ) {
  167. return !( (PCB_DISPLAY_OPTIONS*) GetDisplayOptions() )->m_ContrastModeDisplay;
  168. };
  169. auto searchTreeShownCondition = [ this ] ( const SELECTION& aSel ) {
  170. return IsSearchTreeShown();
  171. };
  172. viewMenu->AddItem( ID_OPEN_MODULE_VIEWER,
  173. _( "Footprint &Library Browser" ),
  174. _( "Browse footprint libraries" ),
  175. modview_icon_xpm, SELECTION_CONDITIONS::ShowAlways );
  176. viewMenu->AddItem( ID_MENU_PCB_SHOW_3D_FRAME,
  177. AddHotkeyName( _( "&3D Viewer" ), m_hotkeysDescrList, HK_3D_VIEWER ),
  178. _( "Show footprint in 3D viewer" ),
  179. three_d_xpm, SELECTION_CONDITIONS::ShowAlways );
  180. viewMenu->AddSeparator();
  181. viewMenu->AddItem( ACTIONS::zoomInCenter, SELECTION_CONDITIONS::ShowAlways );
  182. viewMenu->AddItem( ACTIONS::zoomOutCenter, SELECTION_CONDITIONS::ShowAlways );
  183. viewMenu->AddItem( ACTIONS::zoomFitScreen, SELECTION_CONDITIONS::ShowAlways );
  184. viewMenu->AddItem( ACTIONS::zoomTool, SELECTION_CONDITIONS::ShowAlways );
  185. viewMenu->AddItem( ACTIONS::zoomRedraw, SELECTION_CONDITIONS::ShowAlways );
  186. viewMenu->AddSeparator();
  187. viewMenu->AddCheckItem( ACTIONS::toggleGrid, gridShownCondition );
  188. viewMenu->AddItem( ACTIONS::gridProperties, SELECTION_CONDITIONS::ShowAlways );
  189. viewMenu->AddCheckItem( PCB_ACTIONS::togglePolarCoords, polarCoordsCondition );
  190. // Units submenu
  191. CONDITIONAL_MENU* unitsSubMenu = new CONDITIONAL_MENU( false, selTool );
  192. unitsSubMenu->SetTitle( _( "&Units" ) );
  193. unitsSubMenu->SetIcon( unit_mm_xpm );
  194. unitsSubMenu->AddCheckItem( ACTIONS::imperialUnits, imperialUnitsCondition );
  195. unitsSubMenu->AddCheckItem( ACTIONS::metricUnits, metricUnitsCondition );
  196. viewMenu->AddMenu( unitsSubMenu );
  197. viewMenu->AddCheckItem( ACTIONS::toggleCursorStyle, fullCrosshairCondition );
  198. viewMenu->AddSeparator();
  199. // Drawing Mode Submenu
  200. CONDITIONAL_MENU* drawingModeSubMenu = new CONDITIONAL_MENU( false, selTool );
  201. drawingModeSubMenu->SetTitle( _( "&Drawing Mode" ) );
  202. drawingModeSubMenu->SetIcon( add_zone_xpm );
  203. drawingModeSubMenu->AddCheckItem( PCB_ACTIONS::padDisplayMode, sketchPadsCondition );
  204. drawingModeSubMenu->AddCheckItem( PCB_ACTIONS::moduleEdgeOutlines, sketchEdgesCondition );
  205. viewMenu->AddMenu( drawingModeSubMenu );
  206. // Contrast Mode Submenu
  207. CONDITIONAL_MENU* contrastModeSubMenu = new CONDITIONAL_MENU( false, selTool );
  208. contrastModeSubMenu->SetTitle( _( "&Contrast Mode" ) );
  209. contrastModeSubMenu->SetIcon( contrast_mode_xpm );
  210. contrastModeSubMenu->AddCheckItem( PCB_ACTIONS::highContrastMode, contrastModeCondition );
  211. contrastModeSubMenu->AddItem( PCB_ACTIONS::layerAlphaDec, SELECTION_CONDITIONS::ShowAlways );
  212. contrastModeSubMenu->AddItem( PCB_ACTIONS::layerAlphaInc, SELECTION_CONDITIONS::ShowAlways );
  213. viewMenu->AddMenu( contrastModeSubMenu );
  214. viewMenu->AddSeparator();
  215. viewMenu->AddCheckItem( ID_MODEDIT_SHOW_HIDE_SEARCH_TREE,
  216. _( "&Search Tree" ), _( "Toggles the search tree visibility" ),
  217. search_tree_xpm, searchTreeShownCondition );
  218. //-- Place menu -----------------------------------------------
  219. //
  220. CONDITIONAL_MENU* placeMenu = new CONDITIONAL_MENU( false, selTool );
  221. placeMenu->AddItem( PCB_ACTIONS::placePad, SELECTION_CONDITIONS::ShowAlways );
  222. placeMenu->AppendSeparator();
  223. placeMenu->AddItem( PCB_ACTIONS::placeText, SELECTION_CONDITIONS::ShowAlways );
  224. placeMenu->AddItem( PCB_ACTIONS::drawArc, SELECTION_CONDITIONS::ShowAlways );
  225. placeMenu->AddItem( PCB_ACTIONS::drawCircle, SELECTION_CONDITIONS::ShowAlways );
  226. placeMenu->AddItem( PCB_ACTIONS::drawLine, SELECTION_CONDITIONS::ShowAlways );
  227. placeMenu->AddItem( PCB_ACTIONS::drawPolygon, SELECTION_CONDITIONS::ShowAlways );
  228. placeMenu->AppendSeparator();
  229. placeMenu->AddItem( PCB_ACTIONS::setAnchor, SELECTION_CONDITIONS::ShowAlways );
  230. placeMenu->AddItem( ACTIONS::gridSetOrigin, SELECTION_CONDITIONS::ShowAlways );
  231. //-- Inspect menu -----------------------------------------------
  232. //
  233. wxMenu* inspectMenu = new wxMenu;
  234. AddMenuItem( inspectMenu, ID_MODEDIT_MEASUREMENT_TOOL,
  235. AddHotkeyName( _( "&Measure" ), m_hotkeysDescrList, HK_MEASURE_TOOL ),
  236. _( "Measure distance" ),
  237. KiBitmap( measurement_xpm ) );
  238. //-- Tools menu -----------------------------------------------
  239. //
  240. wxMenu* toolsMenu = new wxMenu;
  241. AddMenuItem( toolsMenu, ID_MODEDIT_LOAD_MODULE_FROM_BOARD,
  242. _( "&Load Footprint from PCB..." ),
  243. _( "Load a footprint from the current board into the editor" ),
  244. KiBitmap( load_module_board_xpm ) );
  245. AddMenuItem( toolsMenu, ID_ADD_FOOTPRINT_TO_BOARD,
  246. _( "&Insert Footprint on PCB" ),
  247. _( "Insert footprint onto current board" ),
  248. KiBitmap( insert_module_board_xpm ) );
  249. //-- Preferences menu -----------------------------------------------
  250. //
  251. CONDITIONAL_MENU* prefsMenu = new CONDITIONAL_MENU( false, selTool );
  252. auto acceleratedGraphicsCondition = [ this ] ( const SELECTION& aSel ) {
  253. return GetGalCanvas()->GetBackend() == EDA_DRAW_PANEL_GAL::GAL_TYPE_OPENGL;
  254. };
  255. auto standardGraphicsCondition = [ this ] ( const SELECTION& aSel ) {
  256. return GetGalCanvas()->GetBackend() == EDA_DRAW_PANEL_GAL::GAL_TYPE_CAIRO;
  257. };
  258. prefsMenu->AddItem( ID_PREFERENCES_CONFIGURE_PATHS, _( "&Configure Paths..." ),
  259. _( "Edit path configuration environment variables" ),
  260. path_xpm, SELECTION_CONDITIONS::ShowAlways );
  261. prefsMenu->AddItem( ID_PCB_LIB_TABLE_EDIT, _( "Manage &Footprint Libraries..." ),
  262. _( "Edit the global and project footprint library tables." ),
  263. library_table_xpm, SELECTION_CONDITIONS::ShowAlways );
  264. prefsMenu->AddItem( wxID_PREFERENCES,
  265. AddHotkeyName( _( "Preferences..." ), g_Module_Editor_Hotkeys_Descr, HK_PREFERENCES ),
  266. _( "Show preferences for all open tools" ),
  267. preference_xpm, SELECTION_CONDITIONS::ShowAlways );
  268. prefsMenu->AddSeparator();
  269. Pgm().AddMenuLanguageList( prefsMenu );
  270. prefsMenu->AddSeparator();
  271. prefsMenu->AddCheckItem( ACTIONS::acceleratedGraphics, acceleratedGraphicsCondition );
  272. prefsMenu->AddCheckItem( ACTIONS::standardGraphics, standardGraphicsCondition );
  273. //--MenuBar -----------------------------------------------------------
  274. //
  275. menuBar->Append( fileMenu, _( "&File" ) );
  276. menuBar->Append( editMenu, _( "&Edit" ) );
  277. menuBar->Append( viewMenu, _( "&View" ) );
  278. menuBar->Append( placeMenu, _( "&Place" ) );
  279. menuBar->Append( inspectMenu, _( "&Inspect" ) );
  280. menuBar->Append( toolsMenu, _( "&Tools" ) );
  281. menuBar->Append( prefsMenu, _( "P&references" ) );
  282. AddStandardHelpMenu( menuBar );
  283. SetMenuBar( menuBar );
  284. delete oldMenuBar;
  285. }