ReaScripts (скрипты для Reaper) - Учимся создавать!!! (1 онлайн

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Aleksandr Oleynik, я делал себе панельку, очень удобную на мой взгляд, там запоминается статус мьютированный и немьютированных айтемов. На основе Жениного скрипта, который он как основу для творчества предложил, хочу его немного развить. Вот код:
Код:
--------------------------------------------------------------------------------
---   Simple Element Class   ---------------------------------------------------
--------------------------------------------------------------------------------
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(250/256, 250/256, 250/256, 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() 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
-------------------------------------------------
-------------------------------------------------
R = 228/256;
G = 81/256;
B = 18/256;

R1 = 82/256;
G1 = 150/256;
B1 = 70/256;

R2 = 210/256;
G2 = 120/256;
B2 = 49/256;

R3 = 69/256;
G3 = 150/256;
B3 = 140/256;
-------------------------------------------------
----Objects--------------------------------------
-------------------------------------------------
local btn1 = Button:new(5,  10,30,30, R,G,B,1, "01","Arial",20 )
local btn2 = Button:new(40,  10,30,30,  R1,G1,B1,1, "01","Arial",20 )
local btn3 = Button:new(5, 45,30,30,  R,G,B,1, "02","Arial",20 )
local btn4 = Button:new(40,  45,30,30,  R1,G1,B1,1, "02","Arial",20 )
local btn5 = Button:new(5,  80,30,30,  R,G,B,1, "03","Arial",20 )
local btn6 = Button:new(40, 80,30,30,  R1,G1,B1,1, "03","Arial",20 )
local btn7 = Button:new(5,  115,30,30,  R,G,B,1, "04","Arial",20 )
local btn8 = Button:new(40,  115,30,30,  R1,G1,B1,1, "04","Arial",20 )
local btn9 = Button:new(5,  155,30,30,  R2,G2,B2,1, "05","Arial",20 )
local btn10 = Button:new(40,  155,30,30,  R3,G3,B3,1, "05","Arial",20 )
local btn11 = Button:new(5,  190,30,30,  R2,G2,B2,1, "06","Arial",20 )
local btn12 = Button:new(40,  190,30,30,  R3,G3,B3,1, "06","Arial",20 )
local btn13 = Button:new(5,  225,30,30, R2,G2,B2,1, "07","Arial",20 )
local btn14 = Button:new(40,  225,30,30,  R3,G3,B3,1, "07","Arial",20 )
local btn15 = Button:new(5,  260,30,30,  R2,G2,B2,1, "08","Arial",20 )
local btn16 = Button:new(40,  260,30,30,  R3,G3,B3,1, "08","Arial",20 )
local btn17 = Button:new(5,  300,30,30,   R,G,B,1, "09","Arial",20 )
local btn18 = Button:new(40,  300,30,30,  R1,G1,B1,1, "09","Arial",20 )
local btn19 = Button:new(5,  335,30,30,  R,G,B,1, "10","Arial",20 )
local btn20 = Button:new(40,  335,30,30,  R1,G1,B1,1, "10","Arial",20 )
local btn21 = Button:new(5,  370,30,30,  R,G,B,1, "11","Arial",20 )
local btn22 = Button:new(40,  370,30,30,  R1,G1,B1,1, "11","Arial",20 )
local btn23 = Button:new(5,  405,30,30,   R,G,B,1, "12","Arial",20 )
local btn24 = Button:new(40,  405,30,30,  R1,G1,B1,1, "12","Arial",20 )
local btn25 = Button:new(5,  445,30,30,   R2,G2,B2,1, "13","Arial",20 )
local btn26 = Button:new(40,  445,30,30,  R3,G3,B3,1, "13","Arial",20 )
local btn27 = Button:new(5,  480,30,30,  R2,G2,B2,1, "14","Arial",20 )
local btn28 = Button:new(40,  480,30,30,   R3,G3,B3,1, "14","Arial",20 )
local btn29 = Button:new(5,  515,30,30,   R2,G2,B2,1, "15","Arial",20 )
local btn30 = Button:new(40,  515,30,30,  R3,G3,B3,1, "15","Arial",20 )
local btn31 = Button:new(5,  550,30,30,   R2,G2,B2,1, "16","Arial",20 )
local btn32 = Button:new(40,  550,30,30,   R3,G3,B3,1, "16","Arial",20 )
local btn33 = Button:new(5,  590,30,30,   R3,G3,B3,1, "Time","Arial",14 )
local btn34 = Button:new(40,  590,30,30,  R3,G3,B3,1, "Track","Arial",14 )
local btn35 = Button:new(5,  625,30,30,   R3,G3,B3,1, "T+T","Arial",14 )
local btn36 = Button:new(40,  625,30,30,  R1,G1,B1,1, "Unsel","Arial",14 )
local btn37 = Button:new(5,  660,30,30,  R,G,B,1, "M","Arial",20 )
local btn38 = Button:new(40,  660,30,30,  R1,G1,B1,1, "Un","Arial",20 )
local btn39 = Button:new(5,  700,65,30,  R,G,B,1, "Remove","Arial",20 )
local btn40 = Button:new(5,  735,65,30,  R1,G1,B1,1, "Paste","Arial",20 )

local Button_TB = {btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10,btn11,btn12,btn13,btn14,btn15,btn16,
                   btn17,btn18,btn19,btn19,btn20,btn21,btn22,btn23,btn24,btn25,btn26,btn27,btn28,btn29,btn30,btn31,btn32,
                   btn33,btn34,btn35,btn36,btn37,btn38,btn39,btn40}

------------------------------------------------
------------------------------------------------
btn1.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_1"),0)
                         reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn2.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_1"),0)
                         reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn3.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_2"),0)
                         reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn4.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_2"),0)
                         reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn5.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_3"),0)
                         reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn6.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_3"),0)
                         reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn7.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_4"),0)
                         reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn8.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_4"),0)
                         reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn9.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_5"),0)
                         reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn10.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_5"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn11.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_6"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn12.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_6"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn13.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_7"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn14.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_7"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn15.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_8"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn16.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_8"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn17.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_9"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn18.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_9"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn19.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_10"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn20.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_10"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn21.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_11"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn22.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_11"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn23.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_12"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn24.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_12"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn25.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_13"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn26.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_13"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn27.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_14"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn28.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_14"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn29.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_15"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn30.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_15"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn31.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_16"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn32.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_SOLO_MUTE_ALL_ITEMS_SLOT_16"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn33.onClick = function()reaper.Main_OnCommand(40717,0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn34.onClick = function()reaper.Main_OnCommand(40421,0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn35.onClick = function()reaper.Main_OnCommand(40718,0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn36.onClick = function()reaper.Main_OnCommand(40289,0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn37.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_RS1bd2b238e9d479aa5810c8e7acfc9a16a9c83f75"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn38.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_RS268441f85b4a49000f857fd18eeb91fa337bea59"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn39.onClick = function()reaper.Main_OnCommand(40006,0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
btn40.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_RSce98886369682a42fdce6be0b98f4ebf69a97b0f"),0)
                          reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end

------------------------------------------------
------------------------------------------------
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 = "mute_state_items", 75,770, 0,1705,100
--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
Ctrl  = gfx.mouse_cap&4==4
Shift = gfx.mouse_cap&8==8
----------------------
--DRAW,MAIN function--
   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()
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
В нём все ссылки на или штатные экшены или SWS, кроме одного. Кнопка Paste - мой скрипт, который работает безотказно, но нуждается также в доработке, только это со временем, так как там действительно много работы:
Код:
reaper.Undo_BeginBlock()
local startLoop, endLoop = reaper.GetSet_LoopTimeRange(0,0,0,0,0)
time_1 =  reaper.GetCursorPosition()
reaper.Main_OnCommand(reaper.NamedCommandLookup("_SWS_SAVETIME1"),0)--SWS: Save time selection, slot 1
reaper.Main_OnCommand(reaper.NamedCommandLookup("_SWS_SAVEALLSELITEMS1"),0)--SWS: Save selected item(s)
--reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_CURSOR_POS_SLOT_1"),0)--SWS/BR: Save edit cursor position, slot 01
reaper.Main_OnCommand(40630,0)--Go to start of time selection
time_2 =  reaper.GetCursorPosition()
reaper.Main_OnCommand(40290,0)--Time selection: Set time selection to items
time_3 =  reaper.GetCursorPosition()
reaper.Main_OnCommand(reaper.NamedCommandLookup("_SWS_SELTRKWITEM"),0)--SWS: Select only track(s) with selected item(s)
reaper.Main_OnCommand(reaper.NamedCommandLookup("_XENAKIOS_SELFIRSTOFSELTRAX"),0)--Xenakios/SWS: Select first of selected tracks
reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)--SWS/BR: Focus arrange
reaper.Main_OnCommand(41383,0)--Edit: Copy items/tracks/envelope points (depending on focus) within time selection, if any (smart copy)
reaper.SetEditCurPos( time_1-time_2+time_3, 0, 0 )
--reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_RESTORE_CURSOR_POS_SLOT_1"),0)--SWS/BR: Restore edit cursor position, slot 01
reaper.Main_OnCommand(42398,0)--Item: Paste items/tracks
reaper.Main_OnCommand(reaper.NamedCommandLookup("_SWS_RESTTIME1"),0)--SWS: Restore time selection, slot 1
reaper.Main_OnCommand(reaper.NamedCommandLookup("_SWS_RESTALLSELITEMS1"),0)--SWS: Restore saved selected item(s)
reaper.SetEditCurPos( time_1+endLoop-startLoop, 0, 0 )


reaper.Undo_EndBlock("Paste selected item to edit cursor", -1)
 

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
На сколько я могу судить для Ctrl+Click
Нужно добавлять функционал по типу простого Click
-——-
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
——————

if self:mouseClick() then self.onClick() end

——————-
btn1.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_1"),0)
reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end


Вот в этих трёх местах дописать функционал для Cntrl
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
На сколько я могу судить для Ctrl+Click
Нужно добавлять функционал по типу простого Click
-——-
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
——————

if self:mouseClick() then self.onClick() end

——————-
btn1.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_1"),0)
reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end


Вот в этих трёх местах дописать функционал для Cntrl
Спасибо, сейчас попробую.
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Aleksandr Oleynik, в коде, почти в самом низу есть такие строки:
Ctrl = gfx.mouse_cap&4==4
Shift = gfx.mouse_cap&8==8
Они могут иметь какое-то отношение к данному вопросу?
------
Пока не понял, как правильно написать, буду думать, искать аналоги.
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@Mr_Tsonts, это просто присвоение значений переменным, в данном случаи сможете писать в коде просто Ctrl или Shift и скрипт будет понимать их значение.
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Mr_Tsonts, это просто присвоение значений переменным, в данном случаи сможете писать в коде просто Ctrl или Shift и скрипт будет понимать их значение.
Подумал, легче будет присвоить правую кнопку)))) Не легче)))))
Те же ошибки вылетают.
Вот здесь что-то неправильно:
Код:
function Element:RightmouseClick()
  return gfx.mouse_cap&2==0 and last_mouse_cap&2==2 and
  self:pointIN(gfx.mouse_x,gfx.mouse_y) and self:pointIN(mouse_ox,mouse_oy)  
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:RightmouseClick()
  return gfx.mouse_cap&1==2 and last_mouse_cap&2==2 and
  self:pointIN(gfx.mouse_x,gfx.mouse_y) and self:pointIN(mouse_ox,mouse_oy)    
