94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using System; | |||
|  | using System.Collections.Generic; | |||
|  | using UnityEngine; | |||
|  | 
 | |||
|  | namespace WeChatWASM.MDV | |||
|  | { | |||
|  |     public class BlockContainer : Block | |||
|  |     { | |||
|  |         public bool Quoted    = false; | |||
|  |         public bool Highlight = false; | |||
|  | 
 | |||
|  |         List<Block> mBlocks = new List<Block>(); | |||
|  | 
 | |||
|  |         public BlockContainer( float indent ) : base( indent ) { } | |||
|  | 
 | |||
|  |         public Block Add( Block block ) | |||
|  |         { | |||
|  |             block.Parent = this; | |||
|  |             mBlocks.Add( block ); | |||
|  |             return block; | |||
|  |         } | |||
|  | 
 | |||
|  |         public override Block Find( string id ) | |||
|  |         { | |||
|  |             if( id.Equals( ID, StringComparison.Ordinal ) ) | |||
|  |             { | |||
|  |                 return this; | |||
|  |             } | |||
|  | 
 | |||
|  |             foreach( var block in mBlocks ) | |||
|  |             { | |||
|  |                 var match = block.Find( id ); | |||
|  | 
 | |||
|  |                 if( match != null ) | |||
|  |                 { | |||
|  |                     return match; | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             return null; | |||
|  |         } | |||
|  | 
 | |||
|  |         public override void Arrange( Context context, Vector2 pos, float maxWidth ) | |||
|  |         { | |||
|  |             Rect.position = new Vector2( pos.x + Indent, pos.y ); | |||
|  |             Rect.width = maxWidth - Indent - context.IndentSize; | |||
|  | 
 | |||
|  |             var paddingBottom = 0.0f; | |||
|  | 
 | |||
|  |             if( Highlight ) | |||
|  |             { | |||
|  |                 var style = GUI.skin.GetStyle( Quoted ? "blockquote" : "blockcode" ); | |||
|  | 
 | |||
|  |                 pos.x += style.padding.left; | |||
|  |                 pos.y += style.padding.top; | |||
|  | 
 | |||
|  |                 maxWidth -= style.padding.horizontal; | |||
|  |                 paddingBottom = style.padding.bottom; | |||
|  |             } | |||
|  | 
 | |||
|  |             foreach( var block in mBlocks ) | |||
|  |             { | |||
|  |                 block.Arrange( context, pos, maxWidth ); | |||
|  |                 pos.y += block.Rect.height; | |||
|  |             } | |||
|  | 
 | |||
|  |             Rect.height = pos.y - Rect.position.y + paddingBottom; | |||
|  |         } | |||
|  | 
 | |||
|  |         public override void Draw( Context context ) | |||
|  |         { | |||
|  |             if( Highlight && !Quoted ) | |||
|  |             { | |||
|  |                 GUI.Box( Rect, string.Empty, GUI.skin.GetStyle( "blockcode" ) ); | |||
|  |             } | |||
|  | 
 | |||
|  |             mBlocks.ForEach( block => block.Draw( context ) ); | |||
|  | 
 | |||
|  |             if( Highlight && Quoted ) | |||
|  |             { | |||
|  |                 GUI.Box( Rect, string.Empty, GUI.skin.GetStyle( "blockquote" ) ); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         public void RemoveTrailingSpace() | |||
|  |         { | |||
|  |             if( mBlocks.Count > 0 && mBlocks[ mBlocks.Count - 1 ] is BlockSpace ) | |||
|  |             { | |||
|  |                 mBlocks.RemoveAt( mBlocks.Count - 1 ); | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | } |