From 09e7542f8a751c1fe9a33356c86f1d260e05bd0a Mon Sep 17 00:00:00 2001 From: Sambhav Kothari Date: Thu, 1 Mar 2018 19:02:27 +0530 Subject: [PATCH] PICARD-1204: Read and dump values to QSettings only when necessary Reading and dumping too often from QSettings causes picard to lock up. This makes sure we only read on start and dump on change. --- picard/config.py | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/picard/config.py b/picard/config.py index ceb18a303..343e0b1aa 100644 --- a/picard/config.py +++ b/picard/config.py @@ -34,8 +34,23 @@ class ConfigSection(LockableObject): def __init__(self, config, name): super().__init__() - self.__config = config + self.__qt_config = config + self.__config = {} self.__name = name + self.load_keys() + self.__qt_config.parent().register_cleanup(self.dump_keys) + + def load_keys(self): + for key in self.__qt_config.allKeys(): + self.__config[key] = self.__qt_config.value(key) + + def dump_keys(self): + log.debug('Dumping config(%s) to file.', self.__name) + for key in self.__qt_config.allKeys(): + if key not in self.__config: + self.__qt_config.remove(key) + for key, value in self.__config.items(): + self.__qt_config.setValue(key, value) def __getitem__(self, name): opt = Option.get(self.__name, name) @@ -46,22 +61,22 @@ class ConfigSection(LockableObject): def __setitem__(self, name, value): self.lock_for_write() try: - self.__config.setValue("%s/%s" % (self.__name, name), value) + self.__config["%s/%s" % (self.__name, name)] = value finally: self.unlock() def __contains__(self, key): key = "%s/%s" % (self.__name, key) - return self.__config.contains(key) + return key in self.__config def remove(self, key): key = "%s/%s" % (self.__name, key) - if self.__config.contains(key): - self.__config.remove(key) + if key in self.__config: + self.__config.pop(key) def raw_value(self, key): """Return an option value without any type conversion.""" - value = self.__config.value("%s/%s" % (self.__name, key)) + value = self.__config["%s/%s" % (self.__name, key)] return value def value(self, name, option_type, default=None): @@ -69,10 +84,10 @@ class ConfigSection(LockableObject): key = "%s/%s" % (self.__name, name) self.lock_for_read() try: - if self.__config.contains(key): + if key in self.__config: return option_type.convert(self.raw_value(name)) return default - except: + except Exception: return default finally: self.unlock()