mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
tab-view
This commit is contained in:
committed by
Hristo Hristov
parent
a64847ca9d
commit
079830e9b5
@@ -5,14 +5,13 @@ import { Bindable } from "ui/core/bindable";
|
||||
import { isIOS } from "platform";
|
||||
import { Color } from "color";
|
||||
|
||||
import types = require("utils/types");
|
||||
import trace = require("trace");
|
||||
|
||||
export let traceCategory = "TabView";
|
||||
export const traceCategory = "TabView";
|
||||
|
||||
// TODO: Change base class to ViewBase and use addView method to add it.
|
||||
// This way we will support property and binding propagation automatically.
|
||||
export class TabViewItemBase extends Bindable implements TabViewItemDefinition {
|
||||
export abstract class TabViewItemBase extends Bindable implements TabViewItemDefinition {
|
||||
private _title: string = "";
|
||||
private _view: View;
|
||||
private _iconSource: string;
|
||||
@@ -31,7 +30,6 @@ export class TabViewItemBase extends Bindable implements TabViewItemDefinition {
|
||||
get view(): View {
|
||||
return this._view;
|
||||
}
|
||||
|
||||
set view(value: View) {
|
||||
if (this._view !== value) {
|
||||
if (this._view) {
|
||||
@@ -45,7 +43,6 @@ export class TabViewItemBase extends Bindable implements TabViewItemDefinition {
|
||||
get iconSource(): string {
|
||||
return this._iconSource;
|
||||
}
|
||||
|
||||
set iconSource(value: string) {
|
||||
if (this._iconSource !== value) {
|
||||
this._iconSource = value;
|
||||
@@ -53,9 +50,7 @@ export class TabViewItemBase extends Bindable implements TabViewItemDefinition {
|
||||
}
|
||||
}
|
||||
|
||||
public _update() {
|
||||
//
|
||||
}
|
||||
public abstract _update();
|
||||
}
|
||||
|
||||
export module knownCollections {
|
||||
@@ -78,20 +73,6 @@ export class TabViewBase extends View implements TabViewDefinition, AddArrayFrom
|
||||
}
|
||||
}
|
||||
|
||||
public _onItemsPropertyChangedSetNativeValue() {
|
||||
let oldValue = this.previousItems;
|
||||
if (oldValue) {
|
||||
this._removeTabs(oldValue);
|
||||
}
|
||||
|
||||
let newValue = this.items;
|
||||
if (newValue) {
|
||||
this._addTabs(newValue);
|
||||
}
|
||||
|
||||
this._updateSelectedIndexOnItemsPropertyChanged(newValue);
|
||||
}
|
||||
|
||||
public _updateSelectedIndexOnItemsPropertyChanged(newItems) {
|
||||
if (trace.enabled) {
|
||||
trace.write("TabView._updateSelectedIndexOnItemsPropertyChanged(" + newItems + ");", traceCategory);
|
||||
@@ -104,7 +85,7 @@ export class TabViewBase extends View implements TabViewDefinition, AddArrayFrom
|
||||
if (newItemsCount === 0) {
|
||||
this.selectedIndex = undefined;
|
||||
}
|
||||
else if (types.isUndefined(this.selectedIndex) || this.selectedIndex >= newItemsCount) {
|
||||
else if (this.selectedIndex < 0 || this.selectedIndex >= newItemsCount) {
|
||||
this.selectedIndex = 0;
|
||||
}
|
||||
}
|
||||
@@ -143,13 +124,13 @@ export class TabViewBase extends View implements TabViewDefinition, AddArrayFrom
|
||||
|
||||
public _onSelectedIndexPropertyChangedSetNativeValue() {
|
||||
let index = this.selectedIndex;
|
||||
if (types.isUndefined(index)) {
|
||||
if (index < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (types.isDefined(this.items)) {
|
||||
if (index < 0 || index >= this.items.length) {
|
||||
this.selectedIndex = undefined;
|
||||
if (this.items) {
|
||||
if (index >= this.items.length) {
|
||||
this.selectedIndex = unsetValue;
|
||||
throw new Error("SelectedIndex should be between [0, items.length)");
|
||||
}
|
||||
}
|
||||
@@ -194,9 +175,8 @@ export class TabViewBase extends View implements TabViewDefinition, AddArrayFrom
|
||||
public _onBindingContextChanged(oldValue: any, newValue: any) {
|
||||
super._onBindingContextChanged(oldValue, newValue);
|
||||
if (this.items && this.items.length > 0) {
|
||||
let i = 0;
|
||||
let length = this.items.length;
|
||||
for (; i < length; i++) {
|
||||
|
||||
for (let i = 0, length = this.items.length; i < length; i++) {
|
||||
this.items[i].bindingContext = newValue;
|
||||
}
|
||||
}
|
||||
@@ -218,13 +198,6 @@ export class TabViewBase extends View implements TabViewDefinition, AddArrayFrom
|
||||
this._onSelectedIndexPropertyChangedSetNativeValue();
|
||||
}
|
||||
|
||||
get [itemsProperty.native](): TabViewItemBase[] {
|
||||
return null;
|
||||
}
|
||||
set [itemsProperty.native](value: TabViewItemBase[]) {
|
||||
this._onItemsPropertyChangedSetNativeValue();
|
||||
}
|
||||
|
||||
public onItemsPropertyChanged(oldValue: TabViewItemDefinition[], newValue: TabViewItemDefinition[]) {
|
||||
this.previousItems = oldValue;
|
||||
}
|
||||
|
||||
@@ -1,29 +1,23 @@
|
||||
import common = require("./tab-view-common");
|
||||
import definition = require("ui/tab-view");
|
||||
import dependencyObservable = require("ui/core/dependency-observable");
|
||||
import view = require("ui/core/view");
|
||||
import { TabViewBase, TabViewItemBase, itemsProperty, selectedIndexProperty, selectedColorProperty, tabsBackgroundColorProperty, traceCategory } from "./tab-view-common"
|
||||
import { View, colorProperty, fontInternalProperty } from "ui/core/view";
|
||||
import { Property } from "ui/core/properties";
|
||||
import { Bindable } from "ui/core/bindable";
|
||||
import { isIOS } from "platform";
|
||||
import { Color } from "color";
|
||||
import { Font } from "ui/styling/font";
|
||||
import { fromFileOrResource } from "image-source";
|
||||
import trace = require("trace");
|
||||
import types = require("utils/types");
|
||||
import utils = require("utils/utils");
|
||||
import style = require("ui/styling/style");
|
||||
import font = require("ui/styling/font");
|
||||
import * as imageSourceModule from "image-source";
|
||||
|
||||
var imageSource: typeof imageSourceModule;
|
||||
function ensureImageSource() {
|
||||
if (!imageSource) {
|
||||
imageSource = require("image-source");
|
||||
}
|
||||
}
|
||||
export * from "./tab-view-common";
|
||||
|
||||
var VIEWS_STATES = "_viewStates";
|
||||
var ACCENT_COLOR = "colorAccent";
|
||||
var PRIMARY_COLOR = "colorPrimary";
|
||||
var DEFAULT_ELEVATION = 4;
|
||||
|
||||
global.moduleMerge(common, exports);
|
||||
|
||||
export class TabViewItem extends common.TabViewItem {
|
||||
const VIEWS_STATES = "_viewStates";
|
||||
const ACCENT_COLOR = "colorAccent";
|
||||
const PRIMARY_COLOR = "colorPrimary";
|
||||
const DEFAULT_ELEVATION = 4;
|
||||
|
||||
export class TabViewItem extends TabViewItemBase {
|
||||
public _parent: TabView;
|
||||
|
||||
public _update() {
|
||||
@@ -33,7 +27,7 @@ export class TabViewItem extends common.TabViewItem {
|
||||
}
|
||||
}
|
||||
|
||||
var PagerAdapterClass;
|
||||
let PagerAdapterClass;
|
||||
function ensurePagerAdapterClass() {
|
||||
if (PagerAdapterClass) {
|
||||
return;
|
||||
@@ -41,9 +35,9 @@ function ensurePagerAdapterClass() {
|
||||
|
||||
class PagerAdapterClassInner extends android.support.v4.view.PagerAdapter {
|
||||
private owner: TabView;
|
||||
private items: Array<definition.TabViewItem>;
|
||||
private items: Array<TabViewItem>;
|
||||
|
||||
constructor(owner: TabView, items: Array<definition.TabViewItem>) {
|
||||
constructor(owner: TabView, items: Array<TabViewItem>) {
|
||||
super();
|
||||
|
||||
this.owner = owner;
|
||||
@@ -66,17 +60,17 @@ function ensurePagerAdapterClass() {
|
||||
|
||||
instantiateItem(container: android.view.ViewGroup, index: number) {
|
||||
if (trace.enabled) {
|
||||
trace.write("TabView.PagerAdapter.instantiateItem; container: " + container + "; index: " + index, common.traceCategory);
|
||||
trace.write("TabView.PagerAdapter.instantiateItem; container: " + container + "; index: " + index, traceCategory);
|
||||
}
|
||||
|
||||
var item = this.items[index];
|
||||
let item = this.items[index];
|
||||
if (item.view.parent !== this.owner) {
|
||||
this.owner._addView(item.view);
|
||||
}
|
||||
|
||||
if (this[VIEWS_STATES]) {
|
||||
if (trace.enabled) {
|
||||
trace.write("TabView.PagerAdapter.instantiateItem; restoreHierarchyState: " + item.view, common.traceCategory);
|
||||
trace.write("TabView.PagerAdapter.instantiateItem; restoreHierarchyState: " + item.view, traceCategory);
|
||||
}
|
||||
item.view._nativeView.restoreHierarchyState(this[VIEWS_STATES]);
|
||||
}
|
||||
@@ -87,10 +81,10 @@ function ensurePagerAdapterClass() {
|
||||
|
||||
destroyItem(container: android.view.ViewGroup, index: number, _object: any) {
|
||||
if (trace.enabled) {
|
||||
trace.write("TabView.PagerAdapter.destroyItem; container: " + container + "; index: " + index + "; _object: " + _object, common.traceCategory);
|
||||
trace.write("TabView.PagerAdapter.destroyItem; container: " + container + "; index: " + index + "; _object: " + _object, traceCategory);
|
||||
}
|
||||
var item = this.items[index];
|
||||
var nativeView = item.view._nativeView;
|
||||
let item = this.items[index];
|
||||
let nativeView = item.view._nativeView;
|
||||
|
||||
if (nativeView.toString() !== _object.toString()) {
|
||||
throw new Error("Expected " + nativeView.toString() + " to equal " + _object.toString());
|
||||
@@ -111,10 +105,10 @@ function ensurePagerAdapterClass() {
|
||||
|
||||
saveState(): android.os.Parcelable {
|
||||
if (trace.enabled) {
|
||||
trace.write("TabView.PagerAdapter.saveState", common.traceCategory);
|
||||
trace.write("TabView.PagerAdapter.saveState", traceCategory);
|
||||
}
|
||||
|
||||
var owner: TabView = this.owner;
|
||||
let owner: TabView = this.owner;
|
||||
if (!owner || owner._childrenCount === 0) {
|
||||
return null;
|
||||
}
|
||||
@@ -122,9 +116,9 @@ function ensurePagerAdapterClass() {
|
||||
if (!this[VIEWS_STATES]) {
|
||||
this[VIEWS_STATES] = new android.util.SparseArray<android.os.Parcelable>();
|
||||
}
|
||||
var viewStates = this[VIEWS_STATES];
|
||||
var childCallback = function (view: view.View): boolean {
|
||||
var nativeView: android.view.View = view._nativeView;
|
||||
let viewStates = this[VIEWS_STATES];
|
||||
let childCallback = function (view: View): boolean {
|
||||
let nativeView: android.view.View = view._nativeView;
|
||||
if (nativeView && nativeView.isSaveFromParentEnabled && nativeView.isSaveFromParentEnabled()) {
|
||||
nativeView.saveHierarchyState(viewStates);
|
||||
}
|
||||
@@ -132,16 +126,16 @@ function ensurePagerAdapterClass() {
|
||||
}
|
||||
owner._eachChildView(childCallback);
|
||||
|
||||
var bundle = new android.os.Bundle();
|
||||
let bundle = new android.os.Bundle();
|
||||
bundle.putSparseParcelableArray(VIEWS_STATES, viewStates);
|
||||
return bundle;
|
||||
}
|
||||
|
||||
restoreState(state: android.os.Parcelable, loader: java.lang.ClassLoader) {
|
||||
if (trace.enabled) {
|
||||
trace.write("TabView.PagerAdapter.restoreState", common.traceCategory);
|
||||
trace.write("TabView.PagerAdapter.restoreState", traceCategory);
|
||||
}
|
||||
var bundle: android.os.Bundle = <android.os.Bundle>state;
|
||||
let bundle: android.os.Bundle = <android.os.Bundle>state;
|
||||
bundle.setClassLoader(loader);
|
||||
this[VIEWS_STATES] = bundle.getSparseParcelableArray(VIEWS_STATES);
|
||||
}
|
||||
@@ -150,7 +144,7 @@ function ensurePagerAdapterClass() {
|
||||
PagerAdapterClass = PagerAdapterClassInner;
|
||||
}
|
||||
|
||||
var PageChangedListenerClass;
|
||||
let PageChangedListenerClass;
|
||||
function ensurePageChangedListenerClass() {
|
||||
if (PageChangedListenerClass) {
|
||||
return;
|
||||
@@ -172,7 +166,7 @@ function ensurePageChangedListenerClass() {
|
||||
PageChangedListenerClass = PageChangedListener;
|
||||
}
|
||||
|
||||
export class TabView extends common.TabView {
|
||||
export class TabView extends TabViewBase {
|
||||
private _grid: org.nativescript.widgets.GridLayout;
|
||||
private _tabLayout: org.nativescript.widgets.TabLayout;
|
||||
private _viewPager: android.support.v4.view.ViewPager;
|
||||
@@ -187,7 +181,7 @@ export class TabView extends common.TabView {
|
||||
|
||||
public _createUI() {
|
||||
if (trace.enabled) {
|
||||
trace.write("TabView._createUI(" + this + ");", common.traceCategory);
|
||||
trace.write("TabView._createUI(" + this + ");", traceCategory);
|
||||
}
|
||||
|
||||
this._grid = new org.nativescript.widgets.GridLayout(this._context);
|
||||
@@ -212,13 +206,13 @@ export class TabView extends common.TabView {
|
||||
if (this._androidViewId < 0) {
|
||||
this._androidViewId = android.view.View.generateViewId();
|
||||
}
|
||||
|
||||
|
||||
this._viewPager = new android.support.v4.view.ViewPager(this._context);
|
||||
if (this._androidOffscreenTabLimit !== 1) {
|
||||
this._viewPager.setOffscreenPageLimit(this._androidOffscreenTabLimit);
|
||||
}
|
||||
this._viewPager.setId(this._androidViewId);
|
||||
var lp = new org.nativescript.widgets.CommonLayoutParams();
|
||||
let lp = new org.nativescript.widgets.CommonLayoutParams();
|
||||
lp.row = 1;
|
||||
this._viewPager.setLayoutParams(lp);
|
||||
this._grid.addView(this._viewPager);
|
||||
@@ -229,7 +223,7 @@ export class TabView extends common.TabView {
|
||||
}
|
||||
|
||||
private setElevation() {
|
||||
var compat = <any>android.support.v4.view.ViewCompat;
|
||||
let compat = <any>android.support.v4.view.ViewCompat;
|
||||
if (compat.setElevation) {
|
||||
let val = DEFAULT_ELEVATION * utils.layout.getDisplayDensity();
|
||||
compat.setElevation(this._grid, val);
|
||||
@@ -237,28 +231,24 @@ export class TabView extends common.TabView {
|
||||
}
|
||||
}
|
||||
|
||||
public _onItemsPropertyChangedSetNativeValue(data: dependencyObservable.PropertyChangeData) {
|
||||
if (trace.enabled) {
|
||||
trace.write("TabView._onItemsPropertyChangedSetNativeValue(" + data.oldValue + " ---> " + data.newValue + ");", common.traceCategory);
|
||||
}
|
||||
|
||||
if (data.oldValue) {
|
||||
var oldItems: Array<TabViewItem> = data.oldValue;
|
||||
public _onItemsPropertyChangedSetNativeValue() {
|
||||
let oldItems = <TabViewItem[]>this.previousItems;
|
||||
if (oldItems) {
|
||||
oldItems.forEach((oldItem) => {
|
||||
// _removeView is called within destroyItem method
|
||||
oldItem._parent = null;
|
||||
oldItem._parent = null;
|
||||
});
|
||||
|
||||
|
||||
this._viewPager.setAdapter(null);
|
||||
this._pagerAdapter = null;
|
||||
this._tabLayout.setItems(null, null);
|
||||
}
|
||||
|
||||
if (data.newValue) {
|
||||
var items: Array<TabViewItem> = data.newValue;
|
||||
var tabItems = new Array<org.nativescript.widgets.TabItemSpec>();
|
||||
let items = <TabViewItem[]>this.items;
|
||||
if (items) {
|
||||
let tabItems = new Array<org.nativescript.widgets.TabItemSpec>();
|
||||
items.forEach((item, idx, arr) => {
|
||||
if (types.isNullOrUndefined(item.view)) {
|
||||
if (!item.view) {
|
||||
throw new Error("View of TabViewItem at index " + idx + " is " + item.view);
|
||||
}
|
||||
|
||||
@@ -270,48 +260,49 @@ export class TabView extends common.TabView {
|
||||
});
|
||||
|
||||
ensurePagerAdapterClass();
|
||||
this._pagerAdapter = new PagerAdapterClass(this, data.newValue);
|
||||
// TODO: optimize by reusing the adapter and calling setAdapter(null) then the same adapter.
|
||||
this._pagerAdapter = new PagerAdapterClass(this, items);
|
||||
this._viewPager.setAdapter(this._pagerAdapter);
|
||||
|
||||
this._tabLayout.setItems(tabItems, this._viewPager);
|
||||
}
|
||||
|
||||
this._updateSelectedIndexOnItemsPropertyChanged(data.newValue);
|
||||
this._updateSelectedIndexOnItemsPropertyChanged(items);
|
||||
}
|
||||
|
||||
public _updateTabForItem(item: TabViewItem) {
|
||||
if (this.items && this.items.length > 0) {
|
||||
var index = this.items.indexOf(item);
|
||||
let index = this.items.indexOf(item);
|
||||
if (index >= 0) {
|
||||
this._tabLayout.updateItemAt(index, this.createTabItem(item));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public _onSelectedIndexPropertyChangedSetNativeValue(data: dependencyObservable.PropertyChangeData) {
|
||||
public _onSelectedIndexPropertyChangedSetNativeValue() {
|
||||
if (trace.enabled) {
|
||||
trace.write("TabView._onSelectedIndexPropertyChangedSetNativeValue(" + data.oldValue + " ---> " + data.newValue + ");", common.traceCategory);
|
||||
trace.write("TabView._onSelectedIndexPropertyChangedSetNativeValue(" + data.oldValue + " ---> " + data.newValue + ");", traceCategory);
|
||||
}
|
||||
super._onSelectedIndexPropertyChangedSetNativeValue(data);
|
||||
|
||||
var index = data.newValue;
|
||||
let index = data.newValue;
|
||||
if (!types.isNullOrUndefined(index)) {
|
||||
// Select the respective page in the ViewPager
|
||||
var viewPagerSelectedIndex = this._viewPager.getCurrentItem();
|
||||
let viewPagerSelectedIndex = this._viewPager.getCurrentItem();
|
||||
if (viewPagerSelectedIndex !== index) {
|
||||
if (trace.enabled) {
|
||||
trace.write("TabView this._viewPager.setCurrentItem(" + index + ", true);", common.traceCategory);
|
||||
trace.write("TabView this._viewPager.setCurrentItem(" + index + ", true);", traceCategory);
|
||||
}
|
||||
this._viewPager.setCurrentItem(index, true);
|
||||
}
|
||||
}
|
||||
|
||||
var args = { eventName: TabView.selectedIndexChangedEvent, object: this, oldIndex: data.oldValue, newIndex: data.newValue };
|
||||
let args = { eventName: TabView.selectedIndexChangedEvent, object: this, oldIndex: data.oldValue, newIndex: data.newValue };
|
||||
this.notify(args);
|
||||
}
|
||||
|
||||
private createTabItem(item: definition.TabViewItem): org.nativescript.widgets.TabItemSpec {
|
||||
var result = new org.nativescript.widgets.TabItemSpec();
|
||||
private createTabItem(item: TabViewItem): org.nativescript.widgets.TabItemSpec {
|
||||
let result = new org.nativescript.widgets.TabItemSpec();
|
||||
result.title = item.title;
|
||||
|
||||
if (item.iconSource) {
|
||||
@@ -320,9 +311,7 @@ export class TabView extends common.TabView {
|
||||
result.iconId = utils.ad.resources.getDrawableId(item.iconSource.substr(utils.RESOURCE_PREFIX.length));
|
||||
}
|
||||
else {
|
||||
ensureImageSource();
|
||||
|
||||
var is = imageSource.fromFileOrResource(item.iconSource);
|
||||
let is = imageSource.fromFileOrResource(item.iconSource);
|
||||
if (is) {
|
||||
result.iconDrawable = new android.graphics.drawable.BitmapDrawable(is.android);
|
||||
}
|
||||
@@ -332,206 +321,100 @@ export class TabView extends common.TabView {
|
||||
return result;
|
||||
}
|
||||
|
||||
public _getAndroidTabView(): org.nativescript.widgets.TabLayout {
|
||||
return this._tabLayout;
|
||||
get [itemsProperty.native](): TabViewItemBase[] {
|
||||
return null;
|
||||
}
|
||||
set [itemsProperty.native](value: TabViewItemBase[]) {
|
||||
this._onItemsPropertyChangedSetNativeValue();
|
||||
}
|
||||
|
||||
private _androidOffscreenTabLimit: number = 1;
|
||||
get androidOffscreenTabLimit(): number {
|
||||
return this._androidOffscreenTabLimit;
|
||||
get [selectedColorProperty.native](): number {
|
||||
//from https://developer.android.com/samples/SlidingTabsColors/src/com.example.android.common/view/SlidingTabStrip.html
|
||||
return 0xFF33B5E5;
|
||||
}
|
||||
set androidOffscreenTabLimit(value: number) {
|
||||
if (value !== this._androidOffscreenTabLimit) {
|
||||
this._androidOffscreenTabLimit = value;
|
||||
if (this._viewPager) {
|
||||
this._viewPager.setOffscreenPageLimit(value);
|
||||
}
|
||||
set [selectedColorProperty.native](value: number | Color) {
|
||||
let tabLayout = this._tabLayout;
|
||||
let color = value instanceof Color ? value.android : value;
|
||||
tabLayout.setSelectedIndicatorColors([color]);
|
||||
}
|
||||
|
||||
get [tabsBackgroundColorProperty.native](): android.graphics.drawable.Drawable {
|
||||
return this._tabLayout.getBackground();
|
||||
}
|
||||
set [tabsBackgroundColorProperty.native](value: android.graphics.drawable.Drawable | Color) {
|
||||
if (value instanceof Color) {
|
||||
this._tabLayout.setBackgroundColor(value.android);
|
||||
} else {
|
||||
this._tabLayout.setBackground(value);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
get [colorProperty.native](): number {
|
||||
let items = this.items;
|
||||
if (items && items.length > 0) {
|
||||
let tv = this._tabLayout.getTextViewForItemAt(0);
|
||||
if (tv) {
|
||||
return tv.getTextColors().getDefaultColor();
|
||||
}
|
||||
}
|
||||
|
||||
export class TabViewStyler implements style.Styler {
|
||||
return undefined;
|
||||
}
|
||||
set [colorProperty.native](value: number | Color) {
|
||||
let items = this.items;
|
||||
if (items && items.length > 0) {
|
||||
let color = value instanceof Color ? value.android : value;
|
||||
let tabLayout = this._tabLayout;
|
||||
|
||||
// font
|
||||
private static setFontInternalProperty(v: view.View, newValue: any, nativeValue?: any) {
|
||||
var tab = <definition.TabView>v;
|
||||
var fontValue = <font.Font>newValue;
|
||||
var typeface = fontValue.getAndroidTypeface();
|
||||
|
||||
if (tab.items && tab.items.length > 0) {
|
||||
var tabLayout = tab._getAndroidTabView();
|
||||
|
||||
for (var i = 0; i < tab.items.length; i++) {
|
||||
for (let i = 0, length = items.length; i < length; i++) {
|
||||
let tv = tabLayout.getTextViewForItemAt(i);
|
||||
if (typeface) {
|
||||
tv.setTypeface(typeface);
|
||||
}
|
||||
else {
|
||||
tv.setTypeface(nativeValue.typeface);
|
||||
}
|
||||
|
||||
if (fontValue.fontSize) {
|
||||
tv.setTextSize(fontValue.fontSize);
|
||||
}
|
||||
else {
|
||||
tv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, nativeValue.size);
|
||||
}
|
||||
tv.setTextColor(color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static resetFontInternalProperty(v: view.View, nativeValue: any) {
|
||||
var tab = <definition.TabView>v;
|
||||
|
||||
if (tab.items && tab.items.length > 0) {
|
||||
var tabLayout = tab._getAndroidTabView();
|
||||
|
||||
for (var i = 0; i < tab.items.length; i++) {
|
||||
let tv = tabLayout.getTextViewForItemAt(i);
|
||||
tv.setTypeface(nativeValue.typeface);
|
||||
tv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, nativeValue.size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static getNativeFontInternalValue(v: view.View): any {
|
||||
var tab = <definition.TabView>v;
|
||||
var tv: android.widget.TextView = tab._getAndroidTabView().getTextViewForItemAt(0);
|
||||
if (tv) {
|
||||
get [fontInternalProperty.native](): { typeface: android.graphics.Typeface, fontSize: number } {
|
||||
let items = this.items;
|
||||
if (items && items.length > 0) {
|
||||
let tabLayout = this._tabLayout;
|
||||
let tv = tabLayout.getTextViewForItemAt(0);
|
||||
return {
|
||||
typeface: tv.getTypeface(),
|
||||
size: tv.getTextSize()
|
||||
fontSize: tv.getTextSize()
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
typeface: undefined,
|
||||
fontSize: undefined
|
||||
};
|
||||
}
|
||||
set [fontInternalProperty.native](value: Font | { typeface: android.graphics.Typeface, fontSize: number }) {
|
||||
let typeface: android.graphics.Typeface;
|
||||
let fontSize = value.fontSize;
|
||||
let isFont: boolean;
|
||||
if (value instanceof Font) {
|
||||
isFont = true;
|
||||
typeface = value.getAndroidTypeface();
|
||||
} else {
|
||||
typeface = value.typeface;
|
||||
}
|
||||
|
||||
let items = this.items;
|
||||
if (items && items.length > 0) {
|
||||
let tabLayout = this._tabLayout;
|
||||
|
||||
for (let i = 0, length = items.length; i < length; i++) {
|
||||
let tv = tabLayout.getTextViewForItemAt(i);
|
||||
tv.setTypeface(typeface);
|
||||
|
||||
if (isFont) {
|
||||
tv.setTextSize(fontSize);
|
||||
}
|
||||
else {
|
||||
tv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, fontSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// tab-text-color
|
||||
private static setTabTextColorProperty(v: view.View, newValue: any) {
|
||||
var tabLayout = (<definition.TabView>v)._getAndroidTabView();
|
||||
tabLayout.setTabTextColor(types.isNumber(newValue) ? new java.lang.Integer(newValue) : newValue);
|
||||
}
|
||||
|
||||
private static resetTabTextColorProperty(v: view.View, nativeValue: any) {
|
||||
var tabLayout = (<definition.TabView>v)._getAndroidTabView();
|
||||
tabLayout.setTabTextColor(types.isNumber(nativeValue) ? new java.lang.Integer(nativeValue) : nativeValue);
|
||||
}
|
||||
|
||||
private static getTabTextColorProperty(v: view.View): any {
|
||||
var tabLayout = (<definition.TabView>v)._getAndroidTabView();
|
||||
return tabLayout.getTabTextColor();
|
||||
}
|
||||
|
||||
//tab-background-color
|
||||
private static setTabBackgroundColorProperty(v: view.View, newValue: any) {
|
||||
var tabLayout = (<definition.TabView>v)._getAndroidTabView();
|
||||
tabLayout.setBackgroundColor(newValue);
|
||||
}
|
||||
|
||||
private static resetTabBackgroundColorProperty(v: view.View, nativeValue: any) {
|
||||
var tabLayout = (<definition.TabView>v)._getAndroidTabView();
|
||||
tabLayout.setBackgroundColor(nativeValue);
|
||||
}
|
||||
|
||||
private static getTabBackgroundColorProperty(v: view.View): any {
|
||||
var tabLayout = (<definition.TabView>v)._getAndroidTabView();
|
||||
let background = tabLayout.getBackground();
|
||||
if (background instanceof android.graphics.drawable.ColorDrawable){
|
||||
return (<android.graphics.drawable.ColorDrawable>background).getColor();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
//selected-tab-text-color
|
||||
private static setSelectedTabTextColorProperty(v: view.View, newValue: any) {
|
||||
var tabLayout = (<definition.TabView>v)._getAndroidTabView();
|
||||
tabLayout.setSelectedTabTextColor(types.isNumber(newValue) ? new java.lang.Integer(newValue) : newValue);
|
||||
}
|
||||
|
||||
private static resetSelectedTabTextColorProperty(v: view.View, nativeValue: any) {
|
||||
var tabLayout = (<definition.TabView>v)._getAndroidTabView();
|
||||
tabLayout.setSelectedTabTextColor(types.isNumber(nativeValue) ? new java.lang.Integer(nativeValue) : nativeValue);
|
||||
}
|
||||
|
||||
private static getSelectedTabTextColorProperty(v: view.View): any {
|
||||
var tabLayout = (<definition.TabView>v)._getAndroidTabView();
|
||||
return tabLayout.getSelectedTabTextColor();
|
||||
}
|
||||
|
||||
// android-selected-tab-highlight-color-property
|
||||
private static setAndroidSelectedTabHighlightColorProperty(v: view.View, newValue: any) {
|
||||
let tabLayout = (<TabView>v)._getAndroidTabView();
|
||||
tabLayout.setSelectedIndicatorColors([newValue]);
|
||||
}
|
||||
|
||||
private static resetAndroidSelectedTabHighlightColorProperty(v: view.View, nativeValue: any) {
|
||||
let tabLayout = (<TabView>v)._getAndroidTabView();
|
||||
tabLayout.setSelectedIndicatorColors([nativeValue]);
|
||||
}
|
||||
|
||||
private static getAndroidSelectedTabHighlightColorProperty(v: view.View): any {
|
||||
let tabLayout = (<TabView>v)._getAndroidTabView();
|
||||
let selectedIndicatorColors = tabLayout.getSelectedIndicatorColors();
|
||||
return selectedIndicatorColors.length > 0 ? selectedIndicatorColors[0] : null;
|
||||
}
|
||||
|
||||
// text-transform
|
||||
private static setTextTransformProperty(v: view.View, newValue: any) {
|
||||
let tabView = <TabView>v;
|
||||
let tabLayout = tabView._getAndroidTabView();
|
||||
for (let i = 0; i < tabView.items.length; i++) {
|
||||
let textView = tabLayout.getTextViewForItemAt(i);
|
||||
let str = tabView.items[i].title;
|
||||
let result = utils.ad.getTransformedString(newValue, textView, str);
|
||||
textView.setText(result);
|
||||
}
|
||||
}
|
||||
|
||||
private static resetTextTransformProperty(v: view.View, nativeValue: any) {
|
||||
let tabView = <TabView>v;
|
||||
let tabLayout = tabView._getAndroidTabView();
|
||||
for (let i = 0; i < tabView.items.length; i++) {
|
||||
let textView = tabLayout.getTextViewForItemAt(i);
|
||||
let str = tabView.items[i].title;
|
||||
let result = utils.ad.getTransformedString(nativeValue, textView, str);
|
||||
textView.setText(result);
|
||||
}
|
||||
}
|
||||
|
||||
public static registerHandlers() {
|
||||
|
||||
style.registerHandler(style.fontInternalProperty, new style.StylePropertyChangedHandler(
|
||||
TabViewStyler.setFontInternalProperty,
|
||||
TabViewStyler.resetFontInternalProperty,
|
||||
TabViewStyler.getNativeFontInternalValue), "TabView");
|
||||
|
||||
style.registerHandler(style.tabTextColorProperty, new style.StylePropertyChangedHandler(
|
||||
TabViewStyler.setTabTextColorProperty,
|
||||
TabViewStyler.resetTabTextColorProperty,
|
||||
TabViewStyler.getTabTextColorProperty), "TabView");
|
||||
|
||||
style.registerHandler(style.tabBackgroundColorProperty, new style.StylePropertyChangedHandler(
|
||||
TabViewStyler.setTabBackgroundColorProperty,
|
||||
TabViewStyler.resetTabBackgroundColorProperty,
|
||||
TabViewStyler.getTabBackgroundColorProperty), "TabView");
|
||||
|
||||
style.registerHandler(style.selectedTabTextColorProperty, new style.StylePropertyChangedHandler(
|
||||
TabViewStyler.setSelectedTabTextColorProperty,
|
||||
TabViewStyler.resetSelectedTabTextColorProperty,
|
||||
TabViewStyler.getSelectedTabTextColorProperty), "TabView");
|
||||
|
||||
style.registerHandler(style.androidSelectedTabHighlightColorProperty, new style.StylePropertyChangedHandler(
|
||||
TabViewStyler.setAndroidSelectedTabHighlightColorProperty,
|
||||
TabViewStyler.resetAndroidSelectedTabHighlightColorProperty,
|
||||
TabViewStyler.getAndroidSelectedTabHighlightColorProperty), "TabView");
|
||||
|
||||
style.registerHandler(style.textTransformProperty, new style.StylePropertyChangedHandler(
|
||||
TabViewStyler.setTextTransformProperty,
|
||||
TabViewStyler.resetTextTransformProperty), "TabView");
|
||||
}
|
||||
}
|
||||
|
||||
TabViewStyler.registerHandlers();
|
||||
1
tns-core-modules/ui/tab-view/tab-view.d.ts
vendored
1
tns-core-modules/ui/tab-view/tab-view.d.ts
vendored
@@ -144,4 +144,5 @@ declare module "ui/tab-view" {
|
||||
export const itemsProperty: Property<TabView, TabViewItem[]>;
|
||||
export const selectedIndexProperty: Property<TabView, number>;
|
||||
export const selectedColorProperty: Property<TabView, Color>;
|
||||
export const tabsBackgroundColorProperty: Property<TabView, Color>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user