|
|
|
05-07-2016, 05:42 AM
|
#1
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
LUA:TrackList ALPHA - Cubase/PT TrackVersions/Playlist for REAPER
Update 07.09.2016 : Latest version on git hub
TRACK LISTS (Cubase TrackVersions / ProTools Playlist)!
Github link : https://raw.githubusercontent.com/Go...istVersion.lua
Features:
- Storing with projects
- Auto naming
- Deleting track deletes all version of that track
- Right Click menu (rename/delete version/save modification)
- Folder Versions (all child versions follow folder version selection)
- Multiple track selection Versions
- Items Only (not including track state, FX , automation,volume etc) ,full chunk version may be implemented but there could be problems with large chunks from FX
- One Empty version per tracks (shows only if there are saved versions)
- Multiselection save
the TRACK LISTS (Cubase TrackVersions / ProTools Playlist)!
latest version:
https://raw.githubusercontent.com/Go...istVersion.lua
installation:
1. copy all text from the link
2. open actions in reaper and click new reascript
3. call it "playlist.lua" or anything but dont forget ".lua"
4. paste the text and ctrl+s
Last edited by Sexan; 09-07-2016 at 03:57 AM.
|
|
|
05-07-2016, 06:46 AM
|
#2
|
Human being with feelings
Join Date: Jun 2012
Location: Spain
Posts: 7,239
|
You can use the gui creator from eugen2777 and study the code it generates. It is very good.
Making tutorials is difficult. It is much easier to code. there are many ways to do it depending on the complexity required
|
|
|
05-07-2016, 07:30 AM
|
#3
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
Ok, checked it out,cool,looking forward for next update (this will be life saver),ok a question if its not very hard,how can I dynamically there add buttons? (I know script needs to be modified aditional function that will be called when this needs to happen)
So if I have:
Code:
for i = 0 , 5 do
add_button()
end
for example I want to add track names in a list
maybe this will be a FR for it
Last edited by Sexan; 05-07-2016 at 07:37 AM.
|
|
|
05-07-2016, 09:47 AM
|
#4
|
Human being with feelings
Join Date: Jun 2012
Location: Spain
Posts: 7,239
|
each button is an "object" so yes you can dynamically add or remove as many buttons as needed
for i = 0 , reaper.CountTracks(0)-1 do
Button:new(... parameters for each button...)
end
the example in FR: A way to mark audio files during recording
is a good example http://forum.cockos.com/showthread.php?t=175925
|
|
|
05-07-2016, 09:53 AM
|
#5
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
thank you very much!
|
|
|
05-07-2016, 10:21 AM
|
#6
|
Human being with feelings
Join Date: Aug 2012
Location: Finland
Posts: 2,668
|
Here's an example (using eugen2777's GUI code):
(Draw buttons from track selection)
Code:
local Button_TB = {} -- All created buttons are held in this table.
local Element = {}
function Element:new(x,y,w,h, r,g,b,a, lbl,fnt,fnt_sz, norm_val)
local elm = {}
elm.def_xywh = {x,y,w,h,fnt_sz} -- its default coord,used for Zoom etc
elm.x, elm.y, elm.w, elm.h = x, y, w, h
elm.r, elm.g, elm.b, elm.a = r, g, b, a
elm.lbl, elm.fnt, elm.fnt_sz = lbl, fnt, fnt_sz
elm.norm_val = norm_val
------
setmetatable(elm, self)
self.__index = self
return elm
end
--------------------------------------------------------------
--- Function for Child Classes(args = Child,Parent Class) ----
--------------------------------------------------------------
function extended(Child, Parent)
setmetatable(Child,{__index = Parent})
end
--------------------------------------------------------------
--- Element Class Methods(Main Methods) ------------------
--------------------------------------------------------------
function Element:update_xywh()
if not Z_w or not Z_h then return end -- return if zoom not defined
if Z_w>0.5 and Z_w<3 then
self.x, self.w = math.ceil(self.def_xywh[1]* Z_w) , math.ceil(self.def_xywh[3]* Z_w) --upd x,w
end
if Z_h>0.5 and Z_h<3 then
self.y, self.h = math.ceil(self.def_xywh[2]* Z_h) , math.ceil(self.def_xywh[4]* Z_h) --upd y,h
end
if Z_w>0.5 or Z_h>0.5 then --fix it!--
self.fnt_sz = math.max(9,self.def_xywh[5]* (Z_w+Z_h)/2)
self.fnt_sz = math.min(22,self.fnt_sz)
end
end
--------
function Element:pointIN(p_x, p_y)
return p_x >= self.x and p_x <= self.x + self.w and p_y >= self.y and p_y <= self.y + self.h
end
--------
function Element:mouseIN()
return gfx.mouse_cap&1==0 and self:pointIN(gfx.mouse_x,gfx.mouse_y)
end
--------
function Element:mouseDown()
return gfx.mouse_cap&1==1 and self:pointIN(mouse_ox,mouse_oy)
end
--------
function Element:mouseClick()
return gfx.mouse_cap&1==0 and last_mouse_cap&1==1 and
self:pointIN(gfx.mouse_x,gfx.mouse_y) and self:pointIN(mouse_ox,mouse_oy)
end
--------
function Element:draw_frame()
local x,y,w,h = self.x,self.y,self.w,self.h
gfx.rect(x, y, w, h, 0)--frame1
gfx.roundrect(x, y, w-1, h-1, 3, true)--frame2
end
--------------------------------------------------------------------------------
--- Create Element Child Classes(Button,Slider,Knob) -----------------------
--------------------------------------------------------------------------------
local Button ={}; local Knob ={}; local Slider ={};
extended(Button, Element)
extended(Knob, Element)
extended(Slider, Element)
---Create Slider Child Classes(V_Slider,H_Slider)----
local H_Slider ={}; local V_Slider ={};
extended(H_Slider, Slider)
extended(V_Slider, Slider)
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--- Button Class Methods ---------------------------------------------------
--------------------------------------------------------------------------------
function Button:draw_lbl()
local x,y,w,h = self.x,self.y,self.w,self.h
local fnt,fnt_sz = self.fnt, self.fnt_sz
--Draw btn lbl(text)--
gfx.set(0.7, 1, 0, 1)--set label color
gfx.setfont(1, fnt, fnt_sz);--set label fnt
local lbl_w, lbl_h = gfx.measurestr(self.lbl)
gfx.x = x+(w-lbl_w)/2; gfx.y = y+(h-lbl_h)/2
gfx.drawstr(self.lbl)
end
---------------------
function Button:draw()
self:update_xywh()--Update xywh(if wind changed)
local x,y,w,h = self.x,self.y,self.w,self.h
local r,g,b,a = self.r,self.g,self.b,self.a
---Get L_mouse state--
--in element--
if self:mouseIN() then a=a+0.1 end
--in elm L_down--
if self:mouseDown() then a=a+0.2 end
--in elm L_up(released and was previously pressed)--
if self:mouseClick() and self.onClick ~= nil then self.onClick() end
--Draw btn(body,frame)--
gfx.set(r,g,b,a)--set btn color
gfx.rect(x,y,w,h,true)--body
self:draw_frame()
------------------------
self:draw_lbl()
end
----------------------------------------------------------------------------------------------------
--- Main DRAW function -------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
function DRAW()
for key,btn in pairs(Button_TB) do btn:draw() end
end
--------------------------------------------------------------------------------
-- INIT --------------------------------------------------------------------
--------------------------------------------------------------------------------
function Init()
--Some gfx Wnd Default Values--------------
local R,G,B = 20,20,20 --0..255 form
Wnd_bgd = R + G*256 + B*65536 --red+green*256+blue*65536
Wnd_Title,Wnd_W,Wnd_H,Wnd_Dock,Wnd_X,Wnd_Y = "Title", 330,250, 0,100,320
--Init window------------------------------
gfx.clear = Wnd_bgd
gfx.init( Wnd_Title, Wnd_W,Wnd_H, Wnd_Dock, Wnd_X,Wnd_Y )
--Mouse--------------
last_mouse_cap = 0
last_x, last_y = 0, 0
end
----------------------------------------
-- Mainloop ------------------------
----------------------------------------
function mainloop()
--Z_w,Z_h = gfx.w/Wnd_W, gfx.h/Wnd_H
if gfx.mouse_cap&1==1 and last_mouse_cap&1==0 then
mouse_ox, mouse_oy = gfx.mouse_x, gfx.mouse_y
end
----------------------------------------------------------------------------------
-- Create buttons from selected tracks --
-- Button_TB: see DRAW() function. Each created button is held in this table.
Button_TB = {} -- "Clear" the Button_TB first
local btn_w = 50 -- width for new buttons
local btn_h = 50 -- height for new buttons
local current_draw_pos_x = 10 -- see end of loop below
local current_draw_pos_y = 10 -- see end of loop below
local btn_pad_x = 10 -- x space between buttons
local btn_pad_y = 10 -- y space between buttons
for i=1, reaper.CountSelectedTracks(0) do -- loop through selected tracks
-- get track and its name
local tr = reaper.GetSelectedTrack(0, i-1)
local retval, tr_name = reaper.GetSetMediaTrackInfo_String(tr, "P_NAME", "", false)
-- Create a new button and insert it at the end of "Button_TB"
Button_TB[#Button_TB+1] =
-- Desc: Element:new(x,y,w,h, r,g,b,a, lbl,fnt,fnt_sz, norm_val)
Button:new(
current_draw_pos_x, -- x
current_draw_pos_y, -- y
btn_w, -- w
btn_h, -- h
0.2, -- r
0.2, -- g
1.0, -- b
0.5, -- a
tr_name, -- lbl (button name)
"Arial", -- label font
15, -- label font size
0 -- norm_val
)
-- update draw pos to start of next button
current_draw_pos_x = current_draw_pos_x + btn_w + btn_pad_x
-- if button doesn't fit to current row, update draw pos to start of next column
if current_draw_pos_x + btn_w + btn_pad_x > gfx.w then
current_draw_pos_x = 10
current_draw_pos_y = current_draw_pos_y + btn_h + btn_pad_y
end
end
----------------------------------------------------------------------------------
Ctrl = gfx.mouse_cap&4==4
Shift = gfx.mouse_cap&8==8
-----------------------
--DRAW,MAIN functions--
DRAW()--Main()
-----------------------
-----------------------
last_mouse_cap = gfx.mouse_cap
last_x, last_y = gfx.mouse_x, gfx.mouse_y
char = gfx.getchar()
if char~=-1 then reaper.defer(mainloop) end --defer
-----------
gfx.update()
-----------
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------
Init()
mainloop()
Last edited by spk77; 05-07-2016 at 10:51 AM.
|
|
|
05-07-2016, 10:40 AM
|
#7
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
Cool! I've managed to do something similar :
but my coding skills are awful,this is the ugly code behind it
Code:
Button_TB = {}
xpos = 10
ypos = 10
for i = 1 ,reaper.CountTracks(0) do
btn = Button:new(xpos,ypos,60,30, 0.2,0.2,1.0,0.5, "TEST","Arial",15, 0 )
xpos = xpos + 70
Button_TB[i] = btn
if xpos >= Wnd_W then
xpos = 10
ypos = ypos + 40
if ypos >= Wnd_H then break end
end
end
will study your code now
|
|
|
05-07-2016, 10:47 AM
|
#8
|
Human being with feelings
Join Date: Aug 2012
Location: Finland
Posts: 2,668
|
Quote:
Originally Posted by Sexan
Cool! I've managed to do something similar :
but my coding skills are awful,this is the ugly code behind it
|
Not ugly at all! It's more or less the same code as in my example
|
|
|
05-07-2016, 10:58 AM
|
#9
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
just one more question,why is this not working (your code) when I define it as an function and then call that function in main_loop?
|
|
|
05-07-2016, 11:12 AM
|
#10
|
Human being with feelings
Join Date: Aug 2012
Location: Finland
Posts: 2,668
|
Quote:
Originally Posted by Sexan
just one more question,why is this not working (your code) when I define it as an function and then call that function in main_loop?
|
Maybe because there are local variables...did you include all the blue code in your function?
|
|
|
05-07-2016, 11:16 AM
|
#11
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
my bad,I was defining the function on top of the script,put it above main loop and its fine
|
|
|
05-07-2016, 12:28 PM
|
#12
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
starting to like this script very very much,awesome tool,cant way for it to get finished:
Last edited by Sexan; 05-07-2016 at 12:33 PM.
|
|
|
05-07-2016, 03:01 PM
|
#13
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
figured out how click works on button!
|
|
|
05-07-2016, 05:18 PM
|
#14
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
Ok next question,i have a very simple function that adds buttons based on how many tracks are there.how can i now select that track when i click on the button?buttons have track names and i want to select that track when i click on its button.thank you for helping
|
|
|
05-08-2016, 12:33 AM
|
#15
|
Human being with feelings
Join Date: Aug 2012
Posts: 271
|
If you have some global function (for example, my_func), you can specify when you create buttons btn.onClick = my_func
|
|
|
05-08-2016, 01:03 AM
|
#16
|
Human being with feelings
Join Date: Aug 2012
Location: Finland
Posts: 2,668
|
Quote:
Originally Posted by eugen2777
If you have some global function (for example, my_func), you can specify when you create buttons btn.onClick = my_func
|
Thanks for this GUI code - it's very tidy!
@Sexan
Here's an example (it can be implemented in many ways)
Code:
local Button_TB = {} -- All created buttons are held in this table.
local Element = {}
function Element:new(x,y,w,h, r,g,b,a, lbl,fnt,fnt_sz, norm_val)
local elm = {}
elm.def_xywh = {x,y,w,h,fnt_sz} -- its default coord,used for Zoom etc
elm.x, elm.y, elm.w, elm.h = x, y, w, h
elm.r, elm.g, elm.b, elm.a = r, g, b, a
elm.lbl, elm.fnt, elm.fnt_sz = lbl, fnt, fnt_sz
elm.norm_val = norm_val
------
setmetatable(elm, self)
self.__index = self
return elm
end
--------------------------------------------------------------
--- Function for Child Classes(args = Child,Parent Class) ----
--------------------------------------------------------------
function extended(Child, Parent)
setmetatable(Child,{__index = Parent})
end
--------------------------------------------------------------
--- Element Class Methods(Main Methods) ------------------
--------------------------------------------------------------
function Element:update_xywh()
if not Z_w or not Z_h then return end -- return if zoom not defined
if Z_w>0.5 and Z_w<3 then
self.x, self.w = math.ceil(self.def_xywh[1]* Z_w) , math.ceil(self.def_xywh[3]* Z_w) --upd x,w
end
if Z_h>0.5 and Z_h<3 then
self.y, self.h = math.ceil(self.def_xywh[2]* Z_h) , math.ceil(self.def_xywh[4]* Z_h) --upd y,h
end
if Z_w>0.5 or Z_h>0.5 then --fix it!--
self.fnt_sz = math.max(9,self.def_xywh[5]* (Z_w+Z_h)/2)
self.fnt_sz = math.min(22,self.fnt_sz)
end
end
--------
function Element:pointIN(p_x, p_y)
return p_x >= self.x and p_x <= self.x + self.w and p_y >= self.y and p_y <= self.y + self.h
end
--------
function Element:mouseIN()
return gfx.mouse_cap&1==0 and self:pointIN(gfx.mouse_x,gfx.mouse_y)
end
--------
function Element:mouseDown()
return gfx.mouse_cap&1==1 and self:pointIN(mouse_ox,mouse_oy)
end
--------
function Element:mouseClick()
return gfx.mouse_cap&1==0 and last_mouse_cap&1==1 and
self:pointIN(gfx.mouse_x,gfx.mouse_y) and self:pointIN(mouse_ox,mouse_oy)
end
--------
function Element:draw_frame()
local x,y,w,h = self.x,self.y,self.w,self.h
gfx.rect(x, y, w, h, 0)--frame1
gfx.roundrect(x, y, w-1, h-1, 3, true)--frame2
end
--------------------------------------------------------------------------------
--- Create Element Child Classes(Button,Slider,Knob) -----------------------
--------------------------------------------------------------------------------
local Button ={}; local Knob ={}; local Slider ={};
extended(Button, Element)
extended(Knob, Element)
extended(Slider, Element)
---Create Slider Child Classes(V_Slider,H_Slider)----
local H_Slider ={}; local V_Slider ={};
extended(H_Slider, Slider)
extended(V_Slider, Slider)
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--- Button Class Methods ---------------------------------------------------
--------------------------------------------------------------------------------
function Button:draw_lbl()
local x,y,w,h = self.x,self.y,self.w,self.h
local fnt,fnt_sz = self.fnt, self.fnt_sz
--Draw btn lbl(text)--
gfx.set(0.7, 1, 0, 1)--set label color
gfx.setfont(1, fnt, fnt_sz);--set label fnt
local lbl_w, lbl_h = gfx.measurestr(self.lbl)
gfx.x = x+(w-lbl_w)/2; gfx.y = y+(h-lbl_h)/2
gfx.drawstr(self.lbl)
end
---------------------
function Button:draw()
self:update_xywh()--Update xywh(if wind changed)
local x,y,w,h = self.x,self.y,self.w,self.h
if self.norm_val == 1 then self.a = self.a+0.3 end
local r,g,b,a = self.r,self.g,self.b,self.a
---Get L_mouse state--
--in element--
if self:mouseIN() then a=a+0.1 end
--in elm L_down--
if self:mouseDown() then a=a+0.2 end
--in elm L_up(released and was previously pressed)--
if self:mouseClick() and self.onClick ~= nil then self.onClick() end
--Draw btn(body,frame)--
gfx.set(r,g,b,a)--set btn color
gfx.rect(x,y,w,h,true)--body
self:draw_frame()
------------------------
self:draw_lbl()
end
----------------------------------------------------------------------------------------------------
--- Main DRAW function -------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
function DRAW()
for key,btn in pairs(Button_TB) do btn:draw() end
end
--------------------------------------------------------------------------------
-- INIT --------------------------------------------------------------------
--------------------------------------------------------------------------------
function Init()
--Some gfx Wnd Default Values--------------
local R,G,B = 20,20,20 --0..255 form
Wnd_bgd = R + G*256 + B*65536 --red+green*256+blue*65536
Wnd_Title,Wnd_W,Wnd_H,Wnd_Dock,Wnd_X,Wnd_Y = "Title", 330,250, 0,100,320
--Init window------------------------------
gfx.clear = Wnd_bgd
gfx.init( Wnd_Title, Wnd_W,Wnd_H, Wnd_Dock, Wnd_X,Wnd_Y )
--Mouse--------------
last_mouse_cap = 0
last_x, last_y = 0, 0
end
----------------------------------------
-- Mainloop ------------------------
----------------------------------------
function mainloop()
--Z_w,Z_h = gfx.w/Wnd_W, gfx.h/Wnd_H
if gfx.mouse_cap&1==1 and last_mouse_cap&1==0 then
mouse_ox, mouse_oy = gfx.mouse_x, gfx.mouse_y
end
----------------------------------------------------------------------------------
-- Create buttons from tracks --
-- Button_TB: see DRAW() function. Each created button is held in this table.
Button_TB = {} -- "Clear" the Button_TB first
local btn_w = 100 -- width for new buttons
local btn_h = 20 -- height for new buttons
local current_draw_pos_x = 10 -- see end of loop below
local current_draw_pos_y = 10 -- see end of loop below
local btn_pad_x = 10 -- x space between buttons
local btn_pad_y = 10 -- y space between buttons
for i=1, reaper.CountTracks(0) do -- loop through selected tracks
-- get track and its name
local tr = reaper.GetTrack(0, i-1)
local retval, tr_name = reaper.GetSetMediaTrackInfo_String(tr, "P_NAME", "", false)
-- Create a new button
-- Desc: Element:new(x,y,w,h, r,g,b,a, lbl,fnt,fnt_sz, norm_val)
local btn = Button:new(
current_draw_pos_x, -- x
current_draw_pos_y, -- y
btn_w, -- w
btn_h, -- h
0.2, -- r
0.2, -- g
1.0, -- b
0.5, -- a
tr_name, -- lbl (button name)
"Arial", -- label font
15, -- label font size
0 -- norm_val
)
btn.tr = tr --store track id to current button table
-- Override "norm_val". Set value from track's selected state
if reaper.IsTrackSelected(tr) then
btn.norm_val = 1
else
btn.norm_val = 0
end
btn.onClick = function()
local state = btn.norm_val == 1 -- is "state" true or false?
reaper.SetTrackSelected(btn.tr, not state) -- toggle "track selected" state
end
-- update draw pos to start of next button
current_draw_pos_x = current_draw_pos_x + btn_w + btn_pad_x
-- if button doesn't fit to current row, update draw pos to start of next column
if current_draw_pos_x + btn_w + btn_pad_x > gfx.w then
current_draw_pos_x = 10
current_draw_pos_y = current_draw_pos_y + btn_h + btn_pad_y
end
Button_TB[#Button_TB+1] = btn -- insert the created button at the end of "Button_TB"
end
----------------------------------------------------------------------------------
Ctrl = gfx.mouse_cap&4==4
Shift = gfx.mouse_cap&8==8
-----------------------
--DRAW,MAIN functions--
DRAW()--Main()
-----------------------
-----------------------
last_mouse_cap = gfx.mouse_cap
last_x, last_y = gfx.mouse_x, gfx.mouse_y
char = gfx.getchar()
if char~=-1 then reaper.defer(mainloop) end --defer
-----------
gfx.update()
-----------
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------
Init()
mainloop()
Last edited by spk77; 05-08-2016 at 01:09 AM.
|
|
|
05-08-2016, 05:07 AM
|
#17
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
Edit......
Last edited by Sexan; 05-09-2016 at 10:31 AM.
|
|
|
05-08-2016, 01:27 PM
|
#19
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
let me dig into the code!
|
|
|
05-09-2016, 04:21 AM
|
#20
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
edit:
Last update and progress post #21
Last edited by Sexan; 05-09-2016 at 10:31 AM.
|
|
|
05-09-2016, 07:58 AM
|
#21
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
hm....I've partially done it but some (haha "some" ) hiccups are there :
https://stash.reaper.fm/27536/spkMODtest.lua
it remembers it on wrong position
edit:my bad, fixed it , now its looking good .... almost,now its overriding button names (because I'm deleting the table too soon)
Last edited by Sexan; 05-09-2016 at 02:40 PM.
|
|
|
05-09-2016, 02:49 PM
|
#22
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
so here it is,the pre alpha of alpha (if someone can give a hand here it would be awesome),btw I'm ultra proud with it haha
the TRACK LISTS!
script:
https://stash.reaper.fm/27542/TrackListsAlpha.lua
I've commented everything I've done
Current problems :
1. When other track is saved it overrides the first ones chunk,need better way of storing in projexstate
2. GUI - when selecting new track then returning to previous one with buttons,new buttons draw on top of current buttons
Currently on one track its works well,but when second track is being added with buttons,it overrides the track chunks of previous track (poorly coded)
I would appreciate if someone could step in,I will be donating for help.
If I continue alone it will be extremely painful and slow (because I do the code with trial and error,brute force it until it works haha)
WARNING ! DO NOT USE IN REAL PROJECTS!
Last edited by Sexan; 05-10-2016 at 02:24 AM.
|
|
|
05-10-2016, 03:17 AM
|
#23
|
Human being with feelings
Join Date: Mar 2015
Location: Moscow, Russia
Posts: 206
|
Thank you so much for starting this long awaited thing!
|
|
|
05-10-2016, 04:30 AM
|
#24
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
Update :
Problem 1. Fixed (projextstate not needed for buttons,don't know why I've put it in the first place )
https://stash.reaper.fm/27545/TrackListsAlpha2.lua
Working on all tracks now
Now I need to solve GUI problem (new added buttons draw over buttons on track change)
Last edited by Sexan; 05-10-2016 at 05:53 AM.
|
|
|
05-10-2016, 07:42 AM
|
#25
|
Human being with feelings
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
|
Wow, don't know how I missed this one so far! Looks right up my street!
Subscribed and will try it when I get a breather.
Nice work!
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.
|
|
|
05-11-2016, 06:34 AM
|
#26
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
Edit: My silly coding error
Last edited by Sexan; 05-11-2016 at 10:24 AM.
|
|
|
05-11-2016, 08:46 AM
|
#27
|
Human being with feelings
Join Date: Aug 2012
Posts: 271
|
Sexan, how to reproduce the error?
My English leaves much to be desired. If you explain in Russian ( or pictures for fools) , I can help to fix it .
|
|
|
05-11-2016, 10:19 AM
|
#28
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
Hi,fixed the error,was in if loop that I've excluded.Now it works fine
https://stash.reaper.fm/27561/TrackListsAlpha3.lua
Now I'm working on rewriting the Button drawing so for new window it starts from point 0 and for existing buttons it draws from the last button (how I've done it in first version is very cruel and bad and very simple,if new window x-y=0,but that would override tracks that has buttons).This is a little hard for me .If anyone can help here I would appreciate
How it currently works :
Last edited by Sexan; 05-11-2016 at 10:32 AM.
|
|
|
05-11-2016, 10:36 AM
|
#29
|
Human being with feelings
Join Date: Aug 2012
Posts: 271
|
Quote:
This is a little hard for me
|
You can do it yourself. I'm sure. Help is not needed
|
|
|
05-11-2016, 10:39 AM
|
#30
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
The biggest challenge will be how to store button table to reaper.SetProjExtState,I've did a little research and its not that simple since reaper.SetProjExtState can't store tables.(I've already tried something but no success)
|
|
|
05-11-2016, 11:09 AM
|
#31
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
Almost there
https://stash.reaper.fm/27564/TrackListsAlpha3.lua
Code:
for k,v in pairs(Button_TB) do ----iterate table
if sel_track == v.tr then --- if current track is in the table
v.x = current_draw_pos_x
v.y = current_draw_pos_y + ((btn_h + btn_pad_y)*counter)
if v.y + btn_h + btn_pad_y >= gfx.h-10 then
v.y = 30
v.x = current_draw_pos_x + btn_w + btn_pad_x
end
current_track[#current_track+1] = Button_TB[k] --- add that track to new temp table
counter = counter + 1 -- increase button counter
end
end
Stuck when in next row......
|
|
|
05-11-2016, 11:59 AM
|
#32
|
Human being with feelings
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
|
All good stuff!
I haven't got round to testing yet but are there any things to be aware of yet that you know of?
and this script has been done 2 times before (that I'm aware of) so I just wondered what made you redo it and if you've managed to solve any issues the others had?
It's a feature I've wanted forever to be honest and I can't wait to try this version soon!
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.
|
|
|
05-11-2016, 12:07 PM
|
#33
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
The first initial version was very badly written,lots of unnecessary code,for example : the way which the window will show only buttons for selected track (that was really "oh my god" of the code)
That part is rewritten and now is much better.
The GUI part also needs to be rewritten (it was done really really simple in the first version (if other track is selected,reset the x-y,but that caused buttons to draw over buttons).Btw this is the last part of GUI that needs to be changed.
There are no current issues except that (I've tried lots and lots of storing and recalling and all fine,did not encounter any bug regarding that)
Other than that the script works really REALLY well! But for now it does not store with the project.
That part is really REALLY complicated (one of the script gurus will have to do it) because projextstate cant store tables,so some other approach is needed.This will need major testing when done,since here is when potential problems start
Since I am a noob and while writing the code I'm learning and lots of googleing research,so It will be pretty slow progress (I still hope some guru will help (donations incoming))
But without briliant Eugen2777 gui template script,I would not even touch this (tried many times in the past) so thank you very much!
Quote:
Originally Posted by musicbynumbers
and this script has been done 2 times before (that I'm aware of) so I just wondered what made you redo it and if you've managed to solve any issues the others had?
|
There is no LUA version as I am aware of it ??
But other ones are eel and not "all in one" script but many shortcuts needed in order to make it work.I wanted to do the "all in one" script and in LUA so I can modify it when I want or add features (I dont understand eel at all its like alien language to me).I do not know any issues others had (did not used any of it except one version I've just tried one time and that version was not not finished).
Last edited by Sexan; 05-11-2016 at 12:25 PM.
|
|
|
05-11-2016, 04:02 PM
|
#34
|
Human being with feelings
Join Date: Jun 2009
Location: South, UK
Posts: 14,214
|
Thanks for explaining that, appreciated and understood now!
It is a very cool script indeed! checking it out soon!
__________________
subproject FRs click here
note: don't search for my pseudonym on the web. The "musicbynumbers" you find is not me or the name I use for my own music.
|
|
|
05-11-2016, 04:40 PM
|
#35
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
|
|
|
05-11-2016, 04:48 PM
|
#36
|
Banned
Join Date: Sep 2015
Posts: 1,650
|
Quote:
Originally Posted by Sexan
Other than that the script works really REALLY well! But for now it does not store with the project.
That part is really REALLY complicated (one of the script gurus will have to do it) because projextstate cant store tables,so some other approach is needed.This will need major testing when done,since here is when potential problems start.
|
I use pickle.lua with my gui library to convert tables to strings for storing/retrieving from ext states...
https://github.com/Lazzle/ReaMIDI/bl...res/pickle.lua
So (this is edited from the el gui.lua script and isn't tested but should work)...
Code:
--do whatever to get pickle.lua included/required/loaded, maybe this
dofile(reaper.GetResourcePath().."/Scripts/pickle.lua")
function storeStateTable(state_name,key,table)
reaper.SetProjExtState(0,state_name,tostring(key),pickle(table),true)
end
function recallStateTable(state_name,key)
local ok,found,cnt=true,false,0
local k,state
while not found and ok do
ok,k,state=reaper.EnumProjExtState(0,state_name,cnt)
if tostring(k)==tostring(key) then
found=true ok=false
end
cnt=cnt+1
end
if found then
return unpickle(state)
else
return nil
end
end
|
|
|
05-11-2016, 04:56 PM
|
#37
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
Thank you very much!!!! Will test it in morning
|
|
|
05-12-2016, 01:01 AM
|
#38
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
eugen2777 please when you got some time , can you check why my script won't auto update size when enabled?
https://stash.reaper.fm/27571/TrackListApha5.lua
Its because I'm updating button positions on the fly,but can something be done
or modified to make it work?
and how can I implement now if button is ALT clicked to remove it?
Last edited by Sexan; 05-12-2016 at 01:29 AM.
|
|
|
05-12-2016, 01:11 AM
|
#39
|
Human being with feelings
Join Date: Jun 2009
Location: Croatia
Posts: 4,597
|
edit.....
Last edited by Sexan; 05-25-2016 at 05:11 AM.
|
|
|
05-12-2016, 02:09 AM
|
#40
|
Banned
Join Date: Sep 2015
Posts: 1,650
|
Yes, your buttons are storing MediaTrack objects, which is "userdata" in Lualand so you need to either store them as a GUID and convert them to MediaTrack objects when needed or just convert when storing/recalling.
Code:
guid=reaper.GetTrackGUID(tr)
tr=reaper.BR_GetMediaTrackByGUID(0,guid)
|
|
|
Thread Tools |
|
Display Modes |
Linear Mode
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -7. The time now is 07:27 PM.
|