示例#1
0
        /// <summary>
        /// Create an auto-layout horizontal slider that user can drag to select a value.
        /// </summary>
        /// <param name="label">label of the slider</param>
        /// <param name="value">The value the slider shows.</param>
        /// <param name="minValue">The value at the left end of the slider.</param>
        /// <param name="maxValue">The value at the right end of the slider.</param>
        /// <returns>The value set by the user.</returns>
        /// <remarks>minValue &lt;= value &lt;= maxValue</remarks>
        public static double Slider(string label, double value, double minValue, double maxValue)
        {
            GUIContext g      = GetCurrentContext();
            Window     window = GetCurrentWindow();

            if (window.SkipItems)
            {
                return(value);
            }

            var id = window.GetID(label);

            // style apply
            var style = GUIStyle.Basic;

            // rect
            Size size = style.CalcSize(label, GUIState.Normal);

            style.PushStretchFactor(false, 1);//+1
            {
                var minSilderWidth = 200;
                size.Width += minSilderWidth;
                size.Height = 20;
            }
            var rect = window.GetRect(id);

            // interact
            var spacing     = GUISkin.Instance.InternalStyle.Get <double>(GUIStyleName._ControlLabelSpacing);
            var labelWidth  = GUISkin.Instance.InternalStyle.Get <double>(GUIStyleName._LabelWidth);
            var sliderWidth = rect.Width - spacing - labelWidth;

            if (sliderWidth <= 0)
            {
                sliderWidth = 1;
            }
            var sliderRect = new Rect(rect.X, rect.Y,
                                      sliderWidth,
                                      rect.Height);
            bool hovered, held;

            value = GUIBehavior.SliderBehavior(sliderRect, id, true, value, minValue, maxValue, out hovered, out held);

            // render
            var state = GUIState.Normal;

            if (hovered)
            {
                state = GUIState.Hover;
            }
            if (g.ActiveId == id && Mouse.Instance.LeftButtonState == KeyState.Down)
            {
                state = GUIState.Active;
            }
            GUIAppearance.DrawSlider(rect, label, value, minValue, maxValue, state, sliderRect, labelWidth);

            // style restore
            style.PopStyle();//-1

            return(value);
        }
示例#2
0
        /// <summary>
        /// Create a horizontal slider that user can drag to select a value.
        /// </summary>
        /// <param name="rect">position and size of the control</param>
        /// <param name="label">label</param>
        /// <param name="value">The value the slider shows.</param>
        /// <param name="minValue">The value at the top end of the slider.</param>
        /// <param name="maxValue">The value at the bottom end of the slider.</param>
        /// <returns>The value set by the user.</returns>
        /// <remarks>minValue &lt;= value &lt;= maxValue</remarks>
        public static double Slider(Rect rect, string label, double value, double minValue, double maxValue)
        {
            var g      = GetCurrentContext();
            var window = GetCurrentWindow();

            if (window.SkipItems)
            {
                return(0);
            }

            //get or create the root node
            var id        = window.GetID(label);
            var container = window.AbsoluteVisualList;
            var node      = (Node)container.Find(visual => visual.Id == id);
            var text      = Utility.FindRenderedText(label);

            if (node == null)
            {
                node = new Node(id, $"Slider<{label}>");
                container.Add(node);
                node.UseBoxModel = true;
                node.RuleSet.Replace(GUISkin.Current[GUIControlName.Slider]);
            }

            node.ActiveSelf = true;

            // rect
            node.Rect = window.GetRect(rect);

            // interact
            var spacing     = node.RuleSet.Get <double>("ControlLabelSpacing");
            var labelWidth  = node.RuleSet.Get <double>("LabelWidth");
            var sliderWidth = rect.Width - spacing - labelWidth;

            if (sliderWidth <= 0)
            {
                sliderWidth = 1;
            }
            var sliderRect = new Rect(node.Rect.X, node.Rect.Y,
                                      sliderWidth,
                                      node.Rect.Height);
            bool hovered, held;

            value = GUIBehavior.SliderBehavior(sliderRect, id, true, value, minValue, maxValue, out hovered, out held);

            // render
            var state = GUIState.Normal;

            if (hovered)
            {
                state = GUIState.Hover;
            }
            if (g.ActiveId == id && Mouse.Instance.LeftButtonState == KeyState.Down)
            {
                state = GUIState.Active;
            }
            GUIAppearance.DrawSlider(node, text, value, minValue, maxValue, state, sliderRect, labelWidth);

            return(value);
        }
