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