API changes - ios and android settings objcets

This commit is contained in:
vakrilov
2015-07-14 18:20:28 +03:00
parent 2cdf1e222b
commit d5687a8e9c
9 changed files with 165 additions and 118 deletions

View File

@@ -2,9 +2,9 @@
<Page.actionBar>
<ActionBar title="Title">
<ActionBar.actionItems>
<ActionItem text="left" tap="leftTap" iosPosition="left"/>
<ActionItem text="right" tap="rightTap" iosPosition="right"/>
<ActionItem text="pop" tap="popTap" iosPosition="right" androidPosition="popup"/>
<ActionItem text="left" tap="leftTap" ios.position="left"/>
<ActionItem text="right" tap="rightTap" ios.position="right"/>
<ActionItem text="pop" tap="popTap" ios.position="right" android.position="popup"/>
</ActionBar.actionItems>
</ActionBar>
</Page.actionBar>

View File

@@ -3,8 +3,8 @@
<ActionBar title="{{ title }}" icon="{{ mainIcon }}">
<NavigationButton text="{{ navText }}" icon="{{ navIcon }}" tap="{{ navTap }}"/>
<ActionBar.actionItems>
<ActionItem text="{{ firstItemText }}" tap="{{ firstItemTap }}" iosPosition="left"/>
<ActionItem icon="{{ secondItemIcon }}" tap="{{ secondItemTap }}" iosPosition="right"/>
<ActionItem text="{{ firstItemText }}" tap="{{ firstItemTap }}" ios.position="left"/>
<ActionItem icon="{{ secondItemIcon }}" tap="{{ secondItemTap }}" ios.position="right"/>
</ActionBar.actionItems>
</ActionBar>
</Page.actionBar>

View File