示例#3
0
        /// <summary>
        /// Create a horizontal slider that user can drag to select a value.
        /// </summary>
        /// <param name="rect">position and size of the control</param>
        /// <param name="label">label</param>
        /// <param name="value">The value the slider shows.</param>
        /// <param name="minValue">The value at the top end of the slider.</param>
        /// <param name="maxValue">The value at the bottom end of the slider.</param>
        /// <returns>The value set by the user.</returns>
        /// <remarks>minValue &lt;= value &lt;= maxValue</remarks>
        public static double Slider(Rect rect, string label, double value, double minValue, double maxValue)
        {
            GUIContext g      = GetCurrentContext();
            Window     window = GetCurrentWindow();

            if (window.SkipItems)
            {
                return(value);
            }

            int id = window.GetID(label);

            // rect
            rect = window.GetRect(rect);

            // interact
            var spacing     = GUISkin.Instance.InternalStyle.Get <double>(GUIStyleName._ControlLabelSpacing);
            var labelWidth  = GUISkin.Instance.InternalStyle.Get <double>(GUIStyleName._LabelWidth);
            var sliderWidth = rect.Width - spacing - labelWidth;

            if (sliderWidth <= 0)
            {
                sliderWidth = 1;
            }
            var sliderRect = new Rect(rect.X, rect.Y,
                                      sliderWidth,
                                      rect.Height);
            bool hovered, held;

            value = GUIBehavior.SliderBehavior(sliderRect, id, true, value, minValue, maxValue, out hovered, out held);

            // render
            var state = GUIState.Normal;

            if (hovered)
            {
                state = GUIState.Hover;
            }
            if (g.ActiveId == id && Mouse.Instance.LeftButtonState == KeyState.Down)
            {
                state = GUIState.Active;
            }
            GUIAppearance.DrawSlider(rect, label, value, minValue, maxValue, state, sliderRect, labelWidth);

            return(value);
        }
示例#4
0
        public static Color ColorField(string label, Color value)
        {
            Window window = GetCurrentWindow();

            if (window.SkipItems)
            {
                return(value);
            }

            var style = GUIStyle.Basic;

            var id = window.GetID(label);

            // rect

            int rId;
            int gId;
            int bId;
            int aId;
            int colorId;

            Rect rectR, rectG, rectB, rectA, rectColor;

            var labelHeight = style.CalcSize(label, GUIState.Normal).Height;

            BeginHorizontal("FieldGroup~" + id);
            {
                {
                    using (HScope("#RGBA&Color", GUILayout.ExpandWidth(true)))
                    {
                        using (VScope(label + "#RGBA"))
                        {
                            using (HScope("#RGB"))
                            {
                                PushHStretchFactor(1);
                                rId   = window.GetID("#R");
                                gId   = window.GetID("#G");
                                bId   = window.GetID("#B");
                                rectR = window.GetRect(rId, (0, labelHeight));
                                rectG = window.GetRect(gId, (0, labelHeight));
                                rectB = window.GetRect(bId, (0, labelHeight));
                                PopStyleVar(1);
                            }

                            aId   = window.GetID("#A");
                            rectA = window.GetRect(aId, (0, labelHeight * 0.25), GUILayout.ExpandWidth(true));
                        }
                        colorId   = window.GetID("#Color");
                        rectColor = window.GetRect(colorId, (labelHeight * 1.25f, labelHeight * 1.25f));
                    }

                    // interact
                    value.R = GUIBehavior.SliderBehavior(rectR, rId, true, value.R, 0, 1.0, out bool R_hovered, out bool R_held);
                    value.G = GUIBehavior.SliderBehavior(rectG, gId, true, value.G, 0, 1.0, out bool G_hovered, out bool G_held);
                    value.B = GUIBehavior.SliderBehavior(rectB, bId, true, value.B, 0, 1.0, out bool B_hovered, out bool B_held);
                    value.A = GUIBehavior.SliderBehavior(rectA, aId, true, value.A, 0, 1.0, out bool A_hovered, out bool A_held);

                    // render
                    var d = window.DrawList;
                    DrawColorDragButton(d, rectR, rId, 'R', value.R, (R_hovered && R_held) ? GUIState.Active : R_hovered?GUIState.Hover: GUIState.Normal);
                    DrawColorDragButton(d, rectG, gId, 'G', value.G, (G_hovered && G_held) ? GUIState.Active : G_hovered?GUIState.Hover: GUIState.Normal);
                    DrawColorDragButton(d, rectB, bId, 'B', value.B, (B_hovered && B_held) ? GUIState.Active : B_hovered?GUIState.Hover: GUIState.Normal);

                    GUIAppearance.DrawProgressBar(rectA, value.A);

                    d.AddRectFilled(rectColor, value);
                }

                Space("FieldSpacing", GUISkin.Current.FieldSpacing);
                Label(label, GUILayout.Width((int)GUISkin.Current.LabelWidth));
            }
            EndHorizontal();

            return(value);
        }
