scrollview.monkey2 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. Namespace mojox
  2. #rem monkeydoc @hidden
  3. #end
  4. Class ClipView Extends View
  5. Method New()
  6. AcceptsMouseEvents=False
  7. End
  8. Property ContentView:View()
  9. Return _content
  10. Setter( contentView:View )
  11. If _content RemoveChildView( _content )
  12. _content=contentView
  13. If _content AddChildView( _content )
  14. End
  15. Property ContentFrame:Recti()
  16. Return _contentFrame
  17. Setter( contentFrame:Recti )
  18. _contentFrame=contentFrame
  19. End
  20. Private
  21. Field _content:View
  22. Field _contentFrame:Recti
  23. Method OnMeasure:Vec2i() Override
  24. If _content Return _content.LayoutSize
  25. Return New Vec2i
  26. End
  27. Method OnLayout() Override
  28. If _content _content.Frame=_contentFrame
  29. End
  30. End
  31. #rem monkeydoc The ScrollView class
  32. #end
  33. Class ScrollView Extends DockingView
  34. #rem monkeydoc Creates a new scroll view.
  35. #end
  36. Method New()
  37. Style=GetStyle( "ScrollView" )
  38. _clipper=New ClipView
  39. _scrollx=New ScrollBar( Axis.X )
  40. _scrollx.ValueChanged=Lambda( value:Int )
  41. _scroll.x=value
  42. End
  43. AddChildView( _scrollx )
  44. _scrolly=New ScrollBar( Axis.Y )
  45. _scrolly.ValueChanged=Lambda( value:Int )
  46. _scroll.y=value
  47. End
  48. AddChildView( _scrolly )
  49. End
  50. Method New( contentView:View )
  51. Self.New()
  52. ContentView=contentView
  53. End
  54. #rem monkeydoc Whether scroll bars are visible.
  55. #end
  56. Property ScrollBarsVisible:Bool()
  57. Return _scrollBarsVisible
  58. Setter( scrollBarsVisible:Bool )
  59. If scrollBarsVisible=_scrollBarsVisible Return
  60. _scrollBarsVisible=scrollBarsVisible
  61. App.RequestRender()
  62. End
  63. #rem moneydoc Current scroll x/y.
  64. #end
  65. Property Scroll:Vec2i()
  66. Return _scroll
  67. Setter( scroll:Vec2i )
  68. If Not _content Or _clipper.Frame.Empty Return
  69. Local fsize:=_clipper.Frame.Size
  70. scroll.x=Min( scroll.x,_clipper.ContentFrame.Width-fsize.x )
  71. scroll.x=Max( scroll.x,0 )
  72. scroll.y=Min( scroll.y,_clipper.ContentFrame.Height-fsize.y )
  73. scroll.y=Max( scroll.y,0 )
  74. If scroll=_scroll Return
  75. _scroll=scroll
  76. App.RequestRender()
  77. End
  78. #rem monkeydoc Currently visible rect.
  79. #end
  80. Property VisibleRect:Recti()
  81. Local marg:=_content.RenderStyle.Bounds
  82. Local scroll:=_scroll+marg.Origin
  83. Return New Recti( scroll,scroll+_clipper.Frame.Size )
  84. End
  85. #rem monkeydoc Ensures a rect is visible, modifying [[Scroll]] if necessary.
  86. #end
  87. Method EnsureVisible( rect:Recti )
  88. If Not _content Or _clipper.Frame.Empty Return
  89. Local marg:=_content.RenderStyle.Bounds
  90. Local fsize:=_clipper.Frame.Size
  91. rect-=marg.Origin
  92. rect+=marg
  93. If rect.Right>_scroll.x+fsize.x
  94. _scroll.x=rect.Right-fsize.x
  95. App.RequestRender()
  96. Endif
  97. If rect.Left<_scroll.x
  98. _scroll.x=rect.Left
  99. App.RequestRender()
  100. Endif
  101. If rect.Bottom>_scroll.y+fsize.y
  102. _scroll.y=rect.Bottom-fsize.y
  103. App.RequestRender()
  104. Endif
  105. If rect.Top<_scroll.y
  106. _scroll.y=rect.Top
  107. App.RequestRender()
  108. Endif
  109. End
  110. Protected
  111. Method OnLayoutContent:Recti( contentSize:Vec2i ) Override
  112. If Not _content Return Rect
  113. Local rect:=Rect
  114. Local size:=Rect.Size
  115. Local csize:=contentSize
  116. Local vsize:=_content.Measure2( csize-New Vec2i( _scrolly.LayoutSize.x,0 ) )
  117. If _scrollBarsVisible
  118. Local xbar:=_scrollx.LayoutSize.y
  119. Local ybar:=_scrolly.LayoutSize.x
  120. If vsize.y<=csize.y
  121. If vsize.x<=csize.x xbar=0
  122. Else
  123. If vsize.x<=csize.x-ybar xbar=0
  124. Endif
  125. If vsize.y<=csize.y-xbar ybar=0
  126. csize.y-=xbar
  127. csize.x-=ybar
  128. If xbar
  129. rect.max.y-=xbar
  130. _scrollx.Visible=True
  131. _scrollx.Frame=New Recti( 0,size.y-xbar,size.x-ybar,size.y )
  132. _scrollx.PageSize=csize.x
  133. _scrollx.Maximum=vsize.x-csize.x
  134. _scrollx.Value=_scroll.x
  135. Else
  136. _scrollx.Visible=False
  137. _scrollx.Value=0
  138. vsize.x=csize.x
  139. Endif
  140. If ybar
  141. rect.max.x-=ybar
  142. _scrolly.Visible=True
  143. _scrolly.Frame=New Recti( size.x-ybar,0,size.x,size.y-xbar )
  144. _scrolly.PageSize=csize.y
  145. _scrolly.Maximum=vsize.y-csize.y
  146. _scrolly.Value=_scroll.y
  147. Else
  148. _scrolly.Visible=False
  149. _scrolly.Value=0
  150. vsize.y=csize.y
  151. Endif
  152. Else
  153. _scrollx.Visible=False
  154. _scrollx.PageSize=csize.x
  155. _scrollx.Maximum=vsize.x-csize.x
  156. _scrollx.Value=_scroll.x
  157. _scrolly.Visible=False
  158. _scrolly.PageSize=csize.y
  159. _scrolly.Maximum=vsize.y-csize.y
  160. _scrolly.Value=_scroll.y
  161. Endif
  162. _scroll.x=_scrollx.Value
  163. _scroll.y=_scrolly.Value
  164. _clipper.ContentFrame=New Recti( -_scroll,-_scroll+vsize )
  165. Return rect
  166. End
  167. Method OnMouseEvent( event:MouseEvent ) Override
  168. If Not _content Return
  169. Select event.Type
  170. Case EventType.MouseWheel
  171. Local scroll:=_scroll
  172. Local delta:=New Vec2i( 0,_content.RenderStyle.Font.Height*event.Wheel.Y )
  173. Scroll-=delta
  174. If scroll<>_scroll event.Eat()
  175. End
  176. End
  177. Method ContentViewContainer:View( contentView:View ) Override
  178. _content=contentView
  179. _clipper.ContentView=contentView
  180. Return _clipper
  181. End
  182. Private
  183. Field _content:View
  184. Field _scroll:Vec2i
  185. Field _clipper:ClipView
  186. Field _scrollx:ScrollBar
  187. Field _scrolly:ScrollBar
  188. Field _scrollBarsVisible:Bool=True
  189. End