From cb7f85fd282dc15f7e4f86ae17f67a7708396796 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期五, 23 五月 2025 11:32:55 +0800
Subject: [PATCH] 59 子 【常规】邮件系统 / 【常规】邮件系统-客户端 摘取部分ui组件

---
 Main/System/Skill/FlipScroll.cs                 |  320 +++++++++++++++
 Main/System/Skill/FlipScroll.cs.meta            |   12 
 Main/Component/UI/Common/FunctionButtonGroup.cs |  460 ++++++++++----------
 Main/Component/UI/Common/FunctionButton.cs      |  436 ++++++++++----------
 4 files changed, 780 insertions(+), 448 deletions(-)

diff --git a/Main/Component/UI/Common/FunctionButton.cs b/Main/Component/UI/Common/FunctionButton.cs
index 701fa79..73a3f74 100644
--- a/Main/Component/UI/Common/FunctionButton.cs
+++ b/Main/Component/UI/Common/FunctionButton.cs
@@ -1,262 +1,262 @@
-锘�// //--------------------------------------------------------
-// //    [Author]:           绗簩涓栫晫
-// //    [  Date ]:           Tuesday, October 31, 2017
-// //--------------------------------------------------------
-// using UnityEngine;
-// using System.Collections;
-// using UnityEngine.UI;
-// using UnityEngine.Events;
-// using UnityEngine.EventSystems;
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Tuesday, October 31, 2017
+//--------------------------------------------------------
+using UnityEngine;
+using System.Collections;
+using UnityEngine.UI;
+using UnityEngine.Events;
+using UnityEngine.EventSystems;
 
-// using System;
+using System;
 