示例#5
0
文件: Slider.cs 项目: zwcloud/ImGui
        /// <summary>
        /// Create an auto-layout vertical slider that user can drag to select a value.
        /// </summary>
        /// <param name="label">label of the slider</param>
        /// <param name="value">The value the slider shows.</param>
        /// <param name="minValue">The value at the top end of the slider.</param>
        /// <param name="maxValue">The value at the bottom end of the slider.</param>
        /// <returns>The value set by the user.</returns>
        /// <remarks>minValue &lt;= value &lt;= maxValue</remarks>
        public static double VSlider(string label, double value, double minValue, double maxValue)
        {
            var g      = GetCurrentContext();
            var window = GetCurrentWindow();

            if (window.SkipItems)
            {
                return(0);
            }

            //get or create the root node
            var id        = window.GetID(label);
            var container = window.RenderTree.CurrentContainer;
            var node      = container.GetNodeById(id);
            var text      = Utility.FindRenderedText(label);

            if (node == null)
            {
                node             = new Node(id, $"Slider<{label}>");
                node.UseBoxModel = true;
                node.RuleSet.Replace(GUISkin.Current[GUIControlName.Slider]);
                var size            = node.RuleSet.CalcContentBoxSize(text, GUIState.Normal);
                var minSilderHeight = 200;
                size.Width   = 20;
                size.Height += minSilderHeight;
                node.AttachLayoutEntry(size);
            }
            container.AppendChild(node);
            node.ActiveSelf = true;

            // rect
            node.Rect = window.GetRect(id);

            // interact
            var spacing      = node.RuleSet.Get <double>("ControlLabelSpacing");
            var labelHeight  = node.RuleSet.Get <double>("LabelHeight");
            var sliderHeight = node.Rect.Height - spacing - labelHeight;

            if (sliderHeight <= 0)
            {
                sliderHeight = 1;
            }
            var sliderRect = new Rect(node.Rect.Location, node.Rect.Width, sliderHeight);

            value = GUIBehavior.SliderBehavior(sliderRect, id, false, value, minValue, maxValue, out var hovered, out var held);

            var state = GUI.Normal;

            if (hovered)
            {
                state = GUI.Hover;
            }
            if (g.ActiveId == id && Mouse.Instance.LeftButtonState == KeyState.Down)
            {
                state = GUI.Active;
            }

            // last item state
            window.TempData.LastItemState = node.State;

            // render
            GUIAppearance.DrawVSlider(node, label, value, minValue, maxValue, state, sliderRect, labelHeight);

            return(value);
        }
