diff --git a/assets b/assets index be9d790af..e634c8f50 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit be9d790af9c6f1f5e3afc7aed2b1d5c21823bc20 +Subproject commit e634c8f50c34845097283e0f411e1f89409e1498 diff --git a/hmm.json b/hmm.json index 070d96cd0..22dd6e42f 100644 --- a/hmm.json +++ b/hmm.json @@ -49,22 +49,20 @@ "name": "haxeui-core", "type": "git", "dir": null, - "ref": "e92d5cfac847943fac84696b103670d55c2c774f", + "ref": "815e94dd5aa6cf09c5ddcef1666a54449ffde8dc", "url": "https://github.com/haxeui/haxeui-core" }, { "name": "haxeui-flixel", "type": "git", "dir": null, - "ref": "be0b18553189a55fd42821026618a18615b070e3", + "ref": "9bd0b9e0fea40b8e06a89aac4949512d95064609", "url": "https://github.com/haxeui/haxeui-flixel" }, { "name": "hmm", - "type": "git", - "dir": null, - "ref": "d514d7786cabf18b90e60fcee38399fd44c2ddfb", - "url": "https://github.com/andywhite37/hmm" + "type": "haxelib", + "version": "3.1.0" }, { "name": "hscript", diff --git a/source/funkin/ui/debug/charting/ChartEditorState.hx b/source/funkin/ui/debug/charting/ChartEditorState.hx index 8c18271d9..366e446e5 100644 --- a/source/funkin/ui/debug/charting/ChartEditorState.hx +++ b/source/funkin/ui/debug/charting/ChartEditorState.hx @@ -35,6 +35,15 @@ import funkin.play.HealthIcon; import funkin.play.notes.NoteSprite; import funkin.play.PlayState; import funkin.play.song.Song; +import funkin.data.song.SongData.SongChartData; +import funkin.data.song.SongRegistry; +import funkin.data.song.SongData.SongEventData; +import funkin.data.song.SongData.SongMetadata; +import funkin.data.song.SongData.SongNoteData; +import funkin.data.song.SongData.SongCharacterData; +import funkin.data.song.SongDataUtils; +import funkin.ui.debug.charting.commands.ChartEditorCommand; +import funkin.ui.debug.charting.handlers.ChartEditorShortcutHandler; import funkin.play.stage.StageData; import funkin.ui.debug.charting.commands.AddEventsCommand; import funkin.ui.debug.charting.commands.AddNotesCommand; @@ -1391,6 +1400,7 @@ class ChartEditorState extends HaxeUIState buildSelectionBox(); buildAdditionalUI(); + ChartEditorShortcutHandler.applyPlatformShortcutText(this); // Setup the onClick listeners for the UI after it's been created. setupUIListeners(); diff --git a/source/funkin/ui/debug/charting/handlers/ChartEditorShortcutHandler.hx b/source/funkin/ui/debug/charting/handlers/ChartEditorShortcutHandler.hx new file mode 100644 index 000000000..016a181d3 --- /dev/null +++ b/source/funkin/ui/debug/charting/handlers/ChartEditorShortcutHandler.hx @@ -0,0 +1,61 @@ +package funkin.ui.debug.charting.handlers; + +import funkin.util.PlatformUtil; + +@:access(funkin.ui.debug.charting.ChartEditorState) +class ChartEditorShortcutHandler +{ + public static function applyPlatformShortcutText(state:ChartEditorState):Void + { + state.setComponentShortcutText('menubarItemNewChart', ctrlOrCmd('N')); + state.setComponentShortcutText('menubarItemOpenChart', ctrlOrCmd('O')); + state.setComponentShortcutText('menubarItemSaveChartAs', ctrlOrCmd(shift('S'))); + state.setComponentShortcutText('menubarItemExit', ctrlOrCmd('Q')); + + state.setComponentShortcutText('menubarItemUndo', ctrlOrCmd('Z')); + state.setComponentShortcutText('menubarItemRedo', ctrlOrCmd('Y')); + state.setComponentShortcutText('menubarItemCut', ctrlOrCmd('X')); + state.setComponentShortcutText('menubarItemCopy', ctrlOrCmd('C')); + state.setComponentShortcutText('menubarItemPaste', ctrlOrCmd('V')); + + state.setComponentShortcutText('menubarItemSelectAll', ctrlOrCmd('A')); + state.setComponentShortcutText('menubarItemSelectInverse', ctrlOrCmd('I')); + state.setComponentShortcutText('menubarItemSelectNone', ctrlOrCmd('D')); + state.setComponentShortcutText('menubarItemSelectBeforeCursor', shift('Home')); + state.setComponentShortcutText('menubarItemSelectAfterCursor', shift('End')); + + state.setComponentShortcutText('menubarItemDifficultyDown', ctrlOrCmd('←')); + state.setComponentShortcutText('menubarItemDifficultyUp', ctrlOrCmd('→')); + + state.setComponentShortcutText('menubarItemPlaytestFull', 'Enter'); + state.setComponentShortcutText('menubarItemPlaytestMinimal', shift('Enter')); + } + + /** + * Display `Ctrl` on Windows and `⌘` (Command) on macOS. + * @param input + */ + static inline function ctrlOrCmd(input:String) + { + return (PlatformUtil.isMacOS()) ? '⌘+${input}' : 'Ctrl+${input}'; + } + + /** + * Display `Ctrl` on Windows and `^` (Control) on macOS. + * @param input + */ + static inline function ctrl(input:String) + { + return (PlatformUtil.isMacOS()) ? '^+${input}' : 'Ctrl+${input}'; + } + + static inline function alt(input:String) + { + return (PlatformUtil.isMacOS()) ? '⌥+${input}' : 'Alt+${input}'; + } + + static inline function shift(input:String) + { + return (PlatformUtil.isMacOS()) ? '⇧+${input}' : 'Shift+${input}'; + } +} diff --git a/source/funkin/ui/haxeui/HaxeUIState.hx b/source/funkin/ui/haxeui/HaxeUIState.hx index 6d432b68c..d9d00dd23 100644 --- a/source/funkin/ui/haxeui/HaxeUIState.hx +++ b/source/funkin/ui/haxeui/HaxeUIState.hx @@ -2,6 +2,7 @@ package funkin.ui.haxeui; import haxe.ui.components.CheckBox; import haxe.ui.containers.menus.MenuCheckBox; +import haxe.ui.containers.menus.MenuItem; import haxe.ui.core.Component; import haxe.ui.core.Screen; import haxe.ui.events.MouseEvent; @@ -122,6 +123,20 @@ class HaxeUIState extends MusicBeatState } } + function setComponentShortcutText(key:String, text:String):Void + { + var target:MenuItem = findComponent(key, MenuItem); + if (target == null) + { + // Gracefully handle the case where the item can't be located. + trace('WARN: Could not locate menu item: $key'); + } + else + { + target.shortcutText = text; + } + } + /** * Add an onChange listener to a HaxeUI input component such as a slider or text field. */ diff --git a/source/funkin/util/PlatformUtil.hx b/source/funkin/util/PlatformUtil.hx new file mode 100644 index 000000000..b709eb475 --- /dev/null +++ b/source/funkin/util/PlatformUtil.hx @@ -0,0 +1,23 @@ +package funkin.util; + +class PlatformUtil +{ + /** + * Returns true if the current platform is MacOS. + * + * NOTE: Only use this for choosing modifier keys for shortcut hints. + * @return Whether the current platform is MacOS, or HTML5 running on MacOS. + */ + public static function isMacOS():Bool + { + #if mac + return true; + #elseif html5 + return js.Browser.window.navigator.platform.startsWith("Mac") + || js.Browser.window.navigator.platform.startsWith("iPad") + || js.Browser.window.navigator.platform.startsWith("iPhone"); + #else + return false; + #end + } +}