瀏覽代碼

Added mojox.ViewCell and mojox.ListView.

Mark Sibly 9 年之前
父節點
當前提交
15d8d82183

+ 8 - 0
modules/mojox/assets/themes/default.json

@@ -264,6 +264,14 @@
 			"padding":[2]
 		},
 		
+		"ListView":{
+			"backgroundColor":"content"
+		},
+		
+		"ListViewContent":{
+			"padding":[2]
+		},
+		
 		"FileBrowser":{
 			"extends":"TreeView"
 		},

+ 162 - 0
modules/mojox/listview.monkey2

@@ -0,0 +1,162 @@
+
+Namespace mojox
+
+Class ListView Extends ScrollableView
+
+	#rem monkeydoc Invoked when an item is clicked.
+	#end
+	Field ItemClicked:Void( item:Item )
+	
+	#rem monkeydoc Invoked when an item is double clicked.
+	#end
+	Field ItemDoubleClicked:Void( item:Item )
+
+	Class Item Extends ViewCell
+	
+		Method New( text:String,icon:Image,list:ListView )
+			Super.New( text,icon )
+			_list=list
+		End
+		
+		Private
+		
+		Field _list:ListView
+		Field _rect:Recti
+	
+	End
+
+	#rem monkeydoc Creates a new list view.
+	#end
+	Method New()	
+		Style=GetStyle( "ListView" )
+		ContentView.Style=GetStyle( "ListViewContent" )
+	End
+
+	#rem monkeydoc Adds an item to the list view.
+	#end
+	Method AddItem:Item( text:String,icon:Image=Null )
+	
+		Return InsertItem( _items.Length,text,icon )
+	End
+	
+	#rem monkeydoc Inserts an item to the list view at a given index.
+	#end
+	Method InsertItem:Item( index:Int,text:String,icon:Image=Null )
+		
+		Local item:=New Item( text,icon,Self )
+		_items.Insert( index,item )
+		
+		RequestRender()
+		
+		Return item
+	End
+	
+	#rem monkeydoc Removes an item from the list view.
+	#end
+	Method RemoveItem( index:Int )
+		
+		_items.Erase( index )
+		
+		RequestRender()
+	End
+	
+	#rem monkeydoc Removes an item from the list view.
+	#end
+	Method RemoveItem( item:Item )
+	
+		RemoveItem( IndexOfItem( item ) )
+	End
+
+	#rem monkeydoc Removes a sequence of items from the list view.
+	#end	
+	Method RemoveItems( index1:Int,index2:Int )
+	
+		_items.Erase( index1,index2 )
+		
+		RequestRender()
+	End
+	
+	#rem monkeydoc Removes all items from the list view.
+	#end
+	Method RemoveAllItems()
+	
+		_items.Clear()
+		
+		RequestRender()
+	End
+	
+	#rem monkeydoc Returns the index of a given item in the list view.
+	#end
+	Method IndexOfItem:Int( item:Item )
+
+		For Local i:=0 Until _items.Length
+			If _items[i]=item Return i
+		Next
+		
+		Return -1
+	End
+	
+	#rem monkeydoc Returns the item at a point in the list view.
+	#end
+	Method ItemAtPoint:Item( point:Vec2i )
+
+		For Local item:=Eachin _items
+			If item._rect.Contains( point ) Return item
+		Next
+		
+		Return Null
+	End
+	
+	Protected
+	
+	#rem monkeydoc @hidden
+	#end
+	Method OnMeasureContent:Vec2i() Override
+	
+		Local w:=0,h:=0
+		
+		For Local item:=Eachin _items
+		
+			Local size:=item.Measure( RenderStyle )
+			
+			item._rect=New Recti( 0,h,size.x,h+size.y )
+			
+			w=Max( w,size.x )
+			h+=size.y
+		Next
+		
+		Return New Vec2i( w,h )
+
+	End
+	
+	#rem monkeydoc @hidden
+	#end
+	Method OnRenderContent( canvas:Canvas ) Override
+	
+		Local x:=0,y:=0
+	
+		For Local item:=Eachin _items
+		
+			item.Render( canvas,item._rect,RenderStyle,New Vec2f( 0,.5 ) )
+		Next			
+	End
+	
+	#rem monkeydoc @hidden
+	#end
+	Method OnMouseEvent( event:MouseEvent ) Override
+	
+		Select event.Type
+		Case EventType.MouseClick
+			Local item:=ItemAtPoint( event.Location )
+			If item ItemClicked( item )
+		Case EventType.MouseDoubleClick
+			Local item:=ItemAtPoint( event.Location )
+			If item ItemDoubleClicked( item )
+		End
+	
+	End
+
+	Private
+	
+	Field _items:=New Stack<Item>
+End

+ 3 - 0
modules/mojox/mojox.monkey2

