add ts define

This commit is contained in:
pengfei.zhou 2020-04-09 17:07:24 +08:00 committed by osborn
parent dd06675253
commit 404b4b594f
13 changed files with 485 additions and 1 deletions

View File

@ -59,6 +59,7 @@ dependencies {
testImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.facebook.yoga.android:yoga-layout:1.16.0' implementation 'com.facebook.yoga.android:yoga-layout:1.16.0'
} }

View File

@ -49,6 +49,7 @@ import pub.doric.shader.SwitchNode;
import pub.doric.shader.TextNode; import pub.doric.shader.TextNode;
import pub.doric.shader.VLayoutNode; import pub.doric.shader.VLayoutNode;
import pub.doric.shader.ViewNode; import pub.doric.shader.ViewNode;
import pub.doric.shader.flex.FlexNode;
import pub.doric.shader.flowlayout.FlowLayoutItemNode; import pub.doric.shader.flowlayout.FlowLayoutItemNode;
import pub.doric.shader.flowlayout.FlowLayoutNode; import pub.doric.shader.flowlayout.FlowLayoutNode;
import pub.doric.shader.list.ListItemNode; import pub.doric.shader.list.ListItemNode;
@ -120,6 +121,7 @@ public class DoricRegistry {
this.registerViewNode(NestedSliderNode.class); this.registerViewNode(NestedSliderNode.class);
this.registerViewNode(DraggableNode.class); this.registerViewNode(DraggableNode.class);
this.registerViewNode(SwitchNode.class); this.registerViewNode(SwitchNode.class);
this.registerViewNode(FlexNode.class);
initRegistry(this); initRegistry(this);
} }

View File

@ -0,0 +1,54 @@
/*
* 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.
*/
package pub.doric.shader.flex;
import android.view.ViewGroup;
import com.facebook.yoga.android.YogaLayout;
import com.github.pengfeizhou.jscore.JSObject;
import pub.doric.DoricContext;
import pub.doric.extension.bridge.DoricPlugin;
import pub.doric.shader.GroupNode;
import pub.doric.shader.ViewNode;
/**
* @Description: FlexBox Node
* @Author: pengfei.zhou
* @CreateDate: 2020-04-09
*/
@DoricPlugin(name = "FlexLayout")
public class FlexNode extends GroupNode<YogaLayout> {
public FlexNode(DoricContext doricContext) {
super(doricContext);
}
@Override
protected YogaLayout build() {
return new YogaLayout(getContext());
}
@Override
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
return new YogaLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
}
@Override
protected void blendSubLayoutConfig(ViewNode viewNode, JSObject jsObject) {
super.blendSubLayoutConfig(viewNode, jsObject);
}
}

View File

