Files

295 lines
9.4 KiB
Lua

-- Performance: cache frequently-used globals
local pairs = pairs
local getn = table.getn
local GetTime = GetTime
do -- minimap icon
pfQuestIcon = CreateFrame("Button", "pfQuestIcon", Minimap)
pfQuestIcon:SetClampedToScreen(true)
pfQuestIcon:SetMovable(true)
pfQuestIcon:EnableMouse(true)
pfQuestIcon:RegisterForDrag("LeftButton")
pfQuestIcon:RegisterForClicks("LeftButtonUp", "RightButtonUp")
pfQuestIcon:SetWidth(31)
pfQuestIcon:SetHeight(31)
pfQuestIcon:SetFrameLevel(9)
pfQuestIcon:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
pfQuestIcon:SetPoint("TOPLEFT", Minimap, "TOPLEFT", 0, 0)
pfQuestIcon:SetScript("OnDragStart", function()
if IsShiftKeyDown() then
this:StartMoving()
end
end)
pfQuestIcon:SetScript("OnDragStop", function()
this:StopMovingOrSizing()
end)
pfQuestIcon:SetScript("OnClick", function()
if pfQuestMenu:IsShown() then
pfQuestMenu:Hide()
else
pfQuestMenu:Show()
end
end)
pfQuestIcon:SetScript("OnEnter", function()
GameTooltip:SetOwner(this, ANCHOR_BOTTOMLEFT)
GameTooltip:SetText("|cff33ffccpf|rQuest", 1, 1, 1, 1)
GameTooltip:AddDoubleLine(pfQuest_Loc["Left-Click"], pfQuest_Loc["Shortcut Menu"], 1, 1, 1, 1, 1, 1)
GameTooltip:AddDoubleLine(pfQuest_Loc["Shift-Click"], pfQuest_Loc["Move Button"], 1, 1, 1, 1, 1, 1)
GameTooltip:Show()
end)
pfQuestIcon:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
pfQuestIcon:RegisterEvent("PLAYER_ENTERING_WORLD")
pfQuestIcon:SetScript("OnEvent", function()
if pfQuest_config["minimapbutton"] == "0" then
this:Hide()
else
this:Show()
end
end)
pfQuestIcon.icon = pfQuestIcon:CreateTexture(nil, "BACKGROUND")
pfQuestIcon.icon:SetWidth(20)
pfQuestIcon.icon:SetHeight(20)
pfQuestIcon.icon:SetTexture(pfQuestConfig.path .. "\\img\\logo")
pfQuestIcon.icon:SetTexCoord(0.05, 0.95, 0.05, 0.95)
pfQuestIcon.icon:SetPoint("CENTER", 1, 1)
pfQuestIcon.overlay = pfQuestIcon:CreateTexture(nil, "OVERLAY")
pfQuestIcon.overlay:SetWidth(53)
pfQuestIcon.overlay:SetHeight(53)
pfQuestIcon.overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
pfQuestIcon.overlay:SetPoint("TOPLEFT", 0, 0)
end
do -- tracking menu
local function MenuButtonEnter()
this.title:SetTextColor(1, 0.8, 0)
this.highlight:Show()
end
local function MenuButtonLeave()
this.title:SetTextColor(1, 1, 1)
this.highlight:Hide()
end
local function MenuButtonClick()
this.state = this.check and not this.check:GetChecked()
if this.check then
this.check:SetChecked(this.state)
else
this:GetParent():Hide()
end
if this.onclick then
this.onclick(nil, this.name, this.state)
end
end
local function CreateMenu(data, name)
local top, width = 4, 0
local frame = CreateFrame("Frame", name, UIParent)
frame:SetFrameStrata("DIALOG")
frame:SetClampedToScreen(true)
frame:Hide()
pfUI.api.CreateBackdrop(frame, nil, nil, 0.75)
for id, tracking in pairs(data) do
-- data shortcuts
local name = tracking[1]
local title = tracking[2]
local onclick = tracking[3]
local checkbox = tracking[4]
if not title then
-- draw separator line
local line = frame:CreateTexture()
line:SetTexture(0.25, 0.25, 0.25, 0.25)
line:SetPoint("TOPLEFT", 4, -top - 2)
line:SetPoint("TOPRIGHT", -4, -top - 2)
line:SetHeight(2)
else
-- create menu button
frame[name] = CreateFrame("Button", nil, frame)
frame[name]:SetPoint("TOPLEFT", 0, -top)
frame[name]:SetPoint("TOPRIGHT", 0, -top)
frame[name]:SetHeight(16)
frame[name]:SetScript("OnEnter", MenuButtonEnter)
frame[name]:SetScript("OnLeave", MenuButtonLeave)
frame[name]:SetScript("OnClick", MenuButtonClick)
frame[name].onclick = onclick
frame[name].name = name
-- title
frame[name].title = frame[name]:CreateFontString(nil, "NORMAL", "GameFontWhite")
frame[name].title:SetFont(pfUI.font_default, pfUI_config.global.font_size, "OUTLINE")
frame[name].title:SetPoint("LEFT", 22, 0)
frame[name].title:SetJustifyH("LEFT")
frame[name].title:SetText(title)
-- icon
frame[name].icon = frame[name]:CreateTexture(nil, "OVERLAY")
frame[name].icon:SetWidth(14)
frame[name].icon:SetHeight(14)
frame[name].icon:SetPoint("RIGHT", -8, 0)
frame[name].icon:SetTexture(tracking[5] or (pfQuestConfig.path .. "\\img\\tracking\\" .. name))
-- hover
frame[name].highlight = frame[name]:CreateTexture(nil, "OVERLAY")
frame[name].highlight:SetPoint("TOPLEFT", 4, 0)
frame[name].highlight:SetPoint("BOTTOMRIGHT", -4, 0)
frame[name].highlight:SetTexture(1, 1, 1, 0.1)
frame[name].highlight:Hide()
-- checkbox (optional)
if checkbox then
frame[name].check = CreateFrame("CheckButton", nil, frame[name], "UICheckButtonTemplate")
frame[name].check:SetNormalTexture("")
frame[name].check:SetPushedTexture("")
frame[name].check:SetHighlightTexture("")
frame[name].check:SetPoint("LEFT", 10, 0)
frame[name].check:SetWidth(20)
frame[name].check:SetHeight(20)
frame[name].check:SetScale(0.6)
frame[name].check:EnableMouse(false)
pfUI.api.CreateBackdrop(frame[name].check, nil, true)
end
-- save maximum menu width
width = math.max(width, frame[name].title:GetStringWidth() + 60)
end
-- set next entry position
top = top + (title and 16 or 6)
end
-- update frame size
frame:SetWidth(width)
frame:SetHeight(top + 4)
-- the usual menu hide events
table.insert(UIMenus, name)
frame:RegisterEvent("CURSOR_UPDATE")
frame:SetScript("OnEvent", function()
this:Hide()
end)
return frame
end
local function ToggleFrame(frame)
if frame:IsShown() then
frame:Hide()
else
frame:Show()
end
end
local menu = {
{
"database",
pfQuest_Loc["Database"],
function(list, state)
ToggleFrame(pfBrowser)
end,
},
{ "-" },
{ "chests", pfQuest_Loc["Chests & Treasures"], pfDatabase.TrackMeta, true },
{ "herbs", pfQuest_Loc["Herbs & Flowers"], pfDatabase.TrackMeta, true },
{ "mines", pfQuest_Loc["Mines & Ores"], pfDatabase.TrackMeta, true },
{ "fish", pfQuest_Loc["Fishing Pools"], pfDatabase.TrackMeta, true },
{ "rares", pfQuest_Loc["Rare Mobs"], pfDatabase.TrackMeta, true },
{ "-" },
{ "auctioneer", pfQuest_Loc["Auctioneer"], pfDatabase.TrackMeta, true },
{ "banker", pfQuest_Loc["Banker"], pfDatabase.TrackMeta, true },
{ "battlemaster", pfQuest_Loc["Battlemaster"], pfDatabase.TrackMeta, true },
{ "flight", pfQuest_Loc["Flight Master"], pfDatabase.TrackMeta, true },
{ "innkeeper", pfQuest_Loc["Innkeeper"], pfDatabase.TrackMeta, true },
{ "mailbox", pfQuest_Loc["Mailbox"], pfDatabase.TrackMeta, true },
{ "meetingstone", pfQuest_Loc["Meeting Stones"], pfDatabase.TrackMeta, true },
{ "repair", pfQuest_Loc["Repair"], pfDatabase.TrackMeta, true },
{ "spirithealer", pfQuest_Loc["Spirit Healer"], pfDatabase.TrackMeta, true },
{ "stablemaster", pfQuest_Loc["Stable Master"], pfDatabase.TrackMeta, true },
{ "vendor", pfQuest_Loc["Vendor"], pfDatabase.TrackMeta, true },
{ "-" },
{
"journal",
pfQuest_Loc["Quest Journal"],
function(list, state)
ToggleFrame(pfJournal)
end,
},
{
"welcome",
pfQuest_Loc["Welcome Screen"],
function(list, state)
ToggleFrame(pfQuestInit)
end,
},
{
"settings",
pfQuest_Loc["Settings"],
function(list, state)
ToggleFrame(pfQuestConfig)
end,
},
}
pfQuestMenu = CreateMenu(menu, "pfQuestMenu")
function pfQuest:RegisterTrackingMenuEntry(tracking, before)
local position = table.getn(menu) + 1
for index, entry in pairs(menu) do
if entry[1] == before then position = index break end
end
table.insert(menu, position, tracking)
local shown = pfQuestMenu:IsShown()
local onShow = pfQuestMenu:GetScript("OnShow")
pfQuestMenu:Hide()
pfQuestMenu = CreateMenu(menu, "pfQuestMenuExtended")
pfQuestMenu:SetScript("OnShow", onShow)
if shown then pfQuestMenu:Show() end
end
pfQuestMenu:SetScript("OnShow", function()
-- create shortcuts
local anchor = this.anchor or pfQuestIcon
local config = pfQuest_track
local frame = this
-- read virtual anchor position
local x, y = anchor:GetCenter()
x = x * anchor:GetEffectiveScale() / UIParent:GetScale()
y = y * anchor:GetEffectiveScale() / UIParent:GetScale()
-- read virtual screen resolution
local width = UIParent:GetWidth() / UIParent:GetScale()
local height = UIParent:GetHeight() / UIParent:GetScale()
-- calculate menu position on screen
local h = y > height / 2 and "TOP" or "BOTTOM"
local hp = y > height / 2 and -8 or 8
local w = x > width / 2 and "RIGHT" or "LEFT"
local wp = x > width / 2 and -8 or 8
-- set frame position
frame:ClearAllPoints()
frame:SetPoint(h .. w, anchor, "CENTER", wp, hp)
-- align menu entries to config state
for id, data in pairs(menu) do
if frame[data[1]] and frame[data[1]].check then
frame[data[1]].check:SetChecked(config[data[1]] and true or false)
end
end
end)
end