От нечего делать набросал немного бесполезного кода по мотивам Arctic. Это была такая gui-библиотека для haXe. Да, собственно, и сейчас есть (и судя по комитам она активно развивается). Просто я возился с ней года два назад, а сегодня она мне чего-то вспомнилась.
Вспомнилась, потому что я подумал, как удобнее всего строить gui без mxml. И там это выглядит примерно так:
package
{
import flash.display.Sprite;
import yzh.*;
public class MyApp extends Sprite
{
public function MyApp()
{
addChild(new Box().init([
new Label('Label 1'),
new Box().init([
new Label('Label 2'),
new Box().init([
new Label('Label 3'),
new Label('Label 4'),
new Label('Label 5')
]),
new Label('Label 6'),
new Label('Label 7')
]),
new Label('Label 8'),
new Label('Label 9')
]).sp);
}
}
}
А если не примерно, а точно, то вот так. Ну как, клева, не?
Ну и остальной код, нужный, чтобы заработал код выше :)
yzh.IComponent
package yzh
{
import flash.display.Sprite;
public interface IComponent
{
function get sp() : Sprite;
function get x() : Number;
function get y() : Number;
function get w() : Number;
function get h() : Number;
function place(x : Number, y : Number) : void
}
}
yzh.Component
package yzh
{
import flash.display.Sprite;
public class Component implements IComponent
{
// properties
protected var _sp : Sprite = null;
public function get sp() : Sprite
{ return _sp; }
public function get x() : Number { return sp.x; }
public function get y() : Number { return sp.y; }
public function get w() : Number { return sp.width; }
public function get h() : Number { return sp.height; }
// constructor
public function Component()
{
render();
}
// methods
public function place(x : Number, y : Number) : void
{
sp.x = x;
sp.y = y;
}
protected function render() : void
{
if(_sp == null) _sp = new Sprite;
}
public function toString() : String
{ return 'Component'; }
}
}
yzh.Label
package yzh
{
import flash.text.TextField;
public class Label extends Component
{
// properties
protected var _tf : TextField = null;
protected var _text : String = 'Label';
public function get text() : String
{ return _text; }
public function set text(value : String) : void
{
_text = value;
_tf.text = value;
}
// constructor
public function Label(text : String = null)
{
if(text) this.text = text;
}
// methods
protected override function render() : void
{
super.render();
if(_tf == null)
{
_tf = new TextField();
_tf.width = 100;
_tf.height = 20;
_tf.border = true;
_sp.addChild(_tf);
}
}
public override function toString() : String
{ return 'Label'; }
}
}
yzh.IContainer
package yzh
{
public interface IContainer extends IComponent
{
function get children() : Array
function set children(value : Array) : void
function add(child : IComponent) : void
}
}
yzh.Container
package yzh
{
public class Container extends Component implements IContainer
{
// properties
protected var _children : Array = [];
public function get children():Array
{ return _children; }
public function set children(value:Array):void
{
for each(var child : IComponent in value) add(child);
}
// methods
public function add(child : IComponent) : void
{
_children.push(child);
sp.addChild(child.sp);
}
public override function toString() : String
{ return 'Container'; }
}
}
yzh.Box
package yzh
{
import flash.display.Graphics;
public class Box extends Container
{
// properties
public var gap : int = 5;
public var paddingLeft : int = 10;
protected var _nextY : int = 0;
protected var _maxW : int = 0;
// methods
public function init(children : Array) : Box
{
this.children = children;
render();
return this;
}
public override function add(child : IComponent) : void
{
super.add(child);
child.place(paddingLeft, _nextY);
_nextY += child.h + gap;
_maxW = Math.max(_maxW, child.w);
}
protected override function render() : void
{
super.render();
var g : Graphics = _sp.graphics;
g.clear();
g.beginFill(0xff0000, 0.2);
g.drawRect(0, 0, _maxW + paddingLeft, _nextY);
g.endFill();
}
public override function toString() : String
{ return 'Box'; }
}
}
Да, делал все это на нетбуке, в хакинтоше, в IDEA. IDEA на маке выглядит красивее. Шрифты клевые. Keymap оставил оригинальный для мака. Он сильно отличается от того, с которым я обычно работаю на линуксе. Но ничего, если привыкнуть, то удобно.
IDEA на маленьком мониторе в принципе юзабельна. Не для больших объемов кода, конечно. Мощности нетбука вполне хватает, чтобы тянуть IDEA с этим проектом. Сколько раз я жаловался на медленную компиляцию? Так вот, компилировалось быстро :) Вот что значит мало кода. Отсюда вывод -- нужно работать с мелкими модулями, а не с монолитными монструозными проектами на N сотен классов.

Я для себя сделал в чистых AS
Я для себя сделал в чистых AS проектах такой метод для постороения UI
createUIChild( UIClass : Class, params : Object = null, parentObject : DisplayObjectContainer = null, addIndex : uint = 999, listen : Boolean = true )
Пример использования createUIChild(TextField, <ui name="txt" x="232" y="427" width="84" height="23" font="Arial" size="14" color="0xffffff" />);
значения можно отдавать и так <ui x={this.x} />
В коде выглядит довольно лаконично и чем-то похоже на тот-же mxml.