[gui] add LayoutSkin

This commit is contained in:
2019-03-20 17:35:50 +03:00
parent 7a1a98daf3
commit 58674f3572
10 changed files with 94 additions and 29 deletions

View File

@@ -39,6 +39,7 @@ class GroupView extends SpriteView implements IGroupView {
} }
override public function update():Void { override public function update():Void {
super.update();
layout.place(this, views); layout.place(this, views);
for (view in views) { for (view in views) {
view.update(); view.update();
@@ -46,7 +47,6 @@ class GroupView extends SpriteView implements IGroupView {
content.setChildIndex(view.content, view.index); content.setChildIndex(view.content, view.index);
} }
} }
super.update();
} }
public function set_views(value:Array<IView<Dynamic>>):Array<IView<Dynamic>> { public function set_views(value:Array<IView<Dynamic>>):Array<IView<Dynamic>> {

View File

@@ -1,5 +1,7 @@
package haxework.gui; package haxework.gui;
import haxework.gui.layout.ILayout;
import haxework.gui.layout.Layout;
import flash.text.TextField; import flash.text.TextField;
import flash.text.TextFieldAutoSize; import flash.text.TextFieldAutoSize;
import flash.text.TextFormat; import flash.text.TextFormat;
@@ -9,18 +11,11 @@ import haxework.gui.core.VAlign;
import haxework.text.BitmapTextField; import haxework.text.BitmapTextField;
import haxework.text.TextUtil; import haxework.text.TextUtil;
class TextLayout {
public var hAlign(default, default):HAlign = NONE;
public var vAlign(default, default):VAlign = NONE;
public function new() {}
}
class TextView extends SpriteView implements ITextView { class TextView extends SpriteView implements ITextView {
public var textField(default, null):TextField; public var textField(default, null):TextField;
public var text(get, set):String; public var text(get, set):String;
public var layout:TextLayout; public var layout:ILayout;
private var _text:String; private var _text:String;
public var align(default, set):TextFormatAlign; public var align(default, set):TextFormatAlign;
@@ -39,7 +34,7 @@ class TextView extends SpriteView implements ITextView {
public function new() { public function new() {
super(); super();
layout = new TextLayout(); layout = new Layout();
textField = buildTextField(); textField = buildTextField();
textField.width = 1; textField.width = 1;
textField.height = 1; textField.height = 1;

View File

@@ -60,7 +60,14 @@ class View<C:DisplayObject> implements IView<C> {
} }
} }
public function update():Void {} public function update():Void {
/*for (skin in this.skin) {
if (Std.is(skin, ISizeSkin)) {
var sizeSkin:ISizeSkin = cast skin;
setContentSize(sizeSkin.width, sizeSkin.height, "skin");
}
}*/
}
public function redraw():Void { public function redraw():Void {
for (skin in this.skin) { for (skin in this.skin) {

View File

@@ -35,11 +35,14 @@ class ViewUpdater {
} }
} }
public function isUpdate(view:IView<Dynamic>):Bool {
return updateViews.indexOf(view) > -1;
}
public function update():Void { public function update():Void {
var repeat = 0; var repeat = 0;
while (updateViews.length > 0) { while (updateViews.length > 0) {
var v = null; var v = updateViews.shift();
v = updateViews.shift();
var count = updateViews.length; var count = updateViews.length;
v.update(); v.update();
if (updateViews.length > count) { if (updateViews.length > count) {
@@ -54,8 +57,7 @@ class ViewUpdater {
public function redraw():Void { public function redraw():Void {
while (redrawViews.length > 0) { while (redrawViews.length > 0) {
var v = null; var v = redrawViews.shift();
v = redrawViews.shift();
v.redraw(); v.redraw();
} }
} }

View File

@@ -70,6 +70,7 @@ class FrameSwitcher extends GroupView {
views = []; views = [];
if (value.length > 0) { if (value.length > 0) {
for (view in value) { for (view in value) {
view.geometry.size.stretch = true;
frames.set(view.id, view); frames.set(view.id, view);
} }
} }

View File

@@ -1,23 +1,12 @@
package haxework.gui.layout; package haxework.gui.layout;
import haxework.gui.core.Geometry.Position; import haxework.gui.core.Geometry;
import haxework.gui.core.Geometry.SizeValue;
import haxework.gui.core.VAlign; import haxework.gui.core.VAlign;
import haxework.gui.core.HAlign; import haxework.gui.core.HAlign;
class DefaultLayout implements ILayout { class DefaultLayout extends Layout {
public var hAlign(default, default):HAlign; override public function place(group:IGroupView, views:Array<IView<Dynamic>>):Void {
public var vAlign(default, default):VAlign;
public var margin(default, default):Float;
public function new() {
hAlign = NONE;
vAlign = NONE;
margin = 0;
}
public function place(group:IGroupView, views:Array<IView<Dynamic>>):Void {
for (view in views) { for (view in views) {
setViewWidth(group, view); setViewWidth(group, view);
setViewHeight(group, view); setViewHeight(group, view);

View File

@@ -9,4 +9,8 @@ interface ILayout {
public var margin(default, default):Float; public var margin(default, default):Float;
public function place(group:IGroupView, views:Array<IView<Dynamic>>):Void; public function place(group:IGroupView, views:Array<IView<Dynamic>>):Void;
public function setAlign(hAlign:HAlign, vAlign:VAlign):ILayout;
public function setMargin(margin:Float):ILayout;
} }

View File

@@ -0,0 +1,29 @@
package haxework.gui.layout;
import haxework.gui.core.VAlign;
import haxework.gui.core.HAlign;
class Layout implements ILayout {
public var hAlign(default, default):HAlign;
public var vAlign(default, default):VAlign;
public var margin(default, default):Float;
public function new() {
hAlign = NONE;
vAlign = NONE;
margin = 0;
}
public function place(group:IGroupView, views:Array<IView<Dynamic>>):Void {}
public function setAlign(hAlign:HAlign, vAlign:VAlign):ILayout {
this.hAlign = hAlign;
this.vAlign = vAlign;
return this;
}
public function setMargin(margin:Float):ILayout {
this.margin = margin;
return this;
}
}

View File

@@ -0,0 +1,33 @@
package haxework.gui.skin;
import haxework.gui.core.HAlign;
import haxework.gui.core.VAlign;
import haxework.gui.layout.ILayout;
class LayoutSkin implements ISkin<IGroupView> {
private var layout(default, default):ILayout;
public function new(layout:ILayout) {
this.layout = layout;
}
public function draw(view:IGroupView):Void {
var updated = false;
if (layout.margin > 0 && view.layout.margin != layout.margin) {
view.layout.margin = layout.margin;
updated = true;
}
if (layout.hAlign != NONE && layout.hAlign != view.geometry.hAlign) {
view.layout.hAlign = layout.hAlign;
updated = true;
}
if (layout.vAlign != NONE && layout.vAlign != view.geometry.vAlign) {
view.layout.vAlign = layout.vAlign;
updated = true;
}
if (updated) {
view.toUpdate();
}
}
}

View File

@@ -1,5 +1,6 @@
package haxework.gui.skin; package haxework.gui.skin;
import haxework.gui.layout.ILayout;
import haxework.gui.core.Geometry; import haxework.gui.core.Geometry;
import flash.display.BitmapData; import flash.display.BitmapData;
@@ -48,4 +49,8 @@ class Skin {
public static function geometry(geometry:Geometry):GeometrySkin { public static function geometry(geometry:Geometry):GeometrySkin {
return new GeometrySkin(geometry); return new GeometrySkin(geometry);
} }
public static function layout(layout:ILayout):LayoutSkin {
return new LayoutSkin(layout);
}
} }