Ejemplo n.º 1
0
        public Frame()
        {
            //init border to 1%
            Border.Exp = () => Size.Value * .01;
            Border.OnUpdate += MarkDirty;
            FlushBeforeUpdate(Border);

            ForeColor.Value = RGB.White;
            ForeColor.OnUpdate += MarkDirty;
            FlushBeforeUpdate(ForeColor);

            BorderColor.Value = RGB.Grey;
            BorderColor.OnUpdate += MarkDirty;
            FlushBeforeUpdate(BorderColor);

            BackColor.Value = RGB.Black;
            BackColor.OnUpdate += MarkDirty;
            FlushBeforeUpdate(BackColor);

            EdgeInterpolation.Value = Interpolation.Linear;
            EdgeInterpolation.OnUpdate += MarkDirty;
            FlushBeforeUpdate(EdgeInterpolation);

            TitleHeight.Exp = () => (int)(Size.Value.Y * .025);
            TitleHeight.OnUpdate += MarkDirty;
            FlushBeforeUpdate(TitleHeight);

            RoundEdges.Value = true;
            RoundEdges.OnUpdate += MarkDirty;
            FlushBeforeUpdate(RoundEdges);

            DisableNorthEdge.Value = false;
            DisableNorthEdge.OnUpdate += MarkDirty;
            FlushBeforeUpdate(DisableNorthEdge);

            DisableSouthEdge.Value = false;
            DisableSouthEdge.OnUpdate += MarkDirty;
            FlushBeforeUpdate(DisableSouthEdge);

            DisableWestEdge.Value = false;
            DisableWestEdge.OnUpdate += MarkDirty;
            FlushBeforeUpdate(DisableWestEdge);

            DisableEastEdge.Value = false;
            DisableEastEdge.OnUpdate += MarkDirty;
            FlushBeforeUpdate(DisableEastEdge);

            DisableTitle.Value = false;
            DisableTitle.OnUpdate += MarkDirty;
            FlushBeforeUpdate(DisableTitle);

            ResizeBorderMulti.Value = 1;

            DisableResize.Value = false;
            DisableMove.Value = false;

            Size.OnFilter += v =>
            {
                Point2D min = 0;
                if(!DisableNorthEdge.Value) min.Y += Border.Value.Y;
                if(!DisableSouthEdge.Value) min.Y += Border.Value.Y;
                if(!DisableWestEdge.Value) min.X += Border.Value.X;
                if(!DisableEastEdge.Value) min.X += Border.Value.X;
                if(!DisableTitle.Value) min.Y += TitleHeight.Value;
                return VectorUtil.Max(v, min);
            };

            //create title panel
            TitlePanel = new Panel();
            TitlePanel.DisableAutoReparent();
            TitlePanel.Parent.Value = this;
            //init color
            TitlePanel.Color.Exp = () => BorderColor.Value;
            //center in button
            TitlePanel.Position.Exp = () =>
            {
                Point2D vec = this.Position.Value;
                if(!DisableWestEdge.Value) vec.X += Border.Value.X / 2;
                if(!DisableNorthEdge.Value) vec.Y += Border.Value.Y / 2;
                return vec;
            };
            //reduce size by twice border
            TitlePanel.Size.Exp = () =>
            {
                Point2D vec;
                vec.X = this.Size.Value.X;
                if(!DisableWestEdge.Value) vec.X -= Border.Value.X / 2;
                if(!DisableEastEdge.Value) vec.X -= Border.Value.X / 2;
                vec.Y = TitleHeight.Value;
                return vec;
            };
            //slightly offset z coord
            TitlePanel.ZCoord.Exp = () => ZCoord.Value + .001;
            TitlePanel.Hidden.Value = true;

            //create content panel
            Content = new Panel();
            Content.DisableAutoReparent();
            Content.Parent.Value = this;
            //init color
            Content.Color.Exp = () => ForeColor.Value;
            //center in frame
            Content.Position.Exp = () =>
            {
                Point2D vec = this.Position.Value;
                if(!DisableWestEdge.Value) vec.X += Border.Value.X;
                if(!DisableNorthEdge.Value) vec.Y += Border.Value.Y;
                if(!DisableTitle.Value) vec.Y += TitleHeight.Value;
                return vec;
            };
            //reduce size by twice border
            Content.Size.Exp = () =>
            {
                Point2D vec = this.Size.Value;
                if(!DisableWestEdge.Value) vec.X -= Border.Value.X;
                if(!DisableEastEdge.Value) vec.X -= Border.Value.X;
                if(!DisableNorthEdge.Value) vec.Y -= Border.Value.Y;
                if(!DisableSouthEdge.Value) vec.Y -= Border.Value.Y;
                if(!DisableTitle.Value) vec.Y -= TitleHeight.Value;
                return vec;
            };
            //slightly offset z coord
            Content.ZCoord.Exp = () => ZCoord.Value + .001;
            Content.Hidden.Value = true;

            northSize.Exp = () => DisableNorthEdge.Value ? 0 : (int)(Border.Value.Y * ResizeBorderMulti.Value);
            southSize.Exp = () => DisableSouthEdge.Value ? 0 : (int)(Border.Value.Y * ResizeBorderMulti.Value);
            westSize.Exp = () => DisableWestEdge.Value ? 0 : (int)(Border.Value.X * ResizeBorderMulti.Value);
            eastSize.Exp = () => DisableEastEdge.Value ? 0 : (int)(Border.Value.X * ResizeBorderMulti.Value);

            //create all resizers
            //diagonals
            northWestZone = CreateCorner(true, true);
            southWestZone = CreateCorner(true, false);
            northEastZone = CreateCorner(false, true);
            southEastZone = CreateCorner(false, false);
            //edges
            westZone = CreateEdge(true, true);
            eastZone = CreateEdge(true, false);
            northZone = CreateEdge(false, true);
            southZone = CreateEdge(false, false);

            //create title mover
            Panel titleZone = new Panel();
            titleZone.Parent.Value = this;
            titleZone.Position.Exp = () =>
            {
                Point2D vec = Position.Value;
                vec.X += northWestZone.Size.Value.X;
                vec.Y += northZone.Size.Value.Y;
                return vec;
            };
            titleZone.Size.Exp = () =>
            {
                Point2D vec;
                vec.X = Size.Value.X - northEastZone.Size.Value.X - northWestZone.Size.Value.X;
                if(!DisableTitle.Value)
                {
                    vec.Y = TitleHeight.Value + Border.Value.Y - northZone.Size.Value.Y;
                }else
                {
                    vec.Y = 0;
                }
                return vec;
            };
            titleZone.Opaque.Value = false;
            titleZone.Hidden.Value = true;
            titleZone.InputHidden.Value = false;
            bool isDragging = false;
            titleZone.OnMousePress += button =>
            {
                if(button == MouseButton.LEFT)
                {
                    isDragging = true;
                    Grab();
                }
            };
            titleZone.OnMouseRelease += button =>
            {
                if(button == MouseButton.LEFT)
                {
                    isDragging = false;
                    Drop();
                }
            };
            titleZone.OnMouseMove += (coords, delta) =>
            {
                if(!DisableMove.Value && isDragging)
                {
                    Position.Value += delta;
                    if(OnMove != null) OnMove();
                }
            };
        }
