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.

256 lines
8.2 KiB

local _, addon = ...
local GetCursorPosition = GetCursorPosition;
local floor = math.floor;
local function Round(n)
if n then
return floor(n + 0.5);
end
end
local MAX_CAP_OFFSET = 48;
local function GetCapOffset(diff)
if diff > 0 then
if diff > MAX_CAP_OFFSET then
return 12, 1
else
local x = diff/MAX_CAP_OFFSET;
return 12*(1 -(x - 1)^2), x
end
elseif diff < 0 then
diff = -diff;
if diff > MAX_CAP_OFFSET then
return -12, -1
else
local x = diff/MAX_CAP_OFFSET;
return 12*((x - 1)^2 - 1), -x
end
else
return 0, 0
end
end
local function UpdateCursorNotch(self, elapased)
local x, y = GetCursorPosition();
local diff = 0;
local movingRight;
if x < self.left then
diff = x - self.left;
x = self.left;
movingRight = false;
elseif x > self.right then
diff = x - self.right;
x = self.right;
movingRight = true;
end
self.CursorNotch:SetPoint("CENTER", self, "LEFT", x - self.left, 0);
if self.isDragging then
local offset, speedRatio = GetCapOffset(diff);
self.Thumb:SetPoint("BOTTOM", self, "LEFT", x - self.left, 0);
self.offset = self.offset + speedRatio * elapased * 200; --4s/s
local exceeding;
if movingRight then
if not self.movingRight then
self.movingRight = true;
self.Tail:ClearAllPoints();
self.Tail:SetPoint("RIGHT", self, "RIGHT", 0, 0);
self.Tail:SetTexCoord(1, 0, 0, 1);
end
else
if self.movingRight then
self.movingRight = nil;
self.Tail:ClearAllPoints();
self.Tail:SetPoint("LEFT", self, "LEFT", 0, 0);
self.Tail:SetTexCoord(0, 1, 0, 1);
end
end
if self.offset < 0 then
self.offset = 0;
exceeding = true;
elseif self.offset > self.maxOffset then
self.offset = self.maxOffset;
exceeding = true;
self.Tail:ClearAllPoints();
self.Tail:SetPoint("RIGHT", self, "RIGHT", 0, 0);
end
if exceeding ~= self.exceeding then
self.exceeding = exceeding;
if exceeding then
self.Tail:SetVertexColor(0.84, 0.08, 0.15);
else
self.Tail:SetVertexColor(0, 0.68, 0.94);
end
end
local alpha;
if speedRatio > 0 then
alpha = 2*speedRatio;
else
alpha = -2*speedRatio;
end
if alpha > 1 then
alpha = 1;
end
self.Tail:SetAlpha(alpha);
self.RefObject:SetPoint("CENTER", self, "LEFT", -self.offset, 0);
self.value = Round((self.offset + x - self.left)*self.valuePerX);
self.ValueText:SetText(self.value);
self.onValueChangedFunc(self, self.value);
end
end
NarciShowcaseAnimationSliderMixin = {};
function NarciShowcaseAnimationSliderMixin:OnLoad()
self.Label:SetText(Narci.L["Elapse"]);
self.SliderCenter:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\Showcase\\FrameSlider", nil, nil, "TRILINEAR")
self.CeilingNotch = self.ClipFrame.CeilingNotch;
self.valuePerX = 10;
self.offset = 0;
--self.SliderLeft:SetVertexColor(0.25, 0.25, 0.25);
self.SliderCenter:SetVertexColor(0.25, 0.25, 0.25);
self.Tail:SetVertexColor(0, 0.68, 0.94);
self:SetRange(15000);
self:CreateNotch(500);
self:UpdateLineSize();
self:OnLeave();
end
function NarciShowcaseAnimationSliderMixin:OnShow()
self.sliderWidth = self:GetWidth();
end
function NarciShowcaseAnimationSliderMixin:SetRange(range)
self.range = range;
local sliderWidth = self:GetWidth();
self.maxOffset = range / self.valuePerX - sliderWidth;
end
function NarciShowcaseAnimationSliderMixin:CreateNotch(valueDistance)
if not self.notches then
self.notches = {};
self.RefObject = self:CreateTexture();
self.RefObject:SetSize(4, 16);
self.RefObject:Hide();
self.RefObject:SetPoint("CENTER", self, "LEFT", 0, 0);
end
if self.valuePerX then
local widthRange = self:GetWidth() * self.valuePerX;
local valueX = valueDistance / self.valuePerX;
local numNotches = math.ceil(self.range / valueDistance);
for i = 1, numNotches do
if not self.notches[i] then
self.notches[i] = self.ClipFrame:CreateTexture(nil, "OVERLAY");
self.notches[i]:SetSize(2, 6);
self.notches[i]:SetColorTexture(0.25, 0.25, 0.25);
self.notches[i].label = self.ClipFrame:CreateFontString(nil, "OVERLAY", "NarciShowcaseSliderFontTemplate");
end
self.notches[i]:SetPoint("CENTER", self.RefObject, "CENTER", (i - 1)*valueX, 0);
self.notches[i].label:SetPoint("TOP", self.RefObject, "BOTTOM", (i - 1)*valueX + 1, 2);
self.notches[i].label:SetText( (i-1) * valueDistance);
end
end
end
function NarciShowcaseAnimationSliderMixin:UpdateLineSize()
local _, screenHeight = GetPhysicalScreenSize();
local pixel = (768/screenHeight);
for _, notch in pairs(self.notches) do
notch:SetSize(2*pixel, 6);
end
self.CursorNotch:SetSize(2*pixel, 6);
self.CeilingNotch:SetSize(2*pixel, 6);
end
function NarciShowcaseAnimationSliderMixin:OnEnter()
self.left = self:GetLeft();
self.right = self:GetRight();
self.CursorNotch:Show();
self:SetScript("OnUpdate", UpdateCursorNotch);
self.Thumb:SetVertexColor(1, 1, 1);
self.CeilingNotch:SetAlpha(1);
self.SliderCenter:SetVertexColor(0.35, 0.35, 0.35);
end
function NarciShowcaseAnimationSliderMixin:OnLeave()
if not self.isDragging then
self.CursorNotch:Hide();
self:SetScript("OnUpdate", nil);
self.Thumb:SetVertexColor(0.67, 0.67, 0.67);
self.CeilingNotch:SetAlpha(0.5);
self.SliderCenter:SetVertexColor(0.25, 0.25, 0.25);
end
end
function NarciShowcaseAnimationSliderMixin:OnMouseDown(button)
if button == "LeftButton" then
self.isDragging = true;
else
self:SetValue(0, true);
end
if self.onMouseDownFunc then
self.onMouseDownFunc(self);
end
end
function NarciShowcaseAnimationSliderMixin:OnMouseUp()
self.isDragging = nil;
self.Tail:SetAlpha(0);
if self:IsMouseOver() then
self:SetScript("OnUpdate", UpdateCursorNotch);
else
self:OnLeave();
end
end
function NarciShowcaseAnimationSliderMixin:OnHide()
self:SetScript("OnUpdate", nil);
self.isDragging = nil;
self.CursorNotch:Hide();
end
function NarciShowcaseAnimationSliderMixin:SetValue(value, userInput)
value = Round(value);
if value > self.range then
value = self.range;
elseif value < 0 then
value = 0;
end
self.offset = value/self.valuePerX - self.sliderWidth * 0.5;
if self.offset < 0 then
self.offset = 0;
elseif self.offset > self.maxOffset then
self.offset = self.maxOffset;
end
self.RefObject:SetPoint("CENTER", self, "LEFT", -self.offset, 0);
local leftValue = self.offset * self.valuePerX;
local x = (value - leftValue)/self.valuePerX;
self.Thumb:SetPoint("BOTTOM", self, "LEFT", x, 0);
self.value = value;
if userInput then
self.onValueChangedFunc(self, value);
end
end
function NarciShowcaseAnimationSliderMixin:SetCeiling(value)
--max seconds for a specific animation
value = Round(value);
if value and value > 0 then
local offset = value/self.valuePerX;
self.CeilingNotch:ClearAllPoints();
self.CeilingNotch:SetPoint("CENTER", self.RefObject, "CENTER", offset, 0);
self.CeilingNotch:Show();
else
self.CeilingNotch:Hide();
end
end
function NarciShowcaseAnimationSliderMixin:Reset()
self.sliderWidth = self:GetWidth();
self:SetValue(0, true);
end