private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new CheckBoxOption
         {
             LabelText = "Integrate with Yahoo! status display",
             Bindable = config.GetBindable<bool>(OsuConfig.YahooIntegration)
         },
         new CheckBoxOption
         {
             LabelText = "Integrate with MSN Live status display",
             Bindable = config.GetBindable<bool>(OsuConfig.MsnIntegration)
         },
         new CheckBoxOption
         {
             LabelText = "Automatically start osu!direct downloads",
             Bindable = config.GetBindable<bool>(OsuConfig.AutomaticDownload)
         },
         new CheckBoxOption
         {
             LabelText = "Prefer no-video downloads",
             Bindable = config.GetBindable<bool>(OsuConfig.AutomaticDownloadNoVideo)
         },
     };
 }
Exemple #2
0
 private void load(OsuConfigManager config)
 {
     Children = new[]
     {
         new CheckBoxOption
         {
             LabelText = "Snow",
             Bindable = config.GetBindable<bool>(OsuConfig.MenuSnow)
         },
         new CheckBoxOption
         {
             LabelText = "Parallax",
             Bindable = config.GetBindable<bool>(OsuConfig.MenuParallax)
         },
         new CheckBoxOption
         {
             LabelText = "Menu tips",
             Bindable = config.GetBindable<bool>(OsuConfig.ShowMenuTips)
         },
         new CheckBoxOption
         {
             LabelText = "Interface voices",
             Bindable = config.GetBindable<bool>(OsuConfig.MenuVoice)
         },
         new CheckBoxOption
         {
             LabelText = "osu! music theme",
             Bindable = config.GetBindable<bool>(OsuConfig.MenuMusic)
         },
     };
 }
Exemple #3
0
 private void load(OsuConfigManager config)
 {
     // NOTE: Compatability mode omitted
     Children = new Drawable[]
     {
         // TODO: this needs to be a custom dropdown at some point
         new DropdownOption<FrameSync>
         {
             LabelText = "Frame limiter",
             Bindable = config.GetBindable<FrameSync>(OsuConfig.FrameSync)
         },
         new CheckBoxOption
         {
             LabelText = "Show FPS counter",
             Bindable = config.GetBindable<bool>(OsuConfig.FpsCounter),
         },
         new CheckBoxOption
         {
             LabelText = "Reduce dropped frames",
             Bindable = config.GetBindable<bool>(OsuConfig.ForceFrameFlush),
         },
         new CheckBoxOption
         {
             LabelText = "Detect performance issues",
             Bindable = config.GetBindable<bool>(OsuConfig.DetectPerformanceIssues),
         },
     };
 }
Exemple #4
0
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new SpriteText { Text = "Resolution: TODO dropdown" },
         new CheckBoxOption
         {
             LabelText = "Fullscreen mode",
             Bindable = config.GetBindable<bool>(OsuConfig.Fullscreen),
         },
         new CheckBoxOption
         {
             LabelText = "Letterboxing",
             Bindable = config.GetBindable<bool>(OsuConfig.Letterboxing),
         },
         new SliderOption<int>
         {
             LabelText = "Horizontal position",
             Bindable = (BindableInt)config.GetBindable<int>(OsuConfig.LetterboxPositionX)
         },
         new SliderOption<int>
         {
             LabelText = "Vertical position",
             Bindable = (BindableInt)config.GetBindable<int>(OsuConfig.LetterboxPositionY)
         },
     };
 }
Exemple #5
0
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new CheckBoxOption
         {
             LabelText = "OS TabletPC support",
             Bindable = config.GetBindable<bool>(OsuConfig.Tablet)
         },
         new CheckBoxOption
         {
             LabelText = "Wiimote/TaTaCon Drum Support",
             Bindable = config.GetBindable<bool>(OsuConfig.Wiimote)
         },
     };
 }