end
Но тогда просто ничего не происходит...

Остальные две части выглядят так:
Код:
if self:RightmouseClick() then self.RightonClick() end
и:
Код:
btn2.RightonClick = function()reaper.Main_OnCommand(40730,0)end
 
Последнее редактирование:

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.063
113
62
Киев
@Mr_Tsonts, тут уже нужно садиться и писать скрипт самому, чтоб разобраться. В скриптописании GUI самая путанная и сложная часть.
 
  • Like
Реакции: Mr_Tsonts

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Aleksandr Oleynik, в принципе, просто хотел меньше кнопок, типа по две функции, касающиеся одного слота на одну. Но и так пока норм. Но вопрос, конечно, всё равно интересный. Главную задачу скрипт выполняет.
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Aleksandr Oleynik, частично разобрался, действительно нужно указывать номер модификатора. Вот так работает
Код:
function Element:RightmouseClick()
  return gfx.mouse_cap&2==2 and last_mouse_cap&2==0 and
  self:pointIN(gfx.mouse_x,gfx.mouse_y) and self:pointIN(mouse_ox,mouse_oy)
end
Для Ctrl - 4, для Shift - 8 и так далее. Но, теперь, правая кнопка срабатывает, только если до этого туда срабатывала левая, а с клавишами срабатывают обе функции одновременно, и та, которая onClick, и та, которая CtrlonClick или ShiftonClick))))))) Я думал, что на них можно повесить разные функции, но получается, что есть смысл только в тех, которые можно совмещать)))) Или всё-таки нет? Просто не знаю, возможно весь код надо иначе делать?
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев

