Cleanup of defaults

This commit is contained in:
David Robertson
2020-04-28 04:15:21 +01:00
parent 723e242c2b
commit e4f3912f4f
2 changed files with 63 additions and 163 deletions

View File

@@ -390,7 +390,7 @@ class App(QtCore.QObject):
f.close() f.close()
# Write factory_defaults.FlatConfig file to disk # Write factory_defaults.FlatConfig file to disk
FlatCAMDefaults.save_factory_defaults_file(os.path.join(self.data_path, "factory_defaults.FlatConfig")) FlatCAMDefaults.save_factory_defaults(os.path.join(self.data_path, "factory_defaults.FlatConfig"))
# create a recent files json file if there is none # create a recent files json file if there is none
try: try:
@@ -432,7 +432,7 @@ class App(QtCore.QObject):
self.fcDefaults = FlatCAMDefaults() self.fcDefaults = FlatCAMDefaults()
current_defaults_path = os.path.join(self.data_path, "current_defaults.FlatConfig") current_defaults_path = os.path.join(self.data_path, "current_defaults.FlatConfig")
if user_defaults: if user_defaults:
self.fcDefaults.load_defaults(filename=current_defaults_path) self.fcDefaults.load(filename=current_defaults_path)
self.defaults = self.fcDefaults.defaults self.defaults = self.fcDefaults.defaults
if self.defaults["global_gray_icons"] is False: if self.defaults["global_gray_icons"] is False:
@@ -3229,7 +3229,7 @@ class App(QtCore.QObject):
return return
# Load in the defaults from the chosen file # Load in the defaults from the chosen file
self.fcDefaults.load_defaults(filename=filename) self.fcDefaults.load(filename=filename)
self.on_preferences_edited() self.on_preferences_edited()
self.inform.emit('[success] %s: %s' % (_("Imported Defaults from"), filename)) self.inform.emit('[success] %s: %s' % (_("Imported Defaults from"), filename))
@@ -3245,66 +3245,35 @@ class App(QtCore.QObject):
defaults_file_content = None defaults_file_content = None
self.date = str(datetime.today()).rpartition('.')[0] # Show file chooser
self.date = ''.join(c for c in self.date if c not in ':-') date = str(datetime.today()).rpartition('.')[0]
self.date = self.date.replace(' ', '_') date = ''.join(c for c in date if c not in ':-')
date = date.replace(' ', '_')
filter__ = "Config File .FlatConfig (*.FlatConfig);;All Files (*.*)" filter__ = "Config File .FlatConfig (*.FlatConfig);;All Files (*.*)"
try: try:
filename, _f = FCFileSaveDialog.get_saved_filename( filename, _f = FCFileSaveDialog.get_saved_filename(
caption=_("Export FlatCAM Preferences"), caption=_("Export FlatCAM Preferences"),
directory=self.data_path + '/preferences_' + self.date, directory=self.data_path + '/preferences_' + date,
filter=filter__ filter=filter__
) )
except TypeError: except TypeError:
filename, _f = FCFileSaveDialog.get_saved_filename(caption=_("Export FlatCAM Preferences"), filter=filter__) filename, _f = FCFileSaveDialog.get_saved_filename(caption=_("Export FlatCAM Preferences"), filter=filter__)
filename = str(filename) filename = str(filename)
defaults_from_file = {}
if filename == "": if filename == "":
self.inform.emit('[WARNING_NOTCL] %s' % _("Cancelled.")) self.inform.emit('[WARNING_NOTCL] %s' % _("Cancelled."))
return return
else:
try:
f = open(filename, 'w')
defaults_file_content = f.read()
f.close()
except PermissionError:
self.inform.emit('[WARNING] %s' %
_("Permission denied, saving not possible.\n"
"Most likely another app is holding the file open and not accessible."))
return
except IOError:
App.log.debug('Creating a new preferences file ...')
f = open(filename, 'w')
json.dump({}, f)
f.close()
except Exception:
e = sys.exc_info()[0]
App.log.error("Could not load defaults file.")
App.log.error(str(e))
self.inform.emit('[ERROR_NOTCL] %s' % _("Could not load preferences file."))
return
try: # Update options
defaults_from_file = json.loads(defaults_file_content) self.defaults_read_form()
except Exception: self.propagate_defaults()
App.log.warning("Trying to read an empty Preferences file. Continue.")
# Update options # Save update options
self.defaults_read_form() try:
defaults_from_file.update(self.defaults) self.fcDefaults.write(filename=filename)
self.propagate_defaults(silent=True) except Exception:
self.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed to write defaults to file."), str(filename)))
return
# Save update options
try:
f = open(filename, "w")
json.dump(defaults_from_file, f, default=to_dict, indent=2, sort_keys=True)
f.close()
except Exception:
self.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed to write defaults to file."), str(filename)))
return
if self.defaults["global_open_style"] is False: if self.defaults["global_open_style"] is False:
self.file_opened.emit("preferences", filename) self.file_opened.emit("preferences", filename)
self.file_saved.emit("preferences", filename) self.file_saved.emit("preferences", filename)
@@ -4231,35 +4200,9 @@ class App(QtCore.QObject):
:return: None :return: None
""" """
self.save_defaults() self.save_defaults()
# def on_app_exit(self):
# self.report_usage("on_app_exit()")
#
# if self.collection.get_list():
# msgbox = QtWidgets.QMessageBox()
# # msgbox.setText("<B>Save changes ...</B>")
# msgbox.setText("There are files/objects opened in FlatCAM. "
# "\n"
# "Do you want to Save the project?")
# msgbox.setWindowTitle("Save changes")
# msgbox.setWindowIcon(QtGui.QIcon(self.resource_location + '/save_as.png'))
# msgbox.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No |
# QtWidgets.QMessageBox.Cancel)
# msgbox.setDefaultButton(QtWidgets.QMessageBox.Yes)
#
# response = msgbox.exec_()
#
# if response == QtWidgets.QMessageBox.Yes:
# self.on_file_saveprojectas(thread=False)
# elif response == QtWidgets.QMessageBox.Cancel:
# return
# self.save_defaults()
# else:
# self.save_defaults()
# log.debug("Application defaults saved ... Exit event.")
# QtWidgets.qApp.quit()
def save_defaults(self, silent=False, data_path=None, first_time=False): def save_defaults(self, silent=False, data_path=None, first_time=False):
""" """
@@ -4279,43 +4222,16 @@ class App(QtCore.QObject):
if data_path is None: if data_path is None:
data_path = self.data_path data_path = self.data_path
# Read options from file self.propagate_defaults()
try:
f = open(data_path + "/current_defaults.FlatConfig")
defaults_file_content = f.read()
f.close()
except Exception:
e = sys.exc_info()[0]
App.log.error("Could not load defaults file.")
App.log.error(str(e))
self.inform.emit('[ERROR_NOTCL] %s' % _("Could not load defaults file."))
return
try:
defaults = json.loads(defaults_file_content)
except Exception:
e = sys.exc_info()[0]
App.log.error("Failed to parse defaults file.")
App.log.error(str(e))
self.inform.emit('[ERROR_NOTCL] %s' % _("Failed to parse defaults file."))
return
# Update options
self.defaults_read_form()
defaults.update(self.defaults)
self.propagate_defaults(silent=True)
if first_time is False: if first_time is False:
self.save_toolbar_view() self.save_toolbar_view()
# Save update options # Save the options to disk
filename = data_path + "/current_defaults.FlatConfig"
try: try:
f = open(filename, "w") self.fcDefaults.write(filename=os.path.join(data_path, "current_defaults.FlatConfig"))
json.dump(defaults, f, default=to_dict, indent=2, sort_keys=True)
f.close()
except Exception as e: except Exception as e:
log.debug("App.save_defaults() --> %s" % str(e)) log.error("save_defaults() --> Failed to write defaults to file %s" % str(e))
self.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed to write defaults to file."), str(filename))) self.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed to write defaults to file."), str(filename)))
return return
@@ -10917,18 +10833,13 @@ class App(QtCore.QObject):
App.log.debug(" **************** Finished PROJECT loading... **************** ") App.log.debug(" **************** Finished PROJECT loading... **************** ")
def propagate_defaults(self, silent=False): def propagate_defaults(self):
""" """
This method is used to set default values in classes. It's This method is used to set default values in classes. It's
an alternative to project options but allows the use an alternative to project options but allows the use
of values invisible to the user. of values invisible to the user.
:param silent: No messages
:return: None
""" """
self.log.debug("propagate_defaults()")
if silent is False:
self.log.debug("propagate_defaults()")
# Which objects to update the given parameters. # Which objects to update the given parameters.
routes = { routes = {
@@ -10947,11 +10858,8 @@ class App(QtCore.QObject):
if param in routes[param].defaults: if param in routes[param].defaults:
try: try:
routes[param].defaults[param] = self.defaults[param] routes[param].defaults[param] = self.defaults[param]
if silent is False:
self.log.debug(" " + param + " OK")
except KeyError: except KeyError:
if silent is False: self.log.error("FlatCAMApp.propagate_defaults() --> ERROR: " + param + " not in defaults.")
self.log.debug("FlatCAMApp.propagate_defaults() --> ERROR: " + param + " not in defaults.")
else: else:
# Try extracting the name: # Try extracting the name:
# classname_param here is param in the object # classname_param here is param in the object
@@ -10959,8 +10867,9 @@ class App(QtCore.QObject):
p = param[len(routes[param].__name__) + 1:] p = param[len(routes[param].__name__) + 1:]
if p in routes[param].defaults: if p in routes[param].defaults:
routes[param].defaults[p] = self.defaults[param] routes[param].defaults[p] = self.defaults[param]
if silent is False:
self.log.debug(" " + param + " OK!")
def plot_all(self, fit_view=True, use_thread=True): def plot_all(self, fit_view=True, use_thread=True):
""" """

View File

@@ -6,19 +6,13 @@ from FlatCAMCommon import LoudDict
from camlib import to_dict from camlib import to_dict
import simplejson import simplejson
import logging import logging
# FlatCAM Translation
import gettext import gettext
import FlatCAMTranslation as fcTranslate import FlatCAMTranslation as fcTranslate
import builtins import builtins
fcTranslate.apply_language('strings') fcTranslate.apply_language('strings')
if '_' not in builtins.__dict__: if '_' not in builtins.__dict__:
_ = gettext.gettext _ = gettext.gettext
log = logging.getLogger('FlatCAMDefaults')
# TODO:
# * on_import_preferences
# * on_export_preferences
log = logging.getLogger('base')
class FlatCAMDefaults: class FlatCAMDefaults:
@@ -667,6 +661,27 @@ class FlatCAMDefaults:
"document_tab_size": 80, "document_tab_size": 80,
} }
@classmethod
def save_factory_defaults(cls, file_path: str):
"""Writes the factory defaults to a file at the given path, overwriting any existing file."""
# Delete any existing factory defaults file
if os.path.isfile(file_path):
os.chmod(file_path, stat.S_IRWXO | stat.S_IWRITE | stat.S_IWGRP)
os.remove(file_path)
try:
# recreate a new factory defaults file and save the factory defaults data into it
f_f_def_s = open(file_path, "w")
simplejson.dump(cls.factory_defaults, f_f_def_s, default=to_dict, indent=2, sort_keys=True)
f_f_def_s.close()
# and then make the factory_defaults.FlatConfig file read_only
# so it can't be modified after creation.
os.chmod(file_path, stat.S_IREAD | stat.S_IRGRP | stat.S_IROTH)
log.debug("FlatCAM factory defaults written to: %s" % file_path)
except Exception as e:
log.error("save_factory_defaults() -> %s" % str(e))
def __init__(self): def __init__(self):
self.defaults = LoudDict() self.defaults = LoudDict()
self.defaults.update(self.factory_defaults) self.defaults.update(self.factory_defaults)
@@ -674,13 +689,13 @@ class FlatCAMDefaults:
self.current_defaults.update(self.factory_defaults) self.current_defaults.update(self.factory_defaults)
self.old_defaults_found = False self.old_defaults_found = False
def load_defaults(self, filename: str): def write(self, filename: str):
""" """Saves the defaults to a file on disk"""
Loads the application's default settings from current_defaults.FlatConfig into with open(filename, "w") as file:
``self.defaults``. simplejson.dump(self.defaults, file, default=to_dict, indent=2, sort_keys=True)
:return: None def load(self, filename: str):
""" """Loads the defaults from a file on disk, performing migration if required."""
# Read in the file # Read in the file
try: try:
@@ -708,9 +723,9 @@ class FlatCAMDefaults:
return return
# Perform migration if necessary # Perform migration if necessary
if self.is_old_defaults(defaults): if self.__is_old_defaults(defaults):
self.old_defaults_found = True self.old_defaults_found = True
defaults = self.migrate_old_defaults(defaults=defaults) defaults = self.__migrate_old_defaults(defaults=defaults)
else: else:
self.old_defaults_found = False self.old_defaults_found = False
@@ -720,16 +735,12 @@ class FlatCAMDefaults:
log.debug("FlatCAM defaults loaded from: %s" % filename) log.debug("FlatCAM defaults loaded from: %s" % filename)
def is_old_defaults(self, defaults: dict) -> bool: def __is_old_defaults(self, defaults: dict) -> bool:
""" """Takes a defaults dict and determines whether or not migration is necessary."""
Takes a defaults dict and determines whether or not migration is necessary.
"""
return 'version' not in defaults or defaults['version'] != self.factory_defaults['version'] return 'version' not in defaults or defaults['version'] != self.factory_defaults['version']
def migrate_old_defaults(self, defaults: dict) -> dict: def __migrate_old_defaults(self, defaults: dict) -> dict:
""" """Performs migration on the passed-in defaults dictionary, and returns the migrated dict"""
Performs migration on the passed-in defaults dictionary, and returns the migrated dict
"""
migrated = {} migrated = {}
for k, v in defaults.items(): for k, v in defaults.items():
if k in self.factory_defaults and k != 'version': if k in self.factory_defaults and k != 'version':
@@ -751,26 +762,6 @@ class FlatCAMDefaults:
migrated[k] = v migrated[k] = v
return migrated return migrated
@classmethod
def save_factory_defaults_file(cls, file_path: str):
"""
Writes the factory defaults to a file at the given path, overwriting any existing file.
Sets the file to be read only.
"""
# Delete any existing factory defaults file
if os.path.isfile(file_path):
os.chmod(file_path, stat.S_IRWXO | stat.S_IWRITE | stat.S_IWGRP)
os.remove(file_path)
try:
# recreate a new factory defaults file and save the factory defaults data into it
f_f_def_s = open(file_path, "w")
simplejson.dump(cls.factory_defaults, f_f_def_s, default=to_dict, indent=2, sort_keys=True)
f_f_def_s.close()
# and then make the factory_defaults.FlatConfig file read_only
# so it can't be modified after creation.
os.chmod(file_path, stat.S_IREAD | stat.S_IRGRP | stat.S_IROTH)
log.debug("FlatCAM factory defaults written to: %s" % file_path)
except Exception as e:
log.error("save_factory_defaults_file() -> %s" % str(e))