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

uiColorSvc.py (9454B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\services\uiColorSvc.py
      2 import logging
      3 import chroma
      4 import evetypes
      5 from carbon.common.script.sys.service import Service
      6 from carbonui import uiconst
      7 from eve.client.script.ui import eveColor, eveThemeColor
      8 from eve.client.script.ui.services import uiColorThemeMixer, uiColorSettings
      9 from eve.client.script.ui.shared import colorThemes
     10 from eve.client.script.ui.shared.systemMenu.theme.storage import custom_color_themes
     11 from eveexceptions.exceptionEater import ExceptionEater
     12 from omega.client.clone_grade_svc import get_clone_grade_svc
     13 logger = logging.getLogger(__name__)
     14 
     15 class UIColor(Service):
     16     __guid__ = 'svc.uiColor'
     17     __servicename__ = 'uiColor'
     18     __displayname__ = 'UI Color Service'
     19     __startupdependencies__ = ['settings']
     20     __notifyevents__ = ['OnSessionChanged', 'OnSubscriptionChanged', 'ProcessActiveShipChanged']
     21     _noCharThemeID = colorThemes.DEFAULT_COLORTHEMEID
     22     _themeOverride = None
     23 
     24     def Run(self, memStream = None):
     25         self._noCharThemeID = colorThemes.DEFAULT_COLORTHEMEID
     26         self._ResetColorCache()
     27         self.TriggerUpdate()
     28         uiColorSettings.window_transparency_setting.on_change.connect(self._OnWindowTransparencyChanged)
     29         uiColorSettings.window_transparency_light_mode_setting.on_change.connect(self._OnWindowTransparencyChanged)
     30         uiColorSettings.window_transparency_noblur_setting.on_change.connect(self._OnWindowTransparencyChanged)
     31         uiColorSettings.show_window_bg_blur_setting.on_change.connect(self._OnWindowBlurSettingChanged)
     32 
     33     def _OnWindowTransparencyChanged(self, *args):
     34         self.TriggerUpdate()
     35 
     36     def OnSessionChanged(self, isRemote, sess, change):
     37         if 'userid' in change or 'charid' in change:
     38             self.TriggerUpdate()
     39         self.SelectThemeFromShip()
     40 
     41     def OnSubscriptionChanged(self):
     42         self.TriggerUpdate()
     43 
     44     def _OnWindowBlurSettingChanged(self, *args):
     45         self.TriggerUpdate()
     46 
     47     def ProcessActiveShipChanged(self, *args):
     48         self.SelectThemeFromShip()
     49 
     50     def SelectThemeFromShip(self):
     51         if uiColorSettings.color_theme_by_ship_faction_setting.is_enabled():
     52             with ExceptionEater('SelectThemeFromShip'):
     53                 typeID = sm.GetService('fleet').GetMyShipTypeID()
     54                 if typeID:
     55                     themeID = colorThemes.COLOR_THEME_ID_BY_FACTION.get(evetypes.GetFactionID(typeID), None)
     56                     if themeID:
     57                         self.SetThemeID(themeID)
     58 
     59     def GetThemeIDForSessionRaceID(self):
     60         return colorThemes.COLOR_THEME_ID_BY_RACE.get(session.raceID, colorThemes.DEFAULT_COLORTHEMEID)
     61 
     62     def SetNoCharTheme(self, themeID):
     63         self._noCharThemeID = themeID
     64         self.TriggerUpdate()
     65 
     66     def SetThemeID(self, themeID):
     67         if themeID is None:
     68             raise ValueError('themeID is None')
     69         activeThemeID = self.GetActiveThemeID()
     70         settings.char.windows.Set('wndColorThemeID', themeID)
     71         settings.char.windows.Set('baseColorTemp', None)
     72         settings.char.windows.Set('hiliteColorTemp', None)
     73         if activeThemeID != themeID:
     74             self.TriggerUpdate()
     75 
     76     def _GetBaseColor(self):
     77         if self._colorBase:
     78             return self._colorBase
     79         color = settings.char.windows.Get('baseColorTemp', None)
     80         if color:
     81             return color
     82         colorBase = self.GetActiveTheme().tint
     83         self._colorBase = uiColorThemeMixer.GetBaseColor(colorBase)
     84         return self._colorBase
     85 
     86     def SetBaseColor(self, color):
     87         settings.char.windows.Set('baseColorTemp', color)
     88         self.TriggerUpdate()
     89 
     90     def _GetHilightColor(self):
     91         if self._colorHilite:
     92             return self._colorHilite
     93         color = settings.char.windows.Get('hiliteColorTemp', None)
     94         if color:
     95             return color
     96         self._colorHilite = self.GetActiveTheme().focus
     97         return self._colorHilite
     98 
     99     def _GetHilightGlowColor(self):
    100         if self._colorHiliteGlow:
    101             return self._colorHiliteGlow
    102         self._colorHiliteGlow = uiColorThemeMixer.GetHilightGlowColor(self._GetHilightColor())
    103         return self._colorHiliteGlow
    104 
    105     def _GetFlashColor(self):
    106         if self._colorFlash:
    107             return self._colorFlash
    108         self._colorFlash = uiColorThemeMixer.GetFlashColor(self._GetHilightColor())
    109         return self._colorFlash
    110 
    111     def _GetAccentColor(self):
    112         return self.GetActiveTheme().focus
    113 
    114     def SetHilightColor(self, color):
    115         settings.char.windows.Set('hiliteColorTemp', color)
    116         self.TriggerUpdate()
    117 
    118     def _GetBaseContrastColor(self):
    119         if self._colorBaseContrast:
    120             return self._colorBaseContrast
    121         color = chroma.Color.from_rgba(*eveColor.WHITE).with_alpha(0.05).rgba
    122         color = uiColorThemeMixer.GetBaseContrastColor(color)
    123         self._colorBaseContrast = color
    124         return self._colorBaseContrast
    125 
    126     def GetUIColor(self, colorType):
    127         if colorType == uiconst.COLORTYPE_UIBASE:
    128             color = self._GetBaseColor()
    129         elif colorType == uiconst.COLORTYPE_UIBASECONTRAST:
    130             color = self._GetBaseContrastColor()
    131         elif colorType == uiconst.COLORTYPE_UIHILIGHT:
    132             color = self._GetHilightColor()
    133         elif colorType == uiconst.COLORTYPE_UIHILIGHTGLOW:
    134             color = self._GetHilightGlowColor()
    135         elif colorType == uiconst.COLORTYPE_FLASH:
    136             color = self._GetFlashColor()
    137         elif colorType == uiconst.COLORTYPE_ACCENT:
    138             color = self._GetAccentColor()
    139         else:
    140             return None
    141         if hasattr(color, 'rgba'):
    142             return color.rgba
    143         else:
    144             return color
    145 
    146     def _ResetColorCache(self):
    147         self._colorBase = None
    148         self._colorBaseContrast = None
    149         self._colorHilite = None
    150         self._colorHiliteGlow = None
    151         self._colorHeader = None
    152         self._colorFlash = None
    153 
    154     def TriggerUpdate(self):
    155         self._ResetColorCache()
    156         theme = self.GetActiveTheme()
    157         eveThemeColor.SetThemeColors(tint=theme.tint, focus=theme.focus, focus_dark=theme.focus_dark, accent=theme.accent, alert=theme.alert)
    158         sm.ScatterEvent('OnUIColorsChanged')
    159 
    160     def ResetUIColors(self):
    161         if session.charid:
    162             settings.char.windows.Set('wndColorThemeID', colorThemes.DEFAULT_COLORTHEMEID)
    163         uiColorSettings.color_theme_by_ship_faction_setting.reset()
    164         uiColorSettings.window_transparency_setting.reset()
    165         uiColorSettings.window_transparency_noblur_setting.reset()
    166         self.TriggerUpdate()
    167 
    168     def GetThemeBaseColor(self, themeID):
    169         return self.GetThemeByID(themeID).tint
    170 
    171     def GetThemeHiliteColor(self, themeID):
    172         return self.GetThemeByID(themeID).focus
    173 
    174     def GetThemeName(self, themeID):
    175         return self.GetThemeByID(themeID).name
    176 
    177     def GetActiveTheme(self):
    178         return self.GetThemeByID(self._GetActiveThemeID())
    179 
    180     def GetActiveThemeID(self):
    181         return self.GetActiveTheme().id
    182 
    183     def GetAvailableThemes(self):
    184         return self._GetAvailableThemesByID().values()
    185 
    186     def GetThemeByID(self, themeID):
    187         if self._themeOverride is not None and self._themeOverride.id == themeID:
    188             return self._themeOverride
    189         available = self._GetAvailableThemesByID()
    190         theme = available.get(themeID, None)
    191         if theme is None:
    192             theme = available[colorThemes.DEFAULT_COLORTHEMEID]
    193         return theme
    194 
    195     def SetThemeOverride(self, theme):
    196         if self._themeOverride != theme:
    197             self._themeOverride = theme
    198             self.TriggerUpdate()
    199 
    200     def ClearThemeOverride(self):
    201         self.SetThemeOverride(None)
    202 
    203     def SaveCustomTheme(self, theme):
    204         if theme.is_preset:
    205             raise ValueError("Can't override preset color themes")
    206         with custom_color_themes.modify() as custom_themes:
    207             custom_themes.add_or_update(theme)
    208 
    209     def DeleteCustomTheme(self, theme):
    210         if self.GetActiveThemeID() == theme.id:
    211             self.SetThemeID(colorThemes.DEFAULT_COLORTHEMEID)
    212         with custom_color_themes.modify() as custom_themes:
    213             try:
    214                 custom_themes.remove(theme)
    215             except Exception:
    216                 logger.warning('Unable to remove theme with ID {}'.format(theme.id))
    217 
    218     def _GetActiveThemeID(self):
    219         if self._themeOverride is not None:
    220             return self._themeOverride.id
    221         if not session.charid:
    222             themeID = self._noCharThemeID
    223         else:
    224             themeID = settings.char.windows.Get('wndColorThemeID', self._noCharThemeID)
    225             if session.charid:
    226                 if get_clone_grade_svc().is_omega_with_grace_period():
    227                     if themeID not in self._GetAvailableThemesByID():
    228                         themeID = colorThemes.DEFAULT_COLORTHEMEID
    229                 elif themeID not in self._GetAvailableThemesForAlphaByID():
    230                     themeID = colorThemes.ALPHA_COLORTHEMEID
    231         return themeID
    232 
    233     def _GetAvailableThemesByID(self):
    234         themes = {theme.id:theme for theme in colorThemes.COLOR_THEME_PRESETS}
    235         themes.update(custom_color_themes.get().themes_by_id)
    236         return themes
    237 
    238     def _GetAvailableThemesForAlphaByID(self):
    239         return {theme.id:theme for theme in filter(lambda t: not t.omega_only, colorThemes.COLOR_THEME_PRESETS)}