Example #1
0
 /// <summary>
 /// Initializes the <see cref="Common.UI.DockWidgets.DragHandler"/> class.
 /// </summary>
 static DragHandler()
 {
     mDockWidget    = null;
     mHandledByArea = null;
     mMouseLocation = MouseLocation.Outside;
     mMinimum       = float.MaxValue;
 }
        /// <summary>
        /// Initializes a new instance of the <see cref="Common.UI.DockWidgets.DummyDockWidgetScript"/> class.
        /// </summary>
        /// <param name="baseScript">Base script.</param>
        public static DummyDockWidgetScript Create(DockWidgetScript baseScript)
        {
            DebugEx.VerboseFormat("DummyDockWidgetScript.Create(baseScript = {0})", baseScript);

            DestroyInstance();

            //***************************************************************************
            // Dummy GameObject
            //***************************************************************************
            #region Dummy GameObject
            GameObject dummy = new GameObject("Dummy");
            Utils.InitUIObject(dummy, Global.dockingAreaScript.transform);

            //===========================================================================
            // DummyDockWidgetScript Component
            //===========================================================================
            #region DummyDockWidgetScript Component
            sInstance = dummy.AddComponent<DummyDockWidgetScript>();

            sInstance.image           = baseScript.image;
            sInstance.tokenId         = baseScript.tokenId;
            sInstance.backgroundColor = Assets.Common.DockWidgets.Colors.dummyBackground;
            #endregion
            #endregion

            return sInstance;
        }
