Merge pull request #1961 from NativeScript/nnikolov/SegmentedBarItemsFromXML

Implemented AddChildFromBuilder for SegmentedBar.
This commit is contained in:
Nedyalko Nikolov
2016-04-14 16:44:03 +03:00
4 changed files with 75 additions and 17 deletions

View File

@ -5,6 +5,7 @@ import dependencyObservable = require("ui/core/dependency-observable");
import color = require("color"); import color = require("color");
import bindable = require("ui/core/bindable"); import bindable = require("ui/core/bindable");
import * as typesModule from "utils/types"; import * as typesModule from "utils/types";
import {WrappedValue} from "data/observable";
var types: typeof typesModule; var types: typeof typesModule;
function ensureTypes() { function ensureTypes() {
@ -17,6 +18,8 @@ export module knownCollections {
export var items = "items"; export var items = "items";
} }
var CHILD_SEGMENTED_BAR_ITEM = "SegmentedBarItem";
export class SegmentedBarItem extends bindable.Bindable implements definition.SegmentedBarItem { export class SegmentedBarItem extends bindable.Bindable implements definition.SegmentedBarItem {
private _title: string = ""; private _title: string = "";
public _parent: SegmentedBar; public _parent: SegmentedBar;
@ -97,4 +100,37 @@ export class SegmentedBar extends view.View implements definition.SegmentedBar {
} }
} }
} }
private itemsTimerId;
public _addChildFromBuilder(name: string, value: any): void {
if(name === CHILD_SEGMENTED_BAR_ITEM) {
if (!this.items) {
this.items = new Array<SegmentedBarItem>();
}
this.items.push(<SegmentedBarItem>value);
this.insertTab(<SegmentedBarItem>value);
}
}
public insertTab(tabItem: SegmentedBarItem, index?: number): void {
//
}
public getValidIndex(index?: number): number {
ensureTypes();
let idx: number;
let itemsLength = this.items ? this.items.length : 0;
if (types.isNullOrUndefined(index)) {
idx = itemsLength;
} else {
if (index < 0 || index > itemsLength) {
idx = itemsLength;
} else {
idx = index;
}
}
return idx;
}
} }

View File

@ -27,7 +27,7 @@ function onSelectedIndexPropertyChanged(data: dependencyObservable.PropertyChang
view.notify({ eventName: SegmentedBar.selectedIndexChangedEvent, object: view, oldIndex: data.oldValue, newIndex: data.newValue }); view.notify({ eventName: SegmentedBar.selectedIndexChangedEvent, object: view, oldIndex: data.oldValue, newIndex: data.newValue });
} else { } else {
view.selectedIndex = undefined; view.selectedIndex = undefined;
throw new Error("selectedIndex should be between [0, items.length - 1]"); throw new Error("selectedIndex should be between [0, " + (view.items.length - 1) + "]");
} }
} }
} }
@ -53,19 +53,7 @@ function onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) {
if (newItems && newItems.length) { if (newItems && newItems.length) {
for (var i = 0; i < newItems.length; i++) { for (var i = 0; i < newItems.length; i++) {
(<SegmentedBarItem>newItems[i])._parent = view; view.insertTab((<SegmentedBarItem>newItems[i]), i);
var tab = view.android.newTabSpec(i + "");
tab.setIndicator(newItems[i].title || "");
tab.setContent(new android.widget.TabHost.TabContentFactory({
createTabContent: function(tag: string): android.view.View {
var tv = new android.widget.TextView(view._context);
tv.setVisibility(android.view.View.GONE);
return tv;
}
}));
view.android.addTab(tab);
} }
if (types.isNumber(view.selectedIndex) && view.android.getCurrentTab() !== view.selectedIndex) { if (types.isNumber(view.selectedIndex) && view.android.getCurrentTab() !== view.selectedIndex) {
@ -188,6 +176,24 @@ export class SegmentedBar extends common.SegmentedBar {
get android(): android.widget.TabHost { get android(): android.widget.TabHost {
return this._android; return this._android;
} }
public insertTab(tabItem: SegmentedBarItem, index?: number): void {
super.insertTab(tabItem, index);
tabItem._parent = this;
var tab = this.android.newTabSpec(this.getValidIndex(index) + "");
tab.setIndicator(tabItem.title || "");
let that = this;
tab.setContent(new android.widget.TabHost.TabContentFactory({
createTabContent: function (tag: string): android.view.View {
var tv = new android.widget.TextView(that._context);
tv.setVisibility(android.view.View.GONE);
return tv;
}
}));
this.android.addTab(tab);
}
} }
var TabHostClass; var TabHostClass;

View File

@ -36,7 +36,7 @@ declare module "ui/segmented-bar" {
/** /**
* Represents a UI SegmentedBar component. * Represents a UI SegmentedBar component.
*/ */
export class SegmentedBar extends view.View { export class SegmentedBar extends view.View implements view.AddChildFromBuilder {
/** /**
* Gets or sets the selected index of the SegmentedBar component. * Gets or sets the selected index of the SegmentedBar component.
*/ */
@ -84,5 +84,16 @@ declare module "ui/segmented-bar" {
* Raised when the selected index changes. * Raised when the selected index changes.
*/ */
on(event: "selectedIndexChanged", callback: (args: SelectedIndexChangedEventData) => void, thisArg?: any); on(event: "selectedIndexChanged", callback: (args: SelectedIndexChangedEventData) => void, thisArg?: any);
/**
* Called for every child element declared in xml.
* @param name - Name of the element.
* @param value - Value of the element.
*/
public _addChildFromBuilder(name: string, value: any): void;
public insertTab(tabItem: SegmentedBarItem, index?: number): void;
public getValidIndex(index?: number): number;
} }
} }

View File

@ -56,8 +56,7 @@ function onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var newItems = <Array<definition.SegmentedBarItem>>data.newValue; var newItems = <Array<definition.SegmentedBarItem>>data.newValue;
if (newItems && newItems.length) { if (newItems && newItems.length) {
for (var i = 0; i < newItems.length; i++) { for (var i = 0; i < newItems.length; i++) {
view.ios.insertSegmentWithTitleAtIndexAnimated(newItems[i].title || "", i, false); view.insertTab(<SegmentedBarItem>(newItems[i]), i);
(<SegmentedBarItem>newItems[i])._parent = view;
} }
if (view.ios.selectedSegmentIndex !== view.selectedIndex) { if (view.ios.selectedSegmentIndex !== view.selectedIndex) {
@ -105,6 +104,12 @@ export class SegmentedBar extends common.SegmentedBar {
get ios(): UISegmentedControl { get ios(): UISegmentedControl {
return this._ios; return this._ios;
} }
public insertTab(tabItem: SegmentedBarItem, index?: number): void {
super.insertTab(tabItem, index);
tabItem._parent = this;
this.ios.insertSegmentWithTitleAtIndexAnimated(tabItem.title || "", this.getValidIndex(index), false);
}
} }
class SelectionHandlerImpl extends NSObject { class SelectionHandlerImpl extends NSObject {