Kokarev Maxim

ex cool
13 Май 2007
5.275
4.372
113
44
Барнаул
recording-studio.ru
@Aleksandr Oleynik, в коде, почти в самом низу есть такие строки:
Ctrl = gfx.mouse_cap&4==4
Shift = gfx.mouse_cap&8==8
Они могут иметь какое-то отношение к данному вопросу?
------
Пока не понял, как правильно написать, буду думать, искать аналоги.
Это комбинации клика и горячей клавиши. Похоже, то что нужно. Я по быстрому глянул скрипт, похоже, можно примитивнейшим решением обойтись :)

Попробуй заменить это:

Код:
btn1.onClick = function()reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_1"),0)
                         reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)end
На это:

Код:
btn1.onClick = function()
    if not Ctrl then
       reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_SAVE_SOLO_MUTE_ALL_ITEMS_SLOT_1"),0)
       reaper.Main_OnCommand(reaper.NamedCommandLookup("_BR_FOCUS_ARRANGE_WND"),0)
       else
       reaper.Main_OnCommand(reaper.NamedCommandLookup("_SWS_TRACKRANDCOL"),0)
    end
end
Я на котнрол поставил просто смену цвета трека, для наглядности. Но, думаю, принцип понятен будет.
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Kokarev Maxim, Спасибо!!! Несколько раз, правда выдало ошибку, возможно я запутался. но пришлось закомментить строку
if self:ShiftmouseClick() then self.ShiftonClick() end
После этого начало работать. Ошибка отсылала ещё и к
return p_x >= self.x and p_x <= self.x + self.w and p_y >= self.y and p_y <= self.y + self.h
но туда часто отсылает)))) Если что-то не так. В частности, когда экспериментировал со значениями модификаторов клавиш.
А после изменения не сразу выдало ошибку, как-то через раз, начал писать гифку как отчёт - нет ошибки, потом опять... Возможно, строки
function Element:ShiftmouseClick()
return gfx.mouse_cap&8==8 and last_mouse_cap&8==0 and
self:pointIN(gfx.mouse_x,gfx.mouse_y) and self:pointIN(mouse_ox,mouse_oy)
end
тоже не нужны. Ещё буду посмотреть))))))

