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)}