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.

458 lines
16 KiB

5 years ago
local L = WeakAuras.L
local AddonName, OptionsPrivate = ...
local texture_types = WeakAuras.StopMotion.texture_types;
local texture_data = WeakAuras.StopMotion.texture_data;
local animation_types = WeakAuras.StopMotion.animation_types;
local setTile = WeakAuras.setTile;
local function setTextureFunc(textureWidget, texturePath, textureName)
local data = texture_data[texturePath];
textureWidget.frameNr = 0;
if (data) then
if (data.rows and data.columns) then
-- Texture Atlas
textureWidget:SetTexture(texturePath, textureName);
setTile(textureWidget, data.count, data.rows, data.columns);
textureWidget:SetOnUpdate(function()
textureWidget.frameNr = textureWidget.frameNr + 1;
if (textureWidget.frameNr == data.count) then
textureWidget.frameNr = 1;
end
setTile(textureWidget, textureWidget.frameNr, data.rows, data.columns);
end);
else
-- Numbered Textures
local texture = texturePath .. format("%03d", texture_data[texturePath].count)
textureWidget:SetTexture(texture, textureName)
textureWidget:SetTexCoord(0, 1, 0, 1);
textureWidget:SetOnUpdate(function()
textureWidget.frameNr = textureWidget.frameNr + 1;
if (textureWidget.frameNr == data.count) then
textureWidget.frameNr = 1;
end
local texture = texturePath .. format("%03d", textureWidget.frameNr)
textureWidget:SetTexture(texture, textureName);
end);
end
else
local texture = texturePath .. format("%03d", 1)
textureWidget:SetTexture(texture, textureName);
end
end
local function textureNameHasData(textureName)
local pattern = "%.x(%d+)y(%d+)f(%d+)%.[tb][gl][ap]"
local rows, columns, frames = textureName:lower():match(pattern)
return rows and columns and frames
end
local function createOptions(id, data)
local options = {
__title = L["Stop Motion Settings"],
__order = 1,
foregroundTexture = {
type = "input",
width = WeakAuras.normalWidth - 0.15,
name = L["Texture"],
order = 1,
},
chooseForegroundTexture = {
type = "execute",
width = 0.15,
name = L["Choose"],
order = 2,
func = function()
OptionsPrivate.OpenTexturePicker(data, {}, {
texture = "foregroundTexture",
color = "foregroundColor",
rotation = "rotation",
mirror = "mirror",
blendMode = "blendMode"
}, texture_types, setTextureFunc);
end,
imageWidth = 24,
imageHeight = 24,
control = "WeakAurasIcon",
image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\browse",
},
backgroundTexture = {
type = "input",
width = WeakAuras.normalWidth - 0.15,
name = L["Background Texture"],
order = 5,
disabled = function() return data.sameTexture or data.hideBackground end,
get = function() return data.sameTexture and data.foregroundTexture or data.backgroundTexture; end,
},
chooseBackgroundTexture = {
type = "execute",
width = 0.15,
name = L["Choose"],
order = 6,
func = function()
OptionsPrivate.OpenTexturePicker(data, {}, {
texture = "backgroundTexture",
color = "backgroundColor",
rotation = "rotation",
mirror = "mirror",
blendMode = "blendMode"
}, texture_types, setTextureFunc);
end,
disabled = function() return data.sameTexture or data.hideBackground; end,
imageWidth = 24,
imageHeight = 24,
control = "WeakAurasIcon",
image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\browse",
},
sameTextureSpace = {
type = "description",
width = WeakAuras.normalWidth,
name = "",
order = 13,
},
hideBackground = {
type = "toggle",
name = L["Hide"],
order = 14,
width = WeakAuras.halfWidth,
},
sameTexture = {
type = "toggle",
width = WeakAuras.halfWidth,
name = L["Same"],
order = 15,
disabled = function() return data.hideBackground; end
},
desaturateForeground = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Desaturate"],
order = 17.5,
},
desaturateBackground = {
type = "toggle",
name = L["Desaturate"],
order = 17.6,
width = WeakAuras.normalWidth,
disabled = function() return data.hideBackground; end
},
-- Foreground options for custom textures
customForegroundHeader = {
type = "header",
name = L["Custom Foreground"],
order = 17.70,
hidden = function() return texture_data[data.foregroundTexture] or textureNameHasData(data.foregroundTexture) end
},
customForegroundRows = {
type = "range",
width = WeakAuras.normalWidth,
name = L["Rows"],
min = 1,
max = 64,
order = 17.71,
hidden = function() return texture_data[data.foregroundTexture] or textureNameHasData(data.foregroundTexture) end
},
customForegroundColumns = {
type = "range",
width = WeakAuras.normalWidth,
name = L["Columns"],
min = 1,
max = 64,
order = 17.72,
hidden = function() return texture_data[data.foregroundTexture] or textureNameHasData(data.foregroundTexture) end
},
customForegroundFrames = {
type = "range",
width = WeakAuras.normalWidth,
name = L["Frame Count"],
min = 0,
max = 4096,
--bigStep = 0.01,
order = 17.73,
hidden = function() return texture_data[data.foregroundTexture] or textureNameHasData(data.foregroundTexture) end
},
customForegroundSpace = {
type = "execute",
width = WeakAuras.normalWidth,
name = "",
order = 17.74,
image = function() return "", 0, 0 end,
hidden = function() return texture_data[data.foregroundTexture] or textureNameHasData(data.foregroundTexture) end
},
-- Background options for custom textures
customBackgroundHeader = {
type = "header",
name = L["Custom Background"],
order = 18.00,
hidden = function() return data.sameTexture or texture_data[data.backgroundTexture] or textureNameHasData(data.backgroundTexture)
or data.hideBackground end
},
customBackgroundRows = {
type = "range",
width = WeakAuras.normalWidth,
name = L["Rows"],
min = 1,
max = 64,
order = 18.01,
hidden = function() return data.sameTexture or texture_data[data.backgroundTexture] or textureNameHasData(data.backgroundTexture)
or data.hideBackground end
},
customBackgroundColumns = {
type = "range",
width = WeakAuras.normalWidth,
name = L["Columns"],
min = 1,
max = 64,
order = 18.02,
hidden = function() return data.sameTexture or texture_data[data.backgroundTexture] or textureNameHasData(data.backgroundTexture)
or data.hideBackground end
},
customBackgroundFrames = {
type = "range",
width = WeakAuras.normalWidth,
name = L["Frame Count"],
min = 0,
max = 4096,
step = 1,
order = 18.03,
hidden = function() return data.sameTexture or texture_data[data.backgroundTexture] or textureNameHasData(data.backgroundTexture)
or data.hideBackground end
},
customBackgroundSpace = {
type = "execute",
width = WeakAuras.normalWidth,
name = "",
order = 18.04,
image = function() return "", 0, 0 end,
hidden = function() return data.sameTexture or texture_data[data.backgroundTexture] or textureNameHasData(data.backgroundTexture)
or data.hideBackground end
},
blendMode = {
type = "select",
width = WeakAuras.normalWidth,
name = L["Blend Mode"],
order = 20,
values = OptionsPrivate.Private.blend_types
},
animationType = {
type = "select",
width = WeakAuras.normalWidth,
name = L["Animation Mode"],
order = 21,
values = animation_types
},
startPercent = {
type = "range",
width = WeakAuras.normalWidth,
name = L["Animation Start"],
min = 0,
max = 1,
--bigStep = 0.01,
order = 22,
isPercent = true
},
endPercent = {
type = "range",
width = WeakAuras.normalWidth,
name = L["Animation End"],
min = 0,
max = 1,
--bigStep = 0.01,
order = 23,
isPercent = true
},
frameRate = {
type = "range",
width = WeakAuras.normalWidth,
name = L["Frame Rate"],
min = 3,
max = 120,
step = 1,
bigStep = 3,
order = 24,
disabled = function() return data.animationType == "progress" end;
},
backgroundPercent = {
type = "range",
width = WeakAuras.normalWidth,
name = L["Background"],
min = 0,
max = 1,
order = 25,
isPercent = true,
disabled = function() return data.hideBackground; end
},
foregroundColor = {
type = "color",
width = WeakAuras.normalWidth,
name = L["Foreground Color"],
hasAlpha = true,
order = 30
},
backgroundColor = {
type = "color",
width = WeakAuras.normalWidth,
name = L["Background Color"],
hasAlpha = true,
order = 32,
disabled = function() return data.hideBackground; end
},
inverse = {
type = "toggle",
width = WeakAuras.normalWidth,
name = L["Inverse"],
order = 33
},
space3 = {
type = "execute",
width = WeakAuras.normalWidth,
name = "",
order = 36,
image = function() return "", 0, 0 end,
},
};
if OptionsPrivate.commonOptions then
return {
stopmotion = options,
position = OptionsPrivate.commonOptions.PositionOptions(id, data, 2),
};
else
return {
stopmotion = options,
position = WeakAuras.PositionOptions(id, data, 2),
};
end
end
local function createThumbnail()
local borderframe = CreateFrame("FRAME", nil, UIParent);
borderframe:SetWidth(32);
borderframe:SetHeight(32);
local border = borderframe:CreateTexture(nil, "OVERLAY");
border:SetAllPoints(borderframe);
border:SetTexture("Interface\\BUTTONS\\UI-Quickslot2.blp");
border:SetTexCoord(0.2, 0.8, 0.2, 0.8);
local texture = borderframe:CreateTexture();
borderframe.texture = texture;
texture:SetPoint("CENTER", borderframe, "CENTER");
return borderframe;
end
local function modifyThumbnail(parent, region, data, fullModify, size)
region:SetParent(parent)
size = size or 30;
local scale;
if(data.height > data.width) then
scale = size/data.height;
region.texture:SetWidth(scale * data.width);
region.texture:SetHeight(size);
else
scale = size/data.width;
region.texture:SetWidth(size);
region.texture:SetHeight(scale * data.height);
end
local frame = 1;
local tdata = texture_data[data.foregroundTexture];
if (tdata) then
local lastFrame = tdata.count - 1;
region.startFrame = floor( (data.startPercent or 0) * lastFrame) + 1;
region.endFrame = floor( (data.endPercent or 1) * lastFrame) + 1;
region.foregroundRows = tdata.rows;
region.foregroundColumns = tdata.columns;
else
local pattern = "%.x(%d+)y(%d+)f(%d+)%.[tb][gl][ap]"
local rows, columns, frames = data.foregroundTexture:lower():match(pattern)
if rows and columns and frames then
local lastFrame = frames - 1;
region.startFrame = floor( (data.startPercent or 0) * lastFrame) + 1;
region.endFrame = floor( (data.endPercent or 1) * lastFrame) + 1;
region.foregroundRows = rows;
region.foregroundColumns = columns;
else
local lastFrame = data.customForegroundFrames - 1;
region.startFrame = floor( (data.startPercent or 0) * lastFrame) + 1;
region.endFrame = floor( (data.endPercent or 1) * lastFrame) + 1;
region.foregroundRows = data.customForegroundRows;
region.foregroundColumns = data.customForegroundColumns;
end
end
if (region.startFrame and region.endFrame) then
frame = floor(region.startFrame + (region.endFrame - region.startFrame) * 0.75);
end
local texture = data.foregroundTexture or "Interface\\AddOns\\WeakAuras\\Media\\Textures\\stopmotion";
if (region.foregroundRows and region.foregroundColumns) then
region.texture:SetTexture(texture);
setTile(region.texture, frame, region.foregroundRows, region.foregroundColumns);
region.SetValue = function(self, percent)
local frame = floor(percent * (region.endFrame - region.startFrame) + region.startFrame);
setTile(self.texture, frame, region.foregroundRows, region.foregroundColumns);
end
else
region.texture:SetTexture(texture .. format("%03d", frame));
region.texture:SetTexCoord(0, 1, 0, 1);
region.SetValue = function(self, percent)
local frame = floor(percent * (region.endFrame - region.startFrame) + region.startFrame);
self.texture:SetTexture((data.foregroundTexture) .. format("%03d", frame));
end
end
region.texture:SetVertexColor(data.foregroundColor[1], data.foregroundColor[2], data.foregroundColor[3], data.foregroundColor[4]);
region.texture:SetBlendMode(data.blendMode);
region.elapsed = 0;
region:SetScript("OnUpdate", function(self, elapsed)
region.elapsed = region.elapsed + elapsed;
if(region.elapsed > 4) then
region.elapsed = region.elapsed - 4;
end
region:SetValue(region.elapsed / 4);
end);
end
local function createIcon()
local data = {
height = 30,
width = 30,
foregroundTexture = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\stopmotion",
foregroundColor = {1, 1, 1, 1},
blendMode = "ADD",
rotate = false,
rotation = 0,
startPercent = 0,
endPercent = 1,
backgroundPercent = 1,
animationType = "progress"
};
local thumbnail = createThumbnail(UIParent);
modifyThumbnail(UIParent, thumbnail, data, nil, 75);
thumbnail.elapsed = 0;
thumbnail:SetScript("OnUpdate", function(self, elapsed)
thumbnail.elapsed = thumbnail.elapsed + elapsed;
if(thumbnail.elapsed > 2) then
thumbnail.elapsed = thumbnail.elapsed - 2;
end
thumbnail:SetValue(thumbnail.elapsed / 2);
end);
return thumbnail;
end
WeakAuras.RegisterRegionOptions("stopmotion", createOptions, createIcon, L["Stop Motion"], createThumbnail, modifyThumbnail, L["Shows a stop motion texture"]);