PreferencesUIManager.py 75 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208
  1. import os
  2. from PyQt5 import QtGui, QtCore, QtWidgets
  3. from PyQt5.QtCore import QSettings
  4. from defaults import FlatCAMDefaults
  5. import logging
  6. import gettext
  7. import appTranslation as fcTranslate
  8. import builtins
  9. fcTranslate.apply_language('strings')
  10. if '_' not in builtins.__dict__:
  11. _ = gettext.gettext
  12. settings = QSettings("Open Source", "FlatCAM")
  13. if settings.contains("machinist"):
  14. machinist_setting = settings.value('machinist', type=int)
  15. else:
  16. machinist_setting = 0
  17. log = logging.getLogger('base2')
  18. class PreferencesUIManager:
  19. def __init__(self, defaults: FlatCAMDefaults, data_path: str, ui, inform):
  20. """
  21. Class that control the Preferences Tab
  22. :param defaults: a dictionary storage where all the application settings are stored
  23. :param data_path: a path to the file where all the preferences are stored for persistence
  24. :param ui: reference to the MainGUI class which constructs the UI
  25. :param inform: a pyqtSignal used to display information's in the StatusBar of the GUI
  26. """
  27. self.defaults = defaults
  28. self.data_path = data_path
  29. self.ui = ui
  30. self.inform = inform
  31. self.ignore_tab_close_event = False
  32. # if Preferences are changed in the Edit -> Preferences tab the value will be set to True
  33. self.preferences_changed_flag = False
  34. self.old_color = QtGui.QColor('black')
  35. # when adding entries here read the comments in the method found below named:
  36. # def app_obj.new_object(self, kind, name, initialize, active=True, fit=True, plot=True)
  37. self.defaults_form_fields = {
  38. # General App
  39. "decimals_inch": self.ui.general_defaults_form.general_app_group.precision_inch_entry,
  40. "decimals_metric": self.ui.general_defaults_form.general_app_group.precision_metric_entry,
  41. "units": self.ui.general_defaults_form.general_app_group.units_radio,
  42. "global_graphic_engine": self.ui.general_defaults_form.general_app_group.ge_radio,
  43. "global_app_level": self.ui.general_defaults_form.general_app_group.app_level_radio,
  44. "global_portable": self.ui.general_defaults_form.general_app_group.portability_cb,
  45. "global_language": self.ui.general_defaults_form.general_app_group.language_cb,
  46. "global_systray_icon": self.ui.general_defaults_form.general_app_group.systray_cb,
  47. "global_shell_at_startup": self.ui.general_defaults_form.general_app_group.shell_startup_cb,
  48. "global_project_at_startup": self.ui.general_defaults_form.general_app_group.project_startup_cb,
  49. "global_version_check": self.ui.general_defaults_form.general_app_group.version_check_cb,
  50. "global_send_stats": self.ui.general_defaults_form.general_app_group.send_stats_cb,
  51. "global_worker_number": self.ui.general_defaults_form.general_app_group.worker_number_sb,
  52. "global_tolerance": self.ui.general_defaults_form.general_app_group.tol_entry,
  53. "global_compression_level": self.ui.general_defaults_form.general_app_group.compress_spinner,
  54. "global_save_compressed": self.ui.general_defaults_form.general_app_group.save_type_cb,
  55. "global_autosave": self.ui.general_defaults_form.general_app_group.autosave_cb,
  56. "global_autosave_timeout": self.ui.general_defaults_form.general_app_group.autosave_entry,
  57. "global_tpdf_tmargin": self.ui.general_defaults_form.general_app_group.tmargin_entry,
  58. "global_tpdf_bmargin": self.ui.general_defaults_form.general_app_group.bmargin_entry,
  59. "global_tpdf_lmargin": self.ui.general_defaults_form.general_app_group.lmargin_entry,
  60. "global_tpdf_rmargin": self.ui.general_defaults_form.general_app_group.rmargin_entry,
  61. # General GUI Preferences
  62. "global_theme": self.ui.general_defaults_form.general_gui_group.theme_radio,
  63. "global_gray_icons": self.ui.general_defaults_form.general_gui_group.gray_icons_cb,
  64. "global_layout": self.ui.general_defaults_form.general_gui_group.layout_combo,
  65. "global_hover": self.ui.general_defaults_form.general_gui_group.hover_cb,
  66. "global_selection_shape": self.ui.general_defaults_form.general_gui_group.selection_cb,
  67. "global_sel_fill": self.ui.general_defaults_form.general_gui_group.sf_color_entry,
  68. "global_sel_line": self.ui.general_defaults_form.general_gui_group.sl_color_entry,
  69. "global_alt_sel_fill": self.ui.general_defaults_form.general_gui_group.alt_sf_color_entry,
  70. "global_alt_sel_line": self.ui.general_defaults_form.general_gui_group.alt_sl_color_entry,
  71. "global_draw_color": self.ui.general_defaults_form.general_gui_group.draw_color_entry,
  72. "global_sel_draw_color": self.ui.general_defaults_form.general_gui_group.sel_draw_color_entry,
  73. "global_proj_item_color": self.ui.general_defaults_form.general_gui_group.proj_color_entry,
  74. "global_proj_item_dis_color": self.ui.general_defaults_form.general_gui_group.proj_color_dis_entry,
  75. "global_project_autohide": self.ui.general_defaults_form.general_gui_group.project_autohide_cb,
  76. # General APP Settings
  77. "global_gridx": self.ui.general_defaults_form.general_app_set_group.gridx_entry,
  78. "global_gridy": self.ui.general_defaults_form.general_app_set_group.gridy_entry,
  79. "global_snap_max": self.ui.general_defaults_form.general_app_set_group.snap_max_dist_entry,
  80. "global_workspace": self.ui.general_defaults_form.general_app_set_group.workspace_cb,
  81. "global_workspaceT": self.ui.general_defaults_form.general_app_set_group.wk_cb,
  82. "global_workspace_orientation": self.ui.general_defaults_form.general_app_set_group.wk_orientation_radio,
  83. "global_cursor_type": self.ui.general_defaults_form.general_app_set_group.cursor_radio,
  84. "global_cursor_size": self.ui.general_defaults_form.general_app_set_group.cursor_size_entry,
  85. "global_cursor_width": self.ui.general_defaults_form.general_app_set_group.cursor_width_entry,
  86. "global_cursor_color_enabled": self.ui.general_defaults_form.general_app_set_group.mouse_cursor_color_cb,
  87. "global_cursor_color": self.ui.general_defaults_form.general_app_set_group.mouse_cursor_entry,
  88. "global_pan_button": self.ui.general_defaults_form.general_app_set_group.pan_button_radio,
  89. "global_mselect_key": self.ui.general_defaults_form.general_app_set_group.mselect_radio,
  90. "global_delete_confirmation": self.ui.general_defaults_form.general_app_set_group.delete_conf_cb,
  91. "global_allow_edit_in_project_tab": self.ui.general_defaults_form.general_app_set_group.allow_edit_cb,
  92. "global_open_style": self.ui.general_defaults_form.general_app_set_group.open_style_cb,
  93. "global_toggle_tooltips": self.ui.general_defaults_form.general_app_set_group.toggle_tooltips_cb,
  94. "global_machinist_setting": self.ui.general_defaults_form.general_app_set_group.machinist_cb,
  95. "global_bookmarks_limit": self.ui.general_defaults_form.general_app_set_group.bm_limit_spinner,
  96. "global_activity_icon": self.ui.general_defaults_form.general_app_set_group.activity_combo,
  97. # Gerber General
  98. "gerber_plot": self.ui.gerber_defaults_form.gerber_gen_group.plot_cb,
  99. "gerber_solid": self.ui.gerber_defaults_form.gerber_gen_group.solid_cb,
  100. "gerber_multicolored": self.ui.gerber_defaults_form.gerber_gen_group.multicolored_cb,
  101. "gerber_store_color_list": self.ui.gerber_defaults_form.gerber_gen_group.store_colors_cb,
  102. "gerber_circle_steps": self.ui.gerber_defaults_form.gerber_gen_group.circle_steps_entry,
  103. "gerber_def_units": self.ui.gerber_defaults_form.gerber_gen_group.gerber_units_radio,
  104. "gerber_def_zeros": self.ui.gerber_defaults_form.gerber_gen_group.gerber_zeros_radio,
  105. "gerber_clean_apertures": self.ui.gerber_defaults_form.gerber_gen_group.gerber_clean_cb,
  106. "gerber_extra_buffering": self.ui.gerber_defaults_form.gerber_gen_group.gerber_extra_buffering,
  107. "gerber_plot_fill": self.ui.gerber_defaults_form.gerber_gen_group.fill_color_entry,
  108. "gerber_plot_line": self.ui.gerber_defaults_form.gerber_gen_group.line_color_entry,
  109. # Gerber Options
  110. "gerber_noncoppermargin": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_margin_entry,
  111. "gerber_noncopperrounded": self.ui.gerber_defaults_form.gerber_opt_group.noncopper_rounded_cb,
  112. "gerber_bboxmargin": self.ui.gerber_defaults_form.gerber_opt_group.bbmargin_entry,
  113. "gerber_bboxrounded": self.ui.gerber_defaults_form.gerber_opt_group.bbrounded_cb,
  114. # Gerber Advanced Options
  115. "gerber_aperture_display": self.ui.gerber_defaults_form.gerber_adv_opt_group.aperture_table_visibility_cb,
  116. # "gerber_aperture_scale_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.scale_aperture_entry,
  117. # "gerber_aperture_buffer_factor": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffer_aperture_entry,
  118. "gerber_follow": self.ui.gerber_defaults_form.gerber_adv_opt_group.follow_cb,
  119. "gerber_buffering": self.ui.gerber_defaults_form.gerber_adv_opt_group.buffering_radio,
  120. "gerber_delayed_buffering": self.ui.gerber_defaults_form.gerber_adv_opt_group.delayed_buffer_cb,
  121. "gerber_simplification": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplify_cb,
  122. "gerber_simp_tolerance": self.ui.gerber_defaults_form.gerber_adv_opt_group.simplification_tol_spinner,
  123. # Gerber Export
  124. "gerber_exp_units": self.ui.gerber_defaults_form.gerber_exp_group.gerber_units_radio,
  125. "gerber_exp_integer": self.ui.gerber_defaults_form.gerber_exp_group.format_whole_entry,
  126. "gerber_exp_decimals": self.ui.gerber_defaults_form.gerber_exp_group.format_dec_entry,
  127. "gerber_exp_zeros": self.ui.gerber_defaults_form.gerber_exp_group.zeros_radio,
  128. # Gerber Editor
  129. "gerber_editor_sel_limit": self.ui.gerber_defaults_form.gerber_editor_group.sel_limit_entry,
  130. "gerber_editor_newcode": self.ui.gerber_defaults_form.gerber_editor_group.addcode_entry,
  131. "gerber_editor_newsize": self.ui.gerber_defaults_form.gerber_editor_group.addsize_entry,
  132. "gerber_editor_newtype": self.ui.gerber_defaults_form.gerber_editor_group.addtype_combo,
  133. "gerber_editor_newdim": self.ui.gerber_defaults_form.gerber_editor_group.adddim_entry,
  134. "gerber_editor_array_size": self.ui.gerber_defaults_form.gerber_editor_group.grb_array_size_entry,
  135. "gerber_editor_lin_axis": self.ui.gerber_defaults_form.gerber_editor_group.grb_axis_radio,
  136. "gerber_editor_lin_pitch": self.ui.gerber_defaults_form.gerber_editor_group.grb_pitch_entry,
  137. "gerber_editor_lin_angle": self.ui.gerber_defaults_form.gerber_editor_group.grb_angle_entry,
  138. "gerber_editor_circ_dir": self.ui.gerber_defaults_form.gerber_editor_group.grb_circular_dir_radio,
  139. "gerber_editor_circ_angle":
  140. self.ui.gerber_defaults_form.gerber_editor_group.grb_circular_angle_entry,
  141. "gerber_editor_scale_f": self.ui.gerber_defaults_form.gerber_editor_group.grb_scale_entry,
  142. "gerber_editor_buff_f": self.ui.gerber_defaults_form.gerber_editor_group.grb_buff_entry,
  143. "gerber_editor_ma_low": self.ui.gerber_defaults_form.gerber_editor_group.grb_ma_low_entry,
  144. "gerber_editor_ma_high": self.ui.gerber_defaults_form.gerber_editor_group.grb_ma_high_entry,
  145. # Excellon General
  146. "excellon_plot": self.ui.excellon_defaults_form.excellon_gen_group.plot_cb,
  147. "excellon_solid": self.ui.excellon_defaults_form.excellon_gen_group.solid_cb,
  148. "excellon_multicolored": self.ui.excellon_defaults_form.excellon_gen_group.multicolored_cb,
  149. "excellon_merge_fuse_tools": self.ui.excellon_defaults_form.excellon_gen_group.fuse_tools_cb,
  150. "excellon_format_upper_in":
  151. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry,
  152. "excellon_format_lower_in":
  153. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry,
  154. "excellon_format_upper_mm":
  155. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry,
  156. "excellon_format_lower_mm":
  157. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry,
  158. "excellon_zeros": self.ui.excellon_defaults_form.excellon_gen_group.excellon_zeros_radio,
  159. "excellon_units": self.ui.excellon_defaults_form.excellon_gen_group.excellon_units_radio,
  160. "excellon_update": self.ui.excellon_defaults_form.excellon_gen_group.update_excellon_cb,
  161. "excellon_optimization_type": self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio,
  162. "excellon_search_time": self.ui.excellon_defaults_form.excellon_gen_group.optimization_time_entry,
  163. "excellon_plot_fill": self.ui.excellon_defaults_form.excellon_gen_group.fill_color_entry,
  164. "excellon_plot_line": self.ui.excellon_defaults_form.excellon_gen_group.line_color_entry,
  165. # Excellon Options
  166. "excellon_operation": self.ui.excellon_defaults_form.excellon_opt_group.operation_radio,
  167. "excellon_milling_type": self.ui.excellon_defaults_form.excellon_opt_group.milling_type_radio,
  168. "excellon_milling_dia": self.ui.excellon_defaults_form.excellon_opt_group.mill_dia_entry,
  169. "excellon_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.tooldia_entry,
  170. "excellon_slot_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.slot_tooldia_entry,
  171. # Excellon Advanced Options
  172. "excellon_tools_table_display": self.ui.excellon_defaults_form.excellon_adv_opt_group.table_visibility_cb,
  173. "excellon_autoload_db": self.ui.excellon_defaults_form.excellon_adv_opt_group.autoload_db_cb,
  174. # Excellon Export
  175. "excellon_exp_units": self.ui.excellon_defaults_form.excellon_exp_group.excellon_units_radio,
  176. "excellon_exp_format": self.ui.excellon_defaults_form.excellon_exp_group.format_radio,
  177. "excellon_exp_integer": self.ui.excellon_defaults_form.excellon_exp_group.format_whole_entry,
  178. "excellon_exp_decimals": self.ui.excellon_defaults_form.excellon_exp_group.format_dec_entry,
  179. "excellon_exp_zeros": self.ui.excellon_defaults_form.excellon_exp_group.zeros_radio,
  180. "excellon_exp_slot_type": self.ui.excellon_defaults_form.excellon_exp_group.slot_type_radio,
  181. # Excellon Editor
  182. "excellon_editor_sel_limit": self.ui.excellon_defaults_form.excellon_editor_group.sel_limit_entry,
  183. "excellon_editor_newdia": self.ui.excellon_defaults_form.excellon_editor_group.addtool_entry,
  184. "excellon_editor_array_size": self.ui.excellon_defaults_form.excellon_editor_group.drill_array_size_entry,
  185. "excellon_editor_lin_dir": self.ui.excellon_defaults_form.excellon_editor_group.drill_axis_radio,
  186. "excellon_editor_lin_pitch": self.ui.excellon_defaults_form.excellon_editor_group.drill_pitch_entry,
  187. "excellon_editor_lin_angle": self.ui.excellon_defaults_form.excellon_editor_group.drill_angle_entry,
  188. "excellon_editor_circ_dir": self.ui.excellon_defaults_form.excellon_editor_group.drill_circular_dir_radio,
  189. "excellon_editor_circ_angle":
  190. self.ui.excellon_defaults_form.excellon_editor_group.drill_circular_angle_entry,
  191. # Excellon Slots
  192. "excellon_editor_slot_direction":
  193. self.ui.excellon_defaults_form.excellon_editor_group.slot_axis_radio,
  194. "excellon_editor_slot_angle":
  195. self.ui.excellon_defaults_form.excellon_editor_group.slot_angle_spinner,
  196. "excellon_editor_slot_length":
  197. self.ui.excellon_defaults_form.excellon_editor_group.slot_length_entry,
  198. # Excellon Slots
  199. "excellon_editor_slot_array_size":
  200. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_size_entry,
  201. "excellon_editor_slot_lin_dir": self.ui.excellon_defaults_form.excellon_editor_group.slot_array_axis_radio,
  202. "excellon_editor_slot_lin_pitch":
  203. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_pitch_entry,
  204. "excellon_editor_slot_lin_angle":
  205. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_angle_entry,
  206. "excellon_editor_slot_circ_dir":
  207. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_dir_radio,
  208. "excellon_editor_slot_circ_angle":
  209. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_angle_entry,
  210. # Geometry General
  211. "geometry_plot": self.ui.geometry_defaults_form.geometry_gen_group.plot_cb,
  212. "geometry_multicolored": self.ui.geometry_defaults_form.geometry_gen_group.multicolored_cb,
  213. "geometry_circle_steps": self.ui.geometry_defaults_form.geometry_gen_group.circle_steps_entry,
  214. "geometry_cnctooldia": self.ui.geometry_defaults_form.geometry_gen_group.cnctooldia_entry,
  215. "geometry_merge_fuse_tools": self.ui.geometry_defaults_form.geometry_gen_group.fuse_tools_cb,
  216. "geometry_plot_line": self.ui.geometry_defaults_form.geometry_gen_group.line_color_entry,
  217. "geometry_optimization_type": self.ui.geometry_defaults_form.geometry_gen_group.opt_algorithm_radio,
  218. "geometry_search_time": self.ui.geometry_defaults_form.geometry_gen_group.optimization_time_entry,
  219. # Geometry Options
  220. "geometry_cutz": self.ui.geometry_defaults_form.geometry_opt_group.cutz_entry,
  221. "geometry_travelz": self.ui.geometry_defaults_form.geometry_opt_group.travelz_entry,
  222. "geometry_feedrate": self.ui.geometry_defaults_form.geometry_opt_group.cncfeedrate_entry,
  223. "geometry_feedrate_z": self.ui.geometry_defaults_form.geometry_opt_group.feedrate_z_entry,
  224. "geometry_spindlespeed": self.ui.geometry_defaults_form.geometry_opt_group.cncspindlespeed_entry,
  225. "geometry_dwell": self.ui.geometry_defaults_form.geometry_opt_group.dwell_cb,
  226. "geometry_dwelltime": self.ui.geometry_defaults_form.geometry_opt_group.dwelltime_entry,
  227. "geometry_ppname_g": self.ui.geometry_defaults_form.geometry_opt_group.pp_geometry_name_cb,
  228. "geometry_toolchange": self.ui.geometry_defaults_form.geometry_opt_group.toolchange_cb,
  229. "geometry_toolchangez": self.ui.geometry_defaults_form.geometry_opt_group.toolchangez_entry,
  230. "geometry_endz": self.ui.geometry_defaults_form.geometry_opt_group.endz_entry,
  231. "geometry_endxy": self.ui.geometry_defaults_form.geometry_opt_group.endxy_entry,
  232. "geometry_depthperpass": self.ui.geometry_defaults_form.geometry_opt_group.depthperpass_entry,
  233. "geometry_multidepth": self.ui.geometry_defaults_form.geometry_opt_group.multidepth_cb,
  234. # Geometry Advanced Options
  235. "geometry_toolchangexy": self.ui.geometry_defaults_form.geometry_adv_opt_group.toolchangexy_entry,
  236. "geometry_startz": self.ui.geometry_defaults_form.geometry_adv_opt_group.gstartz_entry,
  237. "geometry_feedrate_rapid": self.ui.geometry_defaults_form.geometry_adv_opt_group.feedrate_rapid_entry,
  238. "geometry_extracut": self.ui.geometry_defaults_form.geometry_adv_opt_group.extracut_cb,
  239. "geometry_extracut_length": self.ui.geometry_defaults_form.geometry_adv_opt_group.e_cut_entry,
  240. "geometry_z_pdepth": self.ui.geometry_defaults_form.geometry_adv_opt_group.pdepth_entry,
  241. "geometry_feedrate_probe": self.ui.geometry_defaults_form.geometry_adv_opt_group.feedrate_probe_entry,
  242. "geometry_spindledir": self.ui.geometry_defaults_form.geometry_adv_opt_group.spindledir_radio,
  243. "geometry_f_plunge": self.ui.geometry_defaults_form.geometry_adv_opt_group.fplunge_cb,
  244. "geometry_segx": self.ui.geometry_defaults_form.geometry_adv_opt_group.segx_entry,
  245. "geometry_segy": self.ui.geometry_defaults_form.geometry_adv_opt_group.segy_entry,
  246. "geometry_area_exclusion": self.ui.geometry_defaults_form.geometry_adv_opt_group.exclusion_cb,
  247. "geometry_area_shape": self.ui.geometry_defaults_form.geometry_adv_opt_group.area_shape_radio,
  248. "geometry_area_strategy": self.ui.geometry_defaults_form.geometry_adv_opt_group.strategy_radio,
  249. "geometry_area_overz": self.ui.geometry_defaults_form.geometry_adv_opt_group.over_z_entry,
  250. # Polish
  251. "geometry_polish": self.ui.geometry_defaults_form.geometry_adv_opt_group.polish_cb,
  252. "geometry_polish_dia": self.ui.geometry_defaults_form.geometry_adv_opt_group.polish_dia_entry,
  253. "geometry_polish_pressure": self.ui.geometry_defaults_form.geometry_adv_opt_group.polish_pressure_entry,
  254. "geometry_polish_travelz": self.ui.geometry_defaults_form.geometry_adv_opt_group.polish_travelz_entry,
  255. "geometry_polish_margin": self.ui.geometry_defaults_form.geometry_adv_opt_group.polish_margin_entry,
  256. "geometry_polish_overlap": self.ui.geometry_defaults_form.geometry_adv_opt_group.polish_over_entry,
  257. "geometry_polish_method": self.ui.geometry_defaults_form.geometry_adv_opt_group.polish_method_combo,
  258. # Geometry Editor
  259. "geometry_editor_sel_limit": self.ui.geometry_defaults_form.geometry_editor_group.sel_limit_entry,
  260. "geometry_editor_milling_type": self.ui.geometry_defaults_form.geometry_editor_group.milling_type_radio,
  261. # CNCJob General
  262. "cncjob_plot": self.ui.cncjob_defaults_form.cncjob_gen_group.plot_cb,
  263. "cncjob_tooldia": self.ui.cncjob_defaults_form.cncjob_gen_group.tooldia_entry,
  264. "cncjob_coords_type": self.ui.cncjob_defaults_form.cncjob_gen_group.coords_type_radio,
  265. "cncjob_coords_decimals": self.ui.cncjob_defaults_form.cncjob_gen_group.coords_dec_entry,
  266. "cncjob_fr_decimals": self.ui.cncjob_defaults_form.cncjob_gen_group.fr_dec_entry,
  267. "cncjob_steps_per_circle": self.ui.cncjob_defaults_form.cncjob_gen_group.steps_per_circle_entry,
  268. "cncjob_line_ending": self.ui.cncjob_defaults_form.cncjob_gen_group.line_ending_cb,
  269. "cncjob_plot_line": self.ui.cncjob_defaults_form.cncjob_gen_group.line_color_entry,
  270. "cncjob_plot_fill": self.ui.cncjob_defaults_form.cncjob_gen_group.fill_color_entry,
  271. "cncjob_travel_line": self.ui.cncjob_defaults_form.cncjob_gen_group.tline_color_entry,
  272. "cncjob_travel_fill": self.ui.cncjob_defaults_form.cncjob_gen_group.tfill_color_entry,
  273. # CNC Job Options
  274. "cncjob_plot_kind": self.ui.cncjob_defaults_form.cncjob_opt_group.cncplot_method_radio,
  275. "cncjob_annotation": self.ui.cncjob_defaults_form.cncjob_opt_group.annotation_cb,
  276. # CNC Job Advanced Options
  277. "cncjob_annotation_fontsize": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontsize_sp,
  278. "cncjob_annotation_fontcolor": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontcolor_entry,
  279. # Autolevelling
  280. "cncjob_al_mode": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.al_mode_radio,
  281. "cncjob_al_method": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.al_method_radio,
  282. "cncjob_al_rows": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.al_rows_entry,
  283. "cncjob_al_columns": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.al_columns_entry,
  284. "cncjob_al_travelz": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.ptravelz_entry,
  285. "cncjob_al_probe_depth": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.pdepth_entry,
  286. "cncjob_al_probe_fr": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.feedrate_probe_entry,
  287. "cncjob_al_controller": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.al_controller_combo,
  288. "cncjob_al_grbl_jog_step": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.jog_step_entry,
  289. "cncjob_al_grbl_jog_fr": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.jog_fr_entry,
  290. "cncjob_al_grbl_travelz": self.ui.cncjob_defaults_form.cncjob_adv_opt_group.jog_travelz_entry,
  291. # CNC Job (GCode) Editor
  292. "cncjob_prepend": self.ui.cncjob_defaults_form.cncjob_editor_group.prepend_text,
  293. "cncjob_append": self.ui.cncjob_defaults_form.cncjob_editor_group.append_text,
  294. # Isolation Routing Tool
  295. "tools_iso_tooldia": self.ui.tools_defaults_form.tools_iso_group.tool_dia_entry,
  296. "tools_iso_order": self.ui.tools_defaults_form.tools_iso_group.order_radio,
  297. "tools_iso_tool_type": self.ui.tools_defaults_form.tools_iso_group.tool_type_radio,
  298. "tools_iso_tool_vtipdia": self.ui.tools_defaults_form.tools_iso_group.tipdia_entry,
  299. "tools_iso_tool_vtipangle": self.ui.tools_defaults_form.tools_iso_group.tipangle_entry,
  300. "tools_iso_tool_cutz": self.ui.tools_defaults_form.tools_iso_group.cutz_entry,
  301. "tools_iso_newdia": self.ui.tools_defaults_form.tools_iso_group.newdia_entry,
  302. "tools_iso_passes": self.ui.tools_defaults_form.tools_iso_group.passes_entry,
  303. "tools_iso_overlap": self.ui.tools_defaults_form.tools_iso_group.overlap_entry,
  304. "tools_iso_milling_type": self.ui.tools_defaults_form.tools_iso_group.milling_type_radio,
  305. "tools_iso_follow": self.ui.tools_defaults_form.tools_iso_group.follow_cb,
  306. "tools_iso_isotype": self.ui.tools_defaults_form.tools_iso_group.iso_type_radio,
  307. "tools_iso_rest": self.ui.tools_defaults_form.tools_iso_group.rest_cb,
  308. "tools_iso_combine_passes": self.ui.tools_defaults_form.tools_iso_group.combine_passes_cb,
  309. "tools_iso_check_valid": self.ui.tools_defaults_form.tools_iso_group.valid_cb,
  310. "tools_iso_isoexcept": self.ui.tools_defaults_form.tools_iso_group.except_cb,
  311. "tools_iso_selection": self.ui.tools_defaults_form.tools_iso_group.select_combo,
  312. "tools_iso_poly_ints": self.ui.tools_defaults_form.tools_iso_group.poly_int_cb,
  313. "tools_iso_force": self.ui.tools_defaults_form.tools_iso_group.force_iso_cb,
  314. "tools_iso_area_shape": self.ui.tools_defaults_form.tools_iso_group.area_shape_radio,
  315. "tools_iso_plotting": self.ui.tools_defaults_form.tools_iso_group.plotting_radio,
  316. # Drilling Tool
  317. "tools_drill_tool_order": self.ui.tools_defaults_form.tools_drill_group.order_radio,
  318. "tools_drill_cutz": self.ui.tools_defaults_form.tools_drill_group.cutz_entry,
  319. "tools_drill_multidepth": self.ui.tools_defaults_form.tools_drill_group.mpass_cb,
  320. "tools_drill_depthperpass": self.ui.tools_defaults_form.tools_drill_group.maxdepth_entry,
  321. "tools_drill_travelz": self.ui.tools_defaults_form.tools_drill_group.travelz_entry,
  322. "tools_drill_endz": self.ui.tools_defaults_form.tools_drill_group.endz_entry,
  323. "tools_drill_endxy": self.ui.tools_defaults_form.tools_drill_group.endxy_entry,
  324. "tools_drill_feedrate_z": self.ui.tools_defaults_form.tools_drill_group.feedrate_z_entry,
  325. "tools_drill_spindlespeed": self.ui.tools_defaults_form.tools_drill_group.spindlespeed_entry,
  326. "tools_drill_dwell": self.ui.tools_defaults_form.tools_drill_group.dwell_cb,
  327. "tools_drill_dwelltime": self.ui.tools_defaults_form.tools_drill_group.dwelltime_entry,
  328. "tools_drill_toolchange": self.ui.tools_defaults_form.tools_drill_group.toolchange_cb,
  329. "tools_drill_toolchangez": self.ui.tools_defaults_form.tools_drill_group.toolchangez_entry,
  330. "tools_drill_ppname_e": self.ui.tools_defaults_form.tools_drill_group.pp_excellon_name_cb,
  331. "tools_drill_drill_slots": self.ui.tools_defaults_form.tools_drill_group.drill_slots_cb,
  332. "tools_drill_drill_overlap": self.ui.tools_defaults_form.tools_drill_group.drill_overlap_entry,
  333. "tools_drill_last_drill": self.ui.tools_defaults_form.tools_drill_group.last_drill_cb,
  334. # Advanced Options
  335. "tools_drill_offset": self.ui.tools_defaults_form.tools_drill_group.offset_entry,
  336. "tools_drill_toolchangexy": self.ui.tools_defaults_form.tools_drill_group.toolchangexy_entry,
  337. "tools_drill_startz": self.ui.tools_defaults_form.tools_drill_group.estartz_entry,
  338. "tools_drill_feedrate_rapid": self.ui.tools_defaults_form.tools_drill_group.feedrate_rapid_entry,
  339. "tools_drill_z_pdepth": self.ui.tools_defaults_form.tools_drill_group.pdepth_entry,
  340. "tools_drill_feedrate_probe": self.ui.tools_defaults_form.tools_drill_group.feedrate_probe_entry,
  341. "tools_drill_spindledir": self.ui.tools_defaults_form.tools_drill_group.spindledir_radio,
  342. "tools_drill_f_plunge": self.ui.tools_defaults_form.tools_drill_group.fplunge_cb,
  343. "tools_drill_f_retract": self.ui.tools_defaults_form.tools_drill_group.fretract_cb,
  344. # Area Exclusion
  345. "tools_drill_area_exclusion": self.ui.tools_defaults_form.tools_drill_group.exclusion_cb,
  346. "tools_drill_area_shape": self.ui.tools_defaults_form.tools_drill_group.area_shape_radio,
  347. "tools_drill_area_strategy": self.ui.tools_defaults_form.tools_drill_group.strategy_radio,
  348. "tools_drill_area_overz": self.ui.tools_defaults_form.tools_drill_group.over_z_entry,
  349. # NCC Tool
  350. "tools_ncc_tools": self.ui.tools_defaults_form.tools_ncc_group.ncc_tool_dia_entry,
  351. "tools_ncc_order": self.ui.tools_defaults_form.tools_ncc_group.ncc_order_radio,
  352. "tools_ncc_overlap": self.ui.tools_defaults_form.tools_ncc_group.ncc_overlap_entry,
  353. "tools_ncc_margin": self.ui.tools_defaults_form.tools_ncc_group.ncc_margin_entry,
  354. "tools_ncc_method": self.ui.tools_defaults_form.tools_ncc_group.ncc_method_combo,
  355. "tools_ncc_connect": self.ui.tools_defaults_form.tools_ncc_group.ncc_connect_cb,
  356. "tools_ncc_contour": self.ui.tools_defaults_form.tools_ncc_group.ncc_contour_cb,
  357. "tools_ncc_rest": self.ui.tools_defaults_form.tools_ncc_group.ncc_rest_cb,
  358. "tools_ncc_offset_choice": self.ui.tools_defaults_form.tools_ncc_group.ncc_choice_offset_cb,
  359. "tools_ncc_offset_value": self.ui.tools_defaults_form.tools_ncc_group.ncc_offset_spinner,
  360. "tools_ncc_ref": self.ui.tools_defaults_form.tools_ncc_group.select_combo,
  361. "tools_ncc_area_shape": self.ui.tools_defaults_form.tools_ncc_group.area_shape_radio,
  362. "tools_ncc_milling_type": self.ui.tools_defaults_form.tools_ncc_group.milling_type_radio,
  363. "tools_ncc_tool_type": self.ui.tools_defaults_form.tools_ncc_group.tool_type_radio,
  364. "tools_ncc_cutz": self.ui.tools_defaults_form.tools_ncc_group.cutz_entry,
  365. "tools_ncc_tipdia": self.ui.tools_defaults_form.tools_ncc_group.tipdia_entry,
  366. "tools_ncc_tipangle": self.ui.tools_defaults_form.tools_ncc_group.tipangle_entry,
  367. "tools_ncc_newdia": self.ui.tools_defaults_form.tools_ncc_group.newdia_entry,
  368. "tools_ncc_plotting": self.ui.tools_defaults_form.tools_ncc_group.plotting_radio,
  369. "tools_ncc_check_valid": self.ui.tools_defaults_form.tools_ncc_group.valid_cb,
  370. # CutOut Tool
  371. "tools_cutout_tooldia": self.ui.tools_defaults_form.tools_cutout_group.cutout_tooldia_entry,
  372. "tools_cutout_kind": self.ui.tools_defaults_form.tools_cutout_group.obj_kind_combo,
  373. "tools_cutout_margin": self.ui.tools_defaults_form.tools_cutout_group.cutout_margin_entry,
  374. "tools_cutout_z": self.ui.tools_defaults_form.tools_cutout_group.cutz_entry,
  375. "tools_cutout_depthperpass": self.ui.tools_defaults_form.tools_cutout_group.maxdepth_entry,
  376. "tools_cutout_mdepth": self.ui.tools_defaults_form.tools_cutout_group.mpass_cb,
  377. "tools_cutout_gapsize": self.ui.tools_defaults_form.tools_cutout_group.cutout_gap_entry,
  378. "tools_cutout_gaps_ff": self.ui.tools_defaults_form.tools_cutout_group.gaps_combo,
  379. "tools_cutout_convexshape": self.ui.tools_defaults_form.tools_cutout_group.convex_box,
  380. "tools_cutout_big_cursor": self.ui.tools_defaults_form.tools_cutout_group.big_cursor_cb,
  381. "tools_cutout_gap_type": self.ui.tools_defaults_form.tools_cutout_group.gaptype_radio,
  382. "tools_cutout_gap_depth": self.ui.tools_defaults_form.tools_cutout_group.thin_depth_entry,
  383. "tools_cutout_mb_dia": self.ui.tools_defaults_form.tools_cutout_group.mb_dia_entry,
  384. "tools_cutout_mb_spacing": self.ui.tools_defaults_form.tools_cutout_group.mb_spacing_entry,
  385. # Paint Area Tool
  386. "tools_paint_tooldia": self.ui.tools_defaults_form.tools_paint_group.painttooldia_entry,
  387. "tools_paint_order": self.ui.tools_defaults_form.tools_paint_group.paint_order_radio,
  388. "tools_paint_overlap": self.ui.tools_defaults_form.tools_paint_group.paintoverlap_entry,
  389. "tools_paint_offset": self.ui.tools_defaults_form.tools_paint_group.paintmargin_entry,
  390. "tools_paint_method": self.ui.tools_defaults_form.tools_paint_group.paintmethod_combo,
  391. "tools_paint_selectmethod": self.ui.tools_defaults_form.tools_paint_group.selectmethod_combo,
  392. "tools_paint_area_shape": self.ui.tools_defaults_form.tools_paint_group.area_shape_radio,
  393. "tools_paint_connect": self.ui.tools_defaults_form.tools_paint_group.pathconnect_cb,
  394. "tools_paint_contour": self.ui.tools_defaults_form.tools_paint_group.contour_cb,
  395. "tools_paint_plotting": self.ui.tools_defaults_form.tools_paint_group.paint_plotting_radio,
  396. "tools_paint_rest": self.ui.tools_defaults_form.tools_paint_group.rest_cb,
  397. "tools_paint_tool_type": self.ui.tools_defaults_form.tools_paint_group.tool_type_radio,
  398. "tools_paint_cutz": self.ui.tools_defaults_form.tools_paint_group.cutz_entry,
  399. "tools_paint_tipdia": self.ui.tools_defaults_form.tools_paint_group.tipdia_entry,
  400. "tools_paint_tipangle": self.ui.tools_defaults_form.tools_paint_group.tipangle_entry,
  401. "tools_paint_newdia": self.ui.tools_defaults_form.tools_paint_group.newdia_entry,
  402. # 2-sided Tool
  403. "tools_2sided_mirror_axis": self.ui.tools_defaults_form.tools_2sided_group.mirror_axis_radio,
  404. "tools_2sided_axis_loc": self.ui.tools_defaults_form.tools_2sided_group.axis_location_radio,
  405. "tools_2sided_drilldia": self.ui.tools_defaults_form.tools_2sided_group.drill_dia_entry,
  406. "tools_2sided_allign_axis": self.ui.tools_defaults_form.tools_2sided_group.align_axis_radio,
  407. # Film Tool
  408. "tools_film_type": self.ui.tools_defaults_form.tools_film_group.film_type_radio,
  409. "tools_film_boundary": self.ui.tools_defaults_form.tools_film_group.film_boundary_entry,
  410. "tools_film_scale_stroke": self.ui.tools_defaults_form.tools_film_group.film_scale_stroke_entry,
  411. "tools_film_color": self.ui.tools_defaults_form.tools_film_group.film_color_entry,
  412. "tools_film_scale_cb": self.ui.tools_defaults_form.tools_film_group.film_scale_cb,
  413. "tools_film_scale_x_entry": self.ui.tools_defaults_form.tools_film_group.film_scalex_entry,
  414. "tools_film_scale_y_entry": self.ui.tools_defaults_form.tools_film_group.film_scaley_entry,
  415. "tools_film_skew_cb": self.ui.tools_defaults_form.tools_film_group.film_skew_cb,
  416. "tools_film_skew_x_entry": self.ui.tools_defaults_form.tools_film_group.film_skewx_entry,
  417. "tools_film_skew_y_entry": self.ui.tools_defaults_form.tools_film_group.film_skewy_entry,
  418. "tools_film_skew_ref_radio": self.ui.tools_defaults_form.tools_film_group.film_skew_reference,
  419. "tools_film_mirror_cb": self.ui.tools_defaults_form.tools_film_group.film_mirror_cb,
  420. "tools_film_mirror_axis_radio": self.ui.tools_defaults_form.tools_film_group.film_mirror_axis,
  421. "tools_film_file_type_radio": self.ui.tools_defaults_form.tools_film_group.file_type_radio,
  422. "tools_film_orientation": self.ui.tools_defaults_form.tools_film_group.orientation_radio,
  423. "tools_film_pagesize": self.ui.tools_defaults_form.tools_film_group.pagesize_combo,
  424. "tools_film_png_dpi": self.ui.tools_defaults_form.tools_film_group.png_dpi_spinner,
  425. # Panelize Tool
  426. "tools_panelize_spacing_columns": self.ui.tools_defaults_form.tools_panelize_group.pspacing_columns,
  427. "tools_panelize_spacing_rows": self.ui.tools_defaults_form.tools_panelize_group.pspacing_rows,
  428. "tools_panelize_columns": self.ui.tools_defaults_form.tools_panelize_group.pcolumns,
  429. "tools_panelize_rows": self.ui.tools_defaults_form.tools_panelize_group.prows,
  430. "tools_panelize_optimization": self.ui.tools_defaults_form.tools_panelize_group.poptimization_cb,
  431. "tools_panelize_constrain": self.ui.tools_defaults_form.tools_panelize_group.pconstrain_cb,
  432. "tools_panelize_constrainx": self.ui.tools_defaults_form.tools_panelize_group.px_width_entry,
  433. "tools_panelize_constrainy": self.ui.tools_defaults_form.tools_panelize_group.py_height_entry,
  434. "tools_panelize_panel_type": self.ui.tools_defaults_form.tools_panelize_group.panel_type_radio,
  435. # Calculators Tool
  436. "tools_calc_vshape_tip_dia": self.ui.tools_defaults_form.tools_calculators_group.tip_dia_entry,
  437. "tools_calc_vshape_tip_angle": self.ui.tools_defaults_form.tools_calculators_group.tip_angle_entry,
  438. "tools_calc_vshape_cut_z": self.ui.tools_defaults_form.tools_calculators_group.cut_z_entry,
  439. "tools_calc_electro_length": self.ui.tools_defaults_form.tools_calculators_group.pcblength_entry,
  440. "tools_calc_electro_width": self.ui.tools_defaults_form.tools_calculators_group.pcbwidth_entry,
  441. "tools_calc_electro_area": self.ui.tools_defaults_form.tools_calculators_group.area_entry,
  442. "tools_calc_electro_cdensity": self.ui.tools_defaults_form.tools_calculators_group.cdensity_entry,
  443. "tools_calc_electro_growth": self.ui.tools_defaults_form.tools_calculators_group.growth_entry,
  444. # Transformations Tool
  445. "tools_transform_reference": self.ui.tools_defaults_form.tools_transform_group.ref_combo,
  446. "tools_transform_ref_object": self.ui.tools_defaults_form.tools_transform_group.type_obj_combo,
  447. "tools_transform_ref_point": self.ui.tools_defaults_form.tools_transform_group.point_entry,
  448. "tools_transform_rotate": self.ui.tools_defaults_form.tools_transform_group.rotate_entry,
  449. "tools_transform_skew_x": self.ui.tools_defaults_form.tools_transform_group.skewx_entry,
  450. "tools_transform_skew_y": self.ui.tools_defaults_form.tools_transform_group.skewy_entry,
  451. "tools_transform_skew_link": self.ui.tools_defaults_form.tools_transform_group.skew_link_cb,
  452. "tools_transform_scale_x": self.ui.tools_defaults_form.tools_transform_group.scalex_entry,
  453. "tools_transform_scale_y": self.ui.tools_defaults_form.tools_transform_group.scaley_entry,
  454. "tools_transform_scale_link": self.ui.tools_defaults_form.tools_transform_group.scale_link_cb,
  455. "tools_transform_offset_x": self.ui.tools_defaults_form.tools_transform_group.offx_entry,
  456. "tools_transform_offset_y": self.ui.tools_defaults_form.tools_transform_group.offy_entry,
  457. "tools_transform_buffer_dis": self.ui.tools_defaults_form.tools_transform_group.buffer_entry,
  458. "tools_transform_buffer_factor": self.ui.tools_defaults_form.tools_transform_group.buffer_factor_entry,
  459. "tools_transform_buffer_corner": self.ui.tools_defaults_form.tools_transform_group.buffer_rounded_cb,
  460. # SolderPaste Dispensing Tool
  461. "tools_solderpaste_tools": self.ui.tools_defaults_form.tools_solderpaste_group.nozzle_tool_dia_entry,
  462. "tools_solderpaste_new": self.ui.tools_defaults_form.tools_solderpaste_group.addtool_entry,
  463. "tools_solderpaste_z_start": self.ui.tools_defaults_form.tools_solderpaste_group.z_start_entry,
  464. "tools_solderpaste_z_dispense": self.ui.tools_defaults_form.tools_solderpaste_group.z_dispense_entry,
  465. "tools_solderpaste_z_stop": self.ui.tools_defaults_form.tools_solderpaste_group.z_stop_entry,
  466. "tools_solderpaste_z_travel": self.ui.tools_defaults_form.tools_solderpaste_group.z_travel_entry,
  467. "tools_solderpaste_z_toolchange": self.ui.tools_defaults_form.tools_solderpaste_group.z_toolchange_entry,
  468. "tools_solderpaste_xy_toolchange": self.ui.tools_defaults_form.tools_solderpaste_group.xy_toolchange_entry,
  469. "tools_solderpaste_frxy": self.ui.tools_defaults_form.tools_solderpaste_group.frxy_entry,
  470. "tools_solderpaste_frz": self.ui.tools_defaults_form.tools_solderpaste_group.frz_entry,
  471. "tools_solderpaste_frz_dispense": self.ui.tools_defaults_form.tools_solderpaste_group.frz_dispense_entry,
  472. "tools_solderpaste_speedfwd": self.ui.tools_defaults_form.tools_solderpaste_group.speedfwd_entry,
  473. "tools_solderpaste_dwellfwd": self.ui.tools_defaults_form.tools_solderpaste_group.dwellfwd_entry,
  474. "tools_solderpaste_speedrev": self.ui.tools_defaults_form.tools_solderpaste_group.speedrev_entry,
  475. "tools_solderpaste_dwellrev": self.ui.tools_defaults_form.tools_solderpaste_group.dwellrev_entry,
  476. "tools_solderpaste_pp": self.ui.tools_defaults_form.tools_solderpaste_group.pp_combo,
  477. # Subtractor Tool
  478. "tools_sub_close_paths": self.ui.tools_defaults_form.tools_sub_group.close_paths_cb,
  479. "tools_sub_delete_sources": self.ui.tools_defaults_form.tools_sub_group.delete_sources_cb,
  480. # Corner Markers Tool
  481. "tools_corners_type": self.ui.tools_defaults_form.tools_corners_group.type_radio,
  482. "tools_corners_thickness": self.ui.tools_defaults_form.tools_corners_group.thick_entry,
  483. "tools_corners_length": self.ui.tools_defaults_form.tools_corners_group.l_entry,
  484. "tools_corners_margin": self.ui.tools_defaults_form.tools_corners_group.margin_entry,
  485. "tools_corners_drill_dia": self.ui.tools_defaults_form.tools_corners_group.drill_dia_entry,
  486. # #######################################################################################################
  487. # ########################################## TOOLS 2 ####################################################
  488. # #######################################################################################################
  489. # Optimal Tool
  490. "tools_opt_precision": self.ui.tools2_defaults_form.tools2_optimal_group.precision_sp,
  491. # Check Rules Tool
  492. "tools_cr_trace_size": self.ui.tools2_defaults_form.tools2_checkrules_group.trace_size_cb,
  493. "tools_cr_trace_size_val": self.ui.tools2_defaults_form.tools2_checkrules_group.trace_size_entry,
  494. "tools_cr_c2c": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2copper_cb,
  495. "tools_cr_c2c_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2copper_entry,
  496. "tools_cr_c2o": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2ol_cb,
  497. "tools_cr_c2o_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2ol_entry,
  498. "tools_cr_s2s": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2silk_cb,
  499. "tools_cr_s2s_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2silk_entry,
  500. "tools_cr_s2sm": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2sm_cb,
  501. "tools_cr_s2sm_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2sm_entry,
  502. "tools_cr_s2o": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2ol_cb,
  503. "tools_cr_s2o_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2ol_entry,
  504. "tools_cr_sm2sm": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_sm2sm_cb,
  505. "tools_cr_sm2sm_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_sm2sm_entry,
  506. "tools_cr_ri": self.ui.tools2_defaults_form.tools2_checkrules_group.ring_integrity_cb,
  507. "tools_cr_ri_val": self.ui.tools2_defaults_form.tools2_checkrules_group.ring_integrity_entry,
  508. "tools_cr_h2h": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_d2d_cb,
  509. "tools_cr_h2h_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_d2d_entry,
  510. "tools_cr_dh": self.ui.tools2_defaults_form.tools2_checkrules_group.drill_size_cb,
  511. "tools_cr_dh_val": self.ui.tools2_defaults_form.tools2_checkrules_group.drill_size_entry,
  512. # QRCode Tool
  513. "tools_qrcode_version": self.ui.tools2_defaults_form.tools2_qrcode_group.version_entry,
  514. "tools_qrcode_error": self.ui.tools2_defaults_form.tools2_qrcode_group.error_radio,
  515. "tools_qrcode_box_size": self.ui.tools2_defaults_form.tools2_qrcode_group.bsize_entry,
  516. "tools_qrcode_border_size": self.ui.tools2_defaults_form.tools2_qrcode_group.border_size_entry,
  517. "tools_qrcode_qrdata": self.ui.tools2_defaults_form.tools2_qrcode_group.text_data,
  518. "tools_qrcode_polarity": self.ui.tools2_defaults_form.tools2_qrcode_group.pol_radio,
  519. "tools_qrcode_rounded": self.ui.tools2_defaults_form.tools2_qrcode_group.bb_radio,
  520. "tools_qrcode_fill_color": self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_entry,
  521. "tools_qrcode_back_color": self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_entry,
  522. "tools_qrcode_sel_limit": self.ui.tools2_defaults_form.tools2_qrcode_group.sel_limit_entry,
  523. # Copper Thieving Tool
  524. "tools_copper_thieving_clearance": self.ui.tools2_defaults_form.tools2_cfill_group.clearance_entry,
  525. "tools_copper_thieving_margin": self.ui.tools2_defaults_form.tools2_cfill_group.margin_entry,
  526. "tools_copper_thieving_area": self.ui.tools2_defaults_form.tools2_cfill_group.area_entry,
  527. "tools_copper_thieving_reference": self.ui.tools2_defaults_form.tools2_cfill_group.reference_radio,
  528. "tools_copper_thieving_box_type": self.ui.tools2_defaults_form.tools2_cfill_group.bbox_type_radio,
  529. "tools_copper_thieving_circle_steps": self.ui.tools2_defaults_form.tools2_cfill_group.circlesteps_entry,
  530. "tools_copper_thieving_fill_type": self.ui.tools2_defaults_form.tools2_cfill_group.fill_type_radio,
  531. "tools_copper_thieving_dots_dia": self.ui.tools2_defaults_form.tools2_cfill_group.dot_dia_entry,
  532. "tools_copper_thieving_dots_spacing": self.ui.tools2_defaults_form.tools2_cfill_group.dot_spacing_entry,
  533. "tools_copper_thieving_squares_size": self.ui.tools2_defaults_form.tools2_cfill_group.square_size_entry,
  534. "tools_copper_thieving_squares_spacing":
  535. self.ui.tools2_defaults_form.tools2_cfill_group.squares_spacing_entry,
  536. "tools_copper_thieving_lines_size": self.ui.tools2_defaults_form.tools2_cfill_group.line_size_entry,
  537. "tools_copper_thieving_lines_spacing": self.ui.tools2_defaults_form.tools2_cfill_group.lines_spacing_entry,
  538. "tools_copper_thieving_rb_margin": self.ui.tools2_defaults_form.tools2_cfill_group.rb_margin_entry,
  539. "tools_copper_thieving_rb_thickness": self.ui.tools2_defaults_form.tools2_cfill_group.rb_thickness_entry,
  540. "tools_copper_thieving_mask_clearance": self.ui.tools2_defaults_form.tools2_cfill_group.clearance_ppm_entry,
  541. "tools_copper_thieving_geo_choice": self.ui.tools2_defaults_form.tools2_cfill_group.ppm_choice_radio,
  542. # Fiducials Tool
  543. "tools_fiducials_dia": self.ui.tools2_defaults_form.tools2_fiducials_group.dia_entry,
  544. "tools_fiducials_margin": self.ui.tools2_defaults_form.tools2_fiducials_group.margin_entry,
  545. "tools_fiducials_mode": self.ui.tools2_defaults_form.tools2_fiducials_group.mode_radio,
  546. "tools_fiducials_second_pos": self.ui.tools2_defaults_form.tools2_fiducials_group.pos_radio,
  547. "tools_fiducials_type": self.ui.tools2_defaults_form.tools2_fiducials_group.fid_type_radio,
  548. "tools_fiducials_line_thickness": self.ui.tools2_defaults_form.tools2_fiducials_group.line_thickness_entry,
  549. # Calibration Tool
  550. "tools_cal_calsource": self.ui.tools2_defaults_form.tools2_cal_group.cal_source_radio,
  551. "tools_cal_travelz": self.ui.tools2_defaults_form.tools2_cal_group.travelz_entry,
  552. "tools_cal_verz": self.ui.tools2_defaults_form.tools2_cal_group.verz_entry,
  553. "tools_cal_zeroz": self.ui.tools2_defaults_form.tools2_cal_group.zeroz_cb,
  554. "tools_cal_toolchangez": self.ui.tools2_defaults_form.tools2_cal_group.toolchangez_entry,
  555. "tools_cal_toolchange_xy": self.ui.tools2_defaults_form.tools2_cal_group.toolchange_xy_entry,
  556. "tools_cal_sec_point": self.ui.tools2_defaults_form.tools2_cal_group.second_point_radio,
  557. # Extract Drills Tool
  558. "tools_edrills_hole_type": self.ui.tools2_defaults_form.tools2_edrills_group.hole_size_radio,
  559. "tools_edrills_hole_fixed_dia": self.ui.tools2_defaults_form.tools2_edrills_group.dia_entry,
  560. "tools_edrills_hole_prop_factor": self.ui.tools2_defaults_form.tools2_edrills_group.factor_entry,
  561. "tools_edrills_circular_ring": self.ui.tools2_defaults_form.tools2_edrills_group.circular_ring_entry,
  562. "tools_edrills_oblong_ring": self.ui.tools2_defaults_form.tools2_edrills_group.oblong_ring_entry,
  563. "tools_edrills_square_ring": self.ui.tools2_defaults_form.tools2_edrills_group.square_ring_entry,
  564. "tools_edrills_rectangular_ring": self.ui.tools2_defaults_form.tools2_edrills_group.rectangular_ring_entry,
  565. "tools_edrills_others_ring": self.ui.tools2_defaults_form.tools2_edrills_group.other_ring_entry,
  566. "tools_edrills_circular": self.ui.tools2_defaults_form.tools2_edrills_group.circular_cb,
  567. "tools_edrills_oblong": self.ui.tools2_defaults_form.tools2_edrills_group.oblong_cb,
  568. "tools_edrills_square": self.ui.tools2_defaults_form.tools2_edrills_group.square_cb,
  569. "tools_edrills_rectangular": self.ui.tools2_defaults_form.tools2_edrills_group.rectangular_cb,
  570. "tools_edrills_others": self.ui.tools2_defaults_form.tools2_edrills_group.other_cb,
  571. # Punch Gerber Tool
  572. "tools_punch_hole_type": self.ui.tools2_defaults_form.tools2_punch_group.hole_size_radio,
  573. "tools_punch_hole_fixed_dia": self.ui.tools2_defaults_form.tools2_punch_group.dia_entry,
  574. "tools_punch_hole_prop_factor": self.ui.tools2_defaults_form.tools2_punch_group.factor_entry,
  575. "tools_punch_circular_ring": self.ui.tools2_defaults_form.tools2_punch_group.circular_ring_entry,
  576. "tools_punch_oblong_ring": self.ui.tools2_defaults_form.tools2_punch_group.oblong_ring_entry,
  577. "tools_punch_square_ring": self.ui.tools2_defaults_form.tools2_punch_group.square_ring_entry,
  578. "tools_punch_rectangular_ring": self.ui.tools2_defaults_form.tools2_punch_group.rectangular_ring_entry,
  579. "tools_punch_others_ring": self.ui.tools2_defaults_form.tools2_punch_group.other_ring_entry,
  580. "tools_punch_circular": self.ui.tools2_defaults_form.tools2_punch_group.circular_cb,
  581. "tools_punch_oblong": self.ui.tools2_defaults_form.tools2_punch_group.oblong_cb,
  582. "tools_punch_square": self.ui.tools2_defaults_form.tools2_punch_group.square_cb,
  583. "tools_punch_rectangular": self.ui.tools2_defaults_form.tools2_punch_group.rectangular_cb,
  584. "tools_punch_others": self.ui.tools2_defaults_form.tools2_punch_group.other_cb,
  585. # Invert Gerber Tool
  586. "tools_invert_margin": self.ui.tools2_defaults_form.tools2_invert_group.margin_entry,
  587. "tools_invert_join_style": self.ui.tools2_defaults_form.tools2_invert_group.join_radio,
  588. # Utilities
  589. # File associations
  590. "fa_excellon": self.ui.util_defaults_form.fa_excellon_group.exc_list_text,
  591. "fa_gcode": self.ui.util_defaults_form.fa_gcode_group.gco_list_text,
  592. # "fa_geometry": self.ui.util_defaults_form.fa_geometry_group.close_paths_cb,
  593. "fa_gerber": self.ui.util_defaults_form.fa_gerber_group.grb_list_text,
  594. "util_autocomplete_keywords": self.ui.util_defaults_form.kw_group.kw_list_text,
  595. }
  596. def defaults_read_form(self):
  597. """
  598. Will read all the values in the Preferences GUI and update the defaults dictionary.
  599. :return: None
  600. """
  601. for option in self.defaults_form_fields:
  602. try:
  603. self.defaults[option] = self.defaults_form_fields[option].get_value()
  604. except Exception as e:
  605. log.debug("App.defaults_read_form() --> %s" % str(e))
  606. def defaults_write_form(self, factor=None, fl_units=None, source_dict=None):
  607. """
  608. Will set the values for all the GUI elements in Preferences GUI based on the values found in the
  609. self.defaults dictionary.
  610. :param factor: will apply a factor to the values that written in the GUI elements
  611. :param fl_units: current measuring units in FlatCAM: Metric or Inch
  612. :param source_dict: the repository of options, usually is the self.defaults
  613. :return: None
  614. """
  615. options_storage = self.defaults if source_dict is None else source_dict
  616. for option in options_storage:
  617. if source_dict:
  618. self.defaults_write_form_field(option, factor=factor, units=fl_units, defaults_dict=source_dict)
  619. else:
  620. self.defaults_write_form_field(option, factor=factor, units=fl_units)
  621. def defaults_write_form_field(self, field, factor=None, units=None, defaults_dict=None):
  622. """
  623. Basically it is the worker in the self.defaults_write_form()
  624. :param field: the GUI element in Preferences GUI to be updated
  625. :param factor: factor to be applied to the field parameter
  626. :param units: current FlatCAM measuring units
  627. :param defaults_dict: the defaults storage
  628. :return: None, it updates GUI elements
  629. """
  630. def_dict = self.defaults if defaults_dict is None else defaults_dict
  631. try:
  632. value = def_dict[field]
  633. # log.debug("value is " + str(value) + " and factor is "+str(factor))
  634. if factor is not None:
  635. value *= factor
  636. form_field = self.defaults_form_fields[field]
  637. if units is None:
  638. form_field.set_value(value)
  639. elif (units == 'IN' or units == 'MM') and (field == 'global_gridx' or field == 'global_gridy'):
  640. form_field.set_value(value)
  641. except KeyError:
  642. pass
  643. except AttributeError:
  644. log.debug(field)
  645. def show_preferences_gui(self):
  646. """
  647. Called to initialize and show the Preferences appGUI
  648. :return: None
  649. """
  650. gen_form = self.ui.general_defaults_form
  651. try:
  652. self.ui.general_scroll_area.takeWidget()
  653. except Exception:
  654. log.debug("Nothing to remove")
  655. self.ui.general_scroll_area.setWidget(gen_form)
  656. gen_form.show()
  657. ger_form = self.ui.gerber_defaults_form
  658. try:
  659. self.ui.gerber_scroll_area.takeWidget()
  660. except Exception:
  661. log.debug("Nothing to remove")
  662. self.ui.gerber_scroll_area.setWidget(ger_form)
  663. ger_form.show()
  664. exc_form = self.ui.excellon_defaults_form
  665. try:
  666. self.ui.excellon_scroll_area.takeWidget()
  667. except Exception:
  668. log.debug("Nothing to remove")
  669. self.ui.excellon_scroll_area.setWidget(exc_form)
  670. exc_form.show()
  671. geo_form = self.ui.geometry_defaults_form
  672. try:
  673. self.ui.geometry_scroll_area.takeWidget()
  674. except Exception:
  675. log.debug("Nothing to remove")
  676. self.ui.geometry_scroll_area.setWidget(geo_form)
  677. geo_form.show()
  678. cnc_form = self.ui.cncjob_defaults_form
  679. try:
  680. self.ui.cncjob_scroll_area.takeWidget()
  681. except Exception:
  682. log.debug("Nothing to remove")
  683. self.ui.cncjob_scroll_area.setWidget(cnc_form)
  684. cnc_form.show()
  685. tools_form = self.ui.tools_defaults_form
  686. try:
  687. self.ui.tools_scroll_area.takeWidget()
  688. except Exception:
  689. log.debug("Nothing to remove")
  690. self.ui.tools_scroll_area.setWidget(tools_form)
  691. tools_form.show()
  692. tools2_form = self.ui.tools2_defaults_form
  693. try:
  694. self.ui.tools2_scroll_area.takeWidget()
  695. except Exception:
  696. log.debug("Nothing to remove")
  697. self.ui.tools2_scroll_area.setWidget(tools2_form)
  698. tools2_form.show()
  699. fa_form = self.ui.util_defaults_form
  700. try:
  701. self.ui.fa_scroll_area.takeWidget()
  702. except Exception:
  703. log.debug("Nothing to remove")
  704. self.ui.fa_scroll_area.setWidget(fa_form)
  705. fa_form.show()
  706. # Initialize the color box's color in Preferences -> Global -> Colors
  707. self.__init_color_pickers()
  708. # Button handlers
  709. self.ui.pref_save_button.clicked.connect(lambda: self.on_save_button(save_to_file=True))
  710. self.ui.pref_apply_button.clicked.connect(lambda: self.on_save_button(save_to_file=False))
  711. self.ui.pref_close_button.clicked.connect(self.on_pref_close_button)
  712. self.ui.pref_defaults_button.clicked.connect(self.on_restore_defaults_preferences)
  713. log.debug("Finished Preferences GUI form initialization.")
  714. def __init_color_pickers(self):
  715. # Init Gerber Plot Colors
  716. self.ui.gerber_defaults_form.gerber_gen_group.fill_color_entry.set_value(self.defaults['gerber_plot_fill'])
  717. self.ui.gerber_defaults_form.gerber_gen_group.line_color_entry.set_value(self.defaults['gerber_plot_line'])
  718. self.ui.gerber_defaults_form.gerber_gen_group.gerber_alpha_entry.set_value(
  719. int(self.defaults['gerber_plot_fill'][7:9], 16)) # alpha
  720. # Init Excellon Plot Colors
  721. self.ui.excellon_defaults_form.excellon_gen_group.fill_color_entry.set_value(
  722. self.defaults['excellon_plot_fill'])
  723. self.ui.excellon_defaults_form.excellon_gen_group.line_color_entry.set_value(
  724. self.defaults['excellon_plot_line'])
  725. self.ui.excellon_defaults_form.excellon_gen_group.excellon_alpha_entry.set_value(
  726. int(self.defaults['excellon_plot_fill'][7:9], 16))
  727. # Init Geometry Plot Colors
  728. self.ui.geometry_defaults_form.geometry_gen_group.line_color_entry.set_value(
  729. self.defaults['geometry_plot_line'])
  730. # Init CNCJob Travel Line Colors
  731. self.ui.cncjob_defaults_form.cncjob_gen_group.tfill_color_entry.set_value(
  732. self.defaults['cncjob_travel_fill'])
  733. self.ui.cncjob_defaults_form.cncjob_gen_group.tline_color_entry.set_value(
  734. self.defaults['cncjob_travel_line'])
  735. self.ui.cncjob_defaults_form.cncjob_gen_group.cncjob_alpha_entry.set_value(
  736. int(self.defaults['cncjob_travel_fill'][7:9], 16)) # alpha
  737. # Init CNCJob Plot Colors
  738. self.ui.cncjob_defaults_form.cncjob_gen_group.fill_color_entry.set_value(
  739. self.defaults['cncjob_plot_fill'])
  740. self.ui.cncjob_defaults_form.cncjob_gen_group.line_color_entry.set_value(
  741. self.defaults['cncjob_plot_line'])
  742. # Init Left-Right Selection colors
  743. self.ui.general_defaults_form.general_gui_group.sf_color_entry.set_value(self.defaults['global_sel_fill'])
  744. self.ui.general_defaults_form.general_gui_group.sl_color_entry.set_value(self.defaults['global_sel_line'])
  745. self.ui.general_defaults_form.general_gui_group.left_right_alpha_entry.set_value(
  746. int(self.defaults['global_sel_fill'][7:9], 16))
  747. # Init Right-Left Selection colors
  748. self.ui.general_defaults_form.general_gui_group.alt_sf_color_entry.set_value(
  749. self.defaults['global_alt_sel_fill'])
  750. self.ui.general_defaults_form.general_gui_group.alt_sl_color_entry.set_value(
  751. self.defaults['global_alt_sel_line'])
  752. self.ui.general_defaults_form.general_gui_group.right_left_alpha_entry.set_value(
  753. int(self.defaults['global_sel_fill'][7:9], 16))
  754. # Init Draw color and Selection Draw Color
  755. self.ui.general_defaults_form.general_gui_group.draw_color_entry.set_value(
  756. self.defaults['global_draw_color'])
  757. self.ui.general_defaults_form.general_gui_group.sel_draw_color_entry.set_value(
  758. self.defaults['global_sel_draw_color'])
  759. # Init Project Items color
  760. self.ui.general_defaults_form.general_gui_group.proj_color_entry.set_value(
  761. self.defaults['global_proj_item_color'])
  762. # Init Project Disabled Items color
  763. self.ui.general_defaults_form.general_gui_group.proj_color_dis_entry.set_value(
  764. self.defaults['global_proj_item_dis_color'])
  765. # Init Mouse Cursor color
  766. self.ui.general_defaults_form.general_app_set_group.mouse_cursor_entry.set_value(
  767. self.defaults['global_cursor_color'])
  768. # Init the Annotation CNC Job color
  769. self.ui.cncjob_defaults_form.cncjob_adv_opt_group.annotation_fontcolor_entry.set_value(
  770. self.defaults['cncjob_annotation_fontcolor'])
  771. # Init the Tool Film color
  772. self.ui.tools_defaults_form.tools_film_group.film_color_entry.set_value(
  773. self.defaults['tools_film_color'])
  774. # Init the Tool QRCode colors
  775. self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_entry.set_value(
  776. self.defaults['tools_qrcode_fill_color'])
  777. self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_entry.set_value(
  778. self.defaults['tools_qrcode_back_color'])
  779. def on_save_button(self, save_to_file=True):
  780. log.debug("on_save_button() --> Applying preferences to file.")
  781. # Preferences saved, update flag
  782. self.preferences_changed_flag = False
  783. # Preferences save, update the color of the Preferences Tab text
  784. for idx in range(self.ui.plot_tab_area.count()):
  785. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  786. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, self.old_color)
  787. # restore the default stylesheet by setting a blank one
  788. self.ui.pref_apply_button.setStyleSheet("")
  789. self.ui.pref_apply_button.setIcon(QtGui.QIcon(self.ui.app.resource_location + '/apply32.png'))
  790. self.inform.emit('%s' % _("Preferences applied."))
  791. # make sure we update the self.current_defaults dict used to undo changes to self.defaults
  792. self.defaults.current_defaults.update(self.defaults)
  793. # deal with theme change
  794. theme_settings = QtCore.QSettings("Open Source", "FlatCAM")
  795. if theme_settings.contains("theme"):
  796. theme = theme_settings.value('theme', type=str)
  797. else:
  798. theme = 'white'
  799. should_restart = False
  800. theme_new_val = self.ui.general_defaults_form.general_gui_group.theme_radio.get_value()
  801. ge = self.defaults["global_graphic_engine"]
  802. ge_val = self.ui.general_defaults_form.general_app_group.ge_radio.get_value()
  803. if theme_new_val != theme or ge != ge_val:
  804. msgbox = QtWidgets.QMessageBox()
  805. msgbox.setText(_("Are you sure you want to continue?"))
  806. msgbox.setWindowTitle(_("Application will restart"))
  807. msgbox.setWindowIcon(QtGui.QIcon(self.ui.app.resource_location + '/warning.png'))
  808. msgbox.setIcon(QtWidgets.QMessageBox.Question)
  809. bt_yes = msgbox.addButton(_('Yes'), QtWidgets.QMessageBox.YesRole)
  810. msgbox.addButton(_('Cancel'), QtWidgets.QMessageBox.NoRole)
  811. msgbox.setDefaultButton(bt_yes)
  812. msgbox.exec_()
  813. response = msgbox.clickedButton()
  814. if theme_new_val != theme:
  815. if response == bt_yes:
  816. theme_settings.setValue('theme', theme_new_val)
  817. # This will write the setting to the platform specific storage.
  818. del theme_settings
  819. should_restart = True
  820. else:
  821. self.ui.general_defaults_form.general_gui_group.theme_radio.set_value(theme)
  822. else:
  823. if response == bt_yes:
  824. self.defaults["global_graphic_engine"] = ge_val
  825. should_restart = True
  826. else:
  827. self.ui.general_defaults_form.general_app_group.ge_radio.set_value(ge)
  828. if save_to_file or should_restart is True:
  829. # Re-fresh project options
  830. self.ui.app.on_options_app2project()
  831. self.save_defaults(silent=False)
  832. # load the defaults so they are updated into the app
  833. self.defaults.load(filename=os.path.join(self.data_path, 'current_defaults.FlatConfig'), inform=self.inform)
  834. settgs = QSettings("Open Source", "FlatCAM")
  835. # save the notebook font size
  836. fsize = self.ui.general_defaults_form.general_app_set_group.notebook_font_size_spinner.get_value()
  837. settgs.setValue('notebook_font_size', fsize)
  838. # save the axis font size
  839. g_fsize = self.ui.general_defaults_form.general_app_set_group.axis_font_size_spinner.get_value()
  840. settgs.setValue('axis_font_size', g_fsize)
  841. # save the textbox font size
  842. tb_fsize = self.ui.general_defaults_form.general_app_set_group.textbox_font_size_spinner.get_value()
  843. settgs.setValue('textbox_font_size', tb_fsize)
  844. # save the HUD font size
  845. hud_fsize = self.ui.general_defaults_form.general_app_set_group.hud_font_size_spinner.get_value()
  846. settgs.setValue('hud_font_size', hud_fsize)
  847. settgs.setValue(
  848. 'machinist',
  849. 1 if self.ui.general_defaults_form.general_app_set_group.machinist_cb.get_value() else 0
  850. )
  851. # This will write the setting to the platform specific storage.
  852. del settgs
  853. if save_to_file:
  854. # close the tab and delete it
  855. for idx in range(self.ui.plot_tab_area.count()):
  856. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  857. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, self.old_color)
  858. self.ui.plot_tab_area.closeTab(idx)
  859. break
  860. if should_restart is True:
  861. self.ui.app.on_app_restart()
  862. def on_pref_close_button(self):
  863. # Preferences saved, update flag
  864. self.preferences_changed_flag = False
  865. self.ignore_tab_close_event = True
  866. # restore stylesheet to default for the statusBar icon
  867. self.ui.pref_status_label.setStyleSheet("")
  868. try:
  869. self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.disconnect()
  870. except (TypeError, AttributeError):
  871. pass
  872. self.defaults_write_form(source_dict=self.defaults.current_defaults)
  873. self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(
  874. lambda: self.ui.app.on_toggle_units(no_pref=False))
  875. self.defaults.update(self.defaults.current_defaults)
  876. # Preferences save, update the color of the Preferences Tab text
  877. for idx in range(self.ui.plot_tab_area.count()):
  878. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  879. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, self.old_color)
  880. self.ui.plot_tab_area.closeTab(idx)
  881. break
  882. self.inform.emit('%s' % _("Preferences closed without saving."))
  883. self.ignore_tab_close_event = False
  884. def on_restore_defaults_preferences(self):
  885. """
  886. Loads the application's factory default settings into ``self.defaults``.
  887. :return: None
  888. """
  889. log.debug("on_restore_defaults_preferences()")
  890. self.defaults.reset_to_factory_defaults()
  891. self.on_preferences_edited()
  892. self.inform.emit('[success] %s' % _("Preferences default values are restored."))
  893. def save_defaults(self, silent=False, data_path=None, first_time=False):
  894. """
  895. Saves application default options
  896. ``self.defaults`` to current_defaults.FlatConfig file.
  897. Save the toolbars visibility status to the preferences file (current_defaults.FlatConfig) to be
  898. used at the next launch of the application.
  899. :param silent: Whether to display a message in status bar or not; boolean
  900. :param data_path: The path where to save the preferences file (current_defaults.FlatConfig)
  901. When the application is portable it should be a mobile location.
  902. :param first_time: Boolean. If True will execute some code when the app is run first time
  903. :return: None
  904. """
  905. log.debug("App.PreferencesUIManager.save_defaults()")
  906. if data_path is None:
  907. data_path = self.data_path
  908. self.defaults.propagate_defaults()
  909. if first_time is False:
  910. self.save_toolbar_view()
  911. # Save the options to disk
  912. filename = os.path.join(data_path, "current_defaults.FlatConfig")
  913. try:
  914. self.defaults.write(filename=filename)
  915. except Exception as e:
  916. log.error("save_defaults() --> Failed to write defaults to file %s" % str(e))
  917. self.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed to write defaults to file."), str(filename)))
  918. return
  919. if not silent:
  920. self.inform.emit('[success] %s' % _("Preferences saved."))
  921. # update the autosave timer
  922. self.ui.app.save_project_auto_update()
  923. def save_toolbar_view(self):
  924. """
  925. Will save the toolbar view state to the defaults
  926. :return: None
  927. """
  928. # Save the toolbar view
  929. tb_status = 0
  930. if self.ui.toolbarfile.isVisible():
  931. tb_status += 1
  932. if self.ui.toolbaredit.isVisible():
  933. tb_status += 2
  934. if self.ui.toolbarview.isVisible():
  935. tb_status += 4
  936. if self.ui.toolbartools.isVisible():
  937. tb_status += 8
  938. if self.ui.exc_edit_toolbar.isVisible():
  939. tb_status += 16
  940. if self.ui.geo_edit_toolbar.isVisible():
  941. tb_status += 32
  942. if self.ui.grb_edit_toolbar.isVisible():
  943. tb_status += 64
  944. if self.ui.status_toolbar.isVisible():
  945. tb_status += 128
  946. if self.ui.toolbarshell.isVisible():
  947. tb_status += 256
  948. self.defaults["global_toolbar_view"] = tb_status
  949. def on_preferences_edited(self):
  950. """
  951. Executed when a preference was changed in the Edit -> Preferences tab.
  952. Will color the Preferences tab text to Red color.
  953. :return:
  954. """
  955. if self.preferences_changed_flag is False:
  956. self.inform.emit('[WARNING_NOTCL] %s' % _("Preferences edited but not saved."))
  957. for idx in range(self.ui.plot_tab_area.count()):
  958. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  959. self.old_color = self.ui.plot_tab_area.tabBar.tabTextColor(idx)
  960. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('red'))
  961. self.ui.pref_apply_button.setStyleSheet("QPushButton {color: red;}")
  962. self.ui.pref_apply_button.setIcon(QtGui.QIcon(self.ui.app.resource_location + '/apply_red32.png'))
  963. self.preferences_changed_flag = True
  964. def on_close_preferences_tab(self):
  965. if self.ignore_tab_close_event:
  966. return
  967. # restore stylesheet to default for the statusBar icon
  968. self.ui.pref_status_label.setStyleSheet("")
  969. # disconnect
  970. for idx in range(self.ui.pref_tab_area.count()):
  971. for tb in self.ui.pref_tab_area.widget(idx).findChildren(QtCore.QObject):
  972. try:
  973. tb.textEdited.disconnect(self.on_preferences_edited)
  974. except (TypeError, AttributeError):
  975. pass
  976. try:
  977. tb.modificationChanged.disconnect(self.on_preferences_edited)
  978. except (TypeError, AttributeError):
  979. pass
  980. try:
  981. tb.toggled.disconnect(self.on_preferences_edited)
  982. except (TypeError, AttributeError):
  983. pass
  984. try:
  985. tb.valueChanged.disconnect(self.on_preferences_edited)
  986. except (TypeError, AttributeError):
  987. pass
  988. try:
  989. tb.currentIndexChanged.disconnect(self.on_preferences_edited)
  990. except (TypeError, AttributeError):
  991. pass
  992. # Prompt user to save
  993. if self.preferences_changed_flag is True:
  994. msgbox = QtWidgets.QMessageBox()
  995. msgbox.setText(_("One or more values are changed.\n"
  996. "Do you want to save the Preferences?"))
  997. msgbox.setWindowTitle(_("Save Preferences"))
  998. msgbox.setWindowIcon(QtGui.QIcon(self.ui.app.resource_location + '/save_as.png'))
  999. msgbox.setIcon(QtWidgets.QMessageBox.Question)
  1000. bt_yes = msgbox.addButton(_('Yes'), QtWidgets.QMessageBox.YesRole)
  1001. msgbox.addButton(_('No'), QtWidgets.QMessageBox.NoRole)
  1002. msgbox.setDefaultButton(bt_yes)
  1003. msgbox.exec_()
  1004. response = msgbox.clickedButton()
  1005. if response == bt_yes:
  1006. self.on_save_button(save_to_file=True)
  1007. self.inform.emit('[success] %s' % _("Preferences saved."))
  1008. else:
  1009. self.preferences_changed_flag = False
  1010. self.inform.emit('')
  1011. return