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

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)