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.
457 lines
16 KiB
457 lines
16 KiB
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"]);
|
|
|