Files
Andrew6810 f3e579cb57 init
2022-11-05 21:19:42 -07:00

388 lines
12 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- http://www.curse.com/addons/wow/tradeskill-master --
-- --
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
-- All Rights Reserved* - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
-- Much of this code is copied from .../AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
-- This Frame container is modified to fit TSM's theme / needs
local TSM = select(2, ...)
local Type, Version = "TSMMainFrame", 2
local AceGUI = LibStub("AceGUI-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster") -- loads the localization table
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
local ICON_TEXT_COLOR = {165/255, 168/255, 188/255, .7}
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Frame_OnClose(frame)
frame.obj:Fire("OnClose")
end
local function CloseButton_OnClick(frame)
PlaySound("gsTitleOptionExit")
frame.obj:Hide()
end
local function Frame_OnMouseDown(frame)
frame.toMove:GetScript("OnMouseDown")(frame.toMove)
AceGUI:ClearFocus()
end
local function Frame_OnMouseUp(frame)
frame.toMove:GetScript("OnMouseUp")(frame.toMove)
AceGUI:ClearFocus()
end
local function Sizer_OnMouseUp(mover)
local frame = mover:GetParent()
frame:StopMovingOrSizing()
frame:SavePositionAndSize()
local self = frame.obj
local status = self.status or self.localstatus
status.width = frame:GetWidth()
status.height = frame:GetHeight()
status.top = frame:GetTop()
status.left = frame:GetLeft()
end
local function Sizer_OnMouseDown(frame)
frame:GetParent():StartSizing("BOTTOMRIGHT")
AceGUI:ClearFocus()
end
local function Icon_OnEnter(btn)
btn.dark:Hide()
GameTooltip:SetOwner(btn, btn:GetParent().tooltipAnchor)
GameTooltip:SetText(btn.title)
GameTooltip:Show()
end
local function Icon_OnLeave(btn)
if btn.obj.selected ~= btn then
btn.dark:Show()
end
GameTooltip:Hide()
end
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self.frame:RefreshPosition()
self.frame:SetFrameStrata("MEDIUM")
self:SetTitle()
self:ApplyStatus()
self:Show()
end,
["OnRelease"] = function(self)
self.status = nil
wipe(self.localstatus)
end,
["LayoutIcons"] = function(self)
for _, container in ipairs({self.topLeftIcons, self.topRightIcons}) do
if type(container.icons) == "table" and container.icons[1] then
local numIcons = #container.icons
local iconSize = container.icons[1]:GetHeight()
local spacing = (container:GetWidth() - numIcons * iconSize) / (numIcons + 1)
local width = iconSize
if spacing < 1 then
spacing = 1
width = (container:GetWidth() - (numIcons - 1) * spacing) / numIcons
end
for i, icon in ipairs(container.icons) do
icon:SetPoint("TOPLEFT", spacing+(i-1)*(width+spacing), 0)
icon:SetWidth(width)
end
end
end
end,
["OnWidthSet"] = function(self, width)
self.content.width = self.content:GetWidth()
self.topLeftIcons:ClearAllPoints()
self.topLeftIcons:SetPoint("TOPLEFT", 5, 20)
self.topLeftIcons:SetPoint("TOPRIGHT", self.frame, "TOP", -115, 20)
self.topLeftIcons:SetHeight(51)
self.topRightIcons:ClearAllPoints()
self.topRightIcons:SetPoint("TOPRIGHT", -5, 20)
self.topRightIcons:SetPoint("TOPLEFT", self.frame, "TOP", 115, 20)
self.topRightIcons:SetHeight(51)
self:LayoutIcons()
end,
["OnHeightSet"] = function(self, height)
self.content.height = self.content:GetHeight()
end,
["SetTitle"] = function(self, title)
self.titletext:SetText(title)
end,
["SetIconText"] = function(self, title)
self.icontext:SetText(title)
end,
["SetIconLabels"] = function(self, topLeft, topRight)
self.topLeftIcons.label = topLeft
self.topRightIcons.label = topRight
end,
["Hide"] = function(self)
self.frame:Hide()
end,
["Show"] = function(self)
self.frame:Show()
end,
["UpdateSelected"] = function(self)
for _, container in ipairs({self.topLeftIcons, self.topRightIcons}) do
if type(container.icons) == "table" then
for _, icon in ipairs(container.icons) do
icon.dark:Show()
end
end
end
self.selected.dark:Hide()
end,
["AddIcon"] = function(self, info)
local container = self[info.where.."Icons"]
assert(container, "Invalid icon container.")
local size = 51
local btn = CreateFrame("Button", nil, container)
btn:SetBackdrop({edgeFile="Interface\\Buttons\\WHITE8X8", edgeSize=2})
btn:SetBackdropBorderColor(0, 0, 0, 0.5)
btn:SetHeight(size)
btn:SetWidth(size)
btn.title = info.name
btn.info = info
btn.obj = self
info.frame = btn
local image = btn:CreateTexture(nil, "BACKGROUND")
image:SetAllPoints()
image:SetTexture(info.texture)
image:SetTexCoord(0.08, 0.922, 0.09, 0.918)
image:SetVertexColor(1, 1, 1)
btn.image = image
local dark = btn:CreateTexture(nil, "OVERLAY")
dark:SetAllPoints(image)
dark:SetTexture(0, 0, 0, .3)
dark:SetBlendMode("BLEND")
btn.dark = dark
btn:SetScript("OnEnter", Icon_OnEnter)
btn:SetScript("OnLeave", Icon_OnLeave)
btn:SetScript("OnClick", function(btn)
if #self.children > 0 then
self:ReleaseChildren()
end
self:SetTitle(btn.title)
btn.info.loadGUI(self)
self.selected = btn
self:UpdateSelected()
end)
local highlight = btn:CreateTexture(nil, "HIGHLIGHT")
highlight:SetAllPoints(image)
highlight:SetTexture(1, 1, 1, .2)
highlight:SetBlendMode("ADD")
btn.highlight = highlight
container.icons = container.icons or {}
tinsert(container.icons, btn)
self:LayoutIcons()
if not container.textLabel then
local label = container:CreateFontString()
label:SetHeight(12)
label:SetJustifyH("CENTER")
label:SetJustifyV("CENTER")
label:SetFont(TSMAPI.Design:GetContentFont("small"))
TSMAPI.Design:SetIconRegionColor(label)
label:SetText(container.label)
label:SetPoint("TOP", 0, -53)
container.tooltipAnchor = "ANCHOR_TOP"
container.textLabel = label
-- make the lines that extend the width of the container out from the label
local leftHLine = container:CreateTexture()
leftHLine:SetPoint("TOPRIGHT", label, "TOPLEFT", -2, -6)
leftHLine:SetHeight(1)
TSMAPI.Design:SetIconRegionColor(leftHLine)
local rightHLine = container:CreateTexture()
rightHLine:SetPoint("TOPLEFT", label, "TOPRIGHT", 2, -6)
rightHLine:SetHeight(1)
TSMAPI.Design:SetIconRegionColor(rightHLine)
leftHLine:SetPoint("TOPLEFT", 20, -59)
rightHLine:SetPoint("TOPRIGHT", -20, -59)
end
end,
-- called to set an external table to store status in
["SetStatusTable"] = function(self, status)
assert(type(status) == "table")
self.status = status
self:ApplyStatus()
end,
["ApplyStatus"] = function(self)
local status = self.status or self.localstatus
local frame = self.frame
self:SetWidth(status.width or self.frame:GetWidth())
self:SetHeight(status.height or self.frame:GetHeight())
frame:ClearAllPoints()
if status.top and status.left then
frame:SetPoint("TOP", UIParent, "BOTTOM", 0, status.top)
frame:SetPoint("LEFT", UIParent, "LEFT", status.left, 0)
else
frame:SetPoint("CENTER")
end
end,
}
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local frameName = Type..AceGUI:GetNextWidgetNum(Type)
local frameDefaults = {
x = UIParent:GetWidth()/2,
y = UIParent:GetHeight()/2,
width = 823,
height = 686,
scale = 1,
}
local frame = TSMAPI:CreateMovableFrame(frameName, frameDefaults)
frame:SetFrameStrata("MEDIUM")
TSMAPI.Design:SetFrameBackdropColor(frame)
frame:SetResizable(true)
frame:SetMinResize(600, 400)
frame:SetScript("OnHide", Frame_OnClose)
frame.toMove = frame
tinsert(UISpecialFrames, frameName)
local closebutton = CreateFrame("Button", nil, frame)
TSMAPI.Design:SetContentColor(closebutton)
local highlight = closebutton:CreateTexture(nil, "HIGHLIGHT")
highlight:SetAllPoints()
highlight:SetTexture(1, 1, 1, .2)
highlight:SetBlendMode("BLEND")
closebutton.highlight = highlight
closebutton:SetPoint("BOTTOMRIGHT", -29, -14)
closebutton:SetHeight(29)
closebutton:SetWidth(86)
closebutton:SetScript("OnClick", CloseButton_OnClick)
closebutton:Show()
local label = closebutton:CreateFontString()
label:SetPoint("TOP")
label:SetJustifyH("CENTER")
label:SetJustifyV("CENTER")
label:SetHeight(28)
label:SetFont(TSMAPI.Design:GetContentFont(), 28)
TSMAPI.Design:SetWidgetTextColor(label)
label:SetText(CLOSE)
closebutton:SetFontString(label)
local iconBtn = CreateFrame("Button", nil, frame)
iconBtn:SetWidth(286)
iconBtn:SetHeight(286)
iconBtn:SetPoint("TOP", 0, 174)
iconBtn:SetScript("OnMouseDown", Frame_OnMouseDown)
iconBtn:SetScript("OnMouseUp", Frame_OnMouseUp)
iconBtn.toMove = frame
local icon = iconBtn:CreateTexture()
icon:SetAllPoints()
icon:SetTexture("Interface\\Addons\\TradeSkillMaster\\Media\\TSM_Icon_Pocket")
frame.icon = icon
local sizer = CreateFrame("Frame", nil, frame)
sizer:SetPoint("BOTTOMRIGHT", -2, 2)
sizer:SetWidth(20)
sizer:SetHeight(20)
sizer:EnableMouse()
sizer:SetScript("OnMouseDown",Sizer_OnMouseDown)
sizer:SetScript("OnMouseUp", Sizer_OnMouseUp)
local image = sizer:CreateTexture(nil, "BACKGROUND")
image:SetAllPoints()
image:SetTexture("Interface\\Addons\\TradeSkillMaster\\Media\\Sizer")
local content = CreateFrame("Frame", nil, frame)
content:SetPoint("TOPLEFT", 11, -62)
content:SetPoint("BOTTOMRIGHT", -11, 20)
local titletext = frame:CreateFontString()
titletext:SetPoint("TOP", 0, -32)
titletext:SetHeight(22)
titletext:SetJustifyH("CENTER")
titletext:SetJustifyV("CENTER")
titletext:SetFont(TSMAPI.Design:GetContentFont(), 22)
TSMAPI.Design:SetTitleTextColor(titletext)
local icontext = iconBtn:CreateFontString(nil, "OVERLAY")
icontext:SetPoint("TOP", frame, "TOP", 0, 14)
icontext:SetHeight(29)
icontext:SetJustifyH("CENTER")
icontext:SetJustifyV("CENTER")
icontext:SetFont(TSMAPI.Design:GetContentFont(), 27)
icontext:SetTextColor(unpack(ICON_TEXT_COLOR))
-- local helpButton = CreateFrame("Button", nil, frame, "MainHelpPlateButton")
local helpButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
helpButton:SetPoint("BOTTOMLEFT", -10, -30)
helpButton:SetScript("OnEnter", function(self)
HelpPlateTooltip.ArrowRIGHT:Show()
HelpPlateTooltip.ArrowGlowRIGHT:Show()
HelpPlateTooltip:SetPoint("LEFT", self, "RIGHT", 10, 0)
HelpPlateTooltip.Text:SetText(L["Click this to open TSM Assistant."])
HelpPlateTooltip:Show()
end)
helpButton:SetScript("OnLeave", function(self)
HelpPlateTooltip.ArrowRIGHT:Hide()
HelpPlateTooltip.ArrowGlowRIGHT:Hide()
HelpPlateTooltip:ClearAllPoints()
HelpPlateTooltip:Hide()
end)
helpButton:SetScript("OnClick", TSM.Assistant.Open)
local widget = {
type = Type,
localstatus = {},
frame = frame,
-- container for children
content = content,
-- changable labels
titletext = titletext,
icontext = icontext,
-- containers for the icons - size/pos set by OnWidthSet
topLeftIcons = CreateFrame("Frame", nil, frame),
topRightIcons = CreateFrame("Frame", nil, frame),
}
for method, func in pairs(methods) do
widget[method] = func
end
closebutton.obj = widget
return AceGUI:RegisterAsContainer(widget)
end
AceGUI:RegisterWidgetType(Type, Constructor, Version)