Exemple #6
0
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new CheckBoxOption
         {
             LabelText = "Share your city location with others",
             Bindable = config.GetBindable<bool>(OsuConfig.DisplayCityLocation)
         },
         new CheckBoxOption
         {
             LabelText = "Allow multiplayer game invites from all users",
             Bindable = config.GetBindable<bool>(OsuConfig.AllowPublicInvites)
         },
     };
 }
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new SliderOption<double>
         {
             LabelText = "Display beatmaps from",
             Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.DisplayStarsMinimum)
         },
         new SliderOption<double>
         {
             LabelText = "up to",
             Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.DisplayStarsMaximum)
         },
     };
 }
Exemple #8
0
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new CheckBoxOption
         {
             LabelText = "Snaking in sliders",
             Bindable = config.GetBindable<bool>(OsuConfig.SnakingInSliders)
         },
         new CheckBoxOption
         {
             LabelText = "Snaking out sliders",
             Bindable = config.GetBindable<bool>(OsuConfig.SnakingOutSliders)
         },
         new CheckBoxOption
         {
             LabelText = "Background video",
             Bindable = config.GetBindable<bool>(OsuConfig.Video)
         },
         new CheckBoxOption
         {
             LabelText = "Storyboards",
             Bindable = config.GetBindable<bool>(OsuConfig.ShowStoryboard)
         },
         new CheckBoxOption
         {
             LabelText = "Combo bursts",
             Bindable = config.GetBindable<bool>(OsuConfig.ComboBurst)
         },
         new CheckBoxOption
         {
             LabelText = "Hit lighting",
             Bindable = config.GetBindable<bool>(OsuConfig.HitLighting)
         },
         new CheckBoxOption
         {
             LabelText = "Shaders",
             Bindable = config.GetBindable<bool>(OsuConfig.Bloom)
         },
         new CheckBoxOption
         {
             LabelText = "Softening filter",
             Bindable = config.GetBindable<bool>(OsuConfig.BloomSoftening)
         },
         new DropdownOption<ScreenshotFormat>
         {
             LabelText = "Screenshot",
             Bindable = config.GetBindable<ScreenshotFormat>(OsuConfig.ScreenshotFormat)
         }
     };
 }
Exemple #9
0
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new SpriteText { Text = "TODO: Dropdown" },
         new CheckBoxOption
         {
             LabelText = "Prefer metadata in original language",
             Bindable = config.GetBindable<bool>(OsuConfig.ShowUnicode)
         },
         new CheckBoxOption
         {
             LabelText = "Use alternative font for chat display",
             Bindable = config.GetBindable<bool>(OsuConfig.AlternativeChatFont)
         },
     };
 }
 private void load(OsuConfigManager config)
 {
     Children = new[]
     {
         new CheckBoxOption
         {
             LabelText = "Show thumbnails",
             Bindable = config.GetBindable<bool>(OsuConfig.SongSelectThumbnails)
         }
     };
 }
Exemple #11
0
 private void load(OsuConfigManager config, AudioManager audio)
 {
     Children = new Drawable[]
     {
         new SliderOption<double> { LabelText = "Master", Bindable = audio.Volume },
         new SliderOption<double> { LabelText = "Effect", Bindable = audio.VolumeSample },
         new SliderOption<double> { LabelText = "Music", Bindable = audio.VolumeTrack },
         new CheckBoxOption
         {
             LabelText = "Ignore beatmap hitsounds",
             Bindable = config.GetBindable<bool>(OsuConfig.IgnoreBeatmapSamples)
         }
     };
 }
