8000 GridLayout now calls virtual methods when rows/columns are set throug… · Techhacker/NativeScript@68cdff8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 68cdff8

Browse files
author
Hristo Hristov
committed
GridLayout now calls virtual methods when rows/columns are set through XML.
Added test. Improved code readability.
1 parent 0eee931 commit 68cdff8

21 files changed

+347
-341
lines changed

apps/tests/layouts/grid-layout-tests.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,20 @@ export class GridLayoutTest extends testModule.UITest<GridLayout> {
673673
layoutHelper.assertMeasure(btn, 75, 75);
674674
layoutHelper.assertLayout(btn, 0, 75, 75, 75);
675675
}
676+
677+
public test_parse_should_call_protected_methods() {
678+
let grid = <GridLayout>builder.parse("<GridLayout rows='*, 100'/>");
679+
TKUnit.assertNotNull(grid);
680+
681+
this.testView.addChild(grid);
682+
this.waitUntilTestElementLayoutIsValid();
683+
684+
let rows = grid.getRows();
685+
TKUnit.assertEqual(rows.length, 2, "Should have 2 rows.");
686+
687+
TKUnit.assertTrue(rows[0].isStar, "First row should be *");
688+
TKUnit.assertTrue(rows[1].isAbsolute, "Second row should be Absolute");
689+
}
676690
}
677691

678692
export function createTestCase(): GridLayoutTest {
Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import layouts = require("ui/layouts/layout-base");
2-
import definition = require("ui/layouts/absolute-layout");
3-
import dependencyObservable = require("ui/core/dependency-observable");
4-
import view = require("ui/core/view");
5-
import proxy = require("ui/core/proxy");
1+
import definition = require("ui/layouts/absolute-layout");
2+
import {LayoutBase} from "ui/layouts/layout-base";
3+
import {View} from "ui/core/view";
4+
import {PropertyMetadata} from "ui/core/proxy";
5+
import {Property, PropertyChangeData} from "ui/core/dependency-observable";
66
import {registerSpecialProperty} from "ui/builder/special-properties";
77

8-
function validateArgs(element: view.View): view.View {
8+
function validateArgs(element: View): View {
99
if (!element) {
1010
throw new Error("element cannot be null or undefinied.");
1111
}
@@ -19,59 +19,58 @@ registerSpecialProperty("top", (instance, propertyValue) => {
1919
AbsoluteLayout.setTop(instance, !isNaN(+propertyValue) && +propertyValue);
2020
});
2121

22-
export class AbsoluteLayout extends layouts.LayoutBase implements definition.AbsoluteLayout {
23-
22+
export class AbsoluteLayout extends LayoutBase implements definition.AbsoluteLayout {
2423
private static isValid(value: number): boolean {
2524
return isFinite(value);
2625
}
2726

28-
private static onLeftPropertyChanged(data: dependencyObservable.PropertyChangeData) {
29-
var uiView = data.object;
30-
if (uiView instanceof view.View) {
31-
var layout = uiView.parent;
27+
private static onLeftPropertyChanged(data: PropertyChangeData) {
28+
var view = data.object;
29+
if (view instanceof View) {
30+
var layout = view.parent;
3231
if (layout instanceof AbsoluteLayout) {
33-
layout.onLeftChanged(uiView, data.oldValue, data.newValue);
32+
layout.onLeftChanged(view, data.oldValue, data.newValue);
3433
}
3534
}
3635
}
3736

38-
private static onTopPropertyChanged(data: dependencyObservable.PropertyChangeData) {
39-
var uiView = data.object;
40-
if (uiView instanceof view.View) {
41-
var layout = uiView.parent;
37+
private static onTopPropertyChanged(data: PropertyChangeData) {
38+
var view = data.object;
39+
if (view instanceof View) {
40+
var layout = view.parent;
4241
if (layout instanceof AbsoluteLayout) {
43-
layout.onTopChanged(uiView, data.oldValue, data.newValue);
42+
layout.onTopChanged(view, data.oldValue, data.newValue);
4443
}
4544
}
4645
}
4746

48-
public static leftProperty = new dependencyObservable.Property("left", "AbsoluteLayout",
49-
new proxy.PropertyMetadata(0, undefined, AbsoluteLayout.onLeftPropertyChanged, AbsoluteLayout.isValid));
47+
public static leftProperty = new Property("left", "AbsoluteLayout",
48+
new PropertyMetadata(0, undefined, AbsoluteLayout.onLeftPropertyChanged, AbsoluteLayout.isValid));
5049

51-
public static topProperty = new dependencyObservable.Property("top", "AbsoluteLayout",
52-
new proxy.PropertyMetadata(0, undefined, AbsoluteLayout.onTopPropertyChanged, AbsoluteLayout.isValid));
50+
public static topProperty = new Property("top", "AbsoluteLayout",
51+
new PropertyMetadata(0, undefined, AbsoluteLayout.onTopPropertyChanged, AbsoluteLayout.isValid));
5352

54-
public static getLeft(element: view.View): number {
53+
public static getLeft(element: View): number {
5554
return validateArgs(element)._getValue(AbsoluteLayout.leftProperty);
5655
}
5756

58-
public static setLeft(element: view.View, value: number): void {
57+
public static setLeft(element: View, value: number): void {
5958
validateArgs(element)._setValue(AbsoluteLayout.leftProperty, value);
6059
}
6160

62-
public static getTop(element: view.View): number {
61+
public static getTop(element: View): number {
6362
return validateArgs(element)._getValue(AbsoluteLayout.topProperty);
6463
}
6564

66-
public static setTop(element: view.View, value: number): void {
65+
public static setTop(element: View, value: number): void {
6766
validateArgs(element)._setValue(AbsoluteLayout.topProperty, value);
6867
}
6968

70-
protected onLeftChanged(view: view.View, oldValue: number, newValue: number) {
69+
protected onLeftChanged(view: View, oldValue: number, newValue: number) {
7170
//
7271
}
7372

74-
protected onTopChanged(view: view.View, oldValue: number, newValue: number) {
73+
protected onTopChanged(view: View, oldValue: number, newValue: number) {
7574
//
7675
}
77-
}
76+
}
Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
import utils = require("utils/utils");
22
import common = require("./absolute-layout-common");
3-
import dependencyObservable = require("ui/core/dependency-observable");
4-
import proxy = require("ui/core/proxy");
5-
import * as viewModule from "ui/core/view";
3+
import {View} from "ui/core/view";
4+
import {PropertyMetadata} from "ui/core/proxy";
5+
import {PropertyChangeData} from "ui/core/dependency-observable";
66

77
global.moduleMerge(common, exports);
88

9-
function setNativeProperty(data: dependencyObservable.PropertyChangeData, setter: (lp: org.nativescript.widgets.CommonLayoutParams) => void) {
10-
var view: typeof viewModule = require("ui/core/view");
11-
12-
var uiView = data.object;
13-
if (uiView instanceof view.View) {
14-
var nativeView: android.view.View = (<any>uiView)._nativeView;
9+
function setNativeProperty(data: PropertyChangeData, setter: (lp: org.nativescript.widgets.CommonLayoutParams) => void) {
10+
var view = data.object;
11+
if (view instanceof View) {
12+
var nativeView: android.view.View = view._nativeView;
1513

1614
var lp = <org.nativescript.widgets.CommonLayoutParams>nativeView.getLayoutParams();
1715
if (!(lp instanceof org.nativescript.widgets.CommonLayoutParams)) {
@@ -22,16 +20,16 @@ function setNativeProperty(data: dependencyObservable.PropertyChangeData, setter
2220
}
2321
}
2422

25-
function setNativeLeftProperty(data: dependencyObservable.PropertyChangeData) {
23+
function setNativeLeftProperty(data: PropertyChangeData) {
2624
setNativeProperty(data, (lp) => { lp.left = data.newValue * utils.layout.getDisplayDensity(); });
2725
}
2826

29-
function setNativeTopProperty(data: dependencyObservable.PropertyChangeData) {
27+
function setNativeTopProperty(data: PropertyChangeData) {
3028
setNativeProperty(data, (lp) => { lp.top = data.newValue * utils.layout.getDisplayDensity(); });
3129
}
3230

33-
(<proxy.PropertyMetadata>common.AbsoluteLayout.leftProperty.metadata).onSetNativeValue = setNativeLeftProperty;
34-
(<proxy.PropertyMetadata>common.AbsoluteLayout.topProperty.metadata).onSetNativeValue = setNativeTopProperty;
31+
(<PropertyMetadata>common.AbsoluteLayout.leftProperty.metadata).onSetNativeValue = setNativeLeftProperty;
32+
(<PropertyMetadata>common.AbsoluteLayout.topProperty.metadata).onSetNativeValue = setNativeTopProperty;
3533

3634
export class AbsoluteLayout extends common.AbsoluteLayout {
3735

@@ -48,4 +46,4 @@ export class AbsoluteLayout extends common.AbsoluteLayout {
4846
public _createUI() {
4947
this._layout = new org.nativescript.widgets.AbsoluteLayout(this._context);
5048
}
51-
}
49+
}
Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,41 @@
11
declare module "ui/layouts/absolute-layout" {
2-
import layout = require("ui/layouts/layout-base");
3-
import view = require("ui/core/view");
4-
import dependencyObservable = require("ui/core/dependency-observable");
2+
import {LayoutBase} from "ui/layouts/layout-base";
3+
import {View} from "ui/core/view";
4+
import {Property} from "ui/core/dependency-observable";
55

66
/**
77
* A layout that lets you specify exact locations (left/top coordinates) of its children.
88
*/
9-
class AbsoluteLayout extends layout.LayoutBase {
9+
class AbsoluteLayout extends LayoutBase {
1010

1111
/**
1212
* Represents the observable property backing the left property.
1313
*/
14-
public static leftProperty: dependencyObservable.Property;
14+
public static leftProperty: Property;
1515

1616
/**
1717
* Represents the observable property backing the top property.
1818
*/
19-
public static topProperty: dependencyObservable.Property;
19+
public static topProperty: Property;
2020

2121
/**
2222
* Gets the value of the Left property from a given View.
2323
*/
24-
static getLeft(view: view.View): number;
24+
static getLeft(view: View): number;
2525

2626
/**
2727
* Sets the value of the Left property from a given View.
2828
*/
29-
static setLeft(view: view.View, value: number): void;
29+
static setLeft(view: View, value: number): void;
3030

3131
/**
3232
* Gets the value of the Top property from a given View.
3333
*/
34-
static getTop(view: view.View): number;
34+
static getTop(view: View): number;
3535

3636
/**
3737
* Sets the value of the Top property from a given View.
3838
*/
39-
static setTop(view: view.View, value: number): void 10000 ;
40-
39+
static setTop(view: View, value: number): void;
4140
}
4241
}

ui/layouts/absolute-layout/absolute-layout.ios.ts

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,42 @@
11
import utils = require("utils/utils");
2-
import view = require("ui/core/view");
32
import common = require("./absolute-layout-common");
3+
import {View} from "ui/core/view";
44
import {CommonLayoutParams, nativeLayoutParamsProperty} from "ui/styling/style";
55

66
global.moduleMerge(common, exports);
77

88
export class AbsoluteLayout extends common.AbsoluteLayout {
9-
10-
protected onLeftChanged(view: view.View, oldValue: number, newValue: number) {
9+
protected onLeftChanged(view: View, oldValue: number, newValue: number) {
1110
this.requestLayout();
1211
}
1312

14-
protected onTopChanged(view: view.View, oldValue: number, newValue: number) {
13+
protected onTopChanged(view: View, oldValue: number, newValue: number) {
1514
this.requestLayout();
1615
}
1716

1817
public onMeasure(widthMeasureSpec: number, heightMeasureSpec: number): void {
1918
AbsoluteLayout.adjustChildrenLayoutParams(this, widthMeasureSpec, heightMeasureSpec);
2019
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
2120

22-
var measureWidth = 0;
23-
var measureHeight = 0;
24-
25-
var width = utils.layout.getMeasureSpecSize(widthMeasureSpec);
26-
var widthMode = utils.layout.getMeasureSpecMode(widthMeasureSpec);
27-
28-
var height = utils.layout.getMeasureSpecSize(heightMeasureSpec);
29-
var heightMode = utils.layout.getMeasureSpecMode(heightMeasureSpec);
30-
31-
var childMeasureSpec = utils.layout.makeMeasureSpec(0, utils.layout.UNSPECIFIED);
32-
var density = utils.layout.getDisplayDensity();
21+
let measureWidth = 0;
22+
let measureHeight = 0;
23+
24+
let width = utils.layout.getMeasureSpecSize(widthMeasureSpec);
25+
let widthMode = utils.layout.getMeasureSpecMode(widthMeasureSpec);
26+
27+
let height = utils.layout.getMeasureSpecSize(heightMeasureSpec);
28+
let heightMode = utils.layout.getMeasureSpecMode(heightMeasureSpec);
29+
30+
let childMeasureSpec = utils.layout.makeMeasureSpec(0, utils.layout.UNSPECIFIED);
31+
let density = utils.layout.getDisplayDensity();
3332

3433
for (let i = 0, count = this.getChildrenCount(); i < count; i++) {
3534
let child = this.getChildAt(i);
3635
if (!child._isVisible) {
3736
continue;
3837
}
3938

40-
let childSize = view.View.measureChild(this, child, childMeasureSpec, childMeasureSpec);
39+
let childSize = View.measureChild(this, child, childMeasureSpec, childMeasureSpec);
4140
measureWidth = Math.max(measureWidth, AbsoluteLayout.getLeft(child) * density + childSize.measuredWidth);
4241
measureHeight = Math.max(measureHeight, AbsoluteLayout.getTop(child) * density + childSize.measuredHeight);
4342
}
@@ -48,16 +47,16 @@ export class AbsoluteLayout extends common.AbsoluteLayout {
4847
measureWidth = Math.max(measureWidth, this.minWidth * density);
4948
measureHeight = Math.max(measureHeight, this.minHeight * density);
5049

51-
var widthAndState = view.View.resolveSizeAndState(measureWidth, width, widthMode, 0);
52-
var heightAndState = view.View.resolveSizeAndState(measureHeight, height, heightMode, 0);
50+
let widthAndState = View.resolveSizeAndState(measureWidth, width, widthMode, 0);
51+
let heightAndState = View.resolveSizeAndState(measureHeight, height, heightMode, 0);
5352

5453
this.setMeasuredDimension(widthAndState, heightAndState);
5554
}
5655

5756
public onLayout(left: number, top: number, right: number, bottom: number): void {
5857
super.onLayout(left, top, right, bottom);
5958

60-
var density = utils.layout.getDisplayDensity();
59+
let density = utils.layout.getDisplayDensity();
6160
for (let i = 0, count = this.getChildrenCount(); i < count; i++) {
6261
let child = this.getChildAt(i);
6362
if (!child._isVisible) {
@@ -74,7 +73,7 @@ export class AbsoluteLayout extends common.AbsoluteLayout {
7473
let childRight = childLeft + childWidth + (lp.leftMargin + lp.rightMargin) * density;
7574
let childBottom = childTop + childHeight + (lp.topMargin + lp.bottomMargin) * density;
7675

77-
view.View.layoutChild(this, child, childLeft, childTop, childRight, childBottom);
76+
View.layoutChild(this, child, childLeft, childTop, childRight, childBottom);
7877
}
7978

8079
AbsoluteLayout.restoreOriginalParams(this);

0 commit comments

Comments
 (0)
0