-// namespace vnxbqy.UI
-// {
+namespace vnxbqy.UI
+{
 
     
-//     public class FunctionButton : Button
-//     {
-//         [SerializeField] int m_Order = 0;
-//         public int order {
-//             get { return m_Order; }
-//             set {
-//                 m_Order = value;
-//             }
-//         }
+    public class FunctionButton : Button
+    {
+        [SerializeField] int m_Order = 0;
+        public int order {
+            get { return m_Order; }
+            set {
+                m_Order = value;
+            }
+        }
 
-//         [SerializeField] int m_FunctionId = -1;
-//         public int functionId {
-//             get { return m_FunctionId; }
-//             set {
-//                 m_FunctionId = value;
-//                 OnFunctionUnLockStateChange();
-//             }
-//         }
+        [SerializeField] int m_FunctionId = -1;
+        public int functionId {
+            get { return m_FunctionId; }
+            set {
+                m_FunctionId = value;
+                OnFunctionUnLockStateChange();
+            }
+        }
 
-//         [SerializeField] TitleBtnState m_State = TitleBtnState.Normal;
-//         public TitleBtnState state {
-//             get { return m_State; }
-//             set {
-//                 if (m_State != value)
-//                 {
-//                     m_State = value;
-//                     OnStateChange();
-//                 }
-//             }
-//         }
+        [SerializeField] TitleBtnState m_State = TitleBtnState.Normal;
+        public TitleBtnState state {
+            get { return m_State; }
+            set {
+                if (m_State != value)
+                {
+                    m_State = value;
+                    OnStateChange();
+                }
+            }
+        }
 
-//         [SerializeField] Button m_Button;
-//         public Button button {
-//             get { return m_Button; }
-//             set { m_Button = value; }
-//         }
+        [SerializeField] Button m_Button;
+        public Button button {
+            get { return m_Button; }
+            set { m_Button = value; }
+        }
 
-//         [SerializeField] ImageEx m_Icon;
-//         public ImageEx icon {
-//             get { return this.m_Icon; }
-//             set { this.m_Icon = value; }
-//         }
+        [SerializeField] ImageEx m_Icon;
+        public ImageEx icon {
+            get { return this.m_Icon; }
+            set { this.m_Icon = value; }
+        }
 
-//         [SerializeField] TextEx m_Title;
-//         public TextEx title {
-//             get { return this.m_Title; }
-//             set { this.m_Title = value; }
-//         }
+        [SerializeField] TextEx m_Title;
+        public TextEx title {
+            get { return this.m_Title; }
+            set { this.m_Title = value; }
+        }
 
-//         [SerializeField] RedpointBehaviour m_Redpoint;
-//         public RedpointBehaviour redpoint {
-//             get { return m_Redpoint; }
-//             set { m_Redpoint = value; }
-//         }
+        [SerializeField] RedpointBehaviour m_Redpoint;
+        public RedpointBehaviour redpoint {
+            get { return m_Redpoint; }
+            set { m_Redpoint = value; }
+        }
 
-//         [SerializeField] Shadow m_Shadow;
-//         public Shadow shadow {
-//             get { return this.m_Shadow; }
-//             set { this.m_Shadow = value; }
-//         }
+        [SerializeField] Shadow m_Shadow;
+        public Shadow shadow {
+            get { return this.m_Shadow; }
+            set { this.m_Shadow = value; }
+        }
 
-//         [SerializeField] Transform m_Locked;
-//         public Transform locked {
-//             get { return this.m_Locked; }
-//             set { this.m_Locked = value; }
-//         }
+        [SerializeField] Transform m_Locked;
+        public Transform locked {
+            get { return this.m_Locked; }
+            set { this.m_Locked = value; }
+        }
 
-//         [SerializeField] int m_Audio = 1;
-//         public int clickAudio {
-//             get { return this.m_Audio; }
-//             set { this.m_Audio = value; }
-//         }
+        [SerializeField] int m_Audio = 1;
+        public int clickAudio {
+            get { return this.m_Audio; }
+            set { this.m_Audio = value; }
+        }
 
-//         [SerializeField] bool m_UseDefaultConfig = true;
-//         public bool useDefaultConfig {
-//             get { return this.m_UseDefaultConfig; }
-//             set { this.m_UseDefaultConfig = value; }
-//         }
+        [SerializeField] bool m_UseDefaultConfig = true;
+        public bool useDefaultConfig {
+            get { return this.m_UseDefaultConfig; }
+            set { this.m_UseDefaultConfig = value; }
+        }
 
-//         [SerializeField] FunctionButtonConfig m_AlternativeConfig;
-//         public FunctionButtonConfig alternativeConfig { get { return m_AlternativeConfig; } set { m_AlternativeConfig = value; } }
+        [SerializeField] FunctionButtonConfig m_AlternativeConfig;
+        public FunctionButtonConfig alternativeConfig { get { return m_AlternativeConfig; } set { m_AlternativeConfig = value; } }
 
-//         [SerializeField]
-//         FunctionButtonGroup m_Group;
-//         public FunctionButtonGroup group {
-//             get { return m_Group; }
-//             set {
-//                 if (m_Group != null)
-//                 {
-//                     m_Group.UnRegister(this);
-//                 }
-//                 m_Group = value;
-//                 if (m_Group != null)
-//                 {
-//                     m_Group.Register(this);
-//                 }
-//             }
-//         }
+        [SerializeField]
+        FunctionButtonGroup m_Group;
+        public FunctionButtonGroup group {
+            get { return m_Group; }
+            set {
+                if (m_Group != null)
+                {
+                    m_Group.UnRegister(this);
+                }
+                m_Group = value;
+                if (m_Group != null)
+                {
+                    m_Group.Register(this);
+                }
+            }
+        }
 
-//         public event Action<string> OnPointClickLockFunc;
-//         public event Action repeatClickFunc;
+        public event Action<string> OnPointClickLockFunc;
+        public event Action repeatClickFunc;
 
-//         protected override void Awake()
-//         {
-// #if UNITY_EDITOR
-//             if (!Application.isPlaying) return;
-// #endif
-//             OnFunctionUnLockStateChange();
-//             FuncOpen.Instance.OnFuncStateChangeEvent += OnFunctionUnLockStateChange;
-//         }
+        protected override void Awake()
+        {
+#if UNITY_EDITOR
+            if (!Application.isPlaying) return;
+#endif
+            OnFunctionUnLockStateChange();
+            FuncOpen.Instance.OnFuncStateChangeEvent += OnFunctionUnLockStateChange;
+        }
 
-//         protected override void OnEnable()
-//         {
-//             base.OnEnable();
+        protected override void OnEnable()
+        {
+            base.OnEnable();
 
-//             if (group != null)
-//             {
-//                 group.Register(this);
-//             }
+            if (group != null)
+            {
+                group.Register(this);
+            }
 
-//             OnStateChange();
-//         }
+            OnStateChange();
+        }
 
-//         protected override void OnDisable()
-//         {
-//             base.OnDisable();
+        protected override void OnDisable()
+        {
+            base.OnDisable();
 
-//             if (group != null)
-//             {
-//                 group.UnRegister(this);
-//             }
-//         }
+            if (group != null)
+            {
+                group.UnRegister(this);
+            }
+        }
 
-//         protected override void OnDestroy()
-//         {
-// #if UNITY_EDITOR
-//             if (!Application.isPlaying) return;
-// #endif
-//             FuncOpen.Instance.OnFuncStateChangeEvent -= OnFunctionUnLockStateChange;
-//         }
+        protected override void OnDestroy()
+        {
+#if UNITY_EDITOR
+            if (!Application.isPlaying) return;
+#endif
+            FuncOpen.Instance.OnFuncStateChangeEvent -= OnFunctionUnLockStateChange;
+        }
 
-//         bool invokeForce = false;
+        bool invokeForce = false;
 
-//         public void Invoke(bool _force)
-//         {
-//             invokeForce = _force;
-//             OnPointerClick(null);
-//             invokeForce = false;
-//         }
+        public void Invoke(bool _force)
+        {
+            invokeForce = _force;
+            OnPointerClick(null);
+            invokeForce = false;
+        }
 
-//         public override void OnPointerClick(PointerEventData eventData)
-//         {
-//             if (state == TitleBtnState.Locked)
-//             {
-//                 if (OnPointClickLockFunc != null)
-//                 {
-//                     OnPointClickLockFunc(this.gameObject.name);
-//                 }
-//                 else
-//                 {
-//                     FuncOpen.Instance.ProcessorFuncErrorTip(functionId);
-//                 }
-//                 return;
-//             }
+        public override void OnPointerClick(PointerEventData eventData)
+        {
+            if (state == TitleBtnState.Locked)
+            {
+                if (OnPointClickLockFunc != null)
+                {
+                    OnPointClickLockFunc(this.gameObject.name);
+                }
+                else
+                {
+                    FuncOpen.Instance.ProcessorFuncErrorTip(functionId);
+                }
+                return;
+            }
 
-//             if (!invokeForce && state == TitleBtnState.Click)
-//             {
-//                 if (repeatClickFunc != null)
-//                 {
-//                     repeatClickFunc();
-//                 }
-//                 return;
-//             }
+            if (!invokeForce && state == TitleBtnState.Click)
+            {
+                if (repeatClickFunc != null)
+                {
+                    repeatClickFunc();
+                }
+                return;
+            }
 
-//             if (base.onClick != null)
-//             {
-//                 base.onClick.Invoke();
-//                 if (eventData != null)
-//                 {
-//                     SoundPlayer.Instance.PlayUIAudio(clickAudio);
-//                 }
-//             }
+            if (base.onClick != null)
+            {
+                base.onClick.Invoke();
+                if (eventData != null)
+                {
+                    SoundPlayer.Instance.PlayUIAudio(clickAudio);
+                }
+            }
 
-//             state = TitleBtnState.Click;
-//         }
+            state = TitleBtnState.Click;
+        }
 
-//         private void OnStateChange()
-//         {
-//             var config = useDefaultConfig ? FunctionButtonConfig.GetDefault() : m_AlternativeConfig;
-//             if (Application.isPlaying)
-//             {
-//                 icon.SetSprite(config.GetIconKey(state));
-//             }
+        private void OnStateChange()
+        {
+            var config = useDefaultConfig ? FunctionButtonConfig.GetDefault() : m_AlternativeConfig;
+            if (Application.isPlaying)
+            {
+                icon.SetSprite(config.GetIconKey(state));
+            }
 
-//             title.color = config.GetFontColor(state);
-//             title.fontSize = config.GetFontSize(state);
+            title.color = config.GetFontColor(state);
+            title.fontSize = config.GetFontSize(state);
 
-//             if (shadow != null)
-//             {
-//                 shadow.enabled = state == TitleBtnState.Locked || state == TitleBtnState.Normal;
-//             }
+            if (shadow != null)
+            {
+                shadow.enabled = state == TitleBtnState.Locked || state == TitleBtnState.Normal;
+            }
 
-//             if (locked != null)
-//             {
-//                 locked.SetActive(state == TitleBtnState.Locked);
-//             }
+            if (locked != null)
+            {
+                locked.SetActive(state == TitleBtnState.Locked);
+            }
 
-//             if (group != null && state == TitleBtnState.Click)
-//             {
-//                 group.NotifyToggleOn(this);
-//             }
-//         }
+            if (group != null && state == TitleBtnState.Click)
+            {
+                group.NotifyToggleOn(this);
+            }
+        }
 
-//         private void OnFunctionUnLockStateChange(int _functionId)
-//         {
-//             if (m_FunctionId == _functionId)
-//             {
-//                 OnFunctionUnLockStateChange();
-//             }
-//         }
+        private void OnFunctionUnLockStateChange(int _functionId)
+        {
+            if (m_FunctionId == _functionId)
+            {
+                OnFunctionUnLockStateChange();
+            }
+        }
 
-//         private void OnFunctionUnLockStateChange()
-//         {
-//             if (m_FunctionId == 0)
-//             {
-//                 return;
-//             }
+        private void OnFunctionUnLockStateChange()
+        {
+            if (m_FunctionId == 0)
+            {
+                return;
+            }
 
-//             var isOpen = m_FunctionId == -1 || FuncOpen.Instance.IsFuncOpen(m_FunctionId);
-//             state = isOpen ? state == TitleBtnState.Click ? TitleBtnState.Click : TitleBtnState.Normal : TitleBtnState.Locked;
-//         }
+            var isOpen = m_FunctionId == -1 || FuncOpen.Instance.IsFuncOpen(m_FunctionId);
+            state = isOpen ? state == TitleBtnState.Click ? TitleBtnState.Click : TitleBtnState.Normal : TitleBtnState.Locked;
+        }
 
-// #if UNITY_EDITOR
-//         protected override void OnValidate()
-//         {
-//             base.OnValidate();
-//             OnStateChange();
-//         }
-// #endif
+#if UNITY_EDITOR
+        protected override void OnValidate()
+        {
+            base.OnValidate();
+            OnStateChange();
+        }
+#endif
 
-//     }
+    }
 
-// }
+}
 
 
 
