Browse Source

Lots of Mojox tweaks for handling theme changes.

Mark Sibly 9 years ago
parent
commit
156d0689bd

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

@@ -14,6 +14,9 @@
 		"text-disabled": "#888",
 		"text-background": "#888",
 		
+		"textview-cursor":"#08f",
+		"textview-selection":"#888",
+
 		"textview-color0":"#0000",
 		"textview-color1":"#fff",
 		"textview-color2":"#ff0",
@@ -116,6 +119,10 @@
 			"backgroundColor":"content"
 		},
 		
+		"TextViewContent":{
+			"padding":[4]
+		},
+		
 		"TextField":{
 			"padding":[ 2 ],
 			"margin":[ 2 ],
@@ -253,6 +260,10 @@
 			"icons":"treeview_icons.png"
 		},
 		
+		"TreeViewContent":{
+			"padding":[2]
+		},
+		
 		"FileBrowser":{
 			"extends":"TreeView"
 		},

+ 3 - 0
modules/mojox/checkbutton.monkey2

@@ -44,6 +44,8 @@ Class CheckButton Extends Label
 		_checkBox=New Button
 		_checkBox.Style=GetStyle( "CheckBox" )
 		_checkBox.Icon=_checkBox.RenderStyle.Icons[0]
+		_checkBox.Layout="float"
+		_checkBox.Gravity=New Vec2f( 1,.5 )
 		
 		Local clicked:=Lambda()
 		
@@ -121,6 +123,7 @@ Class CheckButton Extends Label
 	
 	Method SetChecked( checked:Bool )
 		_checked=checked
+
 		InvalidateStyle()
 	End
 

+ 8 - 6
modules/mojox/dockingview.monkey2

@@ -11,12 +11,7 @@ Class DockKnob Extends View
 		Style=GetStyle( "DockKnob" )
 	End
 	
-	Private
-	
-	Field _org:Vec2i
-	
-	Field _drag:Bool
-	Field _hover:Bool
+	Protected
 	
 	Method OnMeasure:Vec2i() Override
 	
@@ -48,6 +43,13 @@ Class DockKnob Extends View
 		Endif
 	End
 	
+	Private
+	
+	Field _org:Vec2i
+	
+	Field _drag:Bool
+	Field _hover:Bool
+	
 End
 
 #rem monkeydoc @hidden

+ 8 - 0
modules/mojox/filebrowser.monkey2

@@ -217,9 +217,17 @@ Class FileBrowser Extends TreeView
 			Local icon:=Image.Load( dir+type )
 			If Not icon Continue
 			
+			icon.Scale=App.Theme.Scale
+			
 			_fileTypeIcons[ "."+StripExt(type) ]=icon
 		Next
 		
+		App.ThemeChanged+=Lambda()
+			For Local image:=Eachin _fileTypeIcons.Values
+				image.Scale=App.Theme.Scale
+			Next
+		End
+		
 		Return _fileTypeIcons
 	End
 	

+ 85 - 69
modules/mojox/htmlview.monkey2

@@ -15,7 +15,7 @@ Class HtmlView Extends ScrollableView
 		Layout="fill"
 		
 		Style=GetStyle( "HtmlView" )
-		
+
 		_context=New litehtml.context
 		_context.load_master_stylesheet( stringio.LoadString( "theme::htmlview_master_css.css" ) )
 
@@ -45,8 +45,8 @@ Class HtmlView Extends ScrollableView
 	Setter( htmlSource:String )
 		_source=htmlSource
 		_document=New litehtml.document( _source,_container,_context )
-		_layoutSize=New Vec2i( 0,0 )
-		_renderSize=New Vec2i( 0,0 )
+		_layoutSize=Null
+		_renderSize=Null
 		RequestRender()
 	End
 	
@@ -97,6 +97,12 @@ Class HtmlView Extends ScrollableView
 	Field _document:litehtml.document
 	Field _layoutSize:Vec2i
 	Field _renderSize:Vec2i
+	
+	Method OnThemeChanged() Override
+		_document=New litehtml.document( _source,_container,_context )
+		_layoutSize=Null
+		_renderSize=Null
+	End
 
 	Method OnMeasureContent2:Vec2i( size:Vec2i ) Override
 	
@@ -169,8 +175,20 @@ Class document_container Extends litehtml.document_container
 
 	Field _view:HtmlView
 	
