2025-06-07 17:43:34 +08:00

2188 lines
60 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using UnityEngine;
using FairyGUI.Utils;
namespace FairyGUI
{
public class GObject : EventDispatcher
{
/// <summary>
/// GObject的id仅作为内部使用。与name不同id值是不会相同的。
/// id is for internal use only.
/// </summary>
public string id { get; private set; }
/// <summary>
/// Name of the object.
/// </summary>
public string name;
/// <summary>
/// User defined data.
/// </summary>
public object data;
/// <summary>
/// The source width of the object.
/// </summary>
public int sourceWidth;
/// <summary>
/// The source height of the object.
/// </summary>
public int sourceHeight;
/// <summary>
/// The initial width of the object.
/// </summary>
public int initWidth;
/// <summary>
/// The initial height of the object.
/// </summary>
public int initHeight;
/// <summary>
///
/// </summary>
public int minWidth;
/// <summary>
///
/// </summary>
public int maxWidth;
/// <summary>
///
/// </summary>
public int minHeight;
/// <summary>
///
/// </summary>
public int maxHeight;
/// <summary>
/// Relations Object.
/// </summary>
public Relations relations { get; private set; }
/// <summary>
/// Restricted range of dragging.
/// </summary>
public Rect? dragBounds;
/// <summary>
/// Parent object.
/// </summary>
public GComponent parent { get; private set; }
/// <summary>
/// Lowlevel display object.
/// </summary>
public DisplayObject displayObject { get; protected set; }
/// <summary>
/// 当前全局正在被拖动的对象
/// </summary>
public static GObject draggingObject { get; private set; }
/// <summary>
///
/// </summary>
public PackageItem packageItem;
float _x;
float _y;
float _z;
float _pivotX;
float _pivotY;
bool _pivotAsAnchor;
float _alpha;
float _rotation;
float _rotationX;
float _rotationY;
bool _visible;
bool _internalVisible;
bool _handlingController;
bool _touchable;
bool _grayed;
bool _draggable;
float _scaleX;
float _scaleY;
int _sortingOrder;
string _tooltips;
GGroup _group;
GearBase[] _gears;
EventListener _onClick;
EventListener _onRightClick;
EventListener _onTouchBegin;
EventListener _onTouchMove;
EventListener _onTouchEnd;
EventListener _onRollOver;
EventListener _onRollOut;
EventListener _onAddedToStage;
EventListener _onRemovedFromStage;
EventListener _onKeyDown;
EventListener _onClickLink;
EventListener _onPositionChanged;
EventListener _onSizeChanged;
EventListener _onDragStart;
EventListener _onDragMove;
EventListener _onDragEnd;
EventListener _onGearStop;
EventListener _onFocusIn;
EventListener _onFocusOut;
internal protected bool underConstruct;
internal float _width;
internal float _height;
internal float _rawWidth;
internal float _rawHeight;
internal bool _gearLocked;
internal float _sizePercentInGroup;
internal bool _disposed;
internal GTreeNode _treeNode;
internal static uint _gInstanceCounter;
public GObject()
{
_width = 0;
_height = 0;
_alpha = 1;
_visible = true;
_touchable = true;
_scaleX = 1;
_scaleY = 1;
_internalVisible = true;
id = "_n" + _gInstanceCounter++;
name = string.Empty;
CreateDisplayObject();
relations = new Relations(this);
_gears = new GearBase[10];
}
/// <summary>
/// Dispatched when the object or its child was clicked.
/// </summary>
public EventListener onClick
{
get { return _onClick ?? (_onClick = new EventListener(this, "onClick")); }
}
/// <summary>
/// Dispatched when the object or its child was clicked by right mouse button. Web only.
/// </summary>
public EventListener onRightClick
{
get { return _onRightClick ?? (_onRightClick = new EventListener(this, "onRightClick")); }
}
/// <summary>
/// Dispatched when the finger touched the object or its child just now.
/// </summary>
public EventListener onTouchBegin
{
get { return _onTouchBegin ?? (_onTouchBegin = new EventListener(this, "onTouchBegin")); }
}
/// <summary>
///
/// </summary>
public EventListener onTouchMove
{
get { return _onTouchMove ?? (_onTouchMove = new EventListener(this, "onTouchMove")); }
}
/// <summary>
/// Dispatched when the finger was lifted from the screen or from the mouse button.
/// </summary>
public EventListener onTouchEnd
{
get { return _onTouchEnd ?? (_onTouchEnd = new EventListener(this, "onTouchEnd")); }
}
/// <summary>
/// The cursor or finger hovers over an object.
/// </summary>
public EventListener onRollOver
{
get { return _onRollOver ?? (_onRollOver = new EventListener(this, "onRollOver")); }
}
/// <summary>
/// The cursor or finger leave an object.
/// </summary>
public EventListener onRollOut
{
get { return _onRollOut ?? (_onRollOut = new EventListener(this, "onRollOut")); }
}
/// <summary>
/// Dispatched when the object was added to the stage.
/// </summary>
public EventListener onAddedToStage
{
get { return _onAddedToStage ?? (_onAddedToStage = new EventListener(this, "onAddedToStage")); }
}
/// <summary>
/// Dispatched when the object was removed from the stage.
/// </summary>
public EventListener onRemovedFromStage
{
get { return _onRemovedFromStage ?? (_onRemovedFromStage = new EventListener(this, "onRemovedFromStage")); }
}
/// <summary>
/// Dispatched on key pressed when the object is in focus.
/// </summary>
public EventListener onKeyDown
{
get { return _onKeyDown ?? (_onKeyDown = new EventListener(this, "onKeyDown")); }
}
/// <summary>
/// Dispatched when links in the object or its child was clicked.
/// </summary>
public EventListener onClickLink
{
get { return _onClickLink ?? (_onClickLink = new EventListener(this, "onClickLink")); }
}
/// <summary>
/// Dispatched when the object was moved.
/// </summary>
public EventListener onPositionChanged
{
get { return _onPositionChanged ?? (_onPositionChanged = new EventListener(this, "onPositionChanged")); }
}
/// <summary>
/// Dispatched when the object was resized.
/// </summary>
public EventListener onSizeChanged
{
get { return _onSizeChanged ?? (_onSizeChanged = new EventListener(this, "onSizeChanged")); }
}
/// <summary>
/// Dispatched when drag start.
/// </summary>
public EventListener onDragStart
{
get { return _onDragStart ?? (_onDragStart = new EventListener(this, "onDragStart")); }
}
/// <summary>
/// Dispatched when dragging.
/// </summary>
public EventListener onDragMove
{
get { return _onDragMove ?? (_onDragMove = new EventListener(this, "onDragMove")); }
}
/// <summary>
/// Dispatched when drag end.
/// </summary>
public EventListener onDragEnd
{
get { return _onDragEnd ?? (_onDragEnd = new EventListener(this, "onDragEnd")); }
}
/// <summary>
///
/// </summary>
public EventListener onGearStop
{
get { return _onGearStop ?? (_onGearStop = new EventListener(this, "onGearStop")); }
}
/// <summary>
///
/// </summary>
public EventListener onFocusIn
{
get { return _onFocusIn ?? (_onFocusIn = new EventListener(this, "onFocusIn")); }
}
/// <summary>
///
/// </summary>
public EventListener onFocusOut
{
get { return _onFocusOut ?? (_onFocusOut = new EventListener(this, "onFocusOut")); }
}
/// <summary>
/// The x coordinate of the object relative to the local coordinates of the parent.
/// </summary>
public float x
{
get { return _x; }
set
{
SetPosition(value, _y, _z);
}
}
/// <summary>
/// The y coordinate of the object relative to the local coordinates of the parent.
/// </summary>
public float y
{
get { return _y; }
set
{
SetPosition(_x, value, _z);
}
}
/// <summary>
/// The z coordinate of the object relative to the local coordinates of the parent.
/// </summary>
public float z
{
get { return _z; }
set
{
SetPosition(_x, _y, value);
}
}
/// <summary>
/// The x and y coordinates of the object relative to the local coordinates of the parent.
/// </summary>
public Vector2 xy
{
get { return new Vector2(_x, _y); }
set { SetPosition(value.x, value.y, _z); }
}
/// <summary>
/// The x,y,z coordinates of the object relative to the local coordinates of the parent.
/// </summary>
public Vector3 position
{
get { return new Vector3(_x, _y, _z); }
set { SetPosition(value.x, value.y, value.z); }
}
/// <summary>
/// change the x and y coordinates of the object relative to the local coordinates of the parent.
/// </summary>
/// <param name="xv">x value.</param>
/// <param name="yv">y value.</param>
public void SetXY(float xv, float yv)
{
SetPosition(xv, yv, _z);
}
/// <summary>
///
/// </summary>
/// <param name="xv"></param>
/// <param name="yv"></param>
/// <param name="topLeft"></param>
public void SetXY(float xv, float yv, bool topLeftValue)
{
if (_pivotAsAnchor)
SetPosition(xv + _pivotX * _width, yv + _pivotY * _height, _z);
else
SetPosition(xv, yv, _z);
}
/// <summary>
/// change the x,y,z coordinates of the object relative to the local coordinates of the parent.
/// </summary>
/// <param name="xv">x value.</param>
/// <param name="yv">y value.</param>
/// <param name="zv">z value.</param>
public void SetPosition(float xv, float yv, float zv)
{
if (_x != xv || _y != yv || _z != zv)
{
float dx = xv - _x;
float dy = yv - _y;
_x = xv;
_y = yv;
_z = zv;
HandlePositionChanged();
if (this is GGroup)
((GGroup)this).MoveChildren(dx, dy);
UpdateGear(1);
if (parent != null && !(parent is GList))
{
parent.SetBoundsChangedFlag();
if (_group != null)
_group.SetBoundsChangedFlag(true);
DispatchEvent("onPositionChanged", null);
}
if (draggingObject == this && !sUpdateInDragging)
sGlobalRect = this.LocalToGlobal(new Rect(0, 0, this.width, this.height));
}
}
[Obsolete("Use UIConfig.makePixelPerfect or DisplayObject.pixelPerfect")]
public bool pixelSnapping
{
get { return false; }
set { }
}
/// <summary>
/// Set the object in middle of the parent or GRoot if the parent is not set.
/// </summary>
public void Center()
{
Center(false);
}
/// <summary>
/// Set the object in middle of the parent or GRoot if the parent is not set.
/// </summary>
/// <param name="restraint">Add relations to maintain the center state.</param>
public virtual void Center(bool restraint)
{
GComponent r;
if (parent != null)
r = parent;
else
r = this.root;
this.SetXY((int)((r.width - this.width) / 2), (int)((r.height - this.height) / 2), true);
if (restraint)
{
this.AddRelation(r, RelationType.Center_Center);
this.AddRelation(r, RelationType.Middle_Middle);
}
}
/// <summary>
/// 设置对象为全屏大小(逻辑屏幕)。
/// </summary>
public void MakeFullScreen()
{
this.SetSize(GRoot.inst.width, GRoot.inst.height);
}
/// <summary>
/// The width of the object in pixels.
/// </summary>
public float width
{
get
{
return _width;
}
set
{
SetSize(value, _rawHeight);
}
}
/// <summary>
/// The height of the object in pixels.
/// </summary>
public float height
{
get
{
return _height;
}
set
{
SetSize(_rawWidth, value);
}
}
/// <summary>
/// The size of the object in pixels.
/// </summary>
public Vector2 size
{
get { return new Vector2(width, height); }
set { SetSize(value.x, value.y); }
}
/// <summary>
/// actualWidth = width * scalex
/// </summary>
public float actualWidth
{
get { return this.width * _scaleX; }
}
/// <summary>
/// actualHeight = height * scaleY
/// </summary>
public float actualHeight
{
get { return this.height * _scaleY; }
}
/// <summary>
/// Change size.
/// </summary>
/// <param name="wv">Width value.</param>
/// <param name="hv">Height value.</param>
public void SetSize(float wv, float hv)
{
SetSize(wv, hv, false);
}
/// <summary>
/// Change size.
/// </summary>
/// <param name="wv">Width value.</param>
/// <param name="hv">Height value.</param>
/// <param name="ignorePivot">If pivot is set, the object's positon will change when its size change. Set ignorePivot=true to keep the position.</param>
public void SetSize(float wv, float hv, bool ignorePivot)
{
if (_rawWidth != wv || _rawHeight != hv)
{
_rawWidth = wv;
_rawHeight = hv;
if (wv < minWidth)
wv = minWidth;
else if (maxWidth > 0 && wv > maxWidth)
wv = maxWidth;
if (hv < minHeight)
hv = minHeight;
else if (maxHeight > 0 && hv > maxHeight)
hv = maxHeight;
float dWidth = wv - _width;
float dHeight = hv - _height;
_width = wv;
_height = hv;
HandleSizeChanged();
if (_pivotX != 0 || _pivotY != 0)
{
if (!_pivotAsAnchor)
{
if (!ignorePivot)
SetXY(_x - _pivotX * dWidth, _y - _pivotY * dHeight);
else
HandlePositionChanged();
}
else
HandlePositionChanged();
}
if (this is GGroup)
((GGroup)this).ResizeChildren(dWidth, dHeight);
UpdateGear(2);
if (parent != null)
{
relations.OnOwnerSizeChanged(dWidth, dHeight, _pivotAsAnchor || !ignorePivot);
parent.SetBoundsChangedFlag();
if (_group != null)
_group.SetBoundsChangedFlag();
}
DispatchEvent("onSizeChanged", null);
}
}
protected void SetSizeDirectly(float wv, float hv)
{
_rawWidth = wv;
_rawHeight = hv;
if (wv < 0)
wv = 0;
if (hv < 0)
hv = 0;
_width = wv;
_height = hv;
}
/// <summary>
///
/// </summary>
public float xMin
{
get
{
return _pivotAsAnchor ? (_x - _width * _pivotX) : _x;
}
set
{
if (_pivotAsAnchor)
SetPosition(value + _width * _pivotX, _y, _z);
else
SetPosition(value, _y, _z);
}
}
/// <summary>
///
/// </summary>
public float yMin
{
get
{
return _pivotAsAnchor ? (_y - _height * _pivotY) : _y;
}
set
{
if (_pivotAsAnchor)
SetPosition(_x, value + _height * _pivotY, _z);
else
SetPosition(_x, value, _z);
}
}
/// <summary>
/// The horizontal scale factor. '1' means no scale, cannt be negative.
/// </summary>
public float scaleX
{
get { return _scaleX; }
set
{
SetScale(value, _scaleY);
}
}
/// <summary>
/// The vertical scale factor. '1' means no scale, cannt be negative.
/// </summary>
public float scaleY
{
get { return _scaleY; }
set
{
SetScale(_scaleX, value);
}
}
/// <summary>
/// The scale factor.
/// </summary>
public Vector2 scale
{
get { return new Vector2(_scaleX, _scaleY); }
set { SetScale(value.x, value.y); }
}
/// <summary>
/// Change the scale factor.
/// </summary>
/// <param name="wv">The horizontal scale factor.</param>
/// <param name="hv">The vertical scale factor</param>
public void SetScale(float wv, float hv)
{
if (_scaleX != wv || _scaleY != hv)
{
_scaleX = wv;
_scaleY = hv;
HandleScaleChanged();
UpdateGear(2);
}
}
/// <summary>
///
/// </summary>
public Vector2 skew
{
get
{
if (displayObject != null)
return displayObject.skew;
else
return Vector2.zero;
}
set
{
if (displayObject != null)
displayObject.skew = value;
}
}
/// <summary>
/// The x coordinate of the object's origin in its own coordinate space.
/// </summary>
public float pivotX
{
get { return _pivotX; }
set
{
SetPivot(value, _pivotY, _pivotAsAnchor);
}
}
/// <summary>
/// The y coordinate of the object's origin in its own coordinate space.
/// </summary>
public float pivotY
{
get { return _pivotY; }
set
{
SetPivot(_pivotX, value, _pivotAsAnchor);
}
}
/// <summary>
/// The x and y coordinates of the object's origin in its own coordinate space.
/// </summary>
public Vector2 pivot
{
get { return new Vector2(_pivotX, _pivotY); }
set { SetPivot(value.x, value.y, _pivotAsAnchor); }
}
public bool pivotAsAnchor
{
get { return _pivotAsAnchor; }
set
{
SetPivot(_pivotX, _pivotY, value);
}
}
/// <summary>
/// Change the x and y coordinates of the object's origin in its own coordinate space.
/// </summary>
/// <param name="xv">x value in ratio</param>
/// <param name="yv">y value in ratio</param>
public void SetPivot(float xv, float yv)
{
SetPivot(xv, yv, false);
}
/// <summary>
/// Change the x and y coordinates of the object's origin in its own coordinate space.
/// </summary>
/// <param name="xv">x value in ratio</param>
/// <param name="yv">y value in ratio</param>
/// <param name="asAnchor">If use the pivot as the anchor position</param>
public void SetPivot(float xv, float yv, bool asAnchor)
{
if (_pivotX != xv || _pivotY != yv || _pivotAsAnchor != asAnchor)
{
_pivotX = xv;
_pivotY = yv;
_pivotAsAnchor = asAnchor;
if (displayObject != null)
displayObject.pivot = new Vector2(_pivotX, _pivotY);
HandlePositionChanged();
}
}
/// <summary>
/// If the object can touch or click. GImage/GTextField is not touchable even it is true.
/// </summary>
public bool touchable
{
get
{
return _touchable;
}
set
{
if (_touchable != value)
{
_touchable = value;
UpdateGear(3);
if (displayObject != null)
displayObject.touchable = _touchable;
}
}
}
/// <summary>
/// If true, apply a grayed effect on this object.
/// </summary>
public bool grayed
{
get
{
return _grayed;
}
set
{
if (_grayed != value)
{
_grayed = value;
HandleGrayedChanged();
UpdateGear(3);
}
}
}
/// <summary>
/// Enabled is shortcut for grayed and !touchable combination.
/// </summary>
public bool enabled
{
get
{
return !_grayed && _touchable;
}
set
{
this.grayed = !value;
this.touchable = value;
}
}
/// <summary>
/// The rotation around the z axis of the object in degrees.
/// </summary>
public float rotation
{
get
{
return _rotation;
}
set
{
_rotation = value;
if (displayObject != null)
displayObject.rotation = _rotation;
UpdateGear(3);
}
}
/// <summary>
/// The rotation around the x axis of the object in degrees.
/// </summary>
public float rotationX
{
get
{
return _rotationX;
}
set
{
_rotationX = value;
if (displayObject != null)
displayObject.rotationX = _rotationX;
}
}
/// <summary>
/// The rotation around the y axis of the object in degrees.
/// </summary>
public float rotationY
{
get
{
return _rotationY;
}
set
{
_rotationY = value;
if (displayObject != null)
displayObject.rotationY = _rotationY;
}
}
/// <summary>
/// The opacity of the object. 0 = transparent, 1 = opaque.
/// </summary>
public float alpha
{
get
{
return _alpha;
}
set
{
_alpha = value;
HandleAlphaChanged();
UpdateGear(3);
}
}
/// <summary>
/// The visibility of the object. An invisible object will be untouchable.
/// </summary>
public bool visible
{
get
{
return _visible;
}
set
{
if (_visible != value)
{
_visible = value;
HandleVisibleChanged();
if (parent != null)
parent.SetBoundsChangedFlag();
if (_group != null && _group.excludeInvisibles)
_group.SetBoundsChangedFlag();
}
}
}
internal bool internalVisible
{
get
{
return _internalVisible && (group == null || group.internalVisible);
}
}
internal bool internalVisible2
{
get
{
return _visible && (group == null || group.internalVisible2);
}
}
internal bool internalVisible3
{
get
{
return _visible && _internalVisible;
}
}
/// <summary>
/// By default(when sortingOrder==0), object added to component is arrange by the added roder.
/// The bigger is the sorting order, the object is more in front.
/// </summary>
public int sortingOrder
{
get { return _sortingOrder; }
set
{
if (value < 0)
value = 0;
if (_sortingOrder != value)
{
int old = _sortingOrder;
_sortingOrder = value;
if (parent != null)
parent.ChildSortingOrderChanged(this, old, _sortingOrder);
}
}
}
/// <summary>
/// If the object can be focused?
/// </summary>
public bool focusable
{
get { return displayObject != null && displayObject.focusable; }
set { if (displayObject != null) displayObject.focusable = value; }
}
/// <summary>
/// If the object can be navigated by TAB?
/// </summary>
public bool tabStop
{
get { return displayObject != null && displayObject.tabStop; }
set { if (displayObject != null) displayObject.tabStop = value; }
}
/// <summary>
/// If the object is focused.
/// </summary>
public bool focused
{
get { return displayObject != null && displayObject.focused; }
}
/// <summary>
/// Request focus on this object.
/// </summary>
public void RequestFocus()
{
if (displayObject != null)
Stage.inst.SetFocus(displayObject, false);
}
/// <summary>
/// Request focus on this object.
/// </summary>
public void RequestFocus(bool byKey)
{
if (displayObject != null)
Stage.inst.SetFocus(displayObject, byKey);
}
/// <summary>
/// Tooltips of this object. UIConfig.tooltipsWin must be set first.
/// </summary>
public string tooltips
{
get { return _tooltips; }
set
{
if (!string.IsNullOrEmpty(_tooltips))
{
this.onRollOver.Remove(__rollOver);
this.onRollOut.Remove(__rollOut);
}
_tooltips = value;
if (!string.IsNullOrEmpty(_tooltips))
{
this.onRollOver.Add(__rollOver);
this.onRollOut.Add(__rollOut);
}
}
}
/// <summary>
///
/// </summary>
/// <value></value>
public string cursor
{
get { return displayObject != null ? displayObject.cursor : null; }
set
{
if (displayObject != null)
displayObject.cursor = value;
}
}
private void __rollOver()
{
this.root.ShowTooltips(tooltips);
}
private void __rollOut()
{
this.root.HideTooltips();
}
/// <summary>
///
/// </summary>
virtual public IFilter filter
{
get { return displayObject != null ? displayObject.filter : null; }
set { if (displayObject != null) displayObject.filter = value; }
}
/// <summary>
///
/// </summary>
virtual public BlendMode blendMode
{
get { return displayObject != null ? displayObject.blendMode : BlendMode.None; }
set { if (displayObject != null) displayObject.blendMode = value; }
}
/// <summary>
/// 设定GameObject的名称
/// </summary>
public string gameObjectName
{
get
{
if (displayObject != null)
return displayObject.gameObject.name;
else
return null;
}
set
{
if (displayObject != null)
displayObject.gameObject.name = value;
}
}
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
public void SetHome(GObject obj)
{
if (obj != null && displayObject != null && obj.displayObject != null)
displayObject.home = obj.displayObject.cachedTransform;
}
/// <summary>
/// If the object has lowlevel displayobject and the displayobject has a container parent?
/// </summary>
public bool inContainer
{
get
{
return displayObject != null && displayObject.parent != null;
}
}
/// <summary>
/// If the object is on stage.
/// </summary>
public bool onStage
{
get
{
return displayObject != null && displayObject.stage != null;
}
}
/// <summary>
/// Resource url of this object.
/// </summary>
public string resourceURL
{
get
{
if (packageItem != null)
return UIPackage.URL_PREFIX + packageItem.owner.id + packageItem.id;
else
return null;
}
}
/// <summary>
/// Gear to xy controller.
/// </summary>
public GearXY gearXY
{
get
{
return (GearXY)GetGear(1);
}
}
/// <summary>
/// Gear to size controller.
/// </summary>
public GearSize gearSize
{
get
{
return (GearSize)GetGear(2);
}
}
/// <summary>
/// Gear to look controller.
/// </summary>
public GearLook gearLook
{
get
{
return (GearLook)GetGear(3);
}
}
public GearBase GetGear(int index)
{
GearBase gear = _gears[index];
if (gear == null)
{
switch (index)
{
case 0:
gear = new GearDisplay(this);
break;
case 1:
gear = new GearXY(this);
break;
case 2:
gear = new GearSize(this);
break;
case 3:
gear = new GearLook(this);
break;
case 4:
gear = new GearColor(this);
break;
case 5:
gear = new GearAnimation(this);
break;
case 6:
gear = new GearText(this);
break;
case 7:
gear = new GearIcon(this);
break;
case 8:
gear = new GearDisplay2(this);
break;
case 9:
gear = new GearFontSize(this);
break;
default:
throw new System.Exception("FairyGUI: invalid gear index!");
}
_gears[index] = gear;
}
return gear;
}
protected void UpdateGear(int index)
{
if (underConstruct || _gearLocked)
return;
GearBase gear = _gears[index];
if (gear != null && gear.controller != null)
gear.UpdateState();
}
internal bool CheckGearController(int index, Controller c)
{
return _gears[index] != null && _gears[index].controller == c;
}
internal void UpdateGearFromRelations(int index, float dx, float dy)
{
if (_gears[index] != null)
_gears[index].UpdateFromRelations(dx, dy);
}
internal uint AddDisplayLock()
{
GearDisplay gearDisplay = (GearDisplay)_gears[0];
if (gearDisplay != null && gearDisplay.controller != null)
{
uint ret = gearDisplay.AddLock();
CheckGearDisplay();
return ret;
}
else
return 0;
}
internal void ReleaseDisplayLock(uint token)
{
GearDisplay gearDisplay = (GearDisplay)_gears[0];
if (gearDisplay != null && gearDisplay.controller != null)
{
gearDisplay.ReleaseLock(token);
CheckGearDisplay();
}
}
void CheckGearDisplay()
{
if (_handlingController)
return;
bool connected = _gears[0] == null || ((GearDisplay)_gears[0]).connected;
if (_gears[8] != null)
connected = ((GearDisplay2)_gears[8]).Evaluate(connected);
if (connected != _internalVisible)
{
_internalVisible = connected;
if (parent != null)
parent.ChildStateChanged(this);
if (_group != null && _group.excludeInvisibles)
_group.SetBoundsChangedFlag();
}
}
/// <summary>
/// Mark the fairy batching state is invalid.
/// </summary>
public void InvalidateBatchingState()
{
if (displayObject != null)
displayObject.InvalidateBatchingState();
else if ((this is GGroup) && parent != null)
parent.container.InvalidateBatchingState(true);
}
virtual public void HandleControllerChanged(Controller c)
{
_handlingController = true;
for (int i = 0; i < 10; i++)
{
GearBase gear = _gears[i];
if (gear != null && gear.controller == c)
gear.Apply();
}
_handlingController = false;
CheckGearDisplay();
}
/// <summary>
///
/// </summary>
/// <param name="target"></param>
/// <param name="relationType"></param>
public void AddRelation(GObject target, RelationType relationType)
{
AddRelation(target, relationType, false);
}
/// <summary>
///
/// </summary>
/// <param name="target"></param>
/// <param name="relationType"></param>
/// <param name="usePercent"></param>
public void AddRelation(GObject target, RelationType relationType, bool usePercent)
{
relations.Add(target, relationType, usePercent);
}
/// <summary>
///
/// </summary>
/// <param name="target"></param>
/// <param name="relationType"></param>
public void RemoveRelation(GObject target, RelationType relationType)
{
relations.Remove(target, relationType);
}
/// <summary>
///
/// </summary>
public void RemoveFromParent()
{
if (parent != null)
parent.RemoveChild(this);
}
/// <summary>
/// Group belonging to.
/// </summary>
public GGroup group
{
get { return _group; }
set
{
if (_group != value)
{
if (_group != null)
_group.SetBoundsChangedFlag();
_group = value;
if (_group != null)
_group.SetBoundsChangedFlag();
HandleVisibleChanged();
if (parent != null)
parent.ChildStateChanged(this);
}
}
}
/// <summary>
///
/// </summary>
public GRoot root
{
get
{
GObject p = this;
while (p.parent != null)
p = p.parent;
if (p is GRoot)
return (GRoot)p;
if (p.displayObject != null && p.displayObject.parent != null)
{
DisplayObject d = p.displayObject.parent.GetChild("GRoot");
if (d != null && (d.gOwner is GRoot))
return (GRoot)d.gOwner;
}
return GRoot.inst;
}
}
/// <summary>
///
/// </summary>
virtual public string text
{
get { return null; }
set { /*override in child*/}
}
/// <summary>
///
/// </summary>
virtual public string icon
{
get { return null; }
set { /*override in child*/}
}
/// <summary>
///
/// </summary>
public bool draggable
{
get { return _draggable; }
set
{
if (_draggable != value)
{
_draggable = value;
InitDrag();
}
}
}
/// <summary>
///
/// </summary>
public void StartDrag()
{
StartDrag(-1);
}
/// <summary>
///
/// </summary>
/// <param name="touchId"></param>
public void StartDrag(int touchId)
{
if (displayObject.stage == null)
return;
DragBegin(touchId);
}
/// <summary>
///
/// </summary>
public void StopDrag()
{
DragEnd();
}
/// <summary>
///
/// </summary>
public bool dragging
{
get { return draggingObject == this; }
}
/// <summary>
///
/// </summary>
public Vector2 dragStartPos
{
get { return _dragTouchStartPos; }
}
/// <summary>
/// Transforms a point from the local coordinate system to global (Stage) coordinates.
/// </summary>
/// <param name="pt"></param>
/// <returns></returns>
public Vector2 LocalToGlobal(Vector2 pt)
{
if (_pivotAsAnchor)
{
pt.x += _width * _pivotX;
pt.y += _height * _pivotY;
}
return displayObject.LocalToGlobal(pt);
}
/// <summary>
/// Transforms a point from global (Stage) coordinates to the local coordinate system.
/// </summary>
/// <param name="pt"></param>
/// <returns></returns>
public Vector2 GlobalToLocal(Vector2 pt)
{
pt = displayObject.GlobalToLocal(pt);
if (_pivotAsAnchor)
{
pt.x -= _width * _pivotX;
pt.y -= _height * _pivotY;
}
return pt;
}
/// <summary>
///
/// </summary>
/// <param name="rect"></param>
/// <returns></returns>
public Rect LocalToGlobal(Rect rect)
{
Rect ret = new Rect();
Vector2 v = this.LocalToGlobal(new Vector2(rect.xMin, rect.yMin));
ret.xMin = v.x;
ret.yMin = v.y;
v = this.LocalToGlobal(new Vector2(rect.xMax, rect.yMax));
ret.xMax = v.x;
ret.yMax = v.y;
return ret;
}
/// <summary>
///
/// </summary>
/// <param name="rect"></param>
/// <returns></returns>
public Rect GlobalToLocal(Rect rect)
{
Rect ret = new Rect();
Vector2 v = this.GlobalToLocal(new Vector2(rect.xMin, rect.yMin));
ret.xMin = v.x;
ret.yMin = v.y;
v = this.GlobalToLocal(new Vector2(rect.xMax, rect.yMax));
ret.xMax = v.x;
ret.yMax = v.y;
return ret;
}
/// <summary>
/// Transforms a point from the local coordinate system to GRoot coordinates.
/// </summary>
/// <param name="pt"></param>
/// <param name="r"></param>
/// <returns></returns>
public Vector2 LocalToRoot(Vector2 pt, GRoot r)
{
pt = LocalToGlobal(pt);
if (r == null || r == GRoot.inst)
{
//fast
pt.x /= UIContentScaler.scaleFactor;
pt.y /= UIContentScaler.scaleFactor;
return pt;
}
else
return r.GlobalToLocal(pt);
}
/// <summary>
/// Transforms a point from the GRoot coordinate to local coordinates system.
/// </summary>
/// <param name="pt"></param>
/// <param name="r"></param>
/// <returns></returns>
public Vector2 RootToLocal(Vector2 pt, GRoot r)
{
if (r == null || r == GRoot.inst)
{
//fast
pt.x *= UIContentScaler.scaleFactor;
pt.y *= UIContentScaler.scaleFactor;
}
else
pt = r.LocalToGlobal(pt);
return GlobalToLocal(pt);
}
/// <summary>
///
/// </summary>
/// <param name="pt"></param>
/// <returns></returns>
public Vector2 WorldToLocal(Vector3 pt)
{
return WorldToLocal(pt, HitTestContext.cachedMainCamera);
}
/// <summary>
///
/// </summary>
/// <param name="pt"></param>
/// <param name="camera"></param>
/// <returns></returns>
public Vector2 WorldToLocal(Vector3 pt, Camera camera)
{
Vector3 v = camera.WorldToScreenPoint(pt);
v.y = Screen.height - v.y;
v.z = 0;
return GlobalToLocal(v);
}
/// <summary>
///
/// </summary>
/// <param name="point"></param>
/// <param name="targetSpace"></param>
/// <returns></returns>
public Vector2 TransformPoint(Vector2 pt, GObject targetSpace)
{
if (_pivotAsAnchor)
{
pt.x += _width * _pivotX;
pt.y += _height * _pivotY;
}
return this.displayObject.TransformPoint(pt, targetSpace != null ? targetSpace.displayObject : Stage.inst);
}
/// <summary>
///
/// </summary>
/// <param name="rect"></param>
/// <param name="targetSpace"></param>
/// <returns></returns>
public Rect TransformRect(Rect rect, GObject targetSpace)
{
if (_pivotAsAnchor)
{
rect.x += _width * _pivotX;
rect.y += _height * _pivotY;
}
return this.displayObject.TransformRect(rect, targetSpace != null ? targetSpace.displayObject : Stage.inst);
}
/// <summary>
///
/// </summary>
public bool isDisposed
{
get { return _disposed; }
}
/// <summary>
///
/// </summary>
virtual public void Dispose()
{
if (_disposed)
return;
_disposed = true;
RemoveFromParent();
RemoveEventListeners();
relations.Dispose();
relations = null;
for (int i = 0; i < 10; i++)
{
GearBase gear = _gears[i];
if (gear != null)
gear.Dispose();
}
if (displayObject != null)
{
displayObject.gOwner = null;
displayObject.Dispose();
}
data = null;
}
/// <summary>
///
/// </summary>
public GImage asImage
{
get { return this as GImage; }
}
/// <summary>
///
/// </summary>
public GComponent asCom
{
get { return this as GComponent; }
}
/// <summary>
///
/// </summary>
public GButton asButton
{
get { return this as GButton; }
}
/// <summary>
///
/// </summary>
public GLabel asLabel
{
get { return this as GLabel; }
}
/// <summary>
///
/// </summary>
public GProgressBar asProgress
{
get { return this as GProgressBar; }
}
/// <summary>
///
/// </summary>
public GSlider asSlider
{
get { return this as GSlider; }
}
/// <summary>
///
/// </summary>
public GComboBox asComboBox
{
get { return this as GComboBox; }
}
/// <summary>
///
/// </summary>
public GTextField asTextField
{
get { return this as GTextField; }
}
/// <summary>
///
/// </summary>
public GRichTextField asRichTextField
{
get { return this as GRichTextField; }
}
/// <summary>
///
/// </summary>
public GTextInput asTextInput
{
get { return this as GTextInput; }
}
/// <summary>
///
/// </summary>
public GLoader asLoader
{
get { return this as GLoader; }
}
/// <summary>
///
/// </summary>
public GLoader3D asLoader3D
{
get { return this as GLoader3D; }
}
/// <summary>
///
/// </summary>
public GList asList
{
get { return this as GList; }
}
/// <summary>
///
/// </summary>
public GGraph asGraph
{
get { return this as GGraph; }
}
/// <summary>
///
/// </summary>
public GGroup asGroup
{
get { return this as GGroup; }
}
/// <summary>
///
/// </summary>
public GMovieClip asMovieClip
{
get { return this as GMovieClip; }
}
/// <summary>
///
/// </summary>
public GTree asTree
{
get { return this as GTree; }
}
/// <summary>
///
/// </summary>
public GTreeNode treeNode
{
get { return _treeNode; }
}
virtual protected void CreateDisplayObject()
{
}
internal void InternalSetParent(GComponent value)
{
parent = value;
}
virtual protected void HandlePositionChanged()
{
if (displayObject != null)
{
float xv = _x;
float yv = _y;
if (!_pivotAsAnchor)
{
xv += _width * _pivotX;
yv += _height * _pivotY;
}
displayObject.location = new Vector3(xv, yv, _z);
}
}
virtual protected void HandleSizeChanged()
{
if (displayObject != null)
displayObject.SetSize(_width, _height);
}
virtual protected void HandleScaleChanged()
{
if (displayObject != null)
displayObject.SetScale(_scaleX, _scaleY);
}
virtual protected void HandleGrayedChanged()
{
if (displayObject != null)
displayObject.grayed = _grayed;
}
virtual protected void HandleAlphaChanged()
{
if (displayObject != null)
displayObject.alpha = _alpha;
}
virtual internal protected void HandleVisibleChanged()
{
if (displayObject != null)
displayObject.visible = internalVisible2;
}
virtual public void ConstructFromResource()
{
}
virtual public void Setup_BeforeAdd(ByteBuffer buffer, int beginPos)
{
buffer.Seek(beginPos, 0);
buffer.Skip(5);
id = buffer.ReadS();
name = buffer.ReadS();
float f1 = buffer.ReadInt();
float f2 = buffer.ReadInt();
SetXY(f1, f2);
if (buffer.ReadBool())
{
initWidth = buffer.ReadInt();
initHeight = buffer.ReadInt();
SetSize(initWidth, initHeight, true);
}
if (buffer.ReadBool())
{
minWidth = buffer.ReadInt();
maxWidth = buffer.ReadInt();
minHeight = buffer.ReadInt();
maxHeight = buffer.ReadInt();
}
if (buffer.ReadBool())
{
f1 = buffer.ReadFloat();
f2 = buffer.ReadFloat();
SetScale(f1, f2);
}
if (buffer.ReadBool())
{
f1 = buffer.ReadFloat();
f2 = buffer.ReadFloat();
this.skew = new Vector2(f1, f2);
}
if (buffer.ReadBool())
{
f1 = buffer.ReadFloat();
f2 = buffer.ReadFloat();
SetPivot(f1, f2, buffer.ReadBool());
}
f1 = buffer.ReadFloat();
if (f1 != 1)
this.alpha = f1;
f1 = buffer.ReadFloat();
if (f1 != 0)
this.rotation = f1;
if (!buffer.ReadBool())
this.visible = false;
if (!buffer.ReadBool())
this.touchable = false;
if (buffer.ReadBool())
this.grayed = true;
this.blendMode = (BlendMode)buffer.ReadByte();
int filter = buffer.ReadByte();
if (filter == 1)
{
ColorFilter cf = new ColorFilter();
this.filter = cf;
cf.AdjustBrightness(buffer.ReadFloat());
cf.AdjustContrast(buffer.ReadFloat());
cf.AdjustSaturation(buffer.ReadFloat());
cf.AdjustHue(buffer.ReadFloat());
}
string str = buffer.ReadS();
if (str != null)
this.data = str;
}
virtual public void Setup_AfterAdd(ByteBuffer buffer, int beginPos)
{
buffer.Seek(beginPos, 1);
string str = buffer.ReadS();
if (str != null)
this.tooltips = str;
int groupId = buffer.ReadShort();
if (groupId >= 0)
group = parent.GetChildAt(groupId) as GGroup;
buffer.Seek(beginPos, 2);
int cnt = buffer.ReadShort();
for (int i = 0; i < cnt; i++)
{
int nextPos = buffer.ReadUshort();
nextPos += buffer.position;
GearBase gear = GetGear(buffer.ReadByte());
gear.Setup(buffer);
buffer.position = nextPos;
}
}
#region Drag support
Vector2 _dragTouchStartPos;
bool _dragTesting;
static Vector2 sGlobalDragStart = new Vector2();
static Rect sGlobalRect = new Rect();
static bool sUpdateInDragging = false;
private void InitDrag()
{
if (_draggable)
{
onTouchBegin.Add(__touchBegin);
onTouchMove.Add(__touchMove);
onTouchEnd.Add(__touchEnd);
}
else
{
onTouchBegin.Remove(__touchBegin);
onTouchMove.Remove(__touchMove);
onTouchEnd.Remove(__touchEnd);
}
}
private void DragBegin(int touchId)
{
if (DispatchEvent("onDragStart", touchId))
return;
if (draggingObject != null)
{
GObject tmp = draggingObject;
draggingObject.StopDrag();
draggingObject = null;
tmp.DispatchEvent("onDragEnd", null);
}
onTouchMove.Add(__touchMove);
onTouchEnd.Add(__touchEnd);
sGlobalDragStart = Stage.inst.GetTouchPosition(touchId);
sGlobalRect = this.LocalToGlobal(new Rect(0, 0, this.width, this.height));
_dragTesting = false;
draggingObject = this;
Stage.inst.AddTouchMonitor(touchId, this);
}
private void DragEnd()
{
if (draggingObject == this)
{
_dragTesting = false;
draggingObject = null;
}
}
private void __touchBegin(EventContext context)
{
if ((Stage.inst.focus is InputTextField) && ((InputTextField)Stage.inst.focus).editable)
{
_dragTesting = false;
return;
}
InputEvent evt = context.inputEvent;
_dragTouchStartPos = evt.position;
_dragTesting = true;
context.CaptureTouch();
}
private void __touchMove(EventContext context)
{
InputEvent evt = context.inputEvent;
if (_dragTesting && draggingObject != this)
{
int sensitivity;
if (Stage.touchScreen)
sensitivity = UIConfig.touchDragSensitivity;
else
sensitivity = UIConfig.clickDragSensitivity;
if (Mathf.Abs(_dragTouchStartPos.x - evt.x) < sensitivity
&& Mathf.Abs(_dragTouchStartPos.y - evt.y) < sensitivity)
return;
_dragTesting = false;
DragBegin(evt.touchId);
}
if (draggingObject == this)
{
float xx = evt.x - sGlobalDragStart.x + sGlobalRect.x;
float yy = evt.y - sGlobalDragStart.y + sGlobalRect.y;
if (dragBounds != null)
{
Rect rect = GRoot.inst.LocalToGlobal((Rect)dragBounds);
if (xx < rect.x)
xx = rect.x;
else if (xx + sGlobalRect.width > rect.xMax)
{
xx = rect.xMax - sGlobalRect.width;
if (xx < rect.x)
xx = rect.x;
}
if (yy < rect.y)
yy = rect.y;
else if (yy + sGlobalRect.height > rect.yMax)
{
yy = rect.yMax - sGlobalRect.height;
if (yy < rect.y)
yy = rect.y;
}
}
Vector2 pt = this.parent.GlobalToLocal(new Vector2(xx, yy));
if (float.IsNaN(pt.x))
return;
sUpdateInDragging = true;
this.SetXY(Mathf.RoundToInt(pt.x), Mathf.RoundToInt(pt.y));
sUpdateInDragging = false;
DispatchEvent("onDragMove", null);
}
}
private void __touchEnd(EventContext context)
{
if (draggingObject == this)
{
draggingObject = null;
DispatchEvent("onDragEnd", null);
}
}
#endregion
#region Tween Helpers
public GTweener TweenMove(Vector2 endValue, float duration)
{
return GTween.To(this.xy, endValue, duration).SetTarget(this, TweenPropType.XY);
}
public GTweener TweenMoveX(float endValue, float duration)
{
return GTween.To(_x, endValue, duration).SetTarget(this, TweenPropType.X);
}
public GTweener TweenMoveY(float endValue, float duration)
{
return GTween.To(_y, endValue, duration).SetTarget(this, TweenPropType.Y);
}
public GTweener TweenScale(Vector2 endValue, float duration)
{
return GTween.To(this.scale, endValue, duration).SetTarget(this, TweenPropType.Scale);
}
public GTweener TweenScaleX(float endValue, float duration)
{
return GTween.To(_scaleX, endValue, duration).SetTarget(this, TweenPropType.ScaleX);
}
public GTweener TweenScaleY(float endValue, float duration)
{
return GTween.To(_scaleY, endValue, duration).SetTarget(this, TweenPropType.ScaleY);
}
public GTweener TweenResize(Vector2 endValue, float duration)
{
return GTween.To(this.size, endValue, duration).SetTarget(this, TweenPropType.Size);
}
public GTweener TweenFade(float endValue, float duration)
{
return GTween.To(_alpha, endValue, duration).SetTarget(this, TweenPropType.Alpha);
}
public GTweener TweenRotate(float endValue, float duration)
{
return GTween.To(_rotation, endValue, duration).SetTarget(this, TweenPropType.Rotation);
}
#endregion
}
}