FlatCAMGUI.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. from gi.repository import Gtk
  2. from FlatCAM_GTK import FCNoteBook
  3. class FlatCAMGUI(Gtk.Window):
  4. MENU = """
  5. <ui>
  6. <menubar name='MenuBar'>
  7. <menu action='FileMenu'>
  8. <menuitem action='FileNew'>
  9. <separator />
  10. <menuitem action='FileQuit' />
  11. </menu>
  12. </menubar>
  13. <toolbar name='ToolBar'>
  14. <toolitem action='FileNewStandard' />
  15. <toolitem action='FileQuit' />
  16. </toolbar>
  17. </ui>
  18. """
  19. def __init__(self):
  20. """
  21. :return: The FlatCAM window.
  22. :rtype: FlatCAM
  23. """
  24. Gtk.Window.__init__(self, title="FlatCAM - 0.5")
  25. self.set_default_size(200, 200)
  26. vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
  27. ### Menu
  28. # action_group = Gtk.ActionGroup("my_actions")
  29. # self.add_file_menu_actions(action_group)
  30. # #self.add_edit_menu_actions(action_group)
  31. # #self.add_choices_menu_actions(action_group)
  32. #
  33. # uimanager = self.create_ui_manager()
  34. # uimanager.insert_action_group(action_group)
  35. #
  36. # menubar = uimanager.get_widget("/MenuBar")
  37. # vbox1.pack_start(menubar, False, False, 0)
  38. #
  39. # toolbar = uimanager.get_widget("/ToolBar")
  40. # vbox1.pack_start(toolbar, False, False, 0)
  41. menu = Gtk.MenuBar()
  42. ## File
  43. menufile = Gtk.MenuItem.new_with_label('File')
  44. menufile_menu = Gtk.Menu()
  45. menufile.set_submenu(menufile_menu)
  46. # New
  47. self.menufilenew = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_NEW, None)
  48. menufile_menu.append(self.menufilenew)
  49. menufile_menu.append(Gtk.SeparatorMenuItem())
  50. # Open recent
  51. self.menufilerecent = Gtk.ImageMenuItem("Open Recent", image=Gtk.Image(stock=Gtk.STOCK_OPEN))
  52. menufile_menu.append(self.menufilerecent)
  53. menufile_menu.append(Gtk.SeparatorMenuItem())
  54. # Open Gerber ...
  55. self.menufileopengerber = Gtk.ImageMenuItem("Open Gerber ...", image=Gtk.Image(stock=Gtk.STOCK_OPEN))
  56. menufile_menu.append(self.menufileopengerber)
  57. # Open Excellon ...
  58. self.menufileopenexcellon = Gtk.ImageMenuItem("Open Excellon ...", image=Gtk.Image(stock=Gtk.STOCK_OPEN))
  59. menufile_menu.append(self.menufileopenexcellon)
  60. # Open G-Code ...
  61. self.menufileopengcode = Gtk.ImageMenuItem("Open G-Code ...", image=Gtk.Image(stock=Gtk.STOCK_OPEN))
  62. menufile_menu.append(self.menufileopengcode)
  63. menufile_menu.append(Gtk.SeparatorMenuItem())
  64. # Open Project ...
  65. self.menufileopenproject = Gtk.ImageMenuItem("Open Project ...", image=Gtk.Image(stock=Gtk.STOCK_OPEN))
  66. menufile_menu.append(self.menufileopenproject)
  67. menufile_menu.append(Gtk.SeparatorMenuItem())
  68. # Save Project
  69. self.menufilesaveproject = Gtk.ImageMenuItem("Save Project", image=Gtk.Image(stock=Gtk.STOCK_SAVE))
  70. menufile_menu.append(self.menufilesaveproject)
  71. # Save Project As ...
  72. self.menufilesaveprojectas = Gtk.ImageMenuItem("Save Project As ...", image=Gtk.Image(stock=Gtk.STOCK_SAVE_AS))
  73. menufile_menu.append(self.menufilesaveprojectas)
  74. # Save Project Copy ...
  75. self.menufilesaveprojectcopy = Gtk.ImageMenuItem("Save Project Copy ...", image=Gtk.Image(stock=Gtk.STOCK_SAVE_AS))
  76. menufile_menu.append(self.menufilesaveprojectcopy)
  77. menufile_menu.append(Gtk.SeparatorMenuItem())
  78. # Save Defaults
  79. self.menufilesavedefaults = Gtk.ImageMenuItem("Save Defaults", image=Gtk.Image(stock=Gtk.STOCK_SAVE))
  80. menufile_menu.append(self.menufilesavedefaults)
  81. menufile_menu.append(Gtk.SeparatorMenuItem())
  82. # Quit
  83. self.menufilequit = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_QUIT, None)
  84. menufile_menu.append(self.menufilequit)
  85. menu.append(menufile)
  86. ## Edit
  87. menuedit = Gtk.MenuItem.new_with_label('Edit')
  88. menu.append(menuedit)
  89. menuedit_menu = Gtk.Menu()
  90. menuedit.set_submenu(menuedit_menu)
  91. # Delete
  92. self.menueditdelete = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_DELETE, None)
  93. menuedit_menu.append(self.menueditdelete)
  94. ## View
  95. menuview = Gtk.MenuItem.new_with_label('View')
  96. menu.append(menuview)
  97. menuview_menu = Gtk.Menu()
  98. menuview.set_submenu(menuview_menu)
  99. # Disable all plots
  100. self.menuviewdisableall = Gtk.ImageMenuItem("Disable all plots", image=Gtk.Image.new_from_file('share/clear_plot16.png'))
  101. menuview_menu.append(self.menuviewdisableall)
  102. self.menuviewdisableallbutthis = Gtk.ImageMenuItem("Disable all plots but this one", image=Gtk.Image.new_from_file('share/clear_plot16.png'))
  103. menuview_menu.append(self.menuviewdisableallbutthis)
  104. self.menuviewenableall = Gtk.ImageMenuItem("Enable all plots", image=Gtk.Image.new_from_file('share/replot16.png'))
  105. menuview_menu.append(self.menuviewenableall)
  106. ## Options
  107. menuoptions = Gtk.MenuItem.new_with_label('Options')
  108. menu.append(menuoptions)
  109. menuoptions_menu = Gtk.Menu()
  110. menuoptions.set_submenu(menuoptions_menu)
  111. # Transfer Options
  112. menutransferoptions = Gtk.ImageMenuItem("Transfer Options", image=Gtk.Image.new_from_file('share/copy16.png'))
  113. menuoptions_menu.append(menutransferoptions)
  114. menutransferoptions_menu = Gtk.Menu()
  115. menutransferoptions.set_submenu(menutransferoptions_menu)
  116. self.menutransferoptions_p2a = Gtk.ImageMenuItem("Project to App", image=Gtk.Image.new_from_file('share/copy16.png'))
  117. menutransferoptions_menu.append(self.menutransferoptions_p2a)
  118. self.menutransferoptions_a2p = Gtk.ImageMenuItem("App to Project", image=Gtk.Image.new_from_file('share/copy16.png'))
  119. menutransferoptions_menu.append(self.menutransferoptions_a2p)
  120. self.menutransferoptions_o2p = Gtk.ImageMenuItem("Object to Project", image=Gtk.Image.new_from_file('share/copy16.png'))
  121. menutransferoptions_menu.append(self.menutransferoptions_o2p)
  122. self.menutransferoptions_o2a = Gtk.ImageMenuItem("Object to App", image=Gtk.Image.new_from_file('share/copy16.png'))
  123. menutransferoptions_menu.append(self.menutransferoptions_o2a)
  124. self.menutransferoptions_p2o = Gtk.ImageMenuItem("Project to Object", image=Gtk.Image.new_from_file('share/copy16.png'))
  125. menutransferoptions_menu.append(self.menutransferoptions_p2o)
  126. self.menutransferoptions_a2o = Gtk.ImageMenuItem("App to Object", image=Gtk.Image.new_from_file('share/copy16.png'))
  127. menutransferoptions_menu.append(self.menutransferoptions_a2o)
  128. ## Tools
  129. menutools = Gtk.MenuItem.new_with_label('Tools')
  130. menu.append(menutools)
  131. menutools_menu = Gtk.Menu()
  132. menutools.set_submenu(menutools_menu)
  133. # Double Sided PCB tool
  134. self.menutools_dblsided = Gtk.ImageMenuItem("Double-Sided PCB Tool", image=Gtk.Image(stock=Gtk.STOCK_PREFERENCES))
  135. menutools_menu.append(self.menutools_dblsided)
  136. ## Help
  137. menuhelp = Gtk.MenuItem.new_with_label('Help')
  138. menu.append(menuhelp)
  139. menuhelp_menu = Gtk.Menu()
  140. menuhelp.set_submenu(menuhelp_menu)
  141. # About
  142. self.menuhelpabout = Gtk.ImageMenuItem("About", image=Gtk.Image(stock=Gtk.STOCK_ABOUT))
  143. menuhelp_menu.append(self.menuhelpabout)
  144. # Updates
  145. self.menuhelpupdates = Gtk.ImageMenuItem("Check for updates", image=Gtk.Image(stock=Gtk.STOCK_DIALOG_INFO))
  146. menuhelp_menu.append(self.menuhelpupdates)
  147. vbox1.pack_start(menu, False, False, 0)
  148. ### End of menu
  149. ###############
  150. ### Toolbar ###
  151. ###############
  152. self.toolbar = Gtk.Toolbar(toolbar_style=Gtk.ToolbarStyle.ICONS)
  153. vbox1.pack_start(self.toolbar, False, False, 0)
  154. # Zoom fit
  155. zf_ico = Gtk.Image.new_from_file('share/zoom_fit32.png')
  156. self.zoom_fit_btn = Gtk.ToolButton.new(zf_ico, "")
  157. #zoom_fit.connect("clicked", self.on_zoom_fit)
  158. self.zoom_fit_btn.set_tooltip_markup("Zoom Fit.\n(Click on plot and hit <b>1</b>)")
  159. self.toolbar.insert(self.zoom_fit_btn, -1)
  160. # Zoom out
  161. zo_ico = Gtk.Image.new_from_file('share/zoom_out32.png')
  162. self.zoom_out_btn = Gtk.ToolButton.new(zo_ico, "")
  163. #zoom_out.connect("clicked", self.on_zoom_out)
  164. self.zoom_out_btn.set_tooltip_markup("Zoom Out.\n(Click on plot and hit <b>2</b>)")
  165. self.toolbar.insert(self.zoom_out_btn, -1)
  166. # Zoom in
  167. zi_ico = Gtk.Image.new_from_file('share/zoom_in32.png')
  168. self.zoom_in_btn = Gtk.ToolButton.new(zi_ico, "")
  169. #zoom_in.connect("clicked", self.on_zoom_in)
  170. self.zoom_in_btn.set_tooltip_markup("Zoom In.\n(Click on plot and hit <b>3</b>)")
  171. self.toolbar.insert(self.zoom_in_btn, -1)
  172. # Clear plot
  173. cp_ico = Gtk.Image.new_from_file('share/clear_plot32.png')
  174. self.clear_plot_btn = Gtk.ToolButton.new(cp_ico, "")
  175. #clear_plot.connect("clicked", self.on_clear_plots)
  176. self.clear_plot_btn.set_tooltip_markup("Clear Plot")
  177. self.toolbar.insert(self.clear_plot_btn, -1)
  178. # Replot
  179. rp_ico = Gtk.Image.new_from_file('share/replot32.png')
  180. self.replot_btn = Gtk.ToolButton.new(rp_ico, "")
  181. #replot.connect("clicked", self.on_toolbar_replot)
  182. self.replot_btn.set_tooltip_markup("Re-plot all")
  183. self.toolbar.insert(self.replot_btn, -1)
  184. # Delete item
  185. del_ico = Gtk.Image.new_from_file('share/delete32.png')
  186. self.delete_btn = Gtk.ToolButton.new(del_ico, "")
  187. #delete.connect("clicked", self.on_delete)
  188. self.delete_btn.set_tooltip_markup("Delete selected\nobject.")
  189. self.toolbar.insert(self.delete_btn, -1)
  190. #############
  191. ### Paned ###
  192. #############
  193. hpane = Gtk.Paned.new(Gtk.Orientation.HORIZONTAL)
  194. vbox1.pack_start(hpane, expand=True, fill=True, padding=0)
  195. ################
  196. ### Notebook ###
  197. ################
  198. self.notebook = FCNoteBook()
  199. hpane.pack1(self.notebook)
  200. #################
  201. ### Plot area ###
  202. #################
  203. # self.plotarea = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
  204. self.plotarea = Gtk.Grid()
  205. self.plotarea_super = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
  206. self.plotarea_super.pack_start(self.plotarea, expand=True, fill=True, padding=0)
  207. hpane.pack2(self.plotarea_super)
  208. ################
  209. ### Info bar ###
  210. ################
  211. infobox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
  212. vbox1.pack_start(infobox, expand=False, fill=True, padding=0)
  213. ## Frame
  214. frame = Gtk.Frame(margin=2, hexpand=True, halign=0)
  215. infobox.pack_start(frame, expand=True, fill=True, padding=0)
  216. self.info_label = Gtk.Label("Not started.", margin=2, hexpand=True)
  217. frame.add(self.info_label)
  218. ## Coordinate Label
  219. self.position_label = Gtk.Label("X: 0.0 Y: 0.0", margin_left=4, margin_right=4)
  220. infobox.pack_start(self.position_label, expand=False, fill=False, padding=0)
  221. ## Units label
  222. self.units_label = Gtk.Label("[in]", margin_left=4, margin_right=4)
  223. infobox.pack_start(self.units_label, expand=False, fill=False, padding=0)
  224. ## Progress bar
  225. self.progress_bar = Gtk.ProgressBar(margin=2)
  226. infobox.pack_start(self.progress_bar, expand=False, fill=False, padding=0)
  227. self.add(vbox1)
  228. self.show_all()
  229. # def create_ui_manager(self):
  230. # uimanager = Gtk.UIManager()
  231. #
  232. # # Throws exception if something went wrong
  233. # uimanager.add_ui_from_string(FlatCAM.MENU)
  234. #
  235. # # Add the accelerator group to the toplevel window
  236. # accelgroup = uimanager.get_accel_group()
  237. # self.add_accel_group(accelgroup)
  238. # return uimanager
  239. #
  240. # def add_file_menu_actions(self, action_group):
  241. # action_filemenu = Gtk.Action("FileMenu", "File", None, None)
  242. # action_group.add_action(action_filemenu)
  243. #
  244. # action_filenewmenu = Gtk.Action("FileNew", None, None, Gtk.STOCK_NEW)
  245. # action_group.add_action(action_filenewmenu)
  246. #
  247. # action_new = Gtk.Action("FileNewStandard", "_New",
  248. # "Create a new file", Gtk.STOCK_NEW)
  249. # action_new.connect("activate", self.on_menu_file_new_generic)
  250. # action_group.add_action_with_accel(action_new, None)
  251. #
  252. # action_group.add_actions([
  253. # ("FileNewFoo", None, "New Foo", None, "Create new foo",
  254. # self.on_menu_file_new_generic),
  255. # ("FileNewGoo", None, "_New Goo", None, "Create new goo",
  256. # self.on_menu_file_new_generic),
  257. # ])
  258. #
  259. # action_filequit = Gtk.Action("FileQuit", None, None, Gtk.STOCK_QUIT)
  260. # action_filequit.connect("activate", self.on_menu_file_quit)
  261. # action_group.add_action(action_filequit)
  262. #
  263. # def on_menu_file_new_generic(self, widget):
  264. # print("A File|New menu item was selected.")
  265. #
  266. # def on_menu_file_quit(self, widget):
  267. # Gtk.main_quit()
  268. if __name__ == "__main__":
  269. flatcam = FlatCAMGUI()
  270. Gtk.main()