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.
331 lines
11 KiB
331 lines
11 KiB
local _, Cell = ...
|
|
local L = Cell.L
|
|
local F = Cell.funcs
|
|
local P = Cell.pixelPerfectFuncs
|
|
|
|
local Toggle, Validate
|
|
local from, to
|
|
local indicatorButtons = {}
|
|
local selectedIndicators = {}
|
|
|
|
local copyFrame, fromDropdown, toDropdown, fromList, copyBtn, closeBtn, allBtn, invertBtn
|
|
|
|
-- local function GetCustomIndicatorNames(indicators)
|
|
-- local names = {}
|
|
-- for i = Cell.defaults.builtIns+1, #indicators do
|
|
-- local iTbl = indicators[i]
|
|
-- names[iTbl["name"]] = {i, iTbl["indicatorName"]}
|
|
-- end
|
|
-- return names
|
|
-- end
|
|
|
|
local function CreateIndicatorsCopyFrame()
|
|
if not Cell.frames.indicatorsTab.mask then
|
|
Cell:CreateMask(Cell.frames.indicatorsTab, nil, {1, -1, -1, 1})
|
|
Cell.frames.indicatorsTab.mask:Hide()
|
|
end
|
|
|
|
copyFrame = Cell:CreateFrame("CellOptionsFrame_IndicatorsCopy", Cell.frames.indicatorsTab, 136, 520)
|
|
-- Cell.frames.indicatorsCopyFrame = copyFrame
|
|
Cell:StylizeFrame(copyFrame, nil, Cell:GetAccentColorTable())
|
|
copyFrame:SetFrameLevel(Cell.frames.indicatorsTab:GetFrameLevel() + 50)
|
|
copyFrame:SetPoint("BOTTOMLEFT", 5, 24)
|
|
copyFrame:Hide()
|
|
|
|
-- dropdowns
|
|
fromDropdown = Cell:CreateDropdown(copyFrame, 126)
|
|
fromDropdown:SetPoint("TOPLEFT", 5, -24)
|
|
|
|
toDropdown = Cell:CreateDropdown(copyFrame, 126)
|
|
toDropdown:SetPoint("TOPLEFT", fromDropdown, "BOTTOMLEFT", 0, -22)
|
|
|
|
local fromText = copyFrame:CreateFontString(nil, "OVERLAY", "CELL_FONT_CLASS")
|
|
fromText:SetPoint("BOTTOMLEFT", fromDropdown, "TOPLEFT", 0, 1)
|
|
fromText:SetText(L["From"])
|
|
|
|
local toText = copyFrame:CreateFontString(nil, "OVERLAY", "CELL_FONT_CLASS")
|
|
toText:SetPoint("BOTTOMLEFT", toDropdown, "TOPLEFT", 0, 1)
|
|
toText:SetText(L["To"])
|
|
|
|
-- list
|
|
fromList = CreateFrame("Frame", nil, copyFrame, "BackdropTemplate")
|
|
Cell:StylizeFrame(fromList)
|
|
fromList:SetPoint("TOPLEFT", toDropdown, "BOTTOMLEFT", 0, -5)
|
|
fromList:SetPoint("TOPRIGHT", toDropdown, "BOTTOMRIGHT", 0, -5)
|
|
-- fromList:SetPoint("BOTTOM", 0, 34)
|
|
fromList:SetHeight(381)
|
|
|
|
Cell:CreateScrollFrame(fromList)
|
|
fromList.scrollFrame:SetScrollStep(19)
|
|
|
|
-- buttons
|
|
copyBtn = Cell:CreateButton(copyFrame, L["Copy"], "green", {64, 20})
|
|
copyBtn:SetPoint("BOTTOMLEFT", 5, 5)
|
|
copyBtn:SetEnabled(false)
|
|
copyBtn:SetScript("OnClick", function()
|
|
local last = #CellDB["layouts"][to]["indicators"]
|
|
last = tonumber(string.match(CellDB["layouts"][to]["indicators"][last]["indicatorName"], "%d+")) or last
|
|
|
|
for i in pairs(selectedIndicators) do
|
|
if i <= Cell.defaults.builtIns then -- built-in
|
|
CellDB["layouts"][to]["indicators"][i] = F:Copy(CellDB["layouts"][from]["indicators"][i])
|
|
else -- user-created
|
|
last = last + 1
|
|
local indicator = F:Copy(CellDB["layouts"][from]["indicators"][i])
|
|
indicator["indicatorName"] = "indicator"..last
|
|
tinsert(CellDB["layouts"][to]["indicators"], indicator)
|
|
end
|
|
end
|
|
Cell:Fire("UpdateIndicators", to)
|
|
Cell:Fire("IndicatorsChanged", to)
|
|
copyFrame:Hide()
|
|
end)
|
|
|
|
closeBtn = Cell:CreateButton(copyFrame, L["Close"], "red", {63, 20})
|
|
closeBtn:SetPoint("BOTTOMLEFT", copyBtn, "BOTTOMRIGHT", P:Scale(-1), 0)
|
|
closeBtn:SetScript("OnClick", function()
|
|
copyFrame:Hide()
|
|
end)
|
|
|
|
allBtn = Cell:CreateButton(copyFrame, L["ALL"], "accent-hover", {64, 20})
|
|
allBtn:SetPoint("BOTTOMLEFT", copyBtn, "TOPLEFT", 0, P:Scale(-1))
|
|
allBtn:SetScript("OnClick", function()
|
|
for i = 1, #indicatorButtons do
|
|
Toggle(i, true)
|
|
end
|
|
Validate()
|
|
end)
|
|
|
|
invertBtn = Cell:CreateButton(copyFrame, L["INVERT"], "accent-hover", {63, 20})
|
|
invertBtn:SetPoint("BOTTOMLEFT", closeBtn, "TOPLEFT", 0, P:Scale(-1))
|
|
invertBtn:SetScript("OnClick", function()
|
|
for i = 1, #indicatorButtons do
|
|
if selectedIndicators[i] then
|
|
Toggle(i, false, true)
|
|
else
|
|
Toggle(i, true)
|
|
end
|
|
end
|
|
Validate()
|
|
end)
|
|
|
|
-- scripts
|
|
copyFrame:SetScript("OnShow", function()
|
|
Cell.frames.indicatorsTab.mask:Show()
|
|
end)
|
|
|
|
copyFrame:SetScript("OnHide", function()
|
|
copyFrame:Hide()
|
|
Cell.frames.indicatorsTab.mask:Hide()
|
|
fromList.scrollFrame:Reset()
|
|
fromDropdown:SetSelected()
|
|
toDropdown:SetSelected()
|
|
copyBtn:SetEnabled(false)
|
|
wipe(selectedIndicators)
|
|
from, to = nil, nil
|
|
end)
|
|
end
|
|
|
|
-------------------------------------------------
|
|
-- functions
|
|
-------------------------------------------------
|
|
Validate = function()
|
|
from, to = fromDropdown:GetSelected(), toDropdown:GetSelected()
|
|
if from and to and F:Getn(selectedIndicators) ~= 0 then
|
|
copyBtn:SetEnabled(true)
|
|
else
|
|
copyBtn:SetEnabled(false)
|
|
end
|
|
end
|
|
|
|
Toggle = function(index, isSelect, unhighlight)
|
|
b = indicatorButtons[index]
|
|
if isSelect then
|
|
selectedIndicators[index] = true
|
|
b:SetBackdropColor(unpack(b.hoverColor))
|
|
b:SetScript("OnEnter", nil)
|
|
b:SetScript("OnLeave", nil)
|
|
b:SetTextColor(0, 1, 0)
|
|
b.selected = true
|
|
else
|
|
selectedIndicators[index] = nil
|
|
b:SetScript("OnEnter", function(self) self:SetBackdropColor(unpack(self.hoverColor)) end)
|
|
b:SetScript("OnLeave", function(self) self:SetBackdropColor(unpack(self.color)) end)
|
|
b:SetTextColor(1, 1, 1)
|
|
b.selected = false
|
|
if unhighlight then
|
|
b:SetBackdropColor(0, 0, 0, 0)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function LoadIndicators(layout)
|
|
wipe(selectedIndicators)
|
|
fromList.scrollFrame:Reset()
|
|
|
|
local last, n
|
|
for i, t in pairs(CellDB["layouts"][layout]["indicators"]) do
|
|
local b = indicatorButtons[i]
|
|
if not b then
|
|
b = Cell:CreateButton(fromList.scrollFrame.content, " ", "transparent-accent", {20, 20})
|
|
indicatorButtons[i] = b
|
|
b.selected = false
|
|
b:SetScript("OnClick", function()
|
|
b.selected = not b.selected
|
|
Toggle(i, b.selected)
|
|
Validate()
|
|
end)
|
|
else
|
|
-- reset
|
|
b:Show()
|
|
b:SetParent(fromList.scrollFrame.content)
|
|
b.selected = false
|
|
b:SetScript("OnEnter", function(self) self:SetBackdropColor(unpack(self.hoverColor)) end)
|
|
b:SetScript("OnLeave", function(self) self:SetBackdropColor(unpack(self.color)) end)
|
|
b:SetTextColor(1, 1, 1)
|
|
b:SetBackdropColor(0, 0, 0, 0)
|
|
end
|
|
|
|
if t["type"] == "built-in" then
|
|
b:SetText(L[t["name"]])
|
|
else
|
|
b:SetText(t["name"])
|
|
if not b.typeIcon then
|
|
b.typeIcon = b:CreateTexture(nil, "ARTWORK")
|
|
b.typeIcon:SetPoint("RIGHT", -2, 0)
|
|
b.typeIcon:SetSize(16, 16)
|
|
b.typeIcon:SetAlpha(0.5)
|
|
b:GetFontString():ClearAllPoints()
|
|
b:GetFontString():SetPoint("LEFT", 5, 0)
|
|
b:GetFontString():SetPoint("RIGHT", b.typeIcon, "LEFT", -2, 0)
|
|
end
|
|
b.typeIcon:SetTexture("Interface\\AddOns\\Cell\\Media\\Indicators\\indicator-"..t["type"])
|
|
end
|
|
|
|
b:SetPoint("RIGHT")
|
|
if last then
|
|
b:SetPoint("TOPLEFT", last, "BOTTOMLEFT", 0, 1)
|
|
else
|
|
b:SetPoint("TOPLEFT")
|
|
end
|
|
last = b
|
|
n = i
|
|
end
|
|
|
|
fromList.scrollFrame:SetContentHeight(20, n, -1)
|
|
end
|
|
|
|
local function LoadToDropdown(from)
|
|
local masters, slaves = {}, {}
|
|
|
|
-- update master-slave
|
|
for l, t in pairs(CellDB["layouts"]) do
|
|
local master = t["syncWith"]
|
|
if master then
|
|
if CellDB["layouts"][master] then -- master exists
|
|
if not masters[master] then masters[master] = {} end
|
|
masters[master][l] = true
|
|
slaves[l] = master
|
|
end
|
|
end
|
|
end
|
|
|
|
local indices = {}
|
|
|
|
if slaves[from] then -- if FROM is a slave
|
|
local master = slaves[from]
|
|
for l, t in pairs(CellDB["layouts"]) do
|
|
-- not FROM, not its master, and its siblings
|
|
if l ~= from and l ~= master and not masters[master][l] then
|
|
if l == "default" then
|
|
tinsert(indices, 1, "default")
|
|
else
|
|
tinsert(indices, l)
|
|
end
|
|
end
|
|
end
|
|
elseif masters[from] then -- if FROM is a master
|
|
for l, t in pairs(CellDB["layouts"]) do
|
|
-- not FROM, not its slaves
|
|
if l ~= from and not masters[from][l] then
|
|
if l == "default" then
|
|
tinsert(indices, 1, "default")
|
|
else
|
|
tinsert(indices, l)
|
|
end
|
|
end
|
|
end
|
|
else
|
|
for l, t in pairs(CellDB["layouts"]) do
|
|
-- not FROM
|
|
if l ~= from then
|
|
if l == "default" then
|
|
tinsert(indices, 1, "default")
|
|
else
|
|
tinsert(indices, l)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local toItems = {}
|
|
|
|
for _, l in ipairs(indices) do
|
|
tinsert(toItems, {
|
|
["text"] = l == "default" and _G.DEFAULT or l,
|
|
["value"] = l,
|
|
["onClick"] = function()
|
|
Validate()
|
|
end,
|
|
})
|
|
end
|
|
|
|
toDropdown:SetItems(toItems)
|
|
end
|
|
|
|
local function LoadFromDropdown()
|
|
local fromItems = {}
|
|
|
|
tinsert(fromItems, {
|
|
["text"] = _G.DEFAULT,
|
|
["value"] = "default",
|
|
["onClick"] = function()
|
|
LoadIndicators("default")
|
|
Validate()
|
|
toDropdown:ClearItems()
|
|
LoadToDropdown("default")
|
|
end,
|
|
})
|
|
|
|
for l, t in pairs(CellDB["layouts"]) do
|
|
if l ~= "default" then
|
|
tinsert(fromItems, {
|
|
["text"] = l,
|
|
["onClick"] = function()
|
|
LoadIndicators(l)
|
|
Validate()
|
|
toDropdown:ClearItems()
|
|
LoadToDropdown(l)
|
|
end,
|
|
})
|
|
end
|
|
end
|
|
|
|
fromDropdown:SetItems(fromItems)
|
|
end
|
|
|
|
-------------------------------------------------
|
|
-- scripts
|
|
-------------------------------------------------
|
|
local init
|
|
function F:ShowIndicatorsCopyFrame()
|
|
if not init then
|
|
init = true
|
|
CreateIndicatorsCopyFrame()
|
|
end
|
|
|
|
-- texplore(selectedIndicators)
|
|
LoadFromDropdown()
|
|
toDropdown:ClearItems()
|
|
copyFrame:Show()
|
|
end
|