Skip to main content

Немного бесполезного кода

Posted in

От нечего делать набросал немного бесполезного кода по мотивам 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 сотен классов.

No votes yet

Я для себя сделал в чистых 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.