@ -52,6 +52,7 @@
#import "DoricCoordinatorPlugin.h" #import "DoricCoordinatorPlugin.h"
#import "DoricSwitchNode.h" #import "DoricSwitchNode.h"
#import "DoricNotchPlugin.h" #import "DoricNotchPlugin.h"
#import "DoricFlexNode.h"
@interface DoricLibraries : NSObject @interface DoricLibraries : NSObject
@property(nonatomic, strong) NSMutableSet <DoricLibrary *> *libraries; @property(nonatomic, strong) NSMutableSet <DoricLibrary *> *libraries;
@ -139,6 +140,7 @@ - (void)innerRegister {
[self registerViewNode:DoricInputNode.class withName:@"Input"]; [self registerViewNode:DoricInputNode.class withName:@"Input"];
[self registerViewNode:DoricDraggableNode.class withName:@"Draggable"]; [self registerViewNode:DoricDraggableNode.class withName:@"Draggable"];
[self registerViewNode:DoricSwitchNode.class withName:@"Switch"]; [self registerViewNode:DoricSwitchNode.class withName:@"Switch"];
[self registerViewNode:DoricFlexNode.class withName:@"FlexLayout"];
} }
- (void)registerJSBundle:(NSString *)bundle withName:(NSString *)name { - (void)registerJSBundle:(NSString *)bundle withName:(NSString *)name {

View File

@ -0,0 +1,25 @@
/*
* 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.
*/
//
// Created by pengfei.zhou on 2020/4/9.
//
#import <Foundation/Foundation.h>
#import "DoricGroupNode.h"
@interface DoricFlexNode : DoricGroupNode <UIView *>
- (void)blendSubNode:(DoricViewNode *)subNode flexConfig:(NSDictionary *)flexConfig;
@end

View File

@ -0,0 +1,119 @@
/*
* 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.
*/
//
// Created by pengfei.zhou on 2020/4/9.
//
#import <YogaKit/UIView+Yoga.h>
#import "DoricFlexNode.h"
#import "DoricExtensions.h"
#import "YGLayout.h"
@interface DoricFlexView : UIView
@end
@implementation DoricFlexView
- (CGSize)sizeThatFits:(CGSize)size {
return [self.yoga calculateLayoutWithSize:size];
}
@end
@implementation DoricFlexNode
- (UIView *)build {
return [[DoricFlexView new] also:^(DoricFlexView *it) {
it.yoga.isEnabled = YES;
}];
}
- (void)blendView:(UIView *)view forPropName:(NSString *)name propValue:(id)prop {
if ([name isEqualToString:@"flexConfig"]) {
if ([prop isKindOfClass:[NSDictionary class]]) {
[((DoricFlexNode *) self.superNode) blendSubNode:self flexConfig:prop];
}
} else {
[super blendView:view forPropName:name propValue:prop];
}
}
- (void)blendSubNode:(DoricViewNode *)subNode flexConfig:(NSDictionary *)flexConfig {
}
- (void)blendYoga:(YGLayout *)yoga from:(NSDictionary *)flexConfig {
[flexConfig enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
[self blendYoga:yoga name:key value:obj];
}];
}
- (void)blendYoga:(YGLayout *)yoga name:(NSString *)name value:(id)value {
if ([name isEqualToString:@"direction"]) {
yoga.direction = (YGDirection) [(NSNumber *) value integerValue];
} else if ([name isEqualToString:@"flexDirection"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
} else if ([name isEqualToString:@"justifyContent"]) {
yoga.justifyContent = (YGJustify) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"alignContent"]) {
yoga.alignContent = (YGAlign) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}else if ([name isEqualToString:@"justifyContent"]) {
yoga.flexDirection = (YGFlexDirection) [(NSNumber *) value integerValue];
}
}
- (void)requestLayout {
[super requestLayout];
[self.view.yoga applyLayoutPreservingOrigin:NO];
}
@end

View File

@ -29,6 +29,7 @@
#import "DoricSuperNode.h" #import "DoricSuperNode.h"
#import "DoricExtensions.h" #import "DoricExtensions.h"
#import "DoricPromise.h" #import "DoricPromise.h"
#import "DoricFlexNode.h"
void DoricAddEllipticArcPath(CGMutablePathRef path, void DoricAddEllipticArcPath(CGMutablePathRef path,
CGPoint origin, CGPoint origin,
@ -264,6 +265,11 @@ - (void)blendView:(UIView *)view forPropName:(NSString *)name propValue:(id)prop
} else if ([name isEqualToString:@"hidden"]) { } else if ([name isEqualToString:@"hidden"]) {
self.view.hidden = [prop boolValue]; self.view.hidden = [prop boolValue];
self.view.doricLayout.disabled = [prop boolValue]; self.view.doricLayout.disabled = [prop boolValue];
} else if ([name isEqualToString:@"flexConfig"]) {
if ([prop isKindOfClass:[NSDictionary class]]
&& [self.superNode isKindOfClass:[DoricFlexNode class]]) {
[((DoricFlexNode *) self.superNode) blendSubNode:self flexConfig:prop];
}
} else { } else {
DoricLog(@"Blend View error for View Type :%@, prop is %@", self.class, name); DoricLog(@"Blend View error for View Type :%@, prop is %@", self.class, name);
} }

23
doric-js/lib/src/widget/flexlayout.d.ts vendored Normal file
View File

@ -0,0 +1,23 @@
import { IView, Group } from "../ui/view";
import { Modeling } from "../util/types";
declare enum ValueType {
Point = 0,
Percent = 1,
Auto = 2
}
export declare class FlexValue implements Modeling {
type: ValueType;
value: number;
static Auto: FlexValue;
static percent(v: number): FlexValue;
static point(v: number): FlexValue;
toModel(): {
type: ValueType;
value: number;
};
}
export interface IFlex extends IView {
}
export declare class FlexLayout extends Group implements IFlex {
}
export {};

View File

@ -0,0 +1,49 @@
/*
* 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.
*/
import { Group } from "../ui/view";
var ValueType;
(function (ValueType) {
ValueType[ValueType["Point"] = 0] = "Point";
ValueType[ValueType["Percent"] = 1] = "Percent";
ValueType[ValueType["Auto"] = 2] = "Auto";
})(ValueType || (ValueType = {}));
export class FlexValue {
constructor() {
this.type = ValueType.Auto;
this.value = 0;
}
static percent(v) {
const ret = new FlexValue;
ret.type = ValueType.Percent;
ret.value = v;
return ret;
}
static point(v) {
const ret = new FlexValue;
ret.type = ValueType.Point;
ret.value = v;
return ret;
}
toModel() {
return {
type: this.type,
value: this.value,
};
}
}
FlexValue.Auto = new FlexValue;
export class FlexLayout extends Group {
}

View File

@ -20,6 +20,7 @@ import { loge } from "../util/log";
import { BridgeContext } from "../runtime/global"; import { BridgeContext } from "../runtime/global";
import { LayoutConfig } from '../util/layoutconfig' import { LayoutConfig } from '../util/layoutconfig'
import { IAnimation } from "./animation"; import { IAnimation } from "./animation";
import { FlexConfig } from "../util/flexbox";
export function Property(target: View, propKey: string) { export function Property(target: View, propKey: string) {
Object.defineProperty(target, propKey, { Object.defineProperty(target, propKey, {
@ -79,6 +80,11 @@ export interface IView {
*/ */
rotation?: number rotation?: number
/**----------transform----------*/ /**----------transform----------*/
/**
* Only affected when its superview or itself is FlexLayout.
*/
flexConfig?: FlexConfig
} }
export type NativeViewModel = { export type NativeViewModel = {
@ -343,6 +349,9 @@ export abstract class View implements Modeling, IView {
rotation?: number rotation?: number
/**----------transform----------*/ /**----------transform----------*/
@Property
flexConfig?: FlexConfig
doAnimation(context: BridgeContext, animation: IAnimation) { doAnimation(context: BridgeContext, animation: IAnimation) {
return this.nativeChannel(context, "doAnimation")(animation.toModel()).then((args) => { return this.nativeChannel(context, "doAnimation")(animation.toModel()).then((args) => {
for (let key in args) { for (let key in args) {

View File

@ -20,6 +20,7 @@ import { loge } from "../util/log";
import { BridgeContext } from "../runtime/global"; import { BridgeContext } from "../runtime/global";
import { LayoutConfig } from '../util/layoutconfig' import { LayoutConfig } from '../util/layoutconfig'
import { IAnimation } from "./animation"; import { IAnimation } from "./animation";
import { FlexConfig } from "../util/flexbox";
export function Property(target: Object, propKey: string) { export function Property(target: Object, propKey: string) {
Reflect.defineMetadata(propKey, true, target) Reflect.defineMetadata(propKey, true, target)
@ -68,6 +69,11 @@ export interface IView {
*/ */
rotation?: number rotation?: number
/**----------transform----------*/ /**----------transform----------*/
/**
* Only affected when its superview or itself is FlexLayout.
*/
flexConfig?: FlexConfig
} }
export type NativeViewModel = { export type NativeViewModel = {
@ -338,6 +344,9 @@ export abstract class View implements Modeling, IView {
rotation?: number rotation?: number
/**----------transform----------*/ /**----------transform----------*/
@Property
flexConfig?: FlexConfig
doAnimation(context: BridgeContext, animation: IAnimation) { doAnimation(context: BridgeContext, animation: IAnimation) {
return this.nativeChannel(context, "doAnimation")(animation.toModel()).then((args) => { return this.nativeChannel(context, "doAnimation")(animation.toModel()).then((args) => {
for (let key in args) { for (let key in args) {

View File

@ -0,0 +1,168 @@
/*
* 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.
*/
import { Modeling } from "./types";
enum ValueType {
Point = 0,
Percent = 1,
Auto = 2,
}
export class FlexValue implements Modeling {
type = ValueType.Auto
value = 0
static Auto = new FlexValue
static percent(v: number) {
const ret = new FlexValue
ret.type = ValueType.Percent
ret.value = v
return ret
}
static point(v: number) {
const ret = new FlexValue
ret.type = ValueType.Point
ret.value = v
return ret
}
toModel() {
return {
type: this.type,
value: this.value,
}
}
}
export enum FlexDirection {
COLUMN = 0,
COLUMN_REVERSE = 1,
ROW = 2,
ROW_REVERSE = 3,
}
export enum Align {
AUTO = 0,
FLEX_START = 1,
CENTER = 2,
FLEX_END = 3,
STRETCH = 4,
BASELINE = 5,
SPACE_BETWEEN = 6,
SPACE_AROUND = 7,
}
export enum Justify {
FLEX_START = 0,
CENTER = 1,
FLEX_END = 2,
SPACE_BETWEEN = 3,
SPACE_AROUND = 4,
SPACE_EVENLY = 5,
}
export enum Direction {
INHERIT = 0,
LTR = 1,
RTL = 2,
}
export enum PositionType {
RELATIVE = 0,
ABSOLUTE = 1,
}
export enum Wrap {
NO_WRAP = 0,
WRAP = 1,
WRAP_REVERSE = 2,
}
export enum OverFlow {
VISIBLE = 0,
HIDDEN = 1,
SCROLL = 2,
}
export enum Display {
FLEX = 0,
NONE = 1,
}
export interface FlexConfig {
direction?: Direction
flexDirection?: FlexDirection
justifyContent?: Justify
alignContent?: Align
alignItems?: Align
alignSelf?: Align
positionType?: PositionType
flexWrap?: Wrap
overFlow?: OverFlow
display?: Display
flex?: number
flexGrow?: number
flexShrink?: number
flexBasis?: FlexValue
marginLeft?: FlexValue
marginRight?: FlexValue
marginTop?: FlexValue
marginBottom?: FlexValue
marginStart?: FlexValue
marginEnd?: FlexValue
marginHorizontal?: FlexValue
marginVertical?: FlexValue
margin?: FlexValue
paddingLeft?: FlexValue
paddingRight?: FlexValue
paddingTop?: FlexValue
paddingBottom?: FlexValue
paddingStart?: FlexValue
paddingEnd?: FlexValue
paddingHorizontal?: FlexValue
paddingVertical?: FlexValue
padding?: FlexValue
borderWidthLeft?: FlexValue
borderWidthRight?: FlexValue
borderWidthTop?: FlexValue
borderWidthBottom?: FlexValue
borderWidthStart?: FlexValue
borderWidthEnd?: FlexValue
borderWidth?: FlexValue
left?: FlexValue
right?: FlexValue
top?: FlexValue
bottom?: FlexValue
start?: FlexValue
end?: FlexValue
width?: FlexValue
height?: FlexValue
minWidth?: FlexValue
minHeight?: FlexValue
maxWidth?: FlexValue
maxHeight?: FlexValue
aspectRatio?: number
}

View File

@ -92,3 +92,20 @@ export function vlayout(views: View[], config?: IVLayout) {
} }
return ret return ret
} }
export class FlexLayout extends Group {
}
export function flexlayout(views: View[], config: IView) {
const ret = new FlexLayout
for (let v of views) {
ret.addChild(v)
}
if (config) {
for (let key in config) {
Reflect.set(ret, key, Reflect.get(config, key, config), ret)
}
}
}