From 8d65d491263c45bc00006b06edbcb0cbba075ee5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 26 Nov 2018 16:32:59 +0900 Subject: [PATCH] Use bindable flow for checking idle time --- osu.Game/Input/IdleTracker.cs | 29 ++++++++++++++++++++++++++- osu.Game/OsuGame.cs | 2 +- osu.Game/Screens/Menu/ButtonSystem.cs | 19 ++++++++++++------ 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/osu.Game/Input/IdleTracker.cs b/osu.Game/Input/IdleTracker.cs index 64792647c2..23ff75df4c 100644 --- a/osu.Game/Input/IdleTracker.cs +++ b/osu.Game/Input/IdleTracker.cs @@ -1,6 +1,7 @@ // Copyright (c) 2007-2018 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Input; using osu.Framework.Input.Bindings; @@ -8,10 +9,30 @@ using osu.Framework.Input.Events; namespace osu.Game.Input { + /// + /// Track whether the end-user is in an idle state, based on their last interaction with the game. + /// public class IdleTracker : Component, IKeyBindingHandler, IHandleGlobalInput { + private readonly double timeToIdle; + private double lastInteractionTime; - public double IdleTime => Clock.CurrentTime - lastInteractionTime; + + protected double TimeSpentIdle => Clock.CurrentTime - lastInteractionTime; + + /// + /// Whether the user is currently in an idle state. + /// + public BindableBool IsIdle = new BindableBool(); + + /// + /// Intstantiate a new . + /// + /// The length in milliseconds until an idle state should be assumed. + public IdleTracker(double timeToIdle) + { + this.timeToIdle = timeToIdle; + } private bool updateLastInteractionTime() { @@ -19,6 +40,12 @@ namespace osu.Game.Input return false; } + protected override void Update() + { + base.Update(); + IsIdle.Value = TimeSpentIdle > timeToIdle; + } + public bool OnPressed(PlatformAction action) => updateLastInteractionTime(); public bool OnReleased(PlatformAction action) => updateLastInteractionTime(); diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index aaf8622f0e..207fda7d74 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -319,7 +319,7 @@ namespace osu.Game }, mainContent = new Container { RelativeSizeAxes = Axes.Both }, overlayContent = new Container { RelativeSizeAxes = Axes.Both, Depth = float.MinValue }, - idleTracker = new IdleTracker { RelativeSizeAxes = Axes.Both } + idleTracker = new IdleTracker(6000) { RelativeSizeAxes = Axes.Both } }); loadComponentSingleFile(screenStack = new Loader(), d => diff --git a/osu.Game/Screens/Menu/ButtonSystem.cs b/osu.Game/Screens/Menu/ButtonSystem.cs index 9b7ad559e6..4ee4178770 100644 --- a/osu.Game/Screens/Menu/ButtonSystem.cs +++ b/osu.Game/Screens/Menu/ButtonSystem.cs @@ -8,6 +8,7 @@ using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Audio.Sample; +using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Input.Bindings; @@ -27,6 +28,8 @@ namespace osu.Game.Screens.Menu { public event Action StateChanged; + private readonly BindableBool isIdle = new BindableBool(); + public Action OnEdit; public Action OnExit; public Action OnDirect; @@ -65,8 +68,6 @@ namespace osu.Game.Screens.Menu private SampleChannel sampleBack; - private IdleTracker idleTracker; - public ButtonSystem() { RelativeSizeAxes = Axes.Both; @@ -108,10 +109,19 @@ namespace osu.Game.Screens.Menu private void load(AudioManager audio, OsuGame game, IdleTracker idleTracker) { this.game = game; - this.idleTracker = idleTracker; + + isIdle.ValueChanged += updateIdleState; + isIdle.BindTo(idleTracker.IsIdle); + sampleBack = audio.Sample.Get(@"Menu/button-back-select"); } + private void updateIdleState(bool isIdle) + { + if (isIdle && State != ButtonSystemState.Exit) + State = ButtonSystemState.Initial; + } + public bool OnPressed(GlobalAction action) { switch (action) @@ -270,9 +280,6 @@ namespace osu.Game.Screens.Menu protected override void Update() { - if (idleTracker?.IdleTime > 6000 && State != ButtonSystemState.Exit) - State = ButtonSystemState.Initial; - base.Update(); if (logo != null)