306 lines
9.6 KiB
Lua
306 lines
9.6 KiB
Lua
--------------------------------------
|
|
----------// HEADER //----------------
|
|
--------------------------------------
|
|
--[[
|
|
* REALIVE: Reaper Setup for a Complete Live Playback Engine
|
|
* ReaScript Name: Realive_ProjectTabsList_Open.lua
|
|
* Description: Open RPL File
|
|
* Instructions:
|
|
* Author: Alex Paquette, Thanks to Claude Fillion for the Large contribution
|
|
* Repository:
|
|
* Repository URI:
|
|
* File URI:
|
|
* Licence: GPL v3
|
|
* Forum Thread:
|
|
* Forum Thread URI: https://forum.cockos.com/showthread.php?p=1854775#post1854775
|
|
* REAPER: 5
|
|
* Extensions: SWS/S&M
|
|
* Version: 2.00
|
|
--]]
|
|
|
|
--[[
|
|
* Changelog:
|
|
* v1.0 (2019-06-02)
|
|
+ Initial Release
|
|
--]]
|
|
|
|
|
|
--------------------------------------
|
|
----------// VARIABLES //-------------
|
|
--------------------------------------
|
|
|
|
local reaper = reaper -------// Performance Enhancement //----------
|
|
local EXT_SECTION = 'ProjectTabs_Reaper_list'
|
|
local EXT_SECTION_PLAYLIST = 'ProjectTabs_Realive_list'
|
|
|
|
-----// Window Set Numbers //------------------------------
|
|
local PlayViewWindowSet = 01 -- Enter Window Set Number Used for the "Live Play" View
|
|
local AllTracksViewWindowSet = 02 -- Enter the Window Set Number for the "Show All Tracks" View
|
|
local WindowSetBaseNumber = 40453
|
|
local PlayView_cmdID = WindowSetBaseNumber+PlayViewWindowSet
|
|
local AllView_cmdID = WindowSetBaseNumber+AllTracksViewWindowSet
|
|
local RegionWindow_cmdID = reaper.NamedCommandLookup("_RS05396ad2c5c53e928799e707652dea37cc588b3c")
|
|
local ResetPlayView_cmdID = reaper.NamedCommandLookup("_RS08d5f2749008cc0f6f53feb223d1638fde598566")
|
|
local PlaylistWindow_cmdID = reaper.NamedCommandLookup('_RS2071ccff7199c897478c49da97ca1422fc732d4f')
|
|
local debug = false
|
|
|
|
|
|
|
|
|
|
|
|
-----// gmem Variables //------------------------------
|
|
local gmemSect = 'Realive_Gmem'
|
|
local gmem_idx_PlaylistState = 11
|
|
local gmem_idx_Management = 12
|
|
local gmem_idx_PlaylistState_Clean = 32
|
|
local gmem_idx_PlaylistCount_Reaper = 30
|
|
local gmem_idx_PlaylistCount_Realive = 31
|
|
local gmemPlaylist_SaveRequest = 1
|
|
local gmemPlaylist_SaveRefused = 2
|
|
local gmemPlaylist_Initialize = 3
|
|
local gmemPlaylist_RealiveListItem_Remove = 4
|
|
local gmemPlaylist_RealiveListItem_Add = 5
|
|
local gmemPlaylist_RealiveListItem_Update = 6
|
|
local gmemPlaylist_ProjectTabs_CleanStatus = 9
|
|
local gmem_idxRead_Mngmt = reaper.gmem_read(gmem_idx_Management)
|
|
|
|
|
|
local playlistState = reaper.GetExtState('Realive_Playlist', 'State')
|
|
local realivePlaylist_compare = 0
|
|
|
|
-----// Zoom Variables //------------------------------
|
|
local Zoom2Amount = 100
|
|
local Zoom2Forceset = 1
|
|
local Zoom2Doupd = false
|
|
local Zoom2Centermode = -1-- 0=EditCursor,
|
|
|
|
-----------------------------------------------------------
|
|
|
|
-----------------------------------------------------------
|
|
-----// DEBUG FUNCTION //----------------------------------
|
|
-----------------------------------------------------------
|
|
if debug then reaper.ShowConsoleMsg("") end
|
|
function Msg(value)
|
|
if debug then
|
|
reaper.ShowConsoleMsg(tostring(value) .. "\n")
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-----------------------------------------------------------
|
|
-----// FUNCTIONS //---------------------------------------
|
|
-----------------------------------------------------------
|
|
function Playlist_CountProjectTabs()
|
|
local ProjCount=-1
|
|
local Aretval="t"
|
|
while Aretval~=nil do
|
|
local Aretval, Aprojfn = reaper.EnumProjects(ProjCount+1, "")
|
|
if Aretval~=nil then ProjCount=ProjCount+1
|
|
else break
|
|
end
|
|
end
|
|
return ProjCount+1
|
|
end
|
|
|
|
|
|
|
|
function Actions_ResetAllProjects()
|
|
local prjct_Counter = Playlist_CountProjectTabs()
|
|
for p = 0, prjct_Counter do
|
|
local proj = reaper.EnumProjects(p, 0)
|
|
if not proj then break
|
|
else
|
|
reaper.SetEditCurPos2(proj, 0, true, true)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------------------------
|
|
-----// Realive List Management //-------------------------
|
|
-----------------------------------------------------------
|
|
|
|
function makeKey(i)
|
|
return string.format('project%d', i)
|
|
end
|
|
|
|
|
|
function enum_RealivePlaylist()
|
|
local i = 1
|
|
return function()
|
|
local key = makeKey(i)
|
|
i = i + 1
|
|
if reaper.HasExtState(EXT_SECTION_PLAYLIST, key) then
|
|
return key
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function get_RealivePlaylist()
|
|
local Realive_list = {}
|
|
for Realive_key in enum_RealivePlaylist() do
|
|
local Realive_projfn = reaper.GetExtState(EXT_SECTION_PLAYLIST, Realive_key)
|
|
table.insert(Realive_list, Realive_projfn)
|
|
end
|
|
return Realive_list
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------------------------
|
|
-----// SAVE RPL FUNCTION //-------------------------------
|
|
-----------------------------------------------------------
|
|
function SaveRPL()
|
|
local out_str = ''
|
|
local save_targetPath = ''
|
|
local save_lastPath = ''
|
|
if reaper.HasExtState('Realive_PlaylistFolder', 'lastPath') then
|
|
save_lastPath = reaper.GetExtState('Realive_PlaylistFolder', 'lastPath')
|
|
end
|
|
if reaper.HasExtState('Realive_PlaylistFolder', 'defaultPath') then
|
|
save_defaultPath = reaper.GetExtState('Realive_PlaylistFolder', 'defaultPath')
|
|
end
|
|
if save_lastPath ~= '' then save_targetPath = save_lastPath
|
|
elseif save_defaultPath ~= '' then save_targetPath = save_defaultPath
|
|
end
|
|
local unsavedConfirm = 0
|
|
local playlist = get_RealivePlaylist()
|
|
|
|
local projcnt = Playlist_CountProjectTabs()
|
|
local UnsavedProj_cnt = 0
|
|
for i = 1, projcnt do
|
|
local retval, projfn= reaper.EnumProjects( i-1, '' )
|
|
if projfn =='' then UnsavedProj_cnt = UnsavedProj_cnt+1 end
|
|
Msg('projfn: '..projfn)
|
|
end
|
|
Msg('UnsavedProject: '..UnsavedProj_cnt)
|
|
if UnsavedProj_cnt > 0 then
|
|
unsavedConfirm = reaper.ShowMessageBox("Your list contains project(s) that have no name. They will not be saved in the playlist. Do you still want to proceed? ", 'Warning', 4) -- Yes = 6, No = 7, Cancel = 2
|
|
Msg('unsavedConfirm: '..unsavedConfirm)
|
|
if unsavedConfirm ~= 6 then return end
|
|
end
|
|
|
|
local SaveDialogAnswer, saving_folder = reaper.JS_Dialog_BrowseForSaveFile('Save RPL', save_targetPath, '', 'Reaper Playlist files (.RPL)\0*.RPL\0\0')
|
|
Msg('SaveDialogAnswer: '..SaveDialogAnswer)
|
|
if SaveDialogAnswer == 1 then -- if a file was selected
|
|
extst_path = string.match(saving_folder, ".+/")
|
|
reaper.SetExtState('Realive_PlaylistFolder', 'lastPath', extst_path, false)
|
|
Msg('path: '..extst_path)
|
|
for i = 1, #playlist do
|
|
out_str = out_str..playlist[i]..'\n'
|
|
end
|
|
local f = io.open(saving_folder, 'w')
|
|
f:write(out_str)
|
|
f:close()
|
|
OpenRPL()
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
-----------------------------------------------------------
|
|
-----------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
-----------------------------------------------------------
|
|
-----// OPEN RPL FUNCTION //-------------------------------
|
|
-----------------------------------------------------------
|
|
function OpenRPL()
|
|
local open_targetPath = ''
|
|
local open_lastPath = ''
|
|
if reaper.HasExtState('Realive_PlaylistFolder', 'lastPath') then
|
|
open_lastPath = reaper.GetExtState('Realive_PlaylistFolder', 'lastPath')
|
|
end
|
|
if reaper.HasExtState('Realive_PlaylistFolder', 'defaultPath') then
|
|
open_defaultPath = reaper.GetExtState('Realive_PlaylistFolder', 'defaultPath')
|
|
end
|
|
if open_lastPath ~= '' then open_targetPath = open_lastPath
|
|
elseif open_defaultPath ~= '' then open_targetPath = open_defaultPath
|
|
end
|
|
|
|
local r, fn = reaper.JS_Dialog_BrowseForOpenFiles('Open RPL', open_targetPath, '', 'Reaper Playlist files (.RPL)\0*.RPL\0\0', false)
|
|
Msg('r: '..r)
|
|
|
|
if r == 1 then
|
|
if fn ~= '' then
|
|
extst_path = string.match(fn, ".+/")
|
|
reaper.SetExtState('Realive_PlaylistFolder', 'lastPath', extst_path, false)
|
|
Msg('path: '..extst_path)
|
|
end
|
|
else
|
|
return
|
|
end
|
|
local f = io.open(fn, 'r')
|
|
if not f then return end
|
|
local context = f:read('a')
|
|
f:close()
|
|
CloseAllTabs()
|
|
for line in context:gmatch('[^\r\n]+') do
|
|
reaper.Main_OnCommand(41929, 0 ) -- New project tab (ignore default template)
|
|
reaper.Main_openProject( line )
|
|
end
|
|
reaper.SelectProjectInstance( reaper.EnumProjects( 0, '') )
|
|
reaper.Main_OnCommand(40860,0) -- Close current project tab
|
|
Playlist_Init()
|
|
end
|
|
-----------------------------------------------------------
|
|
-----------------------------------------------------------
|
|
|
|
|
|
function RestartPlaylistWindow()
|
|
local state = reaper.GetToggleCommandState(PlaylistWindow_cmdID)
|
|
if state == 1 then
|
|
reaper.Main_OnCommand(PlaylistWindow_cmdID,0) --Close Playlist Window
|
|
reaper.Main_OnCommand(PlaylistWindow_cmdID,0) --Restart Playlist Window
|
|
end
|
|
end
|
|
|
|
function CloseAllTabs()
|
|
reaper.Main_OnCommand(40886, 0) -- Close All Projects
|
|
reaper.Main_OnCommand(41929, 0) -- Open empty project
|
|
reaper.Main_OnCommand(reaper.NamedCommandLookup("_SWS_FIRSTPROJTAB"), 0) -- Switch to 1st Tab
|
|
reaper.Main_OnCommand(40860, 0) -- Close tab
|
|
|
|
end
|
|
|
|
|
|
function Playlist_Init()
|
|
RestartPlaylistWindow()
|
|
Actions_ResetAllProjects()
|
|
reaper.Main_OnCommand(reaper.NamedCommandLookup("_SWS_PROJTAB2"), 0) -- Switch to 2nd Tab
|
|
-- reaper.Main_OnCommand(RegionWindow_cmdID,0) --Initialize Region Window
|
|
reaper.Main_OnCommand(ResetPlayView_cmdID,0) --Reset Live Playing View
|
|
reaper.adjustZoom(Zoom2Amount, Zoom2Forceset, Zoom2Doupd, Zoom2Centermode)
|
|
reaper.SetEditCurPos(0, true, true)
|
|
end
|
|
|
|
|
|
|
|
------------------------------------------
|
|
---------// RUN FUNCTION //--------------
|
|
------------------------------------------
|
|
function run()
|
|
if playlistState == 'Drty' then
|
|
realivePlaylist_compare = reaper.ShowMessageBox("Do you want to save your Playlist? ", 'Playlist was Changed', 3) -- Yes = 6, No = 7, Cancel = 2
|
|
end
|
|
|
|
if realivePlaylist_compare == 2 then return end -- if Cancel then abort the whole thing
|
|
if realivePlaylist_compare == 6 then -- if Yes then save RPL
|
|
SaveRPL()
|
|
else
|
|
OpenRPL()
|
|
end
|
|
end
|
|
|
|
------------------------------------------
|
|
---------// RUNTIME //-------------------
|
|
------------------------------------------
|
|
reaper.gmem_attach(gmemSect)
|
|
run() |