В общем, пока результат положительный. Спасибо ещё раз!!!
PS: Закоментил эти строки тоже. Работает.
 
Последнее редактирование:
  • Like
Реакции: Kokarev Maxim

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
Хм... Если просто вставить эти строки, то текстовый редактор сайта видит улыбочки, если в коде, то:
Код:
function Element:ShiftmouseClick()
  return gfx.mouse_cap&8==8 and last_mouse_cap&8==0 and
  self:pointIN(gfx.mouse_x,gfx.mouse_y) and self:pointIN(mouse_ox,mouse_oy)     
end
...то без улыбочек)))
 

borisuperful

Well-Known Member
31 Янв 2013
2.017
1.152
113
Жалко что Lua нету в форматировании, но PHP более всех похож на синтаксис :) Однако JavaScript прямее подчеркивает
Может быть разрабов форума попросить добавить Lua? Вряд ли здесь другие языки пригодятся вообще
 
  • Like
Реакции: Mr_Tsonts

belovw

Well-Known Member
22 Апр 2009
9.201
8.384
113
50
RK Almaty
Созрел.
Одним словом решился проникнуться в скрипты.
Многие меня знают по плагинам JSFX. Но скрипты это что-то совсем другое.
Прошу отнестись с пониманием, ибо не знаю по этой теме ничего. Но думаю освоюсь.

Тем кому не сложно, объясните с самого начала по теме. Ну и для освоения давайте сделаем скрипт на команду
Peaks: Increase peaks view gain
и
Peaks: Decrease peaks view gain