Ejemplo n.º 2
0
        public Button()
        {
            //init border to 5%
            Border.Exp = () => Size.Value * .05;
            Border.OnUpdate += MarkDirty;
            FlushBeforeUpdate(Border);

            ForeColor.Value = RGB.White;
            ForeColor.OnUpdate += MarkDirty;
            FlushBeforeUpdate(ForeColor);

            BackColor.Value = RGB.Black;
            BackColor.OnUpdate += MarkDirty;
            FlushBeforeUpdate(BackColor);

            //init hover color to average of fore and back
            HoverColor.Exp = () => (ForeColor.Value / 2) + (BackColor.Value / 2);
            HoverColor.OnUpdate += MarkDirty;
            FlushBeforeUpdate(HoverColor);

            EdgeInterpolation.Value = Interpolation.Linear;
            EdgeInterpolation.OnUpdate += MarkDirty;
            FlushBeforeUpdate(EdgeInterpolation);

            //create content panel
            Content = new Panel();
            Content.DisableAutoReparent();
            Content.Parent.Value = this;
            //init color
            Content.Color.Exp = () => ForeColor.Value;
            //center in button
            Content.Position.Exp = () =>
            {
                Point2D vec = Position.Value;
                vec += Size.Value / 2;
                vec -= Content.Size.Value / 2;
                return vec;
            };
            //reduce size by twice border
            Content.Size.Exp = () =>
            {
                Point2D vec = Size.Value;
                vec -= Border.Value * 2;
                return vec;
            };
            //slightly offset z coord
            Content.ZCoord.Exp = () => ZCoord.Value + .001;
            Content.Hidden.Value = true;

            //re-render when content color changes
            Content.Color.OnUpdate += MarkDirty;

            OnMouseEnter += () =>
            {
                if(!DisableHoverColor)
                {
                    Hovered = true;
                    Content.Color.Exp = () => HoverColor.Value;
                }
            };
            OnMouseExit += () =>
            {
                Hovered = false;
                Content.Color.Exp = () => ForeColor.Value;
            };
        }