iniFile := "save.ini" ; --- Load settings --- IniRead, controllerModifier, %iniFile%, Settings, ControllerModifier, ^ IniRead, soundModifier, %iniFile%, Settings, SoundModifier, ! IniRead, SaveKey, %iniFile%, GeneralHotkeys, SaveKey, ^Numpad0 IniRead, ExitKey, %iniFile%, GeneralHotkeys, ExitKey, ^#Numpad0 IniRead, ReloadKey, %iniFile%, GeneralHotkeys, ReloadKey, ^Numpad1 ; <- Tambah ini! ; --- Initialize globals --- global Keys := [] global Paths := [] global HotkeyMap := {} LoadHotkeys() ; --- Bind SaveKey, ExitKey, and ReloadKey --- Hotkey, %SaveKey%, SaveData Hotkey, %ExitKey%, ExitAppHandler Hotkey, %ReloadKey%, ReloadData ; <- Bind reload! return ; --- Load all hotkeys from INI --- LoadHotkeys() { global Keys, Paths, HotkeyMap, iniFile, controllerModifier, soundModifier ; Clear previous keys Keys := [] Paths := [] HotkeyMap := {} idx := 1 Loop { section := "h" idx IniRead, key, %iniFile%, %section%, key, ERROR IniRead, path, %iniFile%, %section%, path, ERROR if (key = "ERROR") break Keys.Push(key) Paths.Push(path) browseHotkey := controllerModifier . key playHotkey := soundModifier . key HotkeyMap[browseHotkey] := ["Browse", idx] HotkeyMap[playHotkey] := ["Play", idx] Hotkey, %browseHotkey%, HotkeyDispatcher Hotkey, %playHotkey%, HotkeyDispatcher idx++ } } ; --- Dispatcher for all hotkeys --- HotkeyDispatcher: thisHotkey := A_ThisHotkey actionInfo := HotkeyMap[thisHotkey] if (!actionInfo) return action := actionInfo[1] idx := actionInfo[2] if (action = "Browse") BrowseFile(idx) else if (action = "Play") PlaySound(idx) return ; --- Save current keys and paths --- SaveData: IniWrite, %controllerModifier%, %iniFile%, Settings, ControllerModifier IniWrite, %soundModifier%, %iniFile%, Settings, SoundModifier IniWrite, %SaveKey%, %iniFile%, GeneralHotkeys, SaveKey IniWrite, %ExitKey%, %iniFile%, GeneralHotkeys, ExitKey IniWrite, %ReloadKey%, %iniFile%, GeneralHotkeys, ReloadKey Loop % Keys.Length() { section := "h" A_Index IniWrite, % Keys[A_Index], %iniFile%, %section%, key IniWrite, % Paths[A_Index], %iniFile%, %section%, path } MsgBox, Saved! return ; --- Reload keys and hotkeys from INI --- ReloadData: ; First unbind all old hotkeys for hkName, _ in HotkeyMap Hotkey, %hkName%, Off ; Reload modifiers and keys again IniRead, controllerModifier, %iniFile%, Settings, ControllerModifier, ^ IniRead, soundModifier, %iniFile%, Settings, SoundModifier, ! LoadHotkeys() MsgBox, Reloaded hotkeys from INI! return ; --- Exit application --- ExitAppHandler: MsgBox, Exiting... ExitApp return ; --- Browse a file and assign it --- BrowseFile(idx) { global Keys, Paths FileSelectFile, SelectedFile, 1, , Select a sound, Audio Files (*.wav; *.mp3) if (!SelectedFile) return Paths[idx] := SelectedFile } ; --- Play a sound file --- PlaySound(idx) { global Paths FilePath := Paths[idx] if (FilePath = "") { MsgBox, No file selected. } else if !FileExist(FilePath) { MsgBox, File does not exist. } else { SoundPlay, %FilePath% } }