settings.py (9394B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\window\settings.py 2 import functools 3 import localization 4 import logging 5 import weakref 6 import signals 7 from carbonui.observable import Observable 8 from clientsettings.setting import CharSettingBool, UserSettingEnum, _BaseSettingBool, _WindowSettingMixin 9 from carbonui.text.settings import is_new_font_size_options_enabled, migrate_existing_font_size_settings_down_one_size 10 logger = logging.getLogger('windowSettings') 11 only_tint_active_window = CharSettingBool(settings_key='only_tint_active_window', default_value=True) 12 window_compact_mode_default_setting = CharSettingBool(settings_key='window_compact_mode_default', default_value=False) 13 COMPACT_MODE_BY_WINDOW_ID_KEY = 'compactWindows' 14 15 class WindowCompactModeSetting(_WindowSettingMixin, _BaseSettingBool): 16 __instances = weakref.WeakSet() 17 18 def __init__(self, window_id, default_value): 19 if isinstance(window_id, tuple): 20 window_id = window_id[0] 21 super(WindowCompactModeSetting, self).__init__(settings_key=window_id, default_value=default_value) 22 self.__instances.add(self) 23 window_compact_mode_default_setting.on_change.connect(self._on_default_changed) 24 25 @classmethod 26 def clear_all(cls): 27 for setting in set(cls.__instances): 28 setting.clear() 29 30 def get(self): 31 if self.settings_key is None: 32 return self.get_default() 33 else: 34 value = self._get() 35 if value is None: 36 return self.get_default() 37 return value 38 39 def _get(self): 40 compact_mode_by_window_id = self.settings_path.Get(COMPACT_MODE_BY_WINDOW_ID_KEY, {}) 41 return compact_mode_by_window_id.get(self.settings_key, None) 42 43 def _on_default_changed(self, value): 44 stored_value = self._get() 45 if stored_value is None: 46 self._trigger_on_change(self.get_default()) 47 48 def _set(self, value): 49 compact_mode_by_window_id = self.settings_path.Get(COMPACT_MODE_BY_WINDOW_ID_KEY, {}) 50 if value == self.get_default(): 51 try: 52 compact_mode_by_window_id.pop(self.settings_key) 53 except KeyError: 54 pass 55 56 else: 57 compact_mode_by_window_id[self.settings_key] = value 58 self.settings_path.Set(COMPACT_MODE_BY_WINDOW_ID_KEY, compact_mode_by_window_id) 59 60 def clear(self): 61 compact_mode_by_window_id = self.settings_path.Get(COMPACT_MODE_BY_WINDOW_ID_KEY, {}) 62 if self.settings_key in compact_mode_by_window_id: 63 value = compact_mode_by_window_id.pop(self.settings_key) 64 self.settings_path.Set(COMPACT_MODE_BY_WINDOW_ID_KEY, compact_mode_by_window_id) 65 default = self.get_default() 66 if value != default: 67 self._trigger_on_change(default) 68 69 70 class WindowMarginMode(object): 71 NORMAL = 1 72 COMPACT = 2 73 74 75 class WindowMarginModeOption(object): 76 AUTO = 0 77 NORMAL = 1 78 COMPACT = 2 79 _ALL = (AUTO, NORMAL, COMPACT) 80 _NAME_LABEL_BY_VALUE = {AUTO: 'UI/SystemMenu/GeneralSettings/Windows/WindowMarginModeAutoTitle', 81 NORMAL: 'UI/SystemMenu/GeneralSettings/Windows/WindowMarginModeNormalTitle', 82 COMPACT: 'UI/SystemMenu/GeneralSettings/Windows/WindowMarginModeCompactTitle'} 83 _HINT_LABEL_BY_VALUE = {AUTO: 'UI/SystemMenu/GeneralSettings/Windows/WindowMarginModeAutoHint', 84 NORMAL: None, 85 COMPACT: None} 86 _SORT_KEY_BY_VALUE = {AUTO: 0, 87 NORMAL: 1, 88 COMPACT: 2} 89 90 @classmethod 91 def iter(cls): 92 return iter(cls._ALL) 93 94 @classmethod 95 def get_name(cls, value): 96 return localization.GetByLabel(cls._NAME_LABEL_BY_VALUE[value]) 97 98 @classmethod 99 def get_hint(cls, value): 100 hint_label = cls._HINT_LABEL_BY_VALUE[value] 101 if hint_label is not None: 102 return localization.GetByLabel(hint_label) 103 104 @classmethod 105 def get_sort_key(cls, value): 106 return cls._SORT_KEY_BY_VALUE[value] 107 108 109 class WindowMarginModeStorage(Observable): 110 DEFAULT_WINDOW_MARGIN_MODE = WindowMarginMode.NORMAL 111 112 def __init__(self): 113 self.setting = UserSettingEnum(settings_key='window_margin_mode', options=list(WindowMarginModeOption.iter()), default_value=WindowMarginModeOption.AUTO) 114 self._get_resolution = None 115 self._on_changed = signals.Signal('{}.on_changed'.format(self.__class__.__name__)) 116 self._value = None 117 self.setting.on_change.connect(self._on_setting_changed) 118 119 @property 120 def value(self): 121 if self._value is None: 122 self.refresh() 123 return self._value 124 125 @property 126 def on_changed(self): 127 return self._on_changed 128 129 def initialize(self, get_resolution, service_manager): 130 self._get_resolution = get_resolution 131 service_manager.RegisterForNotifyEvent(self, 'OnEndChangeDevice') 132 service_manager.RegisterForNotifyEvent(self, 'OnSettingsLoaded') 133 self.refresh() 134 135 def refresh(self): 136 old_value = self._value 137 self._value = self._resolve() 138 if old_value is not None and old_value != self._value: 139 self._on_changed(self) 140 141 def _resolve(self): 142 mode = self.setting.get() 143 if mode == WindowMarginModeOption.AUTO: 144 if self._get_resolution is not None: 145 width, height = self._get_resolution() 146 if height < 1080: 147 return WindowMarginMode.COMPACT 148 else: 149 return WindowMarginMode.NORMAL 150 else: 151 return self.DEFAULT_WINDOW_MARGIN_MODE 152 else: 153 if mode == WindowMarginModeOption.NORMAL: 154 return WindowMarginMode.NORMAL 155 if mode == WindowMarginModeOption.COMPACT: 156 return WindowMarginMode.COMPACT 157 158 def _on_setting_changed(self, value): 159 self.refresh() 160 161 def OnEndChangeDevice(self): 162 self.refresh() 163 164 def OnSettingsLoaded(self): 165 self.refresh() 166 167 168 window_margin_mode = WindowMarginModeStorage() 169 170 def GetRegisteredState(windowID, statename, default = None): 171 if windowID is None: 172 return 0 173 if type(windowID) == tuple: 174 windowID, _ = windowID 175 settingsByWindowID = settings.char.windows.Get('%sWindows' % statename, {}) 176 if windowID in settingsByWindowID: 177 return settingsByWindowID[windowID] 178 else: 179 return default 180 181 182 def RegisterState(windowID, statename, value): 183 if windowID is None: 184 return 185 if type(windowID) == tuple: 186 windowID, subWindowID = windowID 187 key = '%sWindows' % statename 188 settingsByWindowID = settings.char.windows.Get(key, {}) 189 settingsByWindowID[windowID] = value 190 settings.char.windows.Set(key, settingsByWindowID) 191 192 193 def GetSettingsVersion(): 194 return 1 195 196 197 def ValidateSettings(user_id, char_id): 198 logger.info('Validate Window Settings, user: %s, char: %s', user_id, char_id) 199 reset_window_settings_if_outdated() 200 migrate = functools.partial(run_migration, user_id=user_id, char_id=char_id) 201 migrate(migrate_window_settings_from_user_to_char) 202 migrate(clear_stored_compact_window_settings_that_match_the_default, ignore_failure=True) 203 if is_new_font_size_options_enabled(): 204 migrate(migrate_existing_font_size_settings_down_one_size, ignore_failure=True) 205 206 207 def run_migration(migration, user_id = None, char_id = None, ignore_failure = False): 208 logger.info('Running settings migration: {}'.format(getattr(migration, '__name__', 'unknown'))) 209 try: 210 migration(user_id, char_id) 211 except Exception: 212 if ignore_failure: 213 logger.exception('Settings migration failed') 214 else: 215 raise 216 217 218 def migrate_window_settings_from_user_to_char(user_id, char_id): 219 if not settings.char.windows.Get('__usercopy__', False): 220 oldUserSettings = settings.user.windows.GetValues() 221 logger.info('CONVERTING SETTINGS FROM USER TO CHAR userID=%s, charID=%s, settings:%s', user_id, char_id, oldUserSettings.keys()) 222 for settingKey in oldUserSettings.keys(): 223 oldValue = settings.user.windows.Get(settingKey) 224 settings.char.windows.Set(settingKey, oldValue) 225 226 settings.char.windows.Set('__usercopy__', True) 227 228 229 def clear_stored_compact_window_settings_that_match_the_default(user_id, char_id): 230 if char_id is None: 231 return 232 migration_flag = '__clear_stored_compact_window_settings_that_match_the_default__' 233 if settings.char.windows.Get(migration_flag, False): 234 return 235 migrated = {} 236 compact_mode_by_window_id = settings.char.windows.Get(COMPACT_MODE_BY_WINDOW_ID_KEY, {}) 237 for window_id, compact_mode in compact_mode_by_window_id.items(): 238 if compact_mode: 239 migrated[window_id] = compact_mode 240 241 settings.char.windows.Set(COMPACT_MODE_BY_WINDOW_ID_KEY, migrated) 242 settings.char.windows.Set(migration_flag, True) 243 244 245 def reset_window_settings_if_outdated(): 246 version = GetSettingsVersion() 247 if settings.char.windows.Get('__version__', None) != version: 248 ResetAllWindowSettings() 249 250 251 def ResetAllWindowSettings(): 252 settings.char.Remove('windows') 253 version = GetSettingsVersion() 254 logger.info('Starting new window settings with version=%s', version) 255 settings.char.windows.Set('__version__', version) 256 settings.char.windows.Set('__usercopy__', True)