提交修改
This commit is contained in:
@@ -1,657 +0,0 @@
|
||||
using UnityEngine;
|
||||
using FairyGUI.Utils;
|
||||
|
||||
namespace FairyGUI
|
||||
{
|
||||
/// <summary>
|
||||
/// GButton class.
|
||||
/// </summary>
|
||||
public class GButton : GComponent, IColorGear
|
||||
{
|
||||
/// <summary>
|
||||
/// Play sound when button is clicked.
|
||||
/// </summary>
|
||||
public NAudioClip sound;
|
||||
|
||||
/// <summary>
|
||||
/// Volume of the click sound. (0-1)
|
||||
/// </summary>
|
||||
public float soundVolumeScale;
|
||||
|
||||
/// <summary>
|
||||
/// For radio or checkbox. if false, the button will not change selected status on click. Default is true.
|
||||
/// 如果为true,对于单选和多选按钮,当玩家点击时,按钮会自动切换状态。设置为false,则不会。默认为true。
|
||||
/// </summary>
|
||||
public bool changeStateOnClick;
|
||||
|
||||
/// <summary>
|
||||
/// Show a popup on click.
|
||||
/// 可以为按钮设置一个关联的组件,当按钮被点击时,此组件被自动弹出。
|
||||
/// </summary>
|
||||
public GObject linkedPopup;
|
||||
|
||||
protected GObject _titleObject;
|
||||
protected GObject _iconObject;
|
||||
protected Controller _relatedController;
|
||||
protected string _relatedPageId;
|
||||
|
||||
ButtonMode _mode;
|
||||
bool _selected;
|
||||
string _title;
|
||||
string _icon;
|
||||
string _selectedTitle;
|
||||
string _selectedIcon;
|
||||
Controller _buttonController;
|
||||
int _downEffect;
|
||||
float _downEffectValue;
|
||||
bool _downScaled;
|
||||
|
||||
bool _down;
|
||||
bool _over;
|
||||
|
||||
EventListener _onChanged;
|
||||
|
||||
public const string UP = "up";
|
||||
public const string DOWN = "down";
|
||||
public const string OVER = "over";
|
||||
public const string SELECTED_OVER = "selectedOver";
|
||||
public const string DISABLED = "disabled";
|
||||
public const string SELECTED_DISABLED = "selectedDisabled";
|
||||
|
||||
public GButton()
|
||||
{
|
||||
sound = UIConfig.buttonSound;
|
||||
soundVolumeScale = UIConfig.buttonSoundVolumeScale;
|
||||
changeStateOnClick = true;
|
||||
_downEffectValue = 0.8f;
|
||||
_title = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dispatched when the button status was changed.
|
||||
/// 如果为单选或多选按钮,当按钮的选中状态发生改变时,此事件触发。
|
||||
/// </summary>
|
||||
public EventListener onChanged
|
||||
{
|
||||
get { return _onChanged ?? (_onChanged = new EventListener(this, "onChanged")); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Icon of the button.
|
||||
/// </summary>
|
||||
override public string icon
|
||||
{
|
||||
get
|
||||
{
|
||||
return _icon;
|
||||
}
|
||||
set
|
||||
{
|
||||
_icon = value;
|
||||
value = (_selected && _selectedIcon != null) ? _selectedIcon : _icon;
|
||||
if (_iconObject != null)
|
||||
_iconObject.icon = value;
|
||||
UpdateGear(7);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Title of the button
|
||||
/// </summary>
|
||||
public string title
|
||||
{
|
||||
get
|
||||
{
|
||||
return _title;
|
||||
}
|
||||
set
|
||||
{
|
||||
_title = value;
|
||||
if (_titleObject != null)
|
||||
_titleObject.text = (_selected && _selectedTitle != null) ? _selectedTitle : _title;
|
||||
UpdateGear(6);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Same of the title.
|
||||
/// </summary>
|
||||
override public string text
|
||||
{
|
||||
get { return this.title; }
|
||||
set { this.title = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Icon value on selected status.
|
||||
/// </summary>
|
||||
public string selectedIcon
|
||||
{
|
||||
get
|
||||
{
|
||||
return _selectedIcon;
|
||||
}
|
||||
set
|
||||
{
|
||||
_selectedIcon = value;
|
||||
value = (_selected && _selectedIcon != null) ? _selectedIcon : _icon;
|
||||
if (_iconObject != null)
|
||||
_iconObject.icon = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Title value on selected status.
|
||||
/// </summary>
|
||||
public string selectedTitle
|
||||
{
|
||||
get
|
||||
{
|
||||
return _selectedTitle;
|
||||
}
|
||||
set
|
||||
{
|
||||
_selectedTitle = value;
|
||||
if (_titleObject != null)
|
||||
_titleObject.text = (_selected && _selectedTitle != null) ? _selectedTitle : _title;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Title color.
|
||||
/// </summary>
|
||||
public Color titleColor
|
||||
{
|
||||
get
|
||||
{
|
||||
GTextField tf = GetTextField();
|
||||
if (tf != null)
|
||||
return tf.color;
|
||||
else
|
||||
return Color.black;
|
||||
}
|
||||
set
|
||||
{
|
||||
GTextField tf = GetTextField();
|
||||
if (tf != null)
|
||||
{
|
||||
tf.color = value;
|
||||
UpdateGear(4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public Color color
|
||||
{
|
||||
get { return this.titleColor; }
|
||||
set { this.titleColor = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public int titleFontSize
|
||||
{
|
||||
get
|
||||
{
|
||||
GTextField tf = GetTextField();
|
||||
if (tf != null)
|
||||
return tf.textFormat.size;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
set
|
||||
{
|
||||
GTextField tf = GetTextField();
|
||||
if (tf != null)
|
||||
{
|
||||
TextFormat format = tf.textFormat;
|
||||
format.size = value;
|
||||
tf.textFormat = format;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If the button is in selected status.
|
||||
/// </summary>
|
||||
public bool selected
|
||||
{
|
||||
get
|
||||
{
|
||||
return _selected;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (_mode == ButtonMode.Common)
|
||||
return;
|
||||
|
||||
if (_selected != value)
|
||||
{
|
||||
_selected = value;
|
||||
SetCurrentState();
|
||||
if (_selectedTitle != null && _titleObject != null)
|
||||
_titleObject.text = _selected ? _selectedTitle : _title;
|
||||
if (_selectedIcon != null)
|
||||
{
|
||||
string str = _selected ? _selectedIcon : _icon;
|
||||
if (_iconObject != null)
|
||||
_iconObject.icon = str;
|
||||
}
|
||||
if (_relatedController != null
|
||||
&& parent != null
|
||||
&& !parent._buildingDisplayList)
|
||||
{
|
||||
if (_selected)
|
||||
{
|
||||
_relatedController.selectedPageId = _relatedPageId;
|
||||
if (_relatedController.autoRadioGroupDepth)
|
||||
parent.AdjustRadioGroupDepth(this, _relatedController);
|
||||
}
|
||||
else if (_mode == ButtonMode.Check && _relatedController.selectedPageId == _relatedPageId)
|
||||
_relatedController.oppositePageId = _relatedPageId;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Button mode.
|
||||
/// </summary>
|
||||
/// <seealso cref="ButtonMode"/>
|
||||
public ButtonMode mode
|
||||
{
|
||||
get
|
||||
{
|
||||
return _mode;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_mode != value)
|
||||
{
|
||||
if (value == ButtonMode.Common)
|
||||
this.selected = false;
|
||||
_mode = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A controller is connected to this button, the activate page of this controller will change while the button status changed.
|
||||
/// 对应编辑器中的单选控制器。
|
||||
/// </summary>
|
||||
public Controller relatedController
|
||||
{
|
||||
get
|
||||
{
|
||||
return _relatedController;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != _relatedController)
|
||||
{
|
||||
_relatedController = value;
|
||||
_relatedPageId = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string relatedPageId
|
||||
{
|
||||
get
|
||||
{
|
||||
return _relatedPageId;
|
||||
}
|
||||
set
|
||||
{
|
||||
_relatedPageId = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Simulates a click on this button.
|
||||
/// 模拟点击这个按钮。
|
||||
/// </summary>
|
||||
/// <param name="downEffect">If the down effect will simulate too.</param>
|
||||
public void FireClick(bool downEffect, bool clickCall = false)
|
||||
{
|
||||
if (downEffect && _mode == ButtonMode.Common)
|
||||
{
|
||||
SetState(OVER);
|
||||
|
||||
Timers.inst.Add(0.1f, 1, (object param) => { SetState(DOWN); });
|
||||
Timers.inst.Add(0.2f, 1,
|
||||
(object param) =>
|
||||
{
|
||||
SetState(UP);
|
||||
if (clickCall)
|
||||
{
|
||||
onClick.Call();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (clickCall)
|
||||
{
|
||||
onClick.Call();
|
||||
}
|
||||
}
|
||||
__click();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public GTextField GetTextField()
|
||||
{
|
||||
if (_titleObject is GTextField)
|
||||
return (GTextField)_titleObject;
|
||||
else if (_titleObject is GLabel)
|
||||
return ((GLabel)_titleObject).GetTextField();
|
||||
else if (_titleObject is GButton)
|
||||
return ((GButton)_titleObject).GetTextField();
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
protected void SetState(string val)
|
||||
{
|
||||
if (_buttonController != null)
|
||||
_buttonController.selectedPage = val;
|
||||
|
||||
if (_downEffect == 1)
|
||||
{
|
||||
int cnt = this.numChildren;
|
||||
if (val == DOWN || val == SELECTED_OVER || val == SELECTED_DISABLED)
|
||||
{
|
||||
Color color = new Color(_downEffectValue, _downEffectValue, _downEffectValue);
|
||||
for (int i = 0; i < cnt; i++)
|
||||
{
|
||||
GObject obj = this.GetChildAt(i);
|
||||
if ((obj is IColorGear) && !(obj is GTextField))
|
||||
((IColorGear)obj).color = color;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < cnt; i++)
|
||||
{
|
||||
GObject obj = this.GetChildAt(i);
|
||||
if ((obj is IColorGear) && !(obj is GTextField))
|
||||
((IColorGear)obj).color = Color.white;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (_downEffect == 2)
|
||||
{
|
||||
if (val == DOWN || val == SELECTED_OVER || val == SELECTED_DISABLED)
|
||||
{
|
||||
if (!_downScaled)
|
||||
{
|
||||
_downScaled = true;
|
||||
SetScale(this.scaleX * _downEffectValue, this.scaleY * _downEffectValue);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_downScaled)
|
||||
{
|
||||
_downScaled = false;
|
||||
SetScale(this.scaleX / _downEffectValue, this.scaleY / _downEffectValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void SetCurrentState()
|
||||
{
|
||||
if (this.grayed && _buttonController != null && _buttonController.HasPage(DISABLED))
|
||||
{
|
||||
if (_selected)
|
||||
SetState(SELECTED_DISABLED);
|
||||
else
|
||||
SetState(DISABLED);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_selected)
|
||||
SetState(_over ? SELECTED_OVER : DOWN);
|
||||
else
|
||||
SetState(_over ? OVER : UP);
|
||||
}
|
||||
}
|
||||
|
||||
override public void HandleControllerChanged(Controller c)
|
||||
{
|
||||
base.HandleControllerChanged(c);
|
||||
|
||||
if (_relatedController == c)
|
||||
this.selected = _relatedPageId == c.selectedPageId;
|
||||
}
|
||||
|
||||
override protected void HandleGrayedChanged()
|
||||
{
|
||||
if (_buttonController != null && _buttonController.HasPage(DISABLED))
|
||||
{
|
||||
if (this.grayed)
|
||||
{
|
||||
if (_selected)
|
||||
SetState(SELECTED_DISABLED);
|
||||
else
|
||||
SetState(DISABLED);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_selected)
|
||||
SetState(DOWN);
|
||||
else
|
||||
SetState(UP);
|
||||
}
|
||||
}
|
||||
else
|
||||
base.HandleGrayedChanged();
|
||||
}
|
||||
|
||||
override protected void ConstructExtension(ByteBuffer buffer)
|
||||
{
|
||||
buffer.Seek(0, 6);
|
||||
|
||||
_mode = (ButtonMode)buffer.ReadByte();
|
||||
string str = buffer.ReadS();
|
||||
if (str != null)
|
||||
sound = UIPackage.GetItemAssetByURL(str) as NAudioClip;
|
||||
soundVolumeScale = buffer.ReadFloat();
|
||||
_downEffect = buffer.ReadByte();
|
||||
_downEffectValue = buffer.ReadFloat();
|
||||
if (_downEffect == 2)
|
||||
SetPivot(0.5f, 0.5f, this.pivotAsAnchor);
|
||||
|
||||
_buttonController = GetController("button");
|
||||
_titleObject = GetChild("title");
|
||||
_iconObject = GetChild("icon");
|
||||
if (_titleObject != null)
|
||||
_title = _titleObject.text;
|
||||
if (_iconObject != null)
|
||||
_icon = _iconObject.icon;
|
||||
|
||||
if (_mode == ButtonMode.Common)
|
||||
SetState(UP);
|
||||
|
||||
displayObject.onRollOver.Add(__rollover);
|
||||
displayObject.onRollOut.Add(__rollout);
|
||||
displayObject.onTouchBegin.Add(__touchBegin);
|
||||
displayObject.onTouchEnd.Add(__touchEnd);
|
||||
displayObject.onRemovedFromStage.Add(__removedFromStage);
|
||||
displayObject.onClick.Add(__click);
|
||||
}
|
||||
|
||||
override public void Setup_AfterAdd(ByteBuffer buffer, int beginPos)
|
||||
{
|
||||
base.Setup_AfterAdd(buffer, beginPos);
|
||||
|
||||
if (!buffer.Seek(beginPos, 6))
|
||||
return;
|
||||
|
||||
if ((ObjectType)buffer.ReadByte() != packageItem.objectType)
|
||||
return;
|
||||
|
||||
string str;
|
||||
|
||||
str = buffer.ReadS();
|
||||
if (str != null)
|
||||
this.title = str;
|
||||
str = buffer.ReadS();
|
||||
if (str != null)
|
||||
this.selectedTitle = str;
|
||||
str = buffer.ReadS();
|
||||
if (str != null)
|
||||
this.icon = str;
|
||||
str = buffer.ReadS();
|
||||
if (str != null)
|
||||
this.selectedIcon = str;
|
||||
if (buffer.ReadBool())
|
||||
this.titleColor = buffer.ReadColor();
|
||||
int iv = buffer.ReadInt();
|
||||
if (iv != 0)
|
||||
this.titleFontSize = iv;
|
||||
iv = buffer.ReadShort();
|
||||
if (iv >= 0)
|
||||
_relatedController = parent.GetControllerAt(iv);
|
||||
_relatedPageId = buffer.ReadS();
|
||||
|
||||
str = buffer.ReadS();
|
||||
if (str != null)
|
||||
sound = UIPackage.GetItemAssetByURL(str) as NAudioClip;
|
||||
if (buffer.ReadBool())
|
||||
soundVolumeScale = buffer.ReadFloat();
|
||||
|
||||
this.selected = buffer.ReadBool();
|
||||
}
|
||||
|
||||
private void __rollover()
|
||||
{
|
||||
if (_buttonController == null || !_buttonController.HasPage(OVER))
|
||||
return;
|
||||
|
||||
_over = true;
|
||||
if (_down)
|
||||
return;
|
||||
|
||||
if (this.grayed && _buttonController.HasPage(DISABLED))
|
||||
return;
|
||||
|
||||
SetState(_selected ? SELECTED_OVER : OVER);
|
||||
}
|
||||
|
||||
private void __rollout()
|
||||
{
|
||||
if (_buttonController == null || !_buttonController.HasPage(OVER))
|
||||
return;
|
||||
|
||||
_over = false;
|
||||
if (_down)
|
||||
return;
|
||||
|
||||
if (this.grayed && _buttonController.HasPage(DISABLED))
|
||||
return;
|
||||
|
||||
SetState(_selected ? DOWN : UP);
|
||||
}
|
||||
|
||||
private void __touchBegin(EventContext context)
|
||||
{
|
||||
if (context.inputEvent.button != 0)
|
||||
return;
|
||||
|
||||
_down = true;
|
||||
context.CaptureTouch();
|
||||
|
||||
if (_mode == ButtonMode.Common)
|
||||
{
|
||||
if (this.grayed && _buttonController != null && _buttonController.HasPage(DISABLED))
|
||||
SetState(SELECTED_DISABLED);
|
||||
else
|
||||
SetState(DOWN);
|
||||
}
|
||||
|
||||
if (linkedPopup != null)
|
||||
{
|
||||
if (linkedPopup is Window)
|
||||
((Window)linkedPopup).ToggleStatus();
|
||||
else
|
||||
this.root.TogglePopup(linkedPopup, this);
|
||||
}
|
||||
}
|
||||
|
||||
private void __touchEnd()
|
||||
{
|
||||
if (_down)
|
||||
{
|
||||
_down = false;
|
||||
if (_mode == ButtonMode.Common)
|
||||
{
|
||||
if (this.grayed && _buttonController != null && _buttonController.HasPage(DISABLED))
|
||||
SetState(DISABLED);
|
||||
else if (_over)
|
||||
SetState(OVER);
|
||||
else
|
||||
SetState(UP);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_over
|
||||
&& _buttonController != null
|
||||
&& (_buttonController.selectedPage == OVER || _buttonController.selectedPage == SELECTED_OVER))
|
||||
{
|
||||
SetCurrentState();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void __removedFromStage()
|
||||
{
|
||||
if (_over)
|
||||
__rollout();
|
||||
}
|
||||
|
||||
private void __click()
|
||||
{
|
||||
if (sound != null && sound.nativeClip != null)
|
||||
Stage.inst.PlayOneShotSound(sound.nativeClip, soundVolumeScale);
|
||||
|
||||
if (_mode == ButtonMode.Check)
|
||||
{
|
||||
if (changeStateOnClick)
|
||||
{
|
||||
this.selected = !_selected;
|
||||
DispatchEvent("onChanged", null);
|
||||
}
|
||||
}
|
||||
else if (_mode == ButtonMode.Radio)
|
||||
{
|
||||
if (changeStateOnClick && !_selected)
|
||||
{
|
||||
this.selected = true;
|
||||
DispatchEvent("onChanged", null);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_relatedController != null)
|
||||
_relatedController.selectedPageId = _relatedPageId;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user