dragResizeCont.py (7638B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\control\dragResizeCont.py 2 from carbonui import Axis, AxisAlignment, uiconst 3 from carbonui.decorative.resize_handle import ResizeHandle 4 from carbonui.primitives.container import Container 5 from carbonui.uicore import uicore 6 dividerAlign = {uiconst.TOLEFT: uiconst.TORIGHT, 7 uiconst.TORIGHT: uiconst.TOLEFT, 8 uiconst.TOTOP: uiconst.TOBOTTOM, 9 uiconst.TOBOTTOM: uiconst.TOTOP, 10 uiconst.TOLEFT_PROP: uiconst.TORIGHT, 11 uiconst.TORIGHT_PROP: uiconst.TOLEFT, 12 uiconst.TOTOP_PROP: uiconst.TOBOTTOM, 13 uiconst.TOBOTTOM_PROP: uiconst.TOTOP} 14 15 class DragResizeCont(Container): 16 default_align = uiconst.TOTOP 17 default_state = uiconst.UI_NORMAL 18 default_maxSize = 200 19 default_minSize = 50 20 default_defaultSize = 150 21 default_settingsID = None 22 default_dragAreaSize = 8 23 24 def ApplyAttributes(self, attributes): 25 Container.ApplyAttributes(self, attributes) 26 self.maxSize = attributes.Get('maxSize', self.default_maxSize) 27 self.minSize = attributes.Get('minSize', self.default_minSize) 28 self.settingsID = attributes.Get('settingsID', self.default_settingsID) 29 self.onResizeCallback = attributes.Get('onResizeCallback', None) 30 self.onDragCallback = attributes.Get('onDragCallback', None) 31 dragAreaSize = attributes.Get('dragAreaSize', self.default_dragAreaSize) 32 defaultSize = attributes.Get('defaultSize', self.default_defaultSize) 33 handle_cross_axis_alignment = attributes.get('handle_cross_axis_alignment', AxisAlignment.CENTER) 34 if self.align not in dividerAlign: 35 raise ValueError('Invalid alignment mode selected. Must be push aligned to LEFT, TOP, RIGHT or BOTTOM') 36 self.isHorizontal = self.align in (uiconst.TOLEFT, 37 uiconst.TORIGHT, 38 uiconst.TOLEFT_PROP, 39 uiconst.TORIGHT_PROP) 40 self.isProportional = self.align in (uiconst.TOLEFT_PROP, 41 uiconst.TOTOP_PROP, 42 uiconst.TORIGHT_PROP, 43 uiconst.TOBOTTOM_PROP) 44 self.isDraggin = False 45 self.initialPos = None 46 if self.settingsID: 47 size = settings.user.ui.Get(self.settingsID, defaultSize) 48 else: 49 size = defaultSize 50 self._SetSize(size) 51 self.dragArea = Container(name='dragArea', parent=self, state=uiconst.UI_NORMAL, width=dragAreaSize, height=dragAreaSize) 52 self.UpdateDragAreaAlign() 53 self.mainCont = Container(parent=self, name='mainCont') 54 if self.isHorizontal: 55 orientation = Axis.VERTICAL 56 else: 57 orientation = Axis.HORIZONTAL 58 ResizeHandle(parent=self.dragArea, align=uiconst.TOALL, orientation=orientation, cross_axis_alignment=handle_cross_axis_alignment, on_drag_start=self._on_drag_start, on_drag_move=self._on_drag_move, on_drag_end=self._on_drag_end, show_line=attributes.get('show_line', False)) 59 60 def UpdateDragAreaAlign(self): 61 self.dragArea.align = dividerAlign[self.align] 62 63 def IsInverse(self): 64 return self.align in (uiconst.TORIGHT, 65 uiconst.TORIGHT_PROP, 66 uiconst.TOBOTTOM, 67 uiconst.TOBOTTOM_PROP) 68 69 def _GetPos(self): 70 if self.isHorizontal: 71 return uicore.uilib.x 72 return uicore.uilib.y 73 74 def SetAlign(self, align): 75 super(DragResizeCont, self).SetAlign(align) 76 if not self._constructingBase: 77 self.UpdateDragAreaAlign() 78 79 def _on_drag_start(self): 80 self.OnDragAreaMouseDown() 81 82 def _on_drag_move(self, delta): 83 self.OnDragAreaMouseMove() 84 85 def _on_drag_end(self): 86 self.OnDragAreaMouseUp() 87 88 def OnDragAreaMouseDown(self, *args): 89 self.isDraggin = True 90 self.initialPos = self._GetPos() 91 self.parSize = self._GetParSize() 92 93 def DisableDragResize(self): 94 self.dragArea.Disable() 95 self.dragArea.opacity = 0.0 96 97 def EnableDragResize(self): 98 self.dragArea.Enable() 99 self.dragArea.opacity = 1.0 100 101 def _GetParSize(self): 102 parWidth, parHeight = self.parent.GetAbsoluteSize() 103 parSize = parWidth if self.isHorizontal else parHeight 104 return parSize 105 106 def OnDragAreaMouseUp(self, *args): 107 self.isDraggin = False 108 settings.user.ui.Set(self.settingsID, self._GetSize()) 109 if self.onResizeCallback: 110 self.onResizeCallback() 111 112 def OnDragAreaMouseMove(self, *args): 113 if not self.isDraggin: 114 return 115 newPos = self._GetPos() 116 if self.IsInverse(): 117 self._ChangeSize(self.initialPos - newPos) 118 else: 119 self._ChangeSize(newPos - self.initialPos) 120 l, t, w, h = self.GetAbsolute() 121 if self.align in (uiconst.TOLEFT, uiconst.TOLEFT_PROP): 122 self.initialPos = max(l + self.minSize, min(newPos, l + w)) 123 elif self.align in (uiconst.TORIGHT, uiconst.TORIGHT_PROP): 124 self.initialPos = max(l, min(newPos, l + w - self.minSize)) 125 elif self.align in (uiconst.TOTOP, uiconst.TOTOP_PROP): 126 self.initialPos = max(t + self.minSize, min(newPos, t + h)) 127 elif self.align in (uiconst.TOBOTTOM, uiconst.TOBOTTOM_PROP): 128 self.initialPos = max(t, min(newPos, t + h - self.minSize)) 129 if self.onDragCallback: 130 self.onDragCallback() 131 132 def _GetSize(self): 133 if self.isHorizontal: 134 return self.width 135 else: 136 return self.height 137 138 def GetMaxSize(self): 139 if self.maxSize is not None: 140 return self._ConvertSize(self.maxSize) 141 142 def SetMaxSize(self, maxSize): 143 self.maxSize = maxSize 144 if self.maxSize is not None and self._GetSize() >= self.maxSize: 145 self._SetSize(self.maxSize) 146 147 def GetMinSize(self): 148 return self._ConvertSize(self.minSize) 149 150 def SetMinSize(self, minSize): 151 self.minSize = minSize 152 if self._GetSize() <= self.minSize: 153 self._SetSize(self.minSize) 154 155 def _ConvertSize(self, size): 156 self.parSize = self._GetParSize() 157 if size > 1: 158 if self.isProportional: 159 return float(size) / self.parSize 160 else: 161 return size 162 else: 163 if self.isProportional: 164 return size 165 return size * max(0, self.parSize) 166 167 def _OnSizeChange_NoBlock(self, width, height): 168 self._UpdateSize(width, height) 169 170 def UpdateSize(self): 171 width, height = self.GetAbsoluteSize() 172 self._UpdateSize(width, height) 173 174 def _UpdateSize(self, width = None, height = None): 175 if not self.pickState: 176 return 177 if width < 0 or height < 0: 178 return 179 size = width if self.isHorizontal else height 180 size = self._ConvertSize(size) 181 minSize = self._ConvertSize(self.minSize) 182 if size < minSize: 183 self._SetSize(minSize) 184 if self.maxSize is not None: 185 maxSize = self._ConvertSize(self.maxSize) 186 if size > maxSize: 187 self._SetSize(maxSize) 188 189 def _SetSize(self, size): 190 minSize = self._ConvertSize(self.minSize) 191 size = max(minSize, size) 192 if self.maxSize is not None: 193 maxSize = self._ConvertSize(self.maxSize) 194 size = min(size, maxSize) 195 if self.isHorizontal: 196 self.width = size 197 else: 198 self.height = size 199 200 def _ChangeSize(self, diff): 201 size = self._GetSize() 202 if self.isProportional: 203 size += float(diff) / self.parSize 204 else: 205 size += diff 206 self._SetSize(size)