// Copyright (c) 2007-2018 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using System; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Input.Events; using osu.Framework.Screens; using osu.Game.Online.Multiplayer; using osu.Game.Overlays.SearchableList; using osu.Game.Screens.Multi.Lounge.Components; using osu.Game.Screens.Multi.Match; namespace osu.Game.Screens.Multi.Lounge { public class LoungeScreen : MultiplayerScreen { protected readonly FilterControl Filter; private readonly Container content; private readonly SearchContainer search; private readonly RoomsContainer rooms; private readonly Action pushGameplayScreen; [Cached] private readonly RoomManager manager; public override string Title => "Lounge"; protected override Drawable TransitionContent => content; public LoungeScreen(Action pushGameplayScreen) { this.pushGameplayScreen = pushGameplayScreen; RoomInspector inspector; Children = new Drawable[] { Filter = new FilterControl { Depth = -1 }, content = new Container { RelativeSizeAxes = Axes.Both, Children = new Drawable[] { new ScrollContainer { RelativeSizeAxes = Axes.Both, Width = 0.55f, Padding = new MarginPadding { Vertical = 35 - DrawableRoom.SELECTION_BORDER_WIDTH, Right = 20 - DrawableRoom.SELECTION_BORDER_WIDTH }, Child = search = new SearchContainer { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Child = rooms = new RoomsContainer { OpenRequested = openRoom } }, }, inspector = new RoomInspector { Anchor = Anchor.TopRight, Origin = Anchor.TopRight, RelativeSizeAxes = Axes.Both, Width = 0.45f, }, }, }, manager = new RoomManager() }; inspector.Room.BindTo(manager.Current); Filter.Search.Current.ValueChanged += s => filterRooms(); Filter.Tabs.Current.ValueChanged += t => filterRooms(); Filter.Search.Exit += Exit; } protected override void UpdateAfterChildren() { base.UpdateAfterChildren(); content.Padding = new MarginPadding { Top = Filter.DrawHeight, Left = SearchableListOverlay.WIDTH_PADDING - DrawableRoom.SELECTION_BORDER_WIDTH, Right = SearchableListOverlay.WIDTH_PADDING, }; } protected override void OnFocus(FocusEvent e) { GetContainingInputManager().ChangeFocus(Filter.Search); } protected override void OnEntering(Screen last) { base.OnEntering(last); Filter.Search.HoldFocus = true; } protected override bool OnExiting(Screen next) { Filter.Search.HoldFocus = false; return base.OnExiting(next); } protected override void OnResuming(Screen last) { base.OnResuming(last); Filter.Search.HoldFocus = true; } protected override void OnSuspending(Screen next) { base.OnSuspending(next); Filter.Search.HoldFocus = false; } private void filterRooms() { if (Filter.Tabs.Current.Value == LoungeTab.Create) { Filter.Tabs.Current.Value = LoungeTab.Public; openRoom(new Room()); } search.SearchTerm = Filter.Search.Current.Value ?? string.Empty; rooms.Filter(Filter.CreateCriteria()); } private void openRoom(Room room) { // Handles the case where a room is clicked 3 times in quick succession if (!IsCurrentScreen) return; Push(new MatchScreen(room, s => pushGameplayScreen?.Invoke(s))); } } }