diff --git a/Main/Component/UI/Common/FunctionButtonGroup.cs b/Main/Component/UI/Common/FunctionButtonGroup.cs
index 58e4ace..4fe1177 100644
--- a/Main/Component/UI/Common/FunctionButtonGroup.cs
+++ b/Main/Component/UI/Common/FunctionButtonGroup.cs
@@ -1,269 +1,269 @@
-锘�// //--------------------------------------------------------
-// //    [Author]:           绗簩涓栫晫
-// //    [  Date ]:           Tuesday, October 31, 2017
-// //--------------------------------------------------------
-// using UnityEngine;
-// using System.Collections;
-// using System.Collections.Generic;
-// using UnityEngine.UI;
-// using UnityEngine.Events;
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Tuesday, October 31, 2017
+//--------------------------------------------------------
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine.UI;
+using UnityEngine.Events;
 
-// namespace vnxbqy.UI
-// {
+namespace vnxbqy.UI
+{
 
-//     public class FunctionButtonGroup : MonoBehaviour
-//     {
-//         [SerializeField] ScrollRect m_ScrollRect;
-//         [SerializeField] RectTransform m_Container;
+    public class FunctionButtonGroup : MonoBehaviour
+    {
+        [SerializeField] ScrollRect m_ScrollRect;
+        [SerializeField] RectTransform m_Container;
 
-//         public int unLockedCount {
-//             get {
-//                 var count = 0;
-//                 foreach (var button in functionButtons.Values)
-//                 {
-//                     if (button.state != TitleBtnState.Locked)
-//                     {
-//                         count++;
-//                     }
-//                 }
+        public int unLockedCount {
+            get {
+                var count = 0;
+                foreach (var button in functionButtons.Values)
+                {
+                    if (button.state != TitleBtnState.Locked)
+                    {
+                        count++;
+                    }
+                }
 
-//                 return count;
-//             }
-//         }
+                return count;
+            }
+        }
 
-//         int currentOrder = 0;
-//         List<int> orders = new List<int>();
-//         Dictionary<int, FunctionButton> functionButtons = new Dictionary<int, FunctionButton>();
+        int currentOrder = 0;
+        List<int> orders = new List<int>();
+        Dictionary<int, FunctionButton> functionButtons = new Dictionary<int, FunctionButton>();
 
-//         public void Register(FunctionButton button)
-//         {
-//             functionButtons[button.order] = button;
-//             if (!orders.Contains(button.order))
-//             {
-//                 orders.Add(button.order);
-//                 orders.Sort(OrderCompare);
-//             }
+        public void Register(FunctionButton button)
+        {
+            functionButtons[button.order] = button;
+            if (!orders.Contains(button.order))
+            {
+                orders.Add(button.order);
+                orders.Sort(OrderCompare);
+            }
 
-//             if (m_ScrollRect != null)
-//             {
-//                 m_ScrollRect.horizontal = functionButtons.Count > 5;
-//             }
-//         }
+            if (m_ScrollRect != null)
+            {
+                m_ScrollRect.horizontal = functionButtons.Count > 5;
+            }
+        }
 
-//         public void ChangeHorizontal(bool move)
-//         {
-//             if (m_ScrollRect != null)
-//             {
-//                 m_ScrollRect.horizontal = move;
-//             }
-//         }
+        public void ChangeHorizontal(bool move)
+        {
+            if (m_ScrollRect != null)
+            {
+                m_ScrollRect.horizontal = move;
+            }
+        }
 
-//         public void ChangeHorizontalPos(float index)
-//         {
-//             if (m_ScrollRect != null)
-//             {
-//                 m_ScrollRect.horizontalNormalizedPosition = index;
-//             }
-//         }
-//         public void UnRegister(FunctionButton button)
-//         {
-//             if (functionButtons.ContainsKey(button.order))
-//             {
-//                 functionButtons.Remove(button.order);
-//             }
+        public void ChangeHorizontalPos(float index)
+        {
+            if (m_ScrollRect != null)
+            {
+                m_ScrollRect.horizontalNormalizedPosition = index;
+            }
+        }
+        public void UnRegister(FunctionButton button)
+        {
+            if (functionButtons.ContainsKey(button.order))
+            {
+                functionButtons.Remove(button.order);
+            }
 
-//             if (orders.Contains(button.order))
-//             {
-//                 orders.Remove(button.order);
-//                 orders.Sort(OrderCompare);
-//             }
+            if (orders.Contains(button.order))
+            {
+                orders.Remove(button.order);
+                orders.Sort(OrderCompare);
+            }
 
-//             if (m_ScrollRect != null)
-//             {
-//                 m_ScrollRect.horizontal = functionButtons.Count > 5;
-//             }
-//         }
+            if (m_ScrollRect != null)
+            {
+                m_ScrollRect.horizontal = functionButtons.Count > 5;
+            }
+        }
 
-//         public void NotifyToggleOn(FunctionButton button)
-//         {
+        public void NotifyToggleOn(FunctionButton button)
+        {
 
-//             if (button.state == TitleBtnState.Click)
-//             {
-//                 currentOrder = button.order;
-//                 for (int i = 0; i < orders.Count; i++)
-//                 {
-//                     if (!functionButtons.ContainsKey(orders[i]))
-//                     {
-//                         Debug.LogFormat("<color=#ff0000ff>{0} {1}</color>", orders[i], button.name);
-//                     }
-//                     var functionButton = functionButtons[orders[i]];
-//                     if (functionButton != button && functionButton.state != TitleBtnState.Locked)
-//                     {
-//                         functionButton.state = TitleBtnState.Normal;
-//                     }
-//                 }
-//             }
-//         }
+            if (button.state == TitleBtnState.Click)
+            {
+                currentOrder = button.order;
+                for (int i = 0; i < orders.Count; i++)
+                {
+                    if (!functionButtons.ContainsKey(orders[i]))
+                    {
+                        Debug.LogFormat("<color=#ff0000ff>{0} {1}</color>", orders[i], button.name);
+                    }
+                    var functionButton = functionButtons[orders[i]];
+                    if (functionButton != button && functionButton.state != TitleBtnState.Locked)
+                    {
+                        functionButton.state = TitleBtnState.Normal;
+                    }
+                }
+            }
+        }
 
-//         public void TriggerByOrder(int targetOrder)
-//         {
-//             for (int i = 0; i < orders.Count; i++)
-//             {
-//                 var order = orders[i];
-//                 if (order == targetOrder)
-//                 {
-//                     functionButtons[order].Invoke(true);
-//                     break;
-//                 }
-//             }
-//         }
+        public void TriggerByOrder(int targetOrder)
+        {
+            for (int i = 0; i < orders.Count; i++)
+            {
+                var order = orders[i];
+                if (order == targetOrder)
+                {
+                    functionButtons[order].Invoke(true);
+                    break;
+                }
+            }
+        }
 
-//         public void TriggerLast()
-//         {
-//             var index = orders.IndexOf(currentOrder);
-//             if (index < 0)
-//             {
-//                 return;
-//             }
+        public void TriggerLast()
+        {
+            var index = orders.IndexOf(currentOrder);
+            if (index < 0)
+            {
+                return;
+            }
 
-//             var loopTimes = 0;
-//             while (loopTimes < 2)
-//             {
-//                 index--;
-//                 if (index < 0)
-//                 {
-//                     index = orders.Count - 1;
-//                     loopTimes++;
-//                 }
+            var loopTimes = 0;
+            while (loopTimes < 2)
+            {
+                index--;
+                if (index < 0)
+                {
+                    index = orders.Count - 1;
+                    loopTimes++;
+                }
 
-//                 var next = orders[index];
-//                 if (functionButtons[next].state != TitleBtnState.Locked)
-//                 {
-//                     functionButtons[next].Invoke(false);
-//                     break;
-//                 }
-//             }
+                var next = orders[index];
+                if (functionButtons[next].state != TitleBtnState.Locked)
+                {
+                    functionButtons[next].Invoke(false);
+                    break;
+                }
+            }
 
-//         }
+        }
 
-//         public void TriggerNext()
-//         {
-//             var index = orders.IndexOf(currentOrder);
-//             if (index < 0)
-//             {
-//                 return;
-//             }
+        public void TriggerNext()
+        {
+            var index = orders.IndexOf(currentOrder);
+            if (index < 0)
+            {
+                return;
+            }
 
-//             var loopTimes = 0;
-//             while (loopTimes < 2)
-//             {
-//                 index++;
-//                 if (index > orders.Count - 1)
-//                 {
-//                     index = 0;
-//                     loopTimes++;
-//                 }
+            var loopTimes = 0;
+            while (loopTimes < 2)
+            {
+                index++;
+                if (index > orders.Count - 1)
+                {
+                    index = 0;
+                    loopTimes++;
+                }
 
-//                 var next = orders[index];
-//                 if (functionButtons[next].state != TitleBtnState.Locked)
-//                 {
-//                     functionButtons[next].Invoke(false);
-//                     break;
-//                 }
-//             }
-//         }
+                var next = orders[index];
+                if (functionButtons[next].state != TitleBtnState.Locked)
+                {
+                    functionButtons[next].Invoke(false);
+                    break;
+                }
+            }
+        }
 
-//         public bool IsFirst()
-//         {
-//             return orders.Count > 0 && currentOrder == orders[0];
-//         }
+        public bool IsFirst()
+        {
+            return orders.Count > 0 && currentOrder == orders[0];
+        }
 
-//         public bool IsLast()
-//         {
-//             return orders.Count > 0 && currentOrder == orders[orders.Count - 1];
-//         }
+        public bool IsLast()
+        {
+            return orders.Count > 0 && currentOrder == orders[orders.Count - 1];
+        }
 
-//         public void GotoOrder(int order)
-//         {
-//             if (m_ScrollRect != null)
-//             {
-//                 var index = orders.IndexOf(order);
-//                 if (m_ScrollRect.horizontal)
-//                 {
-//                     m_ScrollRect.horizontalNormalizedPosition = (float)index / orders.Count;
-//                 }
-//                 else if (m_ScrollRect.vertical)
-//                 {
-//                     m_ScrollRect.verticalNormalizedPosition = (float)index / orders.Count;
-//                 }
-//             }
-//         }
+        public void GotoOrder(int order)
+        {
+            if (m_ScrollRect != null)
+            {
+                var index = orders.IndexOf(order);
+                if (m_ScrollRect.horizontal)
+                {
+                    m_ScrollRect.horizontalNormalizedPosition = (float)index / orders.Count;
+                }
+                else if (m_ScrollRect.vertical)
+                {
+                    m_ScrollRect.verticalNormalizedPosition = (float)index / orders.Count;
+                }
+            }
+        }
 
-//         private int OrderCompare(int a, int b)
-//         {
-//             return a < b ? -1 : 1;
-//         }
+        private int OrderCompare(int a, int b)
+        {
+            return a < b ? -1 : 1;
+        }
 
-//         public FunctionButton AddFunction(string pattern, int order, int functionId, string title, int redpointId)
-//         {
-//             if (m_Container == null)
-//             {
-//                 return null;
-//             }
+        public FunctionButton AddFunction(string pattern, int order, int functionId, string title, int redpointId)
+        {
+            if (m_Container == null)
+            {
+                return null;
+            }
 
-//             var instance = UIUtility.CreateWidget(pattern, string.Concat("Function_", order));
-//             instance.transform.SetParentEx(this.m_Container, Vector3.zero, Quaternion.identity, Vector3.one);
+            var instance = UIUtility.CreateWidget(pattern, string.Concat("Function_", order));
+            instance.transform.SetParentEx(this.m_Container, Vector3.zero, Quaternion.identity, Vector3.one);
 
-//             var functionButton = instance.GetComponent<FunctionButton>();
-//             functionButton.functionId = functionId;
-//             functionButton.order = order;
-//             functionButton.title.text = title;
+            var functionButton = instance.GetComponent<FunctionButton>();
+            functionButton.functionId = functionId;
+            functionButton.order = order;
+            functionButton.title.text = title;
 
-//             functionButton.group = this;
-//             functionButton.redpoint.redpointId = redpointId;
-//             functionButtons[order] = functionButton;
+            functionButton.group = this;
+            functionButton.redpoint.redpointId = redpointId;
+            functionButtons[order] = functionButton;
 
-//             functionButton.SetActive(functionButton.functionId != -1);
-//             return functionButton;
-//         }
+            functionButton.SetActive(functionButton.functionId != -1);
+            return functionButton;
+        }
 
-//         public void SetFunctionListener(int order, UnityAction callBack)
-//         {
-//             if (functionButtons.ContainsKey(order))
-//             {
-//                 functionButtons[order].SetListener(callBack);
-//             }
-//         }
+        public void SetFunctionListener(int order, UnityAction callBack)
+        {
+            if (functionButtons.ContainsKey(order))
+            {
+                functionButtons[order].SetListener(callBack);
+            }
+        }
 
-//         public void SetFunctionButtonActive(int order, bool isShow)
-//         {
-//             if (functionButtons.ContainsKey(order))
-//             {
-//                 functionButtons[order].SetActive(isShow);
-//             }
-//         }
+        public void SetFunctionButtonActive(int order, bool isShow)
+        {
+            if (functionButtons.ContainsKey(order))
+            {
+                functionButtons[order].SetActive(isShow);
+            }
+        }
 
-//         public RedPointState GetFunctionButtonRedPointState(int order)
-//         {
-//             if (functionButtons.ContainsKey(order))
-//             {
-//                 return RedpointCenter.Instance.GetRedpointState(functionButtons[order].redpoint.redpointId);
-//             }
+        public RedPointState GetFunctionButtonRedPointState(int order)
+        {
+            if (functionButtons.ContainsKey(order))
+            {
+                return RedpointCenter.Instance.GetRedpointState(functionButtons[order].redpoint.redpointId);
+            }
 
-//             return RedPointState.None;
-//         }
+            return RedPointState.None;
+        }
 
-//         public FunctionButton GetFunctionBtn(int order)
-//         {
-//             if (functionButtons.ContainsKey(order))
-//             {
-//                 return functionButtons[order];
-//             }
-//             return null;
-//         }
-//     }
+        public FunctionButton GetFunctionBtn(int order)
+        {
+            if (functionButtons.ContainsKey(order))
+            {
+                return functionButtons[order];
+            }
+            return null;
+        }
+    }
 
-// }
+}
 
 
 