Example #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Common.UI.DockWidgets.DockingTabButton"/> class.
        /// </summary>
        public DockingTabButton()
            : base()
        {
            mDockWidget = null;
            mActive     = false;
            mSelected   = false;

            onClick.AddListener(buttonClicked);
        }
        /// <summary>
        /// Initializes the <see cref="Common.UI.DockWidgets.DragInfoHolder"/> class.
        /// </summary>
        static DragInfoHolder()
        {
            DebugEx.Verbose("Created DragInfoHolder object");

            sDockWidget    = null;
            sMinimum       = float.MaxValue;
            sDockingArea   = null;
            sMouseLocation = MouseLocation.Outside;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="Common.UI.DockWidgets.DockingWindowScript"/> class.
        /// </summary>
        private DockingWindowScript()
            : base()
        {
            DebugEx.Verbose("Created DockingWindowScript object");

            mDockWidget        = null;

            mDockingAreaScript = null;

            frame           = WindowFrameType.SingleFrame;
            backgroundColor = Assets.Common.DockWidgets.Colors.dockingWindow;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="Common.UI.DockWidgets.DockingTabButton"/> class.
        /// </summary>
        public DockingTabButton()
            : base()
        {
            DebugEx.Verbose("Created DockingTabButton object");

            transition = Selectable.Transition.SpriteSwap;

            mDockWidget = null;
            mActive     = false;

            mDockingAreas = null;

            onClick.AddListener(ButtonClicked);
        }
        /// <summary>
        /// Inserts the specified dock widget.
        /// </summary>
        /// <param name="dockWidget">Dock widget.</param>
        /// <param name="orientation">Orientation.</param>
        /// <param name="index">Index.</param>
        public void InsertDockWidget(DockWidgetScript dockWidget, DockingAreaOrientation orientation = DockingAreaOrientation.Horizontal, int index = 0)
        {
            DebugEx.VerboseFormat("DockingAreaScript.InsertDockWidget(dockWidget = {0}, orientation = {1}, index = {2})", dockWidget, orientation, index);

            //***************************************************************************
            // DockingGroup GameObject
            //***************************************************************************
            #region DockingGroup GameObject
            GameObject dockingGroup = new GameObject("DockingGroup");

            //===========================================================================
            // RectTransform Component
            //===========================================================================
            #region RectTransform Component
            RectTransform dockingGroupTransform = dockingGroup.AddComponent<RectTransform>();
            Utils.AlignRectTransformStretchStretch(dockingGroupTransform);
            #endregion

            //===========================================================================
            // DockingGroupScript Component
            //===========================================================================
            #region DockingGroupScript Component
            DockingGroupScript dockingGroupScript = dockingGroup.AddComponent<DockingGroupScript>();

            dockingGroupScript.InsertDockWidget(dockWidget);
            #endregion
            #endregion

            if (mChildren.Count == 0 && mDockingGroupScript == null)
            {
                mSizes.Add(1f);

                Utils.InitUIObject(dockingGroup, transform);
                mDockingGroupScript = dockingGroupScript;
                mDockingGroupScript.parent = this;
            }
            else
            if (mChildren.Count == 0 && mDockingGroupScript != null)
            {
                mSizes[0] = 0.5f;
                mSizes.Add(0.5f);

                mOrientation = orientation;

                //***************************************************************************
                // DockingArea GameObject
                //***************************************************************************
                #region DockingArea GameObject
                GameObject dockingArea = new GameObject("DockingArea");
                Utils.InitUIObject(dockingArea, transform);

                //===========================================================================
                // RectTransform Component
                //===========================================================================
                #region RectTransform Component
                dockingArea.AddComponent<RectTransform>();
                #endregion

                //===========================================================================
                // DockingAreaScript Component
                //===========================================================================
                #region DockingAreaScript Component
                DockingAreaScript dockingAreaScript = dockingArea.AddComponent<DockingAreaScript>();
                dockingAreaScript.mParent = this;
                mChildren.Add(dockingAreaScript);
                dockingAreaScript.mSizes.Add(1f);

                if (index == 0)
                {
                    Utils.InitUIObject(dockingGroup, dockingArea.transform);
                    dockingAreaScript.mDockingGroupScript = dockingGroupScript;
                    dockingAreaScript.mDockingGroupScript.parent = dockingAreaScript;
                }
                else
                {
                    Utils.InitUIObject(mDockingGroupScript.gameObject, dockingArea.transform);
                    dockingAreaScript.mDockingGroupScript = mDockingGroupScript;
                    dockingAreaScript.mDockingGroupScript.parent = dockingAreaScript;
                }
                #endregion
                #endregion

                //***************************************************************************
                // DockingArea GameObject
                //***************************************************************************
                #region DockingArea GameObject
                dockingArea = new GameObject("DockingArea");
                Utils.InitUIObject(dockingArea, transform);

                //===========================================================================
                // RectTransform Component
                //===========================================================================
                #region RectTransform Component
                dockingArea.AddComponent<RectTransform>();
                #endregion

                //===========================================================================
                // DockingAreaScript Component
                //===========================================================================
                #region DockingAreaScript Component
                dockingAreaScript = dockingArea.AddComponent<DockingAreaScript>();
                dockingAreaScript.mParent = this;
                mChildren.Add(dockingAreaScript);
                dockingAreaScript.mSizes.Add(1f);

                if (index == 0)
                {
                    Utils.InitUIObject(mDockingGroupScript.gameObject, dockingArea.transform);
                    dockingAreaScript.mDockingGroupScript = mDockingGroupScript;
                    dockingAreaScript.mDockingGroupScript.parent = dockingAreaScript;
                }
                else
                {
                    Utils.InitUIObject(dockingGroup, dockingArea.transform);
                    dockingAreaScript.mDockingGroupScript = dockingGroupScript;
                    dockingAreaScript.mDockingGroupScript.parent = dockingAreaScript;
                }
                #endregion
                #endregion

                mDockingGroupScript = null;
            }
            else
            {
                if (orientation != DockingAreaOrientation.None)
                {
                    if (mOrientation == orientation)
                    {
                        float newSize = 1f / (mSizes.Count + 1);
                        float sizeMultiplier = 1f - newSize;

                        for (int i = 0; i < mSizes.Count; ++i)
                        {
                            mSizes[i] *= sizeMultiplier;
                        }

                        mSizes.Insert(index, newSize);

                        //***************************************************************************
                        // DockingArea GameObject
                        //***************************************************************************
                        #region DockingArea GameObject
                        GameObject dockingArea = new GameObject("DockingArea");
                        Utils.InitUIObject(dockingArea, transform);
                        dockingArea.transform.SetSiblingIndex(index);

                        //===========================================================================
                        // RectTransform Component
                        //===========================================================================
                        #region RectTransform Component
                        dockingArea.AddComponent<RectTransform>();
                        #endregion

                        //===========================================================================
                        // DockingAreaScript Component
                        //===========================================================================
                        #region DockingAreaScript Component
                        DockingAreaScript dockingAreaScript = dockingArea.AddComponent<DockingAreaScript>();
                        dockingAreaScript.mParent = this;
                        mChildren.Insert(index, dockingAreaScript);
                        dockingAreaScript.mSizes.Add(1f);

                        Utils.InitUIObject(dockingGroup, dockingArea.transform);
                        dockingAreaScript.mDockingGroupScript = dockingGroupScript;
                        dockingAreaScript.mDockingGroupScript.parent = dockingAreaScript;
                        #endregion
                        #endregion
                    }
                    else
                    {
                        List<DockingAreaScript> newChildren = new List<DockingAreaScript>();
                        List<float>             newSizes    = new List<float>();

                        newSizes.Add(0.5f);
                        newSizes.Add(0.5f);

                        //***************************************************************************
                        // DockingArea GameObject
                        //***************************************************************************
                        #region DockingArea GameObject
                        GameObject dockingArea = new GameObject("DockingArea");
                        Utils.InitUIObject(dockingArea, transform);

                        //===========================================================================
                        // RectTransform Component
                        //===========================================================================
                        #region RectTransform Component
                        dockingArea.AddComponent<RectTransform>();
                        #endregion

                        //===========================================================================
                        // DockingAreaScript Component
                        //===========================================================================
                        #region DockingAreaScript Component
                        DockingAreaScript dockingAreaScript = dockingArea.AddComponent<DockingAreaScript>();
                        dockingAreaScript.mParent = this;
                        newChildren.Add(dockingAreaScript);

                        if (index == 0)
                        {
                            Utils.InitUIObject(dockingGroup, dockingArea.transform);
                            dockingAreaScript.mDockingGroupScript = dockingGroupScript;
                            dockingAreaScript.mDockingGroupScript.parent = dockingAreaScript;

                            dockingAreaScript.mSizes.Add(1f);
                        }
                        else
                        {
                            foreach (DockingAreaScript child in mChildren)
                            {
                                child.mParent = dockingAreaScript;
                                child.transform.SetParent(dockingArea.transform, false);
                            }

                            dockingAreaScript.mOrientation = mOrientation;
                            dockingAreaScript.mChildren    = mChildren;
                            dockingAreaScript.mSizes       = mSizes;
                        }
                        #endregion
                        #endregion

                        //***************************************************************************
                        // DockingArea GameObject
                        //***************************************************************************
                        #region DockingArea GameObject
                        dockingArea = new GameObject("DockingArea");
                        Utils.InitUIObject(dockingArea, transform);

                        //===========================================================================
                        // RectTransform Component
                        //===========================================================================
                        #region RectTransform Component
                        dockingArea.AddComponent<RectTransform>();
                        #endregion

                        //===========================================================================
                        // DockingAreaScript Component
                        //===========================================================================
                        #region DockingAreaScript Component
                        dockingAreaScript = dockingArea.AddComponent<DockingAreaScript>();
                        dockingAreaScript.mParent = this;
                        newChildren.Add(dockingAreaScript);

                        if (index == 0)
                        {
                            foreach (DockingAreaScript child in mChildren)
                            {
                                child.mParent = dockingAreaScript;
                                child.transform.SetParent(dockingArea.transform, false);
                            }

                            dockingAreaScript.mOrientation = mOrientation;
                            dockingAreaScript.mChildren    = mChildren;
                            dockingAreaScript.mSizes       = mSizes;
                        }
                        else
                        {
                            Utils.InitUIObject(dockingGroup, dockingArea.transform);
                            dockingAreaScript.mDockingGroupScript = dockingGroupScript;
                            dockingAreaScript.mDockingGroupScript.parent = dockingAreaScript;

                            dockingAreaScript.mSizes.Add(1f);
                        }
                        #endregion
                        #endregion

                        mOrientation = orientation;

                        mChildren = newChildren;
                        mSizes    = newSizes;
                    }
                }
                else
                {
                    DebugEx.ErrorFormat("Invalid orientation value: {0}", orientation);
                }
            }

            OnResize();
        }
        /// <summary>
        /// Updates tab image.
        /// </summary>
        /// <param name="dockWidget">Dock widget.</param>
        public void UpdateTabImage(DockWidgetScript dockWidget)
        {
            DebugEx.VerboseFormat("DockingGroupScript.UpdateTabImage(dockWidget = {0})", dockWidget);

            if (dockWidget.parent == this)
            {
                int index = mChildren.IndexOf(dockWidget);

                if (index >= 0)
                {
                    Image tabImage = mTabsTransform.GetChild(index).GetChild(0).GetComponent<Image>(); // Tab/Image

                    tabImage.sprite = dockWidget.image;
                }
                else
                {
                    DebugEx.Error("Failed to update tab image");
                }
            }
            else
            {
                DebugEx.Error("Dock widget belongs not to this docking group");
            }
        }
        /// <summary>
        /// Updates tab.
        /// </summary>
        /// <param name="dockWidget">Dock widget.</param>
        public void UpdateTab(DockWidgetScript dockWidget)
        {
            DebugEx.VerboseFormat("DockingGroupScript.UpdateTab(dockWidget = {0})", dockWidget);

            if (dockWidget.parent == this)
            {
                int index = mChildren.IndexOf(dockWidget);

                if (index >= 0)
                {
                    Text tabText = mTabsTransform.GetChild(index).GetChild(1).GetComponent<Text>(); // Tab/Text

                    tabText.text = dockWidget.title;

                    UpdateTabsGeometry();
                }
                else
                {
                    DebugEx.Error("Failed to update tab");
                }
            }
            else
            {
                DebugEx.Error("Dock widget belongs not to this docking group");
            }
        }
        /// <summary>
        /// Removes the dock widget.
        /// </summary>
        /// <param name="dockWidget">Dock widget.</param>
        public void RemoveDockWidget(DockWidgetScript dockWidget)
        {
            DebugEx.VerboseFormat("DockingGroupScript.RemoveDockWidget(dockWidget = {0})", dockWidget);

            if (dockWidget.parent == this)
            {
                int index = mChildren.IndexOf(dockWidget);

                if (index >= 0)
                {
                    dockWidget.parent = null;

                    Transform tab = mTabsTransform.GetChild(index);

                    mContentTransform.GetChild(index).SetAsLastSibling();
                    tab.SetAsLastSibling();
                    UnityEngine.Object.DestroyObject(tab.gameObject);
                    mChildren.RemoveAt(index);

                    if (mChildren.Count > 0)
                    {
                        if (index == mSelectedIndex)
                        {
                            int temp = mSelectedIndex;
                            mSelectedIndex = -1;

                            if (temp < mChildren.Count)
                            {
                                selectedIndex = temp;
                            }
                            else
                            {
                                selectedIndex = mChildren.Count - 1;
                            }
                        }
                        else
                        if (index < mSelectedIndex)
                        {
                            --mSelectedIndex;
                        }

                        UpdateTabsGeometry();
                    }
                    else
                    {
                        Destroy();
                    }
                }
                else
                {
                    DebugEx.Error("Failed to remove dock widget");
                }
            }
            else
            {
                DebugEx.Error("Dock widget belongs not to this docking group");
            }
        }
        /// <summary>
        /// Handler for tab select event.
        /// </summary>
        /// <param name="dockWidget">Dock widget.</param>
        public void OnSelectTab(DockWidgetScript dockWidget)
        {
            DebugEx.VerboseFormat("DockingGroupScript.OnSelectTab(dockWidget = {0})", dockWidget);

            if (dockWidget.parent == this)
            {
                int index = mChildren.IndexOf(dockWidget);

                if (index >= 0)
                {
                    selectedIndex = index;
                }
                else
                {
                    DebugEx.Error("Failed to select tab");
                }
            }
            else
            {
                DebugEx.Error("Dock widget belongs not to this docking group");
            }
        }
        /// <summary>
        /// Insert the specified dock widget.
        /// </summary>
        /// <param name="dockWidget">Dock widget.</param>
        /// <param name="index">Index.</param>
        public void InsertDockWidget(DockWidgetScript dockWidget, int index = 0)
        {
            DebugEx.VerboseFormat("DockingGroupScript.InsertDockWidget(dockWidget = {0}, index = {1})", dockWidget, index);

            if (dockWidget.parent != null)
            {
                if (dockWidget.parent == this)
                {
                    if (index < mChildren.Count && mChildren[index] == dockWidget)
                    {
                        // Do nothing
                        return;
                    }

                    int foundIndex = mChildren.IndexOf(dockWidget);

                    if (foundIndex >= 0)
                    {
                        if (mSelectedIndex == foundIndex)
                        {
                            mSelectedIndex = index;
                        }
                        else
                        if (mSelectedIndex >= 0)
                        {
                            if (foundIndex < mSelectedIndex)
                            {
                                --mSelectedIndex;
                            }

                            if (index <= mSelectedIndex)
                            {
                                ++mSelectedIndex;
                            }
                        }

                        mChildren.RemoveAt(foundIndex);
                        mChildren.Insert(index, dockWidget);

                        mTabsTransform.GetChild(foundIndex).SetSiblingIndex(index);
                        dockWidget.transform.SetSiblingIndex(index);

                        UpdateTabsGeometry();
                    }
                    else
                    {
                        DebugEx.Error("Failed to insert dock widget");
                    }

                    return;
                }
                else
                {
                    dockWidget.parent.RemoveDockWidget(dockWidget);
                }
            }

            dockWidget.parent = this;
            mChildren.Insert(index, dockWidget);

            dockWidget.transform.SetParent(mContentTransform, false);
            dockWidget.transform.SetSiblingIndex(index);

            if (mSelectedIndex == -1)
            {
                mSelectedIndex = index;

                dockWidget.gameObject.SetActive(true);
            }
            else
            {
                if (index <= mSelectedIndex)
                {
                    ++mSelectedIndex;
                }

                dockWidget.gameObject.SetActive(false);
            }

            //===========================================================================
            // Tab GameObject
            //===========================================================================
            #region Tab GameObject
            GameObject tab = new GameObject("Tab");
            Utils.InitUIObject(tab, mTabsTransform);
            tab.transform.SetSiblingIndex(index);

            //===========================================================================
            // RectTransform Component
            //===========================================================================
            #region RectTransform Component
            tab.AddComponent<RectTransform>();
            #endregion

            //===========================================================================
            // CanvasRenderer Component
            //===========================================================================
            #region CanvasRenderer Component
            tab.AddComponent<CanvasRenderer>();
            #endregion

            //===========================================================================
            // Image Component
            //===========================================================================
            #region Image Component
            Image tabImage = tab.AddComponent<Image>();

            tabImage.type = Image.Type.Sliced;
            #endregion

            //===========================================================================
            // DockingTabButton Component
            //===========================================================================
            #region DockingTabButton Component
            DockingTabButton tabButton = tab.AddComponent<DockingTabButton>();

            tabButton.targetGraphic = tabImage;
            tabButton.dockWidget    = dockWidget;
            tabButton.active        = (mSelectedIndex == index) || (dockWidget == DummyDockWidgetScript.instance);
            #endregion

            //===========================================================================
            // ContextMenuScript Component
            //===========================================================================
            #region ContextMenuScript Component
            ContextMenuScript tabContextMenu = tab.AddComponent<ContextMenuScript>();

            tabContextMenu.sourceObject      = dockWidget;
            tabContextMenu.onShowContextMenu = OnShowContextMenu;
            #endregion

            //===========================================================================
            // Image GameObject
            //===========================================================================
            #region Image GameObject
            GameObject imageGameObject = new GameObject("Image");
            Utils.InitUIObject(imageGameObject, tab.transform);

            //===========================================================================
            // RectTransform Component
            //===========================================================================
            #region RectTransform Component
            RectTransform imageTransform = imageGameObject.AddComponent<RectTransform>();
            Utils.AlignRectTransformTopLeft(imageTransform, 12f, 12f, 9f, 3f);
            #endregion

            //===========================================================================
            // CanvasRenderer Component
            //===========================================================================
            #region CanvasRenderer Component
            imageGameObject.AddComponent<CanvasRenderer>();
            #endregion

            //===========================================================================
            // Image Component
            //===========================================================================
            #region Image Component
            Image image = imageGameObject.AddComponent<Image>();

            image.sprite = dockWidget.image;
            image.type   = Image.Type.Sliced;
            #endregion
            #endregion

            //===========================================================================
            // Text GameObject
            //===========================================================================
            #region Text GameObject
            GameObject textObject = new GameObject("Text");
            Utils.InitUIObject(textObject, tab.transform);

            //===========================================================================
            // RectTransform Component
            //===========================================================================
            #region RectTransform Component
            RectTransform textTransform = textObject.AddComponent<RectTransform>();
            Utils.AlignRectTransformStretchStretch(textTransform, 25f, 0f, 6f, 0f);
            #endregion

            //===========================================================================
            // Text Component
            //===========================================================================
            #region Text Component
            Text text = textObject.AddComponent<Text>();

            Assets.Common.DockWidgets.TextStyles.title.Apply(text);
            text.text = dockWidget.title;
            #endregion
            #endregion
            #endregion

            UpdateTabsGeometry();
        }