summaryrefslogtreecommitdiff
path: root/mac/.config/mpv/scripts/UndoRedo.lua
diff options
context:
space:
mode:
Diffstat (limited to 'mac/.config/mpv/scripts/UndoRedo.lua')
-rw-r--r--mac/.config/mpv/scripts/UndoRedo.lua212
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)