Skip to content

Commit

Permalink
Fix bindable not being correctly re-bound across local user changes
Browse files Browse the repository at this point in the history
  • Loading branch information
peppy committed Mar 29, 2024
1 parent fef8afb commit d9cf5b5
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 9 deletions.
12 changes: 12 additions & 0 deletions osu.Game.Tests/Visual/Menus/TestSceneLoginOverlay.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using osu.Game.Overlays;
using osu.Game.Overlays.Login;
using osu.Game.Overlays.Settings;
using osu.Game.Users;
using osu.Game.Users.Drawables;
using osuTK.Input;

Expand Down Expand Up @@ -72,13 +73,24 @@ public void TestLoginSuccess()
return false;
});

AddStep("enter code", () => loginOverlay.ChildrenOfType<OsuTextBox>().First().Text = "88800088");
assertAPIState(APIState.Online);
assertDropdownState(UserAction.Online);

AddStep("set failing", () => { dummyAPI.SetState(APIState.Failing); });
AddStep("return to online", () => { dummyAPI.SetState(APIState.Online); });

AddStep("clear handler", () => dummyAPI.HandleRequest = null);

assertDropdownState(UserAction.Online);
AddStep("change user state", () => dummyAPI.LocalUser.Value.Status.Value = UserStatus.DoNotDisturb);
assertDropdownState(UserAction.DoNotDisturb);
}

private void assertDropdownState(UserAction state)
{
AddAssert($"dropdown state is {state}", () => loginOverlay.ChildrenOfType<UserDropdown>().First().Current.Value, () => Is.EqualTo(state));
}

private void assertAPIState(APIState expected) =>
Expand Down
23 changes: 14 additions & 9 deletions osu.Game/Overlays/Login/LoginPanel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using osu.Game.Graphics.UserInterface;
using osu.Game.Localisation;
using osu.Game.Online.API;
using osu.Game.Online.API.Requests.Responses;
using osu.Game.Overlays.Settings;
using osu.Game.Users;
using osuTK;
Expand All @@ -37,8 +38,10 @@ public partial class LoginPanel : Container
/// </summary>
public Action? RequestHide;

private IBindable<APIUser> user = null!;
private readonly Bindable<UserStatus?> status = new Bindable<UserStatus?>();

private readonly IBindable<APIState> apiState = new Bindable<APIState>();
private readonly Bindable<UserStatus?> userStatus = new Bindable<UserStatus?>();

[Resolved]
private IAPIProvider api { get; set; } = null!;
Expand All @@ -61,19 +64,21 @@ public LoginPanel()
AutoSizeAxes = Axes.Y;
}

[BackgroundDependencyLoader]
private void load()
protected override void LoadComplete()
{
base.LoadComplete();

apiState.BindTo(api.State);
apiState.BindValueChanged(onlineStateChanged, true);
}

protected override void LoadComplete()
{
base.LoadComplete();
user = api.LocalUser.GetBoundCopy();
user.BindValueChanged(u =>
{
status.UnbindBindings();
status.BindTo(u.NewValue.Status);
}, true);

userStatus.BindTo(api.LocalUser.Value.Status);
userStatus.BindValueChanged(e => updateDropdownCurrent(e.NewValue), true);
status.BindValueChanged(e => updateDropdownCurrent(e.NewValue), true);
}

private void onlineStateChanged(ValueChangedEvent<APIState> state) => Schedule(() =>
Expand Down

0 comments on commit d9cf5b5

Please sign in to comment.