using CommonUI.Data; using CommonUnity3D.UGUI; using UnityEngine; using UnityEngine.EventSystems; namespace CommonUnity3D.UGUIEditor { public class UIComponent : DisplayNode { private UILayout mLayout = null; private bool mDisable = false; protected UILayoutGraphics mCurrentLayout; protected UIComponentMeta mOwnerXML; public UIComponent(string name = null) : base(name) { } //---------------------------------------------------------------------------------------------------------------------- public UIEditor Editor { get; private set; } public string EditName { get; private set; } public string EditType { get; private set; } public UILayoutGraphics Graphics { get { return mCurrentLayout; } } public UIComponentMeta MetaData { get { return mOwnerXML; } } public UILayout Layout { get { return mLayout; } set { mLayout = value; if (value != null) { if (this.mCurrentLayout == null) { this.mCurrentLayout = GenLayoutGraphics(); } } } } public bool Disable { set { mDisable = value; } get { return mDisable; } } public UILayout LayoutDisable { get; set; } //---------------------------------------------------------------------------------------------------------------------- public override DisplayNode Clone() { if (mOwnerXML != null) { return Editor.CreateFromMeta(mOwnerXML); } return null; } /// /// 触发了OnPointerDown事件 /// private bool mIsPointerDown = false; private float mLongPressSec = 1.0f; public bool IsLongClick { get; private set; } public float mPressDownSec; public delegate void LongPressHandle(DisplayNode sender,float pressSec); public LongPressHandle event_LongPoniterDown; public LongPressHandle event_LongPoniterDownStep; public LongPressHandle event_LongPoniterClick; public event LongPressHandle LongPoniterDown { add { event_LongPoniterDown += value; } remove { event_LongPoniterDown -= value; } } public event LongPressHandle LongPoniterDownStep { add { event_LongPoniterDownStep += value; } remove { event_LongPoniterDownStep -= value; } } public event LongPressHandle LongPoniterClick { add { event_LongPoniterClick += value; } remove { event_LongPoniterClick -= value; } } protected virtual void OnLongPointerDown(float pressSec) { } protected virtual void OnLongPointerClick(float pressSec) { } protected virtual void OnLongPointerDownStep(float pressSec) { } public float LongPressSecond { get { return mLongPressSec; } set { mLongPressSec = value; } } private void CheckLongPressDown() { if (mIsPointerDown) { mPressDownSec = mPressDownSec + Time.deltaTime; if (mPressDownSec >= mLongPressSec) { if (!IsLongClick) { IsLongClick = true; OnLongPointerDown(mPressDownSec); if (event_LongPoniterDown != null) { event_LongPoniterDown.Invoke(this,mPressDownSec); } } OnLongPointerDownStep(mPressDownSec); if (event_LongPoniterDownStep != null) { event_LongPoniterDownStep.Invoke(this,mPressDownSec); } } } } protected override void OnPointerClick(PointerEventData e) { base.OnPointerClick(e); if (IsLongClick) { OnLongPointerClick(mPressDownSec); if(event_LongPoniterClick != null) { event_LongPoniterClick.Invoke(this, mPressDownSec); } } } protected override void OnPointerDown(PointerEventData e) { base.OnPointerDown(e); mIsPointerDown = true; mPressDownSec = 0; IsLongClick = false; } protected override void OnPointerUp(PointerEventData e) { mIsPointerDown = false; base.OnPointerUp(e); } protected override void OnDispose() { base.OnDispose(); this.event_LongPoniterDown = null; this.event_LongPoniterDownStep = null; this.event_LongPoniterClick = null; } /// /// 根据编辑器名字搜寻子节点 /// /// /// /// /// public T FindChildByEditName(string edit_name, bool recursive = true) where T : UIComponent { return FindChildAs((child) => { return (edit_name == child.EditName); }, recursive); } public UIComponent FindChildByEditName(string edit_name, bool recursive = true) { return FindChildByEditName(edit_name, recursive); } //---------------------------------------------------------------------------------------------------------------------- protected override void OnUpdate() { base.OnUpdate(); if (mCurrentLayout != null) { this.OnUpdateLayout(); } CheckLongPressDown(); } protected virtual UILayoutGraphics GenLayoutGraphics() { var comp = mGameObject.AddComponent(); comp.enabled = false; return comp; } protected virtual void OnUpdateLayout() { mCurrentLayout.UpdateSprite(); mCurrentLayout.Alpha = this.Alpha; if (Enable) { mCurrentLayout.SetCurrentLayout(Layout); } else { if (LayoutDisable != null) { mCurrentLayout.SetCurrentLayout(LayoutDisable); } else { mCurrentLayout.SetCurrentLayout(Layout); } } } //---------------------------------------------------------------------------------------------------------------------- #region _解析XML_ protected virtual void AddEditorComopnent(UIComponent c) { this.AddChild(c); } internal void DecodeFromXML(UIEditor.Decoder editor, UIComponentMeta e) { this.Editor = editor.editor; this.EditType = e.ClassName; this.mOwnerXML = e; this.DecodeBegin(editor, e); this.DecodeFields(editor, e); this.DecodeAttributes(editor, e); this.DecodeChilds(editor, e); this.DecodeEnd(editor, e); if (mCurrentLayout != null) { this.OnUpdateLayout(); } } protected virtual void DecodeAttributes(UIEditor.Decoder editor, UIComponentMeta e) { if (!string.IsNullOrEmpty(e.Attributes)) { foreach (var entry in e.GetAttributsMap()) { this.SetAttribute(entry.Key, entry.Value); } } } protected virtual void DecodeChilds(UIEditor.Decoder editor, UIComponentMeta e) { if (e.Childs != null) { int len = e.Childs.Count; for (int i = 0; i < len; ++i) { UIComponentMeta child = e.Childs[i]; UIComponent cui = editor.CreateFromMeta(child); if (cui != null) { AddEditorComopnent(cui); } } } } protected virtual void DecodeBegin(UIEditor.Decoder editor, UIComponentMeta e) { } protected virtual void DecodeEnd(UIEditor.Decoder editor, UIComponentMeta e) { } protected virtual void DecodeFields(UIEditor.Decoder editor, UIComponentMeta e) { this.Bounds2D = new Rect(e.X, e.Y, e.Width, e.Height); this.Visible = e.Visible; this.EditName = e.EditorName; this.Name = string.Format("{0} - {1}", this.EditName, this.EditType); this.UserData = e.UserData; this.UserTag = e.UserTag; this.Layout = editor.CreateLayout(e.Layout); this.LayoutDisable = editor.CreateLayout(e.DisableLayout); this.Enable = e.Enable; this.EnableChildren = e.EnableChilds; } #endregion //---------------------------------------------------------------------------------------------------------------------- } }