Re-implement EditorMenuBar.

This commit is contained in:
smoogipooo 2017-09-06 21:14:29 +09:00
parent df79d8918d
commit 06fac913bf
3 changed files with 83 additions and 85 deletions

@ -1 +1 @@
Subproject commit 3edf65857759f32d5a6d07ed523a2892b09c3c6a
Subproject commit 3e91706ad54609c9477588730b5de7db9d1311f8

View File

@ -46,6 +46,11 @@ protected override void UpdateSize(Vector2 newSize)
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableOsuMenuItem(item);
protected override Menu CreateSubMenu() => new OsuMenu(Direction.Vertical)
{
Anchor = Direction == Direction.Horizontal ? Anchor.BottomLeft : Anchor.TopRight
};
protected class DrawableOsuMenuItem : DrawableMenuItem
{
private const int margin_horizontal = 17;
@ -61,7 +66,6 @@ protected class DrawableOsuMenuItem : DrawableMenuItem
public DrawableOsuMenuItem(MenuItem item)
: base(item)
{
}
[BackgroundDependencyLoader]

View File

@ -5,125 +5,119 @@
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Graphics.UserInterface;
using osu.Framework.Input;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
using OpenTK;
using OpenTK.Graphics;
namespace osu.Game.Screens.Edit.Menus
{
public class EditorMenuBar : MenuBar
public class EditorMenuBar : OsuMenu
{
protected override DrawableMenuBarItem CreateDrawableMenuBarItem(MenuItem item) => new DrawableEditorMenuBarItem(item);
private class DrawableEditorMenuBarItem : DrawableMenuBarItem
public EditorMenuBar()
: base(Direction.Horizontal)
{
private const int fade_duration = 250;
private const float text_size = 14;
AlwaysOpen = true;
RequireClickToOpen = true;
private readonly Container background;
ItemsContainer.Padding = new MarginPadding(0);
BackgroundColour = Color4.Transparent;
}
private Color4 normalColour;
protected override Framework.Graphics.UserInterface.Menu CreateSubMenu() => new SubMenu();
public DrawableEditorMenuBarItem(MenuItem item)
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableEditorBarMenuItem(item);
private class DrawableEditorBarMenuItem : DrawableOsuMenuItem
{
private Color4 openedForegroundColour;
private Color4 openedBackgroundColour;
public DrawableEditorBarMenuItem(MenuItem item)
: base(item)
{
Text.Padding = new MarginPadding(8);
AddInternal(background = new Container
{
RelativeSizeAxes = Axes.Both,
Masking = true,
Depth = float.MaxValue,
Alpha = 0,
Child = new Container<Box>
{
// The following is done so we can have top rounded corners but not bottom corners
RelativeSizeAxes = Axes.Both,
Height = 2,
Masking = true,
CornerRadius = 5,
Child = new Box { RelativeSizeAxes = Axes.Both }
}
});
Menu.OnOpen += menuOpen;
Menu.OnClose += menuClose;
}
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
background.Colour = colours.Gray3;
Text.Colour = normalColour = colours.BlueLight;
ForegroundColour = ForegroundColourHover = colours.BlueLight;
BackgroundColour = BackgroundColourHover = Color4.Transparent;
openedForegroundColour = Color4.White;
openedBackgroundColour = colours.Gray3;
}
private void menuOpen()
protected override void UpdateBackgroundColour()
{
background.FadeIn(fade_duration, Easing.OutQuint);
Text.FadeColour(Color4.White, fade_duration, Easing.OutQuint);
if (State == MenuItemState.Selected)
Background.FadeColour(openedBackgroundColour);
else
base.UpdateBackgroundColour();
}
private void menuClose()
protected override void UpdateForegroundColour()
{
background.FadeOut(fade_duration, Easing.OutQuint);
Text.FadeColour(normalColour, fade_duration, Easing.OutQuint);
if (State == MenuItemState.Selected)
Foreground.FadeColour(openedForegroundColour);
else
base.UpdateForegroundColour();
}
protected override SpriteText CreateText() => new OsuSpriteText { TextSize = text_size };
protected override Framework.Graphics.UserInterface.Menu CreateMenu() => new EditorMenu();
private class EditorMenu : OsuMenu
protected override Drawable CreateBackground() => new Container
{
public EditorMenu()
RelativeSizeAxes = Axes.Both,
Masking = true,
Child = new Container
{
RelativeSizeAxes = Axes.Both,
Height = 2,
Masking = true,
CornerRadius = 4,
Child = new Box { RelativeSizeAxes = Axes.Both }
}
};
}
private class SubMenu : OsuMenu
{
public SubMenu()
: base(Direction.Vertical)
{
OriginPosition = new Vector2(5, 1);
ItemsContainer.Padding = new MarginPadding { Top = 5, Bottom = 5 };
}
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
BackgroundColour = colours.Gray3;
}
protected override Framework.Graphics.UserInterface.Menu CreateSubMenu() => new SubMenu();
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableSubMenuItem(item);
private class DrawableSubMenuItem : DrawableOsuMenuItem
{
public DrawableSubMenuItem(MenuItem item)
: base(item)
{
Anchor = Anchor.BottomLeft;
BypassAutoSizeAxes = Axes.Both;
OriginPosition = new Vector2(8, 0);
}
[BackgroundDependencyLoader]
private void load(OsuColour colours)
protected override bool OnHover(InputState state)
{
BackgroundColour = colours.Gray3;
if (Item is EditorMenuSpacer)
return true;
return base.OnHover(state);
}
protected override MarginPadding ItemFlowContainerPadding => new MarginPadding { Top = 5, Bottom = 5 };
protected override DrawableMenuItem CreateDrawableMenuItem(MenuItem item) => new DrawableEditorMenuItem(item);
private class DrawableEditorMenuItem : DrawableOsuMenuItem
protected override bool OnClick(InputState state)
{
public override bool HandleInput => !isSpacer;
private readonly bool isSpacer;
public DrawableEditorMenuItem(MenuItem item)
: base(item)
{
isSpacer = item is EditorMenuSpacer;
}
[BackgroundDependencyLoader]
private void load(OsuColour colours)
{
BackgroundColour = colours.Gray3;
BackgroundColourHover = colours.Gray2;
}
protected override TextContainer CreateTextContainer() => new EditorTextContainer();
private class EditorTextContainer : TextContainer
{
public EditorTextContainer()
{
BoldText.TextSize = text_size;
NormalText.TextSize = text_size;
}
}
if (Item is EditorMenuSpacer)
return true;
return base.OnClick(state);
}
}
}