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
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
|
|
|