-	Global _fontScale:=1
-	Global _imageCache:=New StringMap<Image>
+	Method ToFont:Font( hfont:Object )
+	
+		Return Cast<Font>( hfont )
+	End
+	
+	Method ToCanvas:Canvas( hdc:Object )
+	
+		Return Cast<Canvas>( hdc )
+	End
+	
+	Method GetImage:Image( src:String )
+	
+		Return App.Theme.OpenImage( src )
+	End
 	
 	Method New( view:HtmlView )
 	
@@ -183,26 +201,25 @@ Class document_container Extends litehtml.document_container
 	End
 	
 	Method make_url:String( href:String )
+	
 		Return _view._baseUrl+href
 	End
 
 	Method create_font:Object( faceName:String,size:Int,weight:Int,style:litehtml.font_style,decoration:UInt,fm:litehtml.font_metrics Ptr ) Override
 	
-		Local font:Font
+		Local face:="DejaVuSans"
 		
-		If faceName.Contains( "monospace" )
-			font=Font.Open( "font::DejaVuSansMono.ttf",size )
-		Else
-			font=Font.Open( "font::DejaVuSans.ttf",size )
-		Endif
+		If faceName.Contains( "monospace" ) face+="Mono"
+		
+		Local font:=App.Theme.OpenFont( face,size )
 		
-		Local height:=size
+		Local height:=font.Height
 
-		fm[0].height=height
-		fm[0].ascent=height
-		fm[0].descent=0
-		fm[0].x_height=height
-		fm[0].draw_spaces=True
+		fm->height=height
+		fm->ascent=height
+		fm->descent=0
+		fm->x_height=height
+		fm->draw_spaces=True
 		
 		Return font
 	End
@@ -212,89 +229,86 @@ Class document_container Extends litehtml.document_container
 	
 	Method text_width:Int( text:String,hfont:Object ) Override
 	
-		Local font:=Cast<Font>( hfont )
+		Local font:=ToFont( hfont )
 		
-		Return font.TextWidth( text ) * _fontScale
+		Return font.TextWidth( text )
 	End
 	
 	Method draw_text( hdc:Object,text:String,hfont:Object,color:litehtml.web_color Ptr,pos:litehtml.position Ptr ) Override
 	
-		Local canvas:=Cast<Canvas>( hdc )
+		Local canvas:=ToCanvas( hdc )
 		
-		Local font:=Cast<Font>( hfont )
+		Local font:=ToFont( hfont )
 		
 		canvas.Font=font
 
 		set_color( canvas,color[0] )
 		
-		canvas.DrawText( text,pos[0].x,pos[0].y )
+		canvas.DrawText( text,pos->x,pos->y )
 		
 		Return
-#rem		
-		canvas.PushMatrix()
-		canvas.Translate( pos[0].x,pos[0].y )
-		canvas.Scale( _fontScale,1 )
-		canvas.DrawText( text,0,0 )
-		canvas.PopMatrix()
-#end
 	End
 	
 	Method pt_to_px:Int( pt:Int ) Override
+	
 		Return 0
 	End
 	
 	Method get_default_font_size:Int() Override
-		Return 16
+	
+		Return 16 * App.Theme.Scale.y
 	End
 	
 	Method get_default_font_name:String() Override
-		Return "mojo"
+	
+		Return "DejaVuSans"
 	End
 	
 	Method draw_list_marker( hdc:Object,marker:litehtml.list_marker Ptr ) Override
 	
-		If marker[0].marker_type=litehtml.list_style_type_none Return
+		If marker->marker_type=litehtml.list_style_type_none Return
 	
-		Local canvas:=Cast<Canvas>( hdc )
+		Local canvas:=ToCanvas( hdc )
 	
-		set_color( canvas,marker[0].color )
+		set_color( canvas,marker->color )
 		
-		Select marker[0].marker_type
+		Select marker->marker_type
 		Case litehtml.list_style_type_disc
-			canvas.DrawOval( marker[0].pos.x,marker[0].pos.y,marker[0].pos.width,marker[0].pos.height )
+			canvas.DrawOval( marker->pos.x,marker->pos.y,marker->pos.width,marker->pos.height )
 		Default
-			canvas.DrawRect( marker[0].pos.x,marker[0].pos.y,marker[0].pos.width,marker[0].pos.height )
+			canvas.DrawRect( marker->pos.x,marker->pos.y,marker->pos.width,marker->pos.height )
 		End
 	End
 	
 	Method load_image( src:String,baseurl:String,redraw_on_ready:Bool ) Override
