2125 lines
64 KiB
JavaScript
2125 lines
64 KiB
JavaScript
'use strict';
|
||
|
||
Object.defineProperty(exports, '__esModule', { value: true });
|
||
|
||
function obj2Model(obj) {
|
||
if (obj instanceof Array) {
|
||
return obj.map(e => obj2Model(e));
|
||
}
|
||
else if (obj instanceof Object) {
|
||
if (Reflect.has(obj, 'toModel') && Reflect.get(obj, 'toModel') instanceof Function) {
|
||
obj = Reflect.apply(Reflect.get(obj, 'toModel'), obj, []);
|
||
return obj;
|
||
}
|
||
else {
|
||
for (let key in obj) {
|
||
const val = Reflect.get(obj, key);
|
||
Reflect.set(obj, key, obj2Model(val));
|
||
}
|
||
return obj;
|
||
}
|
||
}
|
||
else {
|
||
return obj;
|
||
}
|
||
}
|
||
class Mutable {
|
||
constructor(v) {
|
||
this.binders = new Set;
|
||
this.get = () => {
|
||
return this.val;
|
||
};
|
||
this.set = (v) => {
|
||
this.val = v;
|
||
this.binders.forEach(e => {
|
||
Reflect.apply(e, undefined, [this.val]);
|
||
});
|
||
};
|
||
this.val = v;
|
||
}
|
||
bind(binder) {
|
||
this.binders.add(binder);
|
||
Reflect.apply(binder, undefined, [this.val]);
|
||
}
|
||
static of(v) {
|
||
return new Mutable(v);
|
||
}
|
||
}
|
||
|
||
/*
|
||
* Copyright [2019] [Doric.Pub]
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
let __uniqueId__ = 0;
|
||
function uniqueId(prefix) {
|
||
return `__${prefix}_${__uniqueId__++}__`;
|
||
}
|
||
|
||
function toString(message) {
|
||
if (message instanceof Function) {
|
||
return message.toString();
|
||
}
|
||
else if (message instanceof Object) {
|
||
try {
|
||
return JSON.stringify(message);
|
||
}
|
||
catch (e) {
|
||
return message.toString();
|
||
}
|
||
}
|
||
else if (message === undefined) {
|
||
return "undefined";
|
||
}
|
||
else {
|
||
return message.toString();
|
||
}
|
||
}
|
||
function log(...args) {
|
||
let out = "";
|
||
for (let i = 0; i < arguments.length; i++) {
|
||
if (i > 0) {
|
||
out += ',';
|
||
}
|
||
out += toString(arguments[i]);
|
||
}
|
||
nativeLog('d', out);
|
||
}
|
||
function loge(...message) {
|
||
let out = "";
|
||
for (let i = 0; i < arguments.length; i++) {
|
||
if (i > 0) {
|
||
out += ',';
|
||
}
|
||
out += toString(arguments[i]);
|
||
}
|
||
nativeLog('e', out);
|
||
}
|
||
function logw(...message) {
|
||
let out = "";
|
||
for (let i = 0; i < arguments.length; i++) {
|
||
if (i > 0) {
|
||
out += ',';
|
||
}
|
||
out += toString(arguments[i]);
|
||
}
|
||
nativeLog('w', out);
|
||
}
|
||
|
||
var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
function Property(target, propKey) {
|
||
Reflect.defineMetadata(propKey, true, target);
|
||
}
|
||
class View {
|
||
constructor() {
|
||
this.width = 0;
|
||
this.height = 0;
|
||
this.x = 0;
|
||
this.y = 0;
|
||
this.viewId = uniqueId('ViewId');
|
||
this.callbacks = new Map;
|
||
/** Anchor end*/
|
||
this.__dirty_props__ = {};
|
||
this.nativeViewModel = {
|
||
id: this.viewId,
|
||
type: this.constructor.name,
|
||
props: this.__dirty_props__,
|
||
};
|
||
return new Proxy(this, {
|
||
get: (target, p, receiver) => {
|
||
return Reflect.get(target, p, receiver);
|
||
},
|
||
set: (target, p, v, receiver) => {
|
||
const oldV = Reflect.get(target, p, receiver);
|
||
const ret = Reflect.set(target, p, v, receiver);
|
||
if (Reflect.getMetadata(p, target) && oldV !== v) {
|
||
receiver.onPropertyChanged(p.toString(), oldV, v);
|
||
}
|
||
return ret;
|
||
}
|
||
});
|
||
}
|
||
callback2Id(f) {
|
||
const id = uniqueId('Function');
|
||
this.callbacks.set(id, f);
|
||
return id;
|
||
}
|
||
id2Callback(id) {
|
||
let f = this.callbacks.get(id);
|
||
if (f === undefined) {
|
||
f = Reflect.get(this, id);
|
||
}
|
||
return f;
|
||
}
|
||
/** Anchor start*/
|
||
get left() {
|
||
return this.x;
|
||
}
|
||
set left(v) {
|
||
this.x = v;
|
||
}
|
||
get right() {
|
||
return this.x + this.width;
|
||
}
|
||
set right(v) {
|
||
this.x = v - this.width;
|
||
}
|
||
get top() {
|
||
return this.y;
|
||
}
|
||
set top(v) {
|
||
this.y = v;
|
||
}
|
||
get bottom() {
|
||
return this.y + this.height;
|
||
}
|
||
set bottom(v) {
|
||
this.y = v - this.height;
|
||
}
|
||
get centerX() {
|
||
return this.x + this.width / 2;
|
||
}
|
||
get centerY() {
|
||
return this.y + this.height / 2;
|
||
}
|
||
set centerX(v) {
|
||
this.x = v - this.width / 2;
|
||
}
|
||
set centerY(v) {
|
||
this.y = v - this.height / 2;
|
||
}
|
||
get dirtyProps() {
|
||
return this.__dirty_props__;
|
||
}
|
||
onPropertyChanged(propKey, oldV, newV) {
|
||
if (newV instanceof Function) {
|
||
newV = this.callback2Id(newV);
|
||
}
|
||
else {
|
||
newV = obj2Model(newV);
|
||
}
|
||
this.__dirty_props__[propKey] = newV;
|
||
}
|
||
clean() {
|
||
for (const key in this.__dirty_props__) {
|
||
if (Reflect.has(this.__dirty_props__, key)) {
|
||
Reflect.deleteProperty(this.__dirty_props__, key);
|
||
}
|
||
}
|
||
}
|
||
isDirty() {
|
||
return Reflect.ownKeys(this.__dirty_props__).length !== 0;
|
||
}
|
||
responseCallback(id, ...args) {
|
||
const f = this.id2Callback(id);
|
||
if (f instanceof Function) {
|
||
const argumentsList = [];
|
||
for (let i = 1; i < arguments.length; i++) {
|
||
argumentsList.push(arguments[i]);
|
||
}
|
||
return Reflect.apply(f, this, argumentsList);
|
||
}
|
||
else {
|
||
loge(`Cannot find callback:${id} for ${JSON.stringify(this.toModel())}`);
|
||
}
|
||
}
|
||
toModel() {
|
||
return this.nativeViewModel;
|
||
}
|
||
let(block) {
|
||
block(this);
|
||
}
|
||
also(block) {
|
||
block(this);
|
||
return this;
|
||
}
|
||
apply(config) {
|
||
for (let key in config) {
|
||
Reflect.set(this, key, Reflect.get(config, key, config), this);
|
||
}
|
||
return this;
|
||
}
|
||
in(group) {
|
||
group.addChild(this);
|
||
return this;
|
||
}
|
||
nativeChannel(context, name) {
|
||
let thisView = this;
|
||
return function (args = undefined) {
|
||
const func = context.shader.command;
|
||
const viewIds = [];
|
||
while (thisView != undefined) {
|
||
viewIds.push(thisView.viewId);
|
||
thisView = thisView.superview;
|
||
}
|
||
const params = {
|
||
viewIds: viewIds.reverse(),
|
||
name,
|
||
args,
|
||
};
|
||
return Reflect.apply(func, undefined, [params]);
|
||
};
|
||
}
|
||
getWidth(context) {
|
||
return this.nativeChannel(context, 'getWidth')();
|
||
}
|
||
getHeight(context) {
|
||
return this.nativeChannel(context, 'getHeight')();
|
||
}
|
||
getLocationOnScreen(context) {
|
||
return this.nativeChannel(context, "getLocationOnScreen")();
|
||
}
|
||
/**----------transform----------*/
|
||
doAnimation(context, animation) {
|
||
return this.nativeChannel(context, "doAnimation")(animation.toModel()).then((args) => {
|
||
for (let key in args) {
|
||
Reflect.set(this, key, Reflect.get(args, key, args), this);
|
||
Reflect.deleteProperty(this.__dirty_props__, key);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "width", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "height", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "x", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "y", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Object)
|
||
], View.prototype, "backgroundColor", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Object)
|
||
], View.prototype, "corners", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Object)
|
||
], View.prototype, "border", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Object)
|
||
], View.prototype, "shadow", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "alpha", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Boolean)
|
||
], View.prototype, "hidden", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Object)
|
||
], View.prototype, "viewId", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Object)
|
||
], View.prototype, "padding", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Object)
|
||
], View.prototype, "layoutConfig", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Function)
|
||
], View.prototype, "onClick", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "translationX", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "translationY", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "scaleX", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "scaleY", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "pivotX", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "pivotY", void 0);
|
||
__decorate([
|
||
Property,
|
||
__metadata("design:type", Number)
|
||
], View.prototype, "rotation", void 0);
|
||
class Superview extends View {
|
||
subviewById(id) {
|
||
for (let v of this.allSubviews()) {
|
||
if (v.viewId === id) {
|
||
return v;
|
||
}
|
||
}
|
||
}
|
||
isDirty() {
|
||
if (super.isDirty()) {
|
||
return true;
|
||
}
|
||
else {
|
||
for (const v of this.allSubviews()) {
|
||
if (v.isDirty()) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
clean() {
|
||
for (let v of this.allSubviews()) {
|
||
v.clean();
|
||
}
|
||
super.clean();
|
||
}
|
||
toModel() {
|
||
const subviews = [];
|
||
for (let v of this.allSubviews()) {
|
||
if (v != undefined) {
|
||
v.superview = this;
|
||
if (v.isDirty()) {
|
||
subviews.push(v.toModel());
|
||
}
|
||
}
|
||
}
|
||
this.dirtyProps.subviews = subviews;
|
||
return super.toModel();
|
||
}
|
||
}
|
||
class Group extends Superview {
|
||
constructor() {
|
||
super(...arguments);
|
||
this.children = new Proxy([], {
|
||
set: (target, index, value) => {
|
||
const ret = Reflect.set(target, index, value);
|
||
// Let getDirty return true
|
||
this.dirtyProps.children = this.children.map(e => e.viewId);
|
||
return ret;
|
||
}
|
||
});
|
||
}
|
||
allSubviews() {
|
||
return this.children;
|
||
}
|
||
addChild(view) {
|
||
this.children.push(view);
|
||
}
|
||
}
|
||
|
||
const SPECIFIED = 1;
|
||
const START = 1 << 1;
|
||
const END = 1 << 2;
|
||
const SHIFT_X = 0;
|
||
const SHIFT_Y = 4;
|
||
const LEFT = (START | SPECIFIED) << SHIFT_X;
|
||
const RIGHT = (END | SPECIFIED) << SHIFT_X;
|
||
const TOP = (START | SPECIFIED) << SHIFT_Y;
|
||
const BOTTOM = (END | SPECIFIED) << SHIFT_Y;
|
||
const CENTER_X = SPECIFIED << SHIFT_X;
|
||
const CENTER_Y = SPECIFIED << SHIFT_Y;
|
||
const CENTER = CENTER_X | CENTER_Y;
|
||
class Gravity {
|
||
constructor() {
|
||
this.val = 0;
|
||
}
|
||
left() {
|
||
const val = this.val | LEFT;
|
||
const ret = new Gravity;
|
||
ret.val = val;
|
||
return ret;
|
||
}
|
||
right() {
|
||
const val = this.val | RIGHT;
|
||
const ret = new Gravity;
|
||
ret.val = val;
|
||
return ret;
|
||
}
|
||
top() {
|
||
const val = this.val | TOP;
|
||
const ret = new Gravity;
|
||
ret.val = val;
|
||
return ret;
|
||
}
|
||
bottom() {
|
||
const val = this.val | BOTTOM;
|
||
const ret = new Gravity;
|
||
ret.val = val;
|
||
return ret;
|
||
}
|
||
center() {
|
||
const val = this.val | CENTER;
|
||
const ret = new Gravity;
|
||
ret.val = val;
|
||
return ret;
|
||
}
|
||
centerX() {
|
||
const val = this.val | CENTER_X;
|
||
const ret = new Gravity;
|
||
ret.val = val;
|
||
return ret;
|
||
}
|
||
centerY() {
|
||
const val = this.val | CENTER_Y;
|
||
const ret = new Gravity;
|
||
ret.val = val;
|
||
return ret;
|
||
}
|
||
toModel() {
|
||
return this.val;
|
||
}
|
||
}
|
||
Gravity.origin = new Gravity;
|
||
Gravity.Center = Gravity.origin.center();
|
||
Gravity.Left = Gravity.origin.left();
|
||
Gravity.Right = Gravity.origin.right();
|
||
Gravity.Top = Gravity.origin.top();
|
||
Gravity.Bottom = Gravity.origin.bottom();
|
||
function gravity() {
|
||
return new Gravity;
|
||
}
|
||
|
||
(function (LayoutSpec) {
|
||
/**
|
||
* Depends on what's been set on width or height.
|
||
*/
|
||
LayoutSpec[LayoutSpec["JUST"] = 0] = "JUST";
|
||
/**
|
||
* Depends on it's content.
|
||
*/
|
||
LayoutSpec[LayoutSpec["FIT"] = 1] = "FIT";
|
||
/**
|
||
* Extend as much as parent let it take.
|
||
*/
|
||
LayoutSpec[LayoutSpec["MOST"] = 2] = "MOST";
|
||
})(exports.LayoutSpec || (exports.LayoutSpec = {}));
|
||
class LayoutConfigImpl {
|
||
fit() {
|
||
this.widthSpec = exports.LayoutSpec.FIT;
|
||
this.heightSpec = exports.LayoutSpec.FIT;
|
||
return this;
|
||
}
|
||
most() {
|
||
this.widthSpec = exports.LayoutSpec.MOST;
|
||
this.heightSpec = exports.LayoutSpec.MOST;
|
||
return this;
|
||
}
|
||
just() {
|
||
this.widthSpec = exports.LayoutSpec.JUST;
|
||
this.heightSpec = exports.LayoutSpec.JUST;
|
||
return this;
|
||
}
|
||
configWidth(w) {
|
||
this.widthSpec = w;
|
||
return this;
|
||
}
|
||
configHeight(h) {
|
||
this.heightSpec = h;
|
||
return this;
|
||
}
|
||
configMargin(m) {
|
||
this.margin = m;
|
||
return this;
|
||
}
|
||
configAlignmnet(a) {
|
||
this.alignment = a;
|
||
return this;
|
||
}
|
||
configWeight(w) {
|
||
this.weight = w;
|
||
return this;
|
||
}
|
||
toModel() {
|
||
return {
|
||
widthSpec: this.widthSpec,
|
||
heightSpec: this.heightSpec,
|
||
margin: this.margin,
|
||
alignment: this.alignment ? this.alignment.toModel() : undefined,
|
||
weight: this.weight,
|
||
};
|
||
}
|
||
}
|
||
function layoutConfig() {
|
||
return new LayoutConfigImpl;
|
||
}
|
||
|
||
var __decorate$1 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata$1 = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
class Stack extends Group {
|
||
}
|
||
class Root extends Stack {
|
||
}
|
||
class LinearLayout extends Group {
|
||
}
|
||
__decorate$1([
|
||
Property,
|
||
__metadata$1("design:type", Number)
|
||
], LinearLayout.prototype, "space", void 0);
|
||
__decorate$1([
|
||
Property,
|
||
__metadata$1("design:type", Gravity)
|
||
], LinearLayout.prototype, "gravity", void 0);
|
||
class VLayout extends LinearLayout {
|
||
}
|
||
class HLayout extends LinearLayout {
|
||
}
|
||
function stack(views) {
|
||
const ret = new Stack;
|
||
ret.layoutConfig = layoutConfig().fit();
|
||
for (let v of views) {
|
||
ret.addChild(v);
|
||
}
|
||
return ret;
|
||
}
|
||
function hlayout(views) {
|
||
const ret = new HLayout;
|
||
ret.layoutConfig = layoutConfig().fit();
|
||
for (let v of views) {
|
||
ret.addChild(v);
|
||
}
|
||
return ret;
|
||
}
|
||
function vlayout(views) {
|
||
const ret = new VLayout;
|
||
ret.layoutConfig = layoutConfig().fit();
|
||
for (let v of views) {
|
||
ret.addChild(v);
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
var __decorate$2 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata$2 = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
function NativeCall(target, propertyKey, descriptor) {
|
||
const originVal = descriptor.value;
|
||
descriptor.value = function () {
|
||
const ret = Reflect.apply(originVal, this, arguments);
|
||
return ret;
|
||
};
|
||
return descriptor;
|
||
}
|
||
class Panel {
|
||
constructor() {
|
||
this.__root__ = new Root;
|
||
this.headviews = new Map;
|
||
}
|
||
onCreate() { }
|
||
onDestroy() { }
|
||
onShow() { }
|
||
onHidden() { }
|
||
addHeadView(v) {
|
||
this.headviews.set(v.viewId, v);
|
||
}
|
||
allHeadViews() {
|
||
return this.headviews.values();
|
||
}
|
||
removeHeadView(v) {
|
||
if (v instanceof View) {
|
||
this.headviews.delete(v.viewId);
|
||
}
|
||
else {
|
||
this.headviews.delete(v);
|
||
}
|
||
}
|
||
clearHeadViews() {
|
||
this.headviews.clear();
|
||
}
|
||
getRootView() {
|
||
return this.__root__;
|
||
}
|
||
getInitData() {
|
||
return this.__data__;
|
||
}
|
||
__init__(frame, data) {
|
||
if (data) {
|
||
this.__data__ = JSON.parse(data);
|
||
}
|
||
this.__root__.width = frame.width;
|
||
this.__root__.height = frame.height;
|
||
this.__root__.children.length = 0;
|
||
this.build(this.__root__);
|
||
}
|
||
__onCreate__() {
|
||
this.onCreate();
|
||
}
|
||
__onDestroy__() {
|
||
this.onDestroy();
|
||
}
|
||
__onShow__() {
|
||
this.onShow();
|
||
}
|
||
__onHidden__() {
|
||
this.onHidden();
|
||
}
|
||
__build__() {
|
||
this.build(this.__root__);
|
||
}
|
||
__response__(viewIds, callbackId) {
|
||
const v = this.retrospectView(viewIds);
|
||
if (v === undefined) {
|
||
loge(`Cannot find view for ${viewIds}`);
|
||
}
|
||
else {
|
||
const argumentsList = [callbackId];
|
||
for (let i = 2; i < arguments.length; i++) {
|
||
argumentsList.push(arguments[i]);
|
||
}
|
||
return Reflect.apply(v.responseCallback, v, argumentsList);
|
||
}
|
||
}
|
||
retrospectView(ids) {
|
||
return ids.reduce((acc, cur) => {
|
||
if (acc === undefined) {
|
||
if (cur === this.__root__.viewId) {
|
||
return this.__root__;
|
||
}
|
||
return this.headviews.get(cur);
|
||
}
|
||
else {
|
||
if (Reflect.has(acc, "subviewById")) {
|
||
return Reflect.apply(Reflect.get(acc, "subviewById"), acc, [cur]);
|
||
}
|
||
return acc;
|
||
}
|
||
}, undefined);
|
||
}
|
||
nativeRender(model) {
|
||
this.context.shader.render(model);
|
||
}
|
||
hookBeforeNativeCall() {
|
||
}
|
||
hookAfterNativeCall() {
|
||
//Here insert a native call to ensure the promise is resolved done.
|
||
Promise.resolve().then(() => {
|
||
if (this.__root__.isDirty()) {
|
||
const model = this.__root__.toModel();
|
||
this.nativeRender(model);
|
||
this.__root__.clean();
|
||
}
|
||
for (let v of this.headviews.values()) {
|
||
if (v.isDirty()) {
|
||
const model = v.toModel();
|
||
this.nativeRender(model);
|
||
v.clean();
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
__decorate$2([
|
||
NativeCall,
|
||
__metadata$2("design:type", Function),
|
||
__metadata$2("design:paramtypes", [Object, String]),
|
||
__metadata$2("design:returntype", void 0)
|
||
], Panel.prototype, "__init__", null);
|
||
__decorate$2([
|
||
NativeCall,
|
||
__metadata$2("design:type", Function),
|
||
__metadata$2("design:paramtypes", []),
|
||
__metadata$2("design:returntype", void 0)
|
||
], Panel.prototype, "__onCreate__", null);
|
||
__decorate$2([
|
||
NativeCall,
|
||
__metadata$2("design:type", Function),
|
||
__metadata$2("design:paramtypes", []),
|
||
__metadata$2("design:returntype", void 0)
|
||
], Panel.prototype, "__onDestroy__", null);
|
||
__decorate$2([
|
||
NativeCall,
|
||
__metadata$2("design:type", Function),
|
||
__metadata$2("design:paramtypes", []),
|
||
__metadata$2("design:returntype", void 0)
|
||
], Panel.prototype, "__onShow__", null);
|
||
__decorate$2([
|
||
NativeCall,
|
||
__metadata$2("design:type", Function),
|
||
__metadata$2("design:paramtypes", []),
|
||
__metadata$2("design:returntype", void 0)
|
||
], Panel.prototype, "__onHidden__", null);
|
||
__decorate$2([
|
||
NativeCall,
|
||
__metadata$2("design:type", Function),
|
||
__metadata$2("design:paramtypes", []),
|
||
__metadata$2("design:returntype", void 0)
|
||
], Panel.prototype, "__build__", null);
|
||
__decorate$2([
|
||
NativeCall,
|
||
__metadata$2("design:type", Function),
|
||
__metadata$2("design:paramtypes", [Array, String]),
|
||
__metadata$2("design:returntype", void 0)
|
||
], Panel.prototype, "__response__", null);
|
||
|
||
/*
|
||
* Copyright [2019] [Doric.Pub]
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
(function (RepeatMode) {
|
||
RepeatMode[RepeatMode["RESTART"] = 1] = "RESTART";
|
||
RepeatMode[RepeatMode["REVERSE"] = 2] = "REVERSE";
|
||
})(exports.RepeatMode || (exports.RepeatMode = {}));
|
||
(function (FillMode) {
|
||
/**
|
||
* The receiver is removed from the presentation when the animation is completed.
|
||
*/
|
||
FillMode[FillMode["Removed"] = 0] = "Removed";
|
||
/**
|
||
* The receiver remains visible in its final state when the animation is completed.
|
||
*/
|
||
FillMode[FillMode["Forward"] = 1] = "Forward";
|
||
/**
|
||
* The receiver clamps values before zero to zero when the animation is completed.
|
||
*/
|
||
FillMode[FillMode["Backward"] = 2] = "Backward";
|
||
/**
|
||
* The receiver clamps values at both ends of the object’s time space
|
||
*/
|
||
FillMode[FillMode["Both"] = 3] = "Both";
|
||
})(exports.FillMode || (exports.FillMode = {}));
|
||
(function (TimingFunction) {
|
||
/**
|
||
* The system default timing function. Use this function to ensure that the timing of your animations matches that of most system animations.
|
||
*/
|
||
TimingFunction[TimingFunction["Default"] = 0] = "Default";
|
||
/**
|
||
* Linear pacing, which causes an animation to occur evenly over its duration.
|
||
*/
|
||
TimingFunction[TimingFunction["Linear"] = 1] = "Linear";
|
||
/**
|
||
* Ease-in pacing, which causes an animation to begin slowly and then speed up as it progresses.
|
||
*/
|
||
TimingFunction[TimingFunction["EaseIn"] = 2] = "EaseIn";
|
||
/**
|
||
* Ease-out pacing, which causes an animation to begin quickly and then slow as it progresses.
|
||
*/
|
||
TimingFunction[TimingFunction["EaseOut"] = 3] = "EaseOut";
|
||
/**
|
||
* Ease-in-ease-out pacing, which causes an animation to begin slowly, accelerate through the middle of its duration, and then slow again before completing.
|
||
*/
|
||
TimingFunction[TimingFunction["EaseInEaseOut"] = 4] = "EaseInEaseOut";
|
||
})(exports.TimingFunction || (exports.TimingFunction = {}));
|
||
class Animation {
|
||
constructor() {
|
||
this.changeables = new Map;
|
||
this.duration = 0;
|
||
this.fillMode = exports.FillMode.Forward;
|
||
}
|
||
toModel() {
|
||
const changeables = [];
|
||
for (let e of this.changeables.values()) {
|
||
changeables.push({
|
||
key: e.key,
|
||
fromValue: e.fromValue,
|
||
toValue: e.toValue,
|
||
});
|
||
}
|
||
return {
|
||
type: this.constructor.name,
|
||
delay: this.delay,
|
||
duration: this.duration,
|
||
changeables,
|
||
repeatCount: this.repeatCount,
|
||
repeatMode: this.repeatMode,
|
||
fillMode: this.fillMode,
|
||
timingFunction: this.timingFunction
|
||
};
|
||
}
|
||
}
|
||
class ScaleAnimation extends Animation {
|
||
constructor() {
|
||
super();
|
||
this.scaleXChangeable = {
|
||
key: "scaleX",
|
||
fromValue: 1,
|
||
toValue: 1,
|
||
};
|
||
this.scaleYChangeable = {
|
||
key: "scaleY",
|
||
fromValue: 1,
|
||
toValue: 1,
|
||
};
|
||
this.changeables.set("scaleX", this.scaleXChangeable);
|
||
this.changeables.set("scaleY", this.scaleYChangeable);
|
||
}
|
||
set fromScaleX(v) {
|
||
this.scaleXChangeable.fromValue = v;
|
||
}
|
||
get fromScaleX() {
|
||
return this.scaleXChangeable.fromValue;
|
||
}
|
||
set toScaleX(v) {
|
||
this.scaleXChangeable.toValue = v;
|
||
}
|
||
get toScaleX() {
|
||
return this.scaleXChangeable.toValue;
|
||
}
|
||
set fromScaleY(v) {
|
||
this.scaleYChangeable.fromValue = v;
|
||
}
|
||
get fromScaleY() {
|
||
return this.scaleYChangeable.fromValue;
|
||
}
|
||
set toScaleY(v) {
|
||
this.scaleYChangeable.toValue = v;
|
||
}
|
||
get toScaleY() {
|
||
return this.scaleYChangeable.toValue;
|
||
}
|
||
}
|
||
class TranslationAnimation extends Animation {
|
||
constructor() {
|
||
super();
|
||
this.translationXChangeable = {
|
||
key: "translationX",
|
||
fromValue: 1,
|
||
toValue: 1,
|
||
};
|
||
this.translationYChangeable = {
|
||
key: "translationY",
|
||
fromValue: 1,
|
||
toValue: 1,
|
||
};
|
||
this.changeables.set("translationX", this.translationXChangeable);
|
||
this.changeables.set("translationY", this.translationYChangeable);
|
||
}
|
||
set fromTranslationX(v) {
|
||
this.translationXChangeable.fromValue = v;
|
||
}
|
||
get fromTranslationX() {
|
||
return this.translationXChangeable.fromValue;
|
||
}
|
||
set toTranslationX(v) {
|
||
this.translationXChangeable.toValue = v;
|
||
}
|
||
get toTranslationX() {
|
||
return this.translationXChangeable.toValue;
|
||
}
|
||
set fromTranslationY(v) {
|
||
this.translationYChangeable.fromValue = v;
|
||
}
|
||
get fromTranslationY() {
|
||
return this.translationYChangeable.fromValue;
|
||
}
|
||
set toTranslationY(v) {
|
||
this.translationYChangeable.toValue = v;
|
||
}
|
||
get toTranslationY() {
|
||
return this.translationYChangeable.toValue;
|
||
}
|
||
}
|
||
class RotationAnimation extends Animation {
|
||
constructor() {
|
||
super();
|
||
this.rotationChaneable = {
|
||
key: "rotation",
|
||
fromValue: 1,
|
||
toValue: 1,
|
||
};
|
||
this.changeables.set("rotation", this.rotationChaneable);
|
||
}
|
||
set fromRotation(v) {
|
||
this.rotationChaneable.fromValue = v;
|
||
}
|
||
get fromRotation() {
|
||
return this.rotationChaneable.fromValue;
|
||
}
|
||
set toRotation(v) {
|
||
this.rotationChaneable.toValue = v;
|
||
}
|
||
get toRotation() {
|
||
return this.rotationChaneable.toValue;
|
||
}
|
||
}
|
||
class AnimationSet {
|
||
constructor() {
|
||
this.animations = [];
|
||
this._duration = 0;
|
||
}
|
||
addAnimation(anim) {
|
||
this.animations.push(anim);
|
||
}
|
||
get duration() {
|
||
return this._duration;
|
||
}
|
||
set duration(v) {
|
||
this._duration = v;
|
||
this.animations.forEach(e => e.duration = v);
|
||
}
|
||
toModel() {
|
||
return {
|
||
animations: this.animations.map(e => {
|
||
return e.toModel();
|
||
}),
|
||
delay: this.delay,
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Store color as format AARRGGBB or RRGGBB
|
||
*/
|
||
class Color {
|
||
constructor(v) {
|
||
this._value = 0;
|
||
this._value = v | 0x0;
|
||
}
|
||
static parse(str) {
|
||
if (!str.startsWith("#")) {
|
||
throw new Error(`Parse color error with ${str}`);
|
||
}
|
||
const val = parseInt(str.substr(1), 16);
|
||
if (str.length === 7) {
|
||
return new Color(val | 0xff000000);
|
||
}
|
||
else if (str.length === 9) {
|
||
return new Color(val);
|
||
}
|
||
else {
|
||
throw new Error(`Parse color error with ${str}`);
|
||
}
|
||
}
|
||
static safeParse(str, defVal = Color.TRANSPARENT) {
|
||
let color = defVal;
|
||
try {
|
||
color = Color.parse(str);
|
||
}
|
||
catch (e) {
|
||
}
|
||
finally {
|
||
return color;
|
||
}
|
||
}
|
||
alpha(v) {
|
||
v = v * 255;
|
||
return new Color((this._value & 0xffffff) | ((v & 0xff) << 24));
|
||
}
|
||
toModel() {
|
||
return this._value;
|
||
}
|
||
}
|
||
Color.BLACK = new Color(0xFF000000);
|
||
Color.DKGRAY = new Color(0xFF444444);
|
||
Color.GRAY = new Color(0xFF888888);
|
||
Color.LTGRAY = new Color(0xFFCCCCCC);
|
||
Color.WHITE = new Color(0xFFFFFFFF);
|
||
Color.RED = new Color(0xFFFF0000);
|
||
Color.GREEN = new Color(0xFF00FF00);
|
||
Color.BLUE = new Color(0xFF0000FF);
|
||
Color.YELLOW = new Color(0xFFFFFF00);
|
||
Color.CYAN = new Color(0xFF00FFFF);
|
||
Color.MAGENTA = new Color(0xFFFF00FF);
|
||
Color.TRANSPARENT = new Color(0);
|
||
(function (GradientOrientation) {
|
||
/** draw the gradient from the top to the bottom */
|
||
GradientOrientation[GradientOrientation["TOP_BOTTOM"] = 0] = "TOP_BOTTOM";
|
||
/** draw the gradient from the top-right to the bottom-left */
|
||
GradientOrientation[GradientOrientation["TR_BL"] = 1] = "TR_BL";
|
||
/** draw the gradient from the right to the left */
|
||
GradientOrientation[GradientOrientation["RIGHT_LEFT"] = 2] = "RIGHT_LEFT";
|
||
/** draw the gradient from the bottom-right to the top-left */
|
||
GradientOrientation[GradientOrientation["BR_TL"] = 3] = "BR_TL";
|
||
/** draw the gradient from the bottom to the top */
|
||
GradientOrientation[GradientOrientation["BOTTOM_TOP"] = 4] = "BOTTOM_TOP";
|
||
/** draw the gradient from the bottom-left to the top-right */
|
||
GradientOrientation[GradientOrientation["BL_TR"] = 5] = "BL_TR";
|
||
/** draw the gradient from the left to the right */
|
||
GradientOrientation[GradientOrientation["LEFT_RIGHT"] = 6] = "LEFT_RIGHT";
|
||
/** draw the gradient from the top-left to the bottom-right */
|
||
GradientOrientation[GradientOrientation["TL_BR"] = 7] = "TL_BR";
|
||
})(exports.GradientOrientation || (exports.GradientOrientation = {}));
|
||
|
||
var __decorate$3 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata$3 = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
class Text extends View {
|
||
}
|
||
__decorate$3([
|
||
Property,
|
||
__metadata$3("design:type", String)
|
||
], Text.prototype, "text", void 0);
|
||
__decorate$3([
|
||
Property,
|
||
__metadata$3("design:type", Color)
|
||
], Text.prototype, "textColor", void 0);
|
||
__decorate$3([
|
||
Property,
|
||
__metadata$3("design:type", Number)
|
||
], Text.prototype, "textSize", void 0);
|
||
__decorate$3([
|
||
Property,
|
||
__metadata$3("design:type", Number)
|
||
], Text.prototype, "maxLines", void 0);
|
||
__decorate$3([
|
||
Property,
|
||
__metadata$3("design:type", Gravity)
|
||
], Text.prototype, "textAlignment", void 0);
|
||
function text(config) {
|
||
const ret = new Text;
|
||
ret.layoutConfig = layoutConfig().fit();
|
||
for (let key in config) {
|
||
Reflect.set(ret, key, Reflect.get(config, key, config), ret);
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
var __decorate$4 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata$4 = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
(function (ScaleType) {
|
||
ScaleType[ScaleType["ScaleToFill"] = 0] = "ScaleToFill";
|
||
ScaleType[ScaleType["ScaleAspectFit"] = 1] = "ScaleAspectFit";
|
||
ScaleType[ScaleType["ScaleAspectFill"] = 2] = "ScaleAspectFill";
|
||
})(exports.ScaleType || (exports.ScaleType = {}));
|
||
class Image extends View {
|
||
}
|
||
__decorate$4([
|
||
Property,
|
||
__metadata$4("design:type", String)
|
||
], Image.prototype, "imageUrl", void 0);
|
||
__decorate$4([
|
||
Property,
|
||
__metadata$4("design:type", String)
|
||
], Image.prototype, "imageBase64", void 0);
|
||
__decorate$4([
|
||
Property,
|
||
__metadata$4("design:type", Number)
|
||
], Image.prototype, "scaleType", void 0);
|
||
__decorate$4([
|
||
Property,
|
||
__metadata$4("design:type", Boolean)
|
||
], Image.prototype, "isBlur", void 0);
|
||
__decorate$4([
|
||
Property,
|
||
__metadata$4("design:type", Function)
|
||
], Image.prototype, "loadCallback", void 0);
|
||
function image(config) {
|
||
const ret = new Image;
|
||
ret.layoutConfig = layoutConfig().fit();
|
||
for (let key in config) {
|
||
Reflect.set(ret, key, Reflect.get(config, key, config), ret);
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/*
|
||
* Copyright [2019] [Doric.Pub]
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
var __decorate$5 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata$5 = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
class ListItem extends Stack {
|
||
}
|
||
__decorate$5([
|
||
Property,
|
||
__metadata$5("design:type", String)
|
||
], ListItem.prototype, "identifier", void 0);
|
||
class List extends Superview {
|
||
constructor() {
|
||
super(...arguments);
|
||
this.cachedViews = new Map;
|
||
this.ignoreDirtyCallOnce = false;
|
||
this.itemCount = 0;
|
||
this.batchCount = 15;
|
||
}
|
||
allSubviews() {
|
||
if (this.loadMoreView) {
|
||
return [...this.cachedViews.values(), this.loadMoreView];
|
||
}
|
||
else {
|
||
return this.cachedViews.values();
|
||
}
|
||
}
|
||
reset() {
|
||
this.cachedViews.clear();
|
||
this.itemCount = 0;
|
||
}
|
||
getItem(itemIdx) {
|
||
let view = this.cachedViews.get(`${itemIdx}`);
|
||
if (view === undefined) {
|
||
view = this.renderItem(itemIdx);
|
||
view.superview = this;
|
||
this.cachedViews.set(`${itemIdx}`, view);
|
||
}
|
||
return view;
|
||
}
|
||
isDirty() {
|
||
if (this.ignoreDirtyCallOnce) {
|
||
this.ignoreDirtyCallOnce = false;
|
||
//Ignore the dirty call once.
|
||
return false;
|
||
}
|
||
return super.isDirty();
|
||
}
|
||
renderBunchedItems(start, length) {
|
||
this.ignoreDirtyCallOnce = true;
|
||
return new Array(Math.min(length, this.itemCount - start)).fill(0).map((_, idx) => {
|
||
const listItem = this.getItem(start + idx);
|
||
return listItem.toModel();
|
||
});
|
||
}
|
||
toModel() {
|
||
if (this.loadMoreView) {
|
||
this.dirtyProps['loadMoreView'] = this.loadMoreView.viewId;
|
||
}
|
||
return super.toModel();
|
||
}
|
||
}
|
||
__decorate$5([
|
||
Property,
|
||
__metadata$5("design:type", Object)
|
||
], List.prototype, "itemCount", void 0);
|
||
__decorate$5([
|
||
Property,
|
||
__metadata$5("design:type", Function)
|
||
], List.prototype, "renderItem", void 0);
|
||
__decorate$5([
|
||
Property,
|
||
__metadata$5("design:type", Object)
|
||
], List.prototype, "batchCount", void 0);
|
||
__decorate$5([
|
||
Property,
|
||
__metadata$5("design:type", Function)
|
||
], List.prototype, "onLoadMore", void 0);
|
||
__decorate$5([
|
||
Property,
|
||
__metadata$5("design:type", Boolean)
|
||
], List.prototype, "loadMore", void 0);
|
||
__decorate$5([
|
||
Property,
|
||
__metadata$5("design:type", ListItem)
|
||
], List.prototype, "loadMoreView", void 0);
|
||
function list(config) {
|
||
const ret = new List;
|
||
for (let key in config) {
|
||
Reflect.set(ret, key, Reflect.get(config, key, config), ret);
|
||
}
|
||
return ret;
|
||
}
|
||
function listItem(item) {
|
||
return (new ListItem).also((it) => {
|
||
it.layoutConfig = layoutConfig().most().configHeight(exports.LayoutSpec.FIT);
|
||
it.addChild(item);
|
||
});
|
||
}
|
||
|
||
var __decorate$6 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata$6 = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
class SlideItem extends Stack {
|
||
}
|
||
__decorate$6([
|
||
Property,
|
||
__metadata$6("design:type", String)
|
||
], SlideItem.prototype, "identifier", void 0);
|
||
class Slider extends Superview {
|
||
constructor() {
|
||
super(...arguments);
|
||
this.cachedViews = new Map;
|
||
this.ignoreDirtyCallOnce = false;
|
||
this.itemCount = 0;
|
||
this.batchCount = 3;
|
||
}
|
||
allSubviews() {
|
||
return this.cachedViews.values();
|
||
}
|
||
getItem(itemIdx) {
|
||
let view = this.cachedViews.get(`${itemIdx}`);
|
||
if (view === undefined) {
|
||
view = this.renderPage(itemIdx);
|
||
view.superview = this;
|
||
this.cachedViews.set(`${itemIdx}`, view);
|
||
}
|
||
return view;
|
||
}
|
||
isDirty() {
|
||
if (this.ignoreDirtyCallOnce) {
|
||
this.ignoreDirtyCallOnce = false;
|
||
//Ignore the dirty call once.
|
||
return false;
|
||
}
|
||
return super.isDirty();
|
||
}
|
||
renderBunchedItems(start, length) {
|
||
this.ignoreDirtyCallOnce = true;
|
||
return new Array(Math.min(length, this.itemCount - start)).fill(0).map((_, idx) => {
|
||
const slideItem = this.getItem(start + idx);
|
||
return slideItem.toModel();
|
||
});
|
||
}
|
||
slidePage(context, page, smooth = false) {
|
||
return this.nativeChannel(context, "slidePage")({ page, smooth });
|
||
}
|
||
getSlidedPage(context) {
|
||
return this.nativeChannel(context, "getSlidedPage")();
|
||
}
|
||
}
|
||
__decorate$6([
|
||
Property,
|
||
__metadata$6("design:type", Object)
|
||
], Slider.prototype, "itemCount", void 0);
|
||
__decorate$6([
|
||
Property,
|
||
__metadata$6("design:type", Function)
|
||
], Slider.prototype, "renderPage", void 0);
|
||
__decorate$6([
|
||
Property,
|
||
__metadata$6("design:type", Object)
|
||
], Slider.prototype, "batchCount", void 0);
|
||
__decorate$6([
|
||
Property,
|
||
__metadata$6("design:type", Function)
|
||
], Slider.prototype, "onPageSlided", void 0);
|
||
function slideItem(item) {
|
||
return (new SlideItem).also((it) => {
|
||
it.layoutConfig = layoutConfig().fit();
|
||
it.addChild(item);
|
||
});
|
||
}
|
||
function slider(config) {
|
||
const ret = new Slider;
|
||
for (let key in config) {
|
||
Reflect.set(ret, key, Reflect.get(config, key, config), ret);
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/*
|
||
* Copyright [2019] [Doric.Pub]
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
function scroller(content) {
|
||
return (new Scroller).also(v => {
|
||
v.layoutConfig = layoutConfig().fit();
|
||
v.content = content;
|
||
});
|
||
}
|
||
class Scroller extends Superview {
|
||
allSubviews() {
|
||
return [this.content];
|
||
}
|
||
toModel() {
|
||
this.dirtyProps.content = this.content.viewId;
|
||
return super.toModel();
|
||
}
|
||
}
|
||
|
||
var __decorate$7 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata$7 = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
class Refreshable extends Superview {
|
||
allSubviews() {
|
||
const ret = [this.content];
|
||
if (this.header) {
|
||
ret.push(this.header);
|
||
}
|
||
return ret;
|
||
}
|
||
setRefreshable(context, refreshable) {
|
||
return this.nativeChannel(context, 'setRefreshable')(refreshable);
|
||
}
|
||
setRefreshing(context, refreshing) {
|
||
return this.nativeChannel(context, 'setRefreshing')(refreshing);
|
||
}
|
||
isRefreshable(context) {
|
||
return this.nativeChannel(context, 'isRefreshable')();
|
||
}
|
||
isRefreshing(context) {
|
||
return this.nativeChannel(context, 'isRefreshing')();
|
||
}
|
||
toModel() {
|
||
this.dirtyProps.content = this.content.viewId;
|
||
this.dirtyProps.header = (this.header || {}).viewId;
|
||
return super.toModel();
|
||
}
|
||
}
|
||
__decorate$7([
|
||
Property,
|
||
__metadata$7("design:type", Function)
|
||
], Refreshable.prototype, "onRefresh", void 0);
|
||
function refreshable(config) {
|
||
const ret = new Refreshable;
|
||
ret.layoutConfig = layoutConfig().fit();
|
||
for (let key in config) {
|
||
Reflect.set(ret, key, Reflect.get(config, key, config), ret);
|
||
}
|
||
return ret;
|
||
}
|
||
function pullable(v, config) {
|
||
Reflect.set(v, 'startAnimation', config.startAnimation);
|
||
Reflect.set(v, 'stopAnimation', config.stopAnimation);
|
||
Reflect.set(v, 'setPullingDistance', config.setPullingDistance);
|
||
return v;
|
||
}
|
||
|
||
var __decorate$8 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata$8 = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
class FlowLayoutItem extends Stack {
|
||
}
|
||
__decorate$8([
|
||
Property,
|
||
__metadata$8("design:type", String)
|
||
], FlowLayoutItem.prototype, "identifier", void 0);
|
||
class FlowLayout extends Superview {
|
||
constructor() {
|
||
super(...arguments);
|
||
this.cachedViews = new Map;
|
||
this.ignoreDirtyCallOnce = false;
|
||
this.columnCount = 2;
|
||
this.itemCount = 0;
|
||
this.batchCount = 15;
|
||
}
|
||
allSubviews() {
|
||
if (this.loadMoreView) {
|
||
return [...this.cachedViews.values(), this.loadMoreView];
|
||
}
|
||
else {
|
||
return this.cachedViews.values();
|
||
}
|
||
}
|
||
reset() {
|
||
this.cachedViews.clear();
|
||
this.itemCount = 0;
|
||
}
|
||
getItem(itemIdx) {
|
||
let view = this.renderItem(itemIdx);
|
||
view.superview = this;
|
||
this.cachedViews.set(`${itemIdx}`, view);
|
||
return view;
|
||
}
|
||
isDirty() {
|
||
if (this.ignoreDirtyCallOnce) {
|
||
this.ignoreDirtyCallOnce = false;
|
||
//Ignore the dirty call once.
|
||
return false;
|
||
}
|
||
return super.isDirty();
|
||
}
|
||
renderBunchedItems(start, length) {
|
||
this.ignoreDirtyCallOnce = true;
|
||
return new Array(Math.min(length, this.itemCount - start)).fill(0).map((_, idx) => {
|
||
const listItem = this.getItem(start + idx);
|
||
return listItem.toModel();
|
||
});
|
||
}
|
||
toModel() {
|
||
if (this.loadMoreView) {
|
||
this.dirtyProps['loadMoreView'] = this.loadMoreView.viewId;
|
||
}
|
||
return super.toModel();
|
||
}
|
||
}
|
||
__decorate$8([
|
||
Property,
|
||
__metadata$8("design:type", Object)
|
||
], FlowLayout.prototype, "columnCount", void 0);
|
||
__decorate$8([
|
||
Property,
|
||
__metadata$8("design:type", Number)
|
||
], FlowLayout.prototype, "columnSpace", void 0);
|
||
__decorate$8([
|
||
Property,
|
||
__metadata$8("design:type", Number)
|
||
], FlowLayout.prototype, "rowSpace", void 0);
|
||
__decorate$8([
|
||
Property,
|
||
__metadata$8("design:type", Object)
|
||
], FlowLayout.prototype, "itemCount", void 0);
|
||
__decorate$8([
|
||
Property,
|
||
__metadata$8("design:type", Function)
|
||
], FlowLayout.prototype, "renderItem", void 0);
|
||
__decorate$8([
|
||
Property,
|
||
__metadata$8("design:type", Object)
|
||
], FlowLayout.prototype, "batchCount", void 0);
|
||
__decorate$8([
|
||
Property,
|
||
__metadata$8("design:type", Function)
|
||
], FlowLayout.prototype, "onLoadMore", void 0);
|
||
__decorate$8([
|
||
Property,
|
||
__metadata$8("design:type", Boolean)
|
||
], FlowLayout.prototype, "loadMore", void 0);
|
||
__decorate$8([
|
||
Property,
|
||
__metadata$8("design:type", FlowLayoutItem)
|
||
], FlowLayout.prototype, "loadMoreView", void 0);
|
||
function flowlayout(config) {
|
||
const ret = new FlowLayout;
|
||
for (let key in config) {
|
||
Reflect.set(ret, key, Reflect.get(config, key, config), ret);
|
||
}
|
||
return ret;
|
||
}
|
||
function flowItem(item) {
|
||
return (new FlowLayoutItem).also((it) => {
|
||
it.layoutConfig = layoutConfig().fit();
|
||
it.addChild(item);
|
||
});
|
||
}
|
||
|
||
var __decorate$9 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata$9 = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
class Input extends View {
|
||
getText(context) {
|
||
return this.nativeChannel(context, 'getText')();
|
||
}
|
||
setSelection(context, start, end = start) {
|
||
return this.nativeChannel(context, 'setSelection')({
|
||
start,
|
||
end,
|
||
});
|
||
}
|
||
requestFocus(context) {
|
||
return this.nativeChannel(context, 'requestFocus')();
|
||
}
|
||
releaseFocus(context) {
|
||
return this.nativeChannel(context, 'releaseFocus')();
|
||
}
|
||
}
|
||
__decorate$9([
|
||
Property,
|
||
__metadata$9("design:type", String)
|
||
], Input.prototype, "text", void 0);
|
||
__decorate$9([
|
||
Property,
|
||
__metadata$9("design:type", Color)
|
||
], Input.prototype, "textColor", void 0);
|
||
__decorate$9([
|
||
Property,
|
||
__metadata$9("design:type", Number)
|
||
], Input.prototype, "textSize", void 0);
|
||
__decorate$9([
|
||
Property,
|
||
__metadata$9("design:type", String)
|
||
], Input.prototype, "hintText", void 0);
|
||
__decorate$9([
|
||
Property,
|
||
__metadata$9("design:type", Color)
|
||
], Input.prototype, "hintTextColor", void 0);
|
||
__decorate$9([
|
||
Property,
|
||
__metadata$9("design:type", Boolean)
|
||
], Input.prototype, "multiline", void 0);
|
||
__decorate$9([
|
||
Property,
|
||
__metadata$9("design:type", Gravity)
|
||
], Input.prototype, "textAlignment", void 0);
|
||
__decorate$9([
|
||
Property,
|
||
__metadata$9("design:type", Function)
|
||
], Input.prototype, "onTextChange", void 0);
|
||
__decorate$9([
|
||
Property,
|
||
__metadata$9("design:type", Function)
|
||
], Input.prototype, "onFocusChange", void 0);
|
||
|
||
var __decorate$a = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
var __metadata$a = (undefined && undefined.__metadata) || function (k, v) {
|
||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||
};
|
||
class NestedSlider extends Group {
|
||
addSlideItem(view) {
|
||
this.addChild(view);
|
||
}
|
||
slidePage(context, page, smooth = false) {
|
||
return this.nativeChannel(context, "slidePage")({ page, smooth });
|
||
}
|
||
getSlidedPage(context) {
|
||
return this.nativeChannel(context, "getSlidedPage")();
|
||
}
|
||
}
|
||
__decorate$a([
|
||
Property,
|
||
__metadata$a("design:type", Function)
|
||
], NestedSlider.prototype, "onPageSlided", void 0);
|
||
|
||
function modal(context) {
|
||
return {
|
||
toast: (msg, gravity = Gravity.Bottom) => {
|
||
context.modal.toast({
|
||
msg,
|
||
gravity: gravity.toModel(),
|
||
});
|
||
},
|
||
alert: (arg) => {
|
||
if (typeof arg === 'string') {
|
||
return context.modal.alert({ msg: arg });
|
||
}
|
||
else {
|
||
return context.modal.alert(arg);
|
||
}
|
||
},
|
||
confirm: (arg) => {
|
||
if (typeof arg === 'string') {
|
||
return context.modal.confirm({ msg: arg });
|
||
}
|
||
else {
|
||
return context.modal.confirm(arg);
|
||
}
|
||
},
|
||
prompt: (arg) => {
|
||
return context.modal.prompt(arg);
|
||
},
|
||
};
|
||
}
|
||
|
||
function navbar(context) {
|
||
const entity = context.entity;
|
||
return {
|
||
isHidden: () => {
|
||
return context.navbar.isHidden();
|
||
},
|
||
setHidden: (hidden) => {
|
||
return context.navbar.setHidden({
|
||
hidden,
|
||
});
|
||
},
|
||
setTitle: (title) => {
|
||
return context.navbar.setTitle({
|
||
title,
|
||
});
|
||
},
|
||
setBgColor: (color) => {
|
||
return context.navbar.setBgColor({
|
||
color: color.toModel(),
|
||
});
|
||
},
|
||
};
|
||
}
|
||
|
||
function navigator(context) {
|
||
return {
|
||
push: (scheme, config) => {
|
||
if (config && config.extra) {
|
||
config.extra = JSON.stringify(config.extra);
|
||
}
|
||
return context.navigator.push({
|
||
scheme, config
|
||
});
|
||
},
|
||
pop: (animated = true) => {
|
||
return context.navigator.pop({ animated });
|
||
},
|
||
};
|
||
}
|
||
|
||
function transformRequest(request) {
|
||
let url = request.url || "";
|
||
if (request.params !== undefined) {
|
||
const queryStrings = [];
|
||
for (let key in request.params) {
|
||
queryStrings.push(`${key}=${encodeURIComponent(request.params[key])}`);
|
||
}
|
||
request.url = `${request.url}${url.indexOf('?') >= 0 ? '&' : '?'}${queryStrings.join('&')}`;
|
||
}
|
||
if (typeof request.data === 'object') {
|
||
request.data = JSON.stringify(request.data);
|
||
}
|
||
return request;
|
||
}
|
||
function network(context) {
|
||
return {
|
||
request: (config) => {
|
||
return context.network.request(transformRequest(config));
|
||
},
|
||
get: (url, config) => {
|
||
let finalConfig = config;
|
||
if (finalConfig === undefined) {
|
||
finalConfig = {};
|
||
}
|
||
finalConfig.url = url;
|
||
finalConfig.method = "get";
|
||
return context.network.request(transformRequest(finalConfig));
|
||
},
|
||
post: (url, data, config) => {
|
||
let finalConfig = config;
|
||
if (finalConfig === undefined) {
|
||
finalConfig = {};
|
||
}
|
||
finalConfig.url = url;
|
||
finalConfig.method = "post";
|
||
if (data !== undefined) {
|
||
finalConfig.data = data;
|
||
}
|
||
return context.network.request(transformRequest(finalConfig));
|
||
},
|
||
put: (url, data, config) => {
|
||
let finalConfig = config;
|
||
if (finalConfig === undefined) {
|
||
finalConfig = {};
|
||
}
|
||
finalConfig.url = url;
|
||
finalConfig.method = "put";
|
||
if (data !== undefined) {
|
||
finalConfig.data = data;
|
||
}
|
||
return context.network.request(transformRequest(finalConfig));
|
||
},
|
||
delete: (url, data, config) => {
|
||
let finalConfig = config;
|
||
if (finalConfig === undefined) {
|
||
finalConfig = {};
|
||
}
|
||
finalConfig.url = url;
|
||
finalConfig.method = "delete";
|
||
return context.network.request(transformRequest(finalConfig));
|
||
},
|
||
};
|
||
}
|
||
|
||
function storage(context) {
|
||
return {
|
||
setItem: (key, value, zone) => {
|
||
return context.storage.setItem({ key, value, zone });
|
||
},
|
||
getItem: (key, zone) => {
|
||
return context.storage.getItem({ key, zone });
|
||
},
|
||
remove: (key, zone) => {
|
||
return context.storage.remove({ key, zone });
|
||
},
|
||
clear: (zone) => {
|
||
return context.storage.clear({ zone });
|
||
},
|
||
};
|
||
}
|
||
|
||
function popover(context) {
|
||
const entity = context.entity;
|
||
let panel = undefined;
|
||
if (entity instanceof Panel) {
|
||
panel = entity;
|
||
}
|
||
return {
|
||
show: (view) => {
|
||
if (panel) {
|
||
panel.addHeadView(view);
|
||
}
|
||
return context.popover.show(view.toModel());
|
||
},
|
||
dismiss: (view = undefined) => {
|
||
if (panel) {
|
||
if (view) {
|
||
panel.removeHeadView(view);
|
||
}
|
||
else {
|
||
panel.clearHeadViews();
|
||
}
|
||
}
|
||
return context.popover.dismiss(view ? { id: view.viewId } : undefined);
|
||
},
|
||
};
|
||
}
|
||
|
||
/*
|
||
* Copyright [2019] [Doric.Pub]
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
function take(target) {
|
||
return (block) => {
|
||
block(target);
|
||
};
|
||
}
|
||
function takeNonNull(target) {
|
||
return (block) => {
|
||
if (target !== undefined) {
|
||
return block(target);
|
||
}
|
||
};
|
||
}
|
||
function takeNull(target) {
|
||
return (block) => {
|
||
if (target === undefined) {
|
||
return block();
|
||
}
|
||
};
|
||
}
|
||
function takeLet(target) {
|
||
return (block) => {
|
||
return block(target);
|
||
};
|
||
}
|
||
function takeAlso(target) {
|
||
return (block) => {
|
||
block(target);
|
||
return target;
|
||
};
|
||
}
|
||
function takeIf(target) {
|
||
return (predicate) => {
|
||
return predicate(target) ? target : undefined;
|
||
};
|
||
}
|
||
function takeUnless(target) {
|
||
return (predicate) => {
|
||
return predicate(target) ? undefined : target;
|
||
};
|
||
}
|
||
function repeat(action) {
|
||
return (times) => {
|
||
for (let i = 0; i < times; i++) {
|
||
action(i);
|
||
}
|
||
};
|
||
}
|
||
|
||
/*
|
||
* Copyright [2019] [Doric.Pub]
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
/**
|
||
* Only supports x,y,width,height,corner(just for four corners),rotation,bgColor,
|
||
* @param panel @see Panel
|
||
*/
|
||
function animate(context) {
|
||
const entity = context.entity;
|
||
if (entity instanceof Panel) {
|
||
let panel = entity;
|
||
return (args) => {
|
||
return takeLet(panel.context.animate)(it => {
|
||
return it.submit().then(() => {
|
||
args.animations();
|
||
return takeLet(panel.getRootView())(root => {
|
||
if (root.isDirty()) {
|
||
const model = root.toModel();
|
||
model.duration = args.duration;
|
||
const ret = it.animateRender(model);
|
||
root.clean();
|
||
return ret;
|
||
}
|
||
for (let v of panel.allHeadViews()) {
|
||
if (v.isDirty()) {
|
||
const model = v.toModel();
|
||
const ret = it.animateRender(model);
|
||
it.clean();
|
||
return ret;
|
||
}
|
||
}
|
||
throw new Error('Cannot find any animated elements');
|
||
});
|
||
});
|
||
});
|
||
};
|
||
}
|
||
else {
|
||
return (args) => {
|
||
return Promise.reject(`Cannot find panel in Context:${context.id}`);
|
||
};
|
||
}
|
||
}
|
||
|
||
class Observable {
|
||
constructor(provider, clz) {
|
||
this.observers = new Set;
|
||
this.provider = provider;
|
||
this.clz = clz;
|
||
}
|
||
addObserver(observer) {
|
||
this.observers.add(observer);
|
||
}
|
||
removeObserver(observer) {
|
||
this.observers.delete(observer);
|
||
}
|
||
update(updater) {
|
||
const oldV = this.provider.acquire(this.clz);
|
||
const newV = updater(oldV);
|
||
if (newV !== undefined) {
|
||
this.provider.provide(newV);
|
||
}
|
||
for (let observer of this.observers) {
|
||
observer(newV);
|
||
}
|
||
}
|
||
}
|
||
class Provider {
|
||
constructor() {
|
||
this.provision = new Map;
|
||
this.observableMap = new Map;
|
||
}
|
||
provide(obj) {
|
||
this.provision.set(obj.constructor, obj);
|
||
}
|
||
acquire(clz) {
|
||
const ret = this.provision.get(clz);
|
||
return ret;
|
||
}
|
||
remove(clz) {
|
||
this.provision.delete(clz);
|
||
}
|
||
clear() {
|
||
this.provision.clear();
|
||
}
|
||
observe(clz) {
|
||
let observable = this.observableMap.get(clz);
|
||
if (observable === undefined) {
|
||
observable = new Observable(this, clz);
|
||
this.observableMap.set(clz, observable);
|
||
}
|
||
return observable;
|
||
}
|
||
}
|
||
|
||
class ViewHolder {
|
||
}
|
||
class ViewModel {
|
||
constructor(obj, v) {
|
||
this.state = obj;
|
||
this.viewHolder = v;
|
||
}
|
||
getState() {
|
||
return this.state;
|
||
}
|
||
updateState(setter) {
|
||
setter(this.state);
|
||
this.onBind(this.state, this.viewHolder);
|
||
}
|
||
attach(view) {
|
||
this.viewHolder.build(view);
|
||
this.onAttached(this.state, this.viewHolder);
|
||
this.onBind(this.state, this.viewHolder);
|
||
}
|
||
}
|
||
class VMPanel extends Panel {
|
||
getViewModel() {
|
||
return this.vm;
|
||
}
|
||
build(root) {
|
||
this.vh = new (this.getViewHolderClass());
|
||
this.vm = new (this.getViewModelClass())(this.getState(), this.vh);
|
||
this.vm.attach(root);
|
||
}
|
||
}
|
||
|
||
exports.AnimationSet = AnimationSet;
|
||
exports.BOTTOM = BOTTOM;
|
||
exports.CENTER = CENTER;
|
||
exports.CENTER_X = CENTER_X;
|
||
exports.CENTER_Y = CENTER_Y;
|
||
exports.Color = Color;
|
||
exports.FlowLayout = FlowLayout;
|
||
exports.FlowLayoutItem = FlowLayoutItem;
|
||
exports.Gravity = Gravity;
|
||
exports.Group = Group;
|
||
exports.HLayout = HLayout;
|
||
exports.Image = Image;
|
||
exports.Input = Input;
|
||
exports.LEFT = LEFT;
|
||
exports.LayoutConfigImpl = LayoutConfigImpl;
|
||
exports.List = List;
|
||
exports.ListItem = ListItem;
|
||
exports.Mutable = Mutable;
|
||
exports.NativeCall = NativeCall;
|
||
exports.NestedSlider = NestedSlider;
|
||
exports.Observable = Observable;
|
||
exports.Panel = Panel;
|
||
exports.Property = Property;
|
||
exports.Provider = Provider;
|
||
exports.RIGHT = RIGHT;
|
||
exports.Refreshable = Refreshable;
|
||
exports.Root = Root;
|
||
exports.RotationAnimation = RotationAnimation;
|
||
exports.ScaleAnimation = ScaleAnimation;
|
||
exports.Scroller = Scroller;
|
||
exports.SlideItem = SlideItem;
|
||
exports.Slider = Slider;
|
||
exports.Stack = Stack;
|
||
exports.Superview = Superview;
|
||
exports.TOP = TOP;
|
||
exports.Text = Text;
|
||
exports.TranslationAnimation = TranslationAnimation;
|
||
exports.VLayout = VLayout;
|
||
exports.VMPanel = VMPanel;
|
||
exports.View = View;
|
||
exports.ViewHolder = ViewHolder;
|
||
exports.ViewModel = ViewModel;
|
||
exports.animate = animate;
|
||
exports.flowItem = flowItem;
|
||
exports.flowlayout = flowlayout;
|
||
exports.gravity = gravity;
|
||
exports.hlayout = hlayout;
|
||
exports.image = image;
|
||
exports.layoutConfig = layoutConfig;
|
||
exports.list = list;
|
||
exports.listItem = listItem;
|
||
exports.log = log;
|
||
exports.loge = loge;
|
||
exports.logw = logw;
|
||
exports.modal = modal;
|
||
exports.navbar = navbar;
|
||
exports.navigator = navigator;
|
||
exports.network = network;
|
||
exports.obj2Model = obj2Model;
|
||
exports.popover = popover;
|
||
exports.pullable = pullable;
|
||
exports.refreshable = refreshable;
|
||
exports.repeat = repeat;
|
||
exports.scroller = scroller;
|
||
exports.slideItem = slideItem;
|
||
exports.slider = slider;
|
||
exports.stack = stack;
|
||
exports.storage = storage;
|
||
exports.take = take;
|
||
exports.takeAlso = takeAlso;
|
||
exports.takeIf = takeIf;
|
||
exports.takeLet = takeLet;
|
||
exports.takeNonNull = takeNonNull;
|
||
exports.takeNull = takeNull;
|
||
exports.takeUnless = takeUnless;
|
||
exports.text = text;
|
||
exports.uniqueId = uniqueId;
|
||
exports.vlayout = vlayout;
|