From 44687fc1bb2fdaa8205751c0f0a72a88842bf575 Mon Sep 17 00:00:00 2001
From: client_Wu Xijin <364452445@qq.com>
Date: 星期三, 15 八月 2018 15:04:05 +0800
Subject: [PATCH] 提供窗口管理的lua接口

---
 System/WindowBase/WindowCenter.cs |  236 ++++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 168 insertions(+), 68 deletions(-)

diff --git a/System/WindowBase/WindowCenter.cs b/System/WindowBase/WindowCenter.cs
index 2923870..017dd6f 100644
--- a/System/WindowBase/WindowCenter.cs
+++ b/System/WindowBase/WindowCenter.cs
@@ -60,8 +60,14 @@
         public void OpenFromLocal<T>() where T : Window
         {
             var windowName = typeof(T).Name;
-            T win = null;
-            if (TryGetWindow(out win))
+            OpenFromLocal(windowName);
+        }
+
+        [XLua.LuaCallCSharp]
+        public void OpenFromLocal(string _name)
+        {
+            Window win = null;
+            if (TryGetWindow(_name, out win))
             {
                 if (win.windowState == Window.WindowState.Closed)
                 {
@@ -71,12 +77,12 @@
                 }
                 else
                 {
-                    DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T)));
+                    DebugEx.LogFormat("{0} 绐楀彛宸茬粡鎵撳紑锛�", _name);
                 }
             }
             else
             {
-                win = GetWindowInstance<T>(true);
+                win = GetWindowInstance(_name, true);
                 if (win != null)
                 {
                     win.functionOrder = 0;
@@ -88,24 +94,38 @@
 
         public T Open<T>(bool _forceSync = false, int _functionalOrder = 0) where T : Window
         {
+            var name = typeof(T).Name;
+            var window = Open(name, _forceSync, _functionalOrder);
+            if (window != null)
+            {
+                return window as T;
+            }
+            else
+            {
+                return null;
+            }
+        }
+
+        [XLua.LuaCallCSharp]
+        public Window Open(string _name, bool _forceSync = false, int _functionalOrder = 0)
+        {
             if (VersionConfig.Get().isBanShu)
             {
-                if (typeof(T) == typeof(VipRechargeWin))
+                if (_name == "VipRechargeWin")
                 {
                     SysNotifyMgr.Instance.ShowTip("FuncNoOpen_VIP");
                     return null;
                 }
             }
 
-            var windowName = typeof(T).Name;
-            string childWindow = string.Empty;
+            var childWindow = string.Empty;
             if (_forceSync || AssetSource.uiFromEditor)
             {
-                return OpenSingleWindow<T>(_forceSync, _functionalOrder);
+                return OpenSingleWindow(_name, _forceSync, _functionalOrder);
             }
             else
             {
-                if (WindowConfig.Get().FindChildWindow(windowName, _functionalOrder, out childWindow))
+                if (WindowConfig.Get().FindChildWindow(_name, _functionalOrder, out childWindow))
                 {
                     WindowTrim(childWindow);
                     if (!windows.ContainsKey(childWindow))
@@ -114,7 +134,7 @@
                         {
                             if (_ok)
                             {
-                                OpenSingleWindow<T>(_forceSync, _functionalOrder);
+                                OpenSingleWindow(_name, _forceSync, _functionalOrder);
                             }
                         });
 
@@ -122,20 +142,35 @@
                     }
                     else
                     {
-                        return OpenSingleWindow<T>(_forceSync, _functionalOrder);
+                        return OpenSingleWindow(_name, _forceSync, _functionalOrder);
                     }
                 }
                 else
                 {
-                    return OpenSingleWindow<T>(_forceSync, _functionalOrder);
+                    return OpenSingleWindow(_name, _forceSync, _functionalOrder);
                 }
             }
         }
 
         public T OpenWithoutAnimation<T>() where T : Window
         {
-            T win = null;
-            if (TryGetWindow(out win))
+            var name = typeof(T).Name;
+            var window = OpenWithoutAnimation(name);
+            if (window != null)
+            {
+                return window as T;
+            }
+            else
+            {
+                return null;
+            }
+        }
+
+        [XLua.LuaCallCSharp]
+        public Window OpenWithoutAnimation(string _name)
+        {
+            Window win = null;
+            if (TryGetWindow(_name, out win))
             {
                 if (win.windowState == Window.WindowState.Closed)
                 {
@@ -145,13 +180,13 @@
                 }
                 else
                 {
-                    DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T)));
+                    DebugEx.LogFormat("{0} 绐楀彛宸茬粡鎵撳紑锛�", _name);
                 }
 
-                return (T)win;
+                return win;
             }
 
-            win = GetWindowInstance<T>(false);
+            win = GetWindowInstance(_name, false);
             if (win != null)
             {
                 win.functionOrder = 0;
@@ -159,7 +194,7 @@
                 win.Open();
             }
 
-            return (T)win;
+            return win;
         }
 
         public T Get<T>() where T : Window
@@ -177,6 +212,7 @@
 
         }
 
