Path: blob/master/osu.Game/Graphics/UserInterfaceV2/FormCheckBox.cs
4397 views
// Copyright (c) ppy Pty Ltd <[email protected]>. Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using System.Collections.Generic; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.UserInterface; using osu.Framework.Input.Events; using osu.Framework.Localisation; using osu.Game.Overlays; namespace osu.Game.Graphics.UserInterfaceV2 { public partial class FormCheckBox : CompositeDrawable, IHasCurrentValue<bool>, IFormControl { public Bindable<bool> Current { get => current.Current; set => current.Current = value; } private readonly BindableWithCurrent<bool> current = new BindableWithCurrent<bool>(); /// <summary> /// Caption describing this slider bar, displayed on top of the controls. /// </summary> public LocalisableString Caption { get; init; } /// <summary> /// Hint text containing an extended description of this slider bar, displayed in a tooltip when hovering the caption. /// </summary> public LocalisableString HintText { get; init; } private FormControlBackground background = null!; private FormFieldCaption caption = null!; private SwitchButton switchButton = null!; [Resolved] private OverlayColourProvider colourProvider { get; set; } = null!; [BackgroundDependencyLoader] private void load() { RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; InternalChildren = new Drawable[] { background = new FormControlBackground(), new Container { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Padding = new MarginPadding(9), Children = new Drawable[] { new Container { Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Padding = new MarginPadding { Right = SwitchButton.WIDTH + 5 }, Children = new Drawable[] { caption = new FormFieldCaption { Caption = Caption, TooltipText = HintText, }, }, }, switchButton = new SwitchButton { Anchor = Anchor.CentreRight, Origin = Anchor.CentreRight, Current = Current, }, }, }, }; } protected override void LoadComplete() { base.LoadComplete(); current.BindValueChanged(_ => { updateState(); background.Flash(); ValueChanged?.Invoke(); }); current.BindDisabledChanged(_ => updateState(), true); } protected override bool OnHover(HoverEvent e) { updateState(); return true; } protected override void OnHoverLost(HoverLostEvent e) { base.OnHoverLost(e); updateState(); } protected override bool OnClick(ClickEvent e) { switchButton.TriggerClick(); return true; } private void updateState() { caption.Colour = Current.Disabled ? colourProvider.Background1 : colourProvider.Content2; if (IsDisabled) background.VisualStyle = VisualStyle.Disabled; else if (IsHovered) background.VisualStyle = VisualStyle.Hovered; else background.VisualStyle = VisualStyle.Normal; } public IEnumerable<LocalisableString> FilterTerms => Caption.Yield(); public event Action? ValueChanged; public bool IsDefault => Current.IsDefault; public void SetDefault() => Current.SetDefault(); public bool IsDisabled => Current.Disabled; public float MainDrawHeight => DrawHeight; } }