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.

351 lines
9.9 KiB

local _, addon = ...
local THUMB_SIZE = 20;
local MainFrame;
local ANY_DRAGGING = false;
local GetCursorPosition = GetCursorPosition;
local function EmptyFunc(self, value, userInput)
end
local SliderUpdateFrame = CreateFrame("Frame");
SliderUpdateFrame:Hide();
local function SliderUpdateFrame_Lock(self, elapsed)
self.t = self.t + elapsed;
if self.t >= 0 then
self.locked = nil;
self:SetScript("OnUpdate", nil);
end
end
local function SliderUpdateFrame_Drag(self, elapsed)
self.x, self.y = GetCursorPosition();
self.ratio = (self.x - self.cursorOffset - self.left)/self.pixelRange;
self.slider:SetValueByRatio(self.ratio, true);
end
function SliderUpdateFrame:Start(slider)
if self.locked then
return
end
if slider.obeyStepOnDrag then
self:Stop();
return
end
self.slider = slider;
local uiScale = slider:GetEffectiveScale();
self.left = slider.RailCenter:GetLeft() * uiScale;
self.right = slider.RailCenter:GetRight() * uiScale;
self.pixelRange = self.right - self.left;
if slider.Thumb:IsMouseOver() then
local cursorX, cursorY = GetCursorPosition();
local thumbX, thumbY = slider.Thumb:GetCenter();
thumbX, thumbY = thumbX * uiScale, thumbY * uiScale;
self.cursorOffset = cursorX - thumbX;
else
self.cursorOffset = 0;
end
SliderUpdateFrame:SetScript("OnUpdate", SliderUpdateFrame_Drag);
self:Show();
end
function SliderUpdateFrame:Stop()
if not self.locked then
self:Hide();
end
end
function SliderUpdateFrame:Lock()
self.t = -0.25;
self.locked = true;
self:SetScript("OnUpdate", SliderUpdateFrame_Lock);
self:Show();
end
local function Thumb_OnEnter(self)
self.Icon:SetDesaturation(0);
self.Icon:SetVertexColor(1, 1, 1);
end
local function Thumb_OnLeave(self)
if not (self:GetParent().obeyStepOnDrag or self:GetParent().isDragging) then
self.Icon:SetDesaturation(1);
self.Icon:SetVertexColor(0.67, 0.67, 0.67);
end
end
local function Thumb_OnMouseDown(self)
self:GetParent().isDragging = true;
ANY_DRAGGING = true;
SliderUpdateFrame:Start(self:GetParent());
end
local function Thumb_OnMouseUp(self)
self:GetParent().isDragging = nil;
ANY_DRAGGING = false;
if not self:IsMouseOver() then
Thumb_OnLeave(self);
end
SliderUpdateFrame:Stop();
if MainFrame then
MainFrame:OnLeave();
end
end
local function Thumb_OnDoubleClick(self)
self:GetParent():ResetToDefaultValue();
SliderUpdateFrame:Lock();
end
local function Node_OnEnter(self)
end
local function Node_OnLeave(self)
end
local function Node_OnMouseDown(self)
self:GetParent():SetValueByStep(self.index, true);
end
NarciScreenshotToolbarSliderMixin = {};
function NarciScreenshotToolbarSliderMixin:OnLoad()
self:SetMinMaxValues(self.minValue, self.maxValue);
self.railSize = self.RailCenter:GetWidth();
if self.labelText then
self:SetLabel(self.labelText);
self.labelText = nil;
elseif self.labelTextKey then
self:SetLabel(Narci.L[self.labelText] or "Not Set");
self.labelTextKey= nil;
end
self.onValueChangedFunc = EmptyFunc;
self.Thumb:SetScript("OnEnter", Thumb_OnEnter);
self.Thumb:SetScript("OnLeave", Thumb_OnLeave);
self.Thumb:SetScript("OnMouseDown", Thumb_OnMouseDown);
self.Thumb:SetScript("OnMouseUp", Thumb_OnMouseUp);
self.Thumb:SetScript("OnDoubleClick", Thumb_OnDoubleClick);
Thumb_OnLeave(self.Thumb);
if self.iconIndex then
self.Icon:SetTexCoord(self.iconIndex * 0.125, (self.iconIndex + 1) * 0.125, 0.875, 1);
self.iconIndex = nil;
end
end
function NarciScreenshotToolbarSliderMixin:OnEnter()
if MainFrame then
MainFrame:OnEnter();
end
end
function NarciScreenshotToolbarSliderMixin:OnLeave()
if MainFrame then
MainFrame:OnLeave();
end
end
function NarciScreenshotToolbarSliderMixin:OnMouseDown()
SliderUpdateFrame:Start(self);
self.isDragging = true;
end
function NarciScreenshotToolbarSliderMixin:OnMouseUp()
if not self:IsMouseOver() then
self:OnLeave();
end
SliderUpdateFrame:Stop();
self.isDragging = nil;
Thumb_OnMouseUp(self.Thumb);
end
function NarciScreenshotToolbarSliderMixin:SetValue(value, userInput)
if self.maxValue and value > self.maxValue then
value = self.maxValue;
elseif self.minValue and value < self.minValue then
value = self.minValue;
end
if value ~= self.value or self.alwaysUpdate then
self.onValueChangedFunc(self, value, userInput);
end
self.value = value;
if self.obeyStepOnDrag then
local index = (value - self.minValue) / self.valueStep;
self.Thumb:SetPoint("CENTER", self.RailCenter, "LEFT", index * self.nodeOffset, 0);
else
local ratio;
if self.range == 0 then
ratio = 0;
else
ratio = (value - self.minValue) / self.range;
end
self.Thumb:SetPoint("CENTER", self.RailCenter, "LEFT", ratio * self.railSize, 0);
end
end
function NarciScreenshotToolbarSliderMixin:GetValue()
return self.value;
end
function NarciScreenshotToolbarSliderMixin:SetValueByStep(index, userInput)
if index >= 0 and self.valueStep and self.minValue then
local value = self.minValue + index * self.valueStep;
self:SetValue(value, userInput);
end
end
function NarciScreenshotToolbarSliderMixin:SetValueByRatio(ratio, userInput)
if ratio > 1 then
ratio = 1;
elseif ratio < 0 then
ratio = 0;
end
self:SetValue( (1 - ratio) * self.minValue + ratio * self.maxValue, userInput);
end
function NarciScreenshotToolbarSliderMixin:OnShow()
if not self.ready then
self:Init();
self.ready = true;
end
if self.onShowCallback then
self.onShowCallback(self);
end
end
function NarciScreenshotToolbarSliderMixin:Init()
if self.obeyStepOnDrag then
if not self.nodes then
self.nodes = {};
end
self.valueStep = (self.maxValue - self.minValue)/(self.numSteps - 1);
local SIDE_OFFSET = THUMB_SIZE * 0.5; --Conpensated for thumb size (20)
local width = math.floor(self:GetWidth() + 0.5 - THUMB_SIZE);
local offsetX = width / (self.numSteps - 1);
self.nodeOffset = offsetX;
local node;
for i = 1, self.numSteps do
node = self.nodes[i];
if not node then
self.nodes[i] = CreateFrame("Button", nil, self);
node = self.nodes[i];
node.index = i - 1;
node:SetSize(24, 24);
node:SetScript("OnEnter", Node_OnEnter);
node:SetScript("OnLeave", Node_OnLeave);
node:SetScript("OnMouseDown", Node_OnMouseDown);
node.Texture = node:CreateTexture(nil, "BORDER");
node.Texture:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\ScreenshotTool\\Slider");
node.Texture:SetSize(20, 20);
node.Texture:SetPoint("CENTER", node, "CENTER", 0, 0);
node.Highlight = node:CreateTexture(nil, "HIGHLIGHT");
node.Highlight:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Modules\\ScreenshotTool\\Slider");
node.Highlight:SetSize(20, 20);
node.Highlight:SetPoint("CENTER", node, "CENTER", 0, 0);
node.Highlight:SetTexCoord(0.25, 0.375, 0.125, 0.25);
node.Highlight:SetBlendMode("ADD");
end
if i == 1 then
node.Texture:SetTexCoord(0, 0.125, 0, 0.125);
elseif i == self.numSteps then
node.Texture:SetTexCoord(0.25, 0.375, 0, 0.125);
else
node.Texture:SetTexCoord(0.125, 0.25, 0, 0.125);
end
node:SetPoint("CENTER", self, "LEFT", offsetX * (i - 1) + SIDE_OFFSET, 0);
end
for i = self.numSteps + 1, #self.nodes do
node:Hide();
end
self.Thumb.Icon:SetTexCoord(0, 0.125, 0.125, 0.25);
Thumb_OnEnter(self.Thumb);
self.RailLeft:Hide();
self.RailRight:Hide();
self.RailCenter:SetTexCoord(0.5, 0.75, 0, 0.125);
local labelOffset = 4;
self.Label:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0 + labelOffset, -3);
self.ValueText:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", 0 - labelOffset, -3);
self.IconBackground:SetPoint("RIGHT", self, "LEFT", -6 + labelOffset, 6);
else
if self.nodes then
for i = 1, #self.nodes do
self.nodes[i]:Hide();
end
end
self.Thumb.Icon:SetTexCoord(0.125, 0.25, 0.125, 0.25);
Thumb_OnLeave(self.Thumb);
self.RailLeft:Show();
self.RailRight:Show();
self.RailCenter:SetTexCoord(0.5, 0.75, 0.125, 0.25);
end
end
function NarciScreenshotToolbarSliderMixin:SetMinMaxValues(minValue, maxValue)
self.minValue = minValue;
self.maxValue = maxValue;
self.range = maxValue - minValue;
end
function NarciScreenshotToolbarSliderMixin:SetLabel(text)
self.Label:SetText(text);
end
function NarciScreenshotToolbarSliderMixin:SetValueText(text)
self.ValueText:SetText(text);
end
function NarciScreenshotToolbarSliderMixin:ResetToDefaultValue()
if self.defaultValue then
self:SetValue(self.defaultValue, true);
end
end
NarciCameraSettingFrameMixin = {};
function NarciCameraSettingFrameMixin:OnLoad()
MainFrame = self:GetParent();
end
function NarciCameraSettingFrameMixin:IsFocused()
return self:IsShown() and (self:IsMouseOver() or ANY_DRAGGING)
end