1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-04-12 15:27:14 +03:00

Use Preferences Save Serial Number instead of flag

* new class `PrefsVersion` in prefs.py.  A singleton `prefsSaved` (note
   case) is created.
 * When new preferences are added and require defaults on first run the
   code should use:

     `if prefsVersion.shouldSetDefaults(<prior release version>, [<optional old test>]):`

   to check if defaults should be set in preferences.  So if prior release
   was '3.4.6.0' and you've added a new preference with defaults you should
   call this with '3.4.6.0' as the first argument.
   The <optional old test> is really only for historical purposes, as a
   fallback in case no 'PrefsVersion' has yet been set in the user's
   Registry/settings file.
 * Any code that adds such a new preference **MUST** make changes to the
   `versions` dictionary in the PrefsVersion class.
     1. Add the predicted next version to the dictionary, with number one
        higher than 'current'
     2. Set 'current' equal to that new value.
   Obviously if other post-last-release code has already done this then you
   don't need to.

   Failure to update the versions dictionary in this manner will lead to an
   Exception being raised, and the code the preferences are for failing
   (i.e. EDDN means no EDDN tab on Settings).

Closes #407
This commit is contained in:
Athanasius 2020-07-01 15:33:27 +01:00
parent ecdd65e0ac
commit 89f113e190
2 changed files with 70 additions and 4 deletions

View File

@ -14,6 +14,8 @@ import tkinter as tk
from ttkHyperlinkLabel import HyperlinkLabel
import myNotebook as nb
from prefs import prefsVersion
if sys.platform != 'win32':
from fcntl import lockf, LOCK_EX, LOCK_NB
@ -347,7 +349,7 @@ def plugin_prefs(parent, cmdr, is_beta):
BUTTONX = 12 # indent Checkbuttons and Radiobuttons
PADY = 2 # close spacing
if not config.getint('PrefsDidSave'):
if prefsVersion.shouldSetDefaults('0.0.0.0', not bool(config.getint('output'))):
output = (config.OUT_MKT_EDDN | config.OUT_SYS_EDDN) # default settings
else:
output = config.getint('output')

View File

@ -10,7 +10,7 @@ from tkinter import colorchooser as tkColorChooser
from ttkHyperlinkLabel import HyperlinkLabel
import myNotebook as nb
from config import applongname, config
from config import applongname, config, appversion
from hotkey import hotkeymgr
from l10n import Translations
from monitor import monitor
@ -18,6 +18,70 @@ from theme import theme
import plug
###########################################################################
# Versioned preferences, so we know whether to set an 'on' default on
# 'new' preferences, or not.
###########################################################################
class PrefsVersion(object):
versions = {
'0.0.0.0': 1,
'1.0.0.0': 2,
'3.4.6.0': 3,
'3.5.1.0': 4,
# Only add new versions that add new Preferences
'current': 4, # Should always match the last specific version, but only increment after you've added the new version. Guess at it if anticipating a new version.
}
def __init__(self):
return
def stringToSerial(self, versionStr: str) -> int:
"""
Convert a version string into a preferences version serial number.
If the version string isn't known returns the 'current' (latest) serial number.
:param versionStr:
:return int:
"""
if versionStr in self.versions:
return self.versions[versionStr]
return self.versions['current']
###########################################################################
# Should defaults be set, given the settings were added after 'addedAfter' ?
#
# config.get('PrefsVersion') is the version preferences we last saved for
###########################################################################
def shouldSetDefaults(self, addedAfter: str, oldTest : bool=True) -> bool:
pv = config.getint('PrefsVersion')
# If no PrefsVersion yet exists then return oldTest
if not pv:
return oldTest
# Convert addedAfter to a version serial number
if addedAfter not in self.versions:
# Assume it was added at the start
aa = 1
else:
aa = self.versions[addedAfter]
# Sanity check, if something was added after then current should be greater
if aa >= self.versions['current']:
raise Exception('ERROR: Call to prefs.py:PrefsVersion.shouldSetDefaults() with "addedAfter" >= current latest in "versions" table. You probably need to increase "current" serial number.')
# If this preference was added after the saved PrefsVersion we should set defaults
if aa >= pv:
return True
return False
###########################################################################
prefsVersion = PrefsVersion()
###########################################################################
if platform == 'darwin':
import objc
from Foundation import NSFileManager
@ -103,7 +167,7 @@ class PreferencesDialog(tk.Toplevel):
outframe = nb.Frame(notebook)
outframe.columnconfigure(0, weight=1)
if not config.getint('PrefsDidSave'):
if prefsVersion.shouldSetDefaults('0.0.0.0', not bool(config.getint('output'))):
output = config.OUT_SHIP # default settings
else:
output = config.getint('output')
@ -502,7 +566,7 @@ class PreferencesDialog(tk.Toplevel):
def apply(self):
config.set('PrefsDidSave', 1)
config.set('PrefsVersion', prefsVersion.stringToSerial(appversion))
config.set('output',
(self.out_td.get() and config.OUT_MKT_TD) +
(self.out_csv.get() and config.OUT_MKT_CSV) +