Exemple #12
0
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new SliderOption<int>
         {
             LabelText = "Background dim",
             Bindable = (BindableInt)config.GetBindable<int>(OsuConfig.DimLevel)
         },
         new DropdownOption<ProgressBarType>
         {
             LabelText = "Progress display",
             Bindable = config.GetBindable<ProgressBarType>(OsuConfig.ProgressBarType)
         },
         new DropdownOption<ScoreMeterType>
         {
             LabelText = "Score meter type",
             Bindable = config.GetBindable<ScoreMeterType>(OsuConfig.ScoreMeter)
         },
         new SliderOption<double>
         {
             LabelText = "Score meter size",
             Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.ScoreMeterScale)
         },
         new CheckBoxOption
         {
             LabelText = "Always show key overlay",
             Bindable = config.GetBindable<bool>(OsuConfig.KeyOverlay)
         },
         new CheckBoxOption
         {
             LabelText = "Show approach circle on first \"Hidden\" object",
             Bindable = config.GetBindable<bool>(OsuConfig.HiddenShowFirstApproach)
         },
         new CheckBoxOption
         {
             LabelText = "Scale osu!mania scroll speed with BPM",
             Bindable = config.GetBindable<bool>(OsuConfig.ManiaSpeedBPMScale)
         },
         new CheckBoxOption
         {
             LabelText = "Remember osu!mania scroll speed per beatmap",
             Bindable = config.GetBindable<bool>(OsuConfig.UsePerBeatmapManiaSpeed)
         },
     };
 }
Exemple #13
0
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new SliderOption<int>
         {
             LabelText = "Universal Offset",
             Bindable = (BindableInt)config.GetBindable<int>(OsuConfig.Offset)
         },
         new OsuButton
         {
             RelativeSizeAxes = Axes.X,
             Text = "Offset wizard"
         }
     };
 }
Exemple #14
0
 private void load(OsuConfigManager config)
 {
     content.Spacing = new Vector2(0, 5);
     Children = new Drawable[]
     {
         new SpriteText { Text = "TODO: Skin preview textures" },
         new SpriteText { Text = "Current skin: TODO dropdown" },
         new OsuButton
         {
             RelativeSizeAxes = Axes.X,
             Text = "Preview gameplay",
         },
         new OsuButton
         {
             RelativeSizeAxes = Axes.X,
             Text = "Open skin folder",
         },
         new OsuButton
         {
             RelativeSizeAxes = Axes.X,
             Text = "Export as .osk",
         },
         new CheckBoxOption
         {
             LabelText = "Ignore all beatmap skins",
             Bindable = config.GetBindable<bool>(OsuConfig.IgnoreBeatmapSkins)
         },
         new CheckBoxOption
         {
             LabelText = "Use skin's sound samples",
             Bindable = config.GetBindable<bool>(OsuConfig.SkinSamples)
         },
         new CheckBoxOption
         {
             LabelText = "Use Taiko skin for Taiko mode",
             Bindable = config.GetBindable<bool>(OsuConfig.UseTaikoSkin)
         },
         new CheckBoxOption
         {
             LabelText = "Always use skin cursor",
             Bindable = config.GetBindable<bool>(OsuConfig.UseSkinCursor)
         },
         new SliderOption<double>
         {
             LabelText = "Cursor size",
             Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.CursorSize)
         },
         new CheckBoxOption
         {
             LabelText = "Automatic cursor size",
             Bindable = config.GetBindable<bool>(OsuConfig.AutomaticCursorSizing)
         },
     };
 }
Exemple #15
0
 private void load(BasicStorage storage, OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new DropdownOption<ReleaseStream>
         {
             LabelText = "Release stream",
             Bindable = config.GetBindable<ReleaseStream>(OsuConfig.ReleaseStream),
         },
         new SpriteText { Text = "Your osu! is up to date" }, // TODO: map this to reality
         new OsuButton
         {
             RelativeSizeAxes = Axes.X,
             Text = "Open osu! folder",
             Action = () => storage.OpenInNativeExplorer(),
         }
     };
 }