Эти команды очень медленные и я сделал экшн который повторяет эти команды 4 раза. Больше делать смысла нет - тормозит интерфейс, а хотелось бы. Знаю есть какой-то экшн который запрещает обновлять графический интерфейс на время выполнения скрипта. Хотелось бы собрать такой скрипт. Ну и потом попытаться сделать подобный для мыши.
 
  • Like
Реакции: Antonio

incubator

Well-Known Member
24 Янв 2007
641
444
63
Spb
@belovw, Поздравляю! Вот функция выключающая обновление интерфейса!
Код:
reaper.PreventUIRefresh(1)

////здесь что то делаем

reaper.PreventUIRefresh(-1)
 
  • Like
Реакции: Al Brazy и belovw

vitalker

Well-Known Member
8 Окт 2013
5.085
2.195
113
Гродно
@incubator, добавлю, что может быть другое число, не только 1. :) Обязательно числа в скобках должны совпадать, иначе может быть плохо.
 

belovw

Well-Known Member
22 Апр 2009
9.201
8.384
113
50
RK Almaty
как вытащить значение колеса мыши?
2 часа гугл поиска пока что в пустую
 

Trasher

Well-Known Member
12 Янв 2013
604
423
63
как вытащить значение колеса мыши?
2 часа гугл поиска пока что в пустую
Наверное вначале номер контроллера через геттер и счетчик мудрить.На забугорных сайтах пишут,что дельта за событие +/-120 .Сцыль
UPD На сайте кокосов кстати немного инфы есть, совсем чуть-чуть. JSFXСцылка [в самом низу теги mouse_wheel, mouse_hwheel ]
 
Последнее редактирование:

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@belovw, Script: EUGEN27771_Simple GUI template for scripts.lua не подойдёт для примера?
Или он ещё может выглядеть как Script: gen_Simple GUI template for scripts.lua
 

incubator

Well-Known Member
24 Янв 2007
641
444
63
Spb
@belovw, Вот для примера скрипт который я делал для пиков.Его просто на колесо мышки вешаете. Если правильно помню get_action_context.
Код:
function action(id) reaper.Main_OnCommand(id, 0) end
local _,_,_,_,_,_,val = reaper.get_action_context()


if val > 0 then  reaper.Main_OnCommand(40155, 0) else reaper.Main_OnCommand(40156, 0) end


    reaper.UpdateArrange()
 
  • Like
Реакции: Trasher и belovw

belovw

Well-Known Member
22 Апр 2009
9.201
8.384
113
50
RK Almaty
@incubator, разобрался:
не нужно искать значения колеса. Так как у нас запуск скрипта был привязан на колесо, то нужно было запустить команду get.action.content учитывая синтаксис для луа и еел.
Все переменные кроме последней можно заменить на нижнее тире. Если колесо имело проворот вперёд, то последняя переменная будет больше 0. Если назад то отрицательный.
Далее if then else.

Прикольно, EEL имеет практически такой же синтаксис что и JSFX.
Получилось два работающих скрипта

Код:
_,_,_,_,_,_,val = reaper.get_action_context(0)
if val > 0 then reaper.Main_OnCommand(40155,0) else reaper.Main_OnCommand(40156,0) end
if val > 0 then reaper.Main_OnCommand(40155,0) else reaper.Main_OnCommand(40156,0) end
if val > 0 then reaper.Main_OnCommand(40155,0) else reaper.Main_OnCommand(40156,0) end
Код:
get_action_context(_,_,_,_,_,val);
val > 0 ? Main_Oncommand(40155,0): Main_Oncommand(40156,0);
val > 0 ? Main_Oncommand(40155,0): Main_Oncommand(40156,0);
val > 0 ? Main_Oncommand(40155,0): Main_Oncommand(40156,0);
Самое главное я уже что-то понимаю как это работает.
 
  • Like
Реакции: Trasher

belovw

Well-Known Member
22 Апр 2009
9.201
8.384
113
50
RK Almaty
Теперь замени этот Экшин на API функции.
Как? Ты же знаешь что я нуб в скриптах. Мне хватило этой ночи чтобы добраться до функции мыши. Вторую ночь я скорее всего буду спать, если доживу конечно. Ну или ты подскажешь ))
 

Сейчас онлайн (Пользователей: 0, Гостей: 1)