// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Input.Handlers.Mouse; using osu.Framework.Localisation; using osu.Game.Configuration; using osu.Game.Graphics.UserInterface; using osu.Game.Input; using osu.Game.Localisation; namespace osu.Game.Overlays.Settings.Sections.Input { public class MouseSettings : SettingsSubsection { private readonly MouseHandler mouseHandler; protected override LocalisableString Header => MouseSettingsStrings.Mouse; private Bindable handlerSensitivity; private Bindable localSensitivity; private Bindable windowMode; private SettingsEnumDropdown confineMouseModeSetting; private Bindable relativeMode; private SettingsCheckbox highPrecisionMouse; public MouseSettings(MouseHandler mouseHandler) { this.mouseHandler = mouseHandler; } [BackgroundDependencyLoader] private void load(OsuConfigManager osuConfig, FrameworkConfigManager config) { // use local bindable to avoid changing enabled state of game host's bindable. handlerSensitivity = mouseHandler.Sensitivity.GetBoundCopy(); localSensitivity = handlerSensitivity.GetUnboundCopy(); relativeMode = mouseHandler.UseRelativeMode.GetBoundCopy(); windowMode = config.GetBindable(FrameworkSetting.WindowMode); Children = new Drawable[] { highPrecisionMouse = new SettingsCheckbox { LabelText = MouseSettingsStrings.HighPrecisionMouse, TooltipText = MouseSettingsStrings.HighPrecisionMouseTooltip, Current = relativeMode, Keywords = new[] { @"raw", @"input", @"relative", @"cursor" } }, new SensitivitySetting { LabelText = MouseSettingsStrings.CursorSensitivity, Current = localSensitivity }, confineMouseModeSetting = new SettingsEnumDropdown { LabelText = MouseSettingsStrings.ConfineMouseMode, Current = osuConfig.GetBindable(OsuSetting.ConfineMouseMode) }, new SettingsCheckbox { LabelText = MouseSettingsStrings.DisableMouseWheel, Current = osuConfig.GetBindable(OsuSetting.MouseDisableWheel) }, new SettingsCheckbox { LabelText = MouseSettingsStrings.DisableMouseButtons, Current = osuConfig.GetBindable(OsuSetting.MouseDisableButtons) }, }; } protected override void LoadComplete() { base.LoadComplete(); relativeMode.BindValueChanged(relative => localSensitivity.Disabled = !relative.NewValue, true); handlerSensitivity.BindValueChanged(val => { var disabled = localSensitivity.Disabled; localSensitivity.Disabled = false; localSensitivity.Value = val.NewValue; localSensitivity.Disabled = disabled; }, true); localSensitivity.BindValueChanged(val => handlerSensitivity.Value = val.NewValue); windowMode.BindValueChanged(mode => { var isFullscreen = mode.NewValue == WindowMode.Fullscreen; if (isFullscreen) { confineMouseModeSetting.Current.Disabled = true; confineMouseModeSetting.TooltipText = MouseSettingsStrings.NotApplicableFullscreen; } else { confineMouseModeSetting.Current.Disabled = false; confineMouseModeSetting.TooltipText = string.Empty; } }, true); highPrecisionMouse.Current.BindValueChanged(highPrecision => { if (RuntimeInfo.OS != RuntimeInfo.Platform.Windows) { if (highPrecision.NewValue) highPrecisionMouse.WarningText = MouseSettingsStrings.HighPrecisionPlatformWarning; else highPrecisionMouse.WarningText = null; } }, true); } private class SensitivitySetting : SettingsSlider { public SensitivitySetting() { KeyboardStep = 0.01f; TransferValueOnCommit = true; } } private class SensitivitySlider : OsuSliderBar { public override LocalisableString TooltipText => Current.Disabled ? MouseSettingsStrings.EnableHighPrecisionForSensitivityAdjust : $"{base.TooltipText}x"; } } }