Implement OverlayPanelDisplayStyleControl and UserListToolbar components

This commit is contained in:
Andrei Zavatski 2020-02-24 07:28:33 +03:00
parent 0cfe1ac823
commit 7bc9a9b3d8
4 changed files with 199 additions and 41 deletions

View File

@ -0,0 +1,57 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. 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.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Overlays;
using osu.Game.Overlays.Home.Friends;
using osuTK;
namespace osu.Game.Tests.Visual.UserInterface
{
public class TestSceneUserListToolbar : OsuTestScene
{
public override IReadOnlyList<Type> RequiredTypes => new[]
{
typeof(UserSortTabControl),
typeof(OverlaySortTabControl<>),
typeof(OverlayPanelDisplayStyleControl),
typeof(UserListToolbar),
};
[Cached]
private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Purple);
public TestSceneUserListToolbar()
{
UserListToolbar toolbar;
OsuSpriteText sort;
OsuSpriteText displayStyle;
Add(toolbar = new UserListToolbar
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
});
Add(new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Vertical,
Spacing = new Vector2(0, 5),
Children = new Drawable[]
{
sort = new OsuSpriteText(),
displayStyle = new OsuSpriteText()
}
});
toolbar.SortCriteria.BindValueChanged(criteria => sort.Text = $"Criteria: {criteria.NewValue}", true);
toolbar.DisplayStyle.BindValueChanged(style => displayStyle.Text = $"Style: {style.NewValue}", true);
}
}
}

View File

@ -1,41 +0,0 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. 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.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Overlays;
using osu.Game.Overlays.Home.Friends;
namespace osu.Game.Tests.Visual.UserInterface
{
public class TestSceneUserSortTabControl : OsuTestScene
{
public override IReadOnlyList<Type> RequiredTypes => new[]
{
typeof(UserSortTabControl),
typeof(OverlaySortTabControl<>),
};
[Cached]
private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Purple);
public TestSceneUserSortTabControl()
{
UserSortTabControl control;
OsuSpriteText current;
Add(control = new UserSortTabControl
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
});
Add(current = new OsuSpriteText());
control.Current.BindValueChanged(criteria => current.Text = $"Criteria: {criteria.NewValue}", true);
}
}
}

View File

@ -0,0 +1,45 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osuTK;
using osu.Framework.Bindables;
namespace osu.Game.Overlays.Home.Friends
{
public class UserListToolbar : CompositeDrawable
{
public Bindable<UserSortCriteria> SortCriteria => sortControl.Current;
public Bindable<OverlayPanelDisplayStyle> DisplayStyle => styleControl.Current;
private readonly UserSortTabControl sortControl;
private readonly OverlayPanelDisplayStyleControl styleControl;
public UserListToolbar()
{
AutoSizeAxes = Axes.Both;
AddInternal(new FillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal,
Spacing = new Vector2(10, 0),
Children = new Drawable[]
{
sortControl = new UserSortTabControl
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
},
styleControl = new OverlayPanelDisplayStyleControl
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
}
}
});
}
}
}

View File

@ -0,0 +1,97 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osuTK;
using osu.Framework.Input.Events;
using osu.Game.Graphics.UserInterface;
using osu.Framework.Allocation;
using osuTK.Graphics;
using osu.Framework.Graphics.Cursor;
namespace osu.Game.Overlays
{
public class OverlayPanelDisplayStyleControl : OsuTabControl<OverlayPanelDisplayStyle>
{
protected override Dropdown<OverlayPanelDisplayStyle> CreateDropdown() => null;
protected override TabItem<OverlayPanelDisplayStyle> CreateTabItem(OverlayPanelDisplayStyle value) => new PanelDisplayTabItem(value);
protected override bool AddEnumEntriesAutomatically => false;
public OverlayPanelDisplayStyleControl()
{
AutoSizeAxes = Axes.Both;
AddTabItem(new PanelDisplayTabItem(OverlayPanelDisplayStyle.Card)
{
Icon = FontAwesome.Solid.Square
});
AddTabItem(new PanelDisplayTabItem(OverlayPanelDisplayStyle.List)
{
Icon = FontAwesome.Solid.Bars
});
}
protected override TabFillFlowContainer CreateTabFlow() => new TabFillFlowContainer
{
AutoSizeAxes = Axes.Both,
Direction = FillDirection.Horizontal
};
private class PanelDisplayTabItem : TabItem<OverlayPanelDisplayStyle>, IHasTooltip
{
public IconUsage Icon
{
set => icon.Icon = value;
}
[Resolved]
private OverlayColourProvider colourProvider { get; set; }
public string TooltipText => $@"{Value} view";
private readonly SpriteIcon icon;
public PanelDisplayTabItem(OverlayPanelDisplayStyle value)
: base(value)
{
Size = new Vector2(11);
Add(icon = new SpriteIcon
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
RelativeSizeAxes = Axes.Both,
FillMode = FillMode.Fit
});
}
protected override void OnActivated() => updateState();
protected override void OnDeactivated() => updateState();
protected override bool OnHover(HoverEvent e)
{
updateState();
return base.OnHover(e);
}
protected override void OnHoverLost(HoverLostEvent e)
{
updateState();
base.OnHoverLost(e);
}
private void updateState() => icon.Colour = Active.Value || IsHovered ? colourProvider.Light1 : Color4.White;
}
}
public enum OverlayPanelDisplayStyle
{
Card,
List
}
}