mirror of
https://github.com/brues-code/pfUI.git
synced 2026-10-31 16:06:57 +00:00
RunOOC never waited for combat to end; it ran its function on the next frame. QueueFunction ran one function every 0.2 seconds. Each caller now defers with ClassicAPI's RunNextFrame. The loot roll announcement sends its name lists and the roll directly. The 0.2 second spacing did not help with the server's chat flood limit (10 messages less than a second apart), and an announcement is at most four messages.
749 lines
26 KiB
Lua
749 lines
26 KiB
Lua
pfUI:RegisterModule("unlock", function ()
|
|
local rawborder, default_border = GetBorderSize()
|
|
|
|
-- grouped frames
|
|
local clusters = {
|
|
-- Name Shift Ctrl
|
|
{ "pfCombo", 5 },
|
|
{ "pfRaid", 40, 5 },
|
|
{ "pfRaidPet", 40, 5 },
|
|
{ "pfGroup", 4 },
|
|
{ "pfLootRollFrame", 4 },
|
|
}
|
|
|
|
local anchors = {
|
|
"TOPLEFT", "TOP", "TOPRIGHT", "RIGHT", "BOTTOMRIGHT", "BOTTOM", "BOTTOMLEFT", "LEFT", "CENTER"
|
|
}
|
|
|
|
|
|
local spanframe = CreateFrame("Frame", "pfUnlockSelector", UIParent)
|
|
spanframe:Hide()
|
|
|
|
-- frame labels and their config section relation
|
|
local frame_configs = {
|
|
-- unitframes
|
|
["Player"] = { T["Unit Frames"], T["Player"] },
|
|
["Target"] = { T["Unit Frames"], T["Target"] },
|
|
["TargetTarget"] = { T["Unit Frames"], T["Target-Target"] },
|
|
["TargetTargetTarget"] = { T["Unit Frames"], T["Target-Target-Target"] },
|
|
["Pet"] = { T["Unit Frames"], T["Pet"] },
|
|
["PetTarget"] = { T["Unit Frames"], T["Pet-Target"] },
|
|
["Focus"] = { T["Unit Frames"], T["Focus"] },
|
|
|
|
-- combopoints
|
|
["Combo%d"] = { T["Unit Frames"], T["General"] },
|
|
|
|
-- groupframes
|
|
["Raid%d"] = { T["Group Frames"], T["Raid"] },
|
|
["Raid%d%d"] = { T["Group Frames"], T["Raid"] },
|
|
["RaidPet%d"] = { T["Group Frames"], T["Raid-Pet"] },
|
|
["RaidPet%d%d"] = { T["Group Frames"], T["Raid-Pet"] },
|
|
["Group%d"] = { T["Group Frames"], T["Group"] },
|
|
["Party%dTarget"] = { T["Group Frames"], T["Group-Target"] },
|
|
["PartyPet%d"] = { T["Group Frames"], T["Group-Pet"] },
|
|
|
|
-- chat
|
|
["ChatLeft"] = { T["Chat"], nil },
|
|
["ChatRight"] = { T["Chat"], nil },
|
|
["ChatInputBox"] = { T["Chat"], nil },
|
|
|
|
-- loot
|
|
["LootRollFrame%d"] = { T["Loot"], nil },
|
|
|
|
-- panel
|
|
["PanelLeft"] = { T["Panel"], T["General"] },
|
|
["PanelRight"] = { T["Panel"], T["General"] },
|
|
["PanelMinimap"] = { T["Panel"], T["General"] },
|
|
["PanelMicroButton"] = { T["Panel"], T["General"] },
|
|
|
|
-- actionbar
|
|
["ActionBarMain"] = { T["Actionbar"], T["Main Actionbar"]},
|
|
["ActionBarPaging"] = { T["Actionbar"], T["Paging Actionbar"]},
|
|
["ActionBarRight"] = { T["Actionbar"], T["Right Actionbar"]},
|
|
["ActionBarVertical"] = { T["Actionbar"], T["Vertical Actionbar"]},
|
|
["ActionBarLeft"] = { T["Actionbar"], T["Left Actionbar"]},
|
|
["ActionBarTop"] = { T["Actionbar"], T["Top Actionbar"]},
|
|
["ActionBarStanceBar1"] = { T["Actionbar"], T["Stance Bar 1"]},
|
|
["ActionBarStanceBar2"] = { T["Actionbar"], T["Stance Bar 2"]},
|
|
["ActionBarStanceBar3"] = { T["Actionbar"], T["Stance Bar 3"]},
|
|
["ActionBarStanceBar4"] = { T["Actionbar"], T["Stance Bar 4"]},
|
|
["ActionBarStances"] = { T["Actionbar"], T["Stance/Shapeshift Actionbar"]},
|
|
["ActionBarPet"] = { T["Actionbar"], T["Pet Actionbar"]},
|
|
|
|
-- castbar
|
|
["TargetCastbar"] = { T["Castbar"], nil },
|
|
["PlayerCastbar"] = { T["Castbar"], nil },
|
|
["FocusCastbar"] = { T["Castbar"], nil },
|
|
|
|
-- minimap
|
|
["Minimap"] = { T["Minimap"], T["Minimap"] },
|
|
["UITracking"] = { T["Minimap"], T["Minimap"] },
|
|
|
|
-- buffs
|
|
["BuffFrame"] = { T["Buffs"], T["Buff/Debuff Icons"] },
|
|
["DebuffFrame"] = { T["Buffs"], T["Buff/Debuff Icons"] },
|
|
|
|
-- buffbars
|
|
["PlayerBuffBar"] = { T["Buffs"], T["Player Buff Bar"] },
|
|
["PlayerDebuffBar"] = { T["Buffs"], T["Player Debuff Bar"] },
|
|
["TargetDebuffBar"] = { T["Buffs"], T["Target Debuff Bar"] },
|
|
}
|
|
|
|
local function GetFrames()
|
|
-- Return frames based on Ctrl and Shift state
|
|
-- 'this' [frame] the base frame
|
|
-- return [list] all frames that should be selected
|
|
|
|
local frame = this.frame
|
|
local frames = { frame }
|
|
|
|
if IsShiftKeyDown() or IsControlKeyDown() then
|
|
-- search and add clustered frames
|
|
for id, cluster in pairs(clusters) do
|
|
local len = strlen(cluster[1])
|
|
local fid = tonumber(strsub(frame:GetName(),len+1,len+2))
|
|
if fid and strsub(frame:GetName(),0,len) == cluster[1] then
|
|
if IsShiftKeyDown() and cluster[2] then
|
|
for i = 1, cluster[2] do
|
|
if _G[cluster[1] .. i] ~= frame then
|
|
table.insert(frames, _G[cluster[1] .. i])
|
|
end
|
|
end
|
|
elseif IsControlKeyDown() and cluster[3] then
|
|
local id = fid
|
|
|
|
local b = 1
|
|
for i = cluster[3]+1, cluster[2], cluster[3] do
|
|
b = ( id >= i ) and i or b
|
|
end
|
|
|
|
for i = b, b + cluster[3] - 1 do
|
|
if _G[cluster[1] .. i] ~= frame then
|
|
table.insert(frames, _G[cluster[1] .. i])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return frames
|
|
end
|
|
|
|
local function SaveScale(frame, scale)
|
|
frame:SetScale(scale)
|
|
|
|
if not C.position[frame:GetName()] then
|
|
C.position[frame:GetName()] = {}
|
|
end
|
|
C.position[frame:GetName()]["scale"] = scale
|
|
|
|
frame.drag.text:SetText(T["Scale"] .. ": " .. scale)
|
|
frame.drag.fade:Stop()
|
|
frame.drag.fade:Play()
|
|
end
|
|
|
|
local function SavePosition(frame)
|
|
SaveMovable(frame)
|
|
UpdateMovable(frame)
|
|
end
|
|
|
|
local function DrawGrid()
|
|
local grid = CreateFrame("Frame", this:GetName() .. "Grid", pfUI.unlock)
|
|
grid:SetAllPoints(this)
|
|
|
|
local size = 1
|
|
local line = {}
|
|
|
|
local width = GetScreenWidth()
|
|
local height = GetScreenHeight()
|
|
|
|
local ratio = width / GetScreenHeight()
|
|
local rheight = GetScreenHeight() * ratio
|
|
|
|
local wStep = width / 128
|
|
local hStep = rheight / 128
|
|
|
|
-- vertical lines
|
|
for i = 0, 128 do
|
|
if i == 128 / 2 then
|
|
line = grid:CreateTexture(nil, 'BORDER')
|
|
line:SetColorTexture(.1, .5, .4)
|
|
else
|
|
line = grid:CreateTexture(nil, 'BACKGROUND')
|
|
line:SetColorTexture(0, 0, 0, .5)
|
|
end
|
|
line:SetPoint("TOPLEFT", grid, "TOPLEFT", i*wStep - (size/2), 0)
|
|
line:SetPoint('BOTTOMRIGHT', grid, 'BOTTOMLEFT', i*wStep + (size/2), 0)
|
|
end
|
|
|
|
-- horizontal lines
|
|
for i = 1, floor(height/hStep) do
|
|
if i == floor(height/hStep / 2) then
|
|
line = grid:CreateTexture(nil, 'BORDER')
|
|
line:SetColorTexture(.1, .5, .4)
|
|
else
|
|
line = grid:CreateTexture(nil, 'BACKGROUND')
|
|
line:SetColorTexture(0, 0, 0)
|
|
end
|
|
|
|
line:SetPoint("TOPLEFT", grid, "TOPLEFT", 0, -(i*hStep) + (size/2))
|
|
line:SetPoint('BOTTOMRIGHT', grid, 'TOPRIGHT', 0, -(i*hStep + size/2))
|
|
end
|
|
|
|
return grid
|
|
end
|
|
|
|
local function GetConfigTable(dlabel)
|
|
local cat, conf = nil, nil
|
|
for label, config in pairs(frame_configs) do
|
|
if string.gsub(dlabel, label, "") == "" then
|
|
cat, conf = config[1], config[2]
|
|
end
|
|
end
|
|
|
|
return cat, conf
|
|
end
|
|
|
|
local function OpenConfigDialog(category, view)
|
|
pfUI.gui:Show()
|
|
|
|
if not pfUI.gui.frames[category] then return end
|
|
pfUI.gui.frames[category]:Click()
|
|
|
|
if not view or not pfUI.gui.frames[category][view] then return end
|
|
pfUI.gui.frames[category][view]:Click()
|
|
end
|
|
|
|
local function UpdateDockValues()
|
|
if not pfUI.unlock.dock:IsShown() then return end
|
|
|
|
local dock = pfUI.unlock.dock
|
|
local drag = dock.parent
|
|
local frame = drag.frame
|
|
|
|
-- update dock position
|
|
SetAutoPoint(dock, drag, default_border*2+2)
|
|
|
|
-- update dock entries
|
|
dock.title:SetText(drag.label)
|
|
if pfUI_config["position"] and pfUI_config["position"][drag.fname] and pfUI_config["position"][drag.fname]["xpos"] then
|
|
dock.xcoord:SetText(pfUI_config["position"][drag.fname]["xpos"])
|
|
dock.ycoord:SetText(pfUI_config["position"][drag.fname]["ypos"])
|
|
dock.reset:SetText(T["Reset"])
|
|
|
|
dock.up:Enable()
|
|
dock.down:Enable()
|
|
dock.left:Enable()
|
|
dock.right:Enable()
|
|
|
|
dock.up.texture:SetVertexColor(1,.8,0)
|
|
dock.down.texture:SetVertexColor(1,.8,0)
|
|
dock.left.texture:SetVertexColor(1,.8,0)
|
|
dock.right.texture:SetVertexColor(1,.8,0)
|
|
else
|
|
dock.reset:SetText(T["Unlock"])
|
|
dock.xcoord:SetText(T["N/A"])
|
|
dock.ycoord:SetText(T["N/A"])
|
|
|
|
dock.up:Disable()
|
|
dock.down:Disable()
|
|
dock.left:Disable()
|
|
dock.right:Disable()
|
|
|
|
dock.up.texture:SetVertexColor(.4,.4,.4)
|
|
dock.down.texture:SetVertexColor(.4,.4,.4)
|
|
dock.left.texture:SetVertexColor(.4,.4,.4)
|
|
dock.right.texture:SetVertexColor(.4,.4,.4)
|
|
end
|
|
|
|
-- show the saved anchor, or none for a frame without a saved position
|
|
dock.anchor:GenerateMenu()
|
|
|
|
-- update config button
|
|
local cat, conf = GetConfigTable(drag.label)
|
|
if cat then
|
|
dock.config:Enable()
|
|
else
|
|
dock.config:Disable()
|
|
end
|
|
end
|
|
|
|
local function SetDockToFrame(frame)
|
|
if pfUI.unlock.dock.parent then
|
|
-- reset previous border color
|
|
CreateBackdrop(pfUI.unlock.dock.parent, nil, nil, .8)
|
|
end
|
|
|
|
-- add the new frame
|
|
pfUI.unlock.dock.parent = frame
|
|
|
|
if frame then
|
|
pfUI.unlock.dock.parent.backdrop:SetBackdropBorderColor(.2,1,.8,1)
|
|
pfUI.unlock.dock:Show()
|
|
UpdateDockValues()
|
|
else
|
|
pfUI.unlock.dock:Hide()
|
|
end
|
|
end
|
|
|
|
local function DraggerOnMouseWheel()
|
|
local frame = this.frame
|
|
local scale = round(frame:GetScale() + arg1/10, 1)
|
|
|
|
pfUI.unlock.selection = GetFrames()
|
|
for id, frame in pairs(pfUI.unlock.selection) do
|
|
SaveScale(frame, scale)
|
|
end
|
|
|
|
-- repaint hackfix for panels
|
|
if pfUI.panel and pfUI.chat then
|
|
pfUI.panel.left:SetScale(pfUI.chat.left:GetScale())
|
|
pfUI.panel.right:SetScale(pfUI.chat.right:GetScale())
|
|
end
|
|
|
|
if frame.OnMove then frame:OnMove() end
|
|
RunNextFrame(UpdateDockValues)
|
|
end
|
|
|
|
local function DraggerOnDragStart()
|
|
local frame = this.frame
|
|
|
|
pfUI.unlock.selection = GetFrames()
|
|
|
|
for id, frame in pairs(pfUI.unlock.selection) do
|
|
frame:StartMoving()
|
|
frame:StopMovingOrSizing()
|
|
frame.drag.backdrop:SetBackdropBorderColor(.2,1,.8,1)
|
|
end
|
|
|
|
local anchor, _, _, xpos, ypos = frame:GetPoint()
|
|
frame.oldPos = { xpos, ypos, anchor }
|
|
frame:StartMoving()
|
|
|
|
if frame.OnMove then frame:OnMove() end
|
|
end
|
|
|
|
local function DraggerOnDragStop()
|
|
local frame = this.frame
|
|
local name = this.fname
|
|
|
|
frame:StopMovingOrSizing()
|
|
|
|
-- calculate and move selection offsets
|
|
local anchor, xpos, ypos = ConvertFrameAnchor(frame, frame.oldPos[3])
|
|
local diffxpos = frame.oldPos[1] - xpos
|
|
local diffypos = frame.oldPos[2] - ypos
|
|
|
|
for id, frame in pairs(pfUI.unlock.selection) do
|
|
frame:SetParent("UIParent")
|
|
if frame:GetName() ~= name then
|
|
local anchor, _, _, xpos, ypos = frame:GetPoint()
|
|
frame:SetPoint(anchor or "TOPLEFT", xpos - diffxpos, ypos - diffypos)
|
|
end
|
|
end
|
|
|
|
-- detect best anchor
|
|
local bestanchor = "TOPLEFT"
|
|
local left, top, right, bottom
|
|
spanframe:ClearAllPoints()
|
|
|
|
for id, frame in pairs(pfUI.unlock.selection) do
|
|
if not left or frame:GetLeft() < left then
|
|
spanframe:SetPoint("LEFT", frame, "LEFT", 0, 0)
|
|
left = frame:GetLeft()
|
|
end
|
|
if not top or frame:GetTop() > top then
|
|
top = frame:GetTop()
|
|
spanframe:SetPoint("TOP", frame, "TOP", 0, 0)
|
|
end
|
|
if not right or frame:GetRight() > right then
|
|
right = frame:GetRight()
|
|
spanframe:SetPoint("RIGHT", frame, "RIGHT", 0, 0)
|
|
end
|
|
if not bottom or frame:GetBottom() < bottom then
|
|
bottom = frame:GetBottom()
|
|
spanframe:SetPoint("BOTTOM", frame, "BOTTOM", 0, 0)
|
|
end
|
|
end
|
|
bestanchor = GetBestAnchor(spanframe)
|
|
|
|
-- save all frame positions
|
|
for id, frame in pairs(pfUI.unlock.selection) do
|
|
CreateBackdrop(frame.drag, nil, nil, .8)
|
|
local anchor, x, y = ConvertFrameAnchor(frame, bestanchor)
|
|
frame:ClearAllPoints()
|
|
frame:SetPoint(anchor, UIParent, anchor, x, y)
|
|
SavePosition(frame)
|
|
end
|
|
|
|
this.backdrop:SetBackdropBorderColor(1,1,1,1)
|
|
UpdateDockValues()
|
|
end
|
|
|
|
local function DraggerOnClick()
|
|
if arg1 == "RightButton" then
|
|
-- add dockframe to the dragger to show advanced options
|
|
if pfUI.unlock.dock.parent == this and pfUI.unlock.dock:IsShown() then
|
|
SetDockToFrame(nil)
|
|
else
|
|
SetDockToFrame(this)
|
|
end
|
|
return
|
|
elseif arg1 == "MiddleButton" then
|
|
-- reset positions of dragger and all connected frames
|
|
pfUI.unlock.selection = GetFrames()
|
|
for id, frame in pairs(pfUI.unlock.selection) do
|
|
pfUI_config["position"][frame:GetName()] = nil
|
|
UpdateMovable(frame)
|
|
|
|
if frame.OnMove then frame:OnMove() end
|
|
end
|
|
UpdateDockValues()
|
|
end
|
|
end
|
|
|
|
local function DraggerOnEnter()
|
|
if pfUI.unlock.dock.parent ~= this then
|
|
this.backdrop:SetBackdropBorderColor(1,1,1,1)
|
|
end
|
|
end
|
|
|
|
local function DraggerOnLeave()
|
|
if pfUI.unlock.dock.parent ~= this then
|
|
CreateBackdrop(this, nil, nil, .8)
|
|
end
|
|
end
|
|
|
|
local function CreateDragger(f)
|
|
local fname = f:GetName()
|
|
local label = string.sub(fname, 1, 2) == "pf" and strsub(fname,3) or fname
|
|
|
|
local d = CreateFrame("Button", fname .. "Drag", f)
|
|
d:RegisterForClicks("MiddleButtonUp", "RightButtonUp")
|
|
d:RegisterForDrag("LeftButton")
|
|
d:SetAllPoints(f)
|
|
d:SetAlpha(1)
|
|
d:EnableMouseWheel(1)
|
|
|
|
d:SetFrameLevel(128)
|
|
|
|
d.text = d:CreateFontString("Status", "LOW", "GameFontNormal")
|
|
d.text:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
d.text:ClearAllPoints()
|
|
d.text:SetAllPoints(d)
|
|
d.text:SetPoint("CENTER", 0, 0)
|
|
d.text:SetFontObject(GameFontWhite)
|
|
|
|
-- Fades out the scale readout, then puts the frame name back
|
|
d.fade = d.text:CreateAnimationGroup()
|
|
local fade = d.fade:CreateAnimation("Alpha")
|
|
fade:SetChange(-1)
|
|
fade:SetDuration(.3)
|
|
d.fade:SetScript("OnFinished", function()
|
|
d.text:SetText(strsub(f:GetName(),3))
|
|
end)
|
|
|
|
d.frame = f
|
|
d.fname = fname
|
|
d.label = label
|
|
|
|
if d:GetHeight() > (2 * d:GetWidth()) then
|
|
label = strvertical(label)
|
|
end
|
|
|
|
d.text:SetText(label)
|
|
|
|
d:SetScript("OnMouseWheel", DraggerOnMouseWheel)
|
|
d:SetScript("OnDragStart", DraggerOnDragStart)
|
|
d:SetScript("OnDragStop", DraggerOnDragStop)
|
|
d:SetScript("OnClick", DraggerOnClick)
|
|
d:SetScript("OnEnter", DraggerOnEnter)
|
|
d:SetScript("OnLeave", DraggerOnLeave)
|
|
|
|
CreateBackdrop(d, nil, nil, .8)
|
|
return d
|
|
end
|
|
|
|
table.insert(UISpecialFrames, "pfUnlock")
|
|
pfUI.unlock = CreateFrame("Button", "pfUnlock", UIParent)
|
|
pfUI.unlock.selection = {}
|
|
pfUI.unlock:Hide()
|
|
pfUI.unlock:SetAllPoints(WorldFrame)
|
|
pfUI.unlock:SetFrameStrata("BACKGROUND")
|
|
pfUI.unlock:SetScript("OnClick", function()
|
|
this:Hide()
|
|
end)
|
|
|
|
pfUI.unlock:SetScript("OnShow", function()
|
|
if this.skip then this.skip = nil return end
|
|
|
|
this.grid = this.grid or DrawGrid()
|
|
|
|
for name, frame in pairs(pfUI.movables) do
|
|
local frame = frame or _G[name]
|
|
|
|
if not frame:IsShown() then frame.hideLater = true end
|
|
frame.drag = frame.drag or CreateDragger(frame)
|
|
frame:SetMovable(true)
|
|
frame.drag:Show()
|
|
frame:Show()
|
|
end
|
|
|
|
local txt = T["Unlock Mode allows you to move, scale and reset frames:\n\n|cff33ffcc[Left Click]|r Drag Frame\n|cff33ffcc[Middle Click]|r Reset Frame\n|cff33ffcc[Right Click]|r Option Box\n\nHold |cff33ffcc[Shift]|r to select all frames of the same kind\nHold |cff33ffcc[Ctrl]|r to select all frames of the same group\n\n|cff33ffcc[Scroll]|r to change the scale of a frame\n\n|cff33ffcc[Click]|r on an empty area or press |cff33ffcc[Esc]|r to exit\n"]
|
|
CreateInfoBox(txt, 15, pfUI.unlock, 180)
|
|
pfUI.gui:Hide()
|
|
end)
|
|
|
|
pfUI.unlock:SetScript("OnHide", function()
|
|
if this.skip then this.skip = nil return end
|
|
|
|
for name, frame in pairs(pfUI.movables) do
|
|
local frame = frame or _G[name]
|
|
|
|
if frame.hideLater == true then frame:Hide() end
|
|
frame:StopMovingOrSizing()
|
|
frame:SetMovable(false)
|
|
frame.drag:Hide()
|
|
UpdateMovable(frame)
|
|
end
|
|
|
|
SetDockToFrame(nil)
|
|
pfUI.unlock:Hide()
|
|
pfUI.gui:Show()
|
|
end)
|
|
|
|
-- dock frame
|
|
pfUI.unlock.dock = CreateFrame("Button", "pfUnlockDock", pfUI.unlock)
|
|
pfUI.unlock.dock:SetWidth(150)
|
|
pfUI.unlock.dock:SetHeight(160)
|
|
pfUI.unlock.dock:SetFrameStrata("FULLSCREEN_DIALOG")
|
|
pfUI.unlock.dock:Hide()
|
|
CreateBackdrop(pfUI.unlock.dock)
|
|
|
|
-- title
|
|
pfUI.unlock.dock.title = pfUI.unlock.dock:CreateFontString("Status", "DIALOG", "GameFontNormal")
|
|
pfUI.unlock.dock.title:SetTextColor(1,1,1,1)
|
|
pfUI.unlock.dock.title:SetFont(pfUI.font_default, C.global.font_size + 2, "OUTLINE")
|
|
pfUI.unlock.dock.title:SetJustifyH("left")
|
|
pfUI.unlock.dock.title:SetPoint("TOP", 0, -5)
|
|
|
|
-- anchor
|
|
-- SetupMenu reads the selection at once, before any frame is docked
|
|
local function IsDockAnchor(anchor)
|
|
local drag = pfUI.unlock.dock.parent
|
|
local position = drag and pfUI_config["position"] and pfUI_config["position"][drag.fname]
|
|
return position and position["xpos"] and (position["anchor"] or "TOPLEFT") == anchor
|
|
end
|
|
|
|
-- moves the frame's saved position to count from another point of the screen
|
|
local function SetDockAnchor(anchor)
|
|
local frame = pfUI.unlock.dock.parent.frame
|
|
local point, x, y = ConvertFrameAnchor(frame, anchor)
|
|
frame:ClearAllPoints()
|
|
frame:SetPoint(point, UIParent, point, x, y)
|
|
|
|
SavePosition(frame)
|
|
UpdateDockValues()
|
|
end
|
|
|
|
pfUI.unlock.dock.anchor = CreateFrame("DropdownButton", nil, pfUI.unlock.dock, "pfUIDropdownTemplate")
|
|
pfUI.unlock.dock.anchor:SetPoint("TOP", 0, -28)
|
|
pfUI.unlock.dock.anchor:SetWidth(140)
|
|
pfUI.unlock.dock.anchor:SetDefaultText(T["N/A"])
|
|
CreateBackdrop(pfUI.unlock.dock.anchor, nil, true)
|
|
pfUI.unlock.dock.anchor:SetupMenu(function(dropdown, rootDescription)
|
|
for _, anchor in ipairs(anchors) do
|
|
rootDescription:CreateRadio(anchor, IsDockAnchor, SetDockAnchor, anchor)
|
|
end
|
|
end)
|
|
|
|
-- x coordinates
|
|
pfUI.unlock.dock.xcoordcap = pfUI.unlock.dock:CreateFontString("Status", "DIALOG", "GameFontNormal")
|
|
pfUI.unlock.dock.xcoordcap:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
pfUI.unlock.dock.xcoordcap:SetJustifyH("LEFT")
|
|
pfUI.unlock.dock.xcoordcap:SetPoint("TOPLEFT", 5, -63)
|
|
pfUI.unlock.dock.xcoordcap:SetText("X:")
|
|
pfUI.unlock.dock.xcoord = CreateFrame("EditBox", nil, pfUI.unlock.dock)
|
|
pfUI.unlock.dock.xcoord:SetTextInsets(5, 5, 5, 5)
|
|
pfUI.unlock.dock.xcoord:SetJustifyH("CENTER")
|
|
pfUI.unlock.dock.xcoord:SetWidth(45)
|
|
pfUI.unlock.dock.xcoord:SetHeight(18)
|
|
pfUI.unlock.dock.xcoord:SetPoint("TOPLEFT", pfUI.unlock.dock, "TOPLEFT", 20, -60)
|
|
pfUI.unlock.dock.xcoord:SetFontObject(GameFontNormal)
|
|
pfUI.unlock.dock.xcoord:SetAutoFocus(false)
|
|
|
|
pfUI.unlock.dock.xcoord:SetScript("OnEnterPressed", function(self)
|
|
local newXPos = tonumber(this:GetText())
|
|
if newXPos then
|
|
local frame = pfUI.unlock.dock.parent.frame
|
|
local anchor, _, _, xpos, ypos = frame:GetPoint()
|
|
frame:SetPoint(anchor, newXPos, ypos)
|
|
SavePosition(frame)
|
|
else
|
|
UpdateDockValues()
|
|
end
|
|
this:ClearFocus()
|
|
end)
|
|
|
|
pfUI.unlock.dock.xcoord:SetScript("OnTextChanged", function(self)
|
|
if tonumber(this:GetText()) then
|
|
this:SetTextColor(1,1,1,1)
|
|
else
|
|
this:SetTextColor(1,.3,.3,1)
|
|
end
|
|
end)
|
|
|
|
CreateBackdrop(pfUI.unlock.dock.xcoord, nil, true)
|
|
|
|
-- y coordinates
|
|
pfUI.unlock.dock.ycoordcap = pfUI.unlock.dock:CreateFontString("Status", "DIALOG", "GameFontNormal")
|
|
pfUI.unlock.dock.ycoordcap:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
pfUI.unlock.dock.ycoordcap:SetText("Y:")
|
|
pfUI.unlock.dock.ycoordcap:SetJustifyH("LEFT")
|
|
pfUI.unlock.dock.ycoordcap:SetPoint("TOPLEFT", 75, -63)
|
|
pfUI.unlock.dock.ycoord = CreateFrame("EditBox", nil, pfUI.unlock.dock)
|
|
pfUI.unlock.dock.ycoord:SetTextInsets(5, 5, 5, 5)
|
|
pfUI.unlock.dock.ycoord:SetJustifyH("CENTER")
|
|
pfUI.unlock.dock.ycoord:SetWidth(45)
|
|
pfUI.unlock.dock.ycoord:SetHeight(18)
|
|
pfUI.unlock.dock.ycoord:SetPoint("TOPLEFT", pfUI.unlock.dock, "TOPLEFT", 90, -60)
|
|
pfUI.unlock.dock.ycoord:SetFontObject(GameFontNormal)
|
|
pfUI.unlock.dock.ycoord:SetAutoFocus(false)
|
|
|
|
pfUI.unlock.dock.ycoord:SetScript("OnEnterPressed", function(self)
|
|
local newYPos = tonumber(this:GetText())
|
|
if newYPos then
|
|
local frame = pfUI.unlock.dock.parent.frame
|
|
local anchor, _, _, xpos, ypos = frame:GetPoint()
|
|
frame:SetPoint(anchor, xpos, newYPos)
|
|
SavePosition(frame)
|
|
else
|
|
UpdateDockValues()
|
|
end
|
|
this:ClearFocus()
|
|
end)
|
|
|
|
pfUI.unlock.dock.ycoord:SetScript("OnTextChanged", function(self)
|
|
if tonumber(this:GetText()) then
|
|
this:SetTextColor(1,1,1,1)
|
|
else
|
|
this:SetTextColor(1,.3,.3,1)
|
|
end
|
|
end)
|
|
|
|
CreateBackdrop(pfUI.unlock.dock.ycoord, nil, true)
|
|
|
|
-- reset button
|
|
pfUI.unlock.dock.reset = CreateFrame("Button", "pfDragDockReset", pfUI.unlock.dock, "UIPanelButtonTemplate")
|
|
pfUI.unlock.dock.reset:SetHeight(18)
|
|
pfUI.unlock.dock.reset:SetPoint("TOPLEFT", 5, -85)
|
|
pfUI.unlock.dock.reset:SetPoint("TOPRIGHT", -5, -85)
|
|
pfUI.unlock.dock.reset:SetScript("OnClick", function()
|
|
local frame = pfUI.unlock.dock.parent.frame
|
|
|
|
if this:GetText() == T["Reset"] then
|
|
pfUI_config["position"][frame:GetName()] = nil
|
|
frame:ClearAllPoints()
|
|
UpdateMovable(frame)
|
|
else
|
|
frame:StartMoving()
|
|
frame:StopMovingOrSizing()
|
|
SavePosition(frame)
|
|
end
|
|
|
|
if frame.OnMove then frame:OnMove() end
|
|
|
|
RunNextFrame(function() SetDockToFrame(pfUI.unlock.dock.parent) end)
|
|
end)
|
|
SkinButton(pfUI.unlock.dock.reset,.2,1,.8)
|
|
|
|
-- move left
|
|
pfUI.unlock.dock.left = CreateFrame("Button", "pfDragDockPosUp", pfUI.unlock.dock, "UIPanelButtonTemplate")
|
|
pfUI.unlock.dock.left:SetHeight(18)
|
|
pfUI.unlock.dock.left:SetWidth(18)
|
|
pfUI.unlock.dock.left:SetPoint("TOP", -50, -110)
|
|
pfUI.unlock.dock.left.texture = pfUI.unlock.dock.left:CreateTexture("arrow")
|
|
pfUI.unlock.dock.left.texture:SetTexture(pfUI.media["img:left"])
|
|
pfUI.unlock.dock.left.texture:ClearAllPoints()
|
|
pfUI.unlock.dock.left.texture:SetPoint("TOPLEFT", pfUI.unlock.dock.left, "TOPLEFT", 4, -2)
|
|
pfUI.unlock.dock.left.texture:SetPoint("BOTTOMRIGHT", pfUI.unlock.dock.left, "BOTTOMRIGHT", -4, 2)
|
|
pfUI.unlock.dock.left:SetScript("OnClick", function()
|
|
local frame = pfUI.unlock.dock.parent.frame
|
|
local anchor, _, _, xpos, ypos = frame:GetPoint()
|
|
frame:SetPoint(anchor or "TOPLEFT", xpos - 1, ypos)
|
|
SavePosition(frame)
|
|
UpdateDockValues()
|
|
end)
|
|
SkinButton(pfUI.unlock.dock.left,.2,1,.8)
|
|
|
|
-- move right
|
|
pfUI.unlock.dock.right = CreateFrame("Button", "pfDragDockPosUp", pfUI.unlock.dock, "UIPanelButtonTemplate")
|
|
pfUI.unlock.dock.right:SetHeight(18)
|
|
pfUI.unlock.dock.right:SetWidth(18)
|
|
pfUI.unlock.dock.right:SetPoint("TOP", -25, -110)
|
|
pfUI.unlock.dock.right.texture = pfUI.unlock.dock.right:CreateTexture("arrow")
|
|
pfUI.unlock.dock.right.texture:SetTexture(pfUI.media["img:right"])
|
|
pfUI.unlock.dock.right.texture:ClearAllPoints()
|
|
pfUI.unlock.dock.right.texture:SetPoint("TOPLEFT", pfUI.unlock.dock.right, "TOPLEFT", 4, -2)
|
|
pfUI.unlock.dock.right.texture:SetPoint("BOTTOMRIGHT", pfUI.unlock.dock.right, "BOTTOMRIGHT", -4, 2)
|
|
pfUI.unlock.dock.right:SetScript("OnClick", function()
|
|
local frame = pfUI.unlock.dock.parent.frame
|
|
local anchor, _, _, xpos, ypos = frame:GetPoint()
|
|
frame:SetPoint(anchor or "TOPLEFT", xpos + 1, ypos)
|
|
SavePosition(frame)
|
|
UpdateDockValues()
|
|
end)
|
|
SkinButton(pfUI.unlock.dock.right,.2,1,.8)
|
|
|
|
-- move up
|
|
pfUI.unlock.dock.up = CreateFrame("Button", "pfDragDockPosUp", pfUI.unlock.dock, "UIPanelButtonTemplate")
|
|
pfUI.unlock.dock.up:SetHeight(18)
|
|
pfUI.unlock.dock.up:SetWidth(18)
|
|
pfUI.unlock.dock.up:SetPoint("TOP", 25, -110)
|
|
pfUI.unlock.dock.up.texture = pfUI.unlock.dock.up:CreateTexture("arrow")
|
|
pfUI.unlock.dock.up.texture:SetTexture(pfUI.media["img:up"])
|
|
pfUI.unlock.dock.up.texture:ClearAllPoints()
|
|
pfUI.unlock.dock.up.texture:SetPoint("TOPLEFT", pfUI.unlock.dock.up, "TOPLEFT", 4, -2)
|
|
pfUI.unlock.dock.up.texture:SetPoint("BOTTOMRIGHT", pfUI.unlock.dock.up, "BOTTOMRIGHT", -4, 2)
|
|
pfUI.unlock.dock.up:SetScript("OnClick", function()
|
|
local frame = pfUI.unlock.dock.parent.frame
|
|
local anchor, _, _, xpos, ypos = frame:GetPoint()
|
|
frame:SetPoint(anchor or "TOPLEFT", xpos, ypos + 1)
|
|
SavePosition(frame)
|
|
UpdateDockValues()
|
|
end)
|
|
SkinButton(pfUI.unlock.dock.up,.2,1,.8)
|
|
|
|
-- move down
|
|
pfUI.unlock.dock.down = CreateFrame("Button", "pfDragDockPosUp", pfUI.unlock.dock, "UIPanelButtonTemplate")
|
|
pfUI.unlock.dock.down:SetHeight(18)
|
|
pfUI.unlock.dock.down:SetWidth(18)
|
|
pfUI.unlock.dock.down:SetPoint("TOP", 50, -110)
|
|
pfUI.unlock.dock.down.texture = pfUI.unlock.dock.down:CreateTexture("arrow")
|
|
pfUI.unlock.dock.down.texture:SetTexture(pfUI.media["img:down"])
|
|
pfUI.unlock.dock.down.texture:ClearAllPoints()
|
|
pfUI.unlock.dock.down.texture:SetPoint("TOPLEFT", pfUI.unlock.dock.down, "TOPLEFT", 4, -2)
|
|
pfUI.unlock.dock.down.texture:SetPoint("BOTTOMRIGHT", pfUI.unlock.dock.down, "BOTTOMRIGHT", -4, 2)
|
|
pfUI.unlock.dock.down:SetScript("OnClick", function()
|
|
local frame = pfUI.unlock.dock.parent.frame
|
|
local anchor, _, _, xpos, ypos = frame:GetPoint()
|
|
frame:SetPoint(anchor or "TOPLEFT", xpos, ypos - 1)
|
|
SavePosition(frame)
|
|
UpdateDockValues()
|
|
end)
|
|
SkinButton(pfUI.unlock.dock.down,.2,1,.8)
|
|
|
|
-- open config
|
|
pfUI.unlock.dock.config = CreateFrame("Button", "pfDragDockConfigOpen", pfUI.unlock.dock, "UIPanelButtonTemplate")
|
|
pfUI.unlock.dock.config:SetHeight(18)
|
|
pfUI.unlock.dock.config:SetPoint("BOTTOMLEFT", 5, 5)
|
|
pfUI.unlock.dock.config:SetPoint("BOTTOMRIGHT", -5, 5)
|
|
pfUI.unlock.dock.config:SetText(T["Configure"])
|
|
pfUI.unlock.dock.config:SetScript("OnClick", function()
|
|
local cat, conf = GetConfigTable(pfUI.unlock.dock.parent.label)
|
|
if cat then OpenConfigDialog(cat, conf) end
|
|
end)
|
|
SkinButton(pfUI.unlock.dock.config,.2,1,.8)
|
|
end)
|