예제 #1
0
        public static float ByStyle(this float f, ToStringStyle style)
        {
            float value;

            switch (style)
            {
            case ToStringStyle.Integer:
                value = (float)Mathf.RoundToInt(f);
                break;

            case ToStringStyle.PercentZero:
            case ToStringStyle.PercentOne:
            case ToStringStyle.PercentTwo:
                value = f.ToPercent();
                break;

            case ToStringStyle.WorkAmount:
                value = Mathf.CeilToInt(f / 60f);
                break;

            //case ToStringStyle.Temperature:
            //case ToStringStyle.TemperatureOffset:
            default:
                value = f;
                break;
            }

            return(value);
        }
예제 #2
0
        public static void FloatRange(this Listing_Standard ls, string label, ref FloatRange range, float min = 0f,
                                      float max = 1f, string tooltip = null, ToStringStyle valueStyle = ToStringStyle.FloatTwo)
        {
            var rect  = ls.GetRect(Text.LineHeight);
            var rect2 = rect.LeftPart(.70f).Rounded();
            var rect3 = rect.RightPart(.30f).Rounded().LeftPart(.9f).Rounded();

            rect3.yMin -= 5f;
            //Rect rect4 = rect.RightPart(.10f).Rounded();

            var anchor = Text.Anchor;

            Text.Anchor = TextAnchor.MiddleLeft;
            Widgets.Label(rect2, label);

            Text.Anchor = TextAnchor.MiddleRight;
            var id = ls.CurHeight.GetHashCode();

            Widgets.FloatRange(rect3, id, ref range, min, max, null, valueStyle);
            if (!tooltip.NullOrEmpty())
            {
                TooltipHandler.TipRegion(rect, tooltip);
            }

            Text.Anchor = anchor;
            ls.Gap(ls.verticalSpacing);
        }
예제 #3
0
        public string ModifierChangeString(ToStringStyle toStringStyle = ToStringStyle.FloatTwoOrThree)
        {
            string str = "";

            if (preMinValue != -9999999f)
            {
                str += string.Format("{0}={1} ", "min".Translate(), preMinValue.ToStringByStyle(toStringStyle, ToStringNumberSense.Absolute));
            }
            if (setValue != null)
            {
                str += string.Format("={0} ", ((float)setValue).ToStringByStyle(toStringStyle, ToStringNumberSense.Absolute));
            }
            if (addValue != 0)
            {
                str += string.Format("{0} ", addValue.ToStringByStyle(toStringStyle, ToStringNumberSense.Offset));
            }
            if (multiplier != 1)
            {
                str += string.Format("{0} ", multiplier.ToStringByStyle(toStringStyle, ToStringNumberSense.Factor));
            }
            if (minValue != -9999999f)
            {
                str += string.Format("{0}={1} ", "min".Translate(), minValue.ToStringByStyle(toStringStyle, ToStringNumberSense.Absolute));
            }
            if (maxValue != 9999999f)
            {
                str += string.Format("{0}={1} ", "max".Translate(), maxValue.ToStringByStyle(toStringStyle, ToStringNumberSense.Absolute));
            }

            return(str.TrimEnd());
        }
 protected FilterRange(string saveLabel, Func <FilterRange, string> widgetLabel, Func <FilterRange, string> menuLabel, ToStringStyle toStringStyle, float min, float max,
                       Func <FilterRange, Thing, bool> isAllowed)
 {
     this.saveLabel     = saveLabel;
     this.widgetLabel   = widgetLabel;
     this.menuLabel     = menuLabel;
     this.toStringStyle = toStringStyle;
     this.min           = min;
     this.max           = max;
     this.isAllowed     = isAllowed;
     inner = new FloatRange(min, max);
 }
예제 #5
0
        /// <summary>
        /// Creates and returns a string that contains all resources and their equipment in a predefined format.
        /// </summary>
        /// <param name="style">The style determining how the output will look like.</param>
        /// <returns></returns>
        public string ToString(ToStringStyle style)
        {
            switch (style)
            {
            case ToStringStyle.ThreeLinesPerResource:
                return(ToString(ThreeLinesFormatString, null));

            case ToStringStyle.SingleLine:
            default:
                return(ToString(SingleLineFormatString, null));
            }
        }
예제 #6
0
        public static void FloatRange(
            Rect canvas,
            int id,
            ref FloatRange range,
            FloatRange sliderRange,
            ToStringStyle valueStyle = ToStringStyle.FloatTwo,
            string labelKey          = null)
        {
            // margin
            canvas.xMin += 8f;
            canvas.xMax -= 8f;

            // label
            var mainColor = GUI.color;

            GUI.color = new Color(0.4f, 0.4f, 0.4f);
            var text = range.min.ToStringByStyle(valueStyle) + " - " + range.max.ToStringByStyle(valueStyle);

            if (labelKey != null)
            {
                text = labelKey.Translate(text);
            }

            Text.Font = GameFont.Tiny;
            var labelRect = new Rect(canvas.x, canvas.y, canvas.width, 19f);

            Text.Anchor = TextAnchor.UpperCenter;
            Widgets.Label(labelRect, text);
            Text.Anchor = TextAnchor.UpperLeft;

            // background line
            var sliderRect = new Rect(canvas.x, labelRect.yMax, canvas.width, 2f);

            GUI.DrawTexture(sliderRect, BaseContent.WhiteTex);
            GUI.color = mainColor;

            // slider handle positions
            var pxPerUnit    = sliderRect.width / sliderRange.Span;
            var minHandlePos = sliderRect.xMin + ((range.min - sliderRange.min) * pxPerUnit);
            var maxHandlePos = sliderRect.xMin + ((range.max - sliderRange.min) * pxPerUnit);

            // draw handles
            var minHandleRect = new Rect(minHandlePos - 16f, sliderRect.center.y - 8f, 16f, 16f);

            GUI.DrawTexture(minHandleRect, OutfitterTextures.FloatRangeSliderTex);
            var maxHandleRect = new Rect(maxHandlePos + 16f, sliderRect.center.y - 8f, -16f, 16f);

            GUI.DrawTexture(maxHandleRect, OutfitterTextures.FloatRangeSliderTex);

            // interactions
            var interactionRect = canvas;

            interactionRect.xMin -= 8f;
            interactionRect.xMax += 8f;
            var dragging = false;

            if (Mouse.IsOver(interactionRect) || _draggingId == id)
            {
                if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
                {
                    _draggingId = id;
                    var x = Event.current.mousePosition.x;
                    if (x < minHandleRect.xMax)
                    {
                        _draggingHandle = Handle.Min;
                    }
                    else if (x > maxHandleRect.xMin)
                    {
                        _draggingHandle = Handle.Max;
                    }
                    else
                    {
                        var distToMin = Mathf.Abs(x - minHandleRect.xMax);
                        var distToMax = Mathf.Abs(x - (maxHandleRect.x - 16f));
                        _draggingHandle = distToMin >= distToMax ? Handle.Max : Handle.Min;
                    }

                    dragging = true;
                    Event.current.Use();
                }

                if (dragging || _draggingHandle != Handle.None && Event.current.type == EventType.MouseDrag)
                {
                    // NOTE: this deviates from vanilla, vanilla seemed to assume that max == span?
                    var curPosValue = ((Event.current.mousePosition.x - canvas.x) / canvas.width * sliderRange.Span)
                                      + sliderRange.min;
                    curPosValue = Mathf.Clamp(curPosValue, sliderRange.min, sliderRange.max);
                    if (_draggingHandle == Handle.Min)
                    {
                        range.min = curPosValue;
                        if (range.max < range.min)
                        {
                            range.max = range.min;
                        }
                    }
                    else if (_draggingHandle == Handle.Max)
                    {
                        range.max = curPosValue;
                        if (range.min > range.max)
                        {
                            range.min = range.max;
                        }
                    }

                    Event.current.Use();
                }
            }

            if (_draggingHandle == Handle.None || Event.current.type != EventType.MouseUp)
            {
                return;
            }

            _draggingId     = 0;
            _draggingHandle = Handle.None;
            Event.current.Use();
        }
예제 #7
0
 public static float?ByStyle(this float?f, ToStringStyle style)
 {
     return(f?.ByStyle(style));
 }
예제 #8
0
        // Token: 0x06000029 RID: 41 RVA: 0x00003844 File Offset: 0x00001A44
        public static void FloatRange(this Listing_Standard ls, string label, ref FloatRange range, float min = 0f, float max = 1f, string tooltip = null, ToStringStyle valueStyle = ToStringStyle.FloatTwo)
        {
            Rect rect  = ls.GetRect(Text.LineHeight);
            Rect rect2 = GenUI.Rounded(GenUI.LeftPart(rect, 0.7f));
            Rect rect3 = GenUI.Rounded(GenUI.LeftPart(GenUI.Rounded(GenUI.RightPart(rect, 0.3f)), 0.9f));

            rect3.yMin -= 5f;
            TextAnchor anchor = Text.Anchor;

            Text.Anchor = TextAnchor.MiddleLeft;
            Widgets.Label(rect2, label);
            Text.Anchor = TextAnchor.MiddleRight;
            int hashCode = ls.CurHeight.GetHashCode();

            Widgets.FloatRange(rect3, hashCode, ref range, min, max, null, valueStyle);
            if (!GenText.NullOrEmpty(tooltip))
            {
                TooltipHandler.TipRegion(rect, tooltip);
            }
            Text.Anchor = anchor;
            ls.Gap(ls.verticalSpacing);
        }
예제 #9
0
        public static string ToStringByStyle(this float f, ToStringStyle style, ToStringNumberSense numberSense = ToStringNumberSense.Absolute)
        {
            if (style == ToStringStyle.Temperature && numberSense == ToStringNumberSense.Offset)
            {
                style = ToStringStyle.TemperatureOffset;
            }
            if (numberSense == ToStringNumberSense.Factor)
            {
                if (f >= 10f)
                {
                    style = ToStringStyle.FloatMaxTwo;
                }
                else
                {
                    style = ToStringStyle.PercentZero;
                }
            }
            string text;

            switch (style)
            {
            case ToStringStyle.Integer:
                text = Mathf.RoundToInt(f).ToString();
                break;

            case ToStringStyle.FloatOne:
                text = f.ToString("F1");
                break;

            case ToStringStyle.FloatTwo:
                text = f.ToString("F2");
                break;

            case ToStringStyle.FloatThree:
                text = f.ToString("F3");
                break;

            case ToStringStyle.FloatMaxOne:
                text = f.ToString("0.#");
                break;

            case ToStringStyle.FloatMaxTwo:
                text = f.ToString("0.##");
                break;

            case ToStringStyle.FloatMaxThree:
                text = f.ToString("0.###");
                break;

            case ToStringStyle.FloatTwoOrThree:
                text = f.ToString((f != 0f && Mathf.Abs(f) < 0.01f) ? "F3" : "F2");
                break;

            case ToStringStyle.PercentZero:
                text = f.ToStringPercent();
                break;

            case ToStringStyle.PercentOne:
                text = f.ToStringPercent("F1");
                break;

            case ToStringStyle.PercentTwo:
                text = f.ToStringPercent("F2");
                break;

            case ToStringStyle.Temperature:
                text = f.ToStringTemperature("F1");
                break;

            case ToStringStyle.TemperatureOffset:
                text = f.ToStringTemperatureOffset("F1");
                break;

            case ToStringStyle.WorkAmount:
                text = f.ToStringWorkAmount();
                break;

            default:
                Log.Error("Unknown ToStringStyle " + style, false);
                text = f.ToString();
                break;
            }
            if (numberSense == ToStringNumberSense.Offset)
            {
                if (f >= 0f)
                {
                    text = "+" + text;
                }
            }
            else if (numberSense == ToStringNumberSense.Factor)
            {
                text = "x" + text;
            }
            return(text);
        }
예제 #10
0
        private static void DrawCustomDifficultySlider(Listing_Standard listing, string optionName, ref float value, ToStringStyle style, ToStringNumberSense numberSense, float min, float max, float precision = 0.01f, bool reciprocate = false, float reciprocalCutoff = 1000f)
        {
            string str  = (reciprocate ? "_Inverted" : "");
            string str2 = optionName.CapitalizeFirst();
            string key  = "Difficulty_" + str2 + str + "_Label";
            string key2 = "Difficulty_" + str2 + str + "_Info";
            float  num  = value;

            if (reciprocate)
            {
                num = Reciprocal(num, reciprocalCutoff);
            }
            TaggedString label = key.Translate() + ": " + num.ToStringByStyle(style, numberSense);

            listing.Label(label, -1f, key2.Translate());
            float num2 = listing.Slider(num, min, max);

            if (num2 != num)
            {
                num = GenMath.RoundTo(num2, precision);
            }
            if (reciprocate)
            {
                num = Reciprocal(num, reciprocalCutoff);
            }
            value = num;
        }
		public static void NonlinearRangeSlider(Rect rect, int id, ref FloatRange range, string labelKey = null, ToStringStyle valueStyle = ToStringStyle.FloatTwo)
		{
			Rect rect2 = rect;
			rect2.xMin += 8f;
			rect2.xMax -= 8f;
			GUI.color = RangeControlTextColor;
			string text = $"${range.min.ToStringByStyle(valueStyle)} - " + ( range.max > max ? infinity : $"${range.max.ToStringByStyle(valueStyle)}");
			if (labelKey != null)
			{
				text = text + " " + labelKey;
			}
			GameFont font = Text.Font;
			Text.Font = GameFont.Tiny;
			Text.Anchor = TextAnchor.UpperCenter;
			Widgets.Label(rect2, text);
			Text.Anchor = TextAnchor.UpperLeft;
			Rect position = new Rect(rect2.x, rect2.yMax - 8f - 1f, rect2.width, 2f);
			GUI.DrawTexture(position, BaseContent.WhiteTex);
			GUI.color = Color.white;

			float minSliderPos = rect2.x + (rect2.width * SliderPosForValue(range.min));
			float maxSliderPos = rect2.x + (rect2.width * Mathf.Clamp01(SliderPosForValue(range.max)));
			Rect position2 = new Rect(minSliderPos - 16f, position.center.y - 8f, 16f, 16f);
			GUI.DrawTexture(position2, FloatRangeSliderTex);
			Rect position3 = new Rect(maxSliderPos + 16f, position.center.y - 8f, -16f, 16f);
			GUI.DrawTexture(position3, FloatRangeSliderTex);
			if (curDragEnd != RangeEnd.None && (Event.current.type == EventType.MouseUp || Event.current.rawType == EventType.MouseDown))
			{
				draggingIdInfo.SetValue(null, 0);
				curDragEnd = RangeEnd.None;
				SoundDefOf.DragSlider.PlayOneShotOnCamera();
			}
			bool flag = false;
			if (Mouse.IsOver(rect) || draggingIdGet() == id)
			{
				if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && id != draggingIdGet())
				{
					draggingIdInfo.SetValue(null, id);
					float x = Event.current.mousePosition.x;
					if (x < position2.xMax)
					{
						curDragEnd = RangeEnd.Min;
					}
					else if (x > position3.xMin)
					{
						curDragEnd = RangeEnd.Max;
					}
					else
					{
						float num3 = Mathf.Abs(x - position2.xMax);
						float num4 = Mathf.Abs(x - (position3.x - 16f));
						curDragEnd = ((num3 >= num4) ? RangeEnd.Max : RangeEnd.Min);
					}
					flag = true;
					Event.current.Use();
					SoundDefOf.DragSlider.PlayOneShotOnCamera();
				}
				if (flag || (curDragEnd != RangeEnd.None && Event.current.type == EventType.MouseDrag))
				{
					float sliderValue = ValueForSliderPos((Event.current.mousePosition.x - rect2.x) / rect2.width);
					sliderValue = RoundToSignificantDigits(sliderValue, 2);
					sliderValue = Mathf.Clamp(sliderValue, 0f, max);
					if (curDragEnd == RangeEnd.Min)
					{
						if (sliderValue != range.min)
						{
							range.min = sliderValue;
							if (range.max < range.min)
							{
								range.max = range.min;
							}
							CheckPlayDragSliderSound();
						}
					}
					else if (curDragEnd == RangeEnd.Max && sliderValue != range.max)
					{
						if (sliderValue == max) { sliderValue = float.MaxValue; }
						range.max = sliderValue;
						if (range.min > range.max)
						{
							range.min = range.max;
						}
						CheckPlayDragSliderSound();
					}
					Event.current.Use();
				}
			}
			Text.Font = font;
		}
예제 #12
0
        public static string ToStringByStyle(this float f, ToStringStyle style, ToStringNumberSense numberSense = ToStringNumberSense.Absolute)
        {
            if (style == ToStringStyle.Temperature && numberSense == ToStringNumberSense.Offset)
            {
                style = ToStringStyle.TemperatureOffset;
            }
            if (numberSense == ToStringNumberSense.Factor)
            {
                style = (ToStringStyle)((!(f >= 10.0)) ? 4 : 3);
            }
            string text;

            switch (style)
            {
            case ToStringStyle.Integer:
                text = Mathf.RoundToInt(f).ToString();
                break;

            case ToStringStyle.FloatOne:
                text = f.ToString("F1");
                break;

            case ToStringStyle.FloatTwo:
                text = f.ToString("F2");
                break;

            case ToStringStyle.FloatMaxTwo:
                text = f.ToString("0.##");
                break;

            case ToStringStyle.PercentZero:
                text = f.ToStringPercent();
                break;

            case ToStringStyle.PercentOne:
                text = f.ToStringPercent("F1");
                break;

            case ToStringStyle.PercentTwo:
                text = f.ToStringPercent("F2");
                break;

            case ToStringStyle.Temperature:
                text = f.ToStringTemperature("F1");
                break;

            case ToStringStyle.TemperatureOffset:
                text = f.ToStringTemperatureOffset("F1");
                break;

            case ToStringStyle.WorkAmount:
                text = f.ToStringWorkAmount();
                break;

            default:
                Log.Error("Unknown ToStringStyle " + style);
                text = f.ToString();
                break;
            }
            switch (numberSense)
            {
            case ToStringNumberSense.Offset:
                if (f >= 0.0)
                {
                    text = "+" + text;
                }
                break;

            case ToStringNumberSense.Factor:
                text = "x" + text;
                break;
            }
            return(text);
        }
        public static void FloatRange( Rect canvas, int id, ref FloatRange range, FloatRange sliderRange, ToStringStyle valueStyle = ToStringStyle.FloatTwo, string labelKey = null )
        {
            // margin
            canvas.xMin += 8f;
            canvas.xMax -= 8f;

            // label
            Color mainColor = GUI.color;
            GUI.color = new Color( 0.4f, 0.4f, 0.4f );
            string text = range.min.ToStringByStyle( valueStyle ) + " - " + range.max.ToStringByStyle( valueStyle );
            if( labelKey != null )
            {
                text = labelKey.Translate( text );
            }
            Text.Font = GameFont.Tiny;
            Rect labelRect = new Rect(canvas.x, canvas.y, canvas.width, 19f);
            Text.Anchor = TextAnchor.UpperCenter;
            Widgets.Label( labelRect, text );
            Text.Anchor = TextAnchor.UpperLeft;

            // background line
            Rect sliderRect = new Rect(canvas.x, labelRect.yMax, canvas.width, 2f);
            GUI.DrawTexture( sliderRect, BaseContent.WhiteTex );
            GUI.color = mainColor;

            // slider handle positions
            float pxPerUnit = sliderRect.width / sliderRange.Span;
            float minHandlePos = sliderRect.xMin + ( range.min - sliderRange.min ) * pxPerUnit;
            float maxHandlePos = sliderRect.xMin + ( range.max - sliderRange.min ) * pxPerUnit;
            
            // draw handles 
            Rect minHandleRect = new Rect(minHandlePos - 16f, sliderRect.center.y - 8f, 16f, 16f);
            GUI.DrawTexture( minHandleRect, FloatRangeSliderTex );
            Rect maxHandleRect = new Rect(maxHandlePos + 16f, sliderRect.center.y - 8f, -16f, 16f);
            GUI.DrawTexture( maxHandleRect, FloatRangeSliderTex );

            // interactions
            Rect interactionRect = canvas;
            interactionRect.xMin -= 8f;
            interactionRect.xMax += 8f;
            bool dragging = false;
            if( Mouse.IsOver( interactionRect ) || draggingId == id )
            {
                if( Event.current.type == EventType.MouseDown && Event.current.button == 0 )
                {
                    draggingId = id;
                    float x = Event.current.mousePosition.x;
                    if( x < minHandleRect.xMax )
                    {
                        draggingHandle = Handle.Min;
                    }
                    else if( x > maxHandleRect.xMin )
                    {
                        draggingHandle = Handle.Max;
                    }
                    else
                    {
                        float distToMin = Mathf.Abs(x - minHandleRect.xMax);
                        float distToMax = Mathf.Abs(x - (maxHandleRect.x - 16f));
                        draggingHandle = distToMin >= distToMax ? Handle.Max : Handle.Min;
                    }
                    dragging = true;
                    Event.current.Use();
                }
                if( dragging || ( draggingHandle != Handle.None && Event.current.type == EventType.MouseDrag ) )
                {
                    // NOTE: this deviates from vanilla, vanilla seemed to assume that max == span?
                    float curPosValue = (Event.current.mousePosition.x - canvas.x) / canvas.width * sliderRange.Span + sliderRange.min;
                    curPosValue = Mathf.Clamp( curPosValue, sliderRange.min, sliderRange.max );
                    if( draggingHandle == Handle.Min )
                    {
                        range.min = curPosValue;
                        if( range.max < range.min )
                        {
                            range.max = range.min;
                        }
                    }
                    else if( draggingHandle == Handle.Max )
                    {
                        range.max = curPosValue;
                        if( range.min > range.max )
                        {
                            range.min = range.max;
                        }
                    }
                    Event.current.Use();
                }
            }
            if( draggingHandle != Handle.None && Event.current.type == EventType.MouseUp )
            {
                draggingId = 0;
                draggingHandle = Handle.None;
                Event.current.Use();
            }
        }