Exemple #16
0
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new SliderOption<double>
         {
             LabelText = "Sensitivity",
             Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.MouseSpeed),
         },
         new CheckBoxOption
         {
             LabelText = "Raw input",
             Bindable = config.GetBindable<bool>(OsuConfig.RawInput)
         },
         new CheckBoxOption
         {
             LabelText = "Map absolute raw input to the osu! window",
             Bindable = config.GetBindable<bool>(OsuConfig.AbsoluteToOsuWindow)
         },
         new DropdownOption<ConfineMouseMode>
         {
             LabelText = "Confine mouse cursor",
             Bindable = config.GetBindable<ConfineMouseMode>(OsuConfig.ConfineMouse),
         },
         new CheckBoxOption
         {
             LabelText = "Disable mouse wheel in play mode",
             Bindable = config.GetBindable<bool>(OsuConfig.MouseDisableWheel)
         },
         new CheckBoxOption
         {
             LabelText = "Disable mouse buttons in play mode",
             Bindable = config.GetBindable<bool>(OsuConfig.MouseDisableButtons)
         },
         new CheckBoxOption
         {
             LabelText = "Cursor ripples",
             Bindable = config.GetBindable<bool>(OsuConfig.CursorRipple)
         },
     };
 }
Exemple #17
0
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new CheckBoxOption
         {
             LabelText = "Filter offensive words",
             Bindable = config.GetBindable<bool>(OsuConfig.ChatFilter)
         },
         new CheckBoxOption
         {
             LabelText = "Filter foreign characters",
             Bindable = config.GetBindable<bool>(OsuConfig.ChatRemoveForeign)
         },
         new CheckBoxOption
         {
             LabelText = "Log private messages",
             Bindable = config.GetBindable<bool>(OsuConfig.LogPrivateMessages)
         },
         new CheckBoxOption
         {
             LabelText = "Block private messages from non-friends",
             Bindable = config.GetBindable<bool>(OsuConfig.BlockNonFriendPM)
         },
         new SpriteText { Text = "Chat ignore list (space-seperated list)" },
         chatIgnoreList = new TextBoxOption {
             Height = 20,
             RelativeSizeAxes = Axes.X,
             Bindable = config.GetBindable<string>(OsuConfig.IgnoreList)
         },
         new SpriteText { Text = "Chat highlight words (space-seperated list)" },
         chatHighlightWords = new TextBoxOption {
             Height = 20,
             RelativeSizeAxes = Axes.X,
             Bindable = config.GetBindable<string>(OsuConfig.HighlightWords)
         },
     };
 }
Exemple #18
0
 private void load(OsuConfigManager config)
 {
     content.Spacing = new Vector2(0, 5);
     Children = new Drawable[]
     {
         new CheckBoxOption
         {
             LabelText = "Background video",
             Bindable = config.GetBindable<bool>(OsuConfig.VideoEditor)
         },
         new CheckBoxOption
         {
             LabelText = "Always use default skin",
             Bindable = config.GetBindable<bool>(OsuConfig.EditorDefaultSkin)
         },
         new CheckBoxOption
         {
             LabelText = "Snaking sliders",
             Bindable = config.GetBindable<bool>(OsuConfig.EditorSnakingSliders)
         },
         new CheckBoxOption
         {
             LabelText = "Hit animations",
             Bindable = config.GetBindable<bool>(OsuConfig.EditorHitAnimations)
         },
         new CheckBoxOption
         {
             LabelText = "Follow points",
             Bindable = config.GetBindable<bool>(OsuConfig.EditorFollowPoints)
         },
         new CheckBoxOption
         {
             LabelText = "Stacking",
             Bindable = config.GetBindable<bool>(OsuConfig.EditorStacking)
         },
     };
 }
