/// <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 <= value <= 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); }
/// <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 <= value <= 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); }
/// <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 <= value <= 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); }
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); }
/// <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 <= value <= 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); }
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); }