ngui-tools
Version:
A GUI typesetting display engine and cross platform GUI application development framework based on NodeJS/OpenGL
356 lines (341 loc) • 9.04 kB
JavaScript
/* ***** BEGIN LICENSE BLOCK *****
* Distributed under the BSD license:
*
* Copyright (c) 2015, xuewen.chu
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of xuewen.chu nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL xuewen.chu BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ***** END LICENSE BLOCK ***** */
export process.binding('ngui_action');
import './util';
import './value';
const { Action, SpawnAction, SequenceAction, KeyframeAction } = exports;
/**
* @class Frame
*
* @func fetch([view]) fetch style attribute by view
* @arg [view] {View}
*
* @func flush() flush frame restore default values
*
* @get index {uint} frame index in action
* @get,set time {uint} ms
* @get host {KeyframeAction}
* @get,set curve {Curve}
* @get,set width {Value|float}
* @get,set height {Value|float}
* @get,set x {float}
* @get,set y {float}
* @get,set scaleX {float}
* @get,set scaleY {float}
* @get,set skewX {float}
* @get,set skewY {float}
* @get,set originX {float}
* @get,set originY {float}
* @get,set rotateZ {float}
* @get,set opacity {float}
* @get,set visible {bool}
* @get,set marginLeft {Value}
* @get,set marginTop {Value}
* @get,set marginRight {Value}
* @get,set marginBottom {Value}
* @get,set borderLeftWidth {float}
* @get,set borderTopWidth {float}
* @get,set borderRightWidth {float}
* @get,set borderBottomWidth {float}
* @get,set borderLeftColor {Color}
* @get,set borderTopColor {Color}
* @get,set borderRightColor {Color}
* @get,set borderBottomColor {Color}
* @get,set borderRadiusLeftTop {float}
* @get,set borderRadiusRightTop {float}
* @get,set borderRadiusRightBottom {float}
* @get,set borderRadiusLeftBottom {float}
* @get,set backgroundColor {Color}
* @get,set background {Background}
* @get,set backgroundImage {String}
* @get,set backgroundPosition {BackgroundPosition}
* @get,set backgroundPositionX {BackgroundPosition}
* @get,set backgroundPositionY {BackgroundPosition}
* @get,set backgroundSize {BackgroundSize}
* @get,set backgroundSizeX {BackgroundSize}
* @get,set backgroundSizeY {BackgroundSize}
* @get,set newline {bool}
* @get,set clip {bool}
* @get,set contentAlign {ContentAlign}
* @get,set textAlign {TextAlign}
* @get,set maxWidth {Value}
* @get,set maxHeight {Value}
* @get,set startX {float}
* @get,set startY {float}
* @get,set ratioX {float}
* @get,set ratioY {float}
* @get,set repeat {Repeat}
* @get,set textBackgroundColor {TextColor}
* @get,set textColor {TextColor}
* @get,set textSize {TextSize}
* @get,set textStyle {TextStyle}
* @get,set textFamily {TextFamily}
* @get,set textLineHeight {TextLineHeight}
* @get,set textShadow {TextShadow}
* @get,set textDecoration {TextDecoration}
* @get,set textOverflow {TextOverflow}
* @get,set textWhiteSpace {TextWhiteSpace}
* @get,set alignX {Align}
* @get,set alignY {Align}
* @get,set align {Align}
* @get,set shadow {ShadowValue}
* @get,set src {String}
* @get,set translate {Vec2}
* @get,set scale {Vec2}
* @get,set skew {Vec2}
* @get,set origin {Vec2}
* @get,set margin {Value}
* @get,set border {Border}
* @get,set borderLeft {Border}
* @get,set borderTop {Border}
* @get,set borderRight {Border}
* @get,set borderBottom {Border}
* @get,set borderWidth {float}
* @get,set borderColor {Color}
* @get,set borderRadius {float}
* @get,set minWidth {Value}
* @get,set minHeight {Value}
* @get,set start {Vec2}
* @get,set ratio {Vec2}
*
* @end
*/
/**
* LINEAR = 0
* EASE = 1
* EASE_IN = 2
* EASE_OUT = 3
* EASE_IN_OUT = 4
*/
/**
* @func create(json[,parent])
* @arg json {Object|Action}
* @arg [parent] {GroupAction}
* @ret {Action}
*/
export function create(json, parent) {
var action = null;
if ( typeof json == 'object' ) {
if ( json instanceof Action ) {
action = json;
} else {
// create
if ( Array.isArray(json) ) { // KeyframeAction
action = new KeyframeAction();
for (var i of json)
action.add(i);
} else {
if (json.seq) { // SequenceAction
action = new SequenceAction();
for (var i in json)
action[i] = json[i];
var seq = json.seq;
if (Array.isArray(seq)) {
for (var i of seq) {
create(i, action);
}
} else {
create(seq, action);
}
} else if (json.spawn) { // SpawnAction
action = new SpawnAction();
for (var i in json)
action[i] = json[i];
var spawn = json.spawn;
if (Array.isArray(spawn)) {
for (var i of spawn) {
create(i, action);
}
} else {
create(spawn, action);
}
} else { // KeyframeAction
action = new KeyframeAction();
for (var i in json)
action[i] = json[i];
var frame = json.keyframe;
if ( Array.isArray(frame) ) {
for (var i of frame)
action.add(i);
} else {
action.add(frame);
}
}
}
// end craete
}
if ( parent ) { // Cannot be KeyframeAction type
parent.append(action);
}
}
return action;
}
/**
* @func transition(view,style[,delay[,cb]][,cb])
* @arg view {View}
* @arg style {Object}
* @arg [delay] {uint} ms
* @arg [cb] {Function}
* @ret {KeyframeAction}
*/
export function transition(view, style, delay, cb) {
var action = new KeyframeAction();
if ( typeof delay == 'number' ) {
action.delay = delay;
} else if ( typeof delay == 'function' ) {
cb = delay;
}
action.add(); // add frame 0
action.add(style); // add frame 1
view.setAction(action);
action.frame(0).fetch(); // fetch 0 frame style
if ( typeof cb == 'function' ) {
view.onActionKeyframe.on(function(evt) {
//console.log('onActionKeyframe');
if ( evt.action === action ) {
if (evt.frame != 1) return;
cb(evt); // end
}
view.onActionKeyframe.off(-1);
}, -1);
}
action.play(); // start play
return action;
}
/**
* @class Action abstract class
*
* @func play()
*
* @func stop()
*
* @func seek(ms)
* @arg ms {int}
*
* @func seekPlay(ms)
* @arg ms {int}
*
* @func seekStop(ms)
* @arg ms {int}
*
* @func clear()
*
* @get,set loop {int}
*
* @get loopd {uint}
*
* @get,set delay {uint} ms
*
* @get delayd {uint} ms
*
* @get,set speed {float} 0.1-10
*
* @get,set playing {bool}
*
* @get duration {uint} ms
*
* @get parent {Action}
*
* @end
*/
/**
* @class GroupAction abstract class
* @bases Action
*
* @get length {uint}
*
* @func append(child)
* @arg child {Action}
*
* @func insert(index, child)
* @arg index {uint}
* @arg child {Action}
*
* @func removeChild(index)
* @arg index {uint}
*
* @func children(index)
* @arg index {uint}
* @ret {Action} return child action
*
* @end
*/
/**
* @class SpawnAction
*
* @func spawn(index)
* @arg index {uint}
* @ret {Action} return child action
*
* @bases GroupAction
*/
/**
* @class SequenceAction
*
* @func seq(index)
* @arg index {uint}
* @ret {Action} return child action
*
* @bases GroupAction
*/
/**
* @class KeyframeAction
* @bases Action
*
* @func hasProperty(name)
* @arg name {emun PropertyName}
* @ret {bool}
*
* @func matchProperty(name)
* @arg name {emun PropertyName}
* @ret {bool}
*
* @func frame(index)
* @arg index {uint}
* @ret {Frame}
*
* @func add([time[,curve]][style])
* arg [time=0] {uint}
* arg [curve] {Curve}
* arg [style] {Object}
* @ret {Frame}
*
* @get first {Frame}
*
* @get last {Frame}
*
* @get length {uint}
*
* @get position {int} get play frame position
*
* @get time {uint} ms get play time position
*
* @end
*/