namespace RosettaUI { public abstract class SliderElement : SliderBaseElement { protected SliderElement(LabelElement label, IBinder binder, in SliderElementOption option) : base(label, binder, option) { } } public abstract class SliderBaseElement : RangeFieldElement { public readonly bool showInputField; protected SliderBaseElement(LabelElement label, IBinder binder, in SliderElementOption option) : base(label, binder, option.minGetter, option.maxGetter, option.FieldOption) { showInputField = option.ShowInputField; } } public readonly struct SliderElementOption { public readonly IGetter minGetter; public readonly IGetter maxGetter; public readonly SliderOption? sliderOption; public SliderElementOption(IGetter minGetter, IGetter maxGetter, in SliderOption? sliderOption) { this.minGetter = minGetter; this.maxGetter = maxGetter; this.sliderOption = sliderOption; } public SliderElementOption(in SliderElementOption baseOption, IGetter newMinGetter, IGetter newMaxGetter) { minGetter = newMinGetter; maxGetter = newMaxGetter; sliderOption = baseOption.sliderOption; } public SliderElementOption Cast() { return new SliderElementOption ( (IGetter) minGetter, (IGetter) maxGetter, sliderOption ); } } public readonly struct SliderElementOption { public readonly IGetter minGetter; public readonly IGetter maxGetter; public readonly SliderOption? sliderOption; public bool ShowInputField => sliderOption?.showInputField ?? true; public FieldOption FieldOption => sliderOption?.fieldOption ?? FieldOption.Default; public SliderElementOption(IGetter minGetter, IGetter maxGetter, SliderOption? sliderOption) { this.minGetter = minGetter; this.maxGetter = maxGetter; this.sliderOption = sliderOption; } } public static class SliderElementOptionExtension { public static SliderElementOption SetMinMaxGetterIfNotExist(this SliderElementOption elementOption, IGetter minGetter, IGetter maxGetter) { return new SliderElementOption( elementOption.minGetter ?? minGetter, elementOption.maxGetter ?? maxGetter, elementOption.sliderOption ); } } }