vanilla-wow-addons – Rev 1
?pathlinks?
--[[
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