-		If _imageCache.Contains( src ) Return
-		Local image:=Image.Load( make_url( src ) )
-		_imageCache.Set( src,image )
+	
+		GetImage( src )
 	End
 	
 	Method get_image_size( src:String,baseurl:String,sz:litehtml.size Ptr ) Override
-		Local image:=_imageCache.Get( src )
+	
+		Local image:=GetImage( src )
 		If Not image Return
-		sz[0].width=image.Width
-		sz[0].height=image.Height
+	
+		sz->width=image.Width
+		sz->height=image.Height
 	End
 
 	Method draw_background( hdc:Object,img_src:String,img_baseurl:String,bg:litehtml.background_paint Ptr ) Override
 	
-		Local canvas:=Cast<Canvas>( hdc )
+		Local canvas:=ToCanvas( hdc )
 		
-		Local image:=_imageCache.Get( img_src )
+		Local image:=GetImage( img_src )
 		If image
 			canvas.Color=Color.White
-			canvas.DrawImage( image,bg[0].position_x,bg[0].position_y )
+			canvas.DrawImage( image,bg->position_x,bg->position_y )
 			Return
 		Endif
 
-		set_color( canvas,bg[0].color )
+		set_color( canvas,bg->color )
 		
-'		canvas.DrawRect( bg[0].clip_box.x,bg[0].clip_box.y,bg[0].clip_box.width,bg[0].clip_box.height )
-		canvas.DrawRect( bg[0].border_box.x,bg[0].border_box.y,bg[0].border_box.width,bg[0].border_box.height )
+'		canvas.DrawRect( bg->clip_box.x,bg->clip_box.y,bg->clip_box.width,bg->clip_box.height )
+		canvas.DrawRect( bg->border_box.x,bg->border_box.y,bg->border_box.width,bg->border_box.height )
 
 	End
 	
@@ -309,19 +323,19 @@ Class document_container Extends litehtml.document_container
 	
 	Method draw_borders( hdc:Object,borders:litehtml.borders Ptr,pos:litehtml.position Ptr,root:Bool ) Override
 	
-		Local canvas:=Cast<Canvas>( hdc )
+		Local canvas:=ToCanvas( hdc )
 		
-		Local x:=pos[0].x,y:=pos[0].y
+		Local x:=pos->x,y:=pos->y
 		
-		Local w:=pos[0].width,h:=pos[0].height
+		Local w:=pos->width,h:=pos->height
 		
-		draw_border( canvas,borders[0].left,x,y,1,h )
+		draw_border( canvas,borders->left,x,y,1,h )
 		
-		draw_border( canvas,borders[0].top,x,y,w,1 )
+		draw_border( canvas,borders->top,x,y,w,1 )
 		
-		draw_border( canvas,borders[0].right,x+w-1,y,1,h )
+		draw_border( canvas,borders->right,x+w-1,y,1,h )
 		
-		draw_border( canvas,borders[0].bottom,x,y+h-1,w,1 )
+		draw_border( canvas,borders->bottom,x,y+h-1,w,1 )
 	End
 
 	Method set_caption( caption:String ) Override
@@ -331,6 +345,7 @@ Class document_container Extends litehtml.document_container
 	End
 	
 	Method on_anchor_click( url:String ) Override
+	
 		_view._anchorClicked=url
 	End
 		
@@ -338,6 +353,7 @@ Class document_container Extends litehtml.document_container
 	End
 	
 	Method import_css:String( url:String,baseurl:String ) Override
+	
 		Local css:=stringio.LoadString( make_url( url ) )
 		Return css
 	End
@@ -350,23 +366,23 @@ Class document_container Extends litehtml.document_container
 	
 	Method get_client_rect( client:litehtml.position Ptr ) Override
 '		If _view._rendering Print "get client rect"
-		client[0].x=0
-		client[0].y=0
-		client[0].width=_view._layoutSize.x
-		client[0].height=_view._layoutSize.y
+		client->x=0
+		client->y=0
+		client->width=_view._layoutSize.x
+		client->height=_view._layoutSize.y
 	End
 	
 	Method get_media_features( media:litehtml.media_features Ptr ) Override
 '		If _view._rendering Print "get media features"
