tabview.monkey2 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. Namespace mojox
  2. #rem monkeydoc @hidden
  3. #end
  4. Class TabButton Extends Button
  5. Field CloseClicked:Void()
  6. Method New( text:String,icon:Image,view:View,closable:bool )
  7. Super.New( text,icon )
  8. Style=GetStyle( "TabButton" )
  9. _view=view
  10. If closable
  11. _close=New Button
  12. _close.Style=GetStyle( "TabClose" )
  13. _close.Icon=_close.Style.Icons[0]
  14. _close.Clicked=Lambda()
  15. CloseClicked()
  16. End
  17. AddView( _close )
  18. Endif
  19. End
  20. Property View:View()
  21. Return _view
  22. Setter( view:View )
  23. _view=view
  24. End
  25. Private
  26. Field _button:Button
  27. Field _close:Button
  28. Field _view:View
  29. End
  30. #rem monkeydoc @hidden
  31. #end
  32. Class TabBar Extends ToolBar
  33. Method New()
  34. Style=GetStyle( "TabBar" )
  35. Layout="fill-x"
  36. End
  37. End
  38. #rem monkeydoc The TabViewFlags enum.
  39. Tab view flags:
  40. | TabViewFlags | Description
  41. |:--------------|:-----------
  42. | ClosableTabs | Tabs can be closed.
  43. | DraggableTabs | Tabs can be dragged.
  44. #end
  45. Enum TabViewFlags
  46. ClosableTabs=1
  47. DraggableTabs=2
  48. End
  49. #rem monkeydoc The TabView class.
  50. #end
  51. Class TabView Extends DockingView
  52. #rem monkeydoc Invoked when the current tab changes.
  53. #end
  54. Field CurrentChanged:Void()
  55. #rem monkeydoc @hidden
  56. #end
  57. Field Clicked:Void()
  58. #rem monkeydoc Invoked when a tab is right clicked.
  59. #end
  60. Field RightClicked:Void()
  61. #rem monkeydoc Invoked when a tab is double clicked.
  62. #end
  63. Field DoubleClicked:Void()
  64. #rem monkeydoc Invoked when a tab is double clicked.
  65. #end
  66. Field CloseClicked:Void( index:Int )
  67. #rem monkeydoc Invoked when a tab is dragged.
  68. #end
  69. Field Dragged:Void()
  70. #rem monkeydoc Creates a new tab view.
  71. #end
  72. Method New( flags:TabViewFlags=Null )
  73. _flags=flags
  74. Style=GetStyle( "TabView" )
  75. Layout="fill"
  76. _tabBar=New TabBar
  77. AddView( _tabBar,"top" )
  78. End
  79. #rem monkeydoc Tab view flags.
  80. #end
  81. Property Flags:TabViewFlags()
  82. Return _flags
  83. End
  84. #rem monkeydoc Number of tabs
  85. #end
  86. Property NumTabs:Int()
  87. Return _tabs.Length
  88. End
  89. #rem monkeydoc The current index.
  90. #end
  91. Property CurrentIndex:Int()
  92. If _current Return TabIndex( _current.View )
  93. Return -1
  94. Setter( currentIndex:Int )
  95. MakeCurrent( _tabs[currentIndex],False )
  96. End
  97. #rem monkeydoc The current view.
  98. #end
  99. Property CurrentView:View()
  100. If _current Return _current.View
  101. Return Null
  102. Setter( currentView:View )
  103. MakeCurrent( _tabs[ TabIndex( currentView ) ],False )
  104. End
  105. #rem monkeydoc Gets a tab's view.
  106. #end
  107. Method TabView:View( index:Int )
  108. Assert( index>=0 And index<_tabs.Length,"Tab index out of range" )
  109. Return _tabs[index].View
  110. End
  111. #rem monkeydoc Gets a tab's index.
  112. #end
  113. Method TabIndex:Int( view:View )
  114. For Local i:=0 Until _tabs.Length
  115. If _tabs[i].View=view Return i
  116. Next
  117. Return -1
  118. End
  119. #rem monkeydoc Adds a tab.
  120. #end
  121. Method AddTab:Int( text:String,view:View,makeCurrent:Bool=False )
  122. Return AddTab( text,Null,view,makeCurrent )
  123. End
  124. Method AddTab:Int( text:String,icon:Image,view:View,makeCurrent:Bool=False )
  125. Assert( TabIndex( view )=-1,"View has already been added to TabView" )
  126. Local tab:=New TabButton( text,icon,view,_flags & TabViewFlags.ClosableTabs )
  127. tab.Clicked=Lambda()
  128. MakeCurrent( tab,True )
  129. Clicked()
  130. End
  131. tab.RightClicked=Lambda()
  132. MakeCurrent( tab,True )
  133. RightClicked()
  134. End
  135. tab.DoubleClicked=Lambda()
  136. MakeCurrent( tab,True )
  137. DoubleClicked()
  138. End
  139. tab.Dragged+=Lambda( v:Vec2i )
  140. If Not (_flags & TabViewFlags.DraggableTabs) return
  141. Local mx:=_tabBar.MouseLocation.x
  142. If mx<0 Return
  143. Local w:=tab.Bounds.Width
  144. Local x:=0,i:=_tabs.Length
  145. For Local j:=0 Until i
  146. If mx<x+w
  147. i=j
  148. Exit
  149. Endif
  150. If tab=_tabs[j] Continue
  151. x+=_tabs[j].Bounds.Width
  152. If mx<x Return
  153. Next
  154. Local i2:=_tabs.FindIndex( tab )
  155. If i=i2 Return
  156. If i>i2 i-=1
  157. _tabs.Erase( i2 )
  158. _tabs.Insert( i,tab )
  159. _tabBar.RemoveAllViews()
  160. For Local view:=Eachin _tabs
  161. _tabBar.AddView( view )
  162. Next
  163. RequestRender()
  164. Dragged()
  165. End
  166. tab.CloseClicked=Lambda()
  167. CloseClicked( TabIndex( tab.View ) )
  168. End
  169. Local index:=_tabs.Length
  170. _tabBar.AddView( tab )
  171. _tabs.Push( tab )
  172. If makeCurrent CurrentIndex=index
  173. Return index
  174. End
  175. #rem monkeydoc Removes a tab.
  176. #end
  177. Method RemoveTab( index:Int )
  178. If _current=_tabs[index]
  179. _current.Selected=False
  180. _current=Null
  181. ContentView=Null
  182. Endif
  183. _tabBar.RemoveView( _tabs[index] )
  184. _tabs.Erase( index )
  185. End
  186. Method RemoveTab( view:View )
  187. RemoveTab( TabIndex( view ) )
  188. End
  189. Method SetTabView( index:Int,view:View )
  190. _tabs[index].View=view
  191. If _tabs[index]=_current ContentView=view
  192. End
  193. Method SetTabView( view:View,newView:View )
  194. SetTabView( TabIndex( view ),newView )
  195. End
  196. #rem monkeydoc Sets a tab's text.
  197. #end
  198. Method SetTabText( index:Int,text:String )
  199. _tabs[index].Text=text
  200. End
  201. Method SetTabText( view:View,text:String )
  202. SetTabText( TabIndex( view ),text )
  203. End
  204. #rem monkeydoc Sets a tab's icon.
  205. #end
  206. Method SetTabIcon( index:Int,icon:Image )
  207. _tabs[index].Icon=icon
  208. End
  209. Method SetTabIcon( view:View,icon:Image )
  210. SetTabIcon( TabIndex( view ),icon )
  211. End
  212. Private
  213. Field _flags:TabViewFlags
  214. Field _tabBar:TabBar
  215. Field _tabs:=New Stack<TabButton>
  216. Field _current:TabButton
  217. Method MakeCurrent( tab:TabButton,notify:Bool )
  218. If tab=_current Return
  219. If _current _current.Selected=False
  220. ContentView=tab.View
  221. _current=tab
  222. If _current _current.Selected=True
  223. If notify CurrentChanged()
  224. End
  225. End