From 24432f1b91faa5346b1f707d42c6600c80c4f5ae Mon Sep 17 00:00:00 2001 From: andreas Date: Fri, 11 Jun 2021 13:17:49 +0200 Subject: [PATCH] Implemented UIPane --- hGameTest/src/game/ui/UIPane.hx | 263 ++++++++++++++++++++++++++++++-- 1 file changed, 253 insertions(+), 10 deletions(-) diff --git a/hGameTest/src/game/ui/UIPane.hx b/hGameTest/src/game/ui/UIPane.hx index 873491d2..77f9b731 100644 --- a/hGameTest/src/game/ui/UIPane.hx +++ b/hGameTest/src/game/ui/UIPane.hx @@ -1,15 +1,258 @@ package game.ui; -class UIPane{ - public static var paneList:Array=[]; - public var x:Int; - public var y:Int; - public var width:Int; - public var height:Int; - public var parent:UIPane; - - public function new(){ +import openfl.display.Sprite; +import openfl.display.BitmapData; +import openfl.display.DisplayObject; +import openfl.text.TextField; +typedef P2d = { + x:Float, + y:Float +} +enum PaneLayout{ + HORIZONTAL; + VERTICAL; +} +enum PaneAnchor{ + LEFT; + TOPLEFT; + TOP; + TOPRIGHT; + RIGHT; + BOTTOMLEFT; + BOTTOM; + BOTTOMRIGHT; +} +enum ExpandBehavior{ + FACTOR; + ABSOLUTE; + STRETCH; + FILL; + FIT; + NONE; +} +enum PaneAlign{ + START; + END; +} + +typedef PaneDimensions = { + var width:Float; + var height:Float; + @:optional var expandBehavior:ExpandBehavior; + @:optional var minWidth:Float; + @:optional var minHeight:Float; + @:optional var maxWidth:Float; + @:optional var maxHeight:Float; +} + +typedef PaneProps = { + dimensions:PaneDimensions, + layout:PaneLayout +} + +class UIPane{ + public var name:String; + public var sprite:Sprite; + public var x(get, set):Float; + public var y(get, set):Float; + function get_x(){ return sprite.x; } + function set_x(x){ return sprite.x = x; } + function get_y(){ return sprite.y; } + function set_y(y){ return sprite.y = y; } + public var dimensions:PaneDimensions; + public var width(get,set):Float; + function get_width(){ + return dimensions.width; + } + function set_width(width){ + dimensions.width = width; + onResize(); + return width; + } + public var height(get,set):Float; + function get_height(){ + return dimensions.height; + } + function set_height(height){ + dimensions.height = height; + onResize(); + return height; + } + public var layout:PaneLayout; + public var autoArrange:Bool = true; + public var autoArrangeChildren = true; + public var expand:Bool; + public var children:Array = []; + public var parent:UIPane = null; + public var align:PaneAlign = START; + public var maskSprite:Sprite; + public function new(_name:String, _dimensions:PaneDimensions) + { + // Set name + name = _name; + // Set dimensions + if(_dimensions != null){ + dimensions = _dimensions; + } + else{ + dimensions = { + width: 0, + height: 0, + minWidth: 0, + minHeight: 0, + maxWidth: 0, + maxHeight: 0 + }; + } + + // Initialize Sprite + initSprite(); + // Draw debug pane for visualizing + //drawDebugPane(); + } + public function getAnchorOffset(anchor:PaneAnchor):P2d + { + switch(anchor){ + case LEFT: + return {x:0,y:(height/2)}; + case TOPLEFT: + return {x:0, y:0}; + case TOP: + return {x:width/2,y:0}; + case TOPRIGHT: + return {x:width, y:0}; + case RIGHT: + return {x:width, y:height/2} + case BOTTOMRIGHT: + return {x:width, y:height}; + case BOTTOM: + return {x:width/2, y:height}; + case BOTTOMLEFT: + return {x:0, y:height}; + } + } + public function initSprite():Void + { + + // Construct Sprite object + sprite = new Sprite(); + + // Draw mask + //maskSprite = new Sprite(); + //drawMask(); + //sprite.addChild(maskSprite); + //sprite.mask = maskSprite; } -} \ No newline at end of file + public function drawMask():Void + { + maskSprite.graphics.clear(); + maskSprite.graphics.beginFill(0xffffff); + maskSprite.graphics.drawRect(0,0,width,height); + } + + + public function drawDebugPane() + { + // Clear graphics + sprite.graphics.clear(); + // Create objects we need to draw. + var label:TextField = new TextField(); + var bmp = new BitmapData(Std.int(width),Std.int(height),true,0x00000000); + // Set textfield text to the panel name + label.text = name; + // Draw textfield to bitmap + bmp.draw(label); + // Draw graphics + sprite.graphics.beginFill(Std.int(Math.random()*0xffffff),0.5); + sprite.graphics.drawRect(0,0,dimensions.width,dimensions.height); + sprite.graphics.beginBitmapFill(bmp,null); + sprite.graphics.drawRect(0,0,dimensions.width,dimensions.height); + + if(true){ + sprite.graphics.beginFill(Std.int(Math.random()*0xffffff),0.5); + sprite.graphics.drawCircle(getAnchorOffset(TOPLEFT).x,getAnchorOffset(TOPLEFT).y,5); + sprite.graphics.drawCircle(getAnchorOffset(TOP).x,getAnchorOffset(TOP).y,5); + sprite.graphics.drawCircle(getAnchorOffset(TOPRIGHT).x,getAnchorOffset(TOPRIGHT).y,5); + sprite.graphics.drawCircle(getAnchorOffset(RIGHT).x,getAnchorOffset(RIGHT).y,5); + sprite.graphics.drawCircle(getAnchorOffset(BOTTOMRIGHT).x,getAnchorOffset(BOTTOMRIGHT).y,5); + sprite.graphics.drawCircle(getAnchorOffset(BOTTOM).x,getAnchorOffset(BOTTOM).y,5); + sprite.graphics.drawCircle(getAnchorOffset(BOTTOMLEFT).x,getAnchorOffset(BOTTOMLEFT).y,5); + sprite.graphics.drawCircle(getAnchorOffset(LEFT).x,getAnchorOffset(LEFT).y,5); + } + + } + public var endOffset:Float = 0; + public var startOffset:Float = 0; + public function addChild(child:UIPane) + { + children.push(child); + sprite.addChild(child.sprite); + child.parent = this; + if(child.autoArrange && autoArrangeChildren){ + arrangeChild(child); + } + return child; + } + public function redraw():Void + { + //drawDebugPane(); + //drawMask(); + } + public function onResize(){ + redraw(); + if(autoArrangeChildren){ + arrangeChildren(); + } + } + private function arrangeChild(child:UIPane){ + if(child.autoArrange){ + switch(layout){ + case HORIZONTAL: + if(endOffset == 0) endOffset = width; + switch(child.dimensions.expandBehavior){ + case STRETCH: + child.width = endOffset-startOffset; + child.height = height; + default: + child.height = height; + // + } + switch(child.align){ + case START: + child.x = startOffset; + startOffset += child.width; + case END: + child.x = endOffset-= child.width; + } + case VERTICAL: + if(endOffset == 0) endOffset = height; + switch(child.dimensions.expandBehavior){ + case STRETCH: + child.height = endOffset-startOffset; + child.width = width; + default: + child.width = width; + // + } + switch(child.align){ + case START: + child.y = startOffset; + startOffset += child.height; + case END: + child.y = endOffset-=child.height; + } + } + + } + } + public function arrangeChildren(){ + startOffset = 0; + endOffset = 0; + for(child in children){ + arrangeChild(child); + } + } + +}