|
|
|
04-23-2015, 02:24 AM
|
#1
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
Mouse position dependant actions (contextual actions) eel
Hi!
Thanks to Breeder and its genius work, I worked on a template to make any Mouse Position Dependant Action.
WARNING : REAPER 5 only and need the last beta of SWS extensions!
Example :
"contextual group"
if mouse is over an item -> the triggered action will be "group selected items
if mouse is over the tcp -> the triggered action will be "set track grouping parameters"
if mouse is over an empty area of track -> "ungroup selected items"
How it works?
Here's the template code
Code:
// Call BR_GetMouseCursorContext API from SWS to get current details for stuff under mouse cursor
extension_api("BR_GetMouseCursorContext", #window, #segment, #details, 128);
// If mouse is over TCP track, execute this
!strcmp(#window, "tcp") && !strcmp(#segment, "track") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over empty tcp, execute this
: !strcmp(#window, "tcp") && !strcmp(#segment, "empty") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over ECP , execute this
: !strcmp(#window, "tcp") && !strcmp(#segment, "envelope") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over region lane , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "region_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over Marker lane , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "marker_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over Tempo lane , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "tempo_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over Timeline , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "timeline") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over Transport , execute this
: !strcmp(#window, "Transport") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over MCP Track , execute this
: !strcmp(#window, "mcp") && !strcmp(#segment, "track") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over MCP Track , execute this
: !strcmp(#window, "mcp") && !strcmp(#segment, "empty") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over arrange empty, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "empty") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over an item, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "item") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over an item stretch marker, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "item_stretch_marker") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over an envelope point in the track lane, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "env_point") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over an envelope segment in the track lane, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "env_segment") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over an empty envelope, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "envelope") && !strcmp(#details, "empty") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over an envelope point, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "envelope") && !strcmp(#details, "env_point") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over an envelope segment, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "envelope") && !strcmp(#details, "env_segment") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over an empty arrange area, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "empty") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over MIDI Editor Ruler, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "ruler") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over MIDI Editor Piano, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "piano") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over MIDI Editor Notes, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "notes") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over MIDI CC selector, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "cc_lane") && !strcmp(#details, "cc_selector") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over MIDI CC lane, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "cc_lane") && !strcmp(#details, "cc_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
At the moment the code just trigger the same two actions over every contexts.
1) no-op no action
2) SWS left mouse click at mouse position
So it does nothing
But you can edit as your heart content!
How to create you own script?
-Open action list and click "new reascript"
-Name and save your file as "BLABLA.eel"
-Copy paste the code in the reascript window and Edit.
How to edit? :
Notice that 2 lines at every context :
Code:
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
For triggering any native action, select the action in your action list -> right click -> copy selected action command ID
and paste the ID to replace 65535
For triggering any sws action
select the action in your action list -> right click -> copy selected action command ID
and paste the ID to replace _S&M_MOUSE_L_CLICK
For triggerind any MIDI editor action, you need to replace the "Main_OnCommand" by "MIDIEditor_LastFocused_OnCommand"
You can trigger as many actions as you want to make macros inside a context.
Example :
Code:
Main_OnCommand(65535, 0);
Main_OnCommand(65535, 0);
Main_OnCommand(65535, 0);
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
Enjoy!
All credits goes to Breeder and I thank him as much as possible for his work!
|
|
|
04-23-2015, 06:34 AM
|
#2
|
Human being with feelings
Join Date: Apr 2013
Location: France
Posts: 9,875
|
Nice to have put all these variables together
It's a good script template, with nice comments.
I wonder what nice "group actions scripts" will be created with that :P
Cheers :P
|
|
|
04-23-2015, 06:43 AM
|
#3
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
I play with this since yesterday and it's amazing
conditional split!
love it!
It would be even more awesome if we could have a second layer of mouse context
example :
item and time selection
item and no time selection
item upper half
item bottom half
arrange-envelope-segment- time selection
arrange-envelope-segment- no time selection
|
|
|
04-23-2015, 07:15 AM
|
#4
|
Human being with feelings
Join Date: Apr 2013
Location: France
Posts: 9,875
|
Quote:
It would be even more awesome if we could have a second layer of mouse context
|
Time selection and loop selection seem possible.
Code:
GetSet_LoopTimeRange(bool isSet, bool isLoop, &startOut, &endOut, bool allowautoseek)
|
|
|
04-23-2015, 07:22 AM
|
#5
|
Human being with feelings
Join Date: Nov 2010
Posts: 2,436
|
Time selection argument can get handled right now...all you have to do is get mouse position from SWS mouse functions and compare it with current time selection.
You could put this code after calling BR_GetMouseCursorContext and before checking window/segment/details string to use overTimeSel variable as one more condition for those comparisons:
Code:
overTimeSel = 0;
// Get time selection info
GetSet_LoopTimeRange2(0, 0, 0, tStart, tEnd, 0);
(tStart != tEnd) ?
(
mousePos = extension_api("BR_GetMouseCursorContext_Position"); // call this only after calling BR_GetMouseCursorContext to obtain data for current mouse position
mousePos >= tStart && mouseMpos <= tEnd ? overTimeSel = 1;
);
// And test it...
overTimeSel ? ShowConsoleMsg("over time selection\n") : ShowConsoleMsg("not over time selection\n");
Upper and bottom part of the item require updates to SWS API to expose that information.
|
|
|
04-23-2015, 07:29 AM
|
#6
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
@ breeder :
it works! I see the message box over or not over
now I have to find how to use this to make alternate actions for the same context...
|
|
|
04-26-2015, 07:20 AM
|
#7
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
Ok, here's a brand new template, now you can have more options considering time selection
As an exemple you can have
- mouse over item AND time selection
- mouse over item and outside time selection
It's freaking amazing!
I have two contextual action yet coded and it's a game changer
Contextual split!
Contextual delete (you delete what you are pointing)
here's the blank template
Code:
Undo_BeginBlock();
// Call BR_GetMouseCursorContext API from SWS to get current details for stuff under mouse cursor
extension_api("BR_GetMouseCursorContext", #window, #segment, #details, 128);
overTimeSel = 0;
// Get time selection info
GetSet_LoopTimeRange2(0, 0, 0, tStart, tEnd, 0);
(tStart != tEnd) ?
(
mousePos = extension_api("BR_GetMouseCursorContext_Position"); // call this only after calling BR_GetMouseCursorContext to obtain data for current mouse position
mousePos >= tStart && mousePos <= tEnd ? overTimeSel = 1;
);
// If mouse is over TCP track, execute this
!strcmp(#window, "tcp") && !strcmp(#segment, "track") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over empty tcp, execute this
: !strcmp(#window, "tcp") && !strcmp(#segment, "empty") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over ECP , execute this
: !strcmp(#window, "tcp") && !strcmp(#segment, "envelope") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over region lane , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "region_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over Marker lane , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "marker_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over Tempo lane , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "tempo_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over Timeline , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "timeline") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over Transport , execute this
: !strcmp(#window, "Transport") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over MCP Track , execute this
: !strcmp(#window, "mcp") && !strcmp(#segment, "track") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over MCP Empty , execute this
: !strcmp(#window, "mcp") && !strcmp(#segment, "empty") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0);
)
// If mouse is over arrange empty, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "empty") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over an item, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "item") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over an item stretch marker, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "item_stretch_marker") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over an envelope point in the track lane, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "env_point") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over an envelope segment in the track lane, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "env_segment") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over an empty envelope, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "envelope") && !strcmp(#details, "empty") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over an envelope point, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "envelope") && !strcmp(#details, "env_point") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over an envelope segment, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "envelope") && !strcmp(#details, "env_segment") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over an empty arrange area, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "empty") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
/// MIDI ////////////////////////////////////////////////////
// If mouse is over MIDI Editor Ruler, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "ruler") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over MIDI Editor Piano, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "piano") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over MIDI Editor Notes, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "notes") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over MIDI CC selector, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "cc_lane") && !strcmp(#details, "cc_selector") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
)
// If mouse is over MIDI CC lane, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "cc_lane") && !strcmp(#details, "cc_lane") ?
(
overTimeSel ?
// Over time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) :
// Outside time Selection
Main_OnCommand(65535, 0)
+ Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CLICK"), 0) ;
);
UpdateArrange();
Undo_EndBlock("Contextual Template", 0);
|
|
|
05-25-2015, 03:31 AM
|
#8
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
Hi Everyone!
How hard could it be to make a dedicated window for this via the SWS extension?
Something very simple
Just a window containing a tab
1) you add a line
Column 1 : you give a name
Column 2 -> 55 : each existing and possible context (tcp, item, item + time selection, ecp, envelope point,...)
Now you can click on any box to open an action/ macro editor and drag or copy actions from actions list (same as cycle action editor)
click save and the brand new contextual action is now in the action list
?
The more I use this script, the more I find the contextual action AWESOME
- contextual split
- contextual delete (you delete what you're pointing)
- contextual "add" (ad track if over tcp, add item if over arrange view, add an env point, add a marker,...
- contextual play or rec
- contextual copy, cut, duplicate
- ...
|
|
|
06-07-2015, 11:19 AM
|
#9
|
Human being with feelings
Join Date: Apr 2011
Posts: 3,451
|
Wow!! Merci beaucoup Reno!!
So useful! Using your template I created a contextual toggle zoom tool!
Over TCP -> toggles maximum zoom and hides other tracks
Over ECP -> toggles maximum lane height (needs a cycle action)
Over an item -> toggles zoom to item under cursor
To use, import the cycle action and note its number in your system. Then open the .txt file and find the cycle action and change its number to the one of your system and save the file with an .eel extension.
Voilà!
|
|
|
06-07-2015, 11:25 AM
|
#10
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
glad you like it
|
|
|
06-09-2015, 07:38 AM
|
#11
|
Human being with feelings
Join Date: Apr 2011
Posts: 3,451
|
Quote:
Originally Posted by Reno.thestraws
Hi Everyone!
How hard could it be to make a dedicated window for this via the SWS extension?
Something very simple
Just a window containing a tab
1) you add a line
Column 1 : you give a name
Column 2 -> 55 : each existing and possible context (tcp, item, item + time selection, ecp, envelope point,...)
Now you can click on any box to open an action/ macro editor and drag or copy actions from actions list (same as cycle action editor)
click save and the brand new contextual action is now in the action list
?
The more I use this script, the more I find the contextual action AWESOME
- contextual split
- contextual delete (you delete what you're pointing)
- contextual "add" (ad track if over tcp, add item if over arrange view, add an env point, add a marker,...
- contextual play or rec
- contextual copy, cut, duplicate
- ...
|
I agree! There is enormous amount of possibilities here! A dedicated window like the Contextual Toolbars window, would be so useful!!!
Or alternatively we could have, let's say, 10 contextual actions. The window would be similar to the Contextual Toolbars window and the Cycle Actions window, where one could define which action he/she wants under a certain context. And then we need some new actions like: "run contextual action #1" etc
What do you think? Breeder? Do you like the idea? Do you have the time and will to code it for SWS?
|
|
|
06-09-2015, 10:27 AM
|
#12
|
Human being with feelings
Join Date: Nov 2010
Posts: 2,436
|
Quote:
Originally Posted by amagalma
What do you think? Breeder? Do you like the idea? Do you have the time and will to code it for SWS?
|
I don't need it and I really don't have much time. However, if all interested parties decided to donate (to me personally) enough for the cause, I might do it. If you're interested, let me know and I'll create kickstarter campaign. Don't take this the wrong way guys, but I have lots of real life obligations and I just can't justify coding something this size (which I personally don't need) for free.
Last edited by Breeder; 06-09-2015 at 10:33 AM.
|
|
|
06-09-2015, 10:31 AM
|
#13
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
How much is enough?
|
|
|
06-09-2015, 10:43 AM
|
#14
|
Human being with feelings
Join Date: Nov 2010
Posts: 2,436
|
Quote:
Originally Posted by Reno.thestraws
How much is enough?
|
I have no idea, I guess if you get 30 or more people to fund each with 10 bucks I would consider this ok. I would be able to start in 20 days and I think I could do it in a week. If you think this is fair, I will create kickstarter campaign.
|
|
|
06-09-2015, 11:11 AM
|
#15
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
It might be doable to have 30 people
Last edited by Reno.thestraws; 06-09-2015 at 12:27 PM.
|
|
|
06-11-2015, 10:22 AM
|
#16
|
Human being with feelings
Join Date: Apr 2011
Posts: 3,451
|
Quote:
Originally Posted by Breeder
I don't need it and I really don't have much time. However, if all interested parties decided to donate (to me personally) enough for the cause, I might do it. If you're interested, let me know and I'll create kickstarter campaign. Don't take this the wrong way guys, but I have lots of real life obligations and I just can't justify coding something this size (which I personally don't need) for free.
|
Don't worry Breeder, we don't take it the wrong way and it is perfectly understandable! I could donate $10 too for the project, but I don't know if we could get 30 people for this... because the project would offer an easier and faster way to set up what Reno.thestraws has already offered.. And anyway, it is something to set once and forget.. So, maybe there is not such a big need for this.
@Reno.thestraws: is it possible to make it work in v4?
|
|
|
06-11-2015, 10:23 AM
|
#17
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
Quote:
@Reno.thestraws: is it possible to make it work in v4?
|
Nope.
|
|
|
06-11-2015, 10:50 AM
|
#18
|
Human being with feelings
Join Date: Nov 2010
Posts: 2,436
|
Quote:
Originally Posted by amagalma
@Reno.thestraws: is it possible to make it work in v4?
|
It actually is if you're using python But python is quite slower (it seems slowness comes from the fact that it takes longer time to parse .py script, interpret it and compile it. EEL and Lua do it soooo much faster. I've actually rewritten all of my personal scripts to use Lua and EEL and the difference is staggering)
Btw...I told this to Reno on our GitHub already but worth mentioning again. I find ReaScript is much more powerful than native SWS solution because you can do so much more with it - you can know which track, item, take is at mouse cursor, at what time...and then you can use that data to manipulate stuff in a more advanced way.
Yes, I know a lot of people don't have the time to learn to code but you can always ask on the forum for help, tons of people can and will offer you advice and write a script for you
I'll look into crowdfunding when I catch some time (it seems kickstarter doesn't allow all EU countries). If I get enough support, I'll give it a go.
|
|
|
06-11-2015, 11:00 AM
|
#19
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
Quote:
I find ReaScript is much more powerful than native SWS solution because you can do so much more with it - you can know which track, item, take is at mouse cursor, at what time...and then you can use that data to manipulate stuff in a more advanced way.
|
80% of REAPER user DON'T know how to create a script from scratch.
50% don't even know how to install it.
SWS is the best way to make things useful for people
I recently made a video tutorial about COnditions in CAE because, a lot of people, found them difficult to understand.
So a script....
|
|
|
06-11-2015, 11:13 AM
|
#20
|
Human being with feelings
Join Date: Nov 2010
Posts: 2,436
|
Quote:
Originally Posted by Reno.thestraws
So a script....
|
I'm a bit biased these days, but unfortunately I do agree with you (that's why I said people could request stuff on the forums...but a lot of REAPER users don't actively partake on the forums, so that makes you right again)
I remember when I first started ReaScript with Python - it was really hard and there were zero resources to actually guide you. It took me a long time to actually finish my first script and it wasn't even made from scratch but pieced together. And I actually love coding and find it rewarding. So I can only imagine how hard it can be for someone who lacks the interest for code.
|
|
|
06-15-2015, 11:23 PM
|
#21
|
Human being with feelings
Join Date: Oct 2009
Location: France
Posts: 743
|
Thank you Reno and Breeder, very useful, i have done a intuitive setup for editing.
|
|
|
06-19-2015, 02:34 PM
|
#22
|
Human being with feelings
Join Date: Dec 2009
Location: Oblivion
Posts: 10,252
|
this is amazing work, guys, thanks! so many actions can now be reduced to single shortcuts. one problem: should this work for mousewheel actions? can't seem to make anything happen.
One more question: any way to have separate contexts on child tracks vs parent tracks?
I'm also running into problems calling other eel scripts from inside this one. Should that be possible?
Last edited by foxAsteria; 07-16-2015 at 03:12 PM.
|
|
|
07-18-2015, 01:28 PM
|
#23
|
Human being with feelings
Join Date: Dec 2009
Location: Oblivion
Posts: 10,252
|
*bump*
Can we call an EEL script from inside another EEL script? How?
|
|
|
07-19-2015, 01:05 AM
|
#24
|
Human being with feelings
Join Date: Aug 2012
Location: Finland
Posts: 2,668
|
Quote:
Originally Posted by foxAsteria
*bump*
Can we call an EEL script from inside another EEL script? How?
|
Not possible at the moment:
Edit: This is what Jeffos posted:
Quote:
Originally Posted by Jeffos
About ReaScripts calling other ReaScripts: I can confirm this won't work (unless ran from the IDE, indeed), because there's a very strict recursion test about that ATM.
So this script A calling script B won't work:
Code:
cmd = NamedCommandLookup("_88696ecdd7464b6c9d54d65e071cfa5b"); // cmd id of script B
Main_OnCommand(cmd, 0);
To make it work you can do this though:
Code:
cmd = NamedCommandLookup("_88696ecdd7464b6c9d54d65e071cfa5b"); // cmd id of script B
defer("Main_OnCommand(cmd, 0);");
HTH.
|
(I haven't tested the latter way)
Last edited by spk77; 07-19-2015 at 05:26 AM.
|
|
|
07-23-2015, 04:20 PM
|
#25
|
Human being with feelings
Join Date: Nov 2013
Location: Argentina
Posts: 326
|
Thanks for this Reno.thestraws! It´s an amazing feature! a little hard to setup, but totally worth it. This script, with a GUI, really belongs to sws i think. It´s too good... Other thing, there is a solution to the impossibility of mouse wheel actions assignments in the script? and happens the same with customs actions i think. kind of broken. Maybe? anyways, thanks again!!
__________________
Living la vida loca
|
|
|
08-01-2015, 01:46 PM
|
#26
|
Human being with feelings
Join Date: Nov 2009
Location: Belgium
Posts: 10,474
|
Update
here's a new version of the template
https://stash.reaper.fm/v/24740/Conte...20-%20Reno.eel
I use 4 functions for faster editing
-Launching a native action (Main section) :
action(CommandID)
-Launching an extension action (Main section)
sws("CommandID")
-Launching a Native action (MIDI section)
midi(CommandID)
-Launching an extension action (MIDI section)
midisws("CommandID")
Don't forget to assign your keyboard shortcut to the "pass trough key to main window" in the MIDI editor action list for full working
This thing is, imho, a game changer
you can completly redifine your worflow
Just a little trick
You can use the scripts in the marvelous jeffos Cycle action editor, so you can make to scripts for the same key and make a conditional cycle of it
Exemple
IF
DUMMY TOGGLE 01
My Mouse dependant script 1
ELSE
My Mouse dependant script 2
END
a single complete script can run 38 actions
so with condition cycle
you can have 38 x 2 actions with one single shortcut
and even a lot more by using exclusive toggles...
|
|
|
11-03-2015, 02:59 AM
|
#27
|
Human being with feelings
Join Date: Jun 2015
Posts: 685
|
Sweet! I found myself wanting a context-specific function for mousewheel, like for example adjusting envelope points' values or item volume or track zoom etc. I think I should be able to hack something together using this, so thank you!
By the way, it would be great to have the SWS extension to include a section where you could specify context-specific actions (both normal and MIDI/CC), like you can with the toolbars.
Cheers
|
|
|
12-01-2015, 11:35 AM
|
#28
|
Human being with feelings
Join Date: Aug 2015
Posts: 3,668
|
not to hijack, but i'm looking for similar functionality that isn't mouse-dependent, but rather screen focus-dependent...
ie: if focus [specific screen], then [action]
does anyone have any leads or suggestions for this type of lewd behavior?
|
|
|
12-15-2015, 06:53 PM
|
#29
|
Human being with feelings
Join Date: Nov 2013
Location: Argentina
Posts: 326
|
Hi Reno! i'm trying to add take functionality (mostly for my "contextual delete") to this wonderful script, but sadly i barely understand lua, and eel it's above my head for now. I manage to create this (in lua) to differentiate between item context and take context, but i can't manage the translation to eel, or how to implement this in the script. This is what i mean.
And here it's the lua code. (it's functional, you can load it)
Code:
window, segment, details = reaper.BR_GetMouseCursorContext() -- get mouse context
if details == "item" then -- if item is found
tr = reaper.BR_GetMouseCursorContext_Track() --get track
it = reaper.BR_GetMouseCursorContext_Item() -- get item
tkn = reaper.CountTakes(it) -- count takes in item
if tkn > 1 then -- if number of takes is greater than one then
deltake = reaper.NamedCommandLookup("_BR_DELETE_TAKE_MOUSE", 0)
reaper.Main_OnCommandEx(deltake, 0, 0) -- delete take under cursor (sws)
else
reaper.DeleteTrackMediaItem(tr, it) -- delete item
reaper.UpdateArrange()
end
end
If you can help me to put this in, i will be very grateful, even more than now.
Either way, thanks again for this marvelous script, it's incredible useful.
__________________
Living la vida loca
Last edited by Pasajeromoronmoreno; 12-16-2015 at 03:56 AM.
|
|
|
12-13-2018, 10:46 AM
|
#30
|
Human being with feelings
Join Date: Jan 2012
Posts: 1,180
|
Raising this from a few years ago
Is there any way for a script to know if the mouse is over a midi item or an audio item?
I have double click on an item set to sws rename takes and source file. If its a midi item I'd like to open the midi editor. Is this possible?
Cheers
|
|
|
12-13-2018, 01:33 PM
|
#31
|
Human being with feelings
Join Date: Apr 2016
Location: ASU`ogacihC
Posts: 3,913
|
Quote:
Originally Posted by Triode
I have double click on an item set to sws rename takes and source file. If its a midi item I'd like to open the midi editor. Is this possible?
|
Calling this script from the doubleclick item modifier seems to work OK, try it.
Code:
if reaper.GetCursorContext() == 1 then -- 1=item
item = reaper.GetSelectedMediaItem(0, 0)
take = reaper.GetActiveTake(item)
if reaper.TakeIsMIDI(take) then -- Item: Open in built-in MIDI editor
reaper.Main_OnCommand(40153,0)
else -- Xenakios/SWS: Rename takes and source files
reaper.Main_OnCommand(reaper.NamedCommandLookup('_XENAKIOS_RENMTAKEANDSOURCE'), 0)
end
end
GetCursorContext() shouldn't be needed if called from mediaitem doubleclick modifier.
Last edited by Edgemeal; 12-13-2018 at 01:47 PM.
|
|
|
12-13-2018, 02:06 PM
|
#32
|
Human being with feelings
Join Date: Jan 2012
Posts: 1,180
|
Hi Edgemeal
That was quick many thanks. I'll give that a try
In parallel, I googled down some code snippets and put together this and it works also:
Code:
local item = reaper.GetSelectedMediaItem(0,0)
if item == nil then return end
i_pos = reaper.GetMediaItemInfo_Value( item, 'D_POSITION' )
i_len = reaper.GetMediaItemInfo_Value( item, 'D_LENGTH' )
take = reaper.GetActiveTake( item )
if reaper.TakeIsMIDI( take ) then
reaper.Main_OnCommand(reaper.NamedCommandLookup('40153'),0)
else
reaper.Main_OnCommand(reaper.NamedCommandLookup('_XENAKIOS_RENMTAKEANDSOURCE'),0)
end
I'll use yours as I've a non-coder's hunch my one has spurious stuff in.
I'm constantly amazed how reaper will bend to workflow so effectively
|
|
|
08-07-2019, 12:55 PM
|
#33
|
Human being with feelings
Join Date: Oct 2010
Location: Charleston, SC
Posts: 12,769
|
Any ideas why Mouse_position_dependant_actions.eel broke for me in the latest Reaper versions ?
I am running delete envelope points action id 40333 for one example. Below is my script. Thanks in advance. Bad Reaper for breaking things !
reaper5981+dev0724_x64-install.exe works
reaper5981+dev0801_x64-install.exe and later does not
// Call BR_GetMouseCursorContext API from SWS to get current details for stuff under mouse cursor
extension_api("BR_GetMouseCursorContext", #window, #segment, #details, 128);
// If mouse is over TCP track, execute this
!strcmp(#window, "tcp") && !strcmp(#segment, "track") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over empty tcp, execute this
: !strcmp(#window, "tcp") && !strcmp(#segment, "empty") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over ECP , execute this
: !strcmp(#window, "tcp") && !strcmp(#segment, "envelope") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over region lane , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "region_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over Marker lane , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "marker_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over Tempo lane , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "tempo_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over Timeline , execute this
: !strcmp(#window, "ruler") && !strcmp(#segment, "timeline") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over Transport , execute this
: !strcmp(#window, "Transport") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over MCP Track , execute this
: !strcmp(#window, "mcp") && !strcmp(#segment, "track") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over MCP Track , execute this
: !strcmp(#window, "mcp") && !strcmp(#segment, "empty") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over arrange empty, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "empty") ?
(
Main_OnCommand(40006, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over an item, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "item") ?
(
Main_OnCommand(40006, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over an item stretch marker, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "item_stretch_marker") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over an envelope point in the track lane, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "env_point") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over an envelope segment in the track lane, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "track") && !strcmp(#details, "env_segment") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over an empty envelope, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "envelope") && !strcmp(#details, "empty") ?
(
Main_OnCommand(40333, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over an envelope point, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "envelope") && !strcmp(#details, "env_point") ?
(
Main_OnCommand(40333, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over an envelope segment, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "envelope") && !strcmp(#details, "env_segment") ?
(
Main_OnCommand(40333, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over an empty arrange area, execute this
: !strcmp(#window, "arrange") && !strcmp(#segment, "empty") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over MIDI Editor Ruler, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "ruler") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over MIDI Editor Piano, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "piano") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over MIDI Editor Notes, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "notes") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over MIDI CC selector, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "cc_lane") && !strcmp(#details, "cc_selector") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
// If mouse is over MIDI CC lane, execute this
: !strcmp(#window, "midi_editor") && !strcmp(#segment, "cc_lane") && !strcmp(#details, "cc_lane") ?
(
Main_OnCommand(65535, 0);
Main_OnCommand(NamedCommandLookup("_S&M_MOUSE_L_CL ICK"), 0);
)
Last edited by Coachz; 08-15-2023 at 07:04 AM.
|
|
|
08-07-2019, 01:06 PM
|
#34
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
How is it broken? An error? Doing the wrong thing? Doing nothing?
|
|
|
08-07-2019, 01:35 PM
|
#35
|
Human being with feelings
Join Date: Oct 2010
Location: Charleston, SC
Posts: 12,769
|
Quote:
Originally Posted by Lokasenna
How is it broken? An error? Doing the wrong thing? Doing nothing?
|
It does nothing
|
|
|
08-07-2019, 02:22 PM
|
#36
|
Human being with feelings
Join Date: Apr 2013
Location: France
Posts: 9,875
|
The SWS Get Mouse functions is broken with last REAPER pre-release.
It is a pre-release issue, not related to this script. The script has nothing to change.
Justin commit an update to SWS for next reaper release.
|
|
|
08-07-2019, 03:10 PM
|
#37
|
Human being with feelings
Join Date: Oct 2010
Location: Charleston, SC
Posts: 12,769
|
Quote:
Originally Posted by X-Raym
The SWS Get Mouse functions is broken with last REAPER pre-release.
It is a pre-release issue, not related to this script. The script has nothing to change.
Justin commit an update to SWS for next reaper release.
|
Fantastic. Thanks so much for the great info !
|
|
|
12-20-2019, 11:14 PM
|
#38
|
Human being with feelings
Join Date: Sep 2016
Posts: 513
|
Hello i have a problem with thes vesrion its verry slow when cuting item have you a solution for that please ?
The first vesion dont have this problem but dont avec many context the first version here https://forum.cockos.com/showthread.php?t=165974
Last edited by grandfougue; 03-18-2021 at 07:57 AM.
|
|
|
11-25-2022, 06:30 PM
|
#39
|
Human being with feelings
Join Date: Jan 2016
Location: Los Angeles, CA
Posts: 3,116
|
Is this broken in Reaper > 5? Can't really find any updates.
|
|
|
11-29-2022, 09:33 AM
|
#40
|
Human being with feelings
Join Date: Jan 2016
Location: Los Angeles, CA
Posts: 3,116
|
Super curious about this but can't get any of it to work.
Set up my code to solve a Window Focus issue that's been driving me crazy. I have an action to Play From Mouse Cursor which is incredibly useful - both a "from nearest gridline" and "no snap" versions. Unfortunately I had to create different sets for Arrange and MIDI Editor, and the quirk is that it operates on the currently focused window independent of your mouse position. So if you were just working in MIDI Editor and mouse over Arrange and run the action, it's still operating on MIDI Editor.
I just want the MIDI Editor version to run when mouse is over MIDI Editor, and Arrange when cursor is over Arrange.
|
|
|
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 05:52 AM.
|