Exemplo n.º 1
0
        public override void Render()
        {
            bool docksChanged = false;

            /* to speed up processing */
            if (!HasDocks)
            {
                DocksChanged = false;
                return;
            }

            /* fade alpha value */
            if (WantedTitleBarAlpha >= CurrentTitleBarAlpha)
            {
                CurrentTitleBarAlpha = WantedTitleBarAlpha;
            }
            else
            {
                if (CurrentTitleBarAlpha > 0)
                {
                    CurrentTitleBarAlpha = Math.Max(0, CurrentTitleBarAlpha - 0.02f);
                    docksChanged         = true;
                }
            }

            int xPos = 0;
            int yPos = 0;

            switch (Orientation)
            {
            case eOrientation.RightBorder:
                xPos = MainPlot.DirectXWidth;
                yPos = DockStartY;
                break;

            case eOrientation.LeftBorder:
                xPos = 0;
                yPos = DockStartY;
                break;

            case eOrientation.TopBorder:
                xPos = DockStartX;
                yPos = 0;
                break;

            case eOrientation.BottomBorder:
                xPos = DockStartX;
                yPos = MainPlot.DirectXHeight;
                break;
            }

            if (DocksChanged)
            {
                lock (Docks)
                {
                    Rectangle sizeRect = new Rectangle();

                    LeftMostPosition   = MainPlot.DirectXWidth;
                    RightMostPosition  = 0;
                    TopMostPosition    = MainPlot.DirectXHeight;
                    BottomMostPosition = 0;

                    foreach (Dock dock in Docks)
                    {
                        DockPanelPrivate priv = dock.Private;

                        priv.TitleBodyVertexesUsed       = 0;
                        priv.TitleBorderVertexesUsed     = 0;
                        priv.BackTitleBodyVertexesUsed   = 0;
                        priv.BackTitleBorderVertexesUsed = 0;

                        DisplayFont.MeasureString(null, dock.Title, DrawTextFormat.Center, ref sizeRect);

                        switch (Orientation)
                        {
                        case eOrientation.BottomBorder:
                        case eOrientation.TopBorder:
                            /* add some space around the text */
                            priv.TitleHitRect.Width  = sizeRect.Width + BorderSpaceHor * 2;
                            priv.TitleHitRect.Height = sizeRect.Height + BorderSpaceVert * 2;
                            if (dock.HideBackTitle)
                            {
                                priv.BackTitleHitRect.Width  = 0;
                                priv.BackTitleHitRect.Height = 0;
                            }
                            else
                            {
                                priv.BackTitleHitRect.Width  = sizeRect.Width + BorderSpaceHor * 2;
                                priv.BackTitleHitRect.Height = sizeRect.Height + BorderSpaceVert * 2;
                            }
                            break;

                        case eOrientation.LeftBorder:
                        case eOrientation.RightBorder:
                            /* add some space around the text */
                            priv.TitleHitRect.Width  = sizeRect.Height + BorderSpaceVert * 2;
                            priv.TitleHitRect.Height = sizeRect.Width + BorderSpaceHor * 2;
                            if (dock.HideBackTitle)
                            {
                                priv.BackTitleHitRect.Width  = 0;
                                priv.BackTitleHitRect.Height = 0;
                            }
                            else
                            {
                                priv.BackTitleHitRect.Width  = sizeRect.Height + BorderSpaceVert * 2;
                                priv.BackTitleHitRect.Height = sizeRect.Width + BorderSpaceHor * 2;
                            }
                            break;
                        }

                        switch (dock.State)
                        {
                        case eDockState.Expanding:
                            dock.PositionUpdated = true;

                            if (dock.Private.VisiblePart > 0.99f)
                            {
                                dock.State = dock.WantedState;
                                dock.Private.VisiblePart = 1;
                            }
                            else
                            {
                                dock.Private.VisiblePart += (1 - dock.Private.VisiblePart) / DockSlideFact + 0.001;
                            }

                            /* force update again */
                            docksChanged = true;
                            break;

                        case eDockState.Collapsing:
                            dock.PositionUpdated = true;

                            if (dock.Private.VisiblePart < 0.01f)
                            {
                                dock.State = dock.WantedState;
                                dock.Private.VisiblePart = 0;
                            }
                            else
                            {
                                dock.Private.VisiblePart -= dock.Private.VisiblePart / DockSlideFact + 0.001;
                            }

                            /* force update again */
                            docksChanged = true;
                            break;

                        default:
                            break;
                        }


                        /* set dock position */
                        dock.XPosition       = DockX(xPos, dock);
                        dock.YPosition       = DockY(yPos, dock);
                        dock.PositionUpdated = true;

                        /* update the hit rectangle */
                        priv.TitleHitRect.X     = DockTitleX(dock);
                        priv.TitleHitRect.Y     = DockTitleY(dock);
                        priv.BackTitleHitRect.X = DockBackTitleX(dock);
                        priv.BackTitleHitRect.Y = DockBackTitleY(dock);

                        /* draw the title bar */
                        uint color1      = TitleColor1 | TitleBarAlpha;
                        uint color2      = TitleColor2 | TitleBarAlpha;
                        uint colorBorder = TitleBorder | TitleBarAlpha;

                        if (priv.TitleHighlighted)
                        {
                            color1 = TitleColorHigh1 | TitleBarAlpha;
                            color2 = TitleColorHigh2 | TitleBarAlpha;
                        }

                        int titleX     = DockTitleX(dock);
                        int titleY     = DockTitleY(dock);
                        int backTitleX = DockBackTitleX(dock);
                        int backTitleY = DockBackTitleY(dock);
                        int titleW     = priv.TitleHitRect.Width;
                        int titleH     = priv.TitleHitRect.Height;
                        int backTitleW = priv.BackTitleHitRect.Width;
                        int backTitleH = priv.BackTitleHitRect.Height;

                        if (FadeOutByDistance)
                        {
                            LeftMostPosition   = Math.Min(titleX, LeftMostPosition);
                            RightMostPosition  = Math.Max(titleX, RightMostPosition);
                            TopMostPosition    = Math.Min(titleY, TopMostPosition);
                            BottomMostPosition = Math.Max(titleY, BottomMostPosition);
                        }

                        priv.TitleBodyVertexesUsed       = BuildFilledRectangle(priv.TitleBodyVertexes, priv.TitleBodyVertexesUsed, titleX, titleX + titleW, titleY, titleY + titleH, color1, color1, color2, color2);
                        priv.TitleBorderVertexesUsed     = BuildRectangle(priv.TitleBorderVertexes, priv.TitleBorderVertexesUsed, titleX, titleX + titleW, titleY, titleY + titleH, colorBorder);
                        priv.BackTitleBodyVertexesUsed   = BuildFilledRectangle(priv.BackTitleBodyVertexes, priv.BackTitleBodyVertexesUsed, backTitleX, backTitleX + backTitleW, backTitleY, backTitleY + backTitleH, color1, color1, color2, color2);
                        priv.BackTitleBorderVertexesUsed = BuildRectangle(priv.BackTitleBorderVertexes, priv.BackTitleBorderVertexesUsed, backTitleX, backTitleX + backTitleW, backTitleY, backTitleY + backTitleH, colorBorder);

                        switch (Orientation)
                        {
                        case eOrientation.BottomBorder:
                        case eOrientation.TopBorder:
                            xPos += priv.TitleHitRect.Width;
                            break;

                        case eOrientation.LeftBorder:
                        case eOrientation.RightBorder:
                            yPos += priv.TitleHitRect.Height;
                            break;
                        }
                    }
                }
            }

            /* first render dock content */
            lock (Docks)
            {
                foreach (Dock dock in Docks)
                {
                    if (dock.State != eDockState.Collapsed && dock.State != eDockState.Hidden)
                    {
                        dock.Render();
                    }
                }
            }

            /* later render dock border stuff */
            lock (Docks)
            {
                foreach (Dock dock in Docks)
                {
                    if (dock.State != eDockState.Hidden)
                    {
                        DockPanelPrivate priv = dock.Private;

                        if (priv.TitleBodyVertexesUsed - 2 > 0)
                        {
                            MainPlot.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, priv.TitleBodyVertexesUsed - 2, priv.TitleBodyVertexes);
                        }
                        if (priv.TitleBorderVertexesUsed > 0)
                        {
                            MainPlot.Device.DrawUserPrimitives(PrimitiveType.LineList, priv.TitleBorderVertexesUsed / 2, priv.TitleBorderVertexes);
                        }

                        /* back titles are not visible for collapsed docks */
                        if (dock.State != eDockState.Collapsed)
                        {
                            if (priv.BackTitleBodyVertexesUsed - 2 > 0)
                            {
                                MainPlot.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, priv.BackTitleBodyVertexesUsed - 2, priv.BackTitleBodyVertexes);
                            }
                            if (priv.BackTitleBorderVertexesUsed > 0)
                            {
                                MainPlot.Device.DrawUserPrimitives(PrimitiveType.LineList, priv.BackTitleBorderVertexesUsed / 2, priv.BackTitleBorderVertexes);
                            }
                        }

                        if (priv.TitleSprite == null)
                        {
                            priv.TitleSprite = new Sprite(MainPlot.Device);
                        }
                        priv.TitleSprite.Begin(SpriteFlags.AlphaBlend);

                        switch (Orientation)
                        {
                        case eOrientation.BottomBorder:
                        case eOrientation.TopBorder:
                            /* draw the text */
                            DisplayFont.DrawString(priv.TitleSprite, dock.Title, priv.TitleHitRect.X + BorderSpaceHor, priv.TitleHitRect.Y + BorderSpaceVert, (int)(TextColor | TitleBarAlpha));
                            break;

                        case eOrientation.LeftBorder:
                        case eOrientation.RightBorder:
                            /* rotate drawing sprite */
                            priv.TitleSprite.Transform = Matrix.RotationZ(-(float)Math.PI / 2);

                            /* draw the text */
                            DisplayFont.DrawString(priv.TitleSprite, dock.Title, -priv.TitleHitRect.Y - priv.TitleHitRect.Height + BorderSpaceHor, priv.TitleHitRect.X + BorderSpaceVert, (int)(TextColor | TitleBarAlpha));
                            break;
                        }

                        priv.TitleSprite.End();
                    }
                }
            }

            DocksChanged = docksChanged;
        }