Exemple #19
0
 private void load(OsuConfigManager config)
 {
     Children = new Drawable[]
     {
         new CheckBoxOption
         {
             LabelText = "Enable chat ticker",
             Bindable = config.GetBindable<bool>(OsuConfig.Ticker)
         },
         new CheckBoxOption
         {
             LabelText = "Show a notification popup when someone says your name",
             Bindable = config.GetBindable<bool>(OsuConfig.ChatHighlightName)
         },
         new CheckBoxOption
         {
             LabelText = "Show chat message notifications",
             Bindable = config.GetBindable<bool>(OsuConfig.ChatMessageNotification)
         },
         new CheckBoxOption
         {
             LabelText = "Play a sound when someone says your name",
             Bindable = config.GetBindable<bool>(OsuConfig.ChatAudibleHighlight)
         },
         new CheckBoxOption
         {
             LabelText = "Show notification popups instantly during gameplay",
             Bindable = config.GetBindable<bool>(OsuConfig.PopupDuringGameplay)
         },
         new CheckBoxOption
         {
             LabelText = "Show notification popups when friends change status",
             Bindable = config.GetBindable<bool>(OsuConfig.NotifyFriends)
         },
     };
 }
Exemple #20
0
        private void load(OsuConfigManager config)
        {
            Children = new Drawable[]
            {
                new SettingsSlider <double>
                {
                    LabelText           = "Background dim",
                    Current             = config.GetBindable <double>(OsuSetting.DimLevel),
                    KeyboardStep        = 0.01f,
                    DisplayAsPercentage = true
                },
                new SettingsSlider <double>
                {
                    LabelText           = "Background blur",
                    Current             = config.GetBindable <double>(OsuSetting.BlurLevel),
                    KeyboardStep        = 0.01f,
                    DisplayAsPercentage = true
                },
                new SettingsCheckbox
                {
                    LabelText = "Lighten playfield during breaks",
                    Current   = config.GetBindable <bool>(OsuSetting.LightenDuringBreaks)
                },
                new SettingsEnumDropdown <HUDVisibilityMode>
                {
                    LabelText = "HUD overlay visibility mode",
                    Current   = config.GetBindable <HUDVisibilityMode>(OsuSetting.HUDVisibilityMode)
                },
                new SettingsCheckbox
                {
                    LabelText = "Show difficulty graph on progress bar",
                    Current   = config.GetBindable <bool>(OsuSetting.ShowDifficultyGraph)
                },
                new SettingsCheckbox
                {
                    LabelText = "Show health display even when you can't fail",
                    Current   = config.GetBindable <bool>(OsuSetting.ShowHealthDisplayWhenCantFail),
                    Keywords  = new[] { "hp", "bar" }
                },
                new SettingsCheckbox
                {
                    LabelText = "Fade playfield to red when health is low",
                    Current   = config.GetBindable <bool>(OsuSetting.FadePlayfieldWhenHealthLow),
                },
                new SettingsCheckbox
                {
                    LabelText = "Always show key overlay",
                    Current   = config.GetBindable <bool>(OsuSetting.KeyOverlay)
                },
                new SettingsCheckbox
                {
                    LabelText = "Positional hitsounds",
                    Current   = config.GetBindable <bool>(OsuSetting.PositionalHitSounds)
                },
                new SettingsCheckbox
                {
                    LabelText = "Always play first combo break sound",
                    Current   = config.GetBindable <bool>(OsuSetting.AlwaysPlayFirstComboBreak)
                },
                new SettingsEnumDropdown <ScoringMode>
                {
                    LabelText = "Score display mode",
                    Current   = config.GetBindable <ScoringMode>(OsuSetting.ScoreDisplayMode),
                    Keywords  = new[] { "scoring" }
                },
            };

            if (RuntimeInfo.OS == RuntimeInfo.Platform.Windows)
            {
                Add(new SettingsCheckbox
                {
                    LabelText = "Disable Windows key during gameplay",
                    Current   = config.GetBindable <bool>(OsuSetting.GameplayDisableWinKey)
                });
            }
        }
Exemple #21
0
        private void load(OsuConfigManager config)
        {
            this.config = config;

            preferUnicode = config.GetBindable<bool>(OsuConfig.ShowUnicode);
            preferUnicode.ValueChanged += preferUnicode_changed;
            preferUnicode_changed(preferUnicode, null);
        }