+        [XLua.LuaCallCSharp]
         public Window Get(string _window)
         {
             if (windows.ContainsKey(_window))
@@ -200,16 +236,42 @@
                 }
                 else
                 {
-                    DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鍏抽棴锛�", typeof(T)));
+                    DebugEx.LogFormat("{0} 绐楀彛宸茬粡鍏抽棴锛�", typeof(T));
                 }
             }
             else
             {
                 asyncLoad.StopTask(typeof(T).Name);
-                DebugEx.Log(string.Format("{0} 绐楀彛鏃犳硶鑾峰緱锛�", typeof(T)));
+                DebugEx.LogFormat("{0} 绐楀彛鏃犳硶鑾峰緱锛�", typeof(T));
             }
 
             return win;
+        }
+
+        [XLua.LuaCallCSharp]
+        public Window Close(string _name)
+        {
+            if (windows.ContainsKey(_name))
+            {
+                var window = windows[_name];
+                if (window.windowState != Window.WindowState.Closed)
+                {
+                    window.CloseImmediately();
+                }
+                else
+                {
+                    DebugEx.LogFormat("{0} 绐楀彛宸茬粡鍏抽棴锛�", _name);
+                }
+
+                return window;
+            }
+            else
+            {
+                asyncLoad.StopTask(_name);
+                DebugEx.LogFormat("{0} 绐楀彛鏃犳硶鑾峰緱锛�", _name);
+                return null;
+            }
+
         }
 
         public T CloseImmediately<T>() where T : Window
@@ -240,6 +302,7 @@
             return new List<string>(windows.Keys);
         }
 
+        [XLua.LuaCallCSharp]
         public void CloseAll(CloseAllIgnoreType _ignoreType = CloseAllIgnoreType.System)
         {
             foreach (var window in windows.Values)
@@ -300,7 +363,6 @@
             }
 
             asyncLoad.StopAllTasks();
-
         }
 
         public void CloseOthers(List<string> _windowNames, CloseAllIgnoreType _ignoreType)
@@ -371,20 +433,24 @@
 
         public void DestroyWin<T>() where T : Window
         {
-            T win = null;
-            if (TryGetWindow<T>(out win))
+            DestroyWin(typeof(T).Name);
+        }
+
+        [XLua.LuaCallCSharp]
+        public void DestroyWin(string _name)
+        {
+            if (windows.ContainsKey(_name))
             {
+                var win = windows[_name];
                 win.CloseImmediately();
                 GameObject.Destroy(win.gameObject);
                 MonoBehaviour.Destroy(win);
-
-                var name = typeof(T).Name;
-                windows[name] = null;
-                windows.Remove(typeof(T).Name);
+                windows[_name] = null;
+                windows.Remove(_name);
             }
             else
             {
-                DebugEx.Log(string.Format("{0} 绐楀彛鏃犳硶鑾峰緱锛�", typeof(T)));
+                DebugEx.LogFormat("{0} 绐楀彛鏃犳硶鑾峰緱锛�", _name);
             }
         }
 
@@ -426,22 +492,18 @@
             }
         }
 
-        public bool CheckOpen(string _windowName)
+        [XLua.LuaCallCSharp]
+        public bool CheckOpen(string _name)
         {
-            if (windows.ContainsKey(_windowName) && windows[_windowName] != null)
+            if (windows.ContainsKey(_name) && windows[_name] != null)
             {
-                var window = windows[_windowName];
+                var window = windows[_name];
                 return window.windowState == Window.WindowState.Opened || window.windowState == Window.WindowState.Opening;
             }
             else
             {
                 return false;
             }
-        }
-
-        public void PreCreateWindows()
-        {
-            m_PreCreateWindowNum = 0;
         }
 
         private void AsyncLoadWindowCallBack(bool _ok, UnityEngine.Object _object)
@@ -532,8 +594,22 @@
 
         private T OpenSingleWindow<T>(bool _forceSync, int _functionalOrder) where T : Window
         {
-            T win = null;
-            if (TryGetWindow(out win))
+            var name = typeof(T).Name;
+            var window = OpenSingleWindow(name, _forceSync, _functionalOrder);
+            if (window != null)
+            {
+                return window as T;
+            }
+            else
+            {
+                return null;
+            }
+        }
+
+        private Window OpenSingleWindow(string _name, bool _forceSync, int _functionalOrder)
+        {
+            Window win = null;
+            if (TryGetWindow(_name, out win))
             {
                 if (win.windowState == Window.WindowState.Closed)
                 {
@@ -543,15 +619,15 @@
                 }
                 else
                 {
-                    DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T)));
+                    DebugEx.LogFormat("{0} 绐楀彛宸茬粡鎵撳紑锛�", _name);
                 }
 