-		media[0].type=litehtml.media_type_screen
-		media[0].width=_view._layoutSize.x
-		media[0].height=_view._layoutSize.y
-		media[0].device_width=1920
-		media[0].device_height=1080
-		media[0].color=8
-		media[0].color_index=0
-		media[0].monochrome=0
-		media[0].resolution=96
+		media->type=litehtml.media_type_screen
+		media->width=_view._layoutSize.x
+		media->height=_view._layoutSize.y
+		media->device_width=1920
+		media->device_height=1080
+		media->color=8
+		media->color_index=0
+		media->monochrome=0
+		media->resolution=96
 	End
 	
 	Method get_language:String() Override

+ 13 - 4
modules/mojox/label.monkey2

@@ -58,7 +58,7 @@ Class Label Extends View
 	
 		_text=text
 		
-		App.RequestRender()
+		RequestRender()
 	End
 
 	#rem monkeydoc Label text gravity.
@@ -72,7 +72,7 @@ Class Label Extends View
 	
 		_textGravity=textGravity
 
-		App.RequestRender()
+		RequestRender()
 	End
 
 	#rem monkeydoc Label icon.
@@ -86,7 +86,7 @@ Class Label Extends View
 	
 		_icon=icon
 		
-		App.RequestRender()
+		RequestRender()
 	End
 	
 	#rem monkeydoc Adds a view to the right of the label.
@@ -150,13 +150,22 @@ Class Label Extends View
 		_textRect=New Recti( tx,ty,tx+tw,ty+th )
 		
 		Local x1:=Width
-		For Local view:=Eachin _views.Backwards()
 		
+		For Local i:=_views.Length-1 To 0 Step -1
+			Local view:=_views[i]
+			Local x0:=i ? Max( x1-view.LayoutSize.x,_textRect.Right ) Else _textRect.Right
+			view.Frame=New Recti( x0,0,x1,Height )
+			x1=x0
+		Next
+		
+		#rem
+		For Local view:=Eachin _views.Backwards()
 			Local x0:=Max( x1-view.LayoutSize.x,_textRect.Right )
 			view.Frame=New Recti( x0,0,x1,Height )
 			x1=x0
 		Next
 		_textRect.Right=x1
+		#end
 		
 		Return
 		

+ 7 - 4
modules/mojox/scrollbar.monkey2

@@ -13,14 +13,12 @@ Class ScrollBar Extends View
 	#end
 	Method New( axis:Axis=std.geom.Axis.X )
 
+		Style=GetStyle( "ScrollBar" )
+
 		_axis=axis
 
 		Local taxis:=_axis=Axis.X ? "x" Else "y"
 		
-		Style=GetStyle( "ScrollBar" )
-		
-		_knobStyle=GetStyle( "ScrollKnob" )
-		
 '		Style=GetStyle( "ScrollBar:"+taxis )
 
 '		_knobStyle=GetStyle( "ScrollKnob:"+taxis )
@@ -122,6 +120,11 @@ Class ScrollBar Extends View
 	
 	Field _offset:Int
 	
+	Method OnValidateStyle() Override
+		
+		_knobStyle=GetStyle( "ScrollKnob" )
+	End
+	
 	Method OnMeasure:Vec2i() Override
 	
 		Return _knobStyle.Bounds.Size

+ 90 - 10
modules/mojox/tableview.monkey2

@@ -15,26 +15,76 @@ Class TableView Extends ScrollView
 		ContentView=_docker
 	End
 	
-	#rem monkeydoc Number of columns.
-	#end
-	Property NumColumns:Int()
+	Method New( columns:Int,rows:Int=0 )
+		Self.New()
+		
+		Columns=columns
+
+		Rows=rows
+	End
+	
+	Method New( columns:String[] )
+		Self.New()
+		
+		For Local column:=Eachin columns
+			AddColumn( column )
+		Next
+	End
+	
+	Property Columns:Int()
 	
 		Return _cols.Length
+	
+	Setter( columns:Int )
+		DebugAssert( columns>=0 )
+		
+		If columns=_cols.Length Return
+	
+		Local n:=_cols.Length
+
+		For Local i:=columns Until n
+			_docker.RemoveView( _cols[i] )
+		Next
+		
+		_cols.Resize( columns )
+		
+		For Local i:=n Until columns
+			_cols[i]=New TableColumn( "",Null,_rowSizes )
+			_docker.AddView( _cols[i],"left" )
+		Next
+		
+		RequestRender()
 	End
 	
