blob: b2263831f1c2da9a04dccbe6d8c9462eb2c183f1 [file] [log] [blame]
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!---
The default skin class for Spark TabBar buttons.
@langversion 3.0
@playerversion Flash 10
@playerversion AIR 1.5
@productversion Flex 4
-->
<s:SparkSkin
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
minWidth="21" minHeight="21" alpha.disabledStates="0.5">
<!-- host component -->
<fx:Metadata>
<![CDATA[
/**
* @copy spark.skins.spark.ApplicationSkin#hostComponent
*/
[HostComponent("spark.components.ButtonBarButton")]
]]>
</fx:Metadata>
<fx:Script fb:purpose="styling" >
import spark.components.TabBar;
static private const exclusions:Array = ["labelDisplay"];
/**
* @private
*/
override public function get colorizeExclusions():Array {return exclusions;}
/**
* @private
*/
override protected function initializationComplete():void
{
//useBaseColor = true;
super.initializationComplete();
}
private var cornerRadius:Number = 4
/**
* @private
* The borderTop s:Path is just a s:Rect with the bottom edge left out.
* Given the rounded corners per the cornerRadius style, the result is
* roughly an inverted U with the specified width, height, and cornerRadius.
*
* Circular arcs are drawn with two curves per flash.display.Graphics.GraphicsUtil.
*/
private function updateBorderTop(width:Number, height:Number):void
{
var left:Number = -0.5;
var right:Number = width - 0.5;
var top:Number = 0.5;
var bottom:Number = height;
var a:Number = cornerRadius * 0.292893218813453;
var s:Number = cornerRadius * 0.585786437626905;
var path:String = "";
path += "M " + left + " " + bottom;
path += " L " + left + " " + (top + cornerRadius);
path += " Q " + left + " " + (top + s) + " " + (left + a) + " " + (top + a);
path += " Q " + (left + s) + " " + top + " " + (left + cornerRadius) + " " + top;
path += " L " + (right - cornerRadius) + " " + top;
path += " Q " + (right - s) + " " + top + " " + (right - a) + " " + (top + a);
path += " Q " + right + " " + (top + s) + " " + right + " " + (top + cornerRadius);
path += " L " + right + " " + bottom;
borderTop.data = path;
}
/**
* @private
* The cornerRadius style is specified by the TabBar, not the button itself.
*
* Rather than bind the corner radius properties of the s:Rect's in the markup
* below to hostComponent.owner.getStyle("cornerRadius"), we reset them here,
* each time a change in the value of the style is detected. Note that each
* corner radius property is explicitly initialized to the default value of
* the style; the initial value of the private cornerRadius property.
*/
private function updateCornerRadius():void
{
var cr:Number = getStyle("cornerRadius");
if (cornerRadius != cr)
{
cornerRadius = cr;
fill.topLeftRadiusX = cornerRadius;
fill.topRightRadiusX = cornerRadius;
lowlight.radiusX = cornerRadius;
highlight.radiusX = cornerRadius;
highlightStroke.topLeftRadiusX = cornerRadius;
highlightStroke.topRightRadiusX = cornerRadius;
}
}
/**
* @private
*/
override protected function updateDisplayList(unscaledWidth:Number, unscaleHeight:Number):void
{
updateCornerRadius();
updateBorderTop(unscaledWidth, unscaledHeight);
super.updateDisplayList(unscaledWidth, unscaledHeight);
}
</fx:Script>
<!-- states -->
<s:states>
<s:State name="up" />
<s:State name="over" stateGroups="overStates" />
<s:State name="down" stateGroups="downStates" />
<s:State name="disabled" stateGroups="disabledStates" />
<s:State name="upAndSelected" stateGroups="selectedStates, selectedUpStates" />
<s:State name="overAndSelected" stateGroups="overStates, selectedStates" />
<s:State name="downAndSelected" stateGroups="downStates, selectedStates" />
<s:State name="disabledAndSelected" stateGroups="selectedUpStates, disabledStates, selectedStates" />
</s:states>
<s:Group left="-1" right="0" top="-1" bottom="-1">
<!-- layer 2: fill -->
<s:Rect id="fill" left="2" right="1" top="2" bottom="2" topLeftRadiusX="4" topRightRadiusX="4" width="69" height="21">
<s:fill>
<s:LinearGradient rotation="90">
<s:GradientEntry color="0xFFFFFF"
color.selectedUpStates="0xFFFFFF"
color.overStates="0xCC0000"
color.downStates="0xCC0000"
alpha="0.85"
alpha.overAndSelected="1" />
<s:GradientEntry color="0xCCCCCC"
color.selectedUpStates="0x9FA0A1"
color.over="0xCC0000"
color.overAndSelected="0xFFFFFF"
color.downStates="0xCC0000"
alpha="0.85"
alpha.overAndSelected="1" />
</s:LinearGradient>
</s:fill>
</s:Rect>
<!-- layer 3: fill lowlight -->
<s:Rect id="lowlight" left="2" right="1" bottom="2" height="9" radiusX="4">
<s:fill>
<s:LinearGradient rotation="90">
<s:GradientEntry color="0xCC0000" alpha="0.0099" />
<s:GradientEntry color="0xCC0000" alpha="0.0627" />
</s:LinearGradient>
</s:fill>
</s:Rect>
<!-- layer 4: fill highlight -->
<s:Rect id="highlight" left="2" right="1" top="2" height="9" radiusX="4">
<s:fill>
<s:SolidColor color="0xCC0000"
alpha="0.33"
alpha.selectedUpStates="0.22"
alpha.overStates="0.22"
alpha.downStates="0.12" />
</s:fill>
</s:Rect>
<!-- layer 5: highlight stroke (all states except down) -->
<s:Rect id="highlightStroke" left="2" right="1" top="2" bottom="2" topLeftRadiusX="4" topRightRadiusX="4">
<s:stroke>
<s:LinearGradientStroke rotation="90" weight="1">
<s:GradientEntry color="0xCC0000" alpha.overStates="0.22" alpha.selectedUpStates="0.33" />
</s:LinearGradientStroke>
</s:stroke>
</s:Rect>
<!-- layer 6: highlight stroke (down state only) -->
<s:Rect left="2" top="2" bottom="2" width="1" includeIn="downStates, selectedUpStates, overAndSelected">
<s:fill>
<s:SolidColor color="0xCC0000" alpha="0.07" />
</s:fill>
</s:Rect>
<s:Rect right="1" top="2" bottom="2" width="1" includeIn="downStates, selectedUpStates, overAndSelected">
<s:fill>
<s:SolidColor color="0xCC0000" alpha="0.07" />
</s:fill>
</s:Rect>
<s:Rect left="3" top="2" right="1" height="1" includeIn="downStates, selectedUpStates, overAndSelected">
<s:fill>
<s:SolidColor color="0xCC0000" alpha="0.25" />
</s:fill>
</s:Rect>
<s:Rect left="2" top="3" right="1" height="1" includeIn="downStates, selectedUpStates, overAndSelected">
<s:fill>
<s:SolidColor color="0xCC0000" alpha="0.09" />
</s:fill>
</s:Rect>
<!-- layer 7: border - put on top of the fill so it doesn't disappear when scale is less than 1 -->
<s:Line id="borderBottom" left="1" right="0" bottom="1">
<s:stroke>
<s:SolidColorStroke weight="1"
color="0xCC0000"
color.selectedStates="0x434343"
alpha="0.75"
alpha.down="0.85"
alpha.selectedStates="0.5" />
</s:stroke>
</s:Line>
<s:Path id="borderTop" left="1" right="0" top="1" bottom="1" width="69" height="21">
<s:stroke>
<s:LinearGradientStroke rotation="90" weight="1">
<s:GradientEntry color="0xCC0000"
alpha="0.5625"
/>
<s:GradientEntry color="0xFFFFFF"
color.selectedUpStates="0xFFFFFF"
color.overStates="0xFFFFFF"
color.downStates="0xCC0000"
alpha="0.85"
alpha.overAndSelected="1" />
</s:LinearGradientStroke>
</s:stroke>
</s:Path>
</s:Group>
<!-- layer 8: text -->
<!--- The defines the appearance of the label for the first button in the ButtonBar component. -->
<s:Group left="2" top="2">
<s:BitmapImage source="@Embed('../personIcon.png')" width="16" height="16"/>
<s:Label id="labelDisplay"
textAlign="right"
verticalAlign="middle"
maxDisplayedLines="1"
horizontalCenter="7" verticalCenter="1"
left="10" right="10" top="2" bottom="2" color.down="#FFFFFF">
</s:Label>
</s:Group>
</s:SparkSkin>