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.

355 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. fileMenu->Resolve();
  111. //-- Edit menu -------------------------------------------------------
  112. //
  113. CONDITIONAL_MENU* editMenu = new CONDITIONAL_MENU( false, selTool );
  114. auto enableUndoCondition = [ this ] ( const SELECTION& sel ) {
  115. return GetScreen() && GetScreen()->GetUndoCommandCount() > 0;
  116. };
  117. auto enableRedoCondition = [ this ] ( const SELECTION& sel ) {
  118. return GetScreen() && GetScreen()->GetRedoCommandCount() > 0;
  119. };
  120. auto noActiveToolCondition = [ this ] ( const SELECTION& aSelection ) {
  121. return GetToolId() == ID_NO_TOOL_SELECTED;
  122. };
  123. editMenu->AddItem( ACTIONS::undo, enableUndoCondition );
  124. editMenu->AddItem( ACTIONS::redo, enableRedoCondition );
  125. editMenu->AddSeparator();
  126. editMenu->AddItem( ACTIONS::cut, SELECTION_CONDITIONS::NotEmpty );
  127. editMenu->AddItem( ACTIONS::copy, SELECTION_CONDITIONS::NotEmpty );
  128. editMenu->AddItem( ACTIONS::paste, noActiveToolCondition );
  129. // Properties
  130. AddMenuItem( editMenu, ID_MODEDIT_EDIT_MODULE_PROPERTIES,
  131. _( "&Footprint Properties..." ),
  132. _( "Edit footprint properties" ),
  133. KiBitmap( module_options_xpm ) );
  134. AddMenuItem( editMenu, ID_MODEDIT_PAD_SETTINGS,
  135. _( "Default Pad Properties..." ),
  136. _( "Edit default pad properties" ),
  137. KiBitmap( options_pad_xpm ) );
  138. editMenu->AppendSeparator();
  139. AddMenuItem( editMenu, ID_MODEDIT_DELETE_PART,
  140. _( "&Delete Footprint from Library" ),
  141. _( "Delete the current footprint" ),
  142. KiBitmap( delete_xpm ) );
  143. editMenu->Resolve();
  144. //-- View menu -------------------------------------------------------
  145. //
  146. CONDITIONAL_MENU* viewMenu = new CONDITIONAL_MENU( false, selTool );
  147. auto gridShownCondition = [ this ] ( const SELECTION& aSel ) {
  148. return IsGridVisible();
  149. };
  150. auto polarCoordsCondition = [ this ] ( const SELECTION& aSel ) {
  151. return GetShowPolarCoords();
  152. };
  153. auto imperialUnitsCondition = [ this ] ( const SELECTION& aSel ) {
  154. return GetUserUnits() == INCHES;
  155. };
  156. auto metricUnitsCondition = [ this ] ( const SELECTION& aSel ) {
  157. return GetUserUnits() == MILLIMETRES;
  158. };
  159. auto fullCrosshairCondition = [ this ] ( const SELECTION& aSel ) {
  160. return GetGalDisplayOptions().m_fullscreenCursor;
  161. };
  162. auto sketchPadsCondition = [ this ] ( const SELECTION& aSel ) {
  163. return !( (PCB_DISPLAY_OPTIONS*) GetDisplayOptions() )->m_DisplayPadFill;
  164. };
  165. auto sketchEdgesCondition = [ this ] ( const SELECTION& aSel ) {
  166. return !( (PCB_DISPLAY_OPTIONS*) GetDisplayOptions() )->m_DisplayModEdgeFill;
  167. };
  168. auto contrastModeCondition = [ this ] ( const SELECTION& aSel ) {
  169. return !( (PCB_DISPLAY_OPTIONS*) GetDisplayOptions() )->m_ContrastModeDisplay;
  170. };
  171. auto searchTreeShownCondition = [ this ] ( const SELECTION& aSel ) {
  172. return IsSearchTreeShown();
  173. };
  174. viewMenu->AddItem( ID_OPEN_MODULE_VIEWER,
  175. _( "Footprint &Library Browser" ),
  176. _( "Browse footprint libraries" ),
  177. modview_icon_xpm, SELECTION_CONDITIONS::ShowAlways );
  178. viewMenu->AddItem( ACTIONS::show3DViewer, SELECTION_CONDITIONS::ShowAlways );
  179. viewMenu->AddSeparator();
  180. viewMenu->AddItem( ACTIONS::zoomInCenter, SELECTION_CONDITIONS::ShowAlways );
  181. viewMenu->AddItem( ACTIONS::zoomOutCenter, SELECTION_CONDITIONS::ShowAlways );
  182. viewMenu->AddItem( ACTIONS::zoomFitScreen, SELECTION_CONDITIONS::ShowAlways );
  183. viewMenu->AddItem( ACTIONS::zoomTool, SELECTION_CONDITIONS::ShowAlways );
  184. viewMenu->AddItem( ACTIONS::zoomRedraw, SELECTION_CONDITIONS::ShowAlways );
  185. viewMenu->AddSeparator();
  186. viewMenu->AddCheckItem( ACTIONS::toggleGrid, gridShownCondition );
  187. viewMenu->AddItem( ACTIONS::gridProperties, SELECTION_CONDITIONS::ShowAlways );
  188. viewMenu->AddCheckItem( PCB_ACTIONS::togglePolarCoords, polarCoordsCondition );
  189. // Units submenu
  190. CONDITIONAL_MENU* unitsSubMenu = new CONDITIONAL_MENU( false, selTool );
  191. unitsSubMenu->SetTitle( _( "&Units" ) );
  192. unitsSubMenu->SetIcon( unit_mm_xpm );
  193. unitsSubMenu->AddCheckItem( ACTIONS::imperialUnits, imperialUnitsCondition );
  194. unitsSubMenu->AddCheckItem( ACTIONS::metricUnits, metricUnitsCondition );
  195. viewMenu->AddMenu( unitsSubMenu );
  196. viewMenu->AddCheckItem( ACTIONS::toggleCursorStyle, fullCrosshairCondition );
  197. viewMenu->AddSeparator();
  198. // Drawing Mode Submenu
  199. CONDITIONAL_MENU* drawingModeSubMenu = new CONDITIONAL_MENU( false, selTool );
  200. drawingModeSubMenu->SetTitle( _( "&Drawing Mode" ) );
  201. drawingModeSubMenu->SetIcon( add_zone_xpm );
  202. drawingModeSubMenu->AddCheckItem( PCB_ACTIONS::padDisplayMode, sketchPadsCondition );
  203. drawingModeSubMenu->AddCheckItem( PCB_ACTIONS::moduleEdgeOutlines, sketchEdgesCondition );
  204. viewMenu->AddMenu( drawingModeSubMenu );
  205. // Contrast Mode Submenu
  206. CONDITIONAL_MENU* contrastModeSubMenu = new CONDITIONAL_MENU( false, selTool );
  207. contrastModeSubMenu->SetTitle( _( "&Contrast Mode" ) );
  208. contrastModeSubMenu->SetIcon( contrast_mode_xpm );
  209. contrastModeSubMenu->AddCheckItem( ACTIONS::highContrastMode, contrastModeCondition );
  210. contrastModeSubMenu->AddItem( PCB_ACTIONS::layerAlphaDec, SELECTION_CONDITIONS::ShowAlways );
  211. contrastModeSubMenu->AddItem( PCB_ACTIONS::layerAlphaInc, SELECTION_CONDITIONS::ShowAlways );
  212. viewMenu->AddMenu( contrastModeSubMenu );
  213. viewMenu->AddSeparator();
  214. viewMenu->AddCheckItem( ID_MODEDIT_SHOW_HIDE_SEARCH_TREE,
  215. _( "&Search Tree" ), _( "Toggles the search tree visibility" ),
  216. search_tree_xpm, searchTreeShownCondition );
  217. viewMenu->Resolve();
  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. placeMenu->Resolve();
  232. //-- Inspect menu -------------------------------------------------------
  233. //
  234. wxMenu* inspectMenu = new wxMenu;
  235. AddMenuItem( inspectMenu, ID_MODEDIT_MEASUREMENT_TOOL,
  236. AddHotkeyName( _( "&Measure" ), m_hotkeysDescrList, HK_MEASURE_TOOL ),
  237. _( "Measure distance" ),
  238. KiBitmap( measurement_xpm ) );
  239. //-- Tools menu -------------------------------------------------------
  240. //
  241. wxMenu* toolsMenu = new wxMenu;
  242. AddMenuItem( toolsMenu, ID_MODEDIT_LOAD_MODULE_FROM_BOARD,
  243. _( "&Load Footprint from PCB..." ),
  244. _( "Load a footprint from the current board into the editor" ),
  245. KiBitmap( load_module_board_xpm ) );
  246. AddMenuItem( toolsMenu, ID_ADD_FOOTPRINT_TO_BOARD,
  247. _( "&Insert Footprint on PCB" ),
  248. _( "Insert footprint onto current board" ),
  249. KiBitmap( insert_module_board_xpm ) );
  250. //-- Preferences menu -------------------------------------------------
  251. //
  252. CONDITIONAL_MENU* prefsMenu = new CONDITIONAL_MENU( false, selTool );
  253. auto acceleratedGraphicsCondition = [ this ] ( const SELECTION& aSel ) {
  254. return GetGalCanvas()->GetBackend() == EDA_DRAW_PANEL_GAL::GAL_TYPE_OPENGL;
  255. };
  256. auto standardGraphicsCondition = [ this ] ( const SELECTION& aSel ) {
  257. return GetGalCanvas()->GetBackend() == EDA_DRAW_PANEL_GAL::GAL_TYPE_CAIRO;
  258. };
  259. prefsMenu->AddItem( ID_PREFERENCES_CONFIGURE_PATHS, _( "&Configure Paths..." ),
  260. _( "Edit path configuration environment variables" ),
  261. path_xpm, SELECTION_CONDITIONS::ShowAlways );
  262. prefsMenu->AddItem( ID_PCB_LIB_TABLE_EDIT, _( "Manage &Footprint Libraries..." ),
  263. _( "Edit the global and project footprint library tables." ),
  264. library_table_xpm, SELECTION_CONDITIONS::ShowAlways );
  265. prefsMenu->AddItem( wxID_PREFERENCES,
  266. AddHotkeyName( _( "Preferences..." ), g_Module_Editor_Hotkeys_Descr, HK_PREFERENCES ),
  267. _( "Show preferences for all open tools" ),
  268. preference_xpm, SELECTION_CONDITIONS::ShowAlways );
  269. prefsMenu->AddSeparator();
  270. Pgm().AddMenuLanguageList( prefsMenu );
  271. prefsMenu->AddSeparator();
  272. prefsMenu->AddCheckItem( ACTIONS::acceleratedGraphics, acceleratedGraphicsCondition );
  273. prefsMenu->AddCheckItem( ACTIONS::standardGraphics, standardGraphicsCondition );
  274. prefsMenu->Resolve();
  275. //--MenuBar -----------------------------------------------------------
  276. //
  277. menuBar->Append( fileMenu, _( "&File" ) );
  278. menuBar->Append( editMenu, _( "&Edit" ) );
  279. menuBar->Append( viewMenu, _( "&View" ) );
  280. menuBar->Append( placeMenu, _( "&Place" ) );
  281. menuBar->Append( inspectMenu, _( "&Inspect" ) );
  282. menuBar->Append( toolsMenu, _( "&Tools" ) );
  283. menuBar->Append( prefsMenu, _( "P&references" ) );
  284. AddStandardHelpMenu( menuBar );
  285. SetMenuBar( menuBar );
  286. delete oldMenuBar;
  287. }