action.py (14267B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\window\control\action.py 2 import abc 3 import weakref 4 import eveicon 5 import localization 6 import signals 7 import uihider 8 from carbon.common.script.sys.serviceManager import ServiceManager 9 from carbonui.window.util import is_blocked 10 11 class WindowActionImportance(object): 12 core = 1 13 extra = 2 14 content = 3 15 16 17 class WindowActionBase(object): 18 __metaclass__ = abc.ABCMeta 19 20 def __init__(self, window, available = True, available_check = None, enabled = True, enabled_check = None, ui_name = None, importance = WindowActionImportance.core, importance_check = None): 21 self.__window_ref = weakref.ref(window) 22 self.__available = available_check(window) if available_check is not None else available 23 self.__available_check = available_check 24 self.__enabled = enabled_check(window) if enabled_check is not None else enabled 25 self.__enabled_check = enabled_check 26 self.__ui_name = ui_name 27 self.__importance = importance_check(window) if importance_check is not None else importance 28 self.__importance_check = importance_check 29 self.__on_available_changed = None 30 self.__on_enabled_changed = None 31 self.__on_icon_changed = None 32 self.__on_label_changed = None 33 self.__on_importance_changed = None 34 35 @abc.abstractproperty 36 def icon(self): 37 pass 38 39 @property 40 def on_icon_changed(self): 41 if self.__on_icon_changed is None: 42 self.__on_icon_changed = signals.Signal('{}.on_icon_changed'.format(self.__class__.__name__)) 43 return self.__on_icon_changed 44 45 @abc.abstractproperty 46 def label(self): 47 pass 48 49 @property 50 def on_label_changed(self): 51 if self.__on_label_changed is None: 52 self.__on_label_changed = signals.Signal('{}.on_label_changed'.format(self.__class__.__name__)) 53 return self.__on_label_changed 54 55 @property 56 def available(self): 57 return self.__available 58 59 @property 60 def on_available_changed(self): 61 if self.__on_available_changed is None: 62 self.__on_available_changed = signals.Signal('{}.on_available_changed'.format(self.__class__.__name__)) 63 return self.__on_available_changed 64 65 @property 66 def enabled(self): 67 return self.__enabled 68 69 @property 70 def on_enabled_changed(self): 71 if self.__on_enabled_changed is None: 72 self.__on_enabled_changed = signals.Signal('{}.on_enabled_changed'.format(self.__class__.__name__)) 73 return self.__on_enabled_changed 74 75 @property 76 def importance(self): 77 return self.__importance 78 79 @property 80 def on_importance_changed(self): 81 if self.__on_importance_changed is None: 82 self.__on_importance_changed = signals.Signal('{}.on_importance_changed'.format(self.__class__.__name__)) 83 return self.__on_importance_changed 84 85 @property 86 def ui_name(self): 87 return self.__ui_name 88 89 @property 90 def window(self): 91 window = self.__window_ref() 92 if window is not None and not window.destroyed: 93 return window 94 95 @abc.abstractmethod 96 def execute(self): 97 pass 98 99 def update(self): 100 window = self.window 101 if window is None: 102 return 103 if self.__available_check is not None: 104 available = self.__available_check(window) 105 if self.__available != available: 106 self.__available = available 107 self.on_available_changed(self) 108 if self.__enabled_check is not None: 109 enabled = self.__enabled_check(window) 110 if self.__enabled != enabled: 111 self.__enabled = enabled 112 self.on_enabled_changed(self) 113 if self.__importance_check is not None: 114 importance = self.__importance_check(window) 115 if self.__importance != importance: 116 self.__importance = importance 117 self.on_importance_changed(self) 118 119 120 class WindowToggleAction(WindowActionBase): 121 122 def __init__(self, window, callback, toggled_check, toggled_on_icon, toggled_off_icon, toggled_on_label, toggled_off_label, available = True, available_check = None, enabled = True, enabled_check = None, importance = WindowActionImportance.core, importance_check = None): 123 super(WindowToggleAction, self).__init__(window=window, available=available, available_check=available_check, enabled=enabled, enabled_check=enabled_check, importance=importance, importance_check=importance_check) 124 self._callback = callback 125 self._toggled_on = toggled_check(window) 126 self._toggled_check = toggled_check 127 self._toggled_on_icon = toggled_on_icon 128 self._toggled_off_icon = toggled_off_icon 129 self._toggled_on_label = toggled_on_label 130 self._toggled_off_label = toggled_off_label 131 132 @property 133 def icon(self): 134 if self.toggled_on: 135 return self._toggled_on_icon 136 else: 137 return self._toggled_off_icon 138 139 @property 140 def label(self): 141 if self.toggled_on: 142 return self._toggled_on_label 143 else: 144 return self._toggled_off_label 145 146 @property 147 def toggled_on(self): 148 return self._toggled_on 149 150 def execute(self): 151 if self.available and self.enabled: 152 window = self.window 153 if window is None: 154 return 155 self._callback(window) 156 self._update_toggled_state() 157 158 def update(self): 159 super(WindowToggleAction, self).update() 160 self._update_toggled_state() 161 162 def _update_toggled_state(self): 163 window = self.window 164 if window is None: 165 return 166 toggled_on = self._toggled_check(window) 167 if self._toggled_on != toggled_on: 168 self._toggled_on = toggled_on 169 if self._toggled_on_icon != self._toggled_off_icon: 170 self.on_icon_changed(self) 171 if self._toggled_on_label != self._toggled_off_label: 172 self.on_label_changed(self) 173 174 175 class WindowAction(WindowActionBase): 176 177 def __init__(self, window, label, icon, callback, available = True, available_check = None, enabled = True, enabled_check = None, ui_name = None, importance = WindowActionImportance.core, importance_check = None): 178 super(WindowAction, self).__init__(window=window, available=available, available_check=available_check, enabled=enabled, enabled_check=enabled_check, ui_name=ui_name, importance=importance, importance_check=importance_check) 179 self._label = label 180 self._icon = icon 181 self._callback = callback 182 183 @property 184 def label(self): 185 return self._label 186 187 @property 188 def icon(self): 189 return self._icon 190 191 def execute(self): 192 if self.available and self.enabled: 193 window = self.window 194 if window is not None: 195 return self._callback(window) 196 197 198 class WindowMenuAction(WindowAction): 199 pass 200 201 202 class CloseWindowAction(WindowAction): 203 204 def __init__(self, window): 205 if window.is_stack: 206 label = localization.GetByLabel('UI/Control/EveWindow/CloseStack') 207 else: 208 label = localization.GetByLabel('UI/Common/Buttons/Close') 209 super(CloseWindowAction, self).__init__(window=window, icon=eveicon.close, label=label, callback=lambda _window: _window.CloseByUser(), available_check=lambda _window: _window.killable, enabled_check=lambda _window: not is_blocked('close', _window.windowID), ui_name='CloseButtonIcon') 210 window.on_killable_changed.connect(self._on_killable_changed) 211 uihider.CommandBlockerService.instance().subscribe(self.update) 212 213 def _on_killable_changed(self, window): 214 self.update() 215 216 217 class MinimizeWindowAction(WindowAction): 218 219 def __init__(self, window): 220 if window.is_stack: 221 label = localization.GetByLabel('UI/Control/EveWindow/MinimizeStack') 222 else: 223 label = localization.GetByLabel('UI/Control/EveWindow/Minimize') 224 225 def enabled_check(_window): 226 return not is_blocked('minimize', _window.windowID) and ServiceManager.Instance().GetService('neocom').IsAvailable() 227 228 super(MinimizeWindowAction, self).__init__(window=window, icon=eveicon.minimize, label=label, callback=lambda _window: _window.Minimize(), available_check=lambda _window: _window.minimizable, enabled_check=enabled_check, ui_name='MinimizeButtonIcon') 229 uihider.CommandBlockerService.instance().subscribe(self.update) 230 ServiceManager.Instance().RegisterForNotifyEvent(self, 'OnNeocomAvailableChanged') 231 window.on_minimizable_changed.connect(self._on_window_minimizable_changed) 232 233 def _on_window_minimizable_changed(self, window): 234 self.update() 235 236 def OnNeocomAvailableChanged(self): 237 self.update() 238 239 240 class LightBackgroundWindowAction(WindowToggleAction): 241 242 def __init__(self, window): 243 super(LightBackgroundWindowAction, self).__init__(window=window, toggled_on_icon=eveicon.light_background_on, toggled_off_icon=eveicon.light_background_off, toggled_on_label=localization.GetByLabel('/Carbon/UI/Controls/Window/DisableLightBackground'), toggled_off_label=localization.GetByLabel('/Carbon/UI/Controls/Window/EnableLightBackground'), callback=self._toggle_light_background, toggled_check=lambda _window: _window.IsLightBackgroundEnabled(), available_check=lambda _window: _window.IsLightBackgroundConfigurable(), importance=WindowActionImportance.extra) 244 window.on_light_background_changed.connect(self._on_light_background_changed) 245 246 @staticmethod 247 def _toggle_light_background(window): 248 if window.IsLightBackgroundEnabled(): 249 window.DisableLightBackground() 250 else: 251 window.EnableLightBackground() 252 253 def _on_light_background_changed(self, window): 254 self.update() 255 256 257 class CompactModeWindowAction(WindowToggleAction): 258 259 def __init__(self, window): 260 super(CompactModeWindowAction, self).__init__(window=window, toggled_on_icon=eveicon.uncompact, toggled_off_icon=eveicon.compact, toggled_on_label=localization.GetByLabel('/Carbon/UI/Controls/Window/DisableCompactMode'), toggled_off_label=localization.GetByLabel('/Carbon/UI/Controls/Window/EnableCompactMode'), callback=self._toggle_compact_mode, toggled_check=lambda _window: _window.compact, available_check=lambda _window: _window.compactable, enabled_check=lambda _window: not is_blocked('compact', _window.windowID), importance=WindowActionImportance.extra) 261 uihider.CommandBlockerService.instance().subscribe(self.update) 262 window.on_compact_mode_changed.connect(self._on_window_compact_mode_changed) 263 264 @staticmethod 265 def _toggle_compact_mode(window): 266 window.compact = not window.compact 267 268 def _on_window_compact_mode_changed(self, window): 269 self.update() 270 271 272 class LockWindowAction(WindowToggleAction): 273 274 def __init__(self, window): 275 super(LockWindowAction, self).__init__(window=window, callback=self._toggle_locked, toggled_on_icon=eveicon.locked, toggled_off_icon=eveicon.unlocked, toggled_on_label=localization.GetByLabel('/Carbon/UI/Controls/Window/Unlock'), toggled_off_label=localization.GetByLabel('/Carbon/UI/Controls/Window/Lock'), toggled_check=lambda _window: _window.locked, available_check=self._is_available, enabled_check=self._is_enabled, importance_check=self._get_importance) 276 window.on_lockable_changed.connect(self._on_window_lockable_changed) 277 window.on_locked_changed.connect(self._on_window_locked_changed) 278 uihider.CommandBlockerService.instance().subscribe(self.update) 279 280 @staticmethod 281 def _is_available(window): 282 if window.locked: 283 return True 284 elif window.lockable: 285 return True 286 else: 287 return False 288 289 @staticmethod 290 def _is_enabled(window): 291 action = 'lock' if not window.locked else 'unlock' 292 return not is_blocked(action, window.windowID) and window.lockable 293 294 @staticmethod 295 def _get_importance(window): 296 if window.locked: 297 return WindowActionImportance.core 298 else: 299 return WindowActionImportance.extra 300 301 @staticmethod 302 def _toggle_locked(window): 303 window.locked = not window.locked 304 305 def _on_window_lockable_changed(self, window): 306 self.update() 307 308 def _on_window_locked_changed(self, window): 309 self.update() 310 311 312 class OverlayWindowAction(WindowToggleAction): 313 314 def __init__(self, window): 315 super(OverlayWindowAction, self).__init__(window=window, callback=self._toggle_overlay, toggled_check=lambda _window: _window.IsOverlayed(), toggled_on_icon=eveicon.overlay_fullscreen_on, toggled_off_icon=eveicon.overlay_fullscreen_off, toggled_on_label=localization.GetByLabel('/Carbon/UI/Controls/Window/DisableOverlayMode'), toggled_off_label=localization.GetByLabel('/Carbon/UI/Controls/Window/EnableOverlayMode'), available_check=lambda _window: _window.IsOverlayable(), importance=WindowActionImportance.extra) 316 317 @staticmethod 318 def _toggle_overlay(window): 319 if window.IsOverlayed(): 320 window.SetNotOverlayed() 321 else: 322 window.SetOverlayed() 323 324 325 class CollapseWindowAction(WindowToggleAction): 326 327 def __init__(self, window): 328 super(CollapseWindowAction, self).__init__(window=window, callback=self._toggle_collapsed, toggled_check=lambda _window: _window.collapsed, toggled_on_icon=eveicon.expand, toggled_off_icon=eveicon.collapse, toggled_on_label=localization.GetByLabel('/Carbon/UI/Controls/Window/Expand'), toggled_off_label=localization.GetByLabel('/Carbon/UI/Controls/Window/Collapse'), available_check=lambda _window: _window.collapsible, importance=WindowActionImportance.extra) 329 window.on_collapsed_changed.connect(self._on_window_collapsed_changed) 330 window.on_collapsible_changed.connect(self._on_window_collapsible_changed) 331 332 @staticmethod 333 def _toggle_collapsed(window): 334 window.collapsed = not window.collapsed 335 336 def _on_window_collapsible_changed(self, window): 337 self.update() 338 339 def _on_window_collapsed_changed(self, window): 340 self.update()