November 30, 2020, 01:31:08 AM

Author Topic: [bmx] Modified Splitter proxy gadget by JoshK [ 1+ years ago ]  (Read 573 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Modified Splitter proxy gadget
Author : JoshK
Posted : 1+ years ago

Description : Changes:

-Splitter handle is much narrower
-Removed lines on splitter handle
-Splitter will emit a window size event when resized.  This is useful if any gadgets in the splitter panels need to be resized when the splitter changes.


Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. Import MaxGUI.MaxGUI
  4.  
  5.  
  6. Private
  7.  
  8. Function GadgetWindow:TGadget(gadget:TGadget)
  9.         While gadget
  10.                 If gadgetclass(gadget)=GADGET_WINDOW Return gadget
  11.                 gadget=gadgetgroup(gadget)
  12.         Wend
  13. EndFunction
  14.  
  15. Public
  16.  
  17. ' TSplitter Proxy Gadget
  18. ' Author: Seb Hollington
  19.  
  20. Rem
  21. bbdoc: Creates a gadget consisting of two panels separated by a draggable divider.
  22. about: A splitter is made up of two panels: a main panel (identified using SPLITPANEL_MAIN) which acts as the main working area; and a side pane
  23. (identified using SPLITPANEL_SIDEPANE) which is typically used to display additional information. Both of these panels are contained within a
  24. parent panel that is represented by the @TSplitter instance. The two panels are separated by a split handle/divider, the behavior of which can be
  25. queried and altered using the #SplitterBehavior and #SetSplitterBehavior functions respectively.
  26.  
  27. The size of the split handle is determined using the optional @pHandleSize parameter.  The default size of 10 pixels should work well in most
  28. situations, and the minimum value that this can be is 4.
  29.  
  30. After creating a splitter gadget, you can start adding gadgets to it by retrieving the appropriate panel with the #SplitterPanel command.
  31.  
  32. The @TSplitter type instance can be used with most of the standard MaxGUI commands, allowing you to change the properties of the entire splitter
  33. gadget. There are, however, a few exceptions:
  34.  
  35. #SetGadgetSensitivity and #GadgetSensitivity will have no effect on the splitter gadget. If you want to use active panels, create your own
  36. sub-panel within each splitter panel.
  37.  
  38. #SetGadgetTooltip and #GadgetTooltip will set/retrieve a tooltip for when the user is hovering over the splitter handle/divider.
  39.  
  40. #SetGadgetColor will modify the split handle/divider background color.
  41.  
  42. See Also: #SplitterPanel, #SetSplitterPosition, #SplitterPosition, #SetSplitterBehavior, #SplitterBehavior, #SetSplitterOrientation and #SplitterOrientation.
  43. End Rem
  44. Function CreateSplitter:TSplitter( pX%, pY%, pW%, pH%, pParent:TGadget, pOrientation% = SPLIT_VERTICAL, pHandleSize% = 10 )
  45.         Return New TSplitter.Create( pX, pY, pW, pH, pParent, pOrientation, pHandleSize )
  46. EndFunction
  47.  
  48. Const SPLITPANEL_MAIN% = 0, SPLITPANEL_SIDEPANE% = 1, SPLITPANEL_HANDLE% = 2
  49.  
  50. Rem
  51. bbdoc: Retrieves either one of the two panels which make up a TSplitter gadget.
  52. about: This function is used to return a standard MaxGUI panel that you can add your gadgets to.
  53.  
  54. The panels available are SPLITPANEL_MAIN and SPLITPANEL_SIDEPANE. See #CreateSplitter for more information
  55. about the differences between the two panels.
  56.  
  57. See Also: #CreateSplitter, #SetSplitterPosition, #SplitterPosition, #SetSplitterBehavior, #SplitterBehavior, #SetSplitterOrientation and #SplitterOrientation.
  58. End Rem
  59. Function SplitterPanel:TGadget( splitter:TSplitter, panel% = SPLITPANEL_MAIN )
  60.         Return splitter.GetPanel(panel)
  61. EndFunction
  62.  
  63. Rem
  64. bbdoc: Sets the position of the splitter (in pixels) from the edge of a TSplitter gadget.
  65. about: This function's most common use is to restore a split position previously returned by #SplitterPosition.
  66.  
  67. The optional @save% parameter determines whether or not the position supplied is restored when the splitter returns from it's hidden state.
  68. In most circumstances, this should be left as #True.
  69.  
  70. See Also: #CreateSplitter, #SplitterPanel, #SplitterPosition, #SetSplitterBehavior, #SplitterBehavior, #SetSplitterOrientation and #SplitterOrientation.
  71. End Rem
  72. Function SetSplitterPosition( splitter:TSplitter, position%, save% = True )
  73.         splitter.SetPanelSpace( position, save )
  74. EndFunction
  75.  
  76. Rem
  77. bbdoc: Returns the position of the splitter (in pixels) from the edge of a TSplitter gadget.
  78. about: This function's most common use is probably for saving the current splitter position to restore at a later time using #SetSplitterPosition.
  79.  
  80. See Also: #CreateSplitter, #SplitterPanel, #SetSplitterPosition, #SetSplitterBehavior, #SplitterBehavior, #SetSplitterOrientation and #SplitterOrientation.
  81. End Rem
  82. Function SplitterPosition:Int( splitter:TSplitter )
  83.         Return splitter.GetPanelSpace( SPLITPANEL_SIDEPANE )
  84. EndFunction
  85.  
  86. Const SPLIT_HORIZONTAL% = 0, SPLIT_VERTICAL% = 1, SPLIT_FLIPPED% = 2
  87.  
  88. Rem
  89. bbdoc: Sets the splitter orientation.
  90. about: The two orientations available are (both of which can be combined with SPLIT_FLIPPED):
  91.  
  92. [ @Orientation | @Description
  93. * -1 | Toggles the SPLIT_FLIPPED flag.
  94. * SPLIT_VERTICAL | The splitter consists of a main left panel with a side-pane along the right edge.
  95. * SPLIT_HORIZONTAL | The splitter consists of a main top panel with a side-pane along the bottom edge.
  96. * SPLIT_VERTICAL ~| SPLIT_FLIPPED | The splitter consists of a main right panel with a side-pane along the left edge.
  97. * SPLIT_HORIZONTAL ~| SPLIT_FLIPPED | The splitter consists of a main bottom with a side-pane along the top edge.
  98. ]
  99.  
  100. See Also: #CreateSplitter, #SplitterPanel, #SetSplitterPosition, #SplitterPosition, #SetSplitterBehavior and #SplitterOrientation.
  101. End Rem
  102. Function SetSplitterOrientation( splitter:TSplitter, orientation% = -1 )
  103.         splitter.ChangeOrientation( orientation )
  104. EndFunction
  105.  
  106. Rem
  107. bbdoc: Returns the orientation of the splitter.
  108. about: The two orientations available are (both of which can be combined with SPLIT_FLIPPED):
  109.  
  110. [ @Orientation | @Description
  111. * SPLIT_VERTICAL | The splitter consists of a main left panel with a side-pane along the right edge.
  112. * SPLIT_HORIZONTAL | The splitter consists of a main top panel with a side-pane along the bottom edge.
  113. * SPLIT_VERTICAL ~| SPLIT_FLIPPED | The splitter consists of a main right panel with a side-pane along the left edge.
  114. * SPLIT_HORIZONTAL ~| SPLIT_FLIPPED | The splitter consists of a main bottom with a side-pane along the top edge.
  115. ]
  116.  
  117. See Also: #CreateSplitter, #SplitterPanel, #SetSplitterPosition, #SplitterPosition, #SetSplitterBehavior and #SetSplitterOrientation.
  118. End Rem
  119. Function SplitterOrientation:Int( splitter:TSplitter )
  120.         Return splitter.GetOrientation()
  121. EndFunction
  122.  
  123. Const SPLIT_RESIZABLE% = %1, SPLIT_LIMITPANESIZE% = %10, SPLIT_CANFLIP% = %100, SPLIT_CANORIENTATE% = %1000, SPLIT_CLICKTOTOGGLE% = %100000, SPLIT_ALL% = -1
  124.  
  125. Rem
  126. bbdoc: Sets the behavior of a splitter.
  127. about: Any combination of the following are available:
  128.  
  129. [ @{Behavior Flag} | @Description
  130. * 0 | The splitter does none of the actions listed below.
  131. * SPLIT_RESIZABLE | The splitter can be resized by dragging.
  132. * SPLIT_LIMITPANESIZE | The splitter side-pane is not allowed to take up more than half the splitted dimensions.
  133. * SPLIT_CANFLIP | The splitter can switch between opposite edges by dragging to the edge.
  134. * SPLIT_CANORIENTATE | The splitter can switch between vertical and horizontal modes by dragging to right/bottom edges.
  135. * SPLIT_CLICKTOTOGGLE | The splitter will hide/show when the drag-bar is clicked.
  136. * SPLIT_ALL | A shorthand flag for representing all of the above.
  137. ]
  138.  
  139. The default behavior of a splitter is SPLIT_ALL&~~SPLIT_LIMITPANESIZE (i.e. everything but SPLIT_LIMITPANESIZE).
  140.  
  141. See Also: #CreateSplitter, #SplitterPanel, #SplitterPosition, #SplitterBehavior, #SetSplitterOrientation and #SplitterOrientation.
  142. End Rem
  143. Function SetSplitterBehavior( splitter:TSplitter, flags%=SPLIT_ALL )
  144.         splitter.SetBehavior( flags )
  145. EndFunction
  146.  
  147. Rem
  148. bbdoc: Returns the value previously set using #SetSplitterBehavior.
  149. returns: An integer composed of a combination of bitwise flags that describe the behavior of the splitter.
  150. about: See #SetSplitterBehavior for more information.
  151. End Rem
  152. Function SplitterBehavior:Int( splitter:TSplitter )
  153.         Return splitter.GetBehavior()
  154. EndFunction
  155.  
  156.  
  157. Type TSplitter Extends TProxyGadget
  158.        
  159.         Const JUMP% = 200
  160.        
  161.                                                                 '       SPLITPANEL_MAIN                                          SPLITPANEL_SIDEPANE                                       SPLITPANEL_HANDLE
  162.         Global intOrientationLocks%[][][] =     [[      [EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED],[EDGE_ALIGNED, EDGE_ALIGNED, EDGE_CENTERED, EDGE_ALIGNED],[EDGE_ALIGNED, EDGE_ALIGNED, EDGE_CENTERED, EDGE_ALIGNED]    ], ..   'SPLIT_HORIZONTAL
  163.                                                                  [      [EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED],[EDGE_CENTERED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED],[EDGE_CENTERED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED]    ], .. 'SPLIT_VERTICAL
  164.                                                                  [      [EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED],[EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_CENTERED],[EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_CENTERED]    ], ..   'SPLIT_HORIZONTAL|SPLIT_FLIPPED
  165.                                                                  [      [EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED],[EDGE_ALIGNED, EDGE_CENTERED, EDGE_ALIGNED, EDGE_ALIGNED],[EDGE_ALIGNED, EDGE_CENTERED, EDGE_ALIGNED, EDGE_ALIGNED]    ]]      'SPLIT_VERTICAL|SPLIT_FLIPPED
  166.        
  167.         Field strToggleTooltip$ = ""
  168.        
  169.         Field intOrientation%, intMinPanelSpace% = 0, intSavePanelSpace% = 220, intBehavior% = 0, intGutterSize%
  170.         Field intPanelSpace% = intMinPanelSpace, intMouseDown%[2], intHasMoved% = False, intShouldUpdate% = False
  171.        
  172.         Field pnlPanes:TGadget[]
  173.         Field pnlSplitHandle:TGadget, divSplitHandle1:TGadget, divSplitHandle2:TGadget
  174.         Field gadParent:TGadget
  175.        
  176.         Field pixHandle:TPixmap[] = [TPixmap(Null), TPixmap(Null)]
  177.        
  178.         Method Create:TSplitter( pX%, pY%, pW%, pH%, pParent:TGadget, pOrientation% = SPLIT_VERTICAL, pHandleSize% = 2 )
  179.                
  180.                 gadParent = CreatePanel(pX, pY, pW, pH, pParent);SetProxy( gadParent )
  181.                
  182.                 intGutterSize = 3'Max(pHandleSize, 4)
  183.                 DrawHandle();DrawPanes();ChangeOrientation(pOrientation)
  184.                
  185.                 SetBehavior(SPLIT_ALL&~SPLIT_LIMITPANESIZE)
  186.                
  187.                 AddHook EmitEventHook, eventHandler, Self, -1
  188.                
  189.                 Return Self
  190.                
  191.         EndMethod
  192.        
  193.         'Interface
  194.        
  195.         Method GetOrientation:Int()
  196.                 Return intOrientation
  197.         EndMethod
  198.        
  199.         Method SetOrientation(pOrientation%)
  200.                 ChangeOrientation(pOrientation)
  201.         EndMethod
  202.        
  203.         Method SetBehavior( pBehavior% )
  204.                 intBehavior = pBehavior
  205.                 If (intBehavior&SPLIT_CLICKTOTOGGLE) Then
  206.                         If strToggleTooltip Then SetGadgetToolTip(pnlSplitHandle,strToggleTooltip)
  207.                 Else
  208.                         If strToggleTooltip Then SetGadgetToolTip(pnlSplitHandle,"")
  209.                 EndIf
  210.         EndMethod
  211.        
  212.         Method GetBehavior%()
  213.                 Return intBehavior
  214.         EndMethod
  215.        
  216.         Method GetPanel:TGadget(pPane%)
  217.                 Return pnlPanes[pPane]
  218.         EndMethod
  219.        
  220.         Method GetPanelSpace%(pPane%)
  221.                         Select pPane
  222.                                 Case SPLITPANEL_SIDEPANE
  223.                                         Return intPanelSpace
  224.                                 Case SPLITPANEL_MAIN
  225.                                         If intOrientation&SPLIT_VERTICAL Then
  226.                                                 Return (ClientWidth()-intPanelSpace-intGutterSize)
  227.                                         Else
  228.                                                 Return (ClientHeight()-intPanelSpace-intGutterSize)
  229.                                         EndIf
  230.                         EndSelect
  231.         EndMethod
  232.        
  233.         Method SetPanelSpace( pPanelSpace%, flgSave% = True )
  234.                
  235.                 Local tmpOldPanelSpace% = intPanelSpace
  236.                
  237.                 If (intBehavior & SPLIT_LIMITPANESIZE) Then
  238.                         pPanelSpace = Min(pPanelSpace, [ClientHeight(), ClientWidth()][intOrientation&SPLIT_VERTICAL] Shr 1)
  239.                 EndIf
  240.                
  241.                 pPanelSpace = Max(pPanelSpace, intMinPanelSpace)
  242.                
  243.                 intPanelSpace = pPanelSpace
  244.                 If GetPanelSpace(SPLITPANEL_MAIN) < intMinPanelSpace Then intPanelSpace = tmpOldPanelSpace
  245.                
  246.                 If flgSave And intPanelSpace > Min(intGutterSize,intMinPanelSpace) Then intSavePanelSpace = intPanelSpace
  247.                
  248.                 DrawHandle();DrawPanes()
  249.                
  250.         EndMethod
  251.        
  252.         'Proxy Gadget Methods
  253.        
  254.         Method CleanUp()
  255.                 RemoveHook EmitEventHook, eventHandler, Self
  256.                 gadParent = Null
  257.                 Super.CleanUp()
  258.         EndMethod
  259.        
  260.         Method SetTooltip%( pTooltip$ )
  261.                 strToggleTooltip = ""
  262.                 divSplitHandle1.SetTooltip( pTooltip )
  263.                 divSplitHandle2.SetTooltip( pTooltip )
  264.                 Return pnlSplitHandle.SetTooltip( pTooltip )
  265.         EndMethod
  266.        
  267.         Method GetTooltip$()
  268.                 Return pnlSplitHandle.GetTooltip()
  269.         EndMethod
  270.        
  271.         Method SetTextColor%( pRed%, pGreen%, pBlue%)
  272.                 pixHandle[0] = MakeColourHandlePixmap( pRed, pGreen, pBlue, intGutterSize )
  273.                 If intOrientation & SPLIT_VERTICAL Then pixHandle[0] = RotatePixmap(pixHandle[0])
  274.                 pixHandle[1] = BrightenPixmap(pixHandle[0])
  275.                 HideGadget(divSplitHandle1);HideGadget(divSplitHandle2)
  276.                 'SetPanelPixmap(pnlSplitHandle, pixHandle[0])
  277.         EndMethod
  278.        
  279.         Method SetColor%( pRed%, pGreen%, pBlue%)
  280.                 Return SetGadgetColor( pnlSplitHandle, pRed, pGreen, pBlue, True )
  281.         EndMethod
  282.        
  283.         Method SetSensitivity%(pSensitivity%)
  284.                 Return 0
  285.         EndMethod
  286.        
  287.         Method GetSensitivity%()
  288.                 Return 0
  289.         EndMethod
  290.        
  291.         'Internal Methods
  292.        
  293.         Method ReapplyLocks()
  294.                 Local tmpLocks%[][] = intOrientationLocks[intOrientation]
  295.                 If pnlPanes And pnlPanes.length > 1 Then
  296.                         SetGadgetLayout( pnlPanes[SPLITPANEL_MAIN], tmpLocks[SPLITPANEL_MAIN][0], tmpLocks[SPLITPANEL_MAIN][1], tmpLocks[SPLITPANEL_MAIN][2], tmpLocks[SPLITPANEL_MAIN][3] )
  297.                         SetGadgetLayout( pnlPanes[SPLITPANEL_SIDEPANE], tmpLocks[SPLITPANEL_SIDEPANE][0], tmpLocks[SPLITPANEL_SIDEPANE][1], tmpLocks[SPLITPANEL_SIDEPANE][2], tmpLocks[SPLITPANEL_SIDEPANE][3] )
  298.                 EndIf
  299.                 If pnlSplitHandle Then SetGadgetLayout( pnlSplitHandle, tmpLocks[SPLITPANEL_HANDLE][0], tmpLocks[SPLITPANEL_HANDLE][1], tmpLocks[SPLITPANEL_HANDLE][2], tmpLocks[SPLITPANEL_HANDLE][3] )
  300.         EndMethod
  301.        
  302.         Const SPLITSIDE_LEFT% = 0, SPLITSIDE_RIGHT% = 1, SPLITSIDE_TOP% = 0, SPLITSIDE_BOTTOM% = 1
  303.         Global intSideToPanelMapping%[][] =     [[      SPLITPANEL_MAIN, SPLITPANEL_SIDEPANE    ], ..   'SPLIT_HORIZONTAL
  304.                                                                  [      SPLITPANEL_MAIN, SPLITPANEL_SIDEPANE    ], .. 'SPLIT_VERTICAL
  305.                                                                  [      SPLITPANEL_SIDEPANE, SPLITPANEL_MAIN    ], ..   'SPLIT_HORIZONTAL|SPLIT_FLIPPED
  306.                                                                  [      SPLITPANEL_SIDEPANE, SPLITPANEL_MAIN    ]]      'SPLIT_VERTICAL|SPLIT_FLIPPED
  307.        
  308.         Method GetSideSpace%( pSide% )
  309.                 Return GetPanelSpace(intSideToPanelMapping[intOrientation][pSide])
  310.         EndMethod
  311.        
  312.         Method DrawHandle()
  313.        
  314.                 Local tmpDimensions%[]  '0: X, 1: Y, 2: W, 3: H
  315.                
  316.                 Select intOrientation&SPLIT_VERTICAL
  317.                
  318.                         Case SPLIT_HORIZONTAL;tmpDimensions = [0, GetSideSpace(SPLITSIDE_TOP), ClientWidth(), intGutterSize]
  319.                         Case SPLIT_VERTICAL;tmpDimensions = [GetSideSpace(SPLITSIDE_LEFT), 0, intGutterSize, ClientHeight()]
  320.                        
  321.                 EndSelect
  322.                
  323.                 If pnlSplitHandle Then
  324.                         SetGadgetShape(pnlSplitHandle, tmpDimensions[0], tmpDimensions[1], tmpDimensions[2], tmpDimensions[3])
  325.                         Select intOrientation&SPLIT_VERTICAL
  326.                                 Case SPLIT_HORIZONTAL
  327.                                         SetGadgetShape( divSplitHandle1,0,Ceil(tmpDimensions[3]/2.0)-2,tmpDimensions[2],2 )
  328.                                         SetGadgetShape( divSplitHandle2,0,Ceil(tmpDimensions[3]/2.0),tmpDimensions[2],2 )
  329.                                 Case SPLIT_VERTICAL
  330.                                         SetGadgetShape( divSplitHandle1,Ceil(tmpDimensions[2]/2.0)-2,0,2,tmpDimensions[3] )
  331.                                         SetGadgetShape( divSplitHandle2,Ceil(tmpDimensions[2]/2.0),0,2,tmpDimensions[3] )
  332.                         EndSelect
  333.                         If pixHandle[0] Then
  334.                                 HideGadget(divSplitHandle1)
  335.                                 HideGadget(divSplitHandle2)
  336.                         Else
  337.                                 ShowGadget(divSplitHandle1)
  338.                                 ShowGadget(divSplitHandle2)
  339.                         EndIf
  340.                 Else
  341.                         pnlSplitHandle = CreatePanel(tmpDimensions[0], tmpDimensions[1], tmpDimensions[2], tmpDimensions[3], gadParent, PANEL_ACTIVE)
  342.                        
  343.                         'SetPanelPixmap( pnlSplitHandle, pixHandle[0]);SetGadgetToolTip(pnlSplitHandle,strToggleTooltip)
  344.                        
  345.                         Select intOrientation&SPLIT_VERTICAL
  346.                                 Case SPLIT_HORIZONTAL
  347.                                         divSplitHandle1 = CreateLabel("",0,Ceil(tmpDimensions[3]/2.0)-2,tmpDimensions[2],2,pnlSplitHandle)',LABEL_SEPARATOR)
  348.                                         divSplitHandle2 = CreateLabel("",0,Ceil(tmpDimensions[3]/2.0),tmpDimensions[2],2,pnlSplitHandle)',LABEL_SEPARATOR)
  349.                                 Case SPLIT_VERTICAL
  350.                                         divSplitHandle1 = CreateLabel("",Ceil(tmpDimensions[2]/2.0)-2,0,2,tmpDimensions[3],pnlSplitHandle)',LABEL_SEPARATOR)
  351.                                         divSplitHandle2 = CreateLabel("",Ceil(tmpDimensions[2]/2.0),0,2,tmpDimensions[3],pnlSplitHandle)',LABEL_SEPARATOR)
  352.                         EndSelect
  353.                         SetGadgetSensitivity(divSplitHandle1,SENSITIZE_MOUSE);SetGadgetSensitivity(divSplitHandle2,SENSITIZE_MOUSE)
  354.                        
  355.                         ?Win32
  356.                         DisableGadget( divSplitHandle1 );DisableGadget( divSplitHandle2 )
  357.                         ?
  358.                        
  359.                         SetGadgetToolTip( divSplitHandle1, strToggleTooltip );SetGadgetToolTip( divSplitHandle2, strToggleTooltip )
  360.                         SetGadgetLayout( divSplitHandle1, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED )
  361.                         SetGadgetLayout( divSplitHandle2, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED )
  362.                         If pixHandle[0] Then HideGadget(divSplitHandle1);HideGadget(divSplitHandle2)
  363.                        
  364.                 EndIf
  365.        
  366.         EndMethod
  367.        
  368.         Method DrawPanes()
  369.        
  370.                 Local tmpDimensions%[][]        '0: X, 1: Y, 2: W, 3: H
  371.                
  372.                 Select intOrientation&SPLIT_VERTICAL
  373.                         Case SPLIT_HORIZONTAL
  374.                                 tmpDimensions = [[0, 0, ClientWidth(), GetSideSpace(SPLITSIDE_TOP)], [0, GetSideSpace(SPLITSIDE_TOP)+intGutterSize, ClientWidth(), GetSideSpace(SPLITSIDE_BOTTOM)]]
  375.                         Case SPLIT_VERTICAL
  376.                                 tmpDimensions = [[0,0,GetSideSpace(SPLITSIDE_LEFT),ClientHeight()], [GetSideSpace(SPLITSIDE_LEFT)+intGutterSize,0,GetSideSpace(SPLITSIDE_RIGHT),ClientHeight()]]
  377.                 EndSelect
  378.                
  379.                 If intOrientation & SPLIT_FLIPPED Then tmpDimensions = [tmpDimensions[1],tmpDimensions[0]]
  380.                
  381.                 If pnlPanes.length <> 2 Then
  382.                         pnlPanes = [CreatePanel(0,0,1,1,gadParent,0), CreatePanel(0,0,1,1,gadParent,0)]
  383.                         ReapplyLocks()
  384.                 EndIf
  385.                
  386.                 SetGadgetShape(pnlPanes[SPLITPANEL_MAIN], tmpDimensions[SPLITPANEL_MAIN][0], tmpDimensions[SPLITPANEL_MAIN][1], tmpDimensions[SPLITPANEL_MAIN][2], tmpDimensions[SPLITPANEL_MAIN][3])
  387.                 SetGadgetShape(pnlPanes[SPLITPANEL_SIDEPANE], tmpDimensions[SPLITPANEL_SIDEPANE][0], tmpDimensions[SPLITPANEL_SIDEPANE][1], tmpDimensions[SPLITPANEL_SIDEPANE][2], tmpDimensions[SPLITPANEL_SIDEPANE][3])
  388.        
  389.         EndMethod
  390.        
  391.         Method ChangeOrientation(pOrientation% = -1)
  392.                 If pOrientation = intOrientation Then Return
  393.                 If pOrientation < 0 Then
  394.                         intOrientation:~SPLIT_FLIPPED
  395.                 Else
  396.                         If pixHandle[0] And intOrientation&SPLIT_VERTICAL <> pOrientation&SPLIT_VERTICAL Then
  397.                                 pixHandle[0] = RotatePixmap(pixHandle[0]);pixHandle[1] = RotatePixmap(pixHandle[1])
  398.                         EndIf
  399.                         intOrientation = pOrientation
  400.                 EndIf
  401.                 'SetPanelPixmap(pnlSplitHandle, pixHandle[0])
  402.                 DrawHandle();DrawPanes();ReapplyLocks();RedrawGadget(gadParent)
  403.         EndMethod
  404.        
  405.         Method Toggle()
  406.                 If intPanelSpace > intMinPanelSpace Then SetPanelSpace( intMinPanelSpace ) Else SetPanelSpace( intSavePanelSpace )
  407.         EndMethod
  408.        
  409.         Method eventHook:Object( pID%, pData:Object )
  410.                
  411.                 Local tmpEvent:TEvent = TEvent(pData)
  412.                 If (Not tmpEvent) Or (Not TGadget(tmpEvent.source)) Then Return pData
  413.                
  414.                 Select tmpEvent.source
  415.                        
  416.                         Case pnlSplitHandle, divSplitHandle1, divSplitHandle2
  417.                                
  418.                                 If (tmpEvent.source = divSplitHandle1) Or (tmpEvent.source = divSplitHandle2) Then
  419.                                         tmpEvent.x:+GadgetX(TGadget(tmpEvent.source))
  420.                                         tmpEvent.y:+GadgetY(TGadget(tmpEvent.source))
  421.                                         tmpEvent.source = pnlSplitHandle
  422.                                 EndIf
  423.                                
  424.                                 Select tmpEvent.id
  425.                                        
  426.                                         Case EVENT_MOUSEDOWN
  427.                                                
  428.                                                 If (tmpEvent.data <> MOUSE_LEFT) Then Return Null
  429.                                                 intMouseDown = [tmpEvent.x, tmpEvent.y]
  430.                                                 intHasMoved = False
  431.                                                
  432.                                         Case EVENT_MOUSEMOVE
  433.                                                
  434.                                                 intHasMoved = True
  435.                                                
  436.                                                
  437.                                                
  438.                                                 If tmpEvent.data Then
  439.                                                        
  440.                                                         If intMouseDown Or (tmpEvent.data = MOUSE_LEFT And intShouldUpdate) Then
  441.                                                                
  442.                                                                 EmitEvent CreateEvent(EVENT_WINDOWSIZE,GadgetWindow(Self))
  443.                                                                
  444.                                                                 'Update our mouse pointer and re-set our drag-point (if needed).
  445.                                                                 ShowDragPointer()
  446.                                                                 If intShouldUpdate Or Not intMouseDown Then
  447.                                                                         intMouseDown = [tmpEvent.x,tmpEvent.y]
  448.                                                                         intShouldUpdate = False
  449.                                                                 EndIf
  450.                                                                
  451.                                                                 'New values that are updated once everything has been checked
  452.                                                                 Local tmpOrientation% = GetOrientation(), tmpPanelSpace% = -1, tmpPanelSave% = False
  453.                                                                
  454.                                                                 'New size of panel if resized with mouse cursor
  455.                                                                 Local tmpDraggedSpace% = -[tmpEvent.y-intMouseDown[1],tmpEvent.x-intMouseDown[0]][intOrientation&SPLIT_VERTICAL]
  456.                                                                 If tmpOrientation&SPLIT_FLIPPED Then tmpDraggedSpace:*-1
  457.                                                                 tmpDraggedSpace:+intPanelSpace
  458.                                                                
  459.                                                                 'Update intPanelSpace if we can drag as any calls to GetPanelSpace() need to return an accurate value
  460.                                                                 If (intBehavior&SPLIT_RESIZABLE) And tmpDraggedSpace <> intPanelSpace Then
  461.                                                                        
  462.                                                                         'Simulate a snap-closed action for the splitter
  463.                                                                         If tmpDraggedSpace < intGutterSize Then tmpDraggedSpace = intMinPanelSpace
  464.                                                                        
  465.                                                                         tmpPanelSpace = tmpDraggedSpace
  466.                                                                         intPanelSpace = tmpDraggedSpace
  467.                                                                 EndIf
  468.                                                                
  469.                                                                 'Limit the pane-size to half the client-area if SPLIT_LIMITPANESIZE is set.
  470.                                                                 If (intBehavior&SPLIT_LIMITPANESIZE) Then
  471.                                                                         Local tmpDimensions%[] = [ClientHeight(),ClientWidth()]
  472.                                                                         If GetPanelSpace(SPLITPANEL_SIDEPANE) > (tmpDimensions[(tmpOrientation&SPLIT_VERTICAL)])/2 Then
  473.                                                                                 If (intBehavior&SPLIT_CANFLIP) Then
  474.                                                                                         tmpOrientation:~SPLIT_FLIPPED
  475.                                                                                         tmpPanelSpace = GetPanelSpace(SPLITPANEL_MAIN)
  476.                                                                                 Else
  477.                                                                                         tmpPanelSpace = (tmpDimensions[(tmpOrientation&SPLIT_VERTICAL)])/2
  478.                                                                                 EndIf
  479.                                                                                 tmpPanelSave = True
  480.                                                                         EndIf
  481.                                                                 EndIf
  482.                                                                
  483.                                                                 'Update the splitter's orientation if needed.
  484.                                                                 If (intBehavior&(SPLIT_CANORIENTATE|SPLIT_CANFLIP)) Then
  485.                                                                        
  486.                                                                         'Drag test conditions
  487.                                                                         Local tmpLeftCond% = (GadgetX(pnlSplitHandle)+tmpEvent.x < 1)
  488.                                                                         Local tmpRightCond% = (GadgetX(pnlSplitHandle)+tmpEvent.x > ClientWidth()-intGutterSize)
  489.                                                                         Local tmpTopCond% = (GadgetY(pnlSplitHandle)+tmpEvent.y < 1)
  490.                                                                         Local tmpBottomCond% = (GadgetY(pnlSplitHandle)+tmpEvent.y > ClientHeight()-intGutterSize)
  491.                                                                        
  492.                                                                         Select True
  493.                                                                                 Case (tmpRightCond And Not (tmpTopCond|tmpBottomCond)), (tmpLeftCond And Not (tmpTopCond|tmpBottomCond)), ..
  494.                                                                                      (tmpBottomCond And Not (tmpLeftCond|tmpRightCond)), (tmpTopCond And Not (tmpLeftCond|tmpRightCond))
  495.                                                                                         If (intBehavior&SPLIT_CANFLIP) Or ((tmpLeftCond|tmpTopCond)=(tmpOrientation&SPLIT_FLIPPED)) Then
  496.                                                                                                 If (intBehavior&SPLIT_CANORIENTATE) Then
  497.                                                                                                         If (tmpLeftCond|tmpRightCond) Then tmpOrientation:|SPLIT_VERTICAL Else tmpOrientation:&~SPLIT_VERTICAL
  498.                                                                                                 Else
  499.                                                                                                         Select (tmpOrientation&SPLIT_VERTICAL)
  500.                                                                                                                 Case SPLIT_VERTICAL;tmpTopCond = 0;tmpBottomCond = 0
  501.                                                                                                                 Case SPLIT_HORIZONTAL;tmpLeftCond = 0;tmpRightCond = 0
  502.                                                                                                         EndSelect
  503.                                                                                                 EndIf
  504.                                                                                                 'Let's determine whether our side-panel should be flipped or not.
  505.                                                                                                 If (tmpLeftCond|tmpTopCond) Then tmpOrientation:|SPLIT_FLIPPED ElseIf (tmpRightCond|tmpBottomCond) Then tmpOrientation:&~SPLIT_FLIPPED
  506.                                                                                                 'If we are resizable and the orientation has changed, let's reset the side-pane size.
  507.                                                                                                 If (intBehavior&SPLIT_RESIZABLE) And (tmpOrientation <> intOrientation) Then tmpPanelSpace = intMinPanelSpace;tmpPanelSave = True
  508.                                                                                         EndIf
  509.                                                                         EndSelect
  510.                                                                        
  511.                                                                 EndIf
  512.                                                                
  513.                                                                 'Apply our newly calculated values to the splitter.
  514.                                                                 If (tmpOrientation <> GetOrientation()) Then
  515.                                                                         If (tmpOrientation&SPLIT_VERTICAL <> GetOrientation()&SPLIT_VERTICAL) Then
  516.                                                                                 intMouseDown = Null
  517.                                                                                 intShouldUpdate = True
  518.                                                                         EndIf
  519.                                                                         ChangeOrientation( tmpOrientation )
  520.                                                                         ShowActivePointer()
  521.                                                                 EndIf
  522.                                                                
  523.                                                                 If tmpPanelSpace > -1 Then SetPanelSpace( tmpPanelSpace, tmpPanelSave )
  524.                                                                
  525.                                                         EndIf
  526.                                                        
  527.                                                 Else
  528.                                                        
  529.                                                         intMouseDown = Null
  530.                                                        
  531.                                                 EndIf
  532.                                                
  533.                                         Case EVENT_MOUSEUP
  534.                                                
  535.                                                 If (intMouseDown And tmpEvent.data = MOUSE_LEFT) Then
  536.                                                
  537.                                                         If Not intHasMoved Then
  538.                                                                 If (intBehavior&SPLIT_CLICKTOTOGGLE) Then Toggle()
  539.                                                         Else
  540.                                                                 SetPanelSpace( intPanelSpace, True )
  541.                                                         EndIf
  542.                                                        
  543.                                                         intMouseDown = Null
  544.                                                        
  545.                                                         ShowNormalPointer()
  546.                                                        
  547.                                                 EndIf
  548.                                                
  549.                                         Case EVENT_MOUSELEAVE
  550.                                                
  551.                                                 If (intBehavior&(SPLIT_RESIZABLE|SPLIT_CLICKTOTOGGLE)) Then
  552.                                                         'SetPanelPixmap(pnlSplitHandle, pixHandle[0])
  553.                                                 EndIf
  554.                                                
  555.                                                 ShowNormalPointer()
  556.                                                
  557.                                         Case EVENT_MOUSEENTER
  558.                                                
  559.                                                 If (intBehavior&(SPLIT_RESIZABLE|SPLIT_CLICKTOTOGGLE)) Then
  560.                                                         'SetPanelPixmap(pnlSplitHandle, pixHandle[1])
  561.                                                 EndIf
  562.                                                
  563.                                                 ShowActivePointer()
  564.                                
  565.                                 EndSelect
  566.                                
  567.                         Case pnlPanes[SPLITPANEL_MAIN], pnlPanes[SPLITPANEL_SIDEPANE], gadParent
  568.                                
  569.                                 'Don't show these events to the other hooks!
  570.                                
  571.                         Default
  572.                        
  573.                                 Select tmpEvent.id
  574.                                         Case EVENT_WINDOWSIZE
  575.                                                 If (intBehavior&SPLIT_RESIZABLE) And TGadget(tmpEvent.source).HasDescendant(gadParent) Then
  576.                                                         Local tmpLimit% = [ClientHeight(),ClientWidth()][intOrientation&SPLIT_VERTICAL]
  577.                                                         If (intBehavior&SPLIT_LIMITPANESIZE) Then tmpLimit:Shr 1 Else tmpLimit:-intGutterSize
  578.                                                         If GetPanelSpace(SPLITPANEL_SIDEPANE) > tmpLimit Then SetPanelSpace( tmpLimit, True )
  579.                                                 EndIf
  580.                                 EndSelect
  581.                                
  582.                                 Return pData
  583.                 EndSelect
  584.        
  585.         EndMethod      
  586.        
  587.         'Mouse Cursor
  588.         Function ShowNormalPointer()
  589.                 SetPointer(POINTER_DEFAULT)
  590.         EndFunction
  591.        
  592.         Method ShowActivePointer()
  593.                 If (intBehavior&SPLIT_RESIZABLE) Then
  594.                         Select intOrientation&SPLIT_VERTICAL
  595.                                 Case SPLIT_HORIZONTAL;SetPointer(POINTER_SIZENS)
  596.                                 Case SPLIT_VERTICAL;SetPointer(POINTER_SIZEWE)
  597.                         EndSelect
  598.                 ElseIf (intBehavior&SPLIT_CLICKTOTOGGLE) Then
  599.                         SetPointer(POINTER_HAND)
  600.                 Else
  601.                         SetPointer(POINTER_DEFAULT)
  602.                 EndIf
  603.         EndMethod
  604.        
  605.         Method ShowDragPointer()
  606.                 If (intBehavior&SPLIT_RESIZABLE) Then
  607.                         Select intOrientation&SPLIT_VERTICAL
  608.                                 Case SPLIT_HORIZONTAL;SetPointer(POINTER_SIZENS)
  609.                                 Case SPLIT_VERTICAL;SetPointer(POINTER_SIZEWE)
  610.                         EndSelect
  611.                 ElseIf (intBehavior&(SPLIT_CANFLIP|SPLIT_CANORIENTATE))
  612.                         SetPointer(POINTER_SIZEALL)
  613.                 Else
  614.                         SetPointer(POINTER_DEFAULT)
  615.                 EndIf
  616.         EndMethod
  617.        
  618.         'Helper Functions
  619.        
  620.         Function eventHandler:Object( pID%, pData:Object, pContext:Object)
  621.                 If TSplitter(pContext) Then Return TSplitter(pContext).eventHook( pID, pData ) Else Return pData
  622.         EndFunction
  623.        
  624.         Function RotatePixmap:TPixmap( pSrcPixmap:TPixmap )
  625.                 Local tmpDestPixmap:TPixmap = CreatePixmap(pSrcPixmap.height, pSrcPixmap.width, pSrcPixmap.format)
  626.                 For Local y% = 0 Until pSrcPixmap.height
  627.                         For Local x% = 0 Until pSrcPixmap.width
  628.                                 WritePixel( tmpDestPixmap, y, x, ReadPixel(pSrcPixmap, x, y) )
  629.                         Next
  630.                 Next
  631.                 Return tmpDestPixmap
  632.         EndFunction
  633.        
  634.         Function BrightenPixmap:TPixmap( pSrcPixmap:TPixmap, pBrightness# = 1.05 )
  635.                 Local tmpDestPixmap:TPixmap = CreatePixmap(pSrcPixmap.width, pSrcPixmap.height, pSrcPixmap.format)
  636.                 For Local y% = 0 Until pSrcPixmap.height
  637.                         For Local x% = 0 Until pSrcPixmap.width
  638.                                 WritePixel( tmpDestPixmap, x, y, BrightenPixel(ReadPixel(pSrcPixmap, x, y), pBrightness) )
  639.                         Next
  640.                 Next
  641.                 Return tmpDestPixmap
  642.         EndFunction
  643.        
  644.         Function BrightenPixel%( pARGB%, pBrightness# = 1.05 )
  645.                 Local tmpHSV:TColorHSV = New TColorHSV.fromARGB(pARGB)
  646.                 tmpHSV.v=Min(tmpHSV.v*pBrightness,1)
  647.                 Return tmpHSV.toARGB()
  648.         EndFunction
  649.        
  650.         Function WhitenPixel%( pARGB%, pWhiteness# = 0.8 )
  651.                 Local tmpHSV:TColorHSV = New TColorHSV.fromARGB(pARGB)
  652.                 tmpHSV.s=Min(tmpHSV.s*pWhiteness,1)
  653.                 Return tmpHSV.toARGB() 
  654.         EndFunction
  655.        
  656.         Function MakeColourHandlePixmap:TPixmap( pRed%, pGreen%, pBlue%, pWidth% )
  657.                 Local tmpPixmap:TPixmap = CreatePixmap(1,pWidth,PF_RGB888)
  658.                 Local tmpPixel% = (pRed Shl 16)|(pGreen Shl 8)|pBlue
  659.                 For Local i% = 0 To pWidth/2
  660.                         Local tmpCalculatedPixel% = BrightenPixel(tmpPixel,1.05^i)
  661.                         WritePixel(tmpPixmap,0,i,tmpCalculatedPixel)
  662.                         WritePixel(tmpPixmap,0,pWidth-1-i,tmpCalculatedPixel)
  663.                 Next
  664.                 Return tmpPixmap
  665.         EndFunction
  666.        
  667. EndType
  668.  
  669. Private
  670.  
  671. 'Some type declarations from fredborg's pub.color module
  672. 'http://www.blitzbasic.com/codearcs/codearcs.php?code=1749
  673.  
  674. Type TColor
  675.         Method toARGB:Int() Abstract   
  676. End Type
  677.  
  678. Type TColorHSV Extends TColor
  679.        
  680.         Field h:Float,s:Float,v:Float,a:Float=1.0
  681.        
  682.         Method toRGB:TColorRGB()
  683.  
  684.                 Local temph:Float = Self.h
  685.                 Local temps:Float = Self.s
  686.                 Local tempv:Float = Self.v
  687.        
  688.                 Local rgb:TColorRGB = New TColorRGB
  689.        
  690.                 If temph=>360.0 Or temph<0.0 Then temph = 0.0
  691.        
  692.                 If temps = 0 Then
  693.                         rgb.r = v
  694.                         rgb.g = v
  695.                         rgb.b = v
  696.                 Else
  697.                         temph = temph / 60.0
  698.                        
  699.                         Local i:Int   = Floor(temph)
  700.                         Local f:Float = temph - i
  701.                         Local p:Float = tempv * (1 - temps)
  702.                         Local q:Float = tempv * (1 - temps * f)
  703.                         Local t:Float = tempv * (1 - temps * (1 - f))
  704.  
  705.                         Select i
  706.                                 Case 0
  707.                                         rgb.r = v
  708.                                         rgb.g = t
  709.                                         rgb.b = p
  710.                                 Case 1
  711.                                         rgb.r = q
  712.                                         rgb.g = v
  713.                                         rgb.b = p
  714.                                 Case 2
  715.                                         rgb.r = p
  716.                                         rgb.g = v
  717.                                         rgb.b = t
  718.                                 Case 3
  719.                                         rgb.r = p
  720.                                         rgb.g = q
  721.                                         rgb.b = v
  722.                                 Case 4
  723.                                         rgb.r = t
  724.                                         rgb.g = p
  725.                                         rgb.b = v
  726.                                 Default
  727.                                         rgb.r = v
  728.                                         rgb.g = p
  729.                                         rgb.b = q
  730.                         End Select             
  731.                 EndIf
  732.  
  733.                 rgb.a = a
  734.  
  735.                 Return rgb
  736.        
  737.         EndMethod
  738.        
  739.         Function fromARGB:TColorHSV(argb:Int)
  740.                 Return TColorRGB.fromARGB(argb).toHSV()
  741.         EndFunction
  742.        
  743.         Method toARGB:Int()
  744.                 Return Self.toRGB().toARGB()
  745.         EndMethod
  746.        
  747. EndType
  748.  
  749. Type TColorRGB Extends TColor
  750.  
  751.         Field r:Float,g:Float,b:Float,a:Float=1.0
  752.        
  753.         Method toHSV:TColorHSV()
  754.                
  755.                 Local tempr:Float = Min(1.0,Max(0.0,Self.r))
  756.                 Local tempg:Float = Min(1.0,Max(0.0,Self.g))
  757.                 Local tempb:Float = Min(1.0,Max(0.0,Self.b))
  758.  
  759.                 Local minVal:Float = Min(Min(tempr,tempg),tempb)
  760.                 Local maxVal:Float = Max(Max(tempr,tempg),tempb)
  761.                
  762.                 Local diff:Float = maxVal - minVal
  763.        
  764.                 Local hsv:TColorHSV = New TColorHSV
  765.                 hsv.v = maxVal
  766.        
  767.                 If maxVal = 0.0 Then
  768.                         hsv.s = 0.0
  769.                         hsv.h = 0.0
  770.                 Else
  771.                         hsv.s = diff / maxVal
  772.        
  773.                         If tempr = maxVal
  774.                                 hsv.h = (tempg - tempb) / diff
  775.                         ElseIf tempg = maxVal
  776.                                 hsv.h = 2.0 + (tempb - tempr) / diff
  777.                         Else
  778.                                 hsv.h = 4.0 + (tempr - tempg) / diff
  779.                         EndIf
  780.        
  781.                         hsv.h = hsv.h * 60.0
  782.                         If hsv.h < 0 Then hsv.h = hsv.h + 360.0
  783.                 EndIf
  784.  
  785.                 If hsv.h<  0.0 Then hsv.h = 0.0
  786.                 If hsv.h>360.0 Then hsv.h = 0.0
  787.                
  788.                 hsv.a = a
  789.                
  790.                 Return hsv
  791.                
  792.         EndMethod
  793.  
  794.         Function fromARGB:TColorRGB(argb:Int,alpha:Int=True)
  795.        
  796.                 Local rgb:TColorRGB = New TColorRGB
  797.        
  798.                 If alpha       
  799.                         rgb.a = ((argb Shr 24) & $FF)/255.0
  800.                 EndIf
  801.                
  802.                 rgb.r = ((argb Shr 16) & $FF)/255.0
  803.                 rgb.g = ((argb Shr 8) & $FF)/255.0
  804.                 rgb.b = (argb & $FF)/255.0
  805.        
  806.                 Return rgb
  807.                
  808.         EndFunction
  809.  
  810.         Function fromBGR:TColorRGB(argb:Int)
  811.        
  812.                 Local rgb:TColorRGB = New TColorRGB
  813.        
  814.                 rgb.r = (argb & $000000FF)/255.0
  815.                 rgb.g = ((argb Shr 8) & $000000FF)/255.0
  816.                 rgb.b = ((argb Shr 16) & $000000FF)/255.0
  817.        
  818.                 Return rgb
  819.                
  820.         EndFunction
  821.  
  822.         Method toARGB:Int()
  823.                
  824.                 Local tempr:Int = Min(255,Max(0,Int(Self.r*255)))
  825.                 Local tempg:Int = Min(255,Max(0,Int(Self.g*255)))
  826.                 Local tempb:Int = Min(255,Max(0,Int(Self.b*255)))
  827.                 Local tempa:Int = Min(255,Max(0,Int(Self.a*255)))
  828.                                                
  829.                 Return (tempa Shl 24) | (tempr Shl 16) | (tempg Shl 8) | tempb
  830.  
  831.         EndMethod
  832.        
  833. EndType


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal