public void EnableButton(Rect rect) { if (VehicleMod.selectedDef is null) { Log.Error($"SelectedDef is null while trying to create Enable button for VehicleDef."); return; } var gameFont = Text.Font; Text.Font = GameFont.Medium; FieldInfo enabledField = AccessTools.Field(typeof(VehicleDef), nameof(VehicleDef.enabled)); SaveableField saveableField = new SaveableField(VehicleMod.selectedDef, enabledField); bool enabled = (bool)fieldSettings[VehicleMod.selectedDef.defName][saveableField].First; string text = enabled ? "VehicleEnabled".Translate() : "VehicleDisabled".Translate(); Vector2 size = Text.CalcSize(text); Color textColor = enabled ? Color.green : Color.red; Rect enabledButtonRect = new Rect(rect.x, rect.y, size.x, size.y); TooltipHandler.TipRegion(enabledButtonRect, "VehicleEnableButtonTooltip".Translate()); if (UIElements.ClickableLabel(enabledButtonRect, text, Color.yellow, textColor, GameFont.Medium)) { fieldSettings[VehicleMod.selectedDef.defName][saveableField] = new SavedField <object>(!enabled); } Text.Font = gameFont; }
public override void DrawStatLister(VehicleDef def, Listing_Settings lister, SaveableField field, float value) { FloatRange?range = settingListerRange; if (range is null) { range = new FloatRange(-value, value); } lister.SliderLabeled(def, field, "VehicleMaxArmor".Translate(), "VehicleMaxArmorTooltip".Translate(), string.Empty, string.Empty, value + range.Value.min, value + range.Value.max, 1); }
public override void DrawStatLister(VehicleDef def, Listing_Settings lister, SaveableField field, float value) { FloatRange?range = settingListerRange; if (range is null) { range = new FloatRange(-value, value); } lister.FloatBox(def, field, "VehicleCargoCapacity".Translate(), "VehicleCargoCapacityTooltip".Translate(), string.Empty, value + range.Value.min, value + range.Value.max); }
public object GetSettingsValue(VehicleDef def, SaveableField field) { try { return(settings switch { SettingsPage.Vehicles => VehicleMod.settings.vehicles.fieldSettings[def.defName][field].First, SettingsPage.Upgrades => VehicleMod.settings.upgrades.upgradeSettings[def.defName][field].First, _ => throw new NotSupportedException($"Cannot use Listing_Settings with settings set to {settings}") }); }
public static void IterateTypeFields(VehicleDef def, Type type, object obj, ref Dictionary <SaveableField, SavedField <object> > currentDict) { if (VehicleMod.cachedFields.TryGetValue(type, out var fields)) { var dict = VehicleMod.settings.vehicles.fieldSettings[def.defName]; foreach (FieldInfo field in fields) { if (field.TryGetAttribute <PostToSettingsAttribute>(out var settings) && settings.ParentHolder) { object value = field.GetValue(obj); if (field.FieldType.IsGenericType) { MethodInfo method = field.DeclaringType.GetMethod("ResolvePostToSettings", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); if (method != null) { object[] arguments = new object[] { def, currentDict }; method.Invoke(obj, arguments); currentDict = (Dictionary <SaveableField, SavedField <object> >)arguments[1]; } else { SmashLog.Error($"Unable to generate customizable setting <field>{field.Name}</field> for <text>{def.defName}</text>. Fields of type <type>Dictionary<T></type> must implement ResolvePostToSettings method to be manually resolved."); } } else { IterateTypeFields(def, field.FieldType, value, ref currentDict); } } else { SaveableField saveField = new SaveableField(def, field); if (!dict.TryGetValue(saveField, out var _)) { dict.Add(saveField, new SavedField <object>(field.GetValue(obj))); } } }
public static bool Equals(SaveableField source, SaveableField target) { return(source.GetHashCode() == target.GetHashCode()); }
/// <summary> /// Draws UI element for lister in ModSettings /// </summary> /// <param name="lister"></param> /// <param name="def"></param> /// <param name="field"></param> public void DrawLister(Listing_Settings lister, VehicleDef def, FieldInfo field) { string label = Translate ? Label.Translate().ToString() : Label; string tooltip = Translate ? Tooltip.Translate().ToString() : Tooltip; SaveableField saveable = new SaveableField(def, field); string disabledTooltip = string.Empty; if (VehicleType != VehicleType.Undefined && VehicleType != def.vehicleType) { disabledTooltip = "VehicleSaveableFieldDisabledTooltip".Translate(); } bool locked = false; if (ParsingHelper.lockedFields.TryGetValue(def.defName, out HashSet <FieldInfo> lockedFields)) { if (lockedFields.Contains(field)) { locked = true; disabledTooltip = "VehicleSaveableFieldLockedTooltip".Translate(); } } if (field.HasAttribute <DisableSettingAttribute>()) { disabledTooltip = "VehicleDebugDisabledTooltip".Translate(); } switch (UISettingsType) { case UISettingsType.None: return; case UISettingsType.Checkbox: lister.CheckboxLabeled(def, saveable, label, tooltip, disabledTooltip, locked); break; case UISettingsType.IntegerBox: { if (field.TryGetAttribute <NumericBoxValuesAttribute>(out var inputBox)) { lister.IntegerBox(def, saveable, label, tooltip, disabledTooltip, Mathf.RoundToInt(inputBox.MinValue), Mathf.RoundToInt(inputBox.MaxValue)); } else { lister.IntegerBox(def, saveable, label, tooltip, disabledTooltip, 0, int.MaxValue); } break; } case UISettingsType.FloatBox: { if (field.TryGetAttribute <NumericBoxValuesAttribute>(out var inputBox)) { lister.FloatBox(def, saveable, label, tooltip, disabledTooltip, inputBox.MinValue, inputBox.MaxValue); } else { lister.FloatBox(def, saveable, label, tooltip, disabledTooltip, 0, float.MaxValue); } break; } case UISettingsType.ToggleLabel: break; case UISettingsType.SliderEnum: lister.EnumSliderLabeled(def, saveable, label, tooltip, disabledTooltip, field.FieldType, Translate); break; case UISettingsType.SliderInt: { if (field.TryGetAttribute <SliderValuesAttribute>(out var slider)) { lister.SliderLabeled(def, saveable, label, tooltip, disabledTooltip, slider.EndSymbol, (int)slider.MinValue, (int)slider.MaxValue, (int)slider.EndValue, slider.MaxValueDisplay, slider.MinValueDisplay, Translate); } else { SmashLog.WarningOnce($"Slider declared for SaveableField {field.Name} in {field.DeclaringType} with no SliderValues attribute. Slider will use default values instead.", field.GetHashCode()); lister.SliderLabeled(def, saveable, label, tooltip, disabledTooltip, string.Empty, 0, 100, -1, string.Empty, string.Empty, Translate); } } break; case UISettingsType.SliderFloat: { if (field.TryGetAttribute <SliderValuesAttribute>(out var slider)) { lister.SliderLabeled(def, saveable, label, tooltip, disabledTooltip, slider.EndSymbol, slider.MinValue, slider.MaxValue, slider.RoundDecimalPlaces, slider.EndValue, slider.Increment, slider.MaxValueDisplay, Translate); } else { SmashLog.WarningOnce($"Slider declared for SaveableField {field.Name} in {field.DeclaringType} with no SliderValues attribute. Slider will use default values instead.", field.GetHashCode()); lister.SliderLabeled(def, saveable, label, tooltip, disabledTooltip, string.Empty, 0f, 100f, 0, -1, -1, string.Empty, Translate); } } break; case UISettingsType.SliderPercent: { if (field.TryGetAttribute <SliderValuesAttribute>(out var slider)) { lister.SliderPercentLabeled(def, saveable, label, tooltip, disabledTooltip, slider.EndSymbol, slider.MinValue, slider.MaxValue, slider.RoundDecimalPlaces, slider.EndValue, slider.MaxValueDisplay, Translate); } else { SmashLog.WarningOnce($"Slider declared for SaveableField {field.Name} in {field.DeclaringType} with no SliderValues attribute. Slider will use default values instead.", field.GetHashCode()); lister.SliderPercentLabeled(def, saveable, label, tooltip, disabledTooltip, string.Empty, 0f, 100f, 0, -1, string.Empty, Translate); } } break; default: Log.ErrorOnce($"{VehicleHarmony.LogLabel} {UISettingsType} has not yet been implemented for PostToSettings.DrawLister. Please notify mod author.", UISettingsType.ToString().GetHashCode()); break; } }
public override void DrawStatLister(VehicleDef def, Listing_Settings lister, SaveableField field, float value) { throw new NotImplementedException(); }
public override void DrawStatLister(VehicleDef def, Listing_Settings lister, SaveableField field, float value) { }
public abstract void DrawStatLister(VehicleDef def, Listing_Settings lister, SaveableField field, float value);