[view] add style meta to Layout

This commit is contained in:
2019-07-16 17:56:01 +03:00
parent 451b107f6b
commit 37e6f3d7f8
6 changed files with 18 additions and 64 deletions

View File

@@ -4,11 +4,11 @@ import flash.display.DisplayObjectContainer;
import haxework.view.layout.DefaultLayout; import haxework.view.layout.DefaultLayout;
import haxework.view.layout.ILayout; import haxework.view.layout.ILayout;
class GroupView extends SpriteView implements IGroupView { @:style(true) class GroupView extends SpriteView implements IGroupView {
public var container(get, null):DisplayObjectContainer; public var container(get, null):DisplayObjectContainer;
public var views(default, set):Array<IView<Dynamic>>; public var views(default, set):Array<IView<Dynamic>>;
public var layout(default, default):ILayout; @:style public var layout(default, default):ILayout;
public function new(?layout:ILayout) { public function new(?layout:ILayout) {
super(); super();

View File

@@ -4,7 +4,7 @@ import flash.display.DisplayObjectContainer;
import haxework.view.layout.ILayout; import haxework.view.layout.ILayout;
interface IGroupView extends IView<Dynamic> { interface IGroupView extends IView<Dynamic> {
@:style public var layout(default, default):ILayout; public var layout(default, set):ILayout;
public var container(get, null):DisplayObjectContainer; public var container(get, null):DisplayObjectContainer;
public var views(default, set):Array<IView<Dynamic>>; public var views(default, set):Array<IView<Dynamic>>;

View File

@@ -3,12 +3,13 @@ package haxework.view.layout;
import haxework.view.geometry.HAlign; import haxework.view.geometry.HAlign;
import haxework.view.geometry.VAlign; import haxework.view.geometry.VAlign;
import haxework.view.group.IGroupView; import haxework.view.group.IGroupView;
import haxework.view.theme.IStylable;
interface ILayout { interface ILayout extends IStylable {
public var hAlign(default, default):HAlign; public var hAlign(get, set):HAlign;
public var vAlign(default, default):VAlign; public var vAlign(get, set):VAlign;
public var margin(default, default):Float; public var margin(get, set):Null<Float>;
public var overflow(default, default):Bool; public var overflow(get, set):Null<Bool>;
public function place(group:IGroupView, views:Array<IView<Dynamic>>):Void; public function place(group:IGroupView, views:Array<IView<Dynamic>>):Void;

View File

@@ -4,17 +4,15 @@ import haxework.view.geometry.HAlign;
import haxework.view.geometry.VAlign; import haxework.view.geometry.VAlign;
import haxework.view.group.IGroupView; import haxework.view.group.IGroupView;
class Layout implements ILayout { @:style class Layout implements ILayout {
public var hAlign(default, default):HAlign; @:style(HAlign.NONE) public var hAlign(default, default):HAlign;
public var vAlign(default, default):VAlign; @:style(VAlign.NONE) public var vAlign(default, default):VAlign;
public var margin(default, default):Float; @:style(0) public var margin(default, default):Null<Float>;
public var overflow(default, default):Bool; @:style(false) public var overflow(default, default):Null<Bool>;
public function new() { public function new() {
hAlign = NONE;
vAlign = NONE;
margin = 0;
} }
public function place(group:IGroupView, views:Array<IView<Dynamic>>):Void {} public function place(group:IGroupView, views:Array<IView<Dynamic>>):Void {}

View File

@@ -13,7 +13,7 @@ using haxework.color.ColorUtil;
@:style class ButtonColorSkin implements ISkin<ButtonView> { @:style class ButtonColorSkin implements ISkin<ButtonView> {
@:style(0xffffff) public var color(default, default):Null<Color>; @:style(0xffffff) public var color(default, default):Null<Color>;
public var borderColor(default, default):Null<Color>; @:style(null) public var borderColor(default, default):Null<Color>;
public var round(default, default):Float; public var round(default, default):Float;
private var colors:Map<ButtonState, Int>; private var colors:Map<ButtonState, Int>;
@@ -24,7 +24,7 @@ using haxework.color.ColorUtil;
} }
public function draw(view:ButtonView):Void { public function draw(view:ButtonView):Void {
var color = color; var color:Color = stateColor(color, view.state);
var borderColor:Color = borderColor != null ? borderColor : color.multiply(1.5); var borderColor:Color = borderColor != null ? borderColor : color.multiply(1.5);
if (Std.is(view, ToggleButtonView)) { if (Std.is(view, ToggleButtonView)) {
if (!cast(view, ToggleButtonView).on) { if (!cast(view, ToggleButtonView).on) {

View File

@@ -2,58 +2,15 @@ package haxework.view.theme;
import flash.text.Font; import flash.text.Font;
import flash.text.FontType; import flash.text.FontType;
import haxe.ds.StringMap;
import haxework.color.Color; import haxework.color.Color;
import haxework.signal.Signal; import haxework.signal.Signal;
import haxework.view.geometry.Box; import haxework.view.geometry.Box;
import haxework.view.geometry.SizeValue; import haxework.view.geometry.SizeValue;
import haxework.view.skin.ButtonColorSkin;
import haxework.view.skin.TabColorSkin; import haxework.view.skin.TabColorSkin;
import haxework.view.theme.ITheme; import haxework.view.theme.ITheme;
using haxework.color.ColorUtil; using haxework.color.ColorUtil;
typedef StyleSet = Array<IStyle<Dynamic>>;
class StyleMap extends StringMap<StyleSet> {
private var views:Map<IView<Dynamic>, String> = new Map();
private var viewsByStyle:Map<String, Array<IView<Dynamic>>> = new Map();
private function apply(styles:StyleSet, view:IView<Dynamic>):Void {
for (item in styles) {
item.apply(view);
}
}
public function put(key:String, value:StyleSet):Void {
set(key, value);
if (viewsByStyle.exists(key)) {
for (view in viewsByStyle.get(key)) {
apply(value, view);
}
}
}
public function connect(key:String, view:IView<Dynamic>):Void {
disconnect(view);
if (!viewsByStyle.exists(key)) {
viewsByStyle.set(key, []);
}
viewsByStyle.get(key).push(view);
if (exists(key)) {
apply(get(key), view);
}
}
public function disconnect(view:IView<Dynamic>):Void {
if (views.exists(view)) {
viewsByStyle.get(views.get(view)).remove(view);
views.remove(view);
}
}
}
class Theme implements ITheme { class Theme implements ITheme {
// ToDo: configurable // ToDo: configurable
public var baseFontSize = 18; public var baseFontSize = 18;
@@ -130,12 +87,11 @@ class Theme implements ITheme {
"geometry.padding" => Box.fromArray([8, 2]), "geometry.padding" => Box.fromArray([8, 2]),
], ["text"])); ], ["text"]));
data.set("button", create([ data.set("button", create([
"skin" => function() return new ButtonColorSkin(),
"skin.color" => colors.light, "skin.color" => colors.light,
"geometry.padding" => Box.fromArray([25, 8]), "geometry.padding" => Box.fromArray([25, 8]),
], ["text"])); ], ["text"]));
data.set("button.active", create([ data.set("button.active", create([
"skin.color" => colors.active, "skin.borderColor" => colors.active,
], ["button"])); ], ["button"]));
data.set("button.tab", create([ data.set("button.tab", create([
"skin" => function() return new TabColorSkin(), "skin" => function() return new TabColorSkin(),
@@ -166,7 +122,6 @@ class Theme implements ITheme {
} }
public function resolve<T>(key:String, style:StyleId):T { public function resolve<T>(key:String, style:StyleId):T {
trace("resolve", key, style != null ? style : "");
var result:Dynamic = style != null && data.exists(style) ? data.get(style).get(key) : null; var result:Dynamic = style != null && data.exists(style) ? data.get(style).get(key) : null;
if (Reflect.isFunction(result)) { if (Reflect.isFunction(result)) {
result = result(); result = result();