예제 #1
0
 //刷新窗体独占状态
 private void RefreshMonopolizedInfo(IHSUIComponent p)
 {
     //如果是独占的,隐藏其他panel
     if (p.IsMonopolized)
     {
         Log("RefreshMonopolizedInfo 1");
         _isCurrentMonolized = true;
         foreach (var panel in GetAllPanels())
         {
             if (panel != p)
             {
                 HidePanel(panel);
             }
             else
             {
                 ShowPanel(panel);
             }
         }
     }
     else if (_isCurrentMonolized) //如果当前是独占的,则需要把所有的都显示出来
     {
         Log("RefreshMonopolizedInfo 2");
         _isCurrentMonolized = false;
         foreach (var panel in GetAllPanels())
         {
             if (panel != p)
             {
                 ShowPanel(panel);
             }
         }
     }
 }
예제 #2
0
        //隐藏(但不销毁)窗体
        private void HidePanel(IHSUIComponent p)
        {
            if (!_panelMap.ContainsKey(p))
            {
                return;
            }
            var canvasGroup = _panelMap[p];

            canvasGroup.blocksRaycasts = false;
            canvasGroup.alpha          = 0;
        }
예제 #3
0
        //显示窗体
        private void ShowPanel(IHSUIComponent p)
        {
            if (!_panelMap.ContainsKey(p))
            {
                return;
            }

            var canvasGroup = _panelMap[p];

            canvasGroup.blocksRaycasts = true;
            canvasGroup.alpha          = 1;
        }
예제 #4
0
        private void DespawnPanel(IHSUIComponent p)
        {
            //先回收panel所有包含的widget
            for (int i = _panelWidgets.Count - 1; i >= 0; i--)
            {
                var c = _panelWidgets[i];
                if (c.parent == p)
                {
                    c.widget.OnDespawn();
                    _provider.Despawn(c.widget);
                    _panelWidgets.RemoveAt(i);
                }
            }

            //再回收panel
            p.OnDespawn();
            _provider.Despawn(p);
        }
예제 #5
0
        //IHSUIComponent widget;

        // Use this for initialization
        void Start()
        {
            manager = UIManagerFactory.CreateDefaultUIManager();
            manager.Init(this.transform);

            panel  = manager.CreatePanel <DemoPanel1>("panel1", "PANEL 1");
            panel2 = manager.CreatePanel <DemoPanel1>("panel1", "PANEL 2");
            panel3 = manager.CreatePanel <DemoPanel1>("panel1", "PANEL 3");
            panel4 = manager.CreatePanel <DemoPanel1>("panel1", "PANEL 4");

            DemoWidgetSidebar widget = manager.CreateWidget <DemoWidgetSidebar>("sidebar", panel2, panel2.transform);

            widget.Init(DemoWidgetSidebar.WidgetType.Toggle);
            widget.AddItem(new DemoWidgetSidebar.SideBarWidgetSelectItem("签到", () => { Debug.Log("sdf"); }));
            widget.AddItem(new DemoWidgetSidebar.SideBarWidgetSelectItem("抽签", () => { Debug.Log("sdfsdf"); }));
            widget.AddItem(new DemoWidgetSidebar.SideBarWidgetSelectItem("开始", () => { Debug.Log("sdfsdfsdf"); }));
            //manager.CreateWidget<DemoWidgetSidebar>("sidebar", panel3, panel3.transform);
            manager.DestroyPanel(panel4);

            StartCoroutine(Test());
        }
예제 #6
0
        //添加窗体
        private void AddPanel(IHSUIComponent panel)
        {
            var canvasGroup = panel.gameObject.GetComponent <CanvasGroup>();

            if (canvasGroup == null)
            {
                canvasGroup = panel.gameObject.AddComponent <CanvasGroup>();
            }
            _panelMap.Add(panel, canvasGroup);

            var link = new PanelLink();

            link.prev = _current;//双向link
            if (_current != null)
            {
                _current.next = link;//双向link
            }

            link.node = panel;
            _current  = link;
            RefreshMonopolizedInfo(panel);
        }
예제 #7
0
        public T CreateWidget <T>(string path, IHSUIComponent parentPanel, Transform parentNode, params object[] paras) where T : MonoBehaviour, IHSUIComponent
        {
            T widget = _provider.Spawn <T>(path);

            widget.transform.SetParent(parentNode, false);
            if (!widget.gameObject.activeSelf)
            {
                widget.gameObject.SetActive(true);
            }

            if (!widget.IsInited)
            {
                widget.OnCreate();
                widget.IsInited = true;
            }
            widget.OnSpawn(paras);

            //只有父节点是用本管理器创建的,在建立映射关系
            if (_panelMap.ContainsKey(parentPanel))
            {
                AddWidget(widget, parentPanel);
            }
            return(widget);
        }
예제 #8
0
        public bool DestroyPanel(IHSUIComponent panel)
        {
            if (!_panelMap.ContainsKey(panel))
            {
                return(false);
            }

            _panelMap.Remove(panel);

            DespawnPanel(panel);

            //如果销毁的是最上层的panel,则重新设置隐藏属性
            if (panel == _current.node)
            {
                while (true)
                {
                    var link = _current.prev;
                    if (link == null)
                    {
                        _current = null;
                        break;
                    }
                    else if (_panelMap.ContainsKey(link.node)) //找到了上一个存在的panel
                    {
                        _current = link;
                        RefreshMonopolizedInfo(link.node);
                        break;
                    }
                    else if (link.node == panel)
                    {
                        LogError("没有按照堆栈顺序关闭面板,引发了未知错误,请程序员查代码!!Name=" + panel.gameObject.name);
                        break;
                    }
                    else if (link.node == null || link.node.ToString() == "null")
                    {
                        LogError("关闭面板内部错误,HSUI内部逻辑错误,请通知HSUI维护者!!Name=" + panel.gameObject.name);
                        break;
                    }
                }
            }
            else //否则连接其两端(将它前后的panel连接起来)
            {
                var p = _current;
                while (p.node != panel && p != null)
                {
                    p = p.prev;
                }

                if (p == null)
                {
                    LogError("关闭面板内部错误2,HSUI内部逻辑错误,请通知HSUI维护者!!Name=" + panel.gameObject.name);
                }
                else //将这个面板的两端相连
                {
                    var prevLink = p.prev;
                    var nextLink = p.next;
                    if (nextLink != null)
                    {
                        nextLink.prev = prevLink;
                    }
                    if (prevLink != null)
                    {
                        prevLink.next = nextLink;
                    }
                }
            }

            return(true);
        }
예제 #9
0
 public PanelWidgetContainer(IHSUIComponent parent, IHSUIComponent widget)
 {
     this.parent = parent;
     this.widget = widget;
 }
예제 #10
0
 //添加组件
 private void AddWidget(IHSUIComponent widget, IHSUIComponent parent)
 {
     _panelWidgets.Add(new PanelWidgetContainer(parent, widget));
 }
예제 #11
0
 public void Despawn(IHSUIComponent panel)
 {
     Destroy(panel.gameObject);
 }