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.

301 lines
11 KiB

local L = Narci.L;
local FadeFrame = NarciAPI_FadeFrame;
local pow = math.pow;
local cos = math.cos;
local pi = math.pi;
local function inOutSine(t, b, e, d)
return (b - e) / 2 * (cos(pi * t / d) - 1) + b
end
local function outQuart(t, b, e, d)
t = t / d - 1;
return (b - e) * (pow(t, 4) - 1) + b
end
local function CreateRoundGroupButton(parent, groupIndex, data, point, relativeTo, relativePoint, offsetX, offsetY, customSectorHeight)
--Create Buttons
local button;
local buttons = {};
local buttonDistanceY = 4;
local numButton = #data;
local maxWidth = 0;
for i = 1, numButton do
button = CreateFrame("Button", nil, parent, "NarciDarkRoundButtonTemplate");
button.index = i;
tinsert(buttons, button);
button:Initialize( groupIndex, unpack(data[i]) );
if i == 1 then
button:SetPoint("CENTER", parent, "CENTER", 0, 0);
button:UpdateVisual();
else
button:SetPoint("TOPLEFT", buttons[i - 1], "BOTTOMLEFT", 0, -buttonDistanceY);
if i == numButton then
maxWidth = button:UpdateGroupHitBox();
end
end
end
--Create Sector
local Sector = CreateFrame("Frame", nil, parent, "NarciDarkButtonSectorTemplate");
if not parent.sectors then
parent.sectors = {};
end
tinsert(parent.sectors, Sector);
local inset = 8;
local buttonHeight = button:GetHeight();
local sectorWidth = maxWidth + 2*inset;
local sectorHeight = customSectorHeight or (numButton * buttonHeight + (numButton - 1) * buttonDistanceY + 12 + 2*inset + 4);
Sector:SetPoint(point, relativeTo or parent, relativePoint, offsetX, offsetY);
Sector:SetSize(sectorWidth, sectorHeight);
Sector.Label:SetText(data.header);
local button1 = buttons[1];
button1:ClearAllPoints();
--button1:SetPoint("TOPLEFT", Sector.Header, "BOTTOMLEFT", inset, -inset); --Anchor to Header
button1:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", offsetX + inset, 68 -inset -12); --Anchor to Parent. Assign header animation -12 ~ minus Header Height
parent.lightOptions = buttons;
return sectorWidth, sectorHeight
end
local function CreateSquareGroupButton(parent, groupIndex, data, point, relativeTo, relativePoint, offsetX, offsetY, customSectorHeight)
local button;
local buttons = {};
local buttonDistanceX = 2;
local buttonDistanceY = 2;
local numButton = #data;
local buttonWidth = 0;
local buttonsPerRow = data.buttonsPerRow or 1;
for i = 1, numButton do
button = CreateFrame("Button", nil, parent, "NarciDarkSquareButtonTemplate");
button.index = i;
tinsert(buttons, button);
button:Initialize( groupIndex, unpack(data[i]) );
if i == 1 then
button:SetPoint("CENTER", parent, "CENTER", 0, 0);
buttonWidth = button:GetWidth();
button:UpdateVisual();
else
if i % buttonsPerRow == 1 then
button:SetPoint("TOPLEFT", buttons[i - buttonsPerRow], "BOTTOMLEFT", 0, -buttonDistanceY);
else
button:SetPoint("TOPLEFT", buttons[i - 1], "TOPRIGHT", buttonDistanceX, 0);
end
end
end
local Sector = CreateFrame("Frame", nil, parent, "NarciDarkButtonSectorTemplate");
local inset = 8;
local buttonHeight = button:GetHeight();
local sectorWidth = buttonsPerRow * buttonWidth + (buttonsPerRow - 1) * buttonDistanceX + 2*inset;
local sectorHeight = customSectorHeight or (numButton * buttonHeight + (numButton - 1) * buttonDistanceY + 12 + 2*inset + 4);
Sector:SetPoint(point, relativeTo or parent, relativePoint, offsetX, offsetY);
Sector:SetSize(sectorWidth, sectorHeight);
Sector.Label:SetText(data.header);
local button1 = buttons[1];
button1:ClearAllPoints();
button1:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", offsetX + inset, 68 -inset -12); --Anchor to Parent. Assign header animation -12 ~ minus Header Height
parent.shadowOptions = buttons;
return sectorWidth, sectorHeight
end
NarciGroundShadowOptionMixin = {};
function NarciGroundShadowOptionMixin:SelectShadowStyle(index)
local isRadialShadow = (index == 2);
local GroundShadowContainer = self.GroundShadowContainer;
GroundShadowContainer.Shadow:SetShown(not isRadialShadow);
GroundShadowContainer.RadialShadow:SetShown(isRadialShadow);
GroundShadowContainer.RadialShadowMask:SetShown(isRadialShadow);
self.RotationButton:SetShown(isRadialShadow);
GroundShadowContainer.useRadialShadow = isRadialShadow;
end
function NarciGroundShadowOptionMixin:EnableLightControl(state)
local GroundShadowContainer = self.GroundShadowContainer;
GroundShadowContainer.controlLights = state;
end
function NarciGroundShadowOptionMixin:OnLoad()
local texFile = "Interface\\AddOns\\Narcissus\\Art\\Widgets\\LightSetup\\ShadowStyleIcon";
local data1 = {
["header"] = L["Shadow"],
["buttonsPerRow"] = 2,
[1] = {texFile, {0, 0.25, 0, 1}, nil, function() self:SelectShadowStyle(1) end},
[2] = {texFile, {0.25, 0.5, 0, 1}, nil, function() self:SelectShadowStyle(2) end},
}
local data2 = {
["header"] = L["Light Source"],
[1] = {L["Light Source Independent"], nil, function() self:EnableLightControl(false) end},
[2] = {L["Light Source Interconnected"], nil, function() self:EnableLightControl(true) end},
}
local totalWidth = 384;
local gap = 4;
local collapsedHeight = 2;
local relativeTo = self;
local w1, h1 = CreateSquareGroupButton(self, 1, data1, "TOPLEFT", relativeTo, "TOPLEFT", 0, 0, height);
local w2, h2 = CreateRoundGroupButton(self, 2, data2, "TOPLEFT", relativeTo, "TOPLEFT", w1 + gap, 0);
local Sector = CreateFrame("Frame", nil, relativeTo, "NarciDarkButtonSectorTemplate");
local usedWidth = w1 + w2 + 2*gap;
Sector:SetPoint("TOPLEFT", relativeTo, "TOPLEFT", usedWidth, 0);
Sector:SetSize(totalWidth - usedWidth, 68);
Sector.Label:SetText(L["Adjustment"]);
local numSectors = #self.sectors;
local fullHeight = h2; --68
self:SetSize(totalWidth, collapsedHeight);
self:SetAlpha(0);
--Fly/Fade In Animation
local animFly = NarciAPI_CreateAnimationFrame(0.2);
animFly:SetScript("OnUpdate", function(frame, elapsed)
frame.total = frame.total + elapsed;
local height;
if frame.isExpanding then
height = outQuart(frame.total, frame.fromHeight, frame.toHeight, frame.duration);
else
height = inOutSine(frame.total, frame.fromHeight, frame.toHeight, frame.duration);
end
if frame.total >= frame.duration then
height = frame.toHeight;
frame:Hide();
end
self:SetHeight(height);
end)
function self:FlyIn(enter)
animFly:Hide();
animFly.fromHeight = self:GetHeight();
animFly.isExpanding = enter;
if enter then
animFly.toHeight = fullHeight; --height + 2
FadeFrame(self, 0.2, "IN");
else
animFly.toHeight = collapsedHeight; --height + 2
FadeFrame(self, 0.1, "OUT");
end
animFly:Show();
end
--Toggle
local Toggle = self:GetParent().GroundShadowOptionToggle;
self.Toggle = Toggle;
Toggle.Label:SetText(L["Show More options"]);
local toggleWidth = Toggle.Label:GetWidth()
Toggle:SetWidth( math.max(toggleWidth + 12, 80) );
Toggle:SetScript("OnEnter", function(button)
button.Label:SetTextColor(1, 1, 1);
end)
Toggle:SetScript("OnLeave", function(button)
button.Label:SetTextColor(0.25, 0.78, 0.92);
end)
Toggle:SetScript("OnClick", function(button)
self.isExpanded = not self.isExpanded;
local state = self.isExpanded;
self:UpdateSliderVisibility();
--self:SetShown(state);
if state then
button.Label:SetText(L["Show Less Options"]);
--button.Arrow:SetTexCoord(0, 1, 0, 1);
button.Arrow.flyOutUp:Play();
self:FlyIn(true);
else
button.Label:SetText(L["Show More options"]);
--button.Arrow:SetTexCoord(0, 1, 1, 0);
button.Arrow.flyOutDown:Play();
self:FlyIn(false);
end
end)
Toggle:SetScript("OnDoubleClick", function()
return
end)
self.ColorPickerButton = self:GetParent().ColorPickerButton;
self.ColorPickerButton.onClickFunc = function()
if Narci_ColorPicker:IsShown() then
self.ColorPickerButton:Deselect();
Narci_ColorPicker:Hide();
else
Narci_ColorPicker:SetObject(self.ColorPickerButton);
end
end;
self.OnLoad = nil;
end
function NarciGroundShadowOptionMixin:UpdateSliderVisibility()
local parent = self:GetParent();
if parent then
local visible = self.isExpanded;
parent.SizeSlider:SetShown(visible);
parent.AlphaSlider:SetShown(visible);
local Shadow = parent:GetParent();
local hitOffset;
if visible then
hitOffset = 68;
else
hitOffset = 0;
end
Shadow.offsetTop = hitOffset;
Shadow:SetHitRectInsets(0, 0, -hitOffset, 0);
end
end
function NarciGroundShadowOptionMixin:UpdateUI()
self:UpdateSliderVisibility();
if self.GroundShadowContainer.useRadialShadow then
self.shadowOptions[2]:UpdateVisual();
self.RotationButton:Show();
else
self.shadowOptions[1]:UpdateVisual();
self.RotationButton:Hide();
end
if self.GroundShadowContainer.controlLights then
self.lightOptions[2]:UpdateVisual();
else
self.lightOptions[1]:UpdateVisual();
end
end
function NarciGroundShadowOptionMixin:ReAnchor(model, parent)
self.object = parent;
self:ClearAllPoints();
self:SetParent(parent);
self:SetPoint("BOTTOM", parent, "TOP", 0, 0);
self:SetFrameLevel(parent:GetFrameLevel() - 1);
self.Toggle:ClearAllPoints();
self.Toggle:SetParent(parent);
self.Toggle:SetPoint("TOPLEFT", parent, "TOPLEFT", 10, -4);
self.ColorPickerButton:ClearAllPoints();
self.ColorPickerButton:SetParent(parent);
self.ColorPickerButton:SetPoint("TOPRIGHT", parent, "TOPRIGHT", -6, -6);
self.ColorPickerButton.objects = {
model.GroundShadow.ShadowTextures.Shadow,
model.GroundShadow.ShadowTextures.RadialShadow,
};
self.GroundShadowContainer = model.GroundShadow.ShadowTextures;
self.RotationButton = model.GroundShadow.Option.RotationButton;
self:UpdateUI();
Narci_ColorPicker:Hide();
end