You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
333 lines
9.2 KiB
333 lines
9.2 KiB
|
2 years ago
|
local _;
|
||
|
|
VUHDO_IS_PANEL_CONFIG = false;
|
||
|
|
VUHDO_CONFIG_SHOW_RAID = false;
|
||
|
|
|
||
|
|
local sMaxDragDistance = 60;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
function VUHDO_positionAllGroupConfigPanels(aPanelNum)
|
||
|
|
local tIsShowOrder;
|
||
|
|
local tModel;
|
||
|
|
local tXPos, tYPos;
|
||
|
|
local tOrderPanel, tSelectPanel;
|
||
|
|
|
||
|
|
for _, tButton in pairs(VUHDO_getPanelButtons(aPanelNum)) do
|
||
|
|
tButton:Hide();
|
||
|
|
end
|
||
|
|
|
||
|
|
local tModelArray = VUHDO_PANEL_MODELS[aPanelNum];
|
||
|
|
|
||
|
|
if not tModelArray then return; end
|
||
|
|
|
||
|
|
local tParentPanel = VUHDO_getActionPanel(aPanelNum);
|
||
|
|
local tAnzModels = #tModelArray;
|
||
|
|
local tScale = VUHDO_PANEL_SETUP[aPanelNum]["SCALING"]["barWidth"] / VUHDO_getOrCreateGroupOrderPanel(aPanelNum, 1):GetWidth();
|
||
|
|
|
||
|
|
for tCnt = 1, tAnzModels do
|
||
|
|
tOrderPanel = VUHDO_getOrCreateGroupOrderPanel(aPanelNum, tCnt);
|
||
|
|
tOrderPanel:SetScale(tScale);
|
||
|
|
tXPos, tYPos = VUHDO_getHealButtonPos(tCnt, 1, aPanelNum);
|
||
|
|
|
||
|
|
tModel = VUHDO_PANEL_MODELS[aPanelNum][tCnt];
|
||
|
|
tIsShowOrder = true;
|
||
|
|
|
||
|
|
tOrderPanel:ClearAllPoints(); -- parent k�nnte gewechselt haben
|
||
|
|
tOrderPanel:SetPoint("TOPLEFT", tParentPanel:GetName(), "TOPLEFT", tXPos / tScale, -tYPos / tScale);
|
||
|
|
tOrderPanel:SetShown(tIsShowOrder);
|
||
|
|
|
||
|
|
tSelectPanel = VUHDO_getOrCreateGroupSelectPanel(aPanelNum, tCnt);
|
||
|
|
tSelectPanel:SetScale(tScale);
|
||
|
|
tSelectPanel:ClearAllPoints();
|
||
|
|
tSelectPanel:SetPoint("TOPLEFT", tParentPanel:GetName(), "TOPLEFT", tXPos / tScale, -tYPos / tScale);
|
||
|
|
tSelectPanel:SetShown(not tIsShowOrder);
|
||
|
|
|
||
|
|
VUHDO_getConfigOrderBarLeft(aPanelNum, tCnt):Hide();
|
||
|
|
VUHDO_getConfigOrderBarRight(aPanelNum, tCnt):Hide();
|
||
|
|
end
|
||
|
|
|
||
|
|
local tCnt = tAnzModels + 1;
|
||
|
|
while true do -- VUHDO_MAX_GROUPS_PER_PANEL
|
||
|
|
tOrderPanel = VUHDO_getGroupOrderPanel(aPanelNum, tCnt);
|
||
|
|
|
||
|
|
if tOrderPanel then tOrderPanel:Hide();
|
||
|
|
else break; end
|
||
|
|
|
||
|
|
tSelectPanel = VUHDO_getGroupSelectPanel(aPanelNum, tCnt);
|
||
|
|
if tSelectPanel then tSelectPanel:Hide(); end
|
||
|
|
|
||
|
|
tCnt = tCnt + 1;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tDeltaX, tDeltaY;
|
||
|
|
local function VUHDO_determineDistance(aXPos, aYPos, anotherXPos, anotherYPos)
|
||
|
|
tDeltaX = aXPos - anotherXPos;
|
||
|
|
tDeltaY = aYPos - anotherYPos;
|
||
|
|
return sqrt(tDeltaX * tDeltaX + tDeltaY * tDeltaY);
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tDragSweetY;
|
||
|
|
local tTargetSweetY;
|
||
|
|
local function VUHDO_GetDragTargetSweetY(aDraggedPanel, aDragTargetPanel)
|
||
|
|
tDragSweetY = aDraggedPanel:GetTop() * aDraggedPanel:GetScale() - (aDraggedPanel:GetHeight() * aDraggedPanel:GetScale() * 0.5);
|
||
|
|
|
||
|
|
if tDragSweetY > aDragTargetPanel:GetTop() * aDragTargetPanel:GetScale() then
|
||
|
|
tTargetSweetY = aDragTargetPanel:GetTop() * aDragTargetPanel:GetScale();
|
||
|
|
|
||
|
|
elseif tDragSweetY < aDragTargetPanel:GetBottom() * aDragTargetPanel:GetScale() then
|
||
|
|
tTargetSweetY = aDragTargetPanel:GetBottom() * aDragTargetPanel:GetScale();
|
||
|
|
|
||
|
|
else
|
||
|
|
tTargetSweetY = tDragSweetY;
|
||
|
|
end
|
||
|
|
|
||
|
|
return tTargetSweetY;
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tDragSweetX, tDragSweetY;
|
||
|
|
local tTargetSweetX, tTargetSweetY;
|
||
|
|
local function VUHDO_determineDragDistance(aDraggedPanel, aDragTargetPanel, anIsLeftOf)
|
||
|
|
|
||
|
|
tDragSweetX = aDraggedPanel:GetLeft() * aDraggedPanel:GetScale() + (aDraggedPanel:GetWidth() * aDraggedPanel:GetScale() * 0.5);
|
||
|
|
tDragSweetY = aDraggedPanel:GetTop() * aDraggedPanel:GetScale() - (aDraggedPanel:GetHeight() * aDraggedPanel:GetScale() * 0.5);
|
||
|
|
|
||
|
|
tTargetSweetX = anIsLeftOf
|
||
|
|
and aDragTargetPanel:GetLeft() * aDragTargetPanel:GetScale()
|
||
|
|
or aDragTargetPanel:GetRight() * aDragTargetPanel:GetScale();
|
||
|
|
|
||
|
|
tTargetSweetY = VUHDO_GetDragTargetSweetY(aDraggedPanel, aDragTargetPanel);
|
||
|
|
return VUHDO_determineDistance(tDragSweetX, tDragSweetY, tTargetSweetX, tTargetSweetY);
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tLeftBarOrderNum;
|
||
|
|
local tRightBarOrderNum;
|
||
|
|
local tBarLeft, tBarRight;
|
||
|
|
local function VUHDO_refreshDragTargetBars(aPanelNum, anOrderPanelNum, anIsLeft, aDraggedPanel)
|
||
|
|
tLeftBarOrderNum = nil;
|
||
|
|
tRightBarOrderNum = nil;
|
||
|
|
|
||
|
|
if anOrderPanelNum then
|
||
|
|
if anIsLeft then
|
||
|
|
tLeftBarOrderNum = anOrderPanelNum;
|
||
|
|
|
||
|
|
if anOrderPanelNum > 1 then
|
||
|
|
tRightBarOrderNum = anOrderPanelNum - 1;
|
||
|
|
end
|
||
|
|
else
|
||
|
|
tRightBarOrderNum = anOrderPanelNum;
|
||
|
|
|
||
|
|
if VUHDO_PANEL_MODELS[aPanelNum]
|
||
|
|
and anOrderPanelNum < #VUHDO_PANEL_MODELS[aPanelNum] then
|
||
|
|
tLeftBarOrderNum = anOrderPanelNum + 1;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
for tPanelNum = 1, VUHDO_MAX_PANELS do
|
||
|
|
for tOrderNum = 1, 15 do -- VUHDO_MAX_GROUPS_PER_PANEL
|
||
|
|
tBarLeft = VUHDO_getConfigOrderBarLeft(tPanelNum, tOrderNum);
|
||
|
|
tBarRight = VUHDO_getConfigOrderBarRight(tPanelNum, tOrderNum);
|
||
|
|
|
||
|
|
if aPanelNum == tPanelNum then
|
||
|
|
if tLeftBarOrderNum
|
||
|
|
and tLeftBarOrderNum == tOrderNum
|
||
|
|
and tBarLeft:GetParent() ~= aDraggedPanel then
|
||
|
|
tBarLeft:Show();
|
||
|
|
else
|
||
|
|
tBarLeft:Hide();
|
||
|
|
end
|
||
|
|
|
||
|
|
if tRightBarOrderNum
|
||
|
|
and tRightBarOrderNum == tOrderNum
|
||
|
|
and tBarLeft:GetParent() ~= aDraggedPanel then
|
||
|
|
tBarRight:Show();
|
||
|
|
else
|
||
|
|
tBarRight:Hide();
|
||
|
|
end
|
||
|
|
else
|
||
|
|
tBarLeft:Hide();
|
||
|
|
tBarRight:Hide();
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tOrderPanel;
|
||
|
|
local tCurrentDistance, tLowestDistance;
|
||
|
|
local tLowPanelNum, tLowOrderNum;
|
||
|
|
local tIsLeft;
|
||
|
|
local tMaxOrderPanels;
|
||
|
|
local tPanel;
|
||
|
|
local tPanelX;
|
||
|
|
local tPanelY;
|
||
|
|
local tDragX;
|
||
|
|
local tDragY;
|
||
|
|
function VUHDO_determineDragTarget(aDraggedPanel)
|
||
|
|
|
||
|
|
tLowestDistance = math.huge;
|
||
|
|
for tPanelNum, tPanel in pairs(VUHDO_getAllActionPanels()) do
|
||
|
|
if tPanel:IsVisible() then
|
||
|
|
tMaxOrderPanels = #VUHDO_PANEL_MODELS[tPanelNum];
|
||
|
|
for tConfigNum = 1, tMaxOrderPanels do
|
||
|
|
tOrderPanel = VUHDO_getGroupOrderPanel(tPanelNum, tConfigNum);
|
||
|
|
|
||
|
|
if tOrderPanel ~= aDraggedPanel then
|
||
|
|
|
||
|
|
tCurrentDistance = VUHDO_determineDragDistance(aDraggedPanel, tOrderPanel, true);
|
||
|
|
if tCurrentDistance < tLowestDistance then
|
||
|
|
tLowestDistance = tCurrentDistance;
|
||
|
|
tLowPanelNum = tPanelNum;
|
||
|
|
tLowOrderNum = tConfigNum;
|
||
|
|
tIsLeft = true;
|
||
|
|
end
|
||
|
|
|
||
|
|
tCurrentDistance = VUHDO_determineDragDistance(aDraggedPanel, tOrderPanel, false);
|
||
|
|
if tCurrentDistance < tLowestDistance then
|
||
|
|
tLowestDistance = tCurrentDistance;
|
||
|
|
tLowPanelNum = tPanelNum;
|
||
|
|
tLowOrderNum = tConfigNum;
|
||
|
|
tIsLeft = false;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
-- Test for dragging into an empty Panel
|
||
|
|
if tMaxOrderPanels == 0 then
|
||
|
|
|
||
|
|
tPanelX = tPanel:GetLeft() + (tPanel:GetWidth() * 0.5);
|
||
|
|
tPanelY = tPanel:GetTop() - (tPanel:GetHeight() * 0.5);
|
||
|
|
tDragX = aDraggedPanel:GetLeft() * aDraggedPanel:GetScale() + (aDraggedPanel:GetWidth() * aDraggedPanel:GetScale() * 0.5);
|
||
|
|
tDragY = aDraggedPanel:GetTop() * aDraggedPanel:GetScale() - (aDraggedPanel:GetHeight() * aDraggedPanel:GetScale() * 0.5);
|
||
|
|
tCurrentDistance = VUHDO_determineDistance(tPanelX, tPanelY, tDragX, tDragY);
|
||
|
|
|
||
|
|
if tCurrentDistance < tLowestDistance then
|
||
|
|
tLowestDistance = tCurrentDistance;
|
||
|
|
tLowPanelNum = tPanelNum;
|
||
|
|
tLowOrderNum = 1;
|
||
|
|
tIsLeft = true;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if (tLowestDistance > sMaxDragDistance) then
|
||
|
|
return nil, nil, nil;
|
||
|
|
else
|
||
|
|
return tLowPanelNum, tLowOrderNum, tIsLeft;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tPanelNum, tOrderNum, tIsLeft;
|
||
|
|
function VUHDO_refreshDragTarget(aDraggedPanel)
|
||
|
|
tPanelNum, tOrderNum, tIsLeft = VUHDO_determineDragTarget(aDraggedPanel);
|
||
|
|
VUHDO_refreshDragTargetBars(tPanelNum, tOrderNum, tIsLeft, aDraggedPanel);
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tNumbers;
|
||
|
|
function VUHDO_getComponentPanelNumModelNum(aComponent)
|
||
|
|
tNumbers = VUHDO_getNumbersFromString(aComponent:GetName(), 2);
|
||
|
|
return tNumbers[1], tNumbers[2];
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tPanelNum, tOrderNum, tIsLeft;
|
||
|
|
local tSourcePanelNum, tSourceGroupOrderNum;
|
||
|
|
local tModelId;
|
||
|
|
function VUHDO_reorderGroupsAfterDragged(aDraggedPanel)
|
||
|
|
tPanelNum, tOrderNum, tIsLeft = VUHDO_determineDragTarget(aDraggedPanel);
|
||
|
|
|
||
|
|
if tOrderNum then
|
||
|
|
tSourcePanelNum, tSourceGroupOrderNum = VUHDO_getComponentPanelNumModelNum(aDraggedPanel);
|
||
|
|
tModelId = VUHDO_PANEL_MODELS[tSourcePanelNum][tSourceGroupOrderNum];
|
||
|
|
VUHDO_removeFromModel(tSourcePanelNum, tSourceGroupOrderNum);
|
||
|
|
|
||
|
|
if tSourcePanelNum == tPanelNum and tSourceGroupOrderNum < tOrderNum and tOrderNum > 1 then
|
||
|
|
tOrderNum = tOrderNum - 1;
|
||
|
|
end
|
||
|
|
|
||
|
|
VUHDO_insertIntoModel(tPanelNum, tOrderNum, tIsLeft, tModelId);
|
||
|
|
end
|
||
|
|
|
||
|
|
VUHDO_redrawAllPanels(false);
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tTypeMembers;
|
||
|
|
local tModels;
|
||
|
|
local tIsUsed;
|
||
|
|
local function VUHDO_guessModelIdForType(aPanelNum, aType)
|
||
|
|
tTypeMembers = VUHDO_ID_TYPE_MEMBERS[aType];
|
||
|
|
tModels = VUHDO_PANEL_MODELS[aPanelNum];
|
||
|
|
|
||
|
|
for _, tCheckId in ipairs(tTypeMembers) do
|
||
|
|
tIsUsed = false;
|
||
|
|
for _, tModelId in pairs(tModels) do
|
||
|
|
if tCheckId == tModelId then tIsUsed = true; break; end
|
||
|
|
end
|
||
|
|
|
||
|
|
if not tIsUsed then return tCheckId; end
|
||
|
|
end
|
||
|
|
|
||
|
|
return nil;
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
function VUHDO_getGuessedModel(aPanelNum)
|
||
|
|
|
||
|
|
local tTypeCount = {
|
||
|
|
[VUHDO_ID_TYPE_CLASS] = 0,
|
||
|
|
[VUHDO_ID_TYPE_GROUP] = 0,
|
||
|
|
[VUHDO_ID_TYPE_SPECIAL] = 0,
|
||
|
|
};
|
||
|
|
|
||
|
|
for tIndex, tModelId in ipairs(VUHDO_PANEL_MODELS[aPanelNum]) do
|
||
|
|
tModelType = VUHDO_getModelType(tModelId);
|
||
|
|
tTypeCount[tModelType] = tTypeCount[tModelType] + 1;
|
||
|
|
end
|
||
|
|
|
||
|
|
local tMaxType = nil;
|
||
|
|
local tMaxValue = 0;
|
||
|
|
for tType, tValue in pairs(tTypeCount) do
|
||
|
|
if tValue > tMaxValue then
|
||
|
|
tMaxType = tType;
|
||
|
|
tMaxValue = tValue;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if tMaxType then
|
||
|
|
local tGuessedModel = VUHDO_guessModelIdForType(aPanelNum, tMaxType);
|
||
|
|
if tGuessedModel then return tGuessedModel; end
|
||
|
|
end
|
||
|
|
|
||
|
|
return VUHDO_ID_GROUP_1;
|
||
|
|
end
|