Exemple #22
0
        private void load(OsuConfigManager config)
        {
            snakingIn = config.GetBindable<bool>(OsuConfig.SnakingInSliders);
            snakingOut = config.GetBindable<bool>(OsuConfig.SnakingOutSliders);

            int textureWidth = (int)PathWidth * 2;

            //initialise background
            var upload = new TextureUpload(textureWidth * 4);
            var bytes = upload.Data;

            const float aa_portion = 0.02f;
            const float border_portion = 0.18f;
            const float gradient_portion = 1 - border_portion;

            const float opacity_at_centre = 0.3f;
            const float opacity_at_edge = 0.8f;

            for (int i = 0; i < textureWidth; i++)
            {
                float progress = (float)i / (textureWidth - 1);

                if (progress <= border_portion)
                {
                    bytes[i * 4] = 255;
                    bytes[i * 4 + 1] = 255;
                    bytes[i * 4 + 2] = 255;
                    bytes[i * 4 + 3] = (byte)(Math.Min(progress / aa_portion, 1) * 255);
                }
                else
                {
                    progress -= border_portion;

                    bytes[i * 4] = (byte)(slider.Colour.R * 255);
                    bytes[i * 4 + 1] = (byte)(slider.Colour.G * 255);
                    bytes[i * 4 + 2] = (byte)(slider.Colour.B * 255);
                    bytes[i * 4 + 3] = (byte)((opacity_at_edge - (opacity_at_edge - opacity_at_centre) * progress / gradient_portion) * (slider.Colour.A * 255));
                }
            }

            var texture = new Texture(textureWidth, 1);
            texture.SetData(upload);
            path.Texture = texture;
        }
Exemple #23
0
 private void load(OsuConfigManager config)
 {
     mouseDisabled = config.GetBindable<bool>(OsuConfig.MouseDisableButtons)
         ?? new Bindable<bool>(false);
 }