diff --git a/Main/System/Skill/FlipScroll.cs b/Main/System/Skill/FlipScroll.cs
new file mode 100644
index 0000000..d070ebf
--- /dev/null
+++ b/Main/System/Skill/FlipScroll.cs
@@ -0,0 +1,320 @@
+锘�//--------------------------------------------------------
+//    [Author]:           绗簩涓栫晫
+//    [  Date ]:           Monday, September 11, 2017
+//--------------------------------------------------------
+using UnityEngine;
+using System.Collections;
+using UnityEngine.UI;
+using UnityEngine.EventSystems;
+using System;
+namespace vnxbqy.UI
+{
+    public class FlipScroll : MaskableGraphic, IBeginDragHandler, IEndDragHandler, IDragHandler
+    {
+        public enum FlipDirEnum
+        {
+            Horizon,
+            Vertical,
+        }
+        private int page = 0;
+        /// <summary>
+        /// 褰撳墠椤�
+        /// </summary>
+        public int Page {
+            get { return page; }
+        }
+        [SerializeField]
+        private FlipDirEnum flipType = FlipDirEnum.Horizon;
+        public FlipDirEnum FlipType {
+            get {
+                return flipType;
+            }
+            set {
+                flipType = value;
+            }
+        }
+        [SerializeField]
+        private bool m_Loop = false;
+        public bool loop {
+            get {
+                return m_Loop;
+            }
+            set {
+                m_Loop = value;
+            }
+        }
+
+        [SerializeField]
+        private TweenType _tweenType = TweenType.Linear;
+        public TweenType tweenType {
+            get { return _tweenType; }
+            set { _tweenType = value; }
+        }
+        [SerializeField]
+        private float sensitive = 5.0f;
+
+        public float Sensitive {
+            get { return sensitive; }
+            set { sensitive = value; }
+        }
+        [SerializeField]
+        public bool resetOnEnable = true;
+
+        private bool tweening = false;
+        public bool IsTweening { get { return tweening; } }
+        [SerializeField]
+        private float _tweenTime = 1.0f;
+        public float TweenTime {
+            get { return _tweenTime; }
+            set { _tweenTime = value; }
+        }
+
+        public RectTransform presentRT;
+        public RectTransform lastRT;
+
+        private RectTransform presentFlipRT;
+        private RectTransform lastFlipRT;
+
+        public event Action<int, RectTransform> OnRefreshData;
+        public event Action OnTweenCompt;
+
+        public int pageCnt = 0;
+        [HideInInspector]
+        public bool locked = false;
+
+        protected override void Awake()
+        {
+            base.Awake();
+            if (presentRT == null || lastRT == null) return;
+            presentRT.SetActive(false);
+            lastRT.SetActive(false);
+            presentFlipRT = presentRT;
+            lastFlipRT = lastRT;
+        }
+
+        protected override void OnEnable()
+        {
+            base.OnEnable();
+            if (presentRT == null || lastRT == null || pageCnt == 0) return;
+            presentRT.SetActive(true);
+            lastRT.SetActive(true);
+            presentRT.localPosition = Vector3.zero;
+            if (resetOnEnable) {
+                switch (FlipType) {
+                    case FlipDirEnum.Horizon:
+                        lastRT.localPosition = rectTransform.localPosition.SetX(rectTransform.sizeDelta.x);
+                        break;
+                    case FlipDirEnum.Vertical:
+                        lastRT.localPosition = rectTransform.localPosition.SetY(-rectTransform.sizeDelta.y);
+                        break;
+                }
+                page = 0;
+            }
+            presentFlipRT = presentRT;
+            lastFlipRT = lastRT;
+            RefreshActive();
+        }
+
+        private Vector2 lastPos = Vector2.zero;
+        public void OnBeginDrag(PointerEventData eventData)
+        {
+            lastPos = eventData.position;
+        }
+
+        public void OnEndDrag(PointerEventData eventData)
+        {
+            if (IsTweening || locked) return;
+            Vector2 nPos = lastPos - eventData.position;
+            switch (FlipType) {
+                case FlipDirEnum.Horizon: {
+                        if (Math.Abs(nPos.x) < sensitive) return;
+                        if (nPos.x > 0) {
+                            FlipRight();
+                        }
+                        else {
+                            FlipLeft();
+                        }
+                    }
+                    break;
+                case FlipDirEnum.Vertical: {
+                        if (Math.Abs(nPos.y) < sensitive) return;
+                        Vector3 pos = Vector3.zero;
+                        if (nPos.y < 0) {
+                            FlipLeft();
+                        }
+                        else {
+                            FlipRight();
+                        }
+                    }
+                    break;
+            }
+        }
+
+        protected override void OnDisable()
+        {
+            tweening = false;
+            StopAllCoroutines();
+            base.OnDisable();
+        }
+
+
+
+
+        IEnumerator TweenPosition(Vector3 lPos, Vector3 nPos, Vector3 lastRtPos)
+        {
+            float time = 0;
+            Vector3 newPresentPos = Vector3.zero;
+            Vector3 newLastPos = Vector3.zero;
+            bool InView = false;
+            tweening = true;
+            while (time < _tweenTime) {
+                float per = 0;
+                switch (tweenType) {
+                    case TweenType.Immediate: per = 1; break;
+                    case TweenType.Linear: per = Linear(time / _tweenTime); break;
+                    case TweenType.Smooth: per = Smooth(time / _tweenTime); break;
+                }
+                newPresentPos = Vector3.Lerp(lPos, nPos, per);
+                newLastPos = Vector3.Lerp(lastRtPos, Vector3.zero, per);
+                presentFlipRT.localPosition = newPresentPos;
+                lastFlipRT.localPosition = newLastPos;
+                time += Time.unscaledDeltaTime;
+                if (!InView) {
+                    InView = InViewSide();
+                }
+                if (tweenType == TweenType.Immediate) {
+                    break;
+                }
+                yield return null;
+            }
+            tweening = false;
+            presentFlipRT.localPosition = nPos;
+            lastFlipRT.localPosition = Vector3.zero;
+            RectTransform temp = presentFlipRT;
+            presentFlipRT = lastFlipRT;
+            lastFlipRT = temp;
+            if (OnTweenCompt != null) OnTweenCompt();
+        }
+
+        public bool InViewSide()
+        {
+            switch (FlipType) {
+                case FlipDirEnum.Horizon: {
+                        if (Vector3.Distance(Vector3.zero, lastFlipRT.localPosition) < lastFlipRT.sizeDelta.x + rectTransform.sizeDelta.x) {
+                            if (OnRefreshData != null) {
+                                lastFlipRT.SetActive(true);
+                                OnRefreshData(page, lastFlipRT);
+                            }
+                            return true;
+                        }
+                    }
+                    break;
+                case FlipDirEnum.Vertical: {
+                        if (Vector3.Distance(Vector3.zero, lastFlipRT.localPosition) < lastFlipRT.sizeDelta.y + rectTransform.sizeDelta.y) {
+                            if (OnRefreshData != null) {
+                                lastFlipRT.SetActive(true);
+                                OnRefreshData(page, lastFlipRT);
+                            }
+                            return true;
+                        }
+                    }
+                    break;
+            }
+            return false;
+        }
+
+        private float Linear(float val)
+        {
+            return Mathf.Lerp(0, 1, val);
+        }
+
+        private float Smooth(float val)
+        {
+            float result = Mathf.SmoothStep(0, 1, val);
+            result = Mathf.Clamp(result, 0, 1);
+            return result;
+        }
+
+        public void RefreshActive()
+        {
+            if (pageCnt == 0 || presentFlipRT == null) return;
+            if (OnRefreshData != null) {
+                presentFlipRT.SetActive(true);
+                OnRefreshData(page, presentFlipRT);
+            }
+        }
+
+        public void FlipLeft()
+        {
+            if (IsTweening || pageCnt == 0) return;
+            Vector3 pos = Vector3.zero;
+            page--;
+            if (page < 0) {
+                if (loop) {
+                    page = pageCnt - 1;
+                }
+                else {
+                    page = 0;
+                    return;
+                }
+            }
+            switch (FlipType) {
+                case FlipDirEnum.Horizon: {
+                        lastFlipRT.localPosition = rectTransform.localPosition.SetX(-rectTransform.sizeDelta.x);
+                        pos = rectTransform.localPosition.SetX(rectTransform.sizeDelta.x);
+                    }
+                    break;
+                case FlipDirEnum.Vertical: {
+                        lastFlipRT.localPosition = rectTransform.localPosition.SetY(rectTransform.sizeDelta.y);
+                        pos = rectTransform.localPosition.SetY(-rectTransform.sizeDelta.y);
+                    }
+                    break;
+            }
+            StartCoroutine(TweenPosition(presentFlipRT.localPosition, pos, lastFlipRT.localPosition));
+        }
+
+        public void FlipRight()
+        {
+            if (IsTweening || pageCnt == 0) return;
+            Vector3 pos = Vector3.zero;
+            page++;
+            if (page >= pageCnt) {
+                if (loop) {
+                    page = 0;
+                }
+                else {
+                    page = pageCnt - 1;
+                    return;
+                }
+            }
+            switch (FlipType) {
+                case FlipDirEnum.Horizon: {
+                        lastFlipRT.localPosition = rectTransform.localPosition.SetX(rectTransform.sizeDelta.x);
+                        pos = rectTransform.localPosition.SetX(-rectTransform.sizeDelta.x);
+                    }
+                    break;
+                case FlipDirEnum.Vertical: {
+                        lastFlipRT.localPosition = rectTransform.localPosition.SetY(-rectTransform.sizeDelta.y);
+                        pos = rectTransform.localPosition.SetY(rectTransform.sizeDelta.y);
+                    }
+                    break;
+            }
+            StartCoroutine(TweenPosition(presentFlipRT.localPosition, pos, lastFlipRT.localPosition));
+        }
+
+        public void OnDrag(PointerEventData eventData)
+        {
+
+        }
+
+        public enum TweenType
+        {
+            Immediate,
+            Linear,
+            Smooth,
+        }
+    }
+}
+
+
+
diff --git a/Main/System/Skill/FlipScroll.cs.meta b/Main/System/Skill/FlipScroll.cs.meta
new file mode 100644
index 0000000..21bf6c8
--- /dev/null
+++ b/Main/System/Skill/FlipScroll.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 2398076fc4555d74e832fd67f5265819
+timeCreated: 1505130007
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

--
Gitblit v1.8.0