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.
170 lines
6.3 KiB
170 lines
6.3 KiB
local _, Cell = ...
|
|
local L = Cell.L
|
|
local F = Cell.funcs
|
|
local P = Cell.pixelPerfectFuncs
|
|
|
|
local Serializer = LibStub:GetLibrary("LibSerialize")
|
|
local LibDeflate = LibStub:GetLibrary("LibDeflate")
|
|
local deflateConfig = {level = 9}
|
|
|
|
local isImport, imported, exported = false, {}, ""
|
|
|
|
local importExportFrame, importBtn, title, textArea
|
|
|
|
local function DoImport()
|
|
if Cell.vars.clickCastings["useCommon"] then
|
|
Cell.vars.clickCastings["common"] = imported
|
|
else
|
|
Cell.vars.clickCastings[Cell.vars.playerSpecID] = imported
|
|
end
|
|
|
|
Cell:Fire("UpdateClickCastings")
|
|
importExportFrame:Hide()
|
|
end
|
|
|
|
local function CreateClickCastingImportExportFrame()
|
|
importExportFrame = CreateFrame("Frame", "CellOptionsFrame_ClickCastingsImportExport", Cell.frames.clickCastingsTab, "BackdropTemplate")
|
|
importExportFrame:Hide()
|
|
Cell:StylizeFrame(importExportFrame, nil, Cell:GetAccentColorTable())
|
|
importExportFrame:EnableMouse(true)
|
|
importExportFrame:SetFrameLevel(Cell.frames.clickCastingsTab:GetFrameLevel() + 50)
|
|
P:Size(importExportFrame, 430, 170)
|
|
importExportFrame:SetPoint("TOPLEFT", P:Scale(1), -160)
|
|
|
|
if not Cell.frames.clickCastingsTab.mask then
|
|
Cell:CreateMask(Cell.frames.clickCastingsTab, nil, {1, -1, -1, 1})
|
|
Cell.frames.clickCastingsTab.mask:Hide()
|
|
end
|
|
|
|
-- close
|
|
local closeBtn = Cell:CreateButton(importExportFrame, "×", "red", {18, 18}, false, false, "CELL_FONT_SPECIAL", "CELL_FONT_SPECIAL")
|
|
closeBtn:SetPoint("TOPRIGHT", P:Scale(-5), P:Scale(-1))
|
|
closeBtn:SetScript("OnClick", function() importExportFrame:Hide() end)
|
|
|
|
-- import
|
|
importBtn = Cell:CreateButton(importExportFrame, L["Import"], "green", {57, 18})
|
|
importBtn:Hide()
|
|
importBtn:SetPoint("TOPRIGHT", closeBtn, "TOPLEFT", P:Scale(1), 0)
|
|
importBtn:SetScript("OnClick", function()
|
|
-- lower frame level
|
|
importExportFrame:SetFrameLevel(Cell.frames.clickCastingsTab:GetFrameLevel() + 20)
|
|
|
|
local popup = Cell:CreateConfirmPopup(Cell.frames.clickCastingsTab, 200, L["Overwrite Click-Casting"].."?", function(self)
|
|
DoImport()
|
|
end, nil, true)
|
|
popup:SetPoint("TOPLEFT", importExportFrame, 117, -50)
|
|
textArea.eb:ClearFocus()
|
|
end)
|
|
|
|
-- title
|
|
title = importExportFrame:CreateFontString(nil, "OVERLAY", "CELL_FONT_CLASS")
|
|
title:SetPoint("TOPLEFT", 5, -5)
|
|
|
|
-- textArea
|
|
textArea = Cell:CreateScrollEditBox(importExportFrame, function(eb, userChanged)
|
|
if userChanged then
|
|
if isImport then
|
|
imported = {}
|
|
local text = eb:GetText()
|
|
-- check
|
|
local version, class, data = string.match(text, "^!CELL:(%d+):CLICKCASTING:([^:]+)!(.+)$")
|
|
version = tonumber(version)
|
|
|
|
if class and version and data then
|
|
if version >= Cell.MIN_CLICKCASTINGS_VERSION then
|
|
local success
|
|
data = LibDeflate:DecodeForPrint(data) -- decode
|
|
success, data = pcall(LibDeflate.DecompressDeflate, LibDeflate, data) -- decompress
|
|
success, data = Serializer:Deserialize(data) -- deserialize
|
|
|
|
if success and data then
|
|
title:SetText(L["Import"]..": "..F:GetClassColorStr(class)..F:GetLocalizedClassName(class))
|
|
imported = data
|
|
importBtn:SetEnabled(class == Cell.vars.playerClass)
|
|
else
|
|
title:SetText(L["Import"]..": |cffff2222"..L["Error"])
|
|
importBtn:SetEnabled(false)
|
|
end
|
|
else -- incompatible version
|
|
title:SetText(L["Import"]..": |cffff2222"..L["Incompatible Version"])
|
|
importBtn:SetEnabled(false)
|
|
end
|
|
else
|
|
title:SetText(L["Import"]..": |cffff2222"..L["Error"])
|
|
importBtn:SetEnabled(false)
|
|
end
|
|
else
|
|
eb:SetText(exported)
|
|
eb:SetCursorPosition(0)
|
|
eb:HighlightText()
|
|
end
|
|
end
|
|
end)
|
|
Cell:StylizeFrame(textArea.scrollFrame, {0, 0, 0, 0}, Cell:GetAccentColorTable())
|
|
textArea:SetPoint("TOPLEFT", P:Scale(5), P:Scale(-20))
|
|
textArea:SetPoint("BOTTOMRIGHT", P:Scale(-5), P:Scale(5))
|
|
|
|
-- highlight text
|
|
textArea.eb:SetScript("OnEditFocusGained", function() textArea.eb:HighlightText() end)
|
|
textArea.eb:SetScript("OnMouseUp", function()
|
|
if not isImport then
|
|
textArea.eb:HighlightText()
|
|
end
|
|
end)
|
|
|
|
importExportFrame:SetScript("OnHide", function()
|
|
importExportFrame:Hide()
|
|
isImport = false
|
|
exported = ""
|
|
imported = {}
|
|
-- hide mask
|
|
Cell.frames.clickCastingsTab.mask:Hide()
|
|
end)
|
|
|
|
importExportFrame:SetScript("OnShow", function()
|
|
-- raise frame level
|
|
importExportFrame:SetFrameLevel(Cell.frames.clickCastingsTab:GetFrameLevel() + 50)
|
|
Cell.frames.clickCastingsTab.mask:Show()
|
|
end)
|
|
end
|
|
|
|
local init
|
|
function F:ShowClickCastingImportFrame()
|
|
if not init then
|
|
init = true
|
|
CreateClickCastingImportExportFrame()
|
|
end
|
|
|
|
importExportFrame:Show()
|
|
isImport = true
|
|
importBtn:Show()
|
|
importBtn:SetEnabled(false)
|
|
|
|
exported = ""
|
|
title:SetText(L["Import"])
|
|
textArea:SetText("")
|
|
textArea.eb:SetFocus(true)
|
|
end
|
|
|
|
function F:ShowClickCastingExportFrame(clickCastingTable)
|
|
if not init then
|
|
init = true
|
|
CreateClickCastingImportExportFrame()
|
|
end
|
|
|
|
importExportFrame:Show()
|
|
isImport = false
|
|
importBtn:Hide()
|
|
|
|
title:SetText(L["Export"]..": "..F:GetClassColorStr(Cell.vars.playerClass)..F:GetLocalizedClassName(Cell.vars.playerClass))
|
|
|
|
local prefix = "!CELL:"..Cell.versionNum..":CLICKCASTING:"..Cell.vars.playerClass.."!"
|
|
|
|
exported = Serializer:Serialize(clickCastingTable) -- serialize
|
|
exported = LibDeflate:CompressDeflate(exported, deflateConfig) -- compress
|
|
exported = LibDeflate:EncodeForPrint(exported) -- encode
|
|
exported = prefix..exported
|
|
|
|
textArea:SetText(exported)
|
|
textArea.eb:SetFocus(true)
|
|
end
|