mirror of
https://github.com/rivi-s/pfQuest.git
synced 2026-11-10 20:17:36 +00:00
295 lines
9.4 KiB
Lua
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
|