@@ -31,10 +31,13 @@ Namespace mojox
 #Import "optionsfield"
 #Import "filepathfield"
 
+#Import "viewcell"
+
 #Import "toolbar"
 #Import "menu"
 #Import "tabview"
 #Import "treeview"
+#Import "listview"
 #Import "filebrowser"
 #Import "htmlview"
 #Import "console"

+ 54 - 0
modules/mojox/tests/listview_test.monkey2

@@ -0,0 +1,54 @@
+
+#Import "<std>"
+#Import "<mojo>"
+#Import "<mojox>"
+
+Using std..
+Using mojo..
+Using mojox..
+
+Class MyWindow Extends Window
+
+	Method New()
+		Super.New( "Simple Mojo Gui App",640,480,WindowFlags.Resizable )
+		
+		Local icon:=Image.Load( DesktopDir()+"monkey2.png" )
+		
+		Local list:=New ListView
+		list.AddItem( "Hello there!~nThis is a wide listview!",icon )
+		list.AddItem( "there" )
+		list.AddItem( "this" )
+		list.AddItem( "is" )
+		list.AddItem( "listview" )
+		list.AddItem( "Hello there this is a wide listview!" )
+		list.AddItem( "there" )
+		list.AddItem( "this" )
+		list.AddItem( "is" )
+		list.AddItem( "listview" )
+		list.AddItem( "Hello there this is a wide listview!" )
+		list.AddItem( "there" )
+		list.AddItem( "this" )
+		list.AddItem( "is" )
+		list.AddItem( "listview" )
+		
+		list.InsertItem( 0,"Insert item at top" )
+		
+		list.ItemClicked+=Lambda( item:ListView.Item )
+			Local index:=list.IndexOfItem( item )
+			
+			Print "Item "+index+" clicked"
+		End
+		
+		ContentView=list
+	End
+
+End
+
+Function Main()
+
+	New AppInstance
+	
+	New MyWindow
+	
+	App.Run()
+End

+ 22 - 61
modules/mojox/treeview.monkey2

@@ -25,12 +25,12 @@ Class TreeView Extends ScrollableView
 	#end
 	Field NodeCollapsed:Void( node:Node )
 
-	Class Node
+	Class Node Extends ViewCell
 
 		#rem monkeydoc Creates a new node.
 		#end
 		Method New( text:String,parent:Node=Null,index:Int=-1 )
-		
+			
 			If parent parent.AddChild( Self,index )
 			
 			Text=text
@@ -52,34 +52,6 @@ Class TreeView Extends ScrollableView
 			Dirty()
 		End
 
-		#rem monkeydoc Node text.
-		#end		
-		Property Text:String()
-		
-			Return _text
-			
-		Setter( text:String )
-			If text=_text Return
-		
-			_text=text
-			
-			Dirty()
-		End
-		
-		#rem monkeydoc Node icon.
-		#end		
-		Property Icon:Image()
-		
-			Return _icon
-		
-		Setter( icon:Image )
-			If icon=_icon Return
-		
-			_icon=icon
-			
-			Dirty()
-		End
-
 		#rem monkeydoc Node parent.
 		#end		
 		Property Parent:Node()
@@ -234,13 +206,18 @@ Class TreeView Extends ScrollableView
 			Return Null
 		End
 		
+		Protected
+		
+		Method OnModified() Override
+		
+			Dirty()
+		End
+		
 		Private
 		
 		Field _parent:Node
 		Field _children:=New Stack<Node>	'should make on demand...
 		Field _style:Style
-		Field _text:String
-		Field _icon:Image
 		Field _expanded:Bool
 		Field _bounds:Recti
 		Field _rect:Recti
@@ -436,22 +413,16 @@ Class TreeView Extends ScrollableView
 
 		node._dirty=False
 		
-		Local style:=node.Style
-		If Not style style=RenderStyle
-	
 		Local size:Vec2i,nodeSize:=0
 		
 		If node<>_rootNode Or _rootNodeVisible
+
+			Local style:=node._style ? node._style Else RenderStyle
 		
-			Local w:=Int( style.Font.TextWidth( node._text ) )
-			Local h:=Int( style.Font.Height )
+			size=node.Measure( style )
 			
-			If node._icon
-				w+=_spcWidth+node._icon.Width
-				h=Max( h,Int( node._icon.Height ) )
-			Endif
-			
-			size=New Vec2i( w+_nodeSize,Max( h,_nodeSize )+_spacing )
+			size.x+=_nodeSize
+			size.y=Max( size.y,_nodeSize )+_spacing
 			
 			nodeSize=_nodeSize
 		Endif
@@ -486,33 +457,23 @@ Class TreeView Extends ScrollableView
 		
 		If _rootNodeVisible Or node<>_rootNode
 		
+			Local rect:=node._rect
+		
 			If node._children.Length
 			
