--[[ FixCTGroups v0.2b by Tim Mullin This mod simply lines up the CT_RaidAssist group frames nicely. You no longer need to try to align them perfectly manually. It also allows you to drag a group and drag the rest of the groups with it. Use /fixctroups, /fctg or /ctg to bring up the configuratioin frame. If you wish to be able to drag each group individually again, check the box next to Default CTRA Style. A checkbox is provided to hide or show all groups at once as a conveinance, it functions exactly the same as the Show All Groups checkbox on the CTRaid tab. Click the Groups button to bring up the Group Positioning frame. Here you can drag and drop groups to set up their relative positions. All vertically and horizontally adjacent groups (not diagonal) will be linked together. The groups can be dragged in a similar manner to how one drags raid members into different groups. You can create smaller groupings of groups that can be seperately moved by leaving space between the groups. For example, ........ ........ ........ .12..56. .34..78. ........ ........ ........ The Group Positioning frame serves only to define the relationships between groups. It does not determine the position of the groups onscreen. If you have an arrangement, it does not matter how many blank spaces surround it, ........ .1234... .5678... ........ ........ ........ ........ appears the same onscreen as ........ ........ ........ ..1234.. ..5678.. ........ ........ ........ Likewise, if you have several smaller groupings of groups, it does not matter how many blank spaces are between them, the onscreen position will be the same and controlled by where you drag that group to. Note that only rectangular arrangements of groups work at this time. Some arrangements may produce unexpected results. If anything gets really screwed up, just click the Defaults button. Example arrangements that should work: 1234 5678 12 56 34 78 15 26 37 48 Example arrangements that might not work (where . means an empty slot) 123 ..5 4.. 678 12 34 5. .6 7. .8 ]] FIXCTGROUPSVERSION = "0.2b"; local FixCTGroupsVariablesLoaded = false; local FixCTGroupsDefaultConfig = { ctradefault = 0, linkall = 1, dx = -3, dy = -20, groups = { [ 1] = 0, [ 2] = 0, [ 3] = 0, [ 4] = 0, [ 5] = 0, [ 6] = 0, [ 7] = 0, [ 8] = 0, [ 9] = 0, [10] = 0, [11] = 0, [12] = 0, [13] = 0, [14] = 0, [15] = 0, [16] = 0, [17] = 0, [18] = 0, [19] = 0, [20] = 0, [21] = 0, [22] = 0, [23] = 0, [24] = 0, [25] = 0, [26] = 0, [27] = 1, [28] = 2, [29] = 3, [30] = 4, [31] = 0, [32] = 0, [33] = 0, [34] = 0, [35] = 5, [36] = 6, [37] = 7, [38] = 8, [39] = 0, [40] = 0, [41] = 0, [42] = 0, [43] = 0, [44] = 0, [45] = 0, [46] = 0, [47] = 0, [48] = 0, [49] = 0, [50] = 0, [51] = 0, [52] = 0, [53] = 0, [54] = 0, [55] = 0, [56] = 0, [57] = 0, [58] = 0, [59] = 0, [60] = 0, [61] = 0, [62] = 0, [63] = 0, [64] = 0 } }; function FixCTGroupsInit() local k, v; -- set up config if not FixCTGroupsConfig then FixCTGroupsConfig = { }; end for k, v in pairs(FixCTGroupsDefaultConfig) do if k ~= "groups" and not FixCTGroupsConfig[k] then FixCTGroupsConfig[k] = v; end end if not FixCTGroupsConfig.groups then FixCTGroupsConfig.groups = { }; for k, v in pairs(FixCTGroupsDefaultConfig.groups) do FixCTGroupsConfig.groups[k] = v; end end -- set up slash command SlashCmdList["FIXCTGROUPS"] = function(msg) DEFAULT_CHAT_FRAME:AddMessage("FixCTGroups v"..FIXCTGROUPSVERSION, 1, 1, 1); FixCTGroupsConfigFrame:Show(); end SLASH_FIXCTGROUPS1 = "/fixctgroups"; SLASH_FIXCTGROUPS2 = "/fctg"; SLASH_FIXCTGROUPS3 = "/ctg"; FixCTGroupsConfigChanged(); FixCTGroupsVariablesLoaded = true; end function FixCTGroupsClearPoints() local f; for i = 2, 8 do f = getglobal("CT_RAGroup"..i); f:ClearAllPoints(); end end function FixCTGroupsArrangeGroups() local i, group, left, up, right, down; local c = FixCTGroupsConfig; local g = c.groups; local p = "FixCTGroups"; -- reset then fix it FixCTGroupsCTRADefault(); for i = 1, 64 do if g[i] ~= 0 then --ezheal_msg("i: "..i.."; group: "..g[i]); group = getglobal("CT_RAGroup"..g[i]); -- is there a group to the left of this one? if (i > 1) and (math.mod(i - 1, 8) ~= 0) and (g[i - 1] ~= 0) then left = getglobal("CT_RAGroup"..g[i - 1]); else left = nil; end -- is there a group above this one? if (i > 8) and (g[i - 8] ~= 0) then up = getglobal("CT_RAGroup"..g[i - 8]); else up = nil; end --[[ if i < 64 and math.mod(i, 8) ~= 0 and g[i + 1] ~= 0 then right = getglobal("CT_RAGroup"..g[i + 1]); else right = nil; end if i < 57 and g[i + 8] ~= 0 then down = getglobal("CT_RAGroup"..g[i + 8]); else down = nil; end ]] if left or up --[[or right or down]] then group:ClearAllPoints(); if left then --ezheal_msg(group:GetName().."'s left is "..left:GetName()); group:SetPoint("TOPLEFT", left, "TOPRIGHT", c.dx, 0); end if up then --ezheal_msg(group:GetName().."'s up is "..up:GetName()); group:SetPoint("TOPRIGHT", up, "BOTTOMRIGHT", 0, 0-c.dy); end --[[ if right then group:SetPoint("BOTTOMRIGHT", right, "BOTTOMLEFT", c.dx, 0); end if down then group:SetPoint("BOTTOMLEFT", down, "TOPLEFT", 0, 0-c.dy); end]] end end end end function FixCTGroupsXLink(f, g) f:ClearAllPoints(); f:SetPoint("TOPLEFT", g, "TOPRIGHT", FixCTGroupsConfig.dx, 0); end function FixCTGroupsYLink(f, g) f:ClearAllPoints(); f:SetPoint("TOPLEFT", g, "BOTTOMLEFT", 0, 0-FixCTGroupsConfig.dy); end function FixCTGroupsConfigFrameOnShow() local f = FixCTGroupsConfigFrame; local c = FixCTGroupsConfig; if not FixCTGroupsVariablesLoaded then f:Hide(); return; end getglobal(f:GetName().."SpacingX"):SetValue(c.dx); getglobal(f:GetName().."SpacingY"):SetValue(c.dy); getglobal(f:GetName().."CTRADefault"):SetChecked(c.ctradefault); --getglobal(f:GetName().."LinkAllGroups"):SetChecked(c.linkall); getglobal(f:GetName().."ShowGroups"):SetChecked(CT_RACheckAllGroups:GetChecked()); end function FixCTGroupsSetDefaultConfig() local k, v; if not FixCTGroupsVariablesLoaded then return; end for k, v in pairs(FixCTGroupsDefaultConfig) do if k ~= "groups" then FixCTGroupsConfig[k] = v; end end FixCTGroupsConfig.groups = nil; FixCTGroupsConfig.groups = { }; local i; for k, v in pairs(FixCTGroupsDefaultConfig.groups) do FixCTGroupsConfig.groups[k] = v; end FixCTGroupsConfigChanged(); end function FixCTGroupsConfigFrameOptionOnClick() local c = FixCTGroupsConfig; if not FixCTGroupsVariablesLoaded then this:GetParent():Hide(); return; end local name = this:GetName(); local parent = this:GetParent():GetName(); if name == parent.."SpacingX" then c.dx = this:GetValue(); elseif name == parent.."SpacingY" then c.dy = this:GetValue(); elseif name == parent.."CTRADefault" then c.ctradefault = this:GetChecked(); elseif name == parent.."LinkAllGroups" then c.linkall = this:GetChecked(); elseif name == parent.."ShowGroups" then CT_RACheckAllGroups:SetChecked(getglobal(parent.."ShowGroups"):GetChecked()); CT_RA_CheckAllGroups(); end FixCTGroupsConfigChanged(); end function FixCTGroupsConfigChanged() local fn = nil; local c = FixCTGroupsConfig; FixCTGroupsConfigFrameOnShow(); if c.ctradefault == 1 then FixCTGroupsCTRADefault(); else FixCTGroupsArrangeGroups(); end end -- mimic what happens when ctraid loads to make each -- group draggable function FixCTGroupsCTRADefault() local f, g; for i = 1, 8 do f = getglobal("CT_RAGroup"..i); g = getglobal("CT_RAGroupDrag"..i); CT_RA_LinkDrag(f, g, "TOP", "TOP", 0, 10); end end ------------------------- -- functions for the group cells frame ------------------------- local FIXCTGROUPS_MOVING_GROUP = nil; local FIXCTGROUPS_TARGET_SLOT = nil; function FixCTGroupsCellsFrameOnShow() local i, slot, button; local p = "FixCTGroupsCellsFrameCell"; for i = 1, 64 do slot = getglobal(p.."Slot"..i); slot.button = nil; if FixCTGroupsConfig.groups[i] and FixCTGroupsConfig.groups[i] ~= 0 then button = getglobal(p..FixCTGroupsConfig.groups[i]); button.slot = slot; slot.button = button; button:ClearAllPoints(); button:SetPoint("TOPLEFT", slot, "TOPLEFT", 0, 0); end end end function FixCTGroupsCellsFrameOnHide() local i, f; for i = 1, 64 do f = getglobal("FixCTGroupsCellsFrameCellSlot"..i); if f.button then FixCTGroupsConfig.groups[i] = tonumber(getglobal(f.button:GetName().."Label"):GetText()); else FixCTGroupsConfig.groups[i] = 0; end end FixCTGroupsConfigChanged(); end function FixCTGroupsCellOnDragStart() local cursorX, cursorY = GetCursorPosition(); this:SetBackdropColor(this.hover.r, this.hover.g, this.hover.b); this:SetFrameLevel(this:GetFrameLevel() + 10); this:ClearAllPoints(); this:SetPoint("CENTER", nil, "BOTTOMLEFT", cursorX*GetScreenWidthScale(), cursorY*GetScreenHeightScale()); this:StartMoving(); FIXCTGROUPS_MOVING_GROUP = this; end function FixCTGroupsCellOnDragStop(raidButton) if ( not raidButton ) then raidButton = this; end raidButton:StopMovingOrSizing(); raidButton:SetBackdropColor(raidButton.bg.r, raidButton.bg.g, raidButton.bg.b); raidButton:SetFrameLevel(raidButton:GetFrameLevel() - 10); FIXCTGROUPS_MOVING_GROUP = nil; if ( FIXCTGROUPS_TARGET_SLOT and FIXCTGROUPS_TARGET_SLOT:GetID() ~= raidButton.slot:GetID() ) then if (FIXCTGROUPS_TARGET_SLOT.button) then --ezheal_msg("currently a button there"); local oldButton = FIXCTGROUPS_TARGET_SLOT.button; local newSlot = FIXCTGROUPS_TARGET_SLOT; local oldSlot = raidButton.slot; oldButton:SetPoint("TOPLEFT", raidButton.slot, "TOPLEFT", 0, 0); oldButton:SetBackdropColor(oldButton.bg.r, oldButton.bg.g, oldButton.bg.b); oldButton.slot = oldSlot; oldSlot.button = oldButton; raidButton:SetPoint("TOPLEFT", newSlot, "TOPLEFT", 0, 0); raidButton.slot = newSlot; newSlot.button = raidButton; else --ezheal_msg("no button there"); local newSlot = FIXCTGROUPS_TARGET_SLOT; local oldSlot = raidButton.slot; newSlot:UnlockHighlight(); raidButton:SetPoint("TOPLEFT", newSlot, "TOPLEFT", 0, 0); oldSlot.button = nil; newSlot.button = raidButton; raidButton.slot = newSlot; end else if ( FIXCTGROUPS_TARGET_SLOT ) then -- dragged to same slot it was already on --ezheal_msg("same slot as before"); local slot = FIXCTGROUPS_TARGET_SLOT; slot:SetBackdropColor(slot.bg.r, slot.bg.g, slot.bg.b); slot:UnlockHighlight(); end raidButton:SetPoint("TOPLEFT", raidButton.slot, "TOPLEFT", 0, 0); end end function FixCTGroupsCellsFrameOnUpdate(elapsed) if ( FIXCTGROUPS_MOVING_GROUP ) then local button, slot; FIXCTGROUPS_TARGET_SLOT = nil; for i = 1, 64 do slot = getglobal("FixCTGroupsCellsFrameCellSlot"..i); button = slot.button; if ( MouseIsOver(slot) ) then FIXCTGROUPS_TARGET_SLOT = slot; slot:SetBackdropColor(slot.hover.r, slot.hover.g, slot.hover.b); slot:LockHighlight(); if button and button ~= FIXCTGROUPS_MOVING_GROUP then button:SetBackdropColor(slot.hover.r, slot.hover.g, slot.hover.b); end else slot:SetBackdropColor(slot.bg.r, slot.bg.g, slot.bg.b); slot:UnlockHighlight(); if button and button ~= FIXCTGROUPS_MOVING_GROUP then button:SetBackdropColor(button.bg.r, button.bg.g, button.bg.b); end end end end end