PreferencesUIManager.py 73 KB

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