scrollbar.monkey2 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. Namespace mojox
  2. #rem monkeydoc The ScrollBar class.
  3. #end
  4. Class ScrollBar Extends View
  5. #rem monkeydoc Invoked when the user drags the scroll knob.
  6. #end
  7. Field ValueChanged:Void( value:Int )
  8. #rem monkeydoc Creates a new scroll bar.
  9. #end
  10. Method New( axis:Axis=std.geom.Axis.X )
  11. _axis=axis
  12. Local taxis:=_axis=Axis.X ? "x" Else "y"
  13. Style=GetStyle( "ScrollBar" )
  14. _knobStyle=GetStyle( "ScrollKnob" )
  15. ' Style=GetStyle( "ScrollBar:"+taxis )
  16. ' _knobStyle=GetStyle( "ScrollKnob:"+taxis )
  17. End
  18. #rem monkeydoc The scroll bar axis.
  19. #end
  20. Property Axis:Axis()
  21. Return _axis
  22. Setter( axis:Axis )
  23. If axis=_axis Return
  24. _axis=axis
  25. App.RequestRender()
  26. End
  27. #rem monkeydoc The scroll bar page size.
  28. #end
  29. Property PageSize:Int()
  30. Return _pageSize
  31. Setter( pageSize:Int )
  32. If pageSize=_pageSize Return
  33. _pageSize=pageSize
  34. App.RequestRender()
  35. End
  36. #rem monkeydoc The scroll bar value.
  37. #end
  38. Property Value:Int()
  39. Return _value
  40. Setter( value:Int )
  41. value=Clamp( value,_minimum,_maximum )
  42. If value=_value Return
  43. _value=value
  44. App.RequestRender()
  45. End
  46. #rem monkeydoc The scroll bar minimum value.
  47. #end
  48. Property Minimum:Int()
  49. Return _minimum
  50. Setter( minimum:Int )
  51. If minimum=_minimum Return
  52. _minimum=minimum
  53. _value=Max( _value,_minimum )
  54. App.RequestRender()
  55. End
  56. #rem monkeydoc The scroll bar maximum value.
  57. #end
  58. Property Maximum:Int()
  59. Return _maximum
  60. Setter( maximum:Int )
  61. If maximum=_maximum Return
  62. _maximum=maximum
  63. _value=Min( _value,_maximum )
  64. App.RequestRender()
  65. End
  66. Protected
  67. Field _axis:Axis
  68. Field _value:Int
  69. Field _minimum:Int
  70. Field _maximum:Int
  71. Field _pageSize:Int=1
  72. Field _knobStyle:Style
  73. Field _knobRect:Recti
  74. Field _drag:Bool
  75. Field _hover:Bool
  76. Field _offset:Int
  77. Method OnMeasure:Vec2i() Override
  78. Return _knobStyle.Bounds.Size
  79. End
  80. Method OnLayout() Override
  81. Local range:=_maximum-_minimum+_pageSize
  82. Select _axis
  83. Case Axis.X
  84. Local sz:=range ? Max( _pageSize*Width/range,16 ) Else Width
  85. Local pos:=_maximum>_minimum ? (_value-_minimum)*(Width-sz)/(_maximum-_minimum) Else 0
  86. _knobRect=New Recti( pos,0,pos+sz,Height )
  87. ' Local min:=(_value-_minimum)*Width/range
  88. ' Local max:=(_value-_minimum+_pageSize)*Width/range
  89. ' _knobRect=New Recti( min,0,max,16 )
  90. Case Axis.Y
  91. Local sz:=range ? Max( _pageSize*Height/range,16 ) Else Height
  92. Local pos:=_maximum>_minimum ? (_value-_minimum)*(Height-sz)/(_maximum-_minimum) Else 0
  93. _knobRect=New Recti( 0,pos,Width,pos+sz )
  94. ' Local min:=(_value-_minimum)*Height/range
  95. ' Local max:=(_value-_minimum+_pageSize)*Height/range
  96. ' _knobRect=New Recti( 0,min,16,max )
  97. End
  98. End
  99. Method OnRender( canvas:Canvas ) Override
  100. If _maximum=_minimum Return
  101. Local style:=_knobStyle
  102. If _drag style=style.GetState( "active" ) Else If _hover style=style.GetState( "hover" )
  103. style.Render( canvas,_knobRect )
  104. End
  105. Method OnMouseEvent( event:MouseEvent ) Override
  106. Local p:=event.Location
  107. Local value:=_value
  108. Local drag:=_drag,hover:=_hover
  109. Local range:=_maximum-_minimum+_pageSize
  110. Select event.Type
  111. Case EventType.MouseDown
  112. If _knobRect.Contains( p )
  113. Select _axis
  114. Case Axis.X
  115. _offset=p.x*range/Rect.Width-_value
  116. Case Axis.Y
  117. _offset=p.y*range/Rect.Height-_value
  118. End
  119. _drag=True
  120. Else If _axis=Axis.X
  121. If p.x<_knobRect.Left
  122. _value-=_pageSize
  123. Else If p.x>=_knobRect.Right
  124. _value+=_pageSize
  125. Endif
  126. Else If _axis=Axis.Y
  127. If p.y<_knobRect.Top
  128. _value-=_pageSize
  129. Else If p.y>=_knobRect.Bottom
  130. _value+=_pageSize
  131. Endif
  132. Endif
  133. Case EventType.MouseMove
  134. If _drag
  135. Local range:=_maximum-_minimum+_pageSize
  136. Select _axis
  137. Case Axis.X
  138. _value=p.x*range/Rect.Width-_offset
  139. Case Axis.Y
  140. _value=p.y*range/Rect.Height-_offset
  141. End
  142. Else If _knobRect.Contains( p )
  143. _hover=True
  144. Else
  145. _hover=False
  146. Endif
  147. Case EventType.MouseLeave
  148. _hover=False
  149. Case EventType.MouseUp
  150. _drag=False
  151. End
  152. _value=Clamp( _value,_minimum,_maximum )
  153. If _value<>value Or _drag<>drag Or _hover<>hover
  154. If _value<>value ValueChanged( _value )
  155. App.RequestRender()
  156. Endif
  157. event.Eat()
  158. End
  159. End