388 lines
12 KiB
Lua
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) |