--[[ * ReaScript Name:Simple GUI template for scripts * Lua script for Cockos REAPER * Author: EUGEN27771 * Author URI: http://forum.cockos.com/member.php?u=50462 * Licence: GPL v3 * Version: 1.0 ]] -------------------------------------------------------------------------------- --- Simple Element Class --------------------------------------------------- -------------------------------------------------------------------------------- local Element = {} function Element:new(x,y,w,h, r,g,b,a, lbl,fnt,fnt_sz, norm_val,norm_val2) 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 elm.norm_val2 = norm_val2 ------ 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 self.x, self.w = math.ceil(self.def_xywh[1]* Z_w) , math.ceil(self.def_xywh[3]* Z_w) -- upd x,w self.y, self.h = math.ceil(self.def_xywh[2]* Z_h) , math.ceil(self.def_xywh[4]* Z_h) -- upd y,h if self.fnt_sz 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:mouseUp() -- its actual for sliders and knobs only! return gfx.mouse_cap&1==0 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:mouseR_Down() return gfx.mouse_cap&2==2 and self:pointIN(mouse_ox,mouse_oy) end -------- function Element:mouseM_Down() return gfx.mouse_cap&64==64 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, false) -- 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 = {} local Rng_Slider = {} local Frame = {} local CheckBox = {} extended(Button, Element) extended(Knob, Element) extended(Slider, Element) extended(Rng_Slider, Element) extended(Frame, Element) extended(CheckBox, 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_body() gfx.rect(self.x,self.y,self.w,self.h, true) -- draw btn body end -------- function Button:draw_lbl() local x,y,w,h = self.x,self.y,self.w,self.h 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 r,g,b,a = self.r,self.g,self.b,self.a local fnt,fnt_sz = self.fnt, self.fnt_sz -- Get 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 then self.onClick() end -- Draw btn body, frame ---- gfx.set(r,g,b,a) -- set body color self:draw_body() -- body self:draw_frame() -- frame -- Draw label -------------- gfx.set(0.7, 0.9, 0.4, 1) -- set label color gfx.setfont(1, fnt, fnt_sz) -- set label fnt self:draw_lbl() -- draw lbl end -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --- CheckBox Class Methods ------------------------------------------------- -------------------------------------------------------------------------------- function CheckBox:set_norm_val() local x,y,w,h = self.x,self.y,self.w,self.h local val = self.norm_val -- current value,check local menu_tb = self.norm_val2 -- checkbox table local menu_str = "" for i=1, #menu_tb,1 do if i~=val then menu_str = menu_str..menu_tb[i].."|" else menu_str = menu_str.."!"..menu_tb[i].."|" -- add check end end gfx.x = self.x; gfx.y = self.y + self.h local new_val = gfx.showmenu(menu_str) -- show checkbox menu if new_val>0 then self.norm_val = new_val end -- change check(!) end -------- function CheckBox:draw_body() gfx.rect(self.x,self.y,self.w,self.h, true) -- draw checkbox body end -------- function CheckBox:draw_lbl() local x,y,w,h = self.x,self.y,self.w,self.h local lbl_w, lbl_h = gfx.measurestr(self.lbl) gfx.x = x-lbl_w-5; gfx.y = y+(h-lbl_h)/2 gfx.drawstr(self.lbl) -- draw checkbox label end -------- function CheckBox:draw_val() local x,y,w,h = self.x,self.y,self.w,self.h local val = self.norm_val2[self.norm_val] local val_w, val_h = gfx.measurestr(val) gfx.x = x+5; gfx.y = y+(h-val_h)/2 gfx.drawstr(val) -- draw checkbox val end ------------------------ function CheckBox:draw() self:update_xywh() -- Update xywh(if wind changed) local r,g,b,a = self.r,self.g,self.b,self.a local fnt,fnt_sz = self.fnt, self.fnt_sz -- Get 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() then self:set_norm_val() if self:mouseClick() and self.onClick then self.onClick() end end -- Draw ch_box body, frame - gfx.set(r,g,b,a) -- set body color self:draw_body() -- body self:draw_frame() -- frame -- Draw label -------------- gfx.set(0.7, 0.9, 0.4, 1) -- set label,val color gfx.setfont(1, fnt, fnt_sz) -- set label,val fnt self:draw_lbl() -- draw lbl self:draw_val() -- draw val end -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --- Knob Class Methods ----------------------------------------------------- -------------------------------------------------------------------------------- function Knob:update_xywh() -- redefine method for Knob if not Z_w or not Z_h then return end -- return if zoom not defined local w_h = math.ceil( math.min(self.def_xywh[3]*Z_w, self.def_xywh[4]*Z_h) ) self.x = math.ceil(self.def_xywh[1]* Z_w) self.y = math.ceil(self.def_xywh[2]* Z_h) self.w, self.h = w_h, w_h if self.fnt_sz then --fix it!-- self.fnt_sz = math.max(7, self.def_xywh[5]* (Z_w+Z_h)/2)--fix it! self.fnt_sz = math.min(20,self.fnt_sz) end end -------- function Knob:set_norm_val() local y, h = self.y, self.h local VAL,K = 0,10 -- VAL=temp value;K=coefficient(when Ctrl pressed) if Ctrl then VAL = self.norm_val + ((last_y-gfx.mouse_y)/(h*K)) else VAL = (h-(gfx.mouse_y-y))/h end if VAL<0 then VAL=0 elseif VAL>1 then VAL=1 end self.norm_val=VAL end -------- function Knob:set_norm_val_m_wheel() local Step = 0.05 -- Set step if gfx.mouse_wheel == 0 then return end -- return if m_wheel = 0 if gfx.mouse_wheel > 0 then self.norm_val = math.min(self.norm_val+Step, 1) end if gfx.mouse_wheel < 0 then self.norm_val = math.max(self.norm_val-Step, 0) end return true end -------- function Knob:draw_body() local x,y,w,h = self.x,self.y,self.w,self.h local k_x, k_y, r = x+w/2, y+h/2, (w+h)/4 local pi=math.pi local offs = pi+pi/4 local val = 1.5*pi * self.norm_val local ang1, ang2 = offs-0.01, offs + val gfx.circle(k_x,k_y,r-1, false) -- external for i=1,10 do gfx.arc(k_x, k_y, r-2, ang1, ang2, true) r=r-1; -- gfx.a=gfx.a+0.005 -- variant end gfx.circle(k_x, k_y, r-1, true) -- internal end -------- function Knob:draw_lbl() local x,y,w,h = self.x,self.y,self.w,self.h local lbl_w, lbl_h = gfx.measurestr(self.lbl) gfx.x = x+(w-lbl_w)/2; gfx.y = y+h/2 gfx.drawstr(self.lbl) -- draw knob label end -------- function Knob:draw_val() local x,y,w,h = self.x,self.y,self.w,self.h local val = string.format("%.2f", self.norm_val) local val_w, val_h = gfx.measurestr(val) gfx.x = x+(w-val_w)/2; gfx.y = (y+h/2)-val_h-3 gfx.drawstr(val) -- draw knob Value end ------------------------ function Knob:draw() self:update_xywh() -- Update xywh(if wind changed) local r,g,b,a = self.r,self.g,self.b,self.a local fnt,fnt_sz = self.fnt, self.fnt_sz -- Get mouse state --------- -- in element(and get mouswheel) -- if self:mouseIN() then a=a+0.1 if self:set_norm_val_m_wheel() then if self.onMove then self.onMove() end end end -- in elm L_down ----- if self:mouseDown() then a=a+0.2 self:set_norm_val() if self.onMove then self.onMove() end end -- in elm L_up(released and was previously pressed) -- -- if self:mouseClick() and self.onClick then self.onClick() end -- Draw knob body, frame --- gfx.set(r,g,b,a) -- set body,frame color self:draw_body() -- body --self:draw_frame() -- frame(if need) -- Draw label,value -------- gfx.set(0.7, 0.9, 0.4, 1) -- set lbl,val color gfx.setfont(1, fnt, fnt_sz) -- set lbl,val fnt --self:draw_lbl() -- draw lbl(if need) self:draw_val() -- draw value end -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --- Slider Class Methods --------------------------------------------------- -------------------------------------------------------------------------------- function Slider:set_norm_val_m_wheel() local Step = 0.05 -- Set step if gfx.mouse_wheel == 0 then return false end -- return if m_wheel = 0 if gfx.mouse_wheel > 0 then self.norm_val = math.min(self.norm_val+Step, 1) end if gfx.mouse_wheel < 0 then self.norm_val = math.max(self.norm_val-Step, 0) end return true end -------- function H_Slider:set_norm_val() local x, w = self.x, self.w local VAL,K = 0,10 -- VAL=temp value;K=coefficient(when Ctrl pressed) if Ctrl then VAL = self.norm_val + ((gfx.mouse_x-last_x)/(w*K)) else VAL = (gfx.mouse_x-x)/w end if VAL<0 then VAL=0 elseif VAL>1 then VAL=1 end self.norm_val=VAL end function V_Slider:set_norm_val() local y, h = self.y, self.h local VAL,K = 0,10 -- VAL=temp value;K=coefficient(when Ctrl pressed) if Ctrl then VAL = self.norm_val + ((last_y-gfx.mouse_y)/(h*K)) else VAL = (h-(gfx.mouse_y-y))/h end if VAL<0 then VAL=0 elseif VAL>1 then VAL=1 end self.norm_val=VAL end -------- function H_Slider:draw_body() local x,y,w,h = self.x,self.y,self.w,self.h local val = w * self.norm_val gfx.rect(x,y, val, h, true) -- draw H_Slider body end function V_Slider:draw_body() local x,y,w,h = self.x,self.y,self.w,self.h local val = h * self.norm_val gfx.rect(x,y+h-val, w, val, true) -- draw V_Slider body end -------- function H_Slider:draw_lbl() local x,y,w,h = self.x,self.y,self.w,self.h local lbl_w, lbl_h = gfx.measurestr(self.lbl) gfx.x = x+5; gfx.y = y+(h-lbl_h)/2; gfx.drawstr(self.lbl) -- draw H_Slider label end function V_Slider:draw_lbl() local x,y,w,h = self.x,self.y,self.w,self.h local lbl_w, lbl_h = gfx.measurestr(self.lbl) gfx.x = x+(w-lbl_w)/2; gfx.y = y+h-lbl_h-5; gfx.drawstr(self.lbl) -- draw V_Slider label end -------- function H_Slider:draw_val() local x,y,w,h = self.x,self.y,self.w,self.h local val = string.format("%.2f", self.norm_val) local val_w, val_h = gfx.measurestr(val) gfx.x = x+w-val_w-5; gfx.y = y+(h-val_h)/2; gfx.drawstr(val) -- draw H_Slider Value end function V_Slider:draw_val() local x,y,w,h = self.x,self.y,self.w,self.h local val = string.format("%.2f", self.norm_val) local val_w, val_h = gfx.measurestr(val) gfx.x = x+(w-val_w)/2; gfx.y = y+5; gfx.drawstr(val) -- draw V_Slider Value end ------------------------ function Slider:draw() self:update_xywh() -- Update xywh(if wind changed) local r,g,b,a = self.r,self.g,self.b,self.a local fnt,fnt_sz = self.fnt, self.fnt_sz -- Get mouse state --------- -- in element(and get mouswheel) -- if self:mouseIN() then a=a+0.1 if self:set_norm_val_m_wheel() then if self.onMove then self.onMove() end end end -- in elm L_down ----- if self:mouseDown() then a=a+0.2 self:set_norm_val() if self.onMove then self.onMove() end end -- in elm L_up(released and was previously pressed) -- -- if self:mouseClick() and self.onClick then self.onClick() end -- Draw sldr body, frame --- gfx.set(r,g,b,a) -- set body,frame color self:draw_body() -- body self:draw_frame() -- frame -- Draw label,value -------- gfx.set(0.7, 0.9, 0.4, 1) -- set lbl,val color gfx.setfont(1, fnt, fnt_sz) -- set lbl,val fnt self:draw_lbl() -- draw lbl self:draw_val() -- draw value end -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --- Rng_Slider Class Methods ----------------------------------------------- -------------------------------------------------------------------------------- function Rng_Slider:pointIN_Ls(p_x, p_y) local x, w, sb_w = self.rng_x, self.rng_w, self.sb_w local val = w * self.norm_val x = x+val-sb_w -- left sbtn x; x-10 extend mouse zone to the left(more comfortable) return p_x >= x-10 and p_x <= x + sb_w and p_y >= self.y and p_y <= self.y + self.h end -------- function Rng_Slider:pointIN_Rs(p_x, p_y) local x, w, sb_w = self.rng_x, self.rng_w, self.sb_w local val = w * self.norm_val2 x = x+val -- right sbtn x; x+10 extend mouse zone to the right(more comfortable) return p_x >= x and p_x <= x+10 + sb_w and p_y >= self.y and p_y <= self.y + self.h end ------------------------ function Rng_Slider:mouseIN_Ls() return gfx.mouse_cap&1==0 and self:pointIN_Ls(gfx.mouse_x,gfx.mouse_y) end -------- function Rng_Slider:mouseIN_Rs() return gfx.mouse_cap&1==0 and self:pointIN_Rs(gfx.mouse_x,gfx.mouse_y) end ------------------------ function Rng_Slider:mouseDown_Ls() return gfx.mouse_cap&1==1 and self:pointIN_Ls(mouse_ox,mouse_oy) end -------- function Rng_Slider:mouseDown_Rs() return gfx.mouse_cap&1==1 and self:pointIN_Rs(mouse_ox,mouse_oy) end ----------------------------------- function Rng_Slider:set_norm_val() local x, w = self.rng_x, self.rng_w local VAL,K = 0,10 -- VAL=temp value;K=coefficient(when Ctrl pressed) if Ctrl then VAL = self.norm_val + ((gfx.mouse_x-last_x)/(w*K)) else VAL = (gfx.mouse_x-x)/w end -- valid val -- if VAL<0 then VAL=0 elseif VAL>self.norm_val2 then VAL=self.norm_val2 end self.norm_val=VAL end -------- function Rng_Slider:set_norm_val2() local x, w = self.rng_x, self.rng_w local VAL,K = 0,10 -- VAL=temp value;K=coefficient(when Ctrl pressed) if Ctrl then VAL = self.norm_val2 + ((gfx.mouse_x-last_x)/(w*K)) else VAL = (gfx.mouse_x-x)/w end -- valid val2 -- if VAL1 then VAL=1 end self.norm_val2=VAL end ----------------------------------- function Rng_Slider:draw_body() local x,y,w,h = self.rng_x,self.y,self.rng_w,self.h local val = w * self.norm_val local val2 = w * self.norm_val2 gfx.rect(x+val, y, val2-val, h, true) -- draw body end -------- function Rng_Slider:draw_sbtns() local r,g,b,a = self.r,self.g,self.b,self.a local x,y,w,h = self.rng_x,self.y,self.rng_w,self.h local sb_w = self.sb_w local val = w * self.norm_val local val2 = w * self.norm_val2 gfx.set(r,g,b,1) -- sbtns body color gfx.rect(x+val-sb_w, y, sb_w, h, true) -- sbtn1 body gfx.rect(x+val2, y, sb_w, h, true) -- sbtn2 body gfx.set(0,0,0,1) -- sbtns frame color gfx.rect(x+val-sb_w-1, y-1, sb_w+2, h+2, false) -- sbtn1 frame gfx.rect(x+val2-1, y-1, sb_w+2, h+2, false) -- sbtn2 frame end ----------------------------------- function Rng_Slider:draw_val() -- variant 2 local x,y,w,h = self.x,self.y,self.w,self.h local val = string.format("%.2f", self.norm_val) local val2 = string.format("%.2f", self.norm_val2) local val_w, val_h = gfx.measurestr(val) local val2_w, val2_h = gfx.measurestr(val2) local T = 0 -- set T = 0 or T = h (var1, var2 text position) gfx.x = x+5 gfx.y = y+(h-val_h)/2 + T gfx.drawstr(val) -- draw value 1 gfx.x = x+w-val2_w-5 gfx.y = y+(h-val2_h)/2 + T gfx.drawstr(val2) -- draw value 2 end -------- function Rng_Slider:draw_lbl() local x,y,w,h = self.x,self.y,self.w,self.h local lbl_w, lbl_h = gfx.measurestr(self.lbl) local T = 0 -- set T = 0 or T = h (var1, var2 text position) gfx.x = x+(w-lbl_w)/2 gfx.y = y+(h-lbl_h)/2 + T gfx.drawstr(self.lbl) end ----------------------------------- function Rng_Slider: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 local fnt,fnt_sz = self.fnt, self.fnt_sz -- set additional coordinates -- self.sb_w = math.floor(self.w/30) -- sidebuttons width(change it if need) self.rng_x = self.x + self.sb_w -- range streak x self.rng_w = self.w - self.sb_w*2 -- range streak w -- Get mouse state ------------- -- Reset Ls,Rs states -- if gfx.mouse_cap&1==0 then self.Ls_state,self.Rs_state = false,false end -- in element -- --if self:mouseIN() then a=a+0.1 end if self:mouseIN_Ls() or self:mouseIN_Rs() then a=a+0.1 end -- in elm L_down -- if self:mouseDown_Ls() then self.Ls_state = true end if self:mouseDown_Rs() then self.Rs_state = true end if self.Ls_state == true then a=a+0.2; self:set_norm_val() end if self.Rs_state == true then a=a+0.2; self:set_norm_val2() end if (self.Ls_state or self.Rs_state) and self.onMove then self.onMove() end -- in elm L_up(released and was previously pressed) -- -- if self:mouseClick() and self.onClick then self.onClick() end -- Draw sldr body, frame, sidebuttons -- gfx.set(r,g,b,a) -- set color self:draw_body() -- body self:draw_frame() -- frame self:draw_sbtns() -- draw L,R sidebuttons -- Draw label,values -- gfx.set(0.7, 0.9, 0.4, 1) -- set label color gfx.setfont(1, fnt, fnt_sz) -- set lbl,val fnt self:draw_lbl() -- draw lbl self:draw_val() -- draw value end -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --- Frame Class Methods ----------------------------------------------------- -------------------------------------------------------------------------------- function Frame:draw() self:update_xywh() -- Update xywh(if wind changed) local r,g,b,a = self.r,self.g,self.b,self.a if self:mouseIN() then a=a+0.1 end gfx.set(r,g,b,a) -- set frame color self:draw_frame() -- draw frame end ---------------------------------------------------------------------------------------------------- --- START -------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- --- Objects(for Example Only) ------------------------------------------------------------------ ---------------------------------------------------------------------------------------------------- local btn1 = Button:new(20,20,50,30, 0.5,0.3,0.4,0.3, "Btn1","Arial",15, 0 ) local btn2 = Button:new(80,20,50,30, 0.6,0.4,0.1,0.3, "Btn2","Arial",15, 0 ) local Button_TB = {btn1,btn2} ----- -- x,y,w,h, r,g,b,a, lbl,fnt,fnt_sz, norm_val = check, norm_val2 = checkbox table -- local ch_box1 = CheckBox:new(120,320,120,20, 0.6,0.6,0.6,0.3, "Chan :","Arial",15, 1, {"1/2","3/4","5/6","7/8","9/10","etc"} ) local ch_box2 = CheckBox:new(120,350,120,20, 0.6,0.6,0.6,0.3, "Mode :","Arial",15, 1, {"EQ","Gate","Compressor","Convolve","Subtract","etc"} ) local CheckBox_TB = {ch_box1,ch_box2} ----- local knb1 = Knob:new(20,80,50,50, 0.7,0.3,0.3,0.3, "K1","Arial",14, 0.5 ) local knb2 = Knob:new(80,80,50,50, 0.3,0.7,0.3,0.3, "K2","Arial",14, 0.5 ) local knb3 = Knob:new(20,140,50,50, 0.7,0.7,0.3,0.3, "K3","Arial",14, 0.5 ) local knb4 = Knob:new(80,140,50,50, 0.3,0.7,0.7,0.3, "K4","Arial",14, 0.5 ) local Knob_TB = {knb1,knb2,knb3,knb4} ----- local sldr1 = H_Slider:new(20,220,220,20, 0.7,0.3,0.3,0.3, "Sldr1","Arial",15, 0.5 ) local sldr2 = V_Slider:new(150,20,40,180, 0.3,0.5,0.7,0.3, "Sldr2","Arial",15, 0.5 ) local sldr3 = V_Slider:new(200,20,40,180, 0.3,0.5,0.7,0.3, "Sldr3","Arial",15, 0.5 ) local rng_sldr1 = Rng_Slider:new(20,250, 220,20, 0.5,0.3,0.2,0.3, "Sldr4","Arial",15, 0.2,0.8 ) local rng_sldr2 = Rng_Slider:new(20,280, 220,20, 0.5,0.4,0.3,0.3, "Sldr5","Arial",15, 0.2,0.8 ) local Slider_TB = {sldr1,sldr2,sldr3,rng_sldr1,rng_sldr2} ----- local W_Frame = Frame:new(10,10,280,380, 0,0.5,0,0.4 ) local Frame_TB = {W_Frame} ---------------------------------------------------------------------------------------------------- --- Main DRAW function ------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- function DRAW() for key,btn in pairs(Button_TB) do btn:draw() end for key,ch_box in pairs(CheckBox_TB) do ch_box:draw() end for key,knb in pairs(Knob_TB) do knb:draw() end for key,sldr in pairs(Slider_TB) do sldr:draw() end for key,frame in pairs(Frame_TB) do frame:draw() end end -------------------------------------------------------------------------------- -- INIT -------------------------------------------------------------------- -------------------------------------------------------------------------------- function Init() -- Some gfx Wnd Default Values -- local R,G,B = 20,20,20 -- 0..255 form local Wnd_bgd = R + G*256 + B*65536 -- red+green*256+blue*65536 local Wnd_Title = "TEST" local Wnd_Dock,Wnd_X,Wnd_Y = 0,100,320 Wnd_W,Wnd_H = 300,400 -- global values(used for define zoom level) -- Init window ------ gfx.clear = Wnd_bgd gfx.init( Wnd_Title, Wnd_W,Wnd_H, Wnd_Dock, Wnd_X,Wnd_Y ) -- Init mouse last -- last_mouse_cap = 0 last_x, last_y = 0, 0 mouse_ox, mouse_oy = -1, -1 end ---------------------------------------- -- Mainloop ------------------------ ---------------------------------------- function mainloop() -- zoom level -- Z_w, Z_h = gfx.w/Wnd_W, gfx.h/Wnd_H if Z_w<0.6 then Z_w = 0.6 elseif Z_w>2 then Z_w = 2 end if Z_h<0.6 then Z_h = 0.6 elseif Z_h>2 then Z_h = 2 end -- mouse and modkeys -- if gfx.mouse_cap&1==1 and last_mouse_cap&1==0 or -- L mouse gfx.mouse_cap&2==2 and last_mouse_cap&2==0 or -- R mouse gfx.mouse_cap&64==64 and last_mouse_cap&64==0 then -- M mouse mouse_ox, mouse_oy = gfx.mouse_x, gfx.mouse_y end Ctrl = gfx.mouse_cap&4==4 Shift = gfx.mouse_cap&8==8 Alt = gfx.mouse_cap&16==16 -- Shift state ------------------------- -- DRAW,MAIN functions -- DRAW() -- Main() ------------------------- ------------------------- last_mouse_cap = gfx.mouse_cap last_x, last_y = gfx.mouse_x, gfx.mouse_y gfx.mouse_wheel = 0 -- reset gfx.mouse_wheel char = gfx.getchar() if char==32 then reaper.Main_OnCommand(40044, 0) end -- play if char~=-1 then reaper.defer(mainloop) end -- defer ----------- gfx.update() ----------- end -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------ Init() mainloop()