NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)