From ede51b48c51c0264eb4b0ba0467df8a90e524289 Mon Sep 17 00:00:00 2001 From: Grayson Solis <109297237+grayson-solis@users.noreply.github.com> Date: Fri, 4 Jul 2025 00:04:45 -0400 Subject: [PATCH 1/3] Release Toggle Group v1.0 --- .../graysonsolis_Toggle Group.lua | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 Items Properties/graysonsolis_Toggle Group.lua diff --git a/Items Properties/graysonsolis_Toggle Group.lua b/Items Properties/graysonsolis_Toggle Group.lua new file mode 100644 index 000000000..51dcbd630 --- /dev/null +++ b/Items Properties/graysonsolis_Toggle Group.lua @@ -0,0 +1,53 @@ +-- @description Toggle Group +-- @author Grayson Solis +-- @version 1.0 +-- @screenshot Example: https://imgur.com/flmEK6P +-- @about +-- TOGGLE GROUPING BEHAVIOR: +-- +-- If you select: +-- - All ungrouped items -> it groups them together. +-- - All grouped items (same group or not) -> it ungroups them. +-- - A mix of grouped and ungrouped items -> it adds the ungrouped ones to the existing group. + +reaper.Undo_BeginBlock() + +local sel_count = reaper.CountSelectedMediaItems(0) +if sel_count == 0 then return end + +local group_id = nil +local has_grouped = false +local has_ungrouped = false + +for i = 0, sel_count - 1 do + local item = reaper.GetSelectedMediaItem(0, i) + local id = reaper.GetMediaItemInfo_Value(item, "I_GROUPID") + + if id > 0 then + has_grouped = true + group_id = group_id or id + else + has_ungrouped = true + end +end + +if has_grouped and has_ungrouped then + for i = 0, sel_count - 1 do + reaper.SetMediaItemInfo_Value(reaper.GetSelectedMediaItem(0, i), "I_GROUPID", group_id) + end + +elseif has_grouped and not has_ungrouped then + for i = 0, sel_count - 1 do + reaper.SetMediaItemInfo_Value(reaper.GetSelectedMediaItem(0, i), "I_GROUPID", 0) + end + +else + local new_id = reaper.GetProjectStateChangeCount(0) + 1 + for i = 0, sel_count - 1 do + reaper.SetMediaItemInfo_Value(reaper.GetSelectedMediaItem(0, i), "I_GROUPID", new_id) + end +end + +reaper.UpdateArrange() +reaper.Undo_EndBlock("Toggle Grouping", -1) + From 07795ac01a02c42558d22ac5f584b379c325219f Mon Sep 17 00:00:00 2001 From: Grayson Solis <109297237+grayson-solis@users.noreply.github.com> Date: Fri, 4 Jul 2025 14:19:12 -0400 Subject: [PATCH 2/3] Update graysonsolis_Toggle Group.lua --- .../graysonsolis_Toggle Group.lua | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/Items Properties/graysonsolis_Toggle Group.lua b/Items Properties/graysonsolis_Toggle Group.lua index 51dcbd630..bb682b26b 100644 --- a/Items Properties/graysonsolis_Toggle Group.lua +++ b/Items Properties/graysonsolis_Toggle Group.lua @@ -6,23 +6,35 @@ -- TOGGLE GROUPING BEHAVIOR: -- -- If you select: +-- - One grouped item -> Ungroups it +-- - One ungrouped item -> Does nothing -- - All ungrouped items -> it groups them together. -- - All grouped items (same group or not) -> it ungroups them. -- - A mix of grouped and ungrouped items -> it adds the ungrouped ones to the existing group. -reaper.Undo_BeginBlock() +function GetNextGroupID() + local max_id = 0 + local item_count = reaper.CountMediaItems(0) + for i = 0, item_count - 1 do + local item = reaper.GetMediaItem(0, i) + local group_id = reaper.GetMediaItemInfo_Value(item, "I_GROUPID") + if group_id > max_id then + max_id = group_id + end + end + return max_id + 1 +end +reaper.Undo_BeginBlock() local sel_count = reaper.CountSelectedMediaItems(0) -if sel_count == 0 then return end - +if sel_count == 0 then return end +if sel_count == 1 and reaper.GetMediaItemInfo_Value(reaper.GetSelectedMediaItem(0, 0), "I_GROUPID") == 0 then return end local group_id = nil local has_grouped = false local has_ungrouped = false - for i = 0, sel_count - 1 do local item = reaper.GetSelectedMediaItem(0, i) local id = reaper.GetMediaItemInfo_Value(item, "I_GROUPID") - if id > 0 then has_grouped = true group_id = group_id or id @@ -30,24 +42,19 @@ for i = 0, sel_count - 1 do has_ungrouped = true end end - if has_grouped and has_ungrouped then for i = 0, sel_count - 1 do reaper.SetMediaItemInfo_Value(reaper.GetSelectedMediaItem(0, i), "I_GROUPID", group_id) end - elseif has_grouped and not has_ungrouped then for i = 0, sel_count - 1 do reaper.SetMediaItemInfo_Value(reaper.GetSelectedMediaItem(0, i), "I_GROUPID", 0) end - else - local new_id = reaper.GetProjectStateChangeCount(0) + 1 + local new_id = GetNextGroupID() for i = 0, sel_count - 1 do reaper.SetMediaItemInfo_Value(reaper.GetSelectedMediaItem(0, i), "I_GROUPID", new_id) end end - reaper.UpdateArrange() reaper.Undo_EndBlock("Toggle Grouping", -1) - From 209bc9525a12a02dd0734435e50385f99650a2b4 Mon Sep 17 00:00:00 2001 From: Christian Fillion Date: Tue, 8 Jul 2025 01:52:27 -0400 Subject: [PATCH 3/3] rename to sentence case & matching undo point name --- ...olis_Toggle Group.lua => graysonsolis_Toggle grouping.lua} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename Items Properties/{graysonsolis_Toggle Group.lua => graysonsolis_Toggle grouping.lua} (96%) diff --git a/Items Properties/graysonsolis_Toggle Group.lua b/Items Properties/graysonsolis_Toggle grouping.lua similarity index 96% rename from Items Properties/graysonsolis_Toggle Group.lua rename to Items Properties/graysonsolis_Toggle grouping.lua index bb682b26b..a0ef27a76 100644 --- a/Items Properties/graysonsolis_Toggle Group.lua +++ b/Items Properties/graysonsolis_Toggle grouping.lua @@ -1,4 +1,4 @@ --- @description Toggle Group +-- @description Toggle grouping -- @author Grayson Solis -- @version 1.0 -- @screenshot Example: https://imgur.com/flmEK6P @@ -57,4 +57,4 @@ else end end reaper.UpdateArrange() -reaper.Undo_EndBlock("Toggle Grouping", -1) +reaper.Undo_EndBlock("Toggle grouping", -1)