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

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