-	#rem monkeydoc Number of rows.
-	#end
-	Property NumRows:Int()
+	Property Rows:Int()
 	
 		Return _numRows
-	end
-
+	
+	Setter( rows:Int )
+		DebugAssert( rows>=0 )
+		
+		If rows=_numRows Return
+	
+		_numRows=rows
+		
+		_rowSizes.Resize( _numRows )
+	
+		For Local col:=Eachin _cols
+			col._rows.Resize( _numRows )
+		Next
+		
+		RequestRender()
+	End
+	
 	#rem monkeydoc Adds a column.
+	
+	Returns index of new column.
+	
+	@return Index of new column.
 	#end	
 	Method AddColumn:Int( text:String="",icon:Image=Null,size:String="",draggable:Bool=False )
 
 		Local col:=New TableColumn( text,icon,_rowSizes )
-		col.Rows.Resize( _numRows )
 
 		_docker.AddView( col,"left",size,draggable )
 
@@ -42,10 +92,16 @@ Class TableView Extends ScrollView
 		
 		Return _cols.Length-1
 	End
+
 	
 	#rem monkeydoc Adds rows.
+	
+	Returns index of first row added.
+	
+	@return Index of first row added.
+	
 	#end
-	Method AddRows( num:Int )
+	Method AddRows:Int( num:Int )
 	
 		_numRows+=num
 		_rowSizes.Resize( _numRows )
@@ -53,6 +109,8 @@ Class TableView Extends ScrollView
 		For Local col:=Eachin _cols
 			col.Rows.Resize( _numRows )
 		Next
+		
+		Return _numRows-num
 	End
 	
 	#rem monkeydoc Removes all rows.
@@ -98,6 +156,26 @@ Class TableView Extends ScrollView
 		_cols[col].SetView( row,view )
 	End
 	
+	#rem monkeydoc Number of columns.
+	
+	Deprecated! Use [[Columns]] property instead.
+	
+	#end
+	Property NumColumns:Int()
+	
+		Return _cols.Length
+	End
+	
+	#rem monkeydoc Number of rows.
+
+	Deprecated! Use [[Rows]] property instead.
+
+	#end
+	Property NumRows:Int()
+	
+		Return _numRows
+	End
+	
 	Protected
 	
 	Method OnMeasure:Vec2i() Override
@@ -138,6 +216,8 @@ Class TableView Extends ScrollView
 			_header.Style=GetStyle( "TableHeader" )
 			
 			AddChildView( _header )
+			
+			_rows.Resize( _rowSizes.Length )
 		End
 		
 		Property Rows:Stack<View>()

+ 2 - 2
modules/mojox/textfield.monkey2

@@ -27,11 +27,11 @@ Class TextField Extends TextView
 		Style=GetStyle( "TextField" )
 		
 		Layout="fill-x"
-		Gravity=New Vec2f( 0,.5 )
+		Gravity=New Vec2f( .5 )
 		
 		ScrollBarsVisible=False
 		
-		MaxSize=New Vec2i( 160,0 )
+		MaxSize=New Vec2i( 320,0 )
 		
 		Document.TextChanged+=Lambda()
 			TextChanged()

+ 10 - 4
modules/mojox/treeview.monkey2

@@ -254,13 +254,14 @@ Class TreeView Extends ScrollableView
 				node=node._parent
 			Wend
 		End
-		
 	End
 
 	#rem monkeydoc Creates a new tree view.
 	#end	
 	Method New()
 		Style=GetStyle( "TreeView" )
+		ContentView.Style=GetStyle( "TreeViewContent" )
+		
 		Layout="fill"
 		
 		_rootNode=New Node( Null )
@@ -305,15 +306,20 @@ Class TreeView Extends ScrollableView
 	
 	Protected
 	
+	Method OnThemeChanged() Override
+	
+		_rootNode.Dirty()
+	End
+	
 	Method OnValidateStyle() Override
 	
 		Local style:=RenderStyle
 	
-		_collapsedIcon=style.Icons[0]
-		_expandedIcon=style.Icons[1]
-		
 		_nodeSize=style.Font.Height
 		_spcWidth=style.Font.TextWidth( " " )
+		
+		_collapsedIcon=style.Icons[0]
+		_expandedIcon=style.Icons[1]
 	End
 	
 	Method OnMeasureContent:Vec2i() Override