@@ -28,17 +28,19 @@ var j = 0;
export function visibilityTap(args: observable.EventData) {
var page = <pages.Page>view.getAncestor(<view.View>args.object, "Page")
if (page.actionBar.android) {
if (j % 3 === 0) {
page.actionBar.androidIconVisibility = "always";
page.actionBar.android.iconVisibility = "always";
}
else if (j % 3 === 1) {
page.actionBar.androidIconVisibility = "never";
page.actionBar.android.iconVisibility = "never";
}
else if (j % 3 === 2) {
page.actionBar.androidIconVisibility = "auto";
page.actionBar.android.iconVisibility = "auto";
}
j++;
console.log("Visibility changed to: " + page.actionBar.androidIconVisibility);
console.log("Visibility changed to: " + page.actionBar.android.iconVisibility);
}
}
export function navTap(args: observable.EventData) {

View File

@@ -5,16 +5,18 @@ import view = require("ui/core/view");
var i = 0;
export function buttonTap(args: observable.EventData) {
var page = <pages.Page>view.getAncestor(<view.View>args.object, "Page")
page.actionBar.title = "Title changed " + i++;
if (page.actionBar.android) {
if (i % 3 === 0) {
page.actionBar.icon = "res://ic_test";
page.actionBar.android.icon = "res://ic_test";
}
else if (i % 3 === 1) {
page.actionBar.icon = "~/test-icon.png";
page.actionBar.android.icon = "~/test-icon.png";
}
else if (i % 3 === 2) {
page.actionBar.icon = undefined;
page.actionBar.android.icon = undefined;
}
}
}
@@ -22,15 +24,17 @@ var j = 0;
export function visibilityTap(args: observable.EventData) {
var page = <pages.Page>view.getAncestor(<view.View>args.object, "Page")
if (page.actionBar.android) {
if (j % 3 === 0) {
page.actionBar.androidIconVisibility = "always";
page.actionBar.android.iconVisibility = "always";
}
else if (j % 3 === 1) {
page.actionBar.androidIconVisibility = "never";
page.actionBar.android.iconVisibility = "never";
}
else if (j % 3 === 2) {
page.actionBar.androidIconVisibility = "auto";
page.actionBar.android.iconVisibility = "auto";
}
j++;
console.log("Visibility changed to: " + page.actionBar.androidIconVisibility);
console.log("Visibility changed to: " + page.actionBar.android.iconVisibility);
}
}

View File

@@ -23,14 +23,17 @@ export function optionTap(args) {
var i = 0;
export function buttonTap(args: observable.EventData) {
currentPage.actionBar.title = "hi " + i++;
if (currentPage.actionBar.android) {
if (i % 3 === 0) {
currentPage.actionBar.icon = "res://ic_test";
currentPage.actionBar.android.icon = "res://ic_test";
}
else if (i % 3 === 1) {
currentPage.actionBar.icon = "~/test-icon.png";
currentPage.actionBar.android.icon = "~/test-icon.png";
}
else if (i % 3 === 2) {
currentPage.actionBar.icon = undefined;
currentPage.actionBar.android.icon = undefined;
}
}
}

View File

@@ -19,15 +19,8 @@ function onTitlePropertyChanged(data: dependencyObservable.PropertyChangeData) {
actionBar._onTitlePropertyChanged();
}
function onIconPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var actionBar = <ActionBar>data.object;
actionBar._onIconPropertyChanged();
}
export class ActionBar extends view.View implements dts.ActionBar {
public static titleProperty = new dependencyObservable.Property("title", "ActionBar", new proxy.PropertyMetadata(undefined, dependencyObservable.PropertyMetadataSettings.None, onTitlePropertyChanged));
public static iconProperty = new dependencyObservable.Property("icon", "ActionBar", new proxy.PropertyMetadata(undefined, dependencyObservable.PropertyMetadataSettings.None, onIconPropertyChanged));
public static androidIconVisibilityProperty = new dependencyObservable.Property("androidIconVisibility", "ActionBar", new proxy.PropertyMetadata("auto", dependencyObservable.PropertyMetadataSettings.None, onIconPropertyChanged));
private _actionItems: ActionItems;
private _navigationButton: NavigationButton;
@@ -41,20 +34,6 @@ export class ActionBar extends view.View implements dts.ActionBar {
this._setValue(ActionBar.titleProperty, value);
}
get icon(): string {
return this._getValue(ActionBar.iconProperty);
}
set icon(value: string) {
this._setValue(ActionBar.iconProperty, value);
}
get androidIconVisibility(): string {
return this._getValue(ActionBar.androidIconVisibilityProperty);
}
set androidIconVisibility(value: string) {
this._setValue(ActionBar.androidIconVisibilityProperty, value);
}
get navigationButton(): NavigationButton {
return this._navigationButton;
}
@@ -117,6 +96,10 @@ export class ActionBar extends view.View implements dts.ActionBar {
}, this._page);
}
get android(): dts.AndroidActionBarSettings {
return undefined;
}
get _childrenCount(): number {
return this.titleView ? 1 : 0;
}
@@ -136,10 +119,6 @@ export class ActionBar extends view.View implements dts.ActionBar {
//
}
public _onIconPropertyChanged() {
//
}
public _updateAndroidActionBar(menu: android.view.IMenu) {
//
}
@@ -181,7 +160,7 @@ export class ActionBar extends view.View implements dts.ActionBar {
public shouldShow(): boolean {
if (this.title ||
this.icon ||
(this.android && this.android.icon) ||
this.navigationButton ||
this.actionItems.getItems().length > 0) {
@@ -193,14 +172,14 @@ export class ActionBar extends view.View implements dts.ActionBar {
}
export class ActionItems implements dts.ActionItems {
private _items: Array<ActionItem> = new Array<ActionItem>();
private _items: Array<dts.ActionItem> = new Array<dts.ActionItem>();
private _actionBar: ActionBar;
constructor(actionBar: ActionBar) {
this._actionBar = actionBar;
}
public addItem(item: ActionItem): void {
public addItem(item: dts.ActionItem): void {
if (!item) {
throw new Error("Cannot add empty item");
}
@@ -210,7 +189,7 @@ export class ActionItems implements dts.ActionItems {
this.invalidate();
}
public removeItem(item: ActionItem): void {
public removeItem(item: dts.ActionItem): void {
if (!item) {
throw new Error("Cannot remove empty item");
}
@@ -225,11 +204,11 @@ export class ActionItems implements dts.ActionItems {
this.invalidate();
}
public getItems(): Array<ActionItem> {
public getItems(): Array<dts.ActionItem> {
return this._items.slice();
}
public getItemAt(index: number): ActionItem {
public getItemAt(index: number): dts.ActionItem {
if (index < 0 || index >= this._items.length) {
return undefined;
}
@@ -237,7 +216,7 @@ export class ActionItems implements dts.ActionItems {
return this._items[index];
}
public setItems(items: Array<ActionItem>) {
public setItems(items: Array<dts.ActionItem>) {
// Remove all existing items
while (this._items.length > 0) {
this.removeItem(this._items[this._items.length - 1]);
@@ -268,7 +247,7 @@ export class ActionItemBase extends bindable.Bindable implements dts.ActionItemB
"icon", "ActionItemBase", new dependencyObservable.PropertyMetadata(null, null, ActionItemBase.onItemChanged));
private static onItemChanged(data: dependencyObservable.PropertyChangeData) {
var menuItem = <ActionItem>data.object;
var menuItem = <ActionItemBase>data.object;
if (menuItem.actionBar) {
menuItem.actionBar.updateActionBar();
}
@@ -302,27 +281,7 @@ export class ActionItemBase extends bindable.Bindable implements dts.ActionItemB
}
public _raiseTap() {
this._emit(ActionItem.tapEvent);
}
}
export class ActionItem extends ActionItemBase {
private _androidPosition: string = enums.AndroidActionItemPosition.actionBar;
private _iosPosition: string = enums.IOSActionItemPosition.right;
get androidPosition(): string {
return this._androidPosition;
}
set androidPosition(value: string) {
this._androidPosition = value;
}
get iosPosition(): string {
return this._iosPosition;
}
set iosPosition(value: string) {
this._iosPosition = value;
this._emit(ActionItemBase.tapEvent);
}
}

View File

@@ -6,6 +6,7 @@ import utils = require("utils/utils");
import imageSource = require("image-source");
import enums = require("ui/enums");
import application = require("application");
import dts = require("ui/action-bar");
var ACTION_ITEM_ID_OFFSET = 1000;
var API_LVL = android.os.Build.VERSION.SDK_INT;
@@ -13,14 +14,71 @@ var API_LVL = android.os.Build.VERSION.SDK_INT;
declare var exports;
require("utils/module-merge").merge(common, exports);
export class ActionItem extends common.ActionItemBase implements dts.ActionItem {
private _androidPosition: dts.AndroidActionItemSettings = { position: enums.AndroidActionItemPosition.actionBar };
public get android(): dts.AndroidActionItemSettings {
return this._androidPosition;
}
public set android(value: dts.AndroidActionItemSettings) {
throw new Error("ActionItem.android is read-only");
}
// Not used in Android
public ios: dts.IOSActionItemSettings;
}
export class AndroidActionBarSettings implements dts.AndroidActionBarSettings {
private _actionBar: ActionBar;
private _icon: string;
private _iconVisibility: string = enums.AndroidActionBarIconVisibility.auto;
public get icon(): string {
return this._icon;
}
public set icon(value: string) {
if (value !== this._icon) {
this._icon = value;
this._actionBar._onIconPropertyChanged();
}
}
public get iconVisibility(): string {
return this._iconVisibility;
}
public set iconVisibility(value: string) {
if (value !== this._iconVisibility) {
this._iconVisibility = value;
this._actionBar._onIconPropertyChanged();
}
}
constructor(actionBar: ActionBar) {
this._actionBar = actionBar;
}
}
export class ActionBar extends common.ActionBar {
private _appResources: android.content.res.Resources;
private _android: AndroidActionBarSettings;
get android(): AndroidActionBarSettings {
return this._android;
}
set android(value: AndroidActionBarSettings) {
throw new Error("ActionBar.android is read-only");
}
get _nativeView() {
return undefined;
}
constructor() {
super();
this._appResources = application.android.context.getResources();
this.actionItems
this._android = new AndroidActionBarSettings(this);
}
public updateActionBar() {
@@ -39,7 +97,6 @@ export class ActionBar extends common.ActionBar {
if (this.navigationButton && itemId === (<any>android).R.id.home) {
this.navigationButton._raiseTap();
return true;
}
return false;
@@ -80,7 +137,7 @@ export class ActionBar extends common.ActionBar {
}
public _updateIcon(actionBar: android.app.ActionBar) {
var icon = this.icon;
var icon = this.android.icon;
if (types.isDefined(icon)) {
var drawableOrId = getDrawableOrResourceId(icon, this._appResources);
if (drawableOrId) {
@@ -92,12 +149,7 @@ export class ActionBar extends common.ActionBar {
actionBar.setIcon(defaultIcon);
}
var iconVisibility: boolean;
if (this.androidIconVisibility === enums.AndroidActionBarIconVisibility.always) {
iconVisibility = true;
}
var visibility = getIconVisibility(this.androidIconVisibility);
var visibility = getIconVisibility(this.android.iconVisibility);
actionBar.setDisplayShowHomeEnabled(visibility);
}
@@ -211,8 +263,8 @@ function getDrawableOrResourceId(icon: string, resources: android.content.res.Re
return undefined;
}
function getShowAsAction(menuItem: common.ActionItem): number {
switch (menuItem.androidPosition) {
function getShowAsAction(menuItem: dts.ActionItem): number {
switch (menuItem.android.position) {
case enums.AndroidActionItemPosition.actionBarIfRoom:
return android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM;

View File

@@ -7,13 +7,13 @@
export class ActionBar extends view.View implements view.AddArrayFromBuilder, view.AddChildFromBuilder {
title: string;
icon: string;
androidIconVisibility: string;
navigationButton: NavigationButton;
actionItems: ActionItems;
titleView: view.View;
android: AndroidActionBarSettings;
page: pages.Page;
shouldShow(): boolean
@@ -55,6 +55,7 @@
text: string;
icon: string;
actionBar: ActionBar;
/**
* A basic method signature to hook an event listener (shortcut alias to the addEventListener method).
@@ -75,8 +76,21 @@
}
export class ActionItem extends ActionItemBase {
androidPosition: string;
iosPosition: string;
ios: IOSActionItemSettings;
android: AndroidActionItemSettings;
}
export interface AndroidActionItemSettings {
position: string;
}
export interface IOSActionItemSettings {
position: string;
}
export interface AndroidActionBarSettings {
icon: string;
iconVisibility: string;
}
export class NavigationButton extends ActionItemBase {

View File

@@ -1,5 +1,5 @@
import common = require("ui/action-bar/action-bar-common");
import definition = require("ui/action-bar");
import dts = require("ui/action-bar");
import imageSource = require("image-source");
import frameModule = require("ui/frame");
import enums = require("ui/enums");
@@ -9,6 +9,19 @@ import utils = require("utils/utils");
declare var exports;
require("utils/module-merge").merge(common, exports);
export class ActionItem extends common.ActionItemBase implements dts.ActionItem {
private _ios: dts.IOSActionItemSettings = { position: enums.IOSActionItemPosition.left };
public get ios(): dts.IOSActionItemSettings {
return this._ios;
}
public set ios(value: dts.IOSActionItemSettings) {
throw new Error("ActionItem.android is read-only");
}
// Not used in IOS
public android: dts.AndroidActionItemSettings;
}
export class ActionBar extends common.ActionBar {
public updateActionBar() {
// Page should be attached to frame to update the action bar.
@@ -75,7 +88,7 @@ export class ActionBar extends common.ActionBar {
for (var i = 0; i < items.length; i++) {
var barButtonItem = this.createBarButtonItem(items[i]);
if (items[i].iosPosition === enums.IOSActionItemPosition.left) {
if (items[i].ios.position === enums.IOSActionItemPosition.left) {
leftBarItems.push(barButtonItem);
}
else {
@@ -96,7 +109,7 @@ export class ActionBar extends common.ActionBar {
navigationItem.setRightBarButtonItemsAnimated(rightArray, true);
}
private createBarButtonItem(item: common.ActionItemBase): UIBarButtonItem {
private createBarButtonItem(item: dts.ActionItem): UIBarButtonItem {
var tapHandler = TapBarItemHandlerImpl.new().initWithOwner(item);
// associate handler with menuItem or it will get collected by JSC.
(<any>item).handler = tapHandler;
@@ -144,7 +157,7 @@ export class ActionBar extends common.ActionBar {
protected get navigationBarHeight(): number {
var navController = frameModule.topmost().ios.controller;
if(!navController){
if (!navController) {
return 0;
}
var navigationBar = navController.navigationBar;
@@ -157,9 +170,9 @@ class TapBarItemHandlerImpl extends NSObject {
return <TapBarItemHandlerImpl>super.new();
}
private _owner: definition.ActionItemBase;
private _owner: dts.ActionItemBase;
public initWithOwner(owner: definition.ActionItemBase): TapBarItemHandlerImpl {
public initWithOwner(owner: dts.ActionItemBase): TapBarItemHandlerImpl {
this._owner = owner;
return this;
}