Editor/KeybindHelper.cs
using System;
using System.Collections.Generic;
using System.Linq;

namespace Editor;

/// <summary>
/// Global keybind helper that shows all shortcuts when F1 is pressed
/// </summary>
public static class KeybindHelper
{
	static ContextMenu _currentMenu;

	[Shortcut( "editor.show-keybinds", "F1" )]
	public static void ShowKeybindsMenu()
	{
		// If menu is already open, close it instead of opening another
		if ( _currentMenu != null && _currentMenu.IsValid() )
		{
			_currentMenu.Close();
			_currentMenu = null;
			return;
		}

		_currentMenu = new ContextMenu();
		_currentMenu.Searchable = true;
		_currentMenu.ToolTipsVisible = true;
		_currentMenu.AboutToHide += () => _currentMenu = null;

		BuildShortcutsMenu( _currentMenu );

		_currentMenu.OpenAtCursor( false );
	}

	static void BuildShortcutsMenu( ContextMenu menu )
	{
		// Group shortcuts by category
		var groups = EditorShortcuts.Entries
			.GroupBy( x => x.Group )
			.OrderBy( x => x.Key );

		int totalShortcuts = 0;

		foreach ( var group in groups )
		{
			// Only show groups that have visible shortcuts
			var shortcuts = group
				.GroupBy( x => x.Identifier )
				.Select( x => x.First() )
				.Where( x => !string.IsNullOrEmpty( EditorShortcuts.GetKeys( x.Identifier ) ) )
				.OrderBy( x => x.Name )
				.ToList();

			if ( shortcuts.Count == 0 )
				continue;

			// Create submenu for this category
			var categoryName = group.Key;
			var submenu = menu.AddMenu( categoryName, "folder" );

			// Add shortcuts to submenu
			AddShortcutsToMenu( submenu, shortcuts );

			totalShortcuts += shortcuts.Count;
		}
	}

	static void AddShortcutsToMenu( Menu menu, List<EditorShortcuts.Entry> shortcuts )
	{
		menu.ToolTipsVisible = true;

		foreach ( var shortcut in shortcuts )
		{
			var keys = EditorShortcuts.GetKeys( shortcut.Identifier );

			// Use tab character for alignment
			var displayText = $"{shortcut.Name}\t{keys}";
			var option = menu.AddOption( displayText, null, null );
			option.Enabled = false;
		}
	}
}