Cleanup of defaults
This commit is contained in:
147
FlatCAMApp.py
147
FlatCAMApp.py
@@ -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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
79
defaults.py
79
defaults.py
@@ -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))
|
|
||||||
|
|||||||
Reference in New Issue
Block a user