diff options
Diffstat (limited to 'mac/.config/mpv/scripts/UndoRedo.lua')
| -rw-r--r-- | mac/.config/mpv/scripts/UndoRedo.lua | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/mac/.config/mpv/scripts/UndoRedo.lua b/mac/.config/mpv/scripts/UndoRedo.lua new file mode 100644 index 0000000..67d3f2b --- /dev/null +++ b/mac/.config/mpv/scripts/UndoRedo.lua @@ -0,0 +1,212 @@ +-- Copyright (c) 2021, Eisa AlAwadhi +-- License: BSD 2-Clause License + +-- Creator: Eisa AlAwadhi +-- Project: UndoRedo +-- Version: 2.2 + +local utils = require("mp.utils") +local msg = require("mp.msg") +local seconds = 0 +local countTimer = -1 +local seekTime = 0 +local seekNumber = 0 +local currentIndex = 0 +local seekTable = {} +local seeking = 0 +local undoRedo = 0 +local pause = false +seekTable[0] = 0 + +----------------------------USER CUSTOMIZATION SETTINGS----------------------------------- +--These settings are for users to manually change some options in the script. +--Keybinds can be defined in the bottom of the script. + +local osd_messages = true --true is for displaying osd messages when actions occur, Change to false will disable all osd messages generated from this script + +---------------------------END OF USER CUSTOMIZATION SETTINGS--------------------- + +local function prepareUndoRedo() + if pause == true then + seconds = seconds + else + seconds = seconds - 0.5 + end + seekTable[currentIndex] = seekTable[currentIndex] + seconds + seconds = 0 +end + +local function getUndoRedo() + if seeking == 0 then + prepareUndoRedo() + + seekNumber = currentIndex + 1 + currentIndex = seekNumber + seekTime = math.floor(mp.get_property_number("time-pos")) + table.insert(seekTable, seekNumber, seekTime) + + undoRedo = 0 + elseif seeking == 1 then + seeking = 0 + end +end + +mp.register_event("file-loaded", function() + filePath = mp.get_property("path") + + timer = mp.add_periodic_timer(0.1, function() + seconds = seconds + 0.1 + end) + + if pause == true then + timer:stop() + else + timer:resume() + end + + timer2 = mp.add_periodic_timer(0.1, function() + countTimer = countTimer + 0.1 + + if countTimer == 0.6 then + timer:resume() + getUndoRedo() + end + end) + + timer2:stop() +end) + +mp.register_event("seek", function() + countTimer = 0 + timer2:resume() + timer:stop() +end) + +mp.observe_property("pause", "bool", function(name, value) + if value then + if timer ~= nil then + timer:stop() + end + pause = true + else + if timer ~= nil then + timer:resume() + end + pause = false + end +end) + +mp.register_event("end-file", function() + if timer ~= nil then + timer:kill() + end + if timer2 ~= nil then + timer2:kill() + end + seekNumber = 0 + currentIndex = 0 + undoRedo = 0 + seconds = 0 + countTimer = -1 + seekTable[0] = 0 +end) + +local function undo() + if (filePath ~= nil) and (countTimer >= 0) and (countTimer < 0.6) and (seeking == 0) then + timer2:stop() + + getUndoRedo() + + currentIndex = currentIndex - 1 + if currentIndex < 0 then + if osd_messages == true then + mp.osd_message("No Undo Found") + end + currentIndex = 0 + msg.info("No undo found") + else + if seekTable[currentIndex] < 0 then + seekTable[currentIndex] = 0 + end + + seeking = 1 + + mp.commandv("seek", seekTable[currentIndex], "absolute", "exact") + + undoRedo = 1 + if osd_messages == true then + mp.osd_message("Undo") + end + msg.info("Seeked using undo") + end + elseif (filePath ~= nil) and (currentIndex > 0) then + prepareUndoRedo() + currentIndex = currentIndex - 1 + + if seekTable[currentIndex] < 0 then + seekTable[currentIndex] = 0 + end + + seeking = 1 + mp.commandv("seek", seekTable[currentIndex], "absolute", "exact") + + undoRedo = 1 + if osd_messages == true then + mp.osd_message("Undo") + end + msg.info("Seeked using undo") + elseif (filePath ~= nil) and (currentIndex == 0) then + if osd_messages == true then + mp.osd_message("No Undo Found") + end + msg.info("No undo found") + end +end + +local function redo() + if (filePath ~= nil) and (currentIndex < seekNumber) then + prepareUndoRedo() + currentIndex = currentIndex + 1 + + if seekTable[currentIndex] < 0 then + seekTable[currentIndex] = 0 + end + + seeking = 1 + mp.commandv("seek", seekTable[currentIndex], "absolute", "exact") + + undoRedo = 0 + + if osd_messages == true then + mp.osd_message("Redo") + end + msg.info("Seeked using redo") + elseif (filePath ~= nil) and (currentIndex == seekNumber) then + if osd_messages == true then + mp.osd_message("No Redo Found") + end + msg.info("No redo found") + end +end + +local function undoLoop() + if (filePath ~= nil) and (undoRedo == 0) then + undo() + elseif (filePath ~= nil) and (undoRedo == 1) then + redo() + elseif (filePath ~= nil) and (countTimer == -1) then + if osd_messages == true then + mp.osd_message("No Undo Found") + end + msg.info("No undo found") + end +end + +mp.add_key_binding("ctrl+z", "undo", undo) +mp.add_key_binding("ctrl+Z", "undoCaps", undo) + +mp.add_key_binding("ctrl+y", "redo", redo) +mp.add_key_binding("ctrl+Y", "redoCaps", redo) + +mp.add_key_binding("ctrl+alt+z", "undoLoop", undoLoop) +mp.add_key_binding("ctrl+alt+Z", "undoLoopCaps", undoLoop) |
