2019-01-24 16:43:03 +08:00
// 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.
2018-04-13 17:19:50 +08:00
using System.Collections.Generic ;
using System.ComponentModel ;
using System.Linq ;
using osu.Framework.Graphics ;
using osu.Framework.Input ;
using osu.Framework.Input.Bindings ;
namespace osu.Game.Input.Bindings
{
2019-08-27 17:42:49 +08:00
public class GlobalActionContainer : DatabasedKeyBindingContainer < GlobalAction > , IHandleGlobalKeyboardInput
2018-04-13 17:19:50 +08:00
{
private readonly Drawable handler ;
2021-04-08 14:17:53 +08:00
private InputManager parentInputManager ;
2018-04-13 17:19:50 +08:00
public GlobalActionContainer ( OsuGameBase game )
2020-03-02 17:54:00 +08:00
: base ( matchingMode : KeyCombinationMatchingMode . Modifiers )
2018-04-13 17:19:50 +08:00
{
if ( game is IKeyBindingHandler < GlobalAction > )
handler = game ;
}
2021-04-08 14:17:53 +08:00
protected override void LoadComplete ( )
{
base . LoadComplete ( ) ;
parentInputManager = GetContainingInputManager ( ) ;
}
2021-04-07 16:13:25 +08:00
public override IEnumerable < IKeyBinding > DefaultKeyBindings = > GlobalKeyBindings
2021-04-07 16:41:05 +08:00
. Concat ( EditorKeyBindings )
2021-04-07 16:13:25 +08:00
. Concat ( InGameKeyBindings )
. Concat ( SongSelectKeyBindings )
2021-04-07 16:41:05 +08:00
. Concat ( AudioControlKeyBindings ) ;
2018-04-13 17:19:50 +08:00
public IEnumerable < KeyBinding > GlobalKeyBindings = > new [ ]
{
2020-01-12 03:43:51 +08:00
new KeyBinding ( InputKey . F6 , GlobalAction . ToggleNowPlaying ) ,
2018-04-13 17:19:50 +08:00
new KeyBinding ( InputKey . F8 , GlobalAction . ToggleChat ) ,
new KeyBinding ( InputKey . F9 , GlobalAction . ToggleSocial ) ,
2018-05-02 18:42:03 +08:00
new KeyBinding ( InputKey . F10 , GlobalAction . ToggleGameplayMouseButtons ) ,
2018-05-15 01:27:05 +08:00
new KeyBinding ( InputKey . F12 , GlobalAction . TakeScreenshot ) ,
2018-04-13 17:19:50 +08:00
new KeyBinding ( new [ ] { InputKey . Control , InputKey . Alt , InputKey . R } , GlobalAction . ResetInputSettings ) ,
new KeyBinding ( new [ ] { InputKey . Control , InputKey . T } , GlobalAction . ToggleToolbar ) ,
new KeyBinding ( new [ ] { InputKey . Control , InputKey . O } , GlobalAction . ToggleSettings ) ,
2021-01-06 22:12:56 +08:00
new KeyBinding ( new [ ] { InputKey . Control , InputKey . D } , GlobalAction . ToggleBeatmapListing ) ,
2020-07-11 03:05:23 +08:00
new KeyBinding ( new [ ] { InputKey . Control , InputKey . N } , GlobalAction . ToggleNotifications ) ,
2018-05-15 01:27:05 +08:00
new KeyBinding ( InputKey . Escape , GlobalAction . Back ) ,
2019-07-11 21:21:37 +08:00
new KeyBinding ( InputKey . ExtraMouseButton1 , GlobalAction . Back ) ,
2018-07-03 17:37:21 +08:00
2020-06-15 02:22:38 +08:00
new KeyBinding ( new [ ] { InputKey . Alt , InputKey . Home } , GlobalAction . Home ) ,
2020-03-02 17:55:28 +08:00
new KeyBinding ( InputKey . Up , GlobalAction . SelectPrevious ) ,
new KeyBinding ( InputKey . Down , GlobalAction . SelectNext ) ,
2018-07-03 17:37:21 +08:00
new KeyBinding ( InputKey . Space , GlobalAction . Select ) ,
new KeyBinding ( InputKey . Enter , GlobalAction . Select ) ,
2018-11-14 01:09:28 +08:00
new KeyBinding ( InputKey . KeypadEnter , GlobalAction . Select ) ,
2020-11-11 12:05:03 +08:00
new KeyBinding ( new [ ] { InputKey . Control , InputKey . Shift , InputKey . R } , GlobalAction . RandomSkin ) ,
2018-04-13 17:19:50 +08:00
} ;
2020-09-22 14:55:25 +08:00
public IEnumerable < KeyBinding > EditorKeyBindings = > new [ ]
{
new KeyBinding ( new [ ] { InputKey . F1 } , GlobalAction . EditorComposeMode ) ,
new KeyBinding ( new [ ] { InputKey . F2 } , GlobalAction . EditorDesignMode ) ,
new KeyBinding ( new [ ] { InputKey . F3 } , GlobalAction . EditorTimingMode ) ,
new KeyBinding ( new [ ] { InputKey . F4 } , GlobalAction . EditorSetupMode ) ,
2021-04-12 15:15:27 +08:00
new KeyBinding ( new [ ] { InputKey . Control , InputKey . Shift , InputKey . A } , GlobalAction . EditorVerifyMode ) ,
2021-04-22 17:47:04 +08:00
new KeyBinding ( new [ ] { InputKey . J } , GlobalAction . EditorNudgeLeft ) ,
new KeyBinding ( new [ ] { InputKey . K } , GlobalAction . EditorNudgeRight ) ,
2020-09-22 14:55:25 +08:00
} ;
2018-04-13 17:19:50 +08:00
public IEnumerable < KeyBinding > InGameKeyBindings = > new [ ]
{
new KeyBinding ( InputKey . Space , GlobalAction . SkipCutscene ) ,
2020-08-18 14:21:44 +08:00
new KeyBinding ( InputKey . ExtraMouseButton2 , GlobalAction . SkipCutscene ) ,
2018-05-31 11:06:50 +08:00
new KeyBinding ( InputKey . Tilde , GlobalAction . QuickRetry ) ,
2019-06-24 17:19:17 +08:00
new KeyBinding ( new [ ] { InputKey . Control , InputKey . Tilde } , GlobalAction . QuickExit ) ,
2018-05-31 11:06:50 +08:00
new KeyBinding ( new [ ] { InputKey . Control , InputKey . Plus } , GlobalAction . IncreaseScrollSpeed ) ,
new KeyBinding ( new [ ] { InputKey . Control , InputKey . Minus } , GlobalAction . DecreaseScrollSpeed ) ,
2020-12-01 10:38:16 +08:00
new KeyBinding ( new [ ] { InputKey . Shift , InputKey . Tab } , GlobalAction . ToggleInGameInterface ) ,
2020-07-12 22:03:03 +08:00
new KeyBinding ( InputKey . MouseMiddle , GlobalAction . PauseGameplay ) ,
2020-11-26 19:04:44 +08:00
new KeyBinding ( InputKey . Space , GlobalAction . TogglePauseReplay ) ,
2020-10-30 13:19:40 +08:00
new KeyBinding ( InputKey . Control , GlobalAction . HoldForHUD ) ,
2018-04-13 17:19:50 +08:00
} ;
2020-06-03 13:55:15 +08:00
public IEnumerable < KeyBinding > SongSelectKeyBindings = > new [ ]
{
2020-06-03 14:13:02 +08:00
new KeyBinding ( InputKey . F1 , GlobalAction . ToggleModSelection ) ,
new KeyBinding ( InputKey . F2 , GlobalAction . SelectNextRandom ) ,
new KeyBinding ( new [ ] { InputKey . Shift , InputKey . F2 } , GlobalAction . SelectPreviousRandom ) ,
new KeyBinding ( InputKey . F3 , GlobalAction . ToggleBeatmapOptions )
2020-06-03 13:55:15 +08:00
} ;
2019-08-13 11:40:20 +08:00
public IEnumerable < KeyBinding > AudioControlKeyBindings = > new [ ]
{
2020-03-02 17:59:05 +08:00
new KeyBinding ( new [ ] { InputKey . Alt , InputKey . Up } , GlobalAction . IncreaseVolume ) ,
new KeyBinding ( new [ ] { InputKey . Alt , InputKey . Down } , GlobalAction . DecreaseVolume ) ,
2020-09-23 11:31:50 +08:00
new KeyBinding ( new [ ] { InputKey . Control , InputKey . F4 } , GlobalAction . ToggleMute ) ,
2019-08-13 11:40:20 +08:00
new KeyBinding ( InputKey . TrackPrevious , GlobalAction . MusicPrev ) ,
new KeyBinding ( InputKey . F1 , GlobalAction . MusicPrev ) ,
new KeyBinding ( InputKey . TrackNext , GlobalAction . MusicNext ) ,
new KeyBinding ( InputKey . F5 , GlobalAction . MusicNext ) ,
new KeyBinding ( InputKey . PlayPause , GlobalAction . MusicPlay ) ,
new KeyBinding ( InputKey . F3 , GlobalAction . MusicPlay )
} ;
2021-04-05 21:30:51 +08:00
protected override IEnumerable < Drawable > KeyBindingInputQueue
{
get
{
2021-04-08 14:17:53 +08:00
// To ensure the global actions are handled with priority, this GlobalActionContainer is actually placed after game content.
// It does not contain children as expected, so we need to forward the NonPositionalInputQueue from the parent input manager to correctly
// allow the whole game to handle these actions.
// An eventual solution to this hack is to create localised action containers for individual components like SongSelect, but this will take some rearranging.
var inputQueue = parentInputManager ? . NonPositionalInputQueue ? ? base . KeyBindingInputQueue ;
2021-03-30 18:03:15 +08:00
2021-04-05 21:30:51 +08:00
return handler ! = null ? inputQueue . Prepend ( handler ) : inputQueue ;
}
}
2018-04-13 17:19:50 +08:00
}
public enum GlobalAction
{
[Description("Toggle chat overlay")]
ToggleChat ,
2019-02-28 12:31:40 +08:00
2018-04-13 17:19:50 +08:00
[Description("Toggle social overlay")]
ToggleSocial ,
2019-02-28 12:31:40 +08:00
2018-04-13 17:19:50 +08:00
[Description("Reset input settings")]
ResetInputSettings ,
2019-02-28 12:31:40 +08:00
2018-04-13 17:19:50 +08:00
[Description("Toggle toolbar")]
ToggleToolbar ,
2019-02-28 12:31:40 +08:00
2018-04-13 17:19:50 +08:00
[Description("Toggle settings")]
ToggleSettings ,
2019-02-28 12:31:40 +08:00
2021-01-06 21:56:10 +08:00
[Description("Toggle beatmap listing")]
2021-01-06 22:12:56 +08:00
ToggleBeatmapListing ,
2019-02-28 12:31:40 +08:00
2018-09-15 22:30:11 +08:00
[Description("Increase volume")]
2018-04-13 17:19:50 +08:00
IncreaseVolume ,
2019-02-28 12:31:40 +08:00
2018-09-15 22:30:11 +08:00
[Description("Decrease volume")]
2018-04-13 17:19:50 +08:00
DecreaseVolume ,
2019-02-28 12:31:40 +08:00
2018-04-13 17:19:50 +08:00
[Description("Toggle mute")]
ToggleMute ,
// In-Game Keybindings
2018-09-15 22:30:11 +08:00
[Description("Skip cutscene")]
2018-04-13 17:19:50 +08:00
SkipCutscene ,
2019-02-28 12:31:40 +08:00
2018-09-15 22:30:11 +08:00
[Description("Quick retry (hold)")]
2018-04-13 17:19:50 +08:00
QuickRetry ,
[Description("Take screenshot")]
2018-05-15 01:27:05 +08:00
TakeScreenshot ,
2019-02-28 12:31:40 +08:00
2018-05-02 18:37:47 +08:00
[Description("Toggle gameplay mouse buttons")]
2018-05-02 18:42:03 +08:00
ToggleGameplayMouseButtons ,
2018-05-15 01:27:05 +08:00
2018-07-03 17:37:21 +08:00
[Description("Back")]
2018-05-31 11:06:50 +08:00
Back ,
[Description("Increase scroll speed")]
IncreaseScrollSpeed ,
[Description("Decrease scroll speed")]
DecreaseScrollSpeed ,
2018-07-03 17:37:21 +08:00
[Description("Select")]
Select ,
2019-06-25 16:16:19 +08:00
2020-12-04 16:51:46 +08:00
[Description("Quick exit (hold)")]
2019-06-25 16:16:19 +08:00
QuickExit ,
2019-08-12 01:14:49 +08:00
2020-09-22 14:55:25 +08:00
// Game-wide beatmap music controller keybindings
2019-08-13 11:06:57 +08:00
[Description("Next track")]
2019-08-12 01:14:49 +08:00
MusicNext ,
2019-08-13 11:06:57 +08:00
[Description("Previous track")]
2019-08-12 01:14:49 +08:00
MusicPrev ,
2019-08-13 11:06:57 +08:00
[Description("Play / pause")]
2019-08-12 01:14:49 +08:00
MusicPlay ,
2020-01-12 03:43:51 +08:00
[Description("Toggle now playing overlay")]
ToggleNowPlaying ,
2020-03-02 17:55:28 +08:00
2020-11-26 19:07:16 +08:00
[Description("Previous selection")]
2020-03-02 17:55:28 +08:00
SelectPrevious ,
2020-11-26 19:07:16 +08:00
[Description("Next selection")]
2020-03-02 17:55:28 +08:00
SelectNext ,
2020-06-15 02:22:38 +08:00
[Description("Home")]
Home ,
2020-07-12 22:03:03 +08:00
2020-07-11 03:05:23 +08:00
[Description("Toggle notifications")]
2020-07-14 06:39:02 +08:00
ToggleNotifications ,
2020-07-14 19:37:21 +08:00
2020-11-26 19:07:16 +08:00
[Description("Pause gameplay")]
2020-07-12 22:03:03 +08:00
PauseGameplay ,
2020-09-22 14:55:25 +08:00
// Editor
2020-11-26 19:07:16 +08:00
[Description("Setup mode")]
2020-09-22 14:55:25 +08:00
EditorSetupMode ,
2020-11-26 19:07:16 +08:00
[Description("Compose mode")]
2020-09-22 14:55:25 +08:00
EditorComposeMode ,
2020-11-26 19:07:16 +08:00
[Description("Design mode")]
2020-09-22 14:55:25 +08:00
EditorDesignMode ,
2020-11-26 19:07:16 +08:00
[Description("Timing mode")]
2020-09-22 14:55:25 +08:00
EditorTimingMode ,
2020-10-30 13:19:40 +08:00
[Description("Hold for HUD")]
HoldForHUD ,
2020-11-11 12:05:03 +08:00
2020-11-26 19:07:16 +08:00
[Description("Random skin")]
2020-11-11 12:05:03 +08:00
RandomSkin ,
2020-11-24 14:41:56 +08:00
2020-11-26 19:04:44 +08:00
[Description("Pause / resume replay")]
TogglePauseReplay ,
2020-12-01 10:38:16 +08:00
[Description("Toggle in-game interface")]
ToggleInGameInterface ,
2021-04-07 16:13:25 +08:00
2020-06-07 11:37:19 +08:00
// Song select keybindings
2020-06-15 17:44:38 +08:00
[Description("Toggle Mod Select")]
2020-06-07 11:37:19 +08:00
ToggleModSelection ,
2020-06-15 17:44:38 +08:00
[Description("Random")]
2020-06-07 11:37:19 +08:00
SelectNextRandom ,
2020-06-15 17:44:38 +08:00
[Description("Rewind")]
2020-06-07 11:37:19 +08:00
SelectPreviousRandom ,
2020-06-15 17:44:38 +08:00
[Description("Beatmap Options")]
2020-06-07 11:37:19 +08:00
ToggleBeatmapOptions ,
2021-04-12 15:15:27 +08:00
[Description("Verify mode")]
EditorVerifyMode ,
2021-04-22 17:47:04 +08:00
[Description("Nudge selection left")]
EditorNudgeLeft ,
[Description("Nudge selection right")]
EditorNudgeRight
2018-04-13 17:19:50 +08:00
}
}