-                return (T)win;
+                return win;
             }
 
             if (_forceSync || AssetSource.uiFromEditor)
             {
-                win = GetWindowInstance<T>(false);
+                win = GetWindowInstance(_name, false);
                 if (win != null)
                 {
                     win.functionOrder = _functionalOrder;
@@ -559,11 +635,11 @@
                     win.Open();
                 }
 
-                return (T)win;
+                return win;
             }
             else
             {
-                GetWindowInstanceAsync<T>(
+                GetWindowInstanceAsync(_name,
                     (bool ok, UnityEngine.Object _object) =>
                     {
                         if (TryGetWindow(out win))
@@ -576,7 +652,7 @@
                             }
                             else
                             {
-                                DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鎵撳紑锛�", typeof(T)));
+                                DebugEx.Log(string.Format("{0} 绐楀彛宸茬粡鎵撳紑锛�", _name));
                             }
                         }
                     }
@@ -588,12 +664,26 @@
 
         private bool TryGetWindow<T>(out T _win) where T : Window
         {
-            var windowName = typeof(T).Name;
-            WindowTrim(windowName);
-
-            if (windows.ContainsKey(windowName))
+            var name = typeof(T).Name;
+            Window window = null;
+            if (TryGetWindow(name, out window))
             {
-                _win = (T)windows[windowName];
+                _win = window as T;
+                return true;
+            }
+            else
+            {
+                _win = null;
+                return false;
+            }
+        }
+
+        private bool TryGetWindow(string _name, out Window _win)
+        {
+            WindowTrim(_name);
+            if (windows.ContainsKey(_name))
+            {
+                _win = windows[_name];
                 return true;
             }
             else
@@ -617,14 +707,26 @@
         private T GetWindowInstance<T>(bool _fromLocal) where T : Window
         {
             var prefabName = typeof(T).Name;
-
-            if (windows.ContainsKey(prefabName))
+            var window = GetWindowInstance(prefabName, _fromLocal);
+            if (window != null)
             {
-                return windows[prefabName] as T;
+                return window as T;
             }
             else
             {
-                var prefab = _fromLocal ? Resources.Load<GameObject>(StringUtility.Contact("UI/Prefabs/", prefabName)) : UILoader.LoadWindow(prefabName);
+                return null;
+            }
+        }
+
+        private Window GetWindowInstance(string _name, bool _fromLocal)
+        {
+            if (windows.ContainsKey(_name))
+            {
+                return windows[_name];
+            }
+            else
+            {
+                var prefab = _fromLocal ? Resources.Load<GameObject>(StringUtility.Contact("UI/Prefabs/", _name)) : UILoader.LoadWindow(_name);
                 prefab.SetActive(false);
                 var instance = GameObject.Instantiate(prefab);
                 if (AssetSource.uiFromEditor)
@@ -632,22 +734,20 @@
                     prefab.SetActive(true);
                 }
 
-                UILoader.UnLoadWindowAsset(prefabName);
-                instance.name = prefabName;
-                var window = instance.GetComponent<T>();
+                UILoader.UnLoadWindowAsset(_name);
+                instance.name = _name;
+                var window = instance.GetComponent<Window>();
                 if (window != null)
                 {
-                    var windowName = typeof(T).Name;
-                    windows[windowName] = window;
+                    windows[_name] = window;
                 }
                 else
                 {
-                    DebugEx.LogFormat("鏃犳硶鑾峰緱  {0}  鐨勮祫婧愶紒", prefabName);
+                    DebugEx.LogFormat("鏃犳硶鑾峰緱  {0}  鐨勮祫婧愶紒", _name);
                 }
 
                 return window;
             }
-
         }
 
         private void GetWindowInstanceAsync<T>(Action<bool, UnityEngine.Object> _callBack) where T : Window
@@ -655,13 +755,13 @@
             GetWindowInstanceAsync(typeof(T).Name, _callBack);
         }
 
-        private void GetWindowInstanceAsync(string _windowName, Action<bool, UnityEngine.Object> _callBack)
+        private void GetWindowInstanceAsync(string _name, Action<bool, UnityEngine.Object> _callBack)
         {
             Action<bool, UnityEngine.Object> addAction = (bool _ok, UnityEngine.Object _object) =>
             {
-                var prefabName = _windowName;
+                var prefabName = _name;
                 Window window = null;
-                if (!windows.ContainsKey(_windowName))
+                if (!windows.ContainsKey(_name))
                 {
                     var prefab = _object as GameObject;
                     prefab.SetActive(false);
@@ -673,15 +773,15 @@
                     }
 
                     UILoader.UnLoadWindowAsset(prefabName);
-                    instance.name = _windowName;
-                    window = (Window)instance.GetComponent(_windowName);
+                    instance.name = _name;
+                    window = (Window)instance.GetComponent(_name);
                     if (window != null)
                     {
-                        windows[_windowName] = (Window)window;
+                        windows[_name] = (Window)window;
                     }
                     else
                     {
-                        Debug.LogFormat("鏃犳硶鑾峰緱  {0}  鐨勮祫婧愶紒", _windowName);
+                        Debug.LogFormat("鏃犳硶鑾峰緱  {0}  鐨勮祫婧愶紒", _name);
                     }
                 }
 
@@ -691,7 +791,7 @@
                 }
             };
 
-            asyncLoad.PushTask(new WindowAsyncLoad.Task(_windowName, addAction));
+            asyncLoad.PushTask(new WindowAsyncLoad.Task(_name, addAction));
         }
 
         public enum WindowStage

--
Gitblit v1.8.0