Exemplo n.º 2
0
        public override bool ProcessInputEvent(InputEvent evt)
        {
            bool docksChanged = false;

            if (!HasDocks)
            {
                DocksChanged = false;
                return(false);
            }

            bool  defaultCursor = false;
            bool  handled       = false;
            Point mousePos      = evt.MousePosition;

            /* update alpha */
            if (FadeOutByDistance)
            {
                switch (evt.Type)
                {
                case eInputEventType.MouseLeave:
                    WantedTitleBarAlpha = 0;
                    docksChanged        = true;
                    break;

                case eInputEventType.MouseMoved:
                    double distance;

                    switch (Orientation)
                    {
                    case eOrientation.RightBorder:
                        distance = LeftMostPosition - mousePos.X;
                        break;

                    case eOrientation.LeftBorder:
                        distance = RightMostPosition - mousePos.X;
                        break;

                    case eOrientation.TopBorder:
                        distance = BottomMostPosition - mousePos.Y;
                        break;

                    case eOrientation.BottomBorder:
                        distance = TopMostPosition - mousePos.Y;
                        break;

                    default:
                        distance = 0;
                        break;
                    }

                    /* calculate alpha value by distance */
                    distance = Math.Min(1, (Math.Max(0, distance)) / FadeOutDistance);
                    double newAlpha = (1 - distance);

                    if (newAlpha != WantedTitleBarAlpha)
                    {
                        WantedTitleBarAlpha = newAlpha;
                        docksChanged        = true;
                    }
                    break;
                }
            }

            lock (Docks)
            {
                foreach (Dock dock in Docks)
                {
                    DockPanelPrivate priv = dock.Private;

                    if (priv.TitleHighlighted)
                    {
                        docksChanged = true;
                    }

                    priv.TitleHighlighted = false;

                    bool hoveringTitle     = (mousePos.X > priv.TitleHitRect.X && mousePos.X < priv.TitleHitRect.X + priv.TitleHitRect.Width) && (mousePos.Y > priv.TitleHitRect.Y && mousePos.Y < priv.TitleHitRect.Y + priv.TitleHitRect.Height);
                    bool hoveringBackTitle = (mousePos.X > priv.BackTitleHitRect.X && mousePos.X < priv.BackTitleHitRect.X + priv.BackTitleHitRect.Width) && (mousePos.Y > priv.BackTitleHitRect.Y && mousePos.Y < priv.BackTitleHitRect.Y + priv.BackTitleHitRect.Height);

                    /* check if hovering over title bar */
                    if (hoveringTitle || hoveringBackTitle)
                    {
                        //defaultCursor = true;
                        priv.TitleHighlighted = true;
                        docksChanged          = true;
                        handled = true;

                        /* in case of a click */
                        if (evt.Type == eInputEventType.MouseClick && evt.MouseButtons == MouseButtons.Left)
                        {
                            ToggleDock(dock);
                        }
                    }
                }
            }

            if (!handled)
            {
                lock (Docks)
                {
                    foreach (Dock dock in Docks)
                    {
                        switch (dock.State)
                        {
                        case eDockState.Expanded:
                        {
                            if (mousePos.X > dock.XPosition && mousePos.X < (dock.XPosition + dock.Width) &&
                                mousePos.Y > dock.YPosition && mousePos.Y < (dock.YPosition + dock.Height))
                            {
                                handled = dock.ProcessUserEvent(evt);

                                /* dock handled the event, also rerender now */
                                docksChanged |= handled;
                            }
                        }
                        break;

                        case eDockState.Expanding:
                        case eDockState.Collapsing:
                            docksChanged = true;
                            break;
                        }
                    }
                }
            }

            if (handled)
            {
                defaultCursor = true;
            }

            /* need to set default cursor? */
            if (defaultCursor)
            {
                /* do that, if not already done */
                if (!SetDefaultCursor)
                {
                    SetDefaultCursor = true;
                    MainPlot.CursorType(true);
                }
            }
            else if (SetDefaultCursor)
            {
                /* set before, but do not need anymore */
                MainPlot.CursorType(false);
                SetDefaultCursor = false;
            }

            DocksChanged = docksChanged;
            return(handled);
        }