-				Local icon:=_collapsedIcon
-				If node._expanded icon=_expandedIcon
+				Local icon:=node._expanded ? _expandedIcon Else _collapsedIcon
 				
 				Local x:=(_nodeSize-icon.Width)/2
-				Local y:=(node._rect.Height-icon.Height)/2
+				Local y:=(rect.Height-icon.Height)/2
 				
-				RenderStyle.DrawIcon( canvas,icon,node._rect.X+x,node._rect.Y+y )
+				RenderStyle.DrawIcon( canvas,icon,rect.min.x+x,rect.min.y+y )
 			Endif
 			
-			Local x:=node._rect.X+_nodeSize
-			
-			Local style:=node.Style
-			If Not style style=RenderStyle
-	
-			If node._icon
-				Local y:=(node._rect.Height-node._icon.Height)/2
-				
-				style.DrawIcon( canvas,node._icon,x,node._rect.Y+y )
-				
-				x+=node._icon.Width+_spcWidth
-			Endif
+			rect.min.x+=_nodeSize
 			
-			Local y:=(node._rect.Height-RenderStyle.Font.Height)/2
+			Local style:=node._style ? node._style Else RenderStyle
 			
-			style.DrawText( canvas,node._text,x,node._rect.Y+y )
+			node.Render( canvas,rect,style,New Vec2f( 0,.5 ) )
 		Endif
 			
 		If node._expanded

+ 70 - 0
modules/mojox/viewcell.monkey2

@@ -0,0 +1,70 @@
+
+Namespace mojox
+
+Class ViewCell
+
+	Method New()
+	End
+
+	Method New( text:String,icon:Image=null )
+		_text=text
+		_icon=icon
+	End
+	
+	Property Text:String()
+		
+		Return _text
+		
+	Setter( text:String )
+		
+		_text=text
+		
+		OnModified()
+	End
+		
+	Property Icon:Image()
+		
+		Return _icon
+		
+	Setter( icon:Image )
+		
+		_icon=icon
+		
+		OnModified()
+	End
+	
+	Method Measure:Vec2i( style:Style ) Virtual
+	
+		Local size:=style.MeasureText( _text )
+		
+		If _icon
+			size.x+=_icon.Width+style.Font.TextWidth( " " )
+			size.y=Max( size.y,Int( _icon.Height ) )
+		Endif
+		
+		Return size
+	End
+	
+	Method Render( canvas:Canvas,rect:Recti,style:Style,textGravity:Vec2f ) Virtual
+	
+		If _icon
+			Local y:=(rect.Height-_icon.Height)/2
+			style.DrawIcon( canvas,_icon,rect.min.x,rect.min.y+y )
+			rect.min.x+=_icon.Width+style.Font.TextWidth( " " )
+		Endif
+
+		style.DrawText( canvas,_text,rect,textGravity )
+	End
+	
+	Protected
+	
+	Method OnModified() Virtual
+	End
+		
+	Private
+	
+	Field _text:String
+	
+	Field _icon:Image
+	
+End

+ 8 - 0
src/ted2/assets/themes/default.json

@@ -264,6 +264,14 @@
 			"padding":[2]
 		},
 		
+		"ListView":{
+			"backgroundColor":"content"
+		},
+		
+		"ListViewContent":{
+			"padding":[2]
+		},
+		
 		"FileBrowser":{
 			"extends":"TreeView"
 		},

+ 8 - 0
src/ted2/assets/themes/theme-blitzed.json

@@ -264,6 +264,14 @@
 		"TreeViewContent":{
 			"padding":[2]
 		},
+
+		"ListView":{
+			"backgroundColor":"content"
+		},
+		
+		"ListViewContent":{
+			"padding":[2]
+		},
 		
 		"FileBrowser":{
 			"extends":"TreeView"

+ 8 - 0
src/ted2/assets/themes/theme-classic-dark.json

@@ -264,6 +264,14 @@
 			"padding":[2]
 		},
 		
+		"ListView":{
+			"backgroundColor":"content"
+		},
+		
+		"ListViewContent":{
+			"padding":[2]
+		},
+		
 		"FileBrowser":{
 			"extends":"TreeView"
 		},

+ 8 - 0
src/ted2/assets/themes/theme-monkey1.json

@@ -265,6 +265,14 @@
 			"padding":[2]
 		},
 		
+		"ListView":{
+			"backgroundColor":"content"
+		},
+		
+		"ListViewContent":{
+			"padding":[2]
+		},
+		
 		"FileBrowser":{
 			"extends":"TreeView"
 		},

+ 8 - 0
src/ted2/assets/themes/theme-overcast.json

@@ -265,6 +265,14 @@
 			"padding":[2]
 		},
 		
+		"ListView":{
+			"backgroundColor":"content"
+		},
+		
+		"ListViewContent":{
+			"padding":[2]
+		},
+		
 		"FileBrowser":{
 			"extends":"TreeView"
 		},