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

tab_navigation.py (7409B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\window\header\tab_navigation.py
      2 import signals
      3 from carbonui import uiconst
      4 from carbonui.decorative.divider_line import DividerLine
      5 from carbonui.primitives.container import Container
      6 from carbonui.primitives.containerAutoSize import ContainerAutoSize
      7 from carbonui.primitives.sprite import Sprite
      8 from carbonui.window.header.base import WindowHeaderBase
      9 from carbonui.window.settings import WindowMarginMode
     10 from carbonui.control.tabGroup import TabGroup
     11 
     12 class TabNavigationWindowHeader(Container, WindowHeaderBase):
     13     NORMAL_HEIGHT = 48
     14     ICON_SIZE_COMPACT = 24
     15     ICON_SIZE_NORMAL = 32
     16     ICON_OFFSET_COMPACT = -2
     17     ICON_OFFSET_NORMAL = -4
     18     _caption_icon = None
     19     _line = None
     20     _main_cont = None
     21     _tab_group = None
     22 
     23     def __init__(self, on_tab_selected = None):
     24         self.on_tab_selected = signals.Signal('TabNavigationWindowHeader.on_tab_selected')
     25         super(TabNavigationWindowHeader, self).__init__(height=self.NORMAL_HEIGHT)
     26         if on_tab_selected is not None:
     27             self.on_tab_selected.connect(on_tab_selected)
     28 
     29     @classmethod
     30     def desired_height(cls, window):
     31         if window.compact or window.collapsed or window.margin_mode == WindowMarginMode.COMPACT:
     32             return cls.COLLAPSED_HEIGHT
     33         else:
     34             return cls.NORMAL_HEIGHT
     35 
     36     @staticmethod
     37     def desired_tab_spacing(window):
     38         if window.compact or window.collapsed or window.margin_mode == WindowMarginMode.COMPACT:
     39             return 16
     40         else:
     41             return 32
     42 
     43     @property
     44     def extra_content(self):
     45         return self._extra_content
     46 
     47     @property
     48     def tab_group(self):
     49         return self._tab_group
     50 
     51     def select_tab(self, tab_id):
     52         self.tab_group.SelectByID(tab_id)
     53 
     54     def auto_select_tab(self):
     55         self.tab_group.AutoSelect()
     56 
     57     def mount(self, window):
     58         super(TabNavigationWindowHeader, self).mount(window)
     59         self._layout(window)
     60         window.on_collapsed_changed.connect(self._on_collapsed_changed)
     61         window.on_compact_mode_changed.connect(self._on_compact_changed)
     62         window.on_content_padding_changed.connect(self._on_content_padding_changed)
     63         window.on_header_inset_changed.connect(self._on_header_inset_changed)
     64         window.on_margin_mode_changed.connect(self._on_window_margin_mode_changed)
     65 
     66     def unmount(self, window):
     67         super(TabNavigationWindowHeader, self).unmount(window)
     68         self._clear()
     69         window.on_collapsed_changed.disconnect(self._on_collapsed_changed)
     70         window.on_compact_mode_changed.disconnect(self._on_compact_changed)
     71         window.on_content_padding_changed.disconnect(self._on_content_padding_changed)
     72         window.on_header_inset_changed.disconnect(self._on_header_inset_changed)
     73         window.on_margin_mode_changed.disconnect(self._on_window_margin_mode_changed)
     74 
     75     @classmethod
     76     def _get_icon_padding(cls, window):
     77         if window.collapsed or window.compact or window.margin_mode == WindowMarginMode.COMPACT:
     78             pad_left = cls.ICON_OFFSET_COMPACT
     79         elif window.margin_mode == WindowMarginMode.NORMAL:
     80             pad_left = cls.ICON_OFFSET_NORMAL
     81         else:
     82             raise ValueError('Unknown margin mode {!r}'.format(window.margin_mode))
     83         content_pad_left, _, _, _ = window.content_padding
     84         return (pad_left,
     85          0,
     86          content_pad_left,
     87          0)
     88 
     89     @classmethod
     90     def _get_icon_size(cls, window):
     91         if window.collapsed or window.compact or window.margin_mode == WindowMarginMode.COMPACT:
     92             return cls.ICON_SIZE_COMPACT
     93         else:
     94             return cls.ICON_SIZE_NORMAL
     95 
     96     @staticmethod
     97     def _get_icon_visible(window):
     98         return not (window.collapsed or window.compact)
     99 
    100     def _on_header_inset_changed(self, window):
    101         if self._main_cont:
    102             left, right = window.header_inset
    103             self._main_cont.padding = (left,
    104              0,
    105              right,
    106              0)
    107 
    108     def _on_collapsed_changed(self, window):
    109         self._update_caption_icon_display(window)
    110         self._update_height(window)
    111         self._update_icon_padding(window)
    112         self._update_icon_size(window)
    113         self._update_line_visible(window)
    114         self._update_tab_spacing(window)
    115 
    116     def _on_compact_changed(self, window):
    117         self._update_caption_icon_display(window)
    118         self._update_height(window)
    119         self._update_icon_padding(window)
    120         self._update_icon_size(window)
    121 
    122     def _on_content_padding_changed(self, window):
    123         self._update_icon_padding(window)
    124 
    125     def _on_window_margin_mode_changed(self, window):
    126         self._update_height(window)
    127         self._update_icon_padding(window)
    128         self._update_icon_size(window)
    129         self._update_tab_spacing(window)
    130 
    131     def _layout(self, window):
    132         self._line = DividerLine(parent=self, align=uiconst.TOBOTTOM_NOPUSH)
    133         self._line.display = self._get_line_visible(window)
    134         left_inset, right_inset = window.header_inset
    135         self._main_cont = Container(name='_main_cont', parent=self, align=uiconst.TOALL, padding=(left_inset,
    136          0,
    137          right_inset,
    138          0))
    139         content_pad_left, _, _, _ = window.content_padding
    140         icon_size = self._get_icon_size(window)
    141         self._caption_icon = Sprite(parent=ContainerAutoSize(parent=self._main_cont, align=uiconst.TOLEFT, padding=self._get_icon_padding(window)), align=uiconst.CENTERLEFT, state=uiconst.UI_DISABLED, width=icon_size, height=icon_size, texturePath=window.icon)
    142         self._update_caption_icon_display(window)
    143         self._tab_group = TabGroup(name='mainTabGroup', parent=self._main_cont, align=uiconst.TOLEFT, height=self.height, callback=self.on_tab_selected, autoselecttab=False, padding=0, tabSpacing=self.desired_tab_spacing(window), groupID=self.name + window.windowID, show_line=False, auto_size=True)
    144         self._extra_content = Container(name='extra', parent=self._main_cont, align=uiconst.TOALL, clipChildren=True)
    145 
    146     def _update_caption_icon_display(self, window):
    147         if self._caption_icon and self._caption_icon.parent:
    148             self._caption_icon.parent.display = self._get_icon_visible(window)
    149 
    150     def _update_height(self, window):
    151         self.height = self.desired_height(window)
    152         if self._tab_group:
    153             self._tab_group.height = self.height
    154 
    155     def _update_icon_size(self, window):
    156         if self._caption_icon:
    157             size = self._get_icon_size(window)
    158             self._caption_icon.width = size
    159             self._caption_icon.height = size
    160 
    161     def _update_icon_padding(self, window):
    162         if self._caption_icon and self._caption_icon.parent:
    163             self._caption_icon.parent.padding = self._get_icon_padding(window)
    164 
    165     def _update_tab_spacing(self, window):
    166         if self._tab_group:
    167             self._tab_group.tab_spacing = self.desired_tab_spacing(window)
    168 
    169     @staticmethod
    170     def _get_line_visible(window):
    171         return not window.collapsed
    172 
    173     def _update_line_visible(self, window):
    174         if self._line:
    175             self._line.display = self._get_line_visible(window)
    176 
    177     def _clear(self):
    178         self.Flush()
    179         self._caption_icon = None
    180         self._line = None
    181         self._main_cont = None
    182         self._tab_group = None
    183         self.on_tab_selected.clear()