Exemple #24
0
        private void load(OsuConfigManager config, OsuColour colours, TextureStore textures)
        {
            const float padding = 5;

            Children = new Drawable[]
            {
                channelSelectionContainer = new Container
                {
                    RelativeSizeAxes = Axes.Both,
                    Height           = 1f - DEFAULT_HEIGHT,
                    Masking          = true,
                    Children         = new[]
                    {
                        ChannelSelectionOverlay = new ChannelSelectionOverlay
                        {
                            RelativeSizeAxes = Axes.Both,
                        },
                    },
                },
                chatContainer = new Container
                {
                    Name             = @"chat container",
                    Anchor           = Anchor.BottomLeft,
                    Origin           = Anchor.BottomLeft,
                    RelativeSizeAxes = Axes.Both,
                    Height           = DEFAULT_HEIGHT,
                    Children         = new[]
                    {
                        new Container
                        {
                            Name             = @"chat area",
                            RelativeSizeAxes = Axes.Both,
                            Padding          = new MarginPadding {
                                Top = TAB_AREA_HEIGHT
                            },
                            Children = new Drawable[]
                            {
                                chatBackground = new Box
                                {
                                    RelativeSizeAxes = Axes.Both,
                                },
                                new OnlineViewContainer("Sign in to chat")
                                {
                                    RelativeSizeAxes = Axes.Both,
                                    Children         = new Drawable[]
                                    {
                                        currentChannelContainer = new Container <DrawableChannel>
                                        {
                                            RelativeSizeAxes = Axes.Both,
                                            Padding          = new MarginPadding
                                            {
                                                Bottom = textbox_height
                                            },
                                        },
                                        new Container
                                        {
                                            Anchor           = Anchor.BottomLeft,
                                            Origin           = Anchor.BottomLeft,
                                            RelativeSizeAxes = Axes.X,
                                            Height           = textbox_height,
                                            Padding          = new MarginPadding
                                            {
                                                Top    = padding * 2,
                                                Bottom = padding * 2,
                                                Left   = ChatLine.LEFT_PADDING + padding * 2,
                                                Right  = padding * 2,
                                            },
                                            Children = new Drawable[]
                                            {
                                                textbox = new FocusedTextBox
                                                {
                                                    RelativeSizeAxes     = Axes.Both,
                                                    Height               = 1,
                                                    PlaceholderText      = "type your message",
                                                    ReleaseFocusOnCommit = false,
                                                    HoldFocus            = true,
                                                }
                                            }
                                        },
                                        loading = new LoadingSpinner(),
                                    },
                                }
                            }
                        },
                        tabsArea = new TabsArea
                        {
                            Children = new Drawable[]
                            {
                                tabBackground = new Box
                                {
                                    RelativeSizeAxes = Axes.Both,
                                    Colour           = Colour4.Black,
                                },
                                new Sprite
                                {
                                    Texture = textures.Get(IconTexture),
                                    Anchor  = Anchor.CentreLeft,
                                    Origin  = Anchor.CentreLeft,
                                    Size    = new Vector2(OverlayTitle.ICON_SIZE),
                                    Margin  = new MarginPadding {
                                        Left = 10
                                    },
                                },
                                ChannelTabControl = CreateChannelTabControl().With(d =>
                                {
                                    d.Anchor           = Anchor.BottomLeft;
                                    d.Origin           = Anchor.BottomLeft;
                                    d.RelativeSizeAxes = Axes.Both;
                                    d.OnRequestLeave   = channelManager.LeaveChannel;
                                    d.IsSwitchable     = true;
                                }),
                            }
                        },
                    },
                },
            };

            textbox.OnCommit += postMessage;

            ChannelTabControl.Current.ValueChanged += current => channelManager.CurrentChannel.Value = current.NewValue;
            ChannelTabControl.ChannelSelectorActive.ValueChanged += active => ChannelSelectionOverlay.State.Value = active.NewValue ? Visibility.Visible : Visibility.Hidden;
            ChannelSelectionOverlay.State.ValueChanged           += state =>
            {
                // Propagate the visibility state to ChannelSelectorActive
                ChannelTabControl.ChannelSelectorActive.Value = state.NewValue == Visibility.Visible;

                if (state.NewValue == Visibility.Visible)
                {
                    textbox.HoldFocus = false;
                    if (1f - ChatHeight.Value < channel_selection_min_height)
                    {
                        this.TransformBindableTo(ChatHeight, 1f - channel_selection_min_height, 800, Easing.OutQuint);
                    }
                }
                else
                {
                    textbox.HoldFocus = true;
                }
            };

            ChannelSelectionOverlay.OnRequestJoin  = channel => channelManager.JoinChannel(channel);
            ChannelSelectionOverlay.OnRequestLeave = channelManager.LeaveChannel;

            ChatHeight = config.GetBindable <float>(OsuSetting.ChatDisplayHeight);
            ChatHeight.BindValueChanged(height =>
            {
                chatContainer.Height             = height.NewValue;
                channelSelectionContainer.Height = 1f - height.NewValue;
                tabBackground.FadeTo(height.NewValue == 1f ? 1f : 0.8f, 200);
            }, true);

            chatBackground.Colour = colours.ChatBlue;

            loading.Show();

            // This is a relatively expensive (and blocking) operation.
            // Scheduling it ensures that it won't be performed unless the user decides to open chat.
            // TODO: Refactor OsuFocusedOverlayContainer / OverlayContainer to support delayed content loading.
            Schedule(() =>
            {
                // TODO: consider scheduling bindable callbacks to not perform when overlay is not present.
                channelManager.JoinedChannels.CollectionChanged += joinedChannelsChanged;

                foreach (Channel channel in channelManager.JoinedChannels)
                {
                    ChannelTabControl.AddChannel(channel);
                }

                channelManager.AvailableChannels.CollectionChanged += availableChannelsChanged;
                availableChannelsChanged(null, null);

                currentChannel = channelManager.CurrentChannel.GetBoundCopy();
                currentChannel.BindValueChanged(currentChannelChanged, true);
            });
        }