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.

367 lines
10 KiB

local _G = _G
local tinsert = tinsert
local pairs = pairs
local table = table
local type = type
local CreateFrame = CreateFrame
local IsShiftKeyDown = IsShiftKeyDown
local IsControlKeyDown = IsControlKeyDown
local IsAltKeyDown = IsAltKeyDown
local ReloadUI = ReloadUI
local MovAny = _G.MovAny
local MOVANY = _G.MOVANY
function MovAny:PortDialog(mode, fn)
if not self.portDlg then
self.portDlg = self:CreatePortDialog()
end
self.portDlg:PrepareDialog(mode, fn)
self.portDlg:Show()
self.CreatePortDialog = nil
end
function MovAny:CreatePortDialog()
local fn = "MAPortDialog"
local pd = CreateFrame("Frame", fn, _G.UIParent, BackdropTemplateMixin and "BackdropTemplate")
tinsert(_G.UISpecialFrames, fn)
pd:SetSize(370, 130)
pd:SetFrameStrata("FULLSCREEN_DIALOG")
pd:SetFrameLevel(1)
pd:SetPoint("CENTER")
pd:EnableMouse(true)
pd:SetMovable(true)
pd:RegisterForDrag("LeftButton")
pd:SetScript("OnDragStart", pd.StartMoving)
pd:SetScript("OnDragStop", pd.StopMovingOrSizing)
pd:SetBackdrop({
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
tile = "true",
tileSize = 32,
})
pd:SetBackdropColor(0, 0, 0)
pd:SetBackdropBorderColor(0, 0, 0)
local closeButton = CreateFrame("Button", fn.."Close", pd, "MAButtonTemplate")
closeButton:SetText("X")
closeButton:SetSize(20, 20)
closeButton:SetPoint("TOPRIGHT", -1, 0)
closeButton:SetScript("OnClick", function()
pd:CloseDialog()
end)
local actionLabel = pd:CreateFontString()
actionLabel:SetFontObject("GameFontNormalSmall")
actionLabel:SetSize(100, 20)
actionLabel:SetJustifyH("LEFT")
actionLabel:SetPoint("TOPLEFT", pd, "TOPLEFT", 12, -8)
local frameNameLabel = pd:CreateFontString()
frameNameLabel:SetFontObject("GameFontNormalSmall")
frameNameLabel:SetSize(150, 20)
frameNameLabel:SetJustifyH("LEFT")
frameNameLabel:SetPoint("TOPLEFT", pd, "TOPLEFT", 62, -8)
local dirLabel = pd:CreateFontString()
dirLabel:SetFontObject("GameFontNormalSmall")
dirLabel:SetSize(40, 20)
dirLabel:SetJustifyH("LEFT")
dirLabel:SetPoint("TOPLEFT", actionLabel, "BOTTOMLEFT", 0, 0)
local profileCheck = CreateFrame("CheckButton", fn.."Enabled", pd, "MACheckButtonTemplate")
local profileDropDownButton = MSA_DropDownMenu_Create(fn.."Profile", pd)
local profileNoneLabel = pd:CreateFontString()
local textCheck = CreateFrame("CheckButton", fn.."Enabled", pd, "MACheckButtonTemplate")
local textEditBox = CreateFrame("EditBox", fn.."TextEdit", pd, "InputBoxTemplate")
local actionButton = CreateFrame("Button", fn.."ExportButton", pd, "MAButtonTemplate")
local profileFunc = function(self)
MSA_DropDownMenu_SetSelectedName(profileDropDownButton, self.value)
end
profileCheck:SetPoint("TOPLEFT", dirLabel, "TOPRIGHT", 9, -2)
profileCheck:SetScript("OnClick", function(self)
if not self:GetChecked() then
self:SetChecked(true)
return
end
textEditBox:Hide()
textCheck:SetChecked(nil)
if pd.profileFound then
profileDropDownButton:Show()
actionButton:Enable()
else
profileNoneLabel:Show()
actionButton:Disable()
end
end)
local profileLabel = pd:CreateFontString()
profileLabel:SetFontObject("GameFontNormalSmall")
profileLabel:SetHeight(20)
profileLabel:SetJustifyH("LEFT")
profileLabel:SetPoint("TOPLEFT", profileCheck, "TOPRIGHT", 1, 2)
profileLabel:SetText("Profile")
textCheck:SetPoint("TOPLEFT", profileLabel, "TOPRIGHT", 9, -2)
textCheck:SetScript("OnClick", function(self)
if not self:GetChecked() then
self:SetChecked(true)
return
end
profileCheck:SetChecked(nil)
if pd.profileFound then
profileDropDownButton:Hide()
else
profileNoneLabel:Hide()
end
textEditBox:Show()
if pd.mode == 1 then
actionButton:Disable()
textEditBox:SetText("")
elseif pd.mode == 2 then
actionButton:Disable()
if pd.fn then
textEditBox:SetText(MovAny:SerializeFrame(pd.fn))
else
textEditBox:SetText(MovAny:SerializeProfile(MovAny:GetProfileName()))
end
end
textEditBox:SetFocus()
end)
local textLabel = pd:CreateFontString()
textLabel:SetFontObject("GameFontNormalSmall")
textLabel:SetHeight(20)
textLabel:SetJustifyH("LEFT")
textLabel:SetPoint("TOPLEFT", textCheck, "TOPRIGHT", 1, 2)
textLabel:SetText("Text String")
profileDropDownButton:SetPoint("TOPLEFT", dirLabel, "BOTTOMLEFT", 0, -10)
MSA_DropDownMenu_SetWidth(profileDropDownButton, 200)
profileNoneLabel:SetFontObject("GameFontNormalSmall")
profileNoneLabel:SetHeight(20)
profileNoneLabel:SetJustifyH("LEFT")
profileNoneLabel:SetPoint("TOPLEFT", dirLabel, "BOTTOMLEFT", 0, -10)
profileNoneLabel:SetText("No profiles has modified this frame")
textEditBox:SetFontObject("GameFontHighlightSmall")
textEditBox:SetSize(311, 20)
textEditBox:SetJustifyH("LEFT")
textEditBox:SetAutoFocus(false)
textEditBox:SetPoint("TOPLEFT", dirLabel, "BOTTOMLEFT", 0, -10)
textEditBox:SetScript("OnTextChanged", function(self)
if pd.mode == 2 then
return
end
local text = self:GetText()
if text ~= nil and text ~= "" then
actionButton:Enable()
else
actionButton:Disable()
end
end)
actionButton:SetSize(75, 22)
actionButton:SetPoint("BOTTOMRIGHT", pd, "BOTTOMRIGHT", -8, 10)
actionButton:SetScript("OnClick", function()
if pd.mode == 1 then
if pd.fn then
if textEditBox:IsShown() then
local opt = MovAny:UnserializeFrame(textEditBox:GetText(), pd.fn)
if opt then
MADB.profiles[MovAny:GetProfileName()].frames[pd.fn] = opt
local e = MovAny.API:GetElement(pd.fn)
e:Sync()
pd:CloseDialog()
MovAny:UpdateGUIIfShown(true)
end
else
-- import pd.fn from selected profile
local pn = MSA_DropDownMenu_GetSelectedName(profileDropDownButton)
local p = MADB.profiles[pn]
local oldOpt = MADB.profiles[MovAny:GetProfileName()].frames[pd.fn]
if type(p) == "table" then
if oldOpt then
MovAny:ResetFrame(pd.fn, nil, true)
end
local opt = MA_tdeepcopy(p.frames[pd.fn])
MADB.profiles[MovAny:GetProfileName()].frames[pd.fn] = opt
local e = MovAny.API:GetElement(pd.fn)
if e then
e:SetUserData(opt)
MovAny.pendingFrames[pd.fn] = e
end
MovAny:SyncFrames()
pd:CloseDialog()
MovAny:UpdateGUIIfShown(true)
end
end
else
if textEditBox:IsShown() then
if MovAny:UnserializeProfile(textEditBox:GetText()) then
MovAny:UpdateGUIIfShown(true)
pd:CloseDialog()
end
else
-- import selected profile
local pn = MSA_DropDownMenu_GetSelectedName(profileDropDownButton)
MovAny:ResetProfile(true)
MovAny:CopyProfile(pn, MovAny:GetProfileName())
MovAny:SyncAllFrames()
pd:CloseDialog()
MovAny:UpdateGUIIfShown(true)
end
end
elseif pd.mode == 2 then
if pd.fn then
if not textEditBox:IsShown() then
--export pd.fn to selected profile
local pn = MSA_DropDownMenu_GetSelectedName(profileDropDownButton)
local p = MADB.profiles[MovAny:GetProfileName()]
if type(p) == "table" then
MADB.profiles[pn].frames[pd.fn] = MA_tdeepcopy(p.frames[pd.fn])
end
pd:CloseDialog()
end
else
if not textEditBox:IsShown() then
-- export profile to selected profile
MovAny:CopyProfile(MovAny:GetProfileName(), MSA_DropDownMenu_GetSelectedName(profileDropDownButton))
pd:CloseDialog()
end
end
end
end)
pd.PrepareDialog = function(self, mode, fn)
self.mode = mode
self.fn = fn
local s = ""
local dir = ""
if mode == 1 then
s = "Import"
dir = "From"
else
s = "Export"
dir = "To"
end
actionButton:SetText(s)
if fn then
s = s..":"
else
s = s.." profile"
end
actionLabel:SetText(s)
if fn then
frameNameLabel:SetText(fn)
frameNameLabel:Show()
profileNoneLabel:SetText("No profile has modified this frame")
else
frameNameLabel:Hide()
profileNoneLabel:SetText("No profiles available")
end
dirLabel:SetText(dir..":")
profileCheck:SetChecked(true)
textCheck:SetChecked(nil)
profileDropDownButton:Show()
textEditBox:Hide()
actionButton:Enable()
local profileDropDown_MenuInit = function()
local info
local names = { }
for name, profile in pairs(MADB.profiles) do
if name ~= "default" and name ~= MovAny:GetProfileName() then
if not pd.fn or (pd.mode == 1 and pd.fn and profile.frames[pd.fn]) or (pd.mode == 2) then
tinsert(names, name)
end
end
end
table.sort(names, function(o1, o2)
return o1:lower() < o2:lower()
end)
if MovAny:GetProfileName() ~= "default" and ((pd.mode == 1 and pd.fn and MADB.profiles["default"].frames[pd.fn]) or (pd.mode == 1 and not pd.fn) or pd.mode == 2) then
info = MSA_DropDownMenu_CreateInfo()
info.text = "default"
info.value = "default"
info.func = profileFunc
MSA_DropDownMenu_AddButton(info)
end
for _, name in pairs(names) do
info = MSA_DropDownMenu_CreateInfo()
info.text = name
info.value = name
info.func = profileFunc
MSA_DropDownMenu_AddButton(info)
end
end
MSA_DropDownMenu_Initialize(profileDropDownButton, profileDropDown_MenuInit)
local selProfile
if MovAny:GetProfileName() ~= "default" and ((pd.mode == 1 and pd.fn and MADB.profiles["default"].frames[pd.fn]) or (pd.mode == 1 and not pd.fn) or pd.mode == 2) then
selProfile = "default"
else
local names = { }
for name, profile in pairs(MADB.profiles) do
if name ~= "default" and name ~= MovAny:GetProfileName() then
if not pd.fn or (pd.mode == 1 and pd.fn and profile.frames[pd.fn]) or (pd.mode == 2) then
tinsert(names, name)
end
end
end
table.sort(names, function(o1, o2)
return o1:lower() < o2:lower()
end)
for _, name in pairs(names) do
selProfile = name
break
end
end
if selProfile == nil then
pd.profileFound = nil
profileDropDownButton:Hide()
profileNoneLabel:Show()
actionButton:Disable()
else
pd.profileFound = true
profileDropDownButton:Show()
profileNoneLabel:Hide()
actionButton:Enable()
MSA_DropDownMenu_SetSelectedName(profileDropDownButton, selProfile)
end
end
pd.CloseDialog = function(self)
if IsShiftKeyDown() and IsControlKeyDown() and IsAltKeyDown() then
ReloadUI()
else
self:Hide()
end
end
pd.Reload = function(self)
self:PrepareDialog(self.mode, self.fn)
end
return pd
end