Skip to content

Instantly share code, notes, and snippets.

@gNikro

gNikro/Style.as Secret

Last active October 5, 2015 23:41
Show Gist options
  • Save gNikro/cba77bd96ce38389b043 to your computer and use it in GitHub Desktop.
Save gNikro/cba77bd96ce38389b043 to your computer and use it in GitHub Desktop.
package ui.style
{
import core.fileSystem.IFS;
import core.utils.Cast;
public class Style
{
//Инжектит файловую систему сюда
[Inject]
public var vfs:IFS;
//Хранилище стилей
public var styles:Object = { };
public function Style()
{
//Вызываем инжектилку
inject(this);
}
/**
* Оверрайдим другой стиль при этом заменяя в нем поля такие как у нас
* @param style
*/
public function overrideStyle(style:Style):void
{
for (var fieldName:String in style.styles)
this.styles[fieldName] = style.styles[fieldName];
}
/**
* При парсинге стиля из файла создаем таблицу стиля
* @param value
* @param key
*/
public function addStyleKey(value:String, key:String):void
{
this.styles[value] = processStyleValue(key);
}
/**
* Парсим стиль
* @param styles
*/
public function fillStyle(styles:Vector.<String>):void
{
var styleValueString:String
var styleKey:String;
var styleString:String;
var stylesParts:Array;
for (var i:int = 0; i < styles.length; i++)
{
styleString = styles[i];
//разбиваем пары значений все такое
var splitterIndex:int = styleString.indexOf('=');
styleKey = styleString.substr(0, splitterIndex);
styleValueString = styleString.substr(splitterIndex + 1);
this.styles[styleKey] = processStyleValue(styleValueString)
}
}
/**
* Аплим поле стиля на соотвествующее ему поле объекта и инжектим туда нужный объект
* @param objToApply
* @param styleKey
* @param fieldName
*/
public function applyStyle(objToApply:Object, styleKey:String, fieldName:String):void
{
if(fieldName in objToApply && styleKey in styles)
objToApply[fieldName] = styles[styleKey];
}
/**
* Процессим стайл вэлью т.к это может быть строка, номер, объект и т.д В данном случае это строка, номер, объект из файловой системы
* @param styleValueString
* @return
*/
private function processStyleValue(styleValueString:String):*
{
var isLink:Boolean = styleValueString.charAt(0) == '@';
if (isLink)
return vfs.getFile(styleValueString.substr(1)).content;
else
{
if (styleValueString == "true")
return true;
else if (styleValueString == "false")
return false;
return styleValueString;
}
}
/**
* Возвращаем значения в поле стилей по ключу например getStyleElement("width")//100
* @param key
* @return
*/
public function getStyleElement(key:String):*
{
if (styles.hasOwnProperty(key))
return styles[key];
else
return null;
}
}
}
package ui.style
{
import core.collections.Iterable;
public class StyleSheet
{
private var _styles:Iterable = new Iterable();
public function StyleSheet()
{
}
public function bindStyle(styleKey:String, fieldToBind:String):void
{
_styles.addItem(styleKey, fieldToBind);
}
public function get styles():Iterable
{
return _styles;
}
}
}
/**
* Вызвается перед <code>applyStyle</code> для добавления или замещение полей в стиль компонента
*/
protected function buildStyleSheet():void
{
}
/**
* Добавляет поле стиля в таблицу стилей
* @param styleKey
* @param fieldToBind
*/
public function addStyleSheet(styleKey:String, fieldToBind:String):void
{
styleSheet.bindStyle(styleKey, fieldToBind);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment