Skip to content

Commit dd6543d

Browse files
author
Hristo Hristov
committed
Merge pull request NativeScript#1396 from NativeScript/hhristov/layout-fixes
Fixed bug in GridLayout
2 parents 97738bd + 345d007 commit dd6543d

File tree

8 files changed

+1076
-706
lines changed

8 files changed

+1076
-706
lines changed

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

Lines changed: 117 additions & 112 deletions
Large diffs are not rendered by default.

apps/tests/layouts/layout-helper.android.ts

Lines changed: 151 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,88 @@
1-
import button = require("ui/button");
1+
import {View} from "ui/core/view";
2+
import {Button} from "ui/button";
23
import {StackLayout} from "ui/layouts/stack-layout";
4+
import {GridLayout} from "ui/layouts/grid-layout";
5+
36
import utils = require("utils/utils");
47
import TKUnit = require("../TKUnit");
58
import def = require("./layout-helper");
69

710
var DELTA = 0.1;
811

9-
export class NativeButton extends android.widget.Button {
10-
11-
private owner: MyButton;
12+
class NativeButton extends android.widget.Button {
13+
private owner: def.MeasuredView;
1214

13-
constructor(context: android.content.Context, owner: MyButton) {
15+
constructor(context: android.content.Context, owner: def.MeasuredView) {
1416
super(context);
1517
this.owner = owner;
1618
return global.__native(this);
1719
}
1820

1921
protected onMeasure(widthMeasureSpec: number, heightMeasureSpec: number): void {
2022
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
21-
this.owner._oldWidthMeasureSpec = widthMeasureSpec;
22-
this.owner._oldHeightMeasureSpec = heightMeasureSpec;
23+
this.owner.widthMeasureSpec = widthMeasureSpec;
24+
this.owner.heightMeasureSpec = heightMeasureSpec;
25+
this.owner.measureCount++;
26+
}
2327

24-
this.owner._measureWidth = utils.layout.getMeasureSpecSize(widthMeasureSpec);
25-
this.owner._measureHeight = utils.layout.getMeasureSpecSize(heightMeasureSpec);
28+
protected onLayout(changed: boolean, left: number, top: number, right: number, bottom: number): void {
29+
super.onLayout(changed, left, top, right, bottom);
30+
this.owner.arrangeCount++;
31+
}
32+
}
33+
34+
class NativeStackLayout extends org.nativescript.widgets.StackLayout {
35+
private owner: def.MeasuredView;
36+
37+
constructor(context: android.content.Context, owner: def.MeasuredView) {
38+
super(context);
39+
this.owner = owner;
40+
return global.__native(this);
41+
}
42+
43+
protected onMeasure(widthMeasureSpec: number, heightMeasureSpec: number): void {
44+
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
45+
this.owner.widthMeasureSpec = widthMeasureSpec;
46+
this.owner.heightMeasureSpec = heightMeasureSpec;
2647
this.owner.measureCount++;
2748
}
2849

2950
protected onLayout(changed: boolean, left: number, top: number, right: number, bottom: number): void {
30-
this.owner._layoutLeft = left;
31-
this.owner._layoutTop = top;
32-
this.owner._layoutWidth = right - left;
33-
this.owner._layoutHeight = bottom - top;
51+
super.onLayout(changed, left, top, right, bottom);
52+
this.owner.arrangeCount++;
53+
}
54+
}
55+
56+
class NativeGridLayout extends org.nativescript.widgets.GridLayout {
57+
private owner: def.MeasuredView;
58+
59+
constructor(context: android.content.Context, owner: def.MeasuredView) {
60+
super(context);
61+
this.owner = owner;
62+
return global.__native(this);
63+
}
64+
65+
protected onMeasure(widthMeasureSpec: number, heightMeasureSpec: number): void {
66+
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
67+
this.owner.widthMeasureSpec = widthMeasureSpec;
68+
this.owner.heightMeasureSpec = heightMeasureSpec;
69+
this.owner.measureCount++;
70+
}
3471

72+
protected onLayout(changed: boolean, left: number, top: number, right: number, bottom: number): void {
3573
super.onLayout(changed, left, top, right, bottom);
3674
this.owner.arrangeCount++;
3775
}
3876
}
3977

40-
export class MyButton extends button.Button implements def.MyButton {
41-
private _layout: NativeButton;
78+
export class MyButton extends Button implements def.MyButton {
79+
private _layout: android.view.View;
4280

43-
get android(): NativeButton {
81+
get android(): android.view.View {
4482
return this._layout;
4583
}
4684

47-
get _nativeView(): NativeButton {
85+
get _nativeView(): android.view.View {
4886
return this._layout;
4987
}
5088

@@ -55,16 +93,15 @@ export class MyButton extends button.Button implements def.MyButton {
5593
public measureCount: number = 0;
5694
public arrangeCount: number = 0;
5795

58-
_oldWidthMeasureSpec: number = Number.NaN;
59-
_oldHeightMeasureSpec: number = Number.NaN;
60-
61-
_layoutLeft;
62-
_layoutTop;
63-
_layoutWidth;
64-
_layoutHeight;
96+
public widthMeasureSpec: number = Number.NaN;
97+
public heightMeasureSpec: number = Number.NaN;
6598

66-
_measureWidth;
67-
_measureHeight;
99+
public get measureWidth() {
100+
return utils.layout.getMeasureSpecSize(this.widthMeasureSpec);
101+
}
102+
public get measureHeight() {
103+
return utils.layout.getMeasureSpecSize(this.heightMeasureSpec);
104+
}
68105

69106
public get measured(): boolean {
70107
return this.measureCount > 0;
@@ -74,100 +111,143 @@ export class MyButton extends button.Button implements def.MyButton {
74111
return this.arrangeCount > 0;
75112
}
76113

77-
get measureHeight(): number {
78-
return this._measureHeight;
79-
}
80-
81-
get measureWidth(): number {
82-
return this._measureWidth;
83-
}
84-
85114
get layoutWidth(): number {
86-
return this._layoutWidth;
115+
return this._layout.getWidth();
87116
}
88117

89118
get layoutHeight(): number {
90-
return this._layoutHeight;
119+
return this._layout.getHeight();
91120
}
92-
121+
93122
get layoutLeft(): number {
94-
return this._layoutLeft;
123+
return this._layout.getLeft();
95124
}
96125

97126
get layoutTop(): number {
98-
return this._layoutTop;
127+
return this._layout.getTop();
99128
}
129+
}
130+
131+
export class MyStackLayout extends StackLayout implements def.MyStackLayout {
132+
private _layout: android.view.View;
100133

101-
_getCurrentMeasureSpecs(): { widthMeasureSpec: number; heightMeasureSpec: number } {
102-
return {
103-
widthMeasureSpec: this._oldWidthMeasureSpec,
104-
heightMeasureSpec: this._oldHeightMeasureSpec
105-
};
134+
get android(): android.view.View {
135+
return this._layout;
106136
}
107-
}
108137

109-
export class NativeStackLayout extends org.nativescript.widgets.StackLayout {
110-
111-
private owner: MyStackLayout;
138+
get _nativeView(): android.view.View {
139+
return this._layout;
140+
}
112141

113-
constructor(context: android.content.Context, owner: MyStackLayout) {
114-
super(context);
115-
this.owner = owner;
116-
return global.__native(this);
142+
public _createUI() {
143+
this._layout = new NativeStackLayout(this._context, this);
117144
}
118145

119-
protected onMeasure(widthMeasureSpec: number, heightMeasureSpec: number): void {
120-
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
121-
this.owner.measureCount++;
146+
public measureCount: number = 0;
147+
public arrangeCount: number = 0;
148+
149+
public widthMeasureSpec: number = Number.NaN;
150+
public heightMeasureSpec: number = Number.NaN;
151+
152+
public get measureWidth() {
153+
return utils.layout.getMeasureSpecSize(this.widthMeasureSpec);
154+
}
155+
public get measureHeight() {
156+
return utils.layout.getMeasureSpecSize(this.heightMeasureSpec);
122157
}
123158

124-
protected onLayout(changed: boolean, left: number, top: number, right: number, bottom: number): void {
125-
super.onLayout(changed, left, top, right, bottom);
126-
this.owner.arrangeCount++;
159+
public get measured(): boolean {
160+
return this.measureCount > 0;
161+
}
162+
163+
public get arranged(): boolean {
164+
return this.arrangeCount > 0;
165+
}
166+
167+
get layoutWidth(): number {
168+
return this._layout.getWidth();
169+
}
170+
171+
get layoutHeight(): number {
172+
return this._layout.getHeight();
173+
}
174+
175+
get layoutLeft(): number {
176+
return this._layout.getLeft();
177+
}
178+
179+
get layoutTop(): number {
180+
return this._layout.getTop();
127181
}
128182
}
129183

130-
export class MyStackLayout extends StackLayout implements def.MyStackLayout {
131-
private _layout: NativeStackLayout;
184+
export class MyGridLayout extends GridLayout implements def.MyGridLayout {
185+
private _layout: android.view.View;
132186

133-
get android(): NativeStackLayout {
187+
get android(): android.view.View {
134188
return this._layout;
135189
}
136190

137-
get _nativeView(): NativeStackLayout {
191+
get _nativeView(): android.view.View {
138192
return this._layout;
139193
}
140194

141195
public _createUI() {
142-
this._layout = new NativeStackLayout(this._context, this);
196+
this._layout = new NativeGridLayout(this._context, this);
143197
}
144198

145199
public measureCount: number = 0;
146200
public arrangeCount: number = 0;
147201

202+
public widthMeasureSpec: number = Number.NaN;
203+
public heightMeasureSpec: number = Number.NaN;
204+
205+
public get measureWidth() {
206+
return utils.layout.getMeasureSpecSize(this.widthMeasureSpec);
207+
}
208+
public get measureHeight() {
209+
return utils.layout.getMeasureSpecSize(this.heightMeasureSpec);
210+
}
211+
148212
public get measured(): boolean {
149213
return this.measureCount > 0;
150214
}
151215

152216
public get arranged(): boolean {
153217
return this.arrangeCount > 0;
154218
}
219+
220+
get layoutWidth(): number {
221+
return this._layout.getWidth();
222+
}
223+
224+
get layoutHeight(): number {
225+
return this._layout.getHeight();
226+
}
227+
228+
get layoutLeft(): number {
229+
return this._layout.getLeft();
230+
}
231+
232+
get layoutTop(): number {
233+
return this._layout.getTop();
234+
}
155235
}
156236

157-
export function assertMeasure(btn: MyButton, width: number, height: number, name?: string) {
237+
export function assertMeasure(view: def.MeasuredView, width: number, height: number, name?: string) {
158238
name = name ? "[" + name + "]" : "";
159239

160-
TKUnit.assertAreClose(btn.measureWidth, width, DELTA, name + "width");
161-
TKUnit.assertAreClose(btn.measureHeight, height, DELTA, name + "height");
240+
TKUnit.assertAreClose(view.measureWidth, width, DELTA, name + "width");
241+
TKUnit.assertAreClose(view.measureHeight, height, DELTA, name + "height");
162242
}
163243

164-
export function assertLayout(btn: MyButton, left: number, top: number, width: number, height: number, name?: string): void {
244+
export function assertLayout(view: def.MeasuredView, left: number, top: number, width: number, height: number, name?: string): void {
165245
name = name ? "[" + name + "]" : "";
166246

167-
TKUnit.assertAreClose(btn.layoutLeft, left, DELTA, name + "left");
168-
TKUnit.assertAreClose(btn.layoutTop, top, DELTA, name + "top");
169-
TKUnit.assertAreClose(btn.layoutWidth, width, DELTA, name + "width");
170-
TKUnit.assertAreClose(btn.layoutHeight, height, DELTA, name + "height");
247+
TKUnit.assertAreClose(view.layoutLeft, left, DELTA, name + "left");
248+
TKUnit.assertAreClose(view.layoutTop, top, DELTA, name + "top");
249+
TKUnit.assertAreClose(view.layoutWidth, width, DELTA, name + "width");
250+
TKUnit.assertAreClose(view.layoutHeight, height, DELTA, name + "height");
171251
}
172252

173253
export function dp(value: number): number {

0 commit comments

Comments
 (0)