Skip to content

Commit ccef1a1

Browse files
authored
Merge pull request #2567 from rdswift/rename_settings_changed_signal
Add signal when file naming related settings are changed
2 parents 57c9153 + 835f275 commit ccef1a1

File tree

2 files changed

+100
-1
lines changed

2 files changed

+100
-1
lines changed

picard/config.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# Copyright (C) 2017 Sophist-UK
1313
# Copyright (C) 2018 Vishal Choudhary
1414
# Copyright (C) 2020-2021 Gabriel Ferreira
15-
# Copyright (C) 2021-2023 Bob Swift
15+
# Copyright (C) 2021-2024 Bob Swift
1616
#
1717
# This program is free software; you can redistribute it and/or
1818
# modify it under the terms of the GNU General Public License
@@ -136,6 +136,9 @@ class SettingConfigSection(ConfigSection):
136136
PROFILES_KEY = 'user_profiles'
137137
SETTINGS_KEY = 'user_profile_settings'
138138

139+
# Signal emitted when the value of a setting has changed.
140+
setting_changed_signal = QtCore.pyqtSignal(str, object, object)
141+
139142
@classmethod
140143
def init_profile_options(cls):
141144
ListOption.add_if_missing('profiles', cls.PROFILES_KEY, [])
@@ -190,15 +193,20 @@ def __getitem__(self, name):
190193
return self.value(name, opt, opt.default)
191194

192195
def __setitem__(self, name, value):
196+
old_value = self.__getitem__(name)
193197
# Don't process settings that are not profile-specific
194198
if name in profile_groups_all_settings():
195199
for profile_id, settings in self._get_active_profile_settings():
196200
if name in settings:
197201
self._save_profile_setting(profile_id, name, value)
202+
if value != old_value:
203+
self.setting_changed_signal.emit(name, old_value, value)
198204
return
199205
key = self.key(name)
200206
self.__qt_config.setValue(key, value)
201207
self._memoization[key].dirty = True
208+
if value != old_value:
209+
self.setting_changed_signal.emit(name, old_value, value)
202210

203211
def _save_profile_setting(self, profile_id, name, value):
204212
profile_settings = self.__qt_config.profiles[self.SETTINGS_KEY]

test/test_config.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,3 +446,94 @@ def test_var_opt_invalid_value(self):
446446
# store invalid value in config file directly
447447
self.config.setValue('setting/var_option', object)
448448
self.assertEqual(self.config.setting["var_option"], {"a", "b"})
449+
450+
451+
class TestPicardConfigSignals(TestPicardConfigCommon):
452+
453+
def _set_signal_value(self, name: str, old_value: object, new_value: object):
454+
self.setting_name = name
455+
self.setting_old_value = old_value
456+
self.setting_new_value = new_value
457+
458+
def test_file_naming_signal(self):
459+
TextOption('setting', 'option_text', 'abc')
460+
BoolOption('setting', 'option_bool', False)
461+
IntOption('setting', 'option_int', 1)
462+
FloatOption('setting', 'option_float', 1.0)
463+
ListOption('setting', 'option_list', [1, 2, 3])
464+
Option('setting', 'option_set', {1, 2, 3})
465+
Option('setting', 'option_dict', {'a': 1, 'b': 2, 'c': 3})
466+
467+
self.config.setting.setting_changed_signal.connect(self._set_signal_value)
468+
469+
# Test text option
470+
self.setting_name = ''
471+
self.setting_old_value = ''
472+
self.setting_new_value = ''
473+
self.config.setting['option_text'] = 'def'
474+
self.assertEqual(self.setting_name, 'option_text')
475+
self.assertEqual(self.setting_old_value, 'abc')
476+
self.assertEqual(self.setting_new_value, 'def')
477+
478+
# Test no signal if set to same value
479+
self.setting_name = ''
480+
self.setting_old_value = ''
481+
self.setting_new_value = ''
482+
self.config.setting['option_text'] = 'def'
483+
self.assertEqual(self.setting_name, '')
484+
self.assertEqual(self.setting_old_value, '')
485+
self.assertEqual(self.setting_new_value, '')
486+
487+
# Test bool option
488+
self.setting_name = ''
489+
self.setting_old_value = ''
490+
self.setting_new_value = ''
491+
self.config.setting['option_bool'] = True
492+
self.assertEqual(self.setting_name, 'option_bool')
493+
self.assertEqual(self.setting_old_value, False)
494+
self.assertEqual(self.setting_new_value, True)
495+
496+
# Test int option
497+
self.setting_name = ''
498+
self.setting_old_value = ''
499+
self.setting_new_value = ''
500+
self.config.setting['option_int'] = 2
501+
self.assertEqual(self.setting_name, 'option_int')
502+
self.assertEqual(self.setting_old_value, 1)
503+
self.assertEqual(self.setting_new_value, 2)
504+
505+
# Test float option
506+
self.setting_name = ''
507+
self.setting_old_value = ''
508+
self.setting_new_value = ''
509+
self.config.setting['option_float'] = 2.5
510+
self.assertEqual(self.setting_name, 'option_float')
511+
self.assertEqual(self.setting_old_value, 1.0)
512+
self.assertEqual(self.setting_new_value, 2.5)
513+
514+
# Test list option
515+
self.setting_name = ''
516+
self.setting_old_value = ''
517+
self.setting_new_value = ''
518+
self.config.setting['option_list'] = [3, 2, 1]
519+
self.assertEqual(self.setting_name, 'option_list')
520+
self.assertEqual(self.setting_old_value, [1, 2, 3])
521+
self.assertEqual(self.setting_new_value, [3, 2, 1])
522+
523+
# Test option (set)
524+
self.setting_name = ''
525+
self.setting_old_value = ''
526+
self.setting_new_value = ''
527+
self.config.setting['option_set'] = {4, 5, 6}
528+
self.assertEqual(self.setting_name, 'option_set')
529+
self.assertEqual(self.setting_old_value, {1, 2, 3})
530+
self.assertEqual(self.setting_new_value, {4, 5, 6})
531+
532+
# Test option (dict)
533+
self.setting_name = ''
534+
self.setting_old_value = ''
535+
self.setting_new_value = ''
536+
self.config.setting['option_dict'] = {'a': 3, 'b': 2, 'c': 1}
537+
self.assertEqual(self.setting_name, 'option_dict')
538+
self.assertEqual(self.setting_old_value, {'a': 1, 'b': 2, 'c': 3})
539+
self.assertEqual(self.setting_new_value, {'a': 3, 'b': 2, 'c': 1})

0 commit comments

Comments
 (0)