mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 03:31:45 +08:00
Merge pull request #3331 from NativeScript/hhristov/modules30-fixes
Hhristov/modules30 fixes
This commit is contained in:
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"name": "tns-samples-apps",
|
"name": "tns-samples-apps",
|
||||||
"main": "ui-tests-app/app.js"
|
"main": "cuteness.io/app.js"
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,6 @@ export abstract class SegmentedBarBase extends View implements SegmentedBarDefin
|
|||||||
*/
|
*/
|
||||||
export const selectedIndexProperty = new CoercibleProperty<SegmentedBarBase, number>({
|
export const selectedIndexProperty = new CoercibleProperty<SegmentedBarBase, number>({
|
||||||
name: "selectedIndex", defaultValue: -1,
|
name: "selectedIndex", defaultValue: -1,
|
||||||
valueConverter: (v) => parseInt(v),
|
|
||||||
valueChanged: (target, oldValue, newValue) => {
|
valueChanged: (target, oldValue, newValue) => {
|
||||||
target.notify(<SelectedIndexChangedEventData>{ eventName: SegmentedBarBase.selectedIndexChangedEvent, object: target, oldIndex: oldValue, newIndex: newValue });
|
target.notify(<SelectedIndexChangedEventData>{ eventName: SegmentedBarBase.selectedIndexChangedEvent, object: target, oldIndex: oldValue, newIndex: newValue });
|
||||||
},
|
},
|
||||||
@ -95,19 +94,11 @@ export const selectedIndexProperty = new CoercibleProperty<SegmentedBarBase, num
|
|||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
},
|
||||||
|
valueConverter: (v) => parseInt(v)
|
||||||
});
|
});
|
||||||
selectedIndexProperty.register(SegmentedBarBase);
|
selectedIndexProperty.register(SegmentedBarBase);
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets or sets the selected background color property of the SegmentedBar.
|
|
||||||
*/
|
|
||||||
export const selectedBackgroundColorProperty = new CssProperty<Style, Color>({ name: "selectedBackgroundColor", cssName: "selected-background-color", equalityComparer: Color.equals, valueConverter: (v) => new Color(v) })
|
|
||||||
selectedBackgroundColorProperty.register(Style);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets or sets the items dependency property of the SegmentedBar.
|
|
||||||
*/
|
|
||||||
export const itemsProperty = new Property<SegmentedBarBase, SegmentedBarItemDefinition[]>({
|
export const itemsProperty = new Property<SegmentedBarBase, SegmentedBarItemDefinition[]>({
|
||||||
name: "items", valueChanged: (target, oldValue, newValue) => {
|
name: "items", valueChanged: (target, oldValue, newValue) => {
|
||||||
target.onItemsChanged(oldValue, newValue);
|
target.onItemsChanged(oldValue, newValue);
|
||||||
@ -115,3 +106,6 @@ export const itemsProperty = new Property<SegmentedBarBase, SegmentedBarItemDefi
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
itemsProperty.register(SegmentedBarBase);
|
itemsProperty.register(SegmentedBarBase);
|
||||||
|
|
||||||
|
export const selectedBackgroundColorProperty = new CssProperty<Style, Color>({ name: "selectedBackgroundColor", cssName: "selected-background-color", equalityComparer: Color.equals, valueConverter: (v) => new Color(v) })
|
||||||
|
selectedBackgroundColorProperty.register(Style);
|
||||||
|
@ -34,10 +34,6 @@ export class SegmentedBar extends SegmentedBarBase {
|
|||||||
return this._ios;
|
return this._ios;
|
||||||
}
|
}
|
||||||
|
|
||||||
private insertTab(tabItem: SegmentedBarItem, index: number): void {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
get [selectedIndexProperty.native](): number {
|
get [selectedIndexProperty.native](): number {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { TabView as TabViewDefinition, TabViewItem as TabViewItemDefinition } from "ui/tab-view";
|
import { TabView as TabViewDefinition, TabViewItem as TabViewItemDefinition, SelectedIndexChangedEventData } from "ui/tab-view";
|
||||||
import {
|
import {
|
||||||
View, Style, Bindable, Property, CssProperty, CoercibleProperty,
|
View, ViewBase, Style, Property, CssProperty, CoercibleProperty,
|
||||||
EventData, Color, isIOS, AddArrayFromBuilder
|
EventData, Color, isIOS, AddArrayFromBuilder, AddChildFromBuilder
|
||||||
} from "ui/core/view";
|
} from "ui/core/view";
|
||||||
|
|
||||||
export * from "ui/core/view";
|
export * from "ui/core/view";
|
||||||
@ -10,7 +10,7 @@ export const traceCategory = "TabView";
|
|||||||
|
|
||||||
// TODO: Change base class to ViewBase and use addView method to add it.
|
// TODO: Change base class to ViewBase and use addView method to add it.
|
||||||
// This way we will support property and binding propagation automatically.
|
// This way we will support property and binding propagation automatically.
|
||||||
export abstract class TabViewItemBase extends Bindable implements TabViewItemDefinition {
|
export abstract class TabViewItemBase extends ViewBase implements TabViewItemDefinition {
|
||||||
private _title: string = "";
|
private _title: string = "";
|
||||||
private _view: View;
|
private _view: View;
|
||||||
private _iconSource: string;
|
private _iconSource: string;
|
||||||
@ -36,6 +36,7 @@ export abstract class TabViewItemBase extends Bindable implements TabViewItemDef
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._view = value;
|
this._view = value;
|
||||||
|
this._addView(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,6 +50,13 @@ export abstract class TabViewItemBase extends Bindable implements TabViewItemDef
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public eachChild(callback: (child: ViewBase) => boolean) {
|
||||||
|
const view = this._view;
|
||||||
|
if (view) {
|
||||||
|
callback(view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public abstract _update();
|
public abstract _update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,7 +64,7 @@ export module knownCollections {
|
|||||||
export const items = "items";
|
export const items = "items";
|
||||||
}
|
}
|
||||||
|
|
||||||
export class TabViewBase extends View implements TabViewDefinition, AddArrayFromBuilder {
|
export class TabViewBase extends View implements TabViewDefinition, AddChildFromBuilder, AddArrayFromBuilder {
|
||||||
public static selectedIndexChangedEvent = "selectedIndexChanged";
|
public static selectedIndexChangedEvent = "selectedIndexChanged";
|
||||||
|
|
||||||
public items: TabViewItemDefinition[];
|
public items: TabViewItemDefinition[];
|
||||||
@ -64,14 +72,21 @@ export class TabViewBase extends View implements TabViewDefinition, AddArrayFrom
|
|||||||
public androidOffscreenTabLimit: number;
|
public androidOffscreenTabLimit: number;
|
||||||
public iosIconRenderingMode: "automatic" | "alwaysOriginal" | "alwaysTemplate";
|
public iosIconRenderingMode: "automatic" | "alwaysOriginal" | "alwaysTemplate";
|
||||||
|
|
||||||
protected previousItems: TabViewItemDefinition[];
|
|
||||||
|
|
||||||
public _addArrayFromBuilder(name: string, value: Array<any>) {
|
public _addArrayFromBuilder(name: string, value: Array<any>) {
|
||||||
if (name === "items") {
|
if (name === "items") {
|
||||||
this.items = value;
|
this.items = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public _addChildFromBuilder(name: string, value: any): void {
|
||||||
|
if (name === "TabViewItem") {
|
||||||
|
if (!this.items) {
|
||||||
|
this.items = new Array<TabViewItemBase>();
|
||||||
|
}
|
||||||
|
this.items.push(<TabViewItemBase>value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public _removeTabs(oldItems: Array<TabViewItemDefinition>) {
|
public _removeTabs(oldItems: Array<TabViewItemDefinition>) {
|
||||||
for (let i = 0, length = oldItems.length; i < length; i++) {
|
for (let i = 0, length = oldItems.length; i < length; i++) {
|
||||||
let oldItem = oldItems[i];
|
let oldItem = oldItems[i];
|
||||||
@ -83,7 +98,7 @@ export class TabViewBase extends View implements TabViewDefinition, AddArrayFrom
|
|||||||
if (!oldItem.view) {
|
if (!oldItem.view) {
|
||||||
throw new Error("TabViewItem at index " + i + " does not have a view.");
|
throw new Error("TabViewItem at index " + i + " does not have a view.");
|
||||||
}
|
}
|
||||||
this._removeView(oldItem.view);
|
this._removeView(oldItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +114,7 @@ export class TabViewBase extends View implements TabViewDefinition, AddArrayFrom
|
|||||||
if (!newItem.view) {
|
if (!newItem.view) {
|
||||||
throw new Error(`TabViewItem at index ${i} does not have a view.`);
|
throw new Error(`TabViewItem at index ${i} does not have a view.`);
|
||||||
}
|
}
|
||||||
this._addView(newItem.view, i);
|
this._addView(newItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,51 +131,47 @@ export class TabViewBase extends View implements TabViewDefinition, AddArrayFrom
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public _eachChildView(callback: (child: View) => boolean) {
|
public _eachChildView(callback: (child: ViewBase) => boolean) {
|
||||||
let items = this.items;
|
const items = this.items;
|
||||||
if (!items) {
|
if (!items) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0, length = items.length; i < length; i++) {
|
for (let i = 0, length = items.length; i < length; i++) {
|
||||||
let item = items[i];
|
let item = items[i];
|
||||||
if (item.view) {
|
if (item) {
|
||||||
let retVal = callback(item.view);
|
callback(item);
|
||||||
if (retVal === false) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// public _onBindingContextChanged(oldValue: any, newValue: any) {
|
public onItemsChanged(oldItems: TabViewItemDefinition[], newItems: TabViewItemDefinition[]): void {
|
||||||
// super._onBindingContextChanged(oldValue, newValue);
|
if (oldItems) {
|
||||||
// if (this.items && this.items.length > 0) {
|
for (let i = 0, count = oldItems.length; i < count; i++) {
|
||||||
|
this._removeView(oldItems[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// for (let i = 0, length = this.items.length; i < length; i++) {
|
if (newItems) {
|
||||||
// this.items[i].bindingContext = newValue;
|
for (let i = 0, count = newItems.length; i < count; i++) {
|
||||||
// }
|
const item = newItems[i];
|
||||||
// }
|
if (!item) {
|
||||||
// }
|
throw new Error(`TabViewItem at index ${i} is undefined.`);
|
||||||
|
}
|
||||||
|
|
||||||
public onItemsPropertyChanged(oldValue: TabViewItemDefinition[], newValue: TabViewItemDefinition[]) {
|
if (!item.view) {
|
||||||
this.previousItems = oldValue;
|
throw new Error(`TabViewItem at index ${i} does not have a view.`);
|
||||||
|
}
|
||||||
|
this._addView(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const itemsProperty = new Property<TabViewBase, TabViewItemBase[]>({
|
|
||||||
name: "items", valueChanged: (target, oldValue, newValue) => {
|
|
||||||
target.onItemsPropertyChanged(oldValue, newValue);
|
|
||||||
selectedIndexProperty.coerce(target);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
itemsProperty.register(TabViewBase);
|
|
||||||
|
|
||||||
export const selectedIndexProperty = new CoercibleProperty<TabViewBase, number>({
|
export const selectedIndexProperty = new CoercibleProperty<TabViewBase, number>({
|
||||||
name: "selectedIndex", defaultValue: -1, affectsLayout: isIOS,
|
name: "selectedIndex", defaultValue: -1, affectsLayout: isIOS,
|
||||||
valueChanged: (target, oldValue, newValue) => {
|
valueChanged: (target, oldValue, newValue) => {
|
||||||
let args = { eventName: TabViewBase.selectedIndexChangedEvent, object: this, oldIndex: oldValue, newIndex: newValue };
|
target.notify(<SelectedIndexChangedEventData>{ eventName: TabViewBase.selectedIndexChangedEvent, object: this, oldIndex: oldValue, newIndex: newValue });
|
||||||
target.notify(args);
|
|
||||||
},
|
},
|
||||||
coerceValue: (target, value) => {
|
coerceValue: (target, value) => {
|
||||||
let items = target.items;
|
let items = target.items;
|
||||||
@ -179,7 +190,15 @@ export const selectedIndexProperty = new CoercibleProperty<TabViewBase, number>(
|
|||||||
});
|
});
|
||||||
selectedIndexProperty.register(TabViewBase);
|
selectedIndexProperty.register(TabViewBase);
|
||||||
|
|
||||||
export const iosIconRenderingModeProperty = new Property<TabViewBase, "automatic" | "alwaysOriginal" | "alwaysTemplate">({name: "iosIconRenderingMode", defaultValue: "automatic" });
|
export const itemsProperty = new Property<TabViewBase, TabViewItemDefinition[]>({
|
||||||
|
name: "items", valueChanged: (target, oldValue, newValue) => {
|
||||||
|
target.onItemsChanged(oldValue, newValue);
|
||||||
|
selectedIndexProperty.coerce(target);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
itemsProperty.register(TabViewBase);
|
||||||
|
|
||||||
|
export const iosIconRenderingModeProperty = new Property<TabViewBase, "automatic" | "alwaysOriginal" | "alwaysTemplate">({ name: "iosIconRenderingMode", defaultValue: "automatic" });
|
||||||
iosIconRenderingModeProperty.register(TabViewBase);
|
iosIconRenderingModeProperty.register(TabViewBase);
|
||||||
|
|
||||||
export const androidOffscreenTabLimitProperty = new Property<TabViewBase, number>({
|
export const androidOffscreenTabLimitProperty = new Property<TabViewBase, number>({
|
||||||
|
4
tns-core-modules/ui/tab-view/tab-view.d.ts
vendored
4
tns-core-modules/ui/tab-view/tab-view.d.ts
vendored
@ -2,12 +2,12 @@
|
|||||||
* Contains the TabView class, which represents a standard content component with tabs.
|
* Contains the TabView class, which represents a standard content component with tabs.
|
||||||
*/
|
*/
|
||||||
declare module "ui/tab-view" {
|
declare module "ui/tab-view" {
|
||||||
import { View, Bindable, Property, CssProperty, Style, EventData, Color } from "ui/core/view";
|
import { View, ViewBase, Property, CssProperty, Style, EventData, Color } from "ui/core/view";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a tab view entry.
|
* Represents a tab view entry.
|
||||||
*/
|
*/
|
||||||
class TabViewItem extends Bindable {
|
class TabViewItem extends ViewBase {
|
||||||
/**
|
/**
|
||||||
* Gets or sets the title of the TabViewItem.
|
* Gets or sets the title of the TabViewItem.
|
||||||
*/
|
*/
|
||||||
|
@ -330,7 +330,7 @@ export class TabView extends TabViewBase {
|
|||||||
const heightMode = layout.getMeasureSpecMode(heightMeasureSpec);
|
const heightMode = layout.getMeasureSpecMode(heightMeasureSpec);
|
||||||
|
|
||||||
this._tabBarHeight = TabView.measureHelper(this._ios.tabBar, width, widthMode, height, heightMode).height;
|
this._tabBarHeight = TabView.measureHelper(this._ios.tabBar, width, widthMode, height, heightMode).height;
|
||||||
let moreNavBarVisible = !!this._ios.moreNavigationController.navigationBar.window;
|
const moreNavBarVisible = !!this._ios.moreNavigationController.navigationBar.window;
|
||||||
this._navBarHeight = moreNavBarVisible ? TabView.measureHelper(this._ios.moreNavigationController.navigationBar, width, widthMode, height, heightMode).height : 0;
|
this._navBarHeight = moreNavBarVisible ? TabView.measureHelper(this._ios.moreNavigationController.navigationBar, width, widthMode, height, heightMode).height : 0;
|
||||||
|
|
||||||
const density = layout.getDisplayDensity();
|
const density = layout.getDisplayDensity();
|
||||||
@ -346,7 +346,7 @@ export class TabView extends TabViewBase {
|
|||||||
measureWidth = childSize.measuredWidth;
|
measureWidth = childSize.measuredWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
let style = this.style;
|
const style = this.style;
|
||||||
measureWidth = Math.max(measureWidth, style.effectiveMinWidth * density);
|
measureWidth = Math.max(measureWidth, style.effectiveMinWidth * density);
|
||||||
measureHeight = Math.max(measureHeight, style.effectiveMinHeight * density);
|
measureHeight = Math.max(measureHeight, style.effectiveMinHeight * density);
|
||||||
|
|
||||||
|
@ -58,17 +58,17 @@ export function convertString(value: any): any {
|
|||||||
|
|
||||||
export module layout {
|
export module layout {
|
||||||
|
|
||||||
var MODE_SHIFT = 30;
|
const MODE_SHIFT = 30;
|
||||||
var MODE_MASK = 0x3 << MODE_SHIFT;
|
const MODE_MASK = 0x3 << MODE_SHIFT;
|
||||||
|
|
||||||
export var UNSPECIFIED = 0 << MODE_SHIFT;
|
export const UNSPECIFIED = 0 << MODE_SHIFT;
|
||||||
export var EXACTLY = 1 << MODE_SHIFT;
|
export const EXACTLY = 1 << MODE_SHIFT;
|
||||||
export var AT_MOST = 2 << MODE_SHIFT;
|
export const AT_MOST = 2 << MODE_SHIFT;
|
||||||
|
|
||||||
export var MEASURED_HEIGHT_STATE_SHIFT = 0x00000010; /* 16 */
|
export const MEASURED_HEIGHT_STATE_SHIFT = 0x00000010; /* 16 */
|
||||||
export var MEASURED_STATE_TOO_SMALL = 0x01000000;
|
export const MEASURED_STATE_TOO_SMALL = 0x01000000;
|
||||||
export var MEASURED_STATE_MASK = 0xff000000;
|
export const MEASURED_STATE_MASK = 0xff000000;
|
||||||
export var MEASURED_SIZE_MASK = 0x00ffffff;
|
export const MEASURED_SIZE_MASK = 0x00ffffff;
|
||||||
|
|
||||||
export function getMode(mode: number): string {
|
export function getMode(mode: number): string {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
|
@ -1,8 +1,60 @@
|
|||||||
import { enabled as traceEnabled, write as traceWrite, categories as traceCategories,
|
import {
|
||||||
messageType as traceMessageType, notifyEvent as traceNotifyEvent, isCategorySet } from "trace";
|
enabled as traceEnabled, write as traceWrite, categories as traceCategories,
|
||||||
|
messageType as traceMessageType, notifyEvent as traceNotifyEvent, isCategorySet
|
||||||
|
} from "trace";
|
||||||
|
|
||||||
export * from "./utils-common";
|
export * from "./utils-common";
|
||||||
|
|
||||||
|
export module layout {
|
||||||
|
let density = -1;
|
||||||
|
let metrics: android.util.DisplayMetrics;
|
||||||
|
|
||||||
|
// cache the MeasureSpec constants here, to prevent extensive marshaling calls to and from Java
|
||||||
|
// TODO: While this boosts the performance it is error-prone in case Google changes these constants
|
||||||
|
const MODE_SHIFT = 30;
|
||||||
|
const MODE_MASK = 0x3 << MODE_SHIFT;
|
||||||
|
let sdkVersion = -1;
|
||||||
|
let useOldMeasureSpec = false;
|
||||||
|
|
||||||
|
export function makeMeasureSpec(size: number, mode: number): number {
|
||||||
|
if (sdkVersion === -1) {
|
||||||
|
// check whether the old layout is needed
|
||||||
|
sdkVersion = ad.getApplicationContext().getApplicationInfo().targetSdkVersion;
|
||||||
|
useOldMeasureSpec = sdkVersion <= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useOldMeasureSpec) {
|
||||||
|
return size + mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (size & ~MODE_MASK) | (mode & MODE_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDisplayMetrics(): android.util.DisplayMetrics {
|
||||||
|
if (!metrics) {
|
||||||
|
metrics = ad.getApplicationContext().getResources().getDisplayMetrics();
|
||||||
|
}
|
||||||
|
|
||||||
|
return metrics;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDisplayDensity(): number {
|
||||||
|
if (density === -1) {
|
||||||
|
density = getDisplayMetrics().density;
|
||||||
|
}
|
||||||
|
|
||||||
|
return density;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function toDevicePixels(value: number): number {
|
||||||
|
return value * getDisplayDensity();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function toDeviceIndependentPixels(value: number): number {
|
||||||
|
return value / getDisplayDensity();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// We are using "ad" here to avoid namespace collision with the global android object
|
// We are using "ad" here to avoid namespace collision with the global android object
|
||||||
export module ad {
|
export module ad {
|
||||||
let nativeApp: android.app.Application;
|
let nativeApp: android.app.Application;
|
||||||
|
Reference in New Issue
Block a user