scrollbar.monkey2 4.3 KB

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