示例#6
0
        public static Color ColorField(string label, Color value)
        {
            var window = GetCurrentWindow();

            if (window.SkipItems)
            {
                return(value);
            }

            // rect
            var text     = Utility.FindRenderedText(label);
            var textSize = GUISkin.Current[GUIControlName.ColorField].CalcContentBoxSize(text, GUIState.Normal);

            BeginHorizontal(label, GUILayout.Height(textSize.Height).ExpandWidth(true));
            {
                int  rId, gId, bId, aId, colorId;
                Rect rectR, rectG, rectB, rectA, rectColor;
                using (HScope("#RGBA&Color", GUILayout.ExpandHeight(true).ExpandWidth(true)))
                {
                    using (VScope(label + "#RGBA", GUILayout.ExpandHeight(true).ExpandWidth(true)))
                    {
                        using (HScope("#RGB", GUILayout.ExpandHeight(true).ExpandWidth(true)))
                        {
                            rId = window.GetID("#R");
                            var rNode = window.RenderTree.CurrentContainer.GetNodeById(rId);
                            if (rNode == null)
                            {
                                rNode = new Node(rId, "#R");
                                rNode.AttachLayoutEntry();
                                rNode.RuleSet.ApplyOptions(GUILayout.ExpandHeight(true).ExpandWidth(true));
                            }
                            window.RenderTree.CurrentContainer.AppendChild(rNode);
                            rNode.ActiveSelf = true;

                            gId = window.GetID("#G");
                            var gNode = window.RenderTree.CurrentContainer.GetNodeById(gId);
                            if (gNode == null)
                            {
                                gNode = new Node(gId, "#G");
                                gNode.AttachLayoutEntry();
                                gNode.RuleSet.ApplyOptions(GUILayout.ExpandHeight(true).ExpandWidth(true));
                            }
                            window.RenderTree.CurrentContainer.AppendChild(gNode);
                            gNode.ActiveSelf = true;

                            bId = window.GetID("#B");
                            var bNode = window.RenderTree.CurrentContainer.GetNodeById(bId);
                            if (bNode == null)
                            {
                                bNode = new Node(bId, "#B");
                                bNode.AttachLayoutEntry();
                                bNode.RuleSet.ApplyOptions(GUILayout.ExpandHeight(true).ExpandWidth(true));
                            }
                            window.RenderTree.CurrentContainer.AppendChild(bNode);
                            bNode.ActiveSelf = true;

                            rectR = window.GetRect(rId);
                            rectG = window.GetRect(gId);
                            rectB = window.GetRect(bId);
                        }

                        aId = window.GetID("#A");
                        var aNode = window.RenderTree.CurrentContainer.GetNodeById(aId);
                        if (aNode == null)
                        {
                            aNode = new Node(aId, "#A");
                            aNode.AttachLayoutEntry();
                            aNode.RuleSet.ApplyOptions(GUILayout.ExpandHeight(true).ExpandWidth(true));
                        }
                        window.RenderTree.CurrentContainer.AppendChild(aNode);
                        aNode.ActiveSelf = true;
                        rectA            = window.GetRect(aId);
                    }
                    colorId = window.GetID("#Color");
                    var colorNode = window.RenderTree.CurrentContainer.GetNodeById(colorId);
                    if (colorNode == null)
                    {
                        colorNode = new Node(colorId, "#Color");
                        colorNode.AttachLayoutEntry();
                        colorNode.RuleSet.ApplyOptions(GUILayout.ExpandHeight(true).ExpandWidth(true));
                    }
                    window.RenderTree.CurrentContainer.AppendChild(colorNode);
                    colorNode.ActiveSelf = true;
                    rectColor            = window.GetRect(colorId);
                }

                // interact
                value.R = GUIBehavior.SliderBehavior(rectR, rId, true, value.R, 0, 1.0, out bool R_hovered, out bool R_held);
                value.G = GUIBehavior.SliderBehavior(rectG, gId, true, value.G, 0, 1.0, out bool G_hovered, out bool G_held);
                value.B = GUIBehavior.SliderBehavior(rectB, bId, true, value.B, 0, 1.0, out bool B_hovered, out bool B_held);
                value.A = GUIBehavior.SliderBehavior(rectA, aId, true, value.A, 0, 1.0, out bool A_hovered, out bool A_held);

                // render
                var node = window.RenderTree.CurrentContainer;
                using (var d = node.RenderOpen())
                {
                    DrawColorDragButton(d, node.RuleSet, rectR, rId, 'R', value.R, (R_hovered && R_held) ? GUIState.Active : R_hovered?GUIState.Hover: GUIState.Normal);
                    DrawColorDragButton(d, node.RuleSet, rectG, gId, 'G', value.G, (G_hovered && G_held) ? GUIState.Active : G_hovered?GUIState.Hover: GUIState.Normal);
                    DrawColorDragButton(d, node.RuleSet, rectB, bId, 'B', value.B, (B_hovered && B_held) ? GUIState.Active : B_hovered?GUIState.Hover: GUIState.Normal);

                    var fillWidth = rectA.Width * value.A;
                    var fillRect  = new Rect(rectA.X, rectA.Y, fillWidth, rectA.Height);
                    //d.DrawRectangle(new Brush(new Color(0.80f, 0.80f, 0.80f, 0.30f)), null, node.Rect);
                    d.DrawRectangle(new Brush(new Color(0.90f, 0.70f, 0.00f, 1.00f)), null, fillRect);
                    d.DrawRectangle(new Brush(value), null, rectColor);
                }

                Space("FieldSpacing", node.RuleSet.Get <double>("ControlLabelSpacing"));
                Label(label, GUILayout.Width((int)node.RuleSet.Get <double>("LabelWidth")));
            }
            EndHorizontal();

            return(value);
        }