Added pressed, active and disabled states for button.

This commit is contained in:
Nedyalko Nikolov
2016-10-21 14:26:37 +03:00
parent 8d178754a2
commit a63f46ee83
4 changed files with 94 additions and 7 deletions

View File

@ -258,6 +258,48 @@ export var testNativeTextAlignmentFromCss = function () {
}); });
} }
export var test_StateHighlighted_also_fires_pressedState = function () {
helper.buildUIAndRunTest(_createButtonFunc(), function (views: Array<viewModule.View>) {
var view = <buttonModule.Button>views[0];
var page = <pagesModule.Page>views[1];
var expectedColor = "#ffff0000";
page.css = "button:pressed { background-color: " + expectedColor + "; }";
view._goToVisualState('highlighted');
var actualResult = buttonTestsNative.getNativeBackgroundColor(view);
TKUnit.assert(actualResult.hex === expectedColor, "Actual: " + actualResult.hex + "; Expected: " + expectedColor);
});
}
export var test_StateHighlighted_also_fires_activeState = function () {
helper.buildUIAndRunTest(_createButtonFunc(), function (views: Array<viewModule.View>) {
var view = <buttonModule.Button>views[0];
var page = <pagesModule.Page>views[1];
var expectedColor = "#ffff0000";
page.css = "button:active { background-color: " + expectedColor + "; }";
view._goToVisualState('highlighted');
var actualResult = buttonTestsNative.getNativeBackgroundColor(view);
TKUnit.assert(actualResult.hex === expectedColor, "Actual: " + actualResult.hex + "; Expected: " + expectedColor);
});
}
export var test_applying_disabled_visual_State_when_button_is_disable = function () {
helper.buildUIAndRunTest(_createButtonFunc(), function (views: Array<viewModule.View>) {
var view = <buttonModule.Button>views[0];
var page = <pagesModule.Page>views[1];
var expectedColor = "#ffff0000";
page.css = "button:disabled { background-color: " + expectedColor + "; }";
view.isEnabled = false;
var actualResult = buttonTestsNative.getNativeBackgroundColor(view);
TKUnit.assert(actualResult.hex === expectedColor, "Actual: " + actualResult.hex + "; Expected: " + expectedColor);
});
}
export var testNativeTextAlignmentFromLocal = function () { export var testNativeTextAlignmentFromLocal = function () {
helper.buildUIAndRunTest(_createButtonFunc(), function (views: Array<viewModule.View>) { helper.buildUIAndRunTest(_createButtonFunc(), function (views: Array<viewModule.View>) {
var view = <buttonModule.Button>views[0]; var view = <buttonModule.Button>views[0];

View File

@ -23,6 +23,7 @@ import {Label} from "ui/label";
import {LayoutBase} from "ui/layouts/layout-base"; import {LayoutBase} from "ui/layouts/layout-base";
import * as helper from "../helper"; import * as helper from "../helper";
import viewModule = require("ui/core/view"); import viewModule = require("ui/core/view");
import {Page} from "ui/page";
export class LabelTest extends testModule.UITest<LabelModule.Label> { export class LabelTest extends testModule.UITest<LabelModule.Label> {
@ -666,3 +667,18 @@ export function test_IntegrationTest_Transform_Decoration_Spacing_WithFormattedT
TKUnit.assertEqual(view.style.letterSpacing, 1, "LetterSpacing"); TKUnit.assertEqual(view.style.letterSpacing, 1, "LetterSpacing");
}); });
} }
export var test_applying_disabled_visual_State_when_label_is_disable = function () {
let view = new Label();
helper.buildUIAndRunTest(view, function (views: Array<viewModule.View>) {
var view = <Label>views[0];
var page = <Page>views[1];
var expectedColor = "#ffff0000";
page.css = "label:disabled { background-color: " + expectedColor + "; }";
view.isEnabled = false;
var actualResult = labelTestsNative.getNativeBackgroundColor(view);
TKUnit.assert(actualResult.hex === expectedColor, "Actual: " + actualResult.hex + "; Expected: " + expectedColor);
});
}

View File

@ -82,7 +82,7 @@ export class Button extends common.Button {
} }
} }
@PseudoClassHandler("normal", "highlighted") @PseudoClassHandler("normal", "highlighted", "pressed", "active")
_updateHandler(subscribe: boolean) { _updateHandler(subscribe: boolean) {
if (subscribe) { if (subscribe) {
if (!this._stateChangedHandler) { if (!this._stateChangedHandler) {

View File

@ -552,6 +552,11 @@ export class View extends ProxyObject implements definition.View {
} }
set isEnabled(value: boolean) { set isEnabled(value: boolean) {
this._setValue(View.isEnabledProperty, value); this._setValue(View.isEnabledProperty, value);
if (value === false) {
this._goToVisualState('disabled');
} else {
this._goToVisualState('normal');
}
} }
get page(): definition.View { get page(): definition.View {
@ -757,17 +762,41 @@ export class View extends ProxyObject implements definition.View {
// //
} }
private pseudoClassAliases = {
'highlighted': [
'active',
'pressed'
]
};
private getAllAliasedStates(name: string): Array<string> {
let allStates = [];
allStates.push(name);
if (name in this.pseudoClassAliases) {
for (let i = 0; i < this.pseudoClassAliases[name].length; i++) {
allStates.push(this.pseudoClassAliases[name][i]);
}
}
return allStates;
}
public addPseudoClass(name: string): void { public addPseudoClass(name: string): void {
if (!this.cssPseudoClasses.has(name)) { let allStates = this.getAllAliasedStates(name);
this.cssPseudoClasses.add(name); for (let i = 0; i < allStates.length; i++) {
this.notifyPseudoClassChanged(name); if (!this.cssPseudoClasses.has(allStates[i])) {
this.cssPseudoClasses.add(allStates[i]);
this.notifyPseudoClassChanged(allStates[i]);
}
} }
} }
public deletePseudoClass(name: string): void { public deletePseudoClass(name: string): void {
if (this.cssPseudoClasses.has(name)) { let allStates = this.getAllAliasedStates(name);
this.cssPseudoClasses.delete(name); for (let i = 0; i < allStates.length; i++) {
this.notifyPseudoClassChanged(name); if (this.cssPseudoClasses.has(allStates[i])) {
this.cssPseudoClasses.delete(allStates[i]);
this.notifyPseudoClassChanged(allStates[i]);
}
} }
} }