PreferencesUIManager.py 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823
  1. import os
  2. from typing import Any, Dict
  3. from PyQt5 import QtGui, QtCore, QtWidgets
  4. from PyQt5.QtCore import QSettings
  5. from defaults import FlatCAMDefaults
  6. import logging
  7. import gettext
  8. import FlatCAMTranslation as fcTranslate
  9. import builtins
  10. from flatcamGUI.preferences.OptionUI import OptionUI
  11. fcTranslate.apply_language('strings')
  12. if '_' not in builtins.__dict__:
  13. _ = gettext.gettext
  14. settings = QSettings("Open Source", "FlatCAM")
  15. if settings.contains("machinist"):
  16. machinist_setting = settings.value('machinist', type=int)
  17. else:
  18. machinist_setting = 0
  19. log = logging.getLogger('PreferencesUIManager')
  20. class PreferencesUIManager:
  21. def __init__(self, defaults: FlatCAMDefaults, data_path: str, ui, inform):
  22. """
  23. Class that control the Preferences Tab
  24. :param defaults: a dictionary storage where all the application settings are stored
  25. :param data_path: a path to the file where all the preferences are stored for persistence
  26. :param ui: reference to the FlatCAMGUI class which constructs the UI
  27. :param inform: a pyqtSignal used to display information in the StatusBar of the GUI
  28. """
  29. self.defaults = defaults
  30. self.data_path = data_path
  31. self.ui = ui
  32. self.inform = inform
  33. self.ignore_tab_close_event = False
  34. # if Preferences are changed in the Edit -> Preferences tab the value will be set to True
  35. self.preferences_changed_flag = False
  36. # when adding entries here read the comments in the method found below named:
  37. # def new_object(self, kind, name, initialize, active=True, fit=True, plot=True)
  38. self.defaults_form_fields = {
  39. # Excellon General
  40. "excellon_plot": self.ui.excellon_defaults_form.excellon_gen_group.plot_cb,
  41. "excellon_solid": self.ui.excellon_defaults_form.excellon_gen_group.solid_cb,
  42. "excellon_format_upper_in":
  43. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry,
  44. "excellon_format_lower_in":
  45. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry,
  46. "excellon_format_upper_mm":
  47. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry,
  48. "excellon_format_lower_mm":
  49. self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry,
  50. "excellon_zeros": self.ui.excellon_defaults_form.excellon_gen_group.excellon_zeros_radio,
  51. "excellon_units": self.ui.excellon_defaults_form.excellon_gen_group.excellon_units_radio,
  52. "excellon_update": self.ui.excellon_defaults_form.excellon_gen_group.update_excellon_cb,
  53. "excellon_optimization_type": self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio,
  54. "excellon_search_time": self.ui.excellon_defaults_form.excellon_gen_group.optimization_time_entry,
  55. "excellon_plot_fill": self.ui.excellon_defaults_form.excellon_gen_group.fill_color_entry,
  56. "excellon_plot_line": self.ui.excellon_defaults_form.excellon_gen_group.line_color_entry,
  57. # Excellon Options
  58. "excellon_operation": self.ui.excellon_defaults_form.excellon_opt_group.operation_radio,
  59. "excellon_milling_type": self.ui.excellon_defaults_form.excellon_opt_group.milling_type_radio,
  60. "excellon_milling_dia": self.ui.excellon_defaults_form.excellon_opt_group.mill_dia_entry,
  61. "excellon_cutz": self.ui.excellon_defaults_form.excellon_opt_group.cutz_entry,
  62. "excellon_multidepth": self.ui.excellon_defaults_form.excellon_opt_group.mpass_cb,
  63. "excellon_depthperpass": self.ui.excellon_defaults_form.excellon_opt_group.maxdepth_entry,
  64. "excellon_travelz": self.ui.excellon_defaults_form.excellon_opt_group.travelz_entry,
  65. "excellon_endz": self.ui.excellon_defaults_form.excellon_opt_group.endz_entry,
  66. "excellon_endxy": self.ui.excellon_defaults_form.excellon_opt_group.endxy_entry,
  67. "excellon_feedrate_z": self.ui.excellon_defaults_form.excellon_opt_group.feedrate_z_entry,
  68. "excellon_spindlespeed": self.ui.excellon_defaults_form.excellon_opt_group.spindlespeed_entry,
  69. "excellon_dwell": self.ui.excellon_defaults_form.excellon_opt_group.dwell_cb,
  70. "excellon_dwelltime": self.ui.excellon_defaults_form.excellon_opt_group.dwelltime_entry,
  71. "excellon_toolchange": self.ui.excellon_defaults_form.excellon_opt_group.toolchange_cb,
  72. "excellon_toolchangez": self.ui.excellon_defaults_form.excellon_opt_group.toolchangez_entry,
  73. "excellon_ppname_e": self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb,
  74. "excellon_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.tooldia_entry,
  75. "excellon_slot_tooldia": self.ui.excellon_defaults_form.excellon_opt_group.slot_tooldia_entry,
  76. "excellon_gcode_type": self.ui.excellon_defaults_form.excellon_opt_group.excellon_gcode_type_radio,
  77. # Excellon Advanced Options
  78. "excellon_offset": self.ui.excellon_defaults_form.excellon_adv_opt_group.offset_entry,
  79. "excellon_toolchangexy": self.ui.excellon_defaults_form.excellon_adv_opt_group.toolchangexy_entry,
  80. "excellon_startz": self.ui.excellon_defaults_form.excellon_adv_opt_group.estartz_entry,
  81. "excellon_feedrate_rapid": self.ui.excellon_defaults_form.excellon_adv_opt_group.feedrate_rapid_entry,
  82. "excellon_z_pdepth": self.ui.excellon_defaults_form.excellon_adv_opt_group.pdepth_entry,
  83. "excellon_feedrate_probe": self.ui.excellon_defaults_form.excellon_adv_opt_group.feedrate_probe_entry,
  84. "excellon_spindledir": self.ui.excellon_defaults_form.excellon_adv_opt_group.spindledir_radio,
  85. "excellon_f_plunge": self.ui.excellon_defaults_form.excellon_adv_opt_group.fplunge_cb,
  86. "excellon_f_retract": self.ui.excellon_defaults_form.excellon_adv_opt_group.fretract_cb,
  87. # Excellon Export
  88. "excellon_exp_units": self.ui.excellon_defaults_form.excellon_exp_group.excellon_units_radio,
  89. "excellon_exp_format": self.ui.excellon_defaults_form.excellon_exp_group.format_radio,
  90. "excellon_exp_integer": self.ui.excellon_defaults_form.excellon_exp_group.format_whole_entry,
  91. "excellon_exp_decimals": self.ui.excellon_defaults_form.excellon_exp_group.format_dec_entry,
  92. "excellon_exp_zeros": self.ui.excellon_defaults_form.excellon_exp_group.zeros_radio,
  93. "excellon_exp_slot_type": self.ui.excellon_defaults_form.excellon_exp_group.slot_type_radio,
  94. # Excellon Editor
  95. "excellon_editor_sel_limit": self.ui.excellon_defaults_form.excellon_editor_group.sel_limit_entry,
  96. "excellon_editor_newdia": self.ui.excellon_defaults_form.excellon_editor_group.addtool_entry,
  97. "excellon_editor_array_size": self.ui.excellon_defaults_form.excellon_editor_group.drill_array_size_entry,
  98. "excellon_editor_lin_dir": self.ui.excellon_defaults_form.excellon_editor_group.drill_axis_radio,
  99. "excellon_editor_lin_pitch": self.ui.excellon_defaults_form.excellon_editor_group.drill_pitch_entry,
  100. "excellon_editor_lin_angle": self.ui.excellon_defaults_form.excellon_editor_group.drill_angle_entry,
  101. "excellon_editor_circ_dir": self.ui.excellon_defaults_form.excellon_editor_group.drill_circular_dir_radio,
  102. "excellon_editor_circ_angle":
  103. self.ui.excellon_defaults_form.excellon_editor_group.drill_circular_angle_entry,
  104. # Excellon Slots
  105. "excellon_editor_slot_direction":
  106. self.ui.excellon_defaults_form.excellon_editor_group.slot_axis_radio,
  107. "excellon_editor_slot_angle":
  108. self.ui.excellon_defaults_form.excellon_editor_group.slot_angle_spinner,
  109. "excellon_editor_slot_length":
  110. self.ui.excellon_defaults_form.excellon_editor_group.slot_length_entry,
  111. # Excellon Slots
  112. "excellon_editor_slot_array_size":
  113. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_size_entry,
  114. "excellon_editor_slot_lin_dir": self.ui.excellon_defaults_form.excellon_editor_group.slot_array_axis_radio,
  115. "excellon_editor_slot_lin_pitch":
  116. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_pitch_entry,
  117. "excellon_editor_slot_lin_angle":
  118. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_angle_entry,
  119. "excellon_editor_slot_circ_dir":
  120. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_dir_radio,
  121. "excellon_editor_slot_circ_angle":
  122. self.ui.excellon_defaults_form.excellon_editor_group.slot_array_circular_angle_entry,
  123. # NCC Tool
  124. "tools_ncctools": self.ui.tools_defaults_form.tools_ncc_group.ncc_tool_dia_entry,
  125. "tools_nccorder": self.ui.tools_defaults_form.tools_ncc_group.ncc_order_radio,
  126. "tools_nccoverlap": self.ui.tools_defaults_form.tools_ncc_group.ncc_overlap_entry,
  127. "tools_nccmargin": self.ui.tools_defaults_form.tools_ncc_group.ncc_margin_entry,
  128. "tools_nccmethod": self.ui.tools_defaults_form.tools_ncc_group.ncc_method_combo,
  129. "tools_nccconnect": self.ui.tools_defaults_form.tools_ncc_group.ncc_connect_cb,
  130. "tools_ncccontour": self.ui.tools_defaults_form.tools_ncc_group.ncc_contour_cb,
  131. "tools_nccrest": self.ui.tools_defaults_form.tools_ncc_group.ncc_rest_cb,
  132. "tools_ncc_offset_choice": self.ui.tools_defaults_form.tools_ncc_group.ncc_choice_offset_cb,
  133. "tools_ncc_offset_value": self.ui.tools_defaults_form.tools_ncc_group.ncc_offset_spinner,
  134. "tools_nccref": self.ui.tools_defaults_form.tools_ncc_group.select_combo,
  135. "tools_ncc_area_shape": self.ui.tools_defaults_form.tools_ncc_group.area_shape_radio,
  136. "tools_ncc_plotting": self.ui.tools_defaults_form.tools_ncc_group.ncc_plotting_radio,
  137. "tools_nccmilling_type": self.ui.tools_defaults_form.tools_ncc_group.milling_type_radio,
  138. "tools_ncctool_type": self.ui.tools_defaults_form.tools_ncc_group.tool_type_radio,
  139. "tools_ncccutz": self.ui.tools_defaults_form.tools_ncc_group.cutz_entry,
  140. "tools_ncctipdia": self.ui.tools_defaults_form.tools_ncc_group.tipdia_entry,
  141. "tools_ncctipangle": self.ui.tools_defaults_form.tools_ncc_group.tipangle_entry,
  142. "tools_nccnewdia": self.ui.tools_defaults_form.tools_ncc_group.newdia_entry,
  143. # CutOut Tool
  144. "tools_cutouttooldia": self.ui.tools_defaults_form.tools_cutout_group.cutout_tooldia_entry,
  145. "tools_cutoutkind": self.ui.tools_defaults_form.tools_cutout_group.obj_kind_combo,
  146. "tools_cutoutmargin": self.ui.tools_defaults_form.tools_cutout_group.cutout_margin_entry,
  147. "tools_cutout_z": self.ui.tools_defaults_form.tools_cutout_group.cutz_entry,
  148. "tools_cutout_depthperpass": self.ui.tools_defaults_form.tools_cutout_group.maxdepth_entry,
  149. "tools_cutout_mdepth": self.ui.tools_defaults_form.tools_cutout_group.mpass_cb,
  150. "tools_cutoutgapsize": self.ui.tools_defaults_form.tools_cutout_group.cutout_gap_entry,
  151. "tools_gaps_ff": self.ui.tools_defaults_form.tools_cutout_group.gaps_combo,
  152. "tools_cutout_convexshape": self.ui.tools_defaults_form.tools_cutout_group.convex_box,
  153. # Paint Area Tool
  154. "tools_painttooldia": self.ui.tools_defaults_form.tools_paint_group.painttooldia_entry,
  155. "tools_paintorder": self.ui.tools_defaults_form.tools_paint_group.paint_order_radio,
  156. "tools_paintoverlap": self.ui.tools_defaults_form.tools_paint_group.paintoverlap_entry,
  157. "tools_paintmargin": self.ui.tools_defaults_form.tools_paint_group.paintmargin_entry,
  158. "tools_paintmethod": self.ui.tools_defaults_form.tools_paint_group.paintmethod_combo,
  159. "tools_selectmethod": self.ui.tools_defaults_form.tools_paint_group.selectmethod_combo,
  160. "tools_paint_area_shape": self.ui.tools_defaults_form.tools_paint_group.area_shape_radio,
  161. "tools_pathconnect": self.ui.tools_defaults_form.tools_paint_group.pathconnect_cb,
  162. "tools_paintcontour": self.ui.tools_defaults_form.tools_paint_group.contour_cb,
  163. "tools_paint_plotting": self.ui.tools_defaults_form.tools_paint_group.paint_plotting_radio,
  164. "tools_paintrest": self.ui.tools_defaults_form.tools_paint_group.rest_cb,
  165. "tools_painttool_type": self.ui.tools_defaults_form.tools_paint_group.tool_type_radio,
  166. "tools_paintcutz": self.ui.tools_defaults_form.tools_paint_group.cutz_entry,
  167. "tools_painttipdia": self.ui.tools_defaults_form.tools_paint_group.tipdia_entry,
  168. "tools_painttipangle": self.ui.tools_defaults_form.tools_paint_group.tipangle_entry,
  169. "tools_paintnewdia": self.ui.tools_defaults_form.tools_paint_group.newdia_entry,
  170. # 2-sided Tool
  171. "tools_2sided_mirror_axis": self.ui.tools_defaults_form.tools_2sided_group.mirror_axis_radio,
  172. "tools_2sided_axis_loc": self.ui.tools_defaults_form.tools_2sided_group.axis_location_radio,
  173. "tools_2sided_drilldia": self.ui.tools_defaults_form.tools_2sided_group.drill_dia_entry,
  174. "tools_2sided_allign_axis": self.ui.tools_defaults_form.tools_2sided_group.align_axis_radio,
  175. # Film Tool
  176. "tools_film_type": self.ui.tools_defaults_form.tools_film_group.film_type_radio,
  177. "tools_film_boundary": self.ui.tools_defaults_form.tools_film_group.film_boundary_entry,
  178. "tools_film_scale_stroke": self.ui.tools_defaults_form.tools_film_group.film_scale_stroke_entry,
  179. "tools_film_color": self.ui.tools_defaults_form.tools_film_group.film_color_entry,
  180. "tools_film_scale_cb": self.ui.tools_defaults_form.tools_film_group.film_scale_cb,
  181. "tools_film_scale_x_entry": self.ui.tools_defaults_form.tools_film_group.film_scalex_entry,
  182. "tools_film_scale_y_entry": self.ui.tools_defaults_form.tools_film_group.film_scaley_entry,
  183. "tools_film_skew_cb": self.ui.tools_defaults_form.tools_film_group.film_skew_cb,
  184. "tools_film_skew_x_entry": self.ui.tools_defaults_form.tools_film_group.film_skewx_entry,
  185. "tools_film_skew_y_entry": self.ui.tools_defaults_form.tools_film_group.film_skewy_entry,
  186. "tools_film_skew_ref_radio": self.ui.tools_defaults_form.tools_film_group.film_skew_reference,
  187. "tools_film_mirror_cb": self.ui.tools_defaults_form.tools_film_group.film_mirror_cb,
  188. "tools_film_mirror_axis_radio": self.ui.tools_defaults_form.tools_film_group.film_mirror_axis,
  189. "tools_film_file_type_radio": self.ui.tools_defaults_form.tools_film_group.file_type_radio,
  190. "tools_film_orientation": self.ui.tools_defaults_form.tools_film_group.orientation_radio,
  191. "tools_film_pagesize": self.ui.tools_defaults_form.tools_film_group.pagesize_combo,
  192. # Panelize Tool
  193. "tools_panelize_spacing_columns": self.ui.tools_defaults_form.tools_panelize_group.pspacing_columns,
  194. "tools_panelize_spacing_rows": self.ui.tools_defaults_form.tools_panelize_group.pspacing_rows,
  195. "tools_panelize_columns": self.ui.tools_defaults_form.tools_panelize_group.pcolumns,
  196. "tools_panelize_rows": self.ui.tools_defaults_form.tools_panelize_group.prows,
  197. "tools_panelize_constrain": self.ui.tools_defaults_form.tools_panelize_group.pconstrain_cb,
  198. "tools_panelize_constrainx": self.ui.tools_defaults_form.tools_panelize_group.px_width_entry,
  199. "tools_panelize_constrainy": self.ui.tools_defaults_form.tools_panelize_group.py_height_entry,
  200. "tools_panelize_panel_type": self.ui.tools_defaults_form.tools_panelize_group.panel_type_radio,
  201. # Calculators Tool
  202. "tools_calc_vshape_tip_dia": self.ui.tools_defaults_form.tools_calculators_group.tip_dia_entry,
  203. "tools_calc_vshape_tip_angle": self.ui.tools_defaults_form.tools_calculators_group.tip_angle_entry,
  204. "tools_calc_vshape_cut_z": self.ui.tools_defaults_form.tools_calculators_group.cut_z_entry,
  205. "tools_calc_electro_length": self.ui.tools_defaults_form.tools_calculators_group.pcblength_entry,
  206. "tools_calc_electro_width": self.ui.tools_defaults_form.tools_calculators_group.pcbwidth_entry,
  207. "tools_calc_electro_cdensity": self.ui.tools_defaults_form.tools_calculators_group.cdensity_entry,
  208. "tools_calc_electro_growth": self.ui.tools_defaults_form.tools_calculators_group.growth_entry,
  209. # Transformations Tool
  210. "tools_transform_rotate": self.ui.tools_defaults_form.tools_transform_group.rotate_entry,
  211. "tools_transform_skew_x": self.ui.tools_defaults_form.tools_transform_group.skewx_entry,
  212. "tools_transform_skew_y": self.ui.tools_defaults_form.tools_transform_group.skewy_entry,
  213. "tools_transform_scale_x": self.ui.tools_defaults_form.tools_transform_group.scalex_entry,
  214. "tools_transform_scale_y": self.ui.tools_defaults_form.tools_transform_group.scaley_entry,
  215. "tools_transform_scale_link": self.ui.tools_defaults_form.tools_transform_group.link_cb,
  216. "tools_transform_scale_reference": self.ui.tools_defaults_form.tools_transform_group.reference_cb,
  217. "tools_transform_offset_x": self.ui.tools_defaults_form.tools_transform_group.offx_entry,
  218. "tools_transform_offset_y": self.ui.tools_defaults_form.tools_transform_group.offy_entry,
  219. "tools_transform_mirror_reference": self.ui.tools_defaults_form.tools_transform_group.mirror_reference_cb,
  220. "tools_transform_mirror_point": self.ui.tools_defaults_form.tools_transform_group.flip_ref_entry,
  221. "tools_transform_buffer_dis": self.ui.tools_defaults_form.tools_transform_group.buffer_entry,
  222. "tools_transform_buffer_factor": self.ui.tools_defaults_form.tools_transform_group.buffer_factor_entry,
  223. "tools_transform_buffer_corner": self.ui.tools_defaults_form.tools_transform_group.buffer_rounded_cb,
  224. # SolderPaste Dispensing Tool
  225. "tools_solderpaste_tools": self.ui.tools_defaults_form.tools_solderpaste_group.nozzle_tool_dia_entry,
  226. "tools_solderpaste_new": self.ui.tools_defaults_form.tools_solderpaste_group.addtool_entry,
  227. "tools_solderpaste_z_start": self.ui.tools_defaults_form.tools_solderpaste_group.z_start_entry,
  228. "tools_solderpaste_z_dispense": self.ui.tools_defaults_form.tools_solderpaste_group.z_dispense_entry,
  229. "tools_solderpaste_z_stop": self.ui.tools_defaults_form.tools_solderpaste_group.z_stop_entry,
  230. "tools_solderpaste_z_travel": self.ui.tools_defaults_form.tools_solderpaste_group.z_travel_entry,
  231. "tools_solderpaste_z_toolchange": self.ui.tools_defaults_form.tools_solderpaste_group.z_toolchange_entry,
  232. "tools_solderpaste_xy_toolchange": self.ui.tools_defaults_form.tools_solderpaste_group.xy_toolchange_entry,
  233. "tools_solderpaste_frxy": self.ui.tools_defaults_form.tools_solderpaste_group.frxy_entry,
  234. "tools_solderpaste_frz": self.ui.tools_defaults_form.tools_solderpaste_group.frz_entry,
  235. "tools_solderpaste_frz_dispense": self.ui.tools_defaults_form.tools_solderpaste_group.frz_dispense_entry,
  236. "tools_solderpaste_speedfwd": self.ui.tools_defaults_form.tools_solderpaste_group.speedfwd_entry,
  237. "tools_solderpaste_dwellfwd": self.ui.tools_defaults_form.tools_solderpaste_group.dwellfwd_entry,
  238. "tools_solderpaste_speedrev": self.ui.tools_defaults_form.tools_solderpaste_group.speedrev_entry,
  239. "tools_solderpaste_dwellrev": self.ui.tools_defaults_form.tools_solderpaste_group.dwellrev_entry,
  240. "tools_solderpaste_pp": self.ui.tools_defaults_form.tools_solderpaste_group.pp_combo,
  241. "tools_sub_close_paths": self.ui.tools_defaults_form.tools_sub_group.close_paths_cb,
  242. # #######################################################################################################
  243. # ########################################## TOOLS 2 ####################################################
  244. # #######################################################################################################
  245. # Optimal Tool
  246. "tools_opt_precision": self.ui.tools2_defaults_form.tools2_optimal_group.precision_sp,
  247. # Check Rules Tool
  248. "tools_cr_trace_size": self.ui.tools2_defaults_form.tools2_checkrules_group.trace_size_cb,
  249. "tools_cr_trace_size_val": self.ui.tools2_defaults_form.tools2_checkrules_group.trace_size_entry,
  250. "tools_cr_c2c": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2copper_cb,
  251. "tools_cr_c2c_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2copper_entry,
  252. "tools_cr_c2o": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2ol_cb,
  253. "tools_cr_c2o_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_copper2ol_entry,
  254. "tools_cr_s2s": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2silk_cb,
  255. "tools_cr_s2s_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2silk_entry,
  256. "tools_cr_s2sm": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2sm_cb,
  257. "tools_cr_s2sm_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2sm_entry,
  258. "tools_cr_s2o": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2ol_cb,
  259. "tools_cr_s2o_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_silk2ol_entry,
  260. "tools_cr_sm2sm": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_sm2sm_cb,
  261. "tools_cr_sm2sm_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_sm2sm_entry,
  262. "tools_cr_ri": self.ui.tools2_defaults_form.tools2_checkrules_group.ring_integrity_cb,
  263. "tools_cr_ri_val": self.ui.tools2_defaults_form.tools2_checkrules_group.ring_integrity_entry,
  264. "tools_cr_h2h": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_d2d_cb,
  265. "tools_cr_h2h_val": self.ui.tools2_defaults_form.tools2_checkrules_group.clearance_d2d_entry,
  266. "tools_cr_dh": self.ui.tools2_defaults_form.tools2_checkrules_group.drill_size_cb,
  267. "tools_cr_dh_val": self.ui.tools2_defaults_form.tools2_checkrules_group.drill_size_entry,
  268. # QRCode Tool
  269. "tools_qrcode_version": self.ui.tools2_defaults_form.tools2_qrcode_group.version_entry,
  270. "tools_qrcode_error": self.ui.tools2_defaults_form.tools2_qrcode_group.error_radio,
  271. "tools_qrcode_box_size": self.ui.tools2_defaults_form.tools2_qrcode_group.bsize_entry,
  272. "tools_qrcode_border_size": self.ui.tools2_defaults_form.tools2_qrcode_group.border_size_entry,
  273. "tools_qrcode_qrdata": self.ui.tools2_defaults_form.tools2_qrcode_group.text_data,
  274. "tools_qrcode_polarity": self.ui.tools2_defaults_form.tools2_qrcode_group.pol_radio,
  275. "tools_qrcode_rounded": self.ui.tools2_defaults_form.tools2_qrcode_group.bb_radio,
  276. "tools_qrcode_fill_color": self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_entry,
  277. "tools_qrcode_back_color": self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_entry,
  278. "tools_qrcode_sel_limit": self.ui.tools2_defaults_form.tools2_qrcode_group.sel_limit_entry,
  279. # Copper Thieving Tool
  280. "tools_copper_thieving_clearance": self.ui.tools2_defaults_form.tools2_cfill_group.clearance_entry,
  281. "tools_copper_thieving_margin": self.ui.tools2_defaults_form.tools2_cfill_group.margin_entry,
  282. "tools_copper_thieving_reference": self.ui.tools2_defaults_form.tools2_cfill_group.reference_radio,
  283. "tools_copper_thieving_box_type": self.ui.tools2_defaults_form.tools2_cfill_group.bbox_type_radio,
  284. "tools_copper_thieving_circle_steps": self.ui.tools2_defaults_form.tools2_cfill_group.circlesteps_entry,
  285. "tools_copper_thieving_fill_type": self.ui.tools2_defaults_form.tools2_cfill_group.fill_type_radio,
  286. "tools_copper_thieving_dots_dia": self.ui.tools2_defaults_form.tools2_cfill_group.dot_dia_entry,
  287. "tools_copper_thieving_dots_spacing": self.ui.tools2_defaults_form.tools2_cfill_group.dot_spacing_entry,
  288. "tools_copper_thieving_squares_size": self.ui.tools2_defaults_form.tools2_cfill_group.square_size_entry,
  289. "tools_copper_thieving_squares_spacing":
  290. self.ui.tools2_defaults_form.tools2_cfill_group.squares_spacing_entry,
  291. "tools_copper_thieving_lines_size": self.ui.tools2_defaults_form.tools2_cfill_group.line_size_entry,
  292. "tools_copper_thieving_lines_spacing": self.ui.tools2_defaults_form.tools2_cfill_group.lines_spacing_entry,
  293. "tools_copper_thieving_rb_margin": self.ui.tools2_defaults_form.tools2_cfill_group.rb_margin_entry,
  294. "tools_copper_thieving_rb_thickness": self.ui.tools2_defaults_form.tools2_cfill_group.rb_thickness_entry,
  295. "tools_copper_thieving_mask_clearance": self.ui.tools2_defaults_form.tools2_cfill_group.clearance_ppm_entry,
  296. # Fiducials Tool
  297. "tools_fiducials_dia": self.ui.tools2_defaults_form.tools2_fiducials_group.dia_entry,
  298. "tools_fiducials_margin": self.ui.tools2_defaults_form.tools2_fiducials_group.margin_entry,
  299. "tools_fiducials_mode": self.ui.tools2_defaults_form.tools2_fiducials_group.mode_radio,
  300. "tools_fiducials_second_pos": self.ui.tools2_defaults_form.tools2_fiducials_group.pos_radio,
  301. "tools_fiducials_type": self.ui.tools2_defaults_form.tools2_fiducials_group.fid_type_radio,
  302. "tools_fiducials_line_thickness": self.ui.tools2_defaults_form.tools2_fiducials_group.line_thickness_entry,
  303. # Calibration Tool
  304. "tools_cal_calsource": self.ui.tools2_defaults_form.tools2_cal_group.cal_source_radio,
  305. "tools_cal_travelz": self.ui.tools2_defaults_form.tools2_cal_group.travelz_entry,
  306. "tools_cal_verz": self.ui.tools2_defaults_form.tools2_cal_group.verz_entry,
  307. "tools_cal_zeroz": self.ui.tools2_defaults_form.tools2_cal_group.zeroz_cb,
  308. "tools_cal_toolchangez": self.ui.tools2_defaults_form.tools2_cal_group.toolchangez_entry,
  309. "tools_cal_toolchange_xy": self.ui.tools2_defaults_form.tools2_cal_group.toolchange_xy_entry,
  310. "tools_cal_sec_point": self.ui.tools2_defaults_form.tools2_cal_group.second_point_radio,
  311. # Extract Drills Tool
  312. "tools_edrills_hole_type": self.ui.tools2_defaults_form.tools2_edrills_group.hole_size_radio,
  313. "tools_edrills_hole_fixed_dia": self.ui.tools2_defaults_form.tools2_edrills_group.dia_entry,
  314. "tools_edrills_hole_prop_factor": self.ui.tools2_defaults_form.tools2_edrills_group.factor_entry,
  315. "tools_edrills_circular_ring": self.ui.tools2_defaults_form.tools2_edrills_group.circular_ring_entry,
  316. "tools_edrills_oblong_ring": self.ui.tools2_defaults_form.tools2_edrills_group.oblong_ring_entry,
  317. "tools_edrills_square_ring": self.ui.tools2_defaults_form.tools2_edrills_group.square_ring_entry,
  318. "tools_edrills_rectangular_ring": self.ui.tools2_defaults_form.tools2_edrills_group.rectangular_ring_entry,
  319. "tools_edrills_others_ring": self.ui.tools2_defaults_form.tools2_edrills_group.other_ring_entry,
  320. "tools_edrills_circular": self.ui.tools2_defaults_form.tools2_edrills_group.circular_cb,
  321. "tools_edrills_oblong": self.ui.tools2_defaults_form.tools2_edrills_group.oblong_cb,
  322. "tools_edrills_square": self.ui.tools2_defaults_form.tools2_edrills_group.square_cb,
  323. "tools_edrills_rectangular": self.ui.tools2_defaults_form.tools2_edrills_group.rectangular_cb,
  324. "tools_edrills_others": self.ui.tools2_defaults_form.tools2_edrills_group.other_cb,
  325. # Punch Gerber Tool
  326. "tools_punch_hole_type": self.ui.tools2_defaults_form.tools2_punch_group.hole_size_radio,
  327. "tools_punch_hole_fixed_dia": self.ui.tools2_defaults_form.tools2_punch_group.dia_entry,
  328. "tools_punch_hole_prop_factor": self.ui.tools2_defaults_form.tools2_punch_group.factor_entry,
  329. "tools_punch_circular_ring": self.ui.tools2_defaults_form.tools2_punch_group.circular_ring_entry,
  330. "tools_punch_oblong_ring": self.ui.tools2_defaults_form.tools2_punch_group.oblong_ring_entry,
  331. "tools_punch_square_ring": self.ui.tools2_defaults_form.tools2_punch_group.square_ring_entry,
  332. "tools_punch_rectangular_ring": self.ui.tools2_defaults_form.tools2_punch_group.rectangular_ring_entry,
  333. "tools_punch_others_ring": self.ui.tools2_defaults_form.tools2_punch_group.other_ring_entry,
  334. "tools_punch_circular": self.ui.tools2_defaults_form.tools2_punch_group.circular_cb,
  335. "tools_punch_oblong": self.ui.tools2_defaults_form.tools2_punch_group.oblong_cb,
  336. "tools_punch_square": self.ui.tools2_defaults_form.tools2_punch_group.square_cb,
  337. "tools_punch_rectangular": self.ui.tools2_defaults_form.tools2_punch_group.rectangular_cb,
  338. "tools_punch_others": self.ui.tools2_defaults_form.tools2_punch_group.other_cb,
  339. # Invert Gerber Tool
  340. "tools_invert_margin": self.ui.tools2_defaults_form.tools2_invert_group.margin_entry,
  341. "tools_invert_join_style": self.ui.tools2_defaults_form.tools2_invert_group.join_radio,
  342. # Utilities
  343. # File associations
  344. "fa_excellon": self.ui.util_defaults_form.fa_excellon_group.exc_list_text,
  345. "fa_gcode": self.ui.util_defaults_form.fa_gcode_group.gco_list_text,
  346. # "fa_geometry": self.ui.util_defaults_form.fa_geometry_group.close_paths_cb,
  347. "fa_gerber": self.ui.util_defaults_form.fa_gerber_group.grb_list_text,
  348. "util_autocomplete_keywords": self.ui.util_defaults_form.kw_group.kw_list_text,
  349. }
  350. self.sections = [
  351. ui.general_defaults_form,
  352. ui.gerber_defaults_form,
  353. ui.excellon_defaults_form,
  354. ui.geometry_defaults_form,
  355. ui.cncjob_defaults_form,
  356. ui.tools_defaults_form,
  357. ui.tools2_defaults_form,
  358. ui.util_defaults_form
  359. ]
  360. def get_form_fields(self) -> Dict[str, Any]:
  361. result = {}
  362. result.update(self.defaults_form_fields)
  363. result.update(self._option_field_dict())
  364. return result
  365. def get_form_field(self, option: str) -> Any:
  366. return self.get_form_fields()[option]
  367. def option_dict(self) -> Dict[str, OptionUI]:
  368. result = {}
  369. for section in self.sections:
  370. sectionoptions = section.option_dict()
  371. result.update(sectionoptions)
  372. return result
  373. def _option_field_dict(self):
  374. result = {k: v.get_field() for k, v in self.option_dict().items()}
  375. return result
  376. def defaults_read_form(self):
  377. """
  378. Will read all the values in the Preferences GUI and update the defaults dictionary.
  379. :return: None
  380. """
  381. for option in self.get_form_fields():
  382. if option in self.defaults:
  383. try:
  384. self.defaults[option] = self.get_form_field(option=option).get_value()
  385. except Exception as e:
  386. log.debug("App.defaults_read_form() --> %s" % str(e))
  387. def defaults_write_form(self, factor=None, fl_units=None, source_dict=None):
  388. """
  389. Will set the values for all the GUI elements in Preferences GUI based on the values found in the
  390. self.defaults dictionary.
  391. :param factor: will apply a factor to the values that written in the GUI elements
  392. :param fl_units: current measuring units in FlatCAM: Metric or Inch
  393. :param source_dict: the repository of options, usually is the self.defaults
  394. :return: None
  395. """
  396. options_storage = self.defaults if source_dict is None else source_dict
  397. for option in options_storage:
  398. if source_dict:
  399. self.defaults_write_form_field(option, factor=factor, units=fl_units, defaults_dict=source_dict)
  400. else:
  401. self.defaults_write_form_field(option, factor=factor, units=fl_units)
  402. def defaults_write_form_field(self, field, factor=None, units=None, defaults_dict=None):
  403. """
  404. Basically it is the worker in the self.defaults_write_form()
  405. :param field: the GUI element in Preferences GUI to be updated
  406. :param factor: factor to be applied to the field parameter
  407. :param units: current FlatCAM measuring units
  408. :param defaults_dict: the defaults storage
  409. :return: None, it updates GUI elements
  410. """
  411. def_dict = self.defaults if defaults_dict is None else defaults_dict
  412. try:
  413. value = def_dict[field]
  414. log.debug("value is " + str(value) + " and factor is "+str(factor))
  415. if factor is not None:
  416. value *= factor
  417. form_field = self.get_form_field(option=field)
  418. if units is None:
  419. form_field.set_value(value)
  420. elif (units == 'IN' or units == 'MM') and (field == 'global_gridx' or field == 'global_gridy'):
  421. form_field.set_value(value)
  422. except KeyError:
  423. pass
  424. except AttributeError:
  425. log.debug(field)
  426. def show_preferences_gui(self):
  427. """
  428. Called to initialize and show the Preferences GUI
  429. :return: None
  430. """
  431. # FIXME this should be done in __init__
  432. for section in self.sections:
  433. tab = section.build_tab()
  434. tab.setObjectName(section.get_tab_id())
  435. self.ui.pref_tab_area.addTab(tab, section.get_tab_label())
  436. # Initialize the color box's color in Preferences -> Global -> Colo
  437. self.__init_color_pickers()
  438. # Button handlers
  439. self.ui.pref_save_button.clicked.connect(lambda: self.on_save_button(save_to_file=True))
  440. self.ui.pref_apply_button.clicked.connect(lambda: self.on_save_button(save_to_file=False))
  441. self.ui.pref_close_button.clicked.connect(self.on_pref_close_button)
  442. self.ui.pref_defaults_button.clicked.connect(self.on_restore_defaults_preferences)
  443. log.debug("Finished Preferences GUI form initialization.")
  444. def __init_color_pickers(self):
  445. # Init Excellon Plot Colors
  446. self.ui.excellon_defaults_form.excellon_gen_group.fill_color_entry.set_value(
  447. self.defaults['excellon_plot_fill'])
  448. self.ui.excellon_defaults_form.excellon_gen_group.fill_color_button.setStyleSheet(
  449. "background-color:%s;"
  450. "border-color: dimgray" % str(self.defaults['excellon_plot_fill'])[:7])
  451. self.ui.excellon_defaults_form.excellon_gen_group.color_alpha_spinner.set_value(
  452. int(self.defaults['excellon_plot_fill'][7:9], 16))
  453. self.ui.excellon_defaults_form.excellon_gen_group.color_alpha_slider.setValue(
  454. int(self.defaults['excellon_plot_fill'][7:9], 16))
  455. self.ui.excellon_defaults_form.excellon_gen_group.line_color_entry.set_value(
  456. self.defaults['excellon_plot_line'])
  457. self.ui.excellon_defaults_form.excellon_gen_group.line_color_button.setStyleSheet(
  458. "background-color:%s;"
  459. "border-color: dimgray" % str(self.defaults['excellon_plot_line'])[:7])
  460. # Init the Tool Film color
  461. self.ui.tools_defaults_form.tools_film_group.film_color_entry.set_value(
  462. self.defaults['tools_film_color'])
  463. self.ui.tools_defaults_form.tools_film_group.film_color_button.setStyleSheet(
  464. "background-color:%s;"
  465. "border-color: dimgray" % str(self.defaults['tools_film_color'])[:7]
  466. )
  467. # Init the Tool QRCode colors
  468. self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_entry.set_value(
  469. self.defaults['tools_qrcode_fill_color'])
  470. self.ui.tools2_defaults_form.tools2_qrcode_group.fill_color_button.setStyleSheet(
  471. "background-color:%s;"
  472. "border-color: dimgray" % str(self.defaults['tools_qrcode_fill_color'])[:7])
  473. self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_entry.set_value(
  474. self.defaults['tools_qrcode_back_color'])
  475. self.ui.tools2_defaults_form.tools2_qrcode_group.back_color_button.setStyleSheet(
  476. "background-color:%s;"
  477. "border-color: dimgray" % str(self.defaults['tools_qrcode_back_color'])[:7])
  478. def on_save_button(self, save_to_file=True):
  479. log.debug("on_save_button() --> Applying preferences to file.")
  480. # Preferences saved, update flag
  481. self.preferences_changed_flag = False
  482. # Preferences save, update the color of the Preferences Tab text
  483. for idx in range(self.ui.plot_tab_area.count()):
  484. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  485. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black'))
  486. # restore the default stylesheet by setting a blank one
  487. self.ui.pref_apply_button.setStyleSheet("")
  488. self.inform.emit('%s' % _("Preferences applied."))
  489. # make sure we update the self.current_defaults dict used to undo changes to self.defaults
  490. self.defaults.current_defaults.update(self.defaults)
  491. # deal with theme change
  492. theme_settings = QtCore.QSettings("Open Source", "FlatCAM")
  493. if theme_settings.contains("theme"):
  494. theme = theme_settings.value('theme', type=str)
  495. else:
  496. theme = 'white'
  497. should_restart = False
  498. val = self.get_form_field("global_theme").get_value()
  499. if val != theme:
  500. msgbox = QtWidgets.QMessageBox()
  501. msgbox.setText(_("Are you sure you want to continue?"))
  502. msgbox.setWindowTitle(_("Application restart"))
  503. msgbox.setWindowIcon(QtGui.QIcon(self.ui.app.resource_location + '/warning.png'))
  504. bt_yes = msgbox.addButton(_('Yes'), QtWidgets.QMessageBox.YesRole)
  505. msgbox.addButton(_('Cancel'), QtWidgets.QMessageBox.NoRole)
  506. msgbox.setDefaultButton(bt_yes)
  507. msgbox.exec_()
  508. response = msgbox.clickedButton()
  509. if response == bt_yes:
  510. theme_settings.setValue('theme', val)
  511. # This will write the setting to the platform specific storage.
  512. del theme_settings
  513. should_restart = True
  514. else:
  515. self.ui.general_defaults_form.general_gui_group.theme_radio.set_value(theme)
  516. if save_to_file or should_restart is True:
  517. self.save_defaults(silent=False)
  518. # load the defaults so they are updated into the app
  519. self.defaults.load(filename=os.path.join(self.data_path, 'current_defaults.FlatConfig'))
  520. # Re-fresh project options
  521. self.ui.app.on_options_app2project()
  522. settgs = QSettings("Open Source", "FlatCAM")
  523. # save the notebook font size
  524. fsize = self.get_form_field("notebook_font_size").get_value()
  525. settgs.setValue('notebook_font_size', fsize)
  526. # save the axis font size
  527. g_fsize = self.get_form_field("axis_font_size").get_value()
  528. settgs.setValue('axis_font_size', g_fsize)
  529. # save the textbox font size
  530. tb_fsize = self.get_form_field("textbox_font_size").get_value()
  531. settgs.setValue('textbox_font_size', tb_fsize)
  532. settgs.setValue(
  533. 'machinist',
  534. 1 if self.get_form_field("global_machinist_setting").get_value() else 0
  535. )
  536. # This will write the setting to the platform specific storage.
  537. del settgs
  538. if save_to_file:
  539. # close the tab and delete it
  540. for idx in range(self.ui.plot_tab_area.count()):
  541. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  542. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black'))
  543. self.ui.plot_tab_area.closeTab(idx)
  544. break
  545. if should_restart is True:
  546. self.ui.app.on_app_restart()
  547. def on_pref_close_button(self):
  548. # Preferences saved, update flag
  549. self.preferences_changed_flag = False
  550. self.ignore_tab_close_event = True
  551. try:
  552. self.get_form_field("units").activated_custom.disconnect()
  553. except (TypeError, AttributeError):
  554. pass
  555. self.defaults_write_form(source_dict=self.defaults.current_defaults)
  556. self.get_form_field("units").activated_custom.connect(
  557. lambda: self.ui.app.on_toggle_units(no_pref=False))
  558. self.defaults.update(self.defaults.current_defaults)
  559. # Preferences save, update the color of the Preferences Tab text
  560. for idx in range(self.ui.plot_tab_area.count()):
  561. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  562. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black'))
  563. self.ui.plot_tab_area.closeTab(idx)
  564. break
  565. self.inform.emit('%s' % _("Preferences closed without saving."))
  566. self.ignore_tab_close_event = False
  567. def on_restore_defaults_preferences(self):
  568. """
  569. Loads the application's factory default settings into ``self.defaults``.
  570. :return: None
  571. """
  572. log.debug("on_restore_defaults_preferences()")
  573. self.defaults.reset_to_factory_defaults()
  574. self.on_preferences_edited()
  575. self.inform.emit('[success] %s' % _("Preferences default values are restored."))
  576. def save_defaults(self, silent=False, data_path=None, first_time=False):
  577. """
  578. Saves application default options
  579. ``self.defaults`` to current_defaults.FlatConfig file.
  580. Save the toolbars visibility status to the preferences file (current_defaults.FlatConfig) to be
  581. used at the next launch of the application.
  582. :param silent: Whether to display a message in status bar or not; boolean
  583. :param data_path: The path where to save the preferences file (current_defaults.FlatConfig)
  584. When the application is portable it should be a mobile location.
  585. :param first_time: Boolean. If True will execute some code when the app is run first time
  586. :return: None
  587. """
  588. self.defaults.report_usage("save_defaults")
  589. if data_path is None:
  590. data_path = self.data_path
  591. self.defaults.propagate_defaults()
  592. if first_time is False:
  593. self.save_toolbar_view()
  594. # Save the options to disk
  595. filename = os.path.join(data_path, "current_defaults.FlatConfig")
  596. try:
  597. self.defaults.write(filename=filename)
  598. except Exception as e:
  599. log.error("save_defaults() --> Failed to write defaults to file %s" % str(e))
  600. self.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed to write defaults to file."), str(filename)))
  601. return
  602. if not silent:
  603. self.inform.emit('[success] %s' % _("Preferences saved."))
  604. # update the autosave timer
  605. self.ui.app.save_project_auto_update()
  606. def save_toolbar_view(self):
  607. """
  608. Will save the toolbar view state to the defaults
  609. :return: None
  610. """
  611. # Save the toolbar view
  612. tb_status = 0
  613. if self.ui.toolbarfile.isVisible():
  614. tb_status += 1
  615. if self.ui.toolbargeo.isVisible():
  616. tb_status += 2
  617. if self.ui.toolbarview.isVisible():
  618. tb_status += 4
  619. if self.ui.toolbartools.isVisible():
  620. tb_status += 8
  621. if self.ui.exc_edit_toolbar.isVisible():
  622. tb_status += 16
  623. if self.ui.geo_edit_toolbar.isVisible():
  624. tb_status += 32
  625. if self.ui.grb_edit_toolbar.isVisible():
  626. tb_status += 64
  627. if self.ui.snap_toolbar.isVisible():
  628. tb_status += 128
  629. if self.ui.toolbarshell.isVisible():
  630. tb_status += 256
  631. self.defaults["global_toolbar_view"] = tb_status
  632. def on_preferences_edited(self):
  633. """
  634. Executed when a preference was changed in the Edit -> Preferences tab.
  635. Will color the Preferences tab text to Red color.
  636. :return:
  637. """
  638. if self.preferences_changed_flag is False:
  639. self.inform.emit('[WARNING_NOTCL] %s' % _("Preferences edited but not saved."))
  640. for idx in range(self.ui.plot_tab_area.count()):
  641. if self.ui.plot_tab_area.tabText(idx) == _("Preferences"):
  642. self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('red'))
  643. self.ui.pref_apply_button.setStyleSheet("QPushButton {color: red;}")
  644. self.preferences_changed_flag = True
  645. def on_close_preferences_tab(self):
  646. if self.ignore_tab_close_event:
  647. return
  648. # disconnect
  649. for idx in range(self.ui.pref_tab_area.count()):
  650. for tb in self.ui.pref_tab_area.widget(idx).findChildren(QtCore.QObject):
  651. try:
  652. tb.textEdited.disconnect(self.on_preferences_edited)
  653. except (TypeError, AttributeError):
  654. pass
  655. try:
  656. tb.modificationChanged.disconnect(self.on_preferences_edited)
  657. except (TypeError, AttributeError):
  658. pass
  659. try:
  660. tb.toggled.disconnect(self.on_preferences_edited)
  661. except (TypeError, AttributeError):
  662. pass
  663. try:
  664. tb.valueChanged.disconnect(self.on_preferences_edited)
  665. except (TypeError, AttributeError):
  666. pass
  667. try:
  668. tb.currentIndexChanged.disconnect(self.on_preferences_edited)
  669. except (TypeError, AttributeError):
  670. pass
  671. # Prompt user to save
  672. if self.preferences_changed_flag is True:
  673. msgbox = QtWidgets.QMessageBox()
  674. msgbox.setText(_("One or more values are changed.\n"
  675. "Do you want to save the Preferences?"))
  676. msgbox.setWindowTitle(_("Save Preferences"))
  677. msgbox.setWindowIcon(QtGui.QIcon(self.ui.app.resource_location + '/save_as.png'))
  678. bt_yes = msgbox.addButton(_('Yes'), QtWidgets.QMessageBox.YesRole)
  679. msgbox.addButton(_('No'), QtWidgets.QMessageBox.NoRole)
  680. msgbox.setDefaultButton(bt_yes)
  681. msgbox.exec_()
  682. response = msgbox.clickedButton()
  683. if response == bt_yes:
  684. self.on_save_button(save_to_file=True)
  685. self.inform.emit('[success] %s' % _("Preferences saved."))
  686. else:
  687. self.preferences_changed_flag = False
  688. self.inform.emit('')
  689. return