Skip to content

Commit 3962ac1

Browse files
author
Hristo Hristov
authored
AffectsLayout done only for iOS. Android will invalidate itself when needed. (NativeScript#2307)
1 parent 62c1d20 commit 3962ac1

File tree

11 files changed

+108
-167
lines changed

11 files changed

+108
-167
lines changed

tests/app/app/style_props.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import style = require("ui/styling/style");
2-
import observable = require("ui/core/dependency-observable");
2+
import {PropertyMetadata, PropertyMetadataSettings} from "ui/core/dependency-observable";
33
import styleProperty = require("ui/styling/style-property");
44
import view = require("ui/core/view");
55
import buttonModule = require("ui/button");
66
import pages = require("ui/page");
77
import stackLayoutDef = require("ui/layouts/stack-layout");
8+
import {isAndroid} from "platform";
89

9-
export var fontFamilyProperty = new styleProperty.Property("fontFamily", "font-family",
10-
new observable.PropertyMetadata(undefined, observable.PropertyMetadataSettings.AffectsLayout));
10+
// on Android we explicitly set propertySettings to None because android will invalidate its layout (skip unnecessary native call).
11+
let AffectsLayout = isAndroid ? PropertyMetadataSettings.None : PropertyMetadataSettings.AffectsLayout;
12+
13+
export var fontFamilyProperty = new styleProperty.Property("fontFamily", "font-family", new PropertyMetadata(undefined, AffectsLayout));
1114

1215
export class MyTextViewStyler implements style.Styler {
1316
public static setFontFamilyProperty(view: view.View, newValue: any) {

tests/app/ui/label/label-tests.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,6 @@ export class LabelTest extends testModule.UITest<LabelModule.Label> {
152152
}
153153
}
154154

155-
public test_Set_TextWrap_TNS() {
156-
var label = this.testView;
157-
label.textWrap = true;
158-
159-
var actual = label._getValue(LabelModule.Label.textWrapProperty);
160-
TKUnit.assertEqual(actual, true);
161-
}
162-
163155
public test_Set_TextWrap_Native() {
164156
var testLabel = this.testView;
165157
testLabel.textWrap = true;

tns-core-modules/ui/activity-indicator/activity-indicator-common.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1-
import view = require("ui/core/view");
1+
import {View} from "ui/core/view";
22
import definition = require("ui/activity-indicator");
3-
import dependencyObservable = require("ui/core/dependency-observable");
3+
import {PropertyMetadataSettings, Property} from "ui/core/dependency-observable";
44
import proxy = require("ui/core/proxy");
55

6-
var busyProperty = new dependencyObservable.Property(
7-
"busy",
8-
"ActivityIndicator",
9-
new proxy.PropertyMetadata(false, dependencyObservable.PropertyMetadataSettings.AffectsLayout)
10-
);
6+
let busyProperty = new Property("busy", "ActivityIndicator", new proxy.PropertyMetadata(false));
117

12-
export class ActivityIndicator extends view.View implements definition.ActivityIndicator {
8+
export class ActivityIndicator extends View implements definition.ActivityIndicator {
139

1410
public static busyProperty = busyProperty;
1511

tns-core-modules/ui/activity-indicator/activity-indicator.ios.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@ function onBusyPropertyChanged(data: dependencyObservable.PropertyChangeData) {
99
if (!indicator.ios) {
1010
return;
1111
}
12-
12+
13+
let activityIndicator = indicator.ios;
1314
if (data.newValue) {
14-
indicator.ios.startAnimating();
15+
activityIndicator.startAnimating();
1516
} else {
16-
indicator.ios.stopAnimating();
17+
activityIndicator.stopAnimating();
18+
}
19+
20+
if (activityIndicator.hidesWhenStopped) {
21+
indicator.requestLayout();
1722
}
1823
}
1924

tns-core-modules/ui/button/button-common.ts

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1-
import dependencyObservable = require("ui/core/dependency-observable");
1+
import {Property, PropertyMetadataSettings, PropertyChangeData} from "ui/core/dependency-observable";
22
import view = require("ui/core/view");
33
import definition = require("ui/button");
44
import proxy = require("ui/core/proxy");
55
import formattedString = require("text/formatted-string");
66
import observable = require("data/observable");
77
import * as weakEventListenerModule from "ui/core/weak-event-listener";
8-
import * as enumsModule from "ui/enums";
8+
import {WhiteSpace} from "ui/enums";
9+
10+
import {isAndroid} from "platform";
11+
12+
// on Android we explicitly set propertySettings to None because android will invalidate its layout (skip unnecessary native call).
13+
let AffectsLayout = isAndroid ? PropertyMetadataSettings.None : PropertyMetadataSettings.AffectsLayout;
914

1015
var weakEvents: typeof weakEventListenerModule;
1116
function ensureWeakEvents() {
@@ -14,35 +19,20 @@ function ensureWeakEvents() {
1419
}
1520
}
1621

17-
var enums: typeof enumsModule;
18-
function ensureEnums() {
19-
if (!enums) {
20-
enums = require("ui/enums");
21-
}
22-
}
23-
24-
var textProperty = new dependencyObservable.Property(
25-
"text",
26-
"Button",
27-
new proxy.PropertyMetadata("", dependencyObservable.PropertyMetadataSettings.AffectsLayout)
28-
);
29-
30-
var formattedTextProperty = new dependencyObservable.Property(
31-
"formattedText",
32-
"Button",
33-
new proxy.PropertyMetadata("", dependencyObservable.PropertyMetadataSettings.AffectsLayout)
34-
);
22+
const textProperty = new Property("text", "Button", new proxy.PropertyMetadata("", AffectsLayout));
23+
const formattedTextProperty = new Property("formattedText", "Button", new proxy.PropertyMetadata("", AffectsLayout));
24+
const textWrapProperty = new Property("textWrap", "Button", new proxy.PropertyMetadata(false, AffectsLayout));
3525

36-
function onTextPropertyChanged(data: dependencyObservable.PropertyChangeData) {
26+
function onTextPropertyChanged(data: PropertyChangeData) {
3727
var button = <Button>data.object;
38-
28+
3929
button._onTextPropertyChanged(data);
4030

4131
button.style._updateTextDecoration();
42-
button.style._updateTextTransform();
32+
button.style._updateTextTransform();
4333
}
4434

45-
function onFormattedTextPropertyChanged(data: dependencyObservable.PropertyChangeData) {
35+
function onFormattedTextPropertyChanged(data: PropertyChangeData) {
4636
var button = <Button>data.object;
4737
button._onFormattedTextPropertyChanged(data);
4838
}
@@ -55,12 +45,7 @@ export class Button extends view.View implements definition.Button {
5545
public static tapEvent = "tap";
5646
public static textProperty = textProperty;
5747
public static formattedTextProperty = formattedTextProperty;
58-
59-
public static textWrapProperty = new dependencyObservable.Property(
60-
"textWrap",
61-
"Button",
62-
new proxy.PropertyMetadata(false, dependencyObservable.PropertyMetadataSettings.AffectsLayout)
63-
);
48+
public static textWrapProperty = textWrapProperty;
6449

6550
public _onBindingContextChanged(oldValue: any, newValue: any) {
6651
super._onBindingContextChanged(oldValue, newValue);
@@ -105,22 +90,29 @@ export class Button extends view.View implements definition.Button {
10590
this._setValue(Button.textWrapProperty, value);
10691
}
10792

93+
get whiteSpace(): string {
94+
return this.style.whiteSpace;
95+
}
96+
set whiteSpace(value: string) {
97+
this.style.whiteSpace = value;
98+
}
99+
108100
private onFormattedTextChanged(eventData: observable.PropertyChangeData) {
109101
var value = <formattedString.FormattedString>eventData.value;
110102
this._setFormattedTextPropertyToNative(value);
111103

112104
this._onPropertyChangedFromNative(Button.textProperty, value.toString());
113105
}
114106

115-
public _onTextPropertyChanged(data: dependencyObservable.PropertyChangeData) {
107+
public _onTextPropertyChanged(data: PropertyChangeData) {
116108
//
117109
}
118110

119111
public _setFormattedTextPropertyToNative(value) {
120112
//
121113
}
122114

123-
public _onFormattedTextPropertyChanged(data: dependencyObservable.PropertyChangeData) {
115+
public _onFormattedTextPropertyChanged(data: PropertyChangeData) {
124116
var newValue = <formattedString.FormattedString>data.newValue;
125117
if (newValue) {
126118
newValue.parent = this;
@@ -136,11 +128,9 @@ export class Button extends view.View implements definition.Button {
136128
}
137129
}
138130

139-
function onTextWrapPropertyChanged(data: dependencyObservable.PropertyChangeData) {
131+
function onTextWrapPropertyChanged(data: PropertyChangeData) {
140132
var v = <view.View>data.object;
141-
ensureEnums();
142-
143-
v.style.whiteSpace = data.newValue ? enums.WhiteSpace.normal : enums.WhiteSpace.nowrap;
133+
v.style.whiteSpace = data.newValue ? WhiteSpace.normal : WhiteSpace.nowrap;
144134
}
145135

146136
(<proxy.PropertyMetadata>Button.textWrapProperty.metadata).onSetNativeValue = onTextWrapPropertyChanged;

tns-core-modules/ui/button/button.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ declare module "ui/button" {
5151
*/
5252
formattedText: formattedString.FormattedString;
5353

54+
/**
55+
* Gets or sets text whiteSpace.
56+
* "normal" or "nowrap"
57+
*/
58+
whiteSpace: string;
59+
5460
/**
5561
* A basic method signature to hook an event listener (shortcut alias to the addEventListener method).
5662
* @param eventNames - String corresponding to events (e.g. "propertyChange"). Optionally could be used more events separated by `,` (e.g. "propertyChange", "change").
Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,13 @@
11
import definition = require("ui/label");
2-
import dependencyObservable = require("ui/core/dependency-observable");
3-
import proxy = require("ui/core/proxy");
42
import textBase = require("ui/text-base");
5-
import view = require("ui/core/view");
6-
import * as enumsModule from "ui/enums";
7-
8-
var enums: typeof enumsModule;
9-
function ensureEnums() {
10-
if (!enums) {
11-
enums = require("ui/enums");
12-
}
13-
}
3+
import {WhiteSpace} from "ui/enums";
144

155
export class Label extends textBase.TextBase implements definition.Label {
16-
public static textWrapProperty = new dependencyObservable.Property(
17-
"textWrap",
18-
"Label",
19-
new proxy.PropertyMetadata(false, dependencyObservable.PropertyMetadataSettings.AffectsLayout)
20-
);
216

227
get textWrap(): boolean {
23-
return this._getValue(Label.textWrapProperty);
8+
return this.style.whiteSpace === WhiteSpace.normal;
249
}
2510
set textWrap(value: boolean) {
26-
this._setValue(Label.textWrapProperty, value);
11+
this.style.whiteSpace = value ? WhiteSpace.normal : WhiteSpace.nowrap;
2712
}
28-
}
29-
30-
function onTextWrapPropertyChanged(data: dependencyObservable.PropertyChangeData) {
31-
var v = <view.View>data.object;
32-
ensureEnums();
33-
34-
v.style.whiteSpace = data.newValue ? enums.WhiteSpace.normal : enums.WhiteSpace.nowrap;
35-
}
36-
37-
(<proxy.PropertyMetadata>Label.textWrapProperty.metadata).onSetNativeValue = onTextWrapPropertyChanged;
13+
}

tns-core-modules/ui/progress/progress-common.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,16 @@
11
import definition = require("ui/progress");
2-
import view = require("ui/core/view");
3-
import dependencyObservable = require("ui/core/dependency-observable");
2+
import {View} from "ui/core/view";
3+
import {Property} from "ui/core/dependency-observable";
44
import proxy = require("ui/core/proxy");
55

6-
export class Progress extends view.View implements definition.Progress {
7-
public static valueProperty = new dependencyObservable.Property(
8-
"value",
9-
"Progress",
10-
new proxy.PropertyMetadata(0, dependencyObservable.PropertyMetadataSettings.AffectsLayout)
11-
);
12-
13-
public static maxValueProperty = new dependencyObservable.Property(
14-
"maxValue",
15-
"Progress",
16-
new proxy.PropertyMetadata(100, dependencyObservable.PropertyMetadataSettings.AffectsLayout)
17-
);
6+
export class Progress extends View implements definition.Progress {
7+
public static valueProperty = new Property("value", "Progress", new proxy.PropertyMetadata(0));
8+
public static maxValueProperty = new Property("maxValue", "Progress", new proxy.PropertyMetadata(100));
189

1910
constructor() {
2011
super();
2112

13+
// This calls make both platforms have default values from 0 to 100.
2214
this.maxValue = 100;
2315
this.value = 0;
2416
}

tns-core-modules/ui/search-bar/search-bar-common.ts

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
import definition = require("ui/search-bar");
2-
import view = require("ui/core/view");
3-
import dependencyObservable = require("ui/core/dependency-observable");
4-
import proxy = require("ui/core/proxy");
5-
import color = require("color");
2+
import {View} from "ui/core/view";
3+
import {Property, PropertyMetadataSettings} from "ui/core/dependency-observable";
4+
import {PropertyMetadata} from "ui/core/proxy";
5+
import {Color} from "color";
6+
import {isAndroid} from "platform";
67

7-
export class SearchBar extends view.View implements definition.SearchBar {
8+
// on Android we explicitly set propertySettings to None because android will invalidate its layout (skip unnecessary native call).
9+
let AffectsLayout = isAndroid ? PropertyMetadataSettings.None : PropertyMetadataSettings.AffectsLayout;
10+
11+
export class SearchBar extends View implements definition.SearchBar {
812
public static submitEvent = "submit";
913
public static clearEvent = "clear";
1014

11-
public static textFieldBackgroundColorProperty = new dependencyObservable.Property("textFieldBackgroundColor", "SearchBar", new proxy.PropertyMetadata(undefined))
12-
13-
public static textFieldHintColorProperty = new dependencyObservable.Property("textFieldHintColor", "SearchBar", new proxy.PropertyMetadata(undefined))
14-
15-
public static hintProperty = new dependencyObservable.Property("hint", "SearchBar", new proxy.PropertyMetadata(""))
16-
17-
public static textProperty = new dependencyObservable.Property(
18-
"text",
19-
"SearchBar",
20-
new proxy.PropertyMetadata("", dependencyObservable.PropertyMetadataSettings.AffectsLayout)
21-
);
15+
public static textFieldBackgroundColorProperty = new Property("textFieldBackgroundColor", "SearchBar", new PropertyMetadata(undefined));
16+
public static textFieldHintColorProperty = new Property("textFieldHintColor", "SearchBar", new PropertyMetadata(undefined));
17+
public static hintProperty = new Property("hint", "SearchBar", new PropertyMetadata(""));
18+
public static textProperty = new Property("text", "SearchBar", new PropertyMetadata("", AffectsLayout));
2219

2320
get text(): string {
2421
return this._getValue(SearchBar.textProperty);
@@ -34,22 +31,22 @@ export class SearchBar extends view.View implements definition.SearchBar {
3431
this._setValue(SearchBar.hintProperty, value);
3532
}
3633

37-
get textFieldBackgroundColor(): color.Color {
34+
get textFieldBackgroundColor(): Color {
3835
return this._getValue(SearchBar.textFieldBackgroundColorProperty);
3936
}
40-
set textFieldBackgroundColor(value: color.Color) {
37+
set textFieldBackgroundColor(value: Color) {
4138
this._setValue(SearchBar.textFieldBackgroundColorProperty,
42-
value instanceof color.Color ? value : new color.Color(<any>value));
39+
value instanceof Color ? value : new Color(<any>value));
4340
}
44-
45-
get textFieldHintColor(): color.Color {
41+
42+
get textFieldHintColor(): Color {
4643
return this._getValue(SearchBar.textFieldHintColorProperty);
4744
}
48-
set textFieldHintColor(value: color.Color) {
45+
set textFieldHintColor(value: Color) {
4946
this._setValue(SearchBar.textFieldHintColorProperty,
50-
value instanceof color.Color ? value : new color.Color(<any>value));
47+
value instanceof Color ? value : new Color(<any>value));
5148
}
52-
49+
5350
public dismissSoftInput() {
5451
//
5552
}

0 commit comments

Comments
 (0)