1999 lines
76 KiB
Lua
1999 lines
76 KiB
Lua
-- Pawn by Vger-Azjol-Nerub
|
|
-- www.vgermods.com
|
|
-- © 2006-2010 Green Eclipse. This mod is released under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 license.
|
|
-- See Readme.htm for more information.
|
|
--
|
|
-- User interface code
|
|
------------------------------------------------------------
|
|
|
|
|
|
|
|
------------------------------------------------------------
|
|
-- Globals
|
|
------------------------------------------------------------
|
|
|
|
PawnUICurrentScale = nil
|
|
PawnUICurrentTabNumber = nil
|
|
PawnUICurrentListIndex = 0
|
|
PawnUICurrentStatIndex = 0
|
|
|
|
-- An array with indices 1 and 2 for the left and right compare items, respectively; each one is of the type returned by GetItemData.
|
|
local PawnUIComparisonItems = {}
|
|
-- An array with indices 1 and 2 for the first and second left side shortcut items.
|
|
local PawnUIShortcutItems = {}
|
|
|
|
local PawnUITotalScaleLines = 0
|
|
local PawnUITotalComparisonLines = 0
|
|
local PawnUITotalGemLines = 0
|
|
|
|
------------------------------------------------------------
|
|
-- "Constants"
|
|
------------------------------------------------------------
|
|
|
|
local PawnUIScaleLineHeight = 16 -- each scale line is 16 pixels tall
|
|
local PawnUIScaleSelectorPaddingBottom = 5 -- add 5 pixels of padding to the bottom of the scrolling area
|
|
|
|
local PawnUIStatsListHeight = 18 -- the stats list contains 12 items
|
|
local PawnUIStatsListItemHeight = 16 -- each item is 16 pixels tall
|
|
|
|
local PawnUIComparisonLineHeight = 20 -- each comparison line is 20 pixels tall
|
|
local PawnUIComparisonAreaPaddingBottom = 10 -- add 10 pixels of padding to the bottom of the scrolling area
|
|
|
|
local PawnUIGemLineHeight = 17 -- each comparison line is 17 pixels tall
|
|
local PawnUIGemAreaPaddingBottom = 0 -- add no padding to the bottom of the scrolling area
|
|
|
|
local PawnUIFrameNeedsScaleSelector = { true, true, true, true, false, false, false }
|
|
|
|
|
|
-- The 1-based indes of the stat headers for gems.
|
|
PawnUIStats_RedSocketIndex = 8
|
|
PawnUIStats_YellowSocketIndex = 9
|
|
PawnUIStats_BlueSocketIndex = 10
|
|
PawnUIStats_MetaSocketIndex = 11
|
|
PawnUIStats_MetaSocketEffectIndex = 12
|
|
PawnUIStats_SocketBonusBefore = 13
|
|
|
|
|
|
------------------------------------------------------------
|
|
-- Inventory button
|
|
------------------------------------------------------------
|
|
|
|
-- Moves the Pawn inventory sheet button and inspect button to the location specified by the user's current preferences.
|
|
function PawnUI_InventoryPawnButton_Move()
|
|
if PawnCommon.ButtonPosition == PawnButtonPositionRight then
|
|
PawnUI_InventoryPawnButton:ClearAllPoints()
|
|
PawnUI_InventoryPawnButton:SetPoint("TOPRIGHT", "CharacterTrinket1Slot", "BOTTOMRIGHT", -1, -8)
|
|
PawnUI_InventoryPawnButton:Show()
|
|
if PawnUI_InspectPawnButton then
|
|
PawnUI_InspectPawnButton:ClearAllPoints()
|
|
PawnUI_InspectPawnButton:SetPoint("TOPRIGHT", "InspectTrinket1Slot", "BOTTOMRIGHT", -1, -8)
|
|
PawnUI_InspectPawnButton:Show()
|
|
end
|
|
if PawnUI_SocketingPawnButton then
|
|
PawnUI_SocketingPawnButton:ClearAllPoints()
|
|
PawnUI_SocketingPawnButton:SetPoint("TOPRIGHT", "ItemSocketingFrame", "TOPRIGHT", -18, -46)
|
|
PawnUI_SocketingPawnButton:Show()
|
|
end
|
|
elseif PawnCommon.ButtonPosition == PawnButtonPositionLeft then
|
|
PawnUI_InventoryPawnButton:ClearAllPoints()
|
|
PawnUI_InventoryPawnButton:SetPoint("TOPLEFT", "CharacterWristSlot", "BOTTOMLEFT", 1, -8)
|
|
PawnUI_InventoryPawnButton:Show()
|
|
if PawnUI_InspectPawnButton then
|
|
PawnUI_InspectPawnButton:ClearAllPoints()
|
|
PawnUI_InspectPawnButton:SetPoint("TOPLEFT", "InspectWristSlot", "BOTTOMLEFT", 1, -8)
|
|
PawnUI_InspectPawnButton:Show()
|
|
end
|
|
else
|
|
PawnUI_InventoryPawnButton:Hide()
|
|
if PawnUI_InspectPawnButton then
|
|
PawnUI_InspectPawnButton:Hide()
|
|
end
|
|
if PawnUI_SocketingPawnButton then
|
|
PawnUI_SocketingPawnButton:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
function PawnUI_InventoryPawnButton_OnEnter(this)
|
|
-- Even if there are no scales, we'll at least display this much.
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT")
|
|
GameTooltip:AddLine("Pawn", 1, 1, 1, 1)
|
|
GameTooltip:AddLine(PawnUI_InventoryPawnButton_Tooltip, nil, nil, nil, 1)
|
|
|
|
-- If the user has at least one scale and at least one type of value is enabled, calculate a total of all equipped items' values.
|
|
PawnUI_AddInventoryTotalsToTooltip(GameTooltip, "player")
|
|
|
|
-- Finally, display the tooltip.
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
function PawnUI_InspectPawnButton_OnEnter(this)
|
|
-- Even if there are no scales, we'll at least display this much.
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT")
|
|
GameTooltip:AddLine("Pawn", 1, 1, 1, 1)
|
|
|
|
-- If the user has at least one scale and at least one type of value is enabled, calculate a total of all equipped items' values.
|
|
PawnUI_AddInventoryTotalsToTooltip(GameTooltip, "playertarget")
|
|
|
|
-- Finally, display the tooltip.
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
function PawnUI_SocketingPawnButton_OnEnter(this)
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT")
|
|
GameTooltip:AddLine("Pawn", 1, 1, 1, 1)
|
|
GameTooltip:AddLine(PawnUI_SocketingPawnButton_Tooltip)
|
|
|
|
-- Finally, display the tooltip.
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
function PawnUI_AddInventoryTotalsToTooltip(Tooltip, Unit)
|
|
if PawnCommon.ShowUnenchanted or PawnCommon.ShowEnchanted then
|
|
-- Get the total stats for all items.
|
|
local ItemValues, Count, EpicItemLevel = PawnGetInventoryItemValues(Unit)
|
|
if Count > 0 then
|
|
Tooltip:AddLine(" ")
|
|
Tooltip:AddLine(PawnUI_InventoryPawnButton_Subheader, 1, 1, 1, 1)
|
|
PawnAddValuesToTooltip(Tooltip, ItemValues, true)
|
|
if PawnCommon.AlignNumbersRight then
|
|
Tooltip:AddDoubleLine(PawnLocal.AverageItemLevelTooltipLine, EpicItemLevel, VgerCore.Color.OrangeR, VgerCore.Color.OrangeG, VgerCore.Color.OrangeB, VgerCore.Color.OrangeR, VgerCore.Color.OrangeG, VgerCore.Color.OrangeB)
|
|
else
|
|
Tooltip:AddLine(PawnLocal.AverageItemLevelTooltipLine .. ": " .. EpicItemLevel, VgerCore.Color.OrangeR, VgerCore.Color.OrangeG, VgerCore.Color.OrangeB)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function PawnUI_InspectPawnButton_Attach()
|
|
-- It's possible that this will happen before the main initialization code, so we need to ensure that the
|
|
-- default Pawn options have been set already. Doing this multiple times is harmless.
|
|
PawnInitializeOptions()
|
|
|
|
VgerCore.Assert(InspectPaperDollFrame ~= nil, "InspectPaperDollFrame should be loaded by now!")
|
|
CreateFrame("Button", "PawnUI_InspectPawnButton", InspectPaperDollFrame, "PawnUI_InspectPawnButtonTemplate")
|
|
PawnUI_InspectPawnButton:SetParent(InspectPaperDollFrame)
|
|
PawnUI_InventoryPawnButton_Move()
|
|
end
|
|
|
|
function PawnUI_SocketingPawnButton_Attach()
|
|
-- It's possible that this will happen before the main initialization code, so we need to ensure that the
|
|
-- default Pawn options have been set already. Doing this multiple times is harmless.
|
|
PawnInitializeOptions()
|
|
|
|
-- Attach the socketing button.
|
|
VgerCore.Assert(ItemSocketingFrame ~= nil, "ItemSocketingFrame should be loaded by now!")
|
|
CreateFrame("Button", "PawnUI_SocketingPawnButton", ItemSocketingFrame, "PawnUI_SocketingPawnButtonTemplate")
|
|
PawnUI_SocketingPawnButton:SetParent(ItemSocketingFrame)
|
|
PawnUI_InventoryPawnButton_Move()
|
|
|
|
-- Hook the item update event.
|
|
VgerCore.HookInsecureFunction(ItemSocketingDescription, "SetSocketedItem", PawnUI_OnSocketUpdate)
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Scale selector events
|
|
------------------------------------------------------------
|
|
|
|
function PawnUIFrame_ScaleSelector_Refresh()
|
|
-- First, delete the existing scale lines.
|
|
for i = 1, PawnUITotalScaleLines do
|
|
local LineName = "PawnUIScaleLine" .. i
|
|
local Line = getglobal(LineName)
|
|
if Line then Line:Hide() end
|
|
setglobal(LineName, nil)
|
|
end
|
|
PawnUITotalScaleLines = 0
|
|
|
|
-- Get a sorted list of scale data and display it all.
|
|
local NewSelectedScale, FirstScale, ScaleData, LastHeader
|
|
for _, ScaleData in pairs(PawnGetAllScalesEx()) do
|
|
local ScaleName = ScaleData.Name
|
|
if ScaleName == PawnUICurrentScale then NewSelectedScale = ScaleName end
|
|
if not FirstScale then FirstScale = ScaleName end
|
|
-- Add the header if necessary.
|
|
if ScaleData.Header ~= LastHeader then
|
|
LastHeader = ScaleData.Header
|
|
PawnUIFrame_ScaleSelector_AddHeaderLine(LastHeader)
|
|
end
|
|
-- Then, list the scale.
|
|
PawnUIFrame_ScaleSelector_AddScaleLine(ScaleName, ScaleData.LocalizedName, ScaleData.IsVisible)
|
|
end
|
|
|
|
PawnUIScaleSelectorScrollContent:SetHeight(PawnUIScaleLineHeight * PawnUITotalScaleLines + PawnUIScaleSelectorPaddingBottom)
|
|
|
|
-- If the scale that they previously selected isn't in the list, or they didn't have a previously-selected
|
|
-- scale, just select the first visible one, or the first one if there's no visible scale.
|
|
PawnUICurrentScale = NewSelectedScale or FirstScale or PawnUINoScale
|
|
PawnUI_HighlightCurrentScale()
|
|
|
|
-- Also refresh a few other related UI elements.
|
|
PawnUIUpdateHeader()
|
|
PawnUIFrame_ShowScaleCheck_Update()
|
|
end
|
|
|
|
function PawnUIFrame_ScaleSelector_AddHeaderLine(Text)
|
|
local Line = PawnUIFrame_ScaleSelector_AddLineCore(Text)
|
|
Line:Disable()
|
|
end
|
|
|
|
function PawnUIFrame_ScaleSelector_AddScaleLine(ScaleName, LocalizedName, IsActive)
|
|
local ColoredName
|
|
--if IsActive then
|
|
-- ColoredName = PawnGetScaleColor(ScaleName) .. ScaleName
|
|
--else
|
|
ColoredName = LocalizedName
|
|
--end
|
|
local Line = PawnUIFrame_ScaleSelector_AddLineCore(" " .. ColoredName)
|
|
if not IsActive then
|
|
Line:SetNormalFontObject("PawnFontSilver")
|
|
end
|
|
Line.ScaleName = ScaleName
|
|
end
|
|
|
|
function PawnUIFrame_ScaleSelector_AddLineCore(Text)
|
|
PawnUITotalScaleLines = PawnUITotalScaleLines + 1
|
|
local LineName = "PawnUIScaleLine" .. PawnUITotalScaleLines
|
|
local Line = CreateFrame("Button", LineName, PawnUIScaleSelectorScrollContent, "PawnUIFrame_ScaleSelector_ItemTemplate")
|
|
Line:SetPoint("TOPLEFT", PawnUIScaleSelectorScrollContent, "TOPLEFT", 0, -PawnUIScaleLineHeight * (PawnUITotalScaleLines - 1))
|
|
Line:SetText(Text)
|
|
return Line, LineName
|
|
end
|
|
|
|
function PawnUIFrame_ScaleSelector_OnClick(this)
|
|
PawnUI_SelectScale(this.ScaleName)
|
|
end
|
|
|
|
-- Selects a scale in CurrentScaleDropDown.
|
|
function PawnUI_SelectScale(ScaleName)
|
|
-- Close popup UI as necessary.
|
|
PawnUIStringDialog:Hide()
|
|
ColorPickerFrame:Hide()
|
|
-- Select the scale.
|
|
PawnUICurrentScale = ScaleName
|
|
PawnUI_HighlightCurrentScale()
|
|
-- After selecting a new scale, update the rest of the UI.
|
|
PawnUIFrame_ShowScaleCheck_Update()
|
|
PawnUIUpdateHeader()
|
|
if PawnUIScalesTabPage:IsVisible() then
|
|
PawnUI_ScalesTab_Refresh()
|
|
end
|
|
if PawnUIValuesTabPage:IsVisible() then
|
|
PawnUI_ValuesTab_Refresh()
|
|
end
|
|
if PawnUICompareTabPage:IsVisible() then
|
|
PawnUI_CompareItems()
|
|
end
|
|
if PawnUIGemsTabPage:IsVisible() then
|
|
PawnUI_ShowBestGems()
|
|
end
|
|
end
|
|
|
|
function PawnUI_HighlightCurrentScale()
|
|
PawnUIFrame_ScaleSelector_HighlightFrame:ClearAllPoints()
|
|
PawnUIFrame_ScaleSelector_HighlightFrame:Hide()
|
|
for i = 1, PawnUITotalScaleLines do
|
|
local LineName = "PawnUIScaleLine" .. i
|
|
local Line = getglobal(LineName)
|
|
if Line and Line.ScaleName == PawnUICurrentScale then
|
|
PawnUIFrame_ScaleSelector_HighlightFrame:SetPoint("TOPLEFT", "PawnUIScaleLine" .. i, "TOPLEFT", 0, 0)
|
|
PawnUIFrame_ScaleSelector_HighlightFrame:Show()
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Scales tab events
|
|
------------------------------------------------------------
|
|
|
|
function PawnUI_ScalesTab_Refresh()
|
|
PawnUIFrame_ScaleColorSwatch_Update()
|
|
|
|
if PawnUICurrentScale ~= PawnUINoScale then
|
|
PawnUIFrame_ScaleNameLabel:SetText(PawnGetScaleColor(PawnUICurrentScale) .. PawnGetScaleLocalizedName(PawnUICurrentScale))
|
|
if PawnScaleIsReadOnly(PawnUICurrentScale) then
|
|
PawnUIFrame_ScaleTypeLabel:SetText(PawnUIFrame_ScaleTypeLabel_ReadOnlyScaleText)
|
|
PawnUIFrame_RenameScaleButton:Disable()
|
|
PawnUIFrame_DeleteScaleButton:Disable()
|
|
else
|
|
PawnUIFrame_ScaleTypeLabel:SetText(PawnUIFrame_ScaleTypeLabel_NormalScaleText)
|
|
PawnUIFrame_RenameScaleButton:Enable()
|
|
PawnUIFrame_DeleteScaleButton:Enable()
|
|
end
|
|
PawnUIFrame_CopyScaleButton:Enable()
|
|
PawnUIFrame_ExportScaleButton:Enable()
|
|
else
|
|
PawnUIFrame_ScaleNameLabel:SetText(PawnUINoScale)
|
|
PawnUIFrame_CopyScaleButton:Disable()
|
|
PawnUIFrame_RenameScaleButton:Disable()
|
|
PawnUIFrame_DeleteScaleButton:Disable()
|
|
PawnUIFrame_ExportScaleButton:Disable()
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Values tab events
|
|
------------------------------------------------------------
|
|
|
|
function PawnUI_ValuesTab_Refresh()
|
|
PawnUIFrame_StatsList_Update()
|
|
PawnUIFrame_StatsList_SelectStat(PawnUICurrentStatIndex)
|
|
local Scale
|
|
if PawnUICurrentScale ~= PawnUINoScale then Scale = PawnCommon.Scales[PawnUICurrentScale] end
|
|
|
|
if PawnUICurrentScale == PawnUINoScale then
|
|
PawnUIFrame_ValuesWelcomeLabel:SetText(PawnUIFrame_ValuesWelcomeLabel_NoScalesText)
|
|
elseif PawnScaleIsReadOnly(PawnUICurrentScale) then
|
|
PawnUIFrame_ValuesWelcomeLabel:SetText(PawnUIFrame_ValuesWelcomeLabel_ReadOnlyScaleText)
|
|
PawnUIFrame_NormalizeValuesCheck:Disable()
|
|
else
|
|
PawnUIFrame_ValuesWelcomeLabel:SetText(PawnUIFrame_ValuesWelcomeLabel_NormalText)
|
|
PawnUIFrame_NormalizeValuesCheck:Enable()
|
|
end
|
|
if Scale then
|
|
PawnUIFrame_NormalizeValuesCheck:SetChecked(Scale.NormalizationFactor and Scale.NormalizationFactor > 0)
|
|
PawnUIFrame_NormalizeValuesCheck:Show()
|
|
else
|
|
PawnUIFrame_NormalizeValuesCheck:Hide()
|
|
end
|
|
end
|
|
|
|
function PawnUIFrame_ImportScaleButton_OnClick()
|
|
PawnUIImportScale()
|
|
end
|
|
|
|
function PawnUIFrame_NewScaleButton_OnClick()
|
|
PawnUIGetString(PawnLocal.NewScaleEnterName, "", PawnUIFrame_NewScale_OnOK)
|
|
end
|
|
|
|
function PawnUIFrame_NewScale_OnOK(NewScaleName)
|
|
-- Does this scale already exist?
|
|
if NewScaleName == PawnUINoScale then
|
|
PawnUIGetString(PawnLocal.NewScaleEnterName, "", PawnUIFrame_NewScale_OnOK)
|
|
return
|
|
elseif strfind(NewScaleName, "\"") then
|
|
PawnUIGetString(PawnLocal.NewScaleNoQuotes, NewScaleName, PawnUIFrame_NewScale_OnOK)
|
|
elseif PawnDoesScaleExist(NewScaleName) then
|
|
PawnUIGetString(PawnLocal.NewScaleDuplicateName, NewScaleName, PawnUIFrame_NewScale_OnOK)
|
|
return
|
|
end
|
|
|
|
-- Add and select the scale.
|
|
PawnAddEmptyScale(NewScaleName)
|
|
PawnUIFrame_ScaleSelector_Refresh()
|
|
PawnUI_SelectScale(NewScaleName)
|
|
PawnUISwitchToTab(PawnUIValuesTabPage)
|
|
end
|
|
|
|
function PawnUIFrame_NewScaleFromDefaultsButton_OnClick()
|
|
PawnUIGetString(PawnLocal.NewScaleEnterName, "", PawnUIFrame_NewScaleFromDefaults_OnOK)
|
|
end
|
|
|
|
function PawnUIFrame_NewScaleFromDefaults_OnOK(NewScaleName)
|
|
-- Does this scale already exist?
|
|
if NewScaleName == PawnUINoScale then
|
|
PawnUIGetString(PawnLocal.NewScaleEnterName, "", PawnUIFrame_NewScaleFromDefaults_OnOK)
|
|
return
|
|
elseif strfind(NewScaleName, "\"") then
|
|
PawnUIGetString(PawnLocal.NewScaleNoQuotes, NewScaleName, PawnUIFrame_NewScaleFromDefaults_OnOK)
|
|
elseif PawnDoesScaleExist(NewScaleName) then
|
|
PawnUIGetString(PawnLocal.NewScaleDuplicateName, NewScaleName, PawnUIFrame_NewScaleFromDefaults_OnOK)
|
|
return
|
|
end
|
|
|
|
-- Add and select the scale.
|
|
PawnAddDefaultScale(NewScaleName)
|
|
PawnUIFrame_ScaleSelector_Refresh()
|
|
PawnUI_SelectScale(NewScaleName)
|
|
PawnUISwitchToTab(PawnUIValuesTabPage)
|
|
end
|
|
|
|
function PawnUIFrame_ExportScaleButton_OnClick()
|
|
PawnUIExportScale(PawnUICurrentScale)
|
|
end
|
|
|
|
function PawnUIFrame_RenameScaleButton_OnClick()
|
|
PawnUIGetString(format(PawnLocal.RenameScaleEnterName, PawnUICurrentScale), PawnUICurrentScale, PawnUIFrame_RenameScale_OnOK)
|
|
end
|
|
|
|
function PawnUIFrame_CopyScaleButton_OnClick()
|
|
PawnUIGetString(format(PawnLocal.CopyScaleEnterName, PawnGetScaleLocalizedName(PawnUICurrentScale)), "", PawnUIFrame_CopyScale_OnOK)
|
|
end
|
|
|
|
-- Shows a dialog where the user can copy a scale tag for a given scale to the clipboard.
|
|
-- Immediately returns true if successful, or false if not.
|
|
function PawnUIExportScale(ScaleName)
|
|
local ScaleTag = PawnGetScaleTag(ScaleName)
|
|
if ScaleTag then
|
|
PawnUIShowCopyableString(format(PawnLocal.ExportScaleMessage, PawnGetScaleLocalizedName(PawnUICurrentScale)), ScaleTag)
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- Exports all custom scales as a series of scale tags.
|
|
function PawnUIExportAllScales()
|
|
local ScaleTags, ScaleName, Scale
|
|
ScaleTags = ""
|
|
for ScaleName in pairs(PawnCommon.Scales) do
|
|
if not PawnScaleIsReadOnly(ScaleName) then ScaleTags = ScaleTags .. PawnGetScaleTag(ScaleName) .. " " end
|
|
end
|
|
if ScaleTags and ScaleTags ~= "" then
|
|
PawnUIShowCopyableString(PawnLocal.ExportAllScalesMessage, ScaleTags)
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- Shows a dialog where the user can paste a scale tag from the clipboard.
|
|
-- Immediately returns.
|
|
function PawnUIImportScale()
|
|
PawnUIGetString(PawnLocal.ImportScaleMessage, "", PawnUIImportScaleCallback)
|
|
end
|
|
|
|
-- Callback function for PawnUIImportScale.
|
|
function PawnUIImportScaleCallback(ScaleTag)
|
|
-- Try to import the scale. If successful, we don't need to do anything else.
|
|
local Status, ScaleName = PawnImportScale(ScaleTag, true) -- allow overwriting a scale with the same name
|
|
if Status == PawnImportScaleResultSuccess then
|
|
if PawnUIFrame_ScaleSelector_Refresh then
|
|
-- Select the new scale if the UI is up.
|
|
PawnUIFrame_ScaleSelector_Refresh()
|
|
PawnUI_SelectScale(ScaleName)
|
|
PawnUISwitchToTab(PawnUIValuesTabPage)
|
|
end
|
|
return
|
|
end
|
|
|
|
-- If there was a problem, show an error message or reshow the dialog as appropriate.
|
|
if Status == PawnImportScaleResultAlreadyExists then
|
|
VgerCore.Message(VgerCore.Color.Salmon .. format(PawnLocal.ImportScaleAlreadyExistsMessage, ScaleName))
|
|
return
|
|
end
|
|
if Status == PawnImportScaleResultTagError then
|
|
-- Don't use the tag that was pasted as the default value; it makes it harder to paste.
|
|
PawnUIGetString(PawnLocal.ImportScaleTagErrorMessage, "", PawnUIImportScaleCallback)
|
|
return
|
|
end
|
|
|
|
VgerCore.Fail("Unexpected PawnImportScaleResult value: " .. tostring(Status))
|
|
end
|
|
|
|
function PawnUIFrame_RenameScale_OnOK(NewScaleName)
|
|
-- Did they change anything?
|
|
if NewScaleName == PawnUICurrentScale then return end
|
|
|
|
-- Does this scale already exist?
|
|
if NewScaleName == PawnUINoScale then
|
|
PawnUIGetString(format(PawnLocal.RenameScaleEnterName, PawnUICurrentScale), PawnUICurrentScale, PawnUIFrame_RenameScale_OnOK)
|
|
return
|
|
elseif strfind(NewScaleName, "\"") then
|
|
PawnUIGetString(PawnLocal.NewScaleNoQuotes, NewScaleName, PawnUIFrame_RenameScale_OnOK)
|
|
elseif PawnDoesScaleExist(NewScaleName) then
|
|
PawnUIGetString(PawnLocal.NewScaleDuplicateName, PawnUICurrentScale, PawnUIFrame_RenameScale_OnOK)
|
|
return
|
|
end
|
|
|
|
-- Rename and select the scale.
|
|
PawnRenameScale(PawnUICurrentScale, NewScaleName)
|
|
PawnUIFrame_ScaleSelector_Refresh()
|
|
PawnUI_SelectScale(NewScaleName)
|
|
end
|
|
|
|
function PawnUIFrame_CopyScale_OnOK(NewScaleName)
|
|
-- Does this scale already exist?
|
|
if NewScaleName == PawnUINoScale then
|
|
PawnUIGetString(PawnLocal.CopyScaleEnterName, "", PawnUIFrame_CopyScale_OnOK)
|
|
return
|
|
elseif strfind(NewScaleName, "\"") then
|
|
PawnUIGetString(PawnLocal.NewScaleNoQuotes, NewScaleName, PawnUIFrame_CopyScale_OnOK)
|
|
elseif PawnDoesScaleExist(NewScaleName) then
|
|
PawnUIGetString(PawnLocal.NewScaleDuplicateName, NewScaleName, PawnUIFrame_CopyScale_OnOK)
|
|
return
|
|
end
|
|
|
|
-- Create the new scale.
|
|
PawnDuplicateScale(PawnUICurrentScale, NewScaleName)
|
|
PawnUIFrame_ScaleSelector_Refresh()
|
|
PawnUI_SelectScale(NewScaleName)
|
|
PawnUISwitchToTab(PawnUIValuesTabPage)
|
|
end
|
|
|
|
function PawnUIFrame_DeleteScaleButton_OnClick()
|
|
if IsShiftKeyDown() then
|
|
-- If the user held down the shift key when clicking the Delete button, just do it immediately.
|
|
PawnUIFrame_DeleteScaleButton_OnOK(DELETE_ITEM_CONFIRM_STRING)
|
|
else
|
|
PawnUIGetString(format(PawnLocal.DeleteScaleConfirmation, PawnUICurrentScale, DELETE_ITEM_CONFIRM_STRING), "", PawnUIFrame_DeleteScaleButton_OnOK)
|
|
end
|
|
end
|
|
|
|
function PawnUIFrame_DeleteScaleButton_OnOK(ConfirmationText)
|
|
-- If they didn't type "DELETE" (ignoring case), just exit.
|
|
if strlower(ConfirmationText) ~= strlower(DELETE_ITEM_CONFIRM_STRING) then return end
|
|
|
|
PawnDeleteScale(PawnUICurrentScale)
|
|
PawnUICurrentScale = nil
|
|
PawnUIFrame_ScaleSelector_Refresh()
|
|
PawnUI_ScalesTab_Refresh()
|
|
end
|
|
|
|
function PawnUIFrame_StatsList_Update()
|
|
if not PawnStats then return end
|
|
|
|
-- First, update the control and get our new offset.
|
|
FauxScrollFrame_Update(PawnUIFrame_StatsList, #PawnStats, PawnUIStatsListHeight, PawnUIStatsListItemHeight) -- list, number of items, number of items visible per page, item height
|
|
local Offset = FauxScrollFrame_GetOffset(PawnUIFrame_StatsList)
|
|
|
|
-- Then, update the list items as necessary.
|
|
local ThisScale
|
|
if PawnUICurrentScale ~= PawnUINoScale then ThisScale = PawnGetAllStatValues(PawnUICurrentScale) end
|
|
local i
|
|
for i = 1, PawnUIStatsListHeight do
|
|
local Index = i + Offset
|
|
PawnUIFrame_StatsList_UpdateStatItem(i, Index, ThisScale)
|
|
end
|
|
|
|
-- After the user scrolled, we need to adjust their selection.
|
|
PawnUIFrame_StatsList_MoveHighlight()
|
|
|
|
end
|
|
|
|
-- Updates a single stat in the list based on its index into the PawnStats table.
|
|
function PawnUIFrame_StatsList_UpdateStat(Index)
|
|
local Offset = FauxScrollFrame_GetOffset(PawnUIFrame_StatsList)
|
|
local i = Index - Offset
|
|
if i <= 0 or i > PawnUIStatsListHeight then return end
|
|
|
|
PawnUIFrame_StatsList_UpdateStatItem(i, Index, PawnGetAllStatValues(PawnUICurrentScale))
|
|
end
|
|
|
|
-- Updates a single stat in the list.
|
|
function PawnUIFrame_StatsList_UpdateStatItem(i, Index, ThisScale)
|
|
local Title = PawnStats[Index][1]
|
|
local ThisStat = PawnStats[Index][2]
|
|
local Line = getglobal("PawnUIFrame_StatsList_Item" .. i)
|
|
|
|
if Index <= #PawnStats then
|
|
if not ThisStat then
|
|
-- This is a header row.
|
|
Line:SetText(Title)
|
|
Line:Disable()
|
|
elseif ThisScale and ThisScale[ThisStat] then
|
|
-- This is a stat that's in the current scale.
|
|
Line:SetText(" " .. Title .. " = " .. format("%g", ThisScale[ThisStat]))
|
|
Line:SetNormalFontObject("GameFontHighlight")
|
|
Line:Enable()
|
|
else
|
|
-- This is a stat that's not in the current scale.
|
|
Line:SetText(" " .. Title)
|
|
Line:SetNormalFontObject("PawnFontSilver")
|
|
Line:Enable()
|
|
end
|
|
Line:Show()
|
|
else
|
|
Line:Hide()
|
|
end
|
|
end
|
|
|
|
-- Adjusts PawnUICurrentListIndex and the position of the highlight based on PawnUICurrentStatIndex.
|
|
function PawnUIFrame_StatsList_MoveHighlight()
|
|
-- If no stat is selected, just hide the highlight.
|
|
if not PawnUICurrentStatIndex or PawnUICurrentStatIndex == 0 then
|
|
PawnUICurrentListIndex = 0
|
|
PawnUIFrame_StatsList_HighlightFrame:Hide()
|
|
return
|
|
end
|
|
|
|
-- Otherwise, see if we need to draw a highlight. If the selected stat isn't visible, we shouldn't draw anything.
|
|
local Offset = FauxScrollFrame_GetOffset(PawnUIFrame_StatsList)
|
|
local i = PawnUICurrentStatIndex - Offset
|
|
if i <= 0 or i > PawnUIStatsListHeight then
|
|
PawnUICurrentListIndex = 0
|
|
PawnUIFrame_StatsList_HighlightFrame:Hide()
|
|
return
|
|
end
|
|
|
|
-- If we made it this far, then we need to draw a highlight.
|
|
PawnUICurrentListIndex = i
|
|
PawnUIFrame_StatsList_HighlightFrame:ClearAllPoints()
|
|
PawnUIFrame_StatsList_HighlightFrame:SetPoint("TOPLEFT", "PawnUIFrame_StatsList_Item" .. i, "TOPLEFT", 0, 0)
|
|
PawnUIFrame_StatsList_HighlightFrame:Show()
|
|
end
|
|
|
|
-- This is the click handler for list item #i.
|
|
function PawnUIFrame_StatsList_OnClick(i)
|
|
if not i or i <= 0 or i > PawnUIStatsListHeight then return end
|
|
|
|
local Offset = FauxScrollFrame_GetOffset(PawnUIFrame_StatsList)
|
|
local Index = i + Offset
|
|
|
|
PawnUIFrame_StatsList_SelectStat(Index)
|
|
end
|
|
|
|
function PawnUIFrame_StatsList_SelectStat(Index)
|
|
-- First, make sure that the stat is in the correct range.
|
|
if not Index or Index < 0 or Index > #PawnStats then
|
|
Index = 0
|
|
end
|
|
|
|
-- Then, find out what they've clicked on.
|
|
local Title, ThisStat, ThisDescription, ThisPrompt
|
|
if Index > 0 then
|
|
Title = PawnStats[Index][1]
|
|
ThisStat = PawnStats[Index][2]
|
|
if ThisStat then
|
|
-- This is a stat, not a header row.
|
|
else
|
|
-- This is a header row, or empty space.
|
|
Index = 0
|
|
end
|
|
end
|
|
PawnUICurrentStatIndex = Index
|
|
|
|
-- Show, move, or hide the highlight as appropriate.
|
|
PawnUIFrame_StatsList_MoveHighlight()
|
|
|
|
-- Finally, change the UI to the right.
|
|
local ThisScale
|
|
if PawnUICurrentScale ~= PawnUINoScale then ThisScale = PawnGetAllStatValues(PawnUICurrentScale) end
|
|
if Index > 0 and ThisScale then
|
|
-- They've selected a stat.
|
|
ThisDescription = PawnStats[Index][3]
|
|
PawnUIFrame_DescriptionLabel:SetText(ThisDescription)
|
|
ThisPrompt = PawnStats[Index][4]
|
|
if ThisPrompt then
|
|
PawnUIFrame_StatNameLabel:SetText(ThisPrompt)
|
|
else
|
|
PawnUIFrame_StatNameLabel:SetText(format(PawnLocal.StatNameText, Title))
|
|
end
|
|
PawnUIFrame_StatNameLabel:Show()
|
|
local ThisScaleValue = ThisScale[ThisStat]
|
|
local ThisScaleValueUneditable = ThisScaleValue
|
|
if not ThisScaleValueUneditable then ThisScaleValueUneditable = "0" end
|
|
if not ThisScaleValue or ThisScaleValue == 0 then ThisScaleValue = "" else ThisScaleValue = tostring(ThisScaleValue) end
|
|
PawnUIFrame_StatValueBox.SettingValue = (PawnUIFrame_StatValueBox:GetText() ~= ThisScaleValue)
|
|
PawnUIFrame_StatValueBox:SetText(ThisScaleValue)
|
|
PawnUIFrame_StatValueLabel:SetText(ThisScaleValueUneditable)
|
|
PawnUIFrame_ScaleSocketOptionsList_UpdateSelection()
|
|
elseif PawnUICurrentScale == PawnUINoScale then
|
|
-- They don't have any scales.
|
|
PawnUIFrame_DescriptionLabel:SetText(PawnLocal.NoScalesDescription)
|
|
PawnUIFrame_StatNameLabel:Hide()
|
|
PawnUIFrame_StatValueBox:Hide()
|
|
PawnUIFrame_StatValueLabel:Hide()
|
|
PawnUIFrame_ClearValueButton:Hide()
|
|
PawnUIFrame_ScaleSocketOptionsList:Hide()
|
|
else
|
|
-- They haven't selected a stat.
|
|
PawnUIFrame_DescriptionLabel:SetText(PawnLocal.NoStatDescription)
|
|
PawnUIFrame_StatNameLabel:Hide()
|
|
PawnUIFrame_StatValueBox:Hide()
|
|
PawnUIFrame_StatValueLabel:Hide()
|
|
PawnUIFrame_ClearValueButton:Hide()
|
|
PawnUIFrame_ScaleSocketOptionsList:Hide()
|
|
end
|
|
|
|
end
|
|
|
|
function PawnUIFrame_StatValueBox_OnTextChanged()
|
|
if PawnScaleIsReadOnly(PawnUICurrentScale) then return end
|
|
|
|
local NewString = gsub(PawnUIFrame_StatValueBox:GetText(), ",", ".")
|
|
local NewValue = tonumber(NewString)
|
|
if NewValue == 0 then NewValue = nil end
|
|
|
|
if NewValue then
|
|
PawnUIFrame_ClearValueButton:Enable()
|
|
else
|
|
PawnUIFrame_ClearValueButton:Disable()
|
|
end
|
|
|
|
-- If other code is setting this value, we should ignore this event and not set any values.
|
|
if PawnUIFrame_StatValueBox.SettingValue then
|
|
PawnUIFrame_StatValueBox.SettingValue = false
|
|
return
|
|
end
|
|
PawnSetStatValue(PawnUICurrentScale, PawnStats[PawnUICurrentStatIndex][2], NewValue)
|
|
PawnUIFrame_StatsList_UpdateStat(PawnUICurrentStatIndex)
|
|
|
|
-- If the user edited a non-socket value and smart socketing is on, update the sockets too.
|
|
-- (The socket values were already updated in PawnSetStatValue.)
|
|
if PawnUICurrentStatIndex and
|
|
PawnUICurrentStatIndex ~= PawnUIStats_RedSocketIndex and
|
|
PawnUICurrentStatIndex ~= PawnUIStats_YellowSocketIndex and
|
|
PawnUICurrentStatIndex ~= PawnUIStats_BlueSocketIndex and
|
|
PawnUICurrentStatIndex ~= PawnUIStats_MetaSocketIndex and
|
|
PawnUICurrentStatIndex ~= PawnUIStats_MetaStatsSocketIndex then
|
|
if PawnCommon.Scales[PawnUICurrentScale].SmartGemSocketing then
|
|
PawnUIFrame_StatsList_UpdateStat(PawnUIStats_RedSocketIndex)
|
|
PawnUIFrame_StatsList_UpdateStat(PawnUIStats_YellowSocketIndex)
|
|
PawnUIFrame_StatsList_UpdateStat(PawnUIStats_BlueSocketIndex)
|
|
end
|
|
if PawnCommon.Scales[PawnUICurrentScale].SmartMetaGemSocketing then
|
|
PawnUIFrame_StatsList_UpdateStat(PawnUIStats_MetaSocketIndex)
|
|
end
|
|
end
|
|
end
|
|
|
|
function PawnUIFrame_ClearValueButton_OnClick()
|
|
PawnUIFrame_StatValueBox:SetText("")
|
|
end
|
|
|
|
function PawnUIFrame_GetCurrentScaleColor()
|
|
local r, g, b
|
|
if PawnUICurrentScale and PawnUICurrentScale ~= PawnUINoScale then r, g, b = VgerCore.HexToRGB(PawnCommon.Scales[PawnUICurrentScale].Color) end
|
|
if not r then
|
|
r, g, b = VgerCore.Color.BlueR, VgerCore.Color.BlueG, VgerCore.Color.BlueB
|
|
end
|
|
return r, g, b
|
|
end
|
|
|
|
function PawnUIFrame_ScaleColorSwatch_OnClick()
|
|
-- Get the color of the current scale.
|
|
local r, g, b = PawnUIFrame_GetCurrentScaleColor()
|
|
ColorPickerFrame.func = PawnUIFrame_ScaleColorSwatch_OnChange
|
|
ColorPickerFrame.cancelFunc = PawnUIFrame_ScaleColorSwatch_OnCancel
|
|
ColorPickerFrame.previousValues = { r, g, b }
|
|
ColorPickerFrame.hasOpacity = false
|
|
ColorPickerFrame:SetColorRGB(r, g, b)
|
|
ColorPickerFrame:SetFrameStrata("HIGH")
|
|
ColorPickerFrame:Show()
|
|
end
|
|
|
|
function PawnUIFrame_ScaleColorSwatch_OnChange()
|
|
local r, g, b = ColorPickerFrame:GetColorRGB()
|
|
PawnUIFrame_ScaleColorSwatch_SetColor(r, g, b)
|
|
end
|
|
|
|
function PawnUIFrame_ScaleColorSwatch_OnCancel(rgb)
|
|
local r, g, b = unpack(rgb)
|
|
PawnUIFrame_ScaleColorSwatch_SetColor(r, g, b)
|
|
end
|
|
|
|
function PawnUIFrame_ScaleColorSwatch_SetColor(r, g, b)
|
|
PawnSetScaleColor(PawnUICurrentScale, VgerCore.RGBToHex(r, g, b))
|
|
PawnUI_ScalesTab_Refresh()
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_ScaleColorSwatch_Update()
|
|
if PawnUICurrentScale ~= PawnUINoScale then
|
|
local r, g, b = PawnUIFrame_GetCurrentScaleColor()
|
|
PawnUIFrame_ScaleColorSwatch_Color:SetTexture(r, g, b)
|
|
PawnUIFrame_ScaleColorSwatch_Label:Show()
|
|
PawnUIFrame_ScaleColorSwatch:Show()
|
|
else
|
|
PawnUIFrame_ScaleColorSwatch_Label:Hide()
|
|
PawnUIFrame_ScaleColorSwatch:Hide()
|
|
end
|
|
end
|
|
|
|
function PawnUIFrame_ShowScaleCheck_Update()
|
|
if PawnUICurrentScale ~= PawnUINoScale then
|
|
PawnUIFrame_ShowScaleCheck:SetChecked(PawnIsScaleVisible(PawnUICurrentScale))
|
|
PawnUIFrame_ShowScaleCheck:Show()
|
|
else
|
|
PawnUIFrame_ShowScaleCheck:Hide()
|
|
end
|
|
end
|
|
|
|
function PawnUIFrame_ShowScaleCheck_OnClick()
|
|
PawnSetScaleVisible(PawnUICurrentScale, PawnUIFrame_ShowScaleCheck:GetChecked())
|
|
PawnUIFrame_ScaleSelector_Refresh()
|
|
end
|
|
|
|
function PawnUIFrame_ScaleSocketOptionsList_SetSelection(Value)
|
|
if PawnUICurrentScale == PawnUINoScale then return end
|
|
if not PawnCommon.Scales[PawnUICurrentScale] then return end
|
|
if PawnUICurrentStatIndex == PawnUIStats_MetaSocketIndex then
|
|
PawnCommon.Scales[PawnUICurrentScale].SmartMetaGemSocketing = Value
|
|
else
|
|
PawnCommon.Scales[PawnUICurrentScale].SmartGemSocketing = Value
|
|
end
|
|
PawnUIFrame_ScaleSocketOptionsList_UpdateSelection()
|
|
-- Changing the socketing option affects scale values, so we'll have to recalculate everything.
|
|
PawnRecalculateScaleTotal(PawnUICurrentScale)
|
|
PawnResetTooltips()
|
|
PawnUIFrame_StatsList_UpdateStat(PawnUIStats_RedSocketIndex)
|
|
PawnUIFrame_StatsList_UpdateStat(PawnUIStats_YellowSocketIndex)
|
|
PawnUIFrame_StatsList_UpdateStat(PawnUIStats_BlueSocketIndex)
|
|
PawnUIFrame_StatsList_UpdateStat(PawnUIStats_MetaSocketIndex)
|
|
end
|
|
|
|
function PawnUIFrame_ScaleSocketOptionsList_UpdateSelection()
|
|
if PawnUICurrentScale == PawnUINoScale then return end
|
|
if not PawnCommon.Scales[PawnUICurrentScale] then return end
|
|
|
|
local IsReadOnly = PawnScaleIsReadOnly(PawnUICurrentScale)
|
|
local ShowEditingUI = not IsReadOnly
|
|
if (not IsReadOnly) and
|
|
(PawnUICurrentStatIndex == PawnUIStats_RedSocketIndex or
|
|
PawnUICurrentStatIndex == PawnUIStats_YellowSocketIndex or
|
|
PawnUICurrentStatIndex == PawnUIStats_BlueSocketIndex or
|
|
PawnUICurrentStatIndex == PawnUIStats_MetaSocketIndex) then
|
|
local SmartSocketing
|
|
if PawnUICurrentStatIndex == PawnUIStats_MetaSocketIndex then
|
|
SmartSocketing = PawnCommon.Scales[PawnUICurrentScale].SmartMetaGemSocketing
|
|
else
|
|
SmartSocketing = PawnCommon.Scales[PawnUICurrentScale].SmartGemSocketing
|
|
end
|
|
if SmartSocketing then
|
|
ShowEditingUI = false
|
|
PawnUIFrame_ScaleSocketBestRadio:SetChecked(true)
|
|
PawnUIFrame_ScaleSocketCorrectRadio:SetChecked(false)
|
|
else
|
|
PawnUIFrame_ScaleSocketBestRadio:SetChecked(false)
|
|
PawnUIFrame_ScaleSocketCorrectRadio:SetChecked(true)
|
|
end
|
|
PawnUIFrame_ScaleSocketOptionsList:Show()
|
|
else
|
|
PawnUIFrame_ScaleSocketOptionsList:Hide()
|
|
end
|
|
if ShowEditingUI then
|
|
PawnUIFrame_StatValueBox:Show()
|
|
PawnUIFrame_StatValueLabel:Hide()
|
|
PawnUIFrame_ClearValueButton:Show()
|
|
else
|
|
PawnUIFrame_StatValueBox:Hide()
|
|
PawnUIFrame_StatValueLabel:Show()
|
|
PawnUIFrame_ClearValueButton:Hide()
|
|
end
|
|
end
|
|
|
|
function PawnUIFrame_NormalizeValuesCheck_OnClick()
|
|
if PawnUICurrentScale == PawnUINoScale or PawnScaleIsReadOnly(PawnUICurrentScale) then return end
|
|
local Scale = PawnCommon.Scales[PawnUICurrentScale]
|
|
|
|
if PawnUIFrame_NormalizeValuesCheck:GetChecked() then
|
|
Scale.NormalizationFactor = 1
|
|
else
|
|
Scale.NormalizationFactor = nil
|
|
end
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Compare tab
|
|
------------------------------------------------------------
|
|
|
|
-- Initializes the Compare tab if it hasn't already been initialized.
|
|
local PawnUI_CompareTabInitialized
|
|
function PawnUI_InitCompareTab()
|
|
-- This only needs to be run once.
|
|
if PawnUI_CompareTabInitialized then return end
|
|
PawnUI_CompareTabInitialized = true
|
|
|
|
-- All the Compare tab needs to do here is clear out the comparison items. Initializing the dropdown
|
|
-- is actually covered by existing code.
|
|
PawnUI_ClearCompareItems()
|
|
end
|
|
|
|
-- Sets either the left (index 1) or right (index 2) comparison item, using an item link. If the passed item
|
|
-- link is nil, that comparison item is instead cleared out. Returns true if an item was actually placed in the
|
|
-- slot or cleared from the slot.
|
|
function PawnUI_SetCompareItem(Index, ItemLink)
|
|
PawnUI_InitCompareTab()
|
|
if Index ~= 1 and Index ~= 2 then
|
|
VgerCore.Fail("Index must be 1 or 2.")
|
|
return
|
|
end
|
|
|
|
-- Get the item data for this item link; we can't do a comparison without it.
|
|
local Item
|
|
if ItemLink then
|
|
-- If they passed item data instead of an item link, just use that. Otherwise, get item data from the link.
|
|
if type(ItemLink) == "table" then
|
|
Item = ItemLink
|
|
ItemLink = Item.Link
|
|
if not ItemLink then
|
|
VgerCore.Fail("Second parameter must be an item link or item data from PawnGetItemData.")
|
|
return
|
|
end
|
|
else
|
|
-- Unenchant the item link.
|
|
local UnenchantedLink = PawnUnenchantItemLink(ItemLink)
|
|
if UnenchantedLink then ItemLink = UnenchantedLink end
|
|
Item = PawnGetItemData(ItemLink)
|
|
VgerCore.Assert(Item, "Failed to get item data while setting an comparison item!")
|
|
end
|
|
end
|
|
local ItemName, ItemRarity, ItemEquipLoc, ItemTexture
|
|
local SlotID1, SlotID2
|
|
if ItemLink then
|
|
ItemName, _, ItemRarity, _, _, _, _, _, ItemEquipLoc, ItemTexture = GetItemInfo(ItemLink)
|
|
SlotID1, SlotID2 = PawnGetSlotsForItemType(ItemEquipLoc)
|
|
else
|
|
ItemName = PawnUIFrame_VersusHeader_NoItem
|
|
ItemRarity = 0
|
|
end
|
|
|
|
-- Items that are not equippable cannot be placed in the Compare slots.
|
|
if ItemLink and SlotID1 == nil and SlotID2 == nil then return end
|
|
|
|
-- Save the item data locally, in case the item is later removed from the main Pawn item cache.
|
|
PawnUIComparisonItems[Index] = Item
|
|
|
|
-- Now, update the item name and icon.
|
|
local Label = getglobal("PawnUICompareItemName" .. Index)
|
|
local Texture = getglobal("PawnUICompareItemIconTexture" .. Index)
|
|
Label:SetText(ItemName)
|
|
-- Workaround: ITEM_QUALITY_COLORS does not have a [7]. :(
|
|
if ItemRarity == 7 then ItemRarity = 6 end
|
|
local Color = ITEM_QUALITY_COLORS[ItemRarity]
|
|
if Color then Label:SetVertexColor(Color.r, Color.g, Color.b) end
|
|
Texture:SetTexture(ItemTexture)
|
|
|
|
-- If this item is a different type than the existing item, clear out the existing item.
|
|
if ItemLink then
|
|
local OtherIndex
|
|
if Index == 1 then OtherIndex = 2 else OtherIndex = 1 end
|
|
if PawnUIComparisonItems[OtherIndex] then
|
|
_, _, _, _, _, _, _, _, OtherItemEquipLoc = GetItemInfo(PawnUIComparisonItems[OtherIndex].Link)
|
|
local OtherSlotID1, OtherSlotID2 = PawnGetSlotsForItemType(OtherItemEquipLoc)
|
|
if not (
|
|
(SlotID1 == nil and SlotID2 == nil and OtherSlotID1 == nil and OtherSlotID2 == nil) or
|
|
(SlotID1 and (SlotID1 == OtherSlotID1 or SlotID1 == OtherSlotID2)) or
|
|
(SlotID2 and (SlotID2 == OtherSlotID1 or SlotID2 == OtherSlotID2))
|
|
) then
|
|
PawnUI_SetCompareItem(OtherIndex, nil)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Update the item shortcuts. The item shortcuts appear on the left side, but they're based on what's equipped on
|
|
-- the right side.
|
|
if Index == 2 then
|
|
PawnUI_SetShortcutItemForSlot(1, SlotID1)
|
|
PawnUI_SetShortcutItemForSlot(2, SlotID2)
|
|
end
|
|
|
|
-- Finally, either compare the two items, or remove the current comparison, whichever is appropriate.
|
|
PawnUI_CompareItems()
|
|
|
|
-- Return true to indicate success to the caller.
|
|
return true
|
|
end
|
|
|
|
-- Same as PawnUI_SetCompareItem, but shows the Pawn Compare UI if not already visible.
|
|
function PawnUI_SetCompareItemAndShow(Index, ItemLink)
|
|
if Index ~= 1 and Index ~= 2 then
|
|
VgerCore.Fail("Index must be 1 or 2.")
|
|
return
|
|
end
|
|
if not ItemLink or PawnGetHyperlinkType(ItemLink) ~= "item" then return end
|
|
|
|
-- Set this as a compare item.
|
|
local Success = PawnUI_SetCompareItem(Index, ItemLink)
|
|
if Success then
|
|
-- Automatically pick a comparison item when possible.
|
|
PawnUI_AutoCompare()
|
|
|
|
-- If the Pawn Compare UI is not visible, show it.
|
|
PawnUIShowTab(PawnUICompareTabPage)
|
|
end
|
|
|
|
return Success
|
|
end
|
|
|
|
-- If there is an item in slot 2 and nothing in slot 1, and the player has an item equipped in the proper slot, automatically
|
|
-- compare the slot 2 item with the equipped item.
|
|
function PawnUI_AutoCompare()
|
|
if PawnUIComparisonItems[2] and not PawnUIComparisonItems[1] and (PawnUIShortcutItems[1] or PawnUIShortcutItems[2]) then
|
|
-- Normally, use the first shortcut. But, if the first shortcut is missing or matches the item just compared, use the second
|
|
-- shortcut item instead.
|
|
local ShortcutToUse = PawnUIShortcutItems[1]
|
|
if (not PawnUIShortcutItems[1]) or (PawnUIShortcutItems[2] and (PawnUIShortcutItems[1].Link == PawnUIComparisonItems[2].Link)) then
|
|
ShortcutToUse = PawnUIShortcutItems[2]
|
|
end
|
|
-- Don't bother with an auto-comparison at all if the best item we found was the same item.
|
|
if ShortcutToUse.Link ~= PawnUIComparisonItems[2].Link then
|
|
PawnUI_SetCompareItem(1, ShortcutToUse)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Tries to set one of the compare items based on what the user is currently hovering over. Meant for keybindings.
|
|
function PawnUI_SetCompareFromHover(Index)
|
|
PawnUI_SetCompareItemAndShow(Index, PawnLastHoveredItem)
|
|
end
|
|
|
|
-- Enables or disables one of the "currently equipped" shortcut buttons based on an inventory slot ID. If there is an item in that
|
|
-- slot, that item will appear in the shortcut button. If not, or if Slot is nil, that shortcut button will be hidden.
|
|
function PawnUI_SetShortcutItemForSlot(ShortcutIndex, Slot)
|
|
if ShortcutIndex ~= 1 and ShortcutIndex ~= 2 then
|
|
VgerCore.Fail("ShortcutIndex must be 1 or 2.")
|
|
return
|
|
end
|
|
|
|
-- Find the currently equipped inventory item, and save it for later.
|
|
local ButtonName = "PawnUICompareItemShortcut" .. ShortcutIndex
|
|
local ShortcutButton = getglobal(ButtonName)
|
|
local CurrentlyEquippedItem
|
|
if Slot then CurrentlyEquippedItem = PawnGetItemDataForInventorySlot(Slot, true) end
|
|
PawnUIShortcutItems[ShortcutIndex] = CurrentlyEquippedItem
|
|
|
|
-- Now, update the button.
|
|
if CurrentlyEquippedItem then
|
|
-- There is a currently equipped item to put in this slot; get information about it.
|
|
local Texture = getglobal(ButtonName .. "Texture")
|
|
local _, _, _, _, _, _, _, _, _, ItemTexture = GetItemInfo(CurrentlyEquippedItem.Link)
|
|
Texture:SetTexture(ItemTexture)
|
|
ShortcutButton:Show()
|
|
else
|
|
ShortcutButton:Hide()
|
|
end
|
|
end
|
|
|
|
-- Clears both comparison items and all comparison data.
|
|
function PawnUI_ClearCompareItems()
|
|
PawnUI_SetCompareItem(1, nil)
|
|
PawnUI_SetCompareItem(2, nil)
|
|
end
|
|
|
|
-- Swaps the left and right comparison items.
|
|
function PawnUI_SwapCompareItems()
|
|
local Item1, Item2 = PawnUIComparisonItems[1], PawnUIComparisonItems[2]
|
|
PlaySound("igMainMenuOptionCheckBoxOn")
|
|
-- Set the right item to nil first so that unnecessary comparisons aren't performed.
|
|
PawnUI_SetCompareItem(2, nil)
|
|
PawnUI_SetCompareItem(1, Item2)
|
|
PawnUI_SetCompareItem(2, Item1)
|
|
end
|
|
|
|
-- Performs an item comparison. If the item in either index 1 or index 2 is currently empty, no
|
|
-- item comparison is made and the function silently exits.
|
|
function PawnUI_CompareItems()
|
|
-- Before doing anything else, clear out the existing comparison data.
|
|
PawnUICompareItemScore1:SetText("")
|
|
PawnUICompareItemScore2:SetText("")
|
|
PawnUICompareItemScoreDifference1:SetText("")
|
|
PawnUICompareItemScoreDifference2:SetText("")
|
|
PawnUICompareItemScoreHighlight1:Hide()
|
|
PawnUICompareItemScoreHighlight2:Hide()
|
|
PawnUICompareItemScoreArrow1:Hide()
|
|
PawnUICompareItemScoreArrow2:Hide()
|
|
PawnUIFrame_CompareSwapButton:Hide()
|
|
PawnUI_DeleteComparisonLines()
|
|
|
|
-- There must be a scale selected to perform a comparison.
|
|
PawnUI_EnsureLoaded()
|
|
if (not PawnUICurrentScale) or (PawnUICurrentScale == PawnUINoScale) then return end
|
|
|
|
-- There must be two valid comparison items set to perform a comparison.
|
|
local Item1, Item2 = PawnUIComparisonItems[1], PawnUIComparisonItems[2]
|
|
if Item1 or Item2 then PawnUIFrame_CompareSwapButton:Show() end
|
|
if (not Item1) or (not Item2) then return end
|
|
|
|
-- We have two comparison items set. Do the compare!
|
|
local ItemStats1 = Item1.UnenchantedStats
|
|
local ItemSocketBonusStats1 = Item1.UnenchantedSocketBonusStats
|
|
local ItemStats2 = Item2.UnenchantedStats
|
|
local ItemSocketBonusStats2 = Item2.UnenchantedSocketBonusStats
|
|
local ThisScale = PawnCommon.Scales[PawnUICurrentScale]
|
|
local ThisScaleValues = ThisScale.Values
|
|
|
|
-- For items that have socket bonuses, we actually go through the list twice -- the first loop goes until we get to
|
|
-- the place in the list where the socket bonus should be displayed, and then we pause the first loop and go into
|
|
-- the second loop. Once the second loop completes, we return to the first loop and finish it.
|
|
if (not ItemStats1) or (not ItemStats2) then return end
|
|
local CurrentItemStats1, CurrentItemStats2 = ItemStats1, ItemStats2
|
|
local InSocketBonusLoop
|
|
local FinishedSocketBonusLoop
|
|
|
|
local StatCount = #PawnStats
|
|
local LastFoundHeader
|
|
local i = 1
|
|
while true do
|
|
if i == PawnUIStats_SocketBonusBefore and not FinishedSocketBonusLoop and not InSocketBonusLoop then
|
|
-- If we're still in the outer loop, and we've reached the point in the stat list where socket bonuses should be inserted, enter
|
|
-- the inner loop.
|
|
InSocketBonusLoop = true
|
|
i = 1
|
|
CurrentItemStats1, CurrentItemStats2 = ItemSocketBonusStats1, ItemSocketBonusStats2
|
|
LastFoundHeader = PawnUIFrame_CompareSocketBonusHeader_Text
|
|
elseif i > StatCount then
|
|
if FinishedSocketBonusLoop then
|
|
-- We've finished the outer loop, so exit.
|
|
break
|
|
else
|
|
-- We've finished the inner loop, so return to the outer loop.
|
|
InSocketBonusLoop = nil
|
|
FinishedSocketBonusLoop = true
|
|
i = PawnUIStats_SocketBonusBefore
|
|
if i > StatCount then break end
|
|
CurrentItemStats1, CurrentItemStats2 = ItemStats1, ItemStats2
|
|
LastFoundHeader = nil
|
|
end
|
|
end
|
|
|
|
local ThisStatInfo = PawnStats[i]
|
|
VgerCore.Assert(ThisStatInfo, "Failed to find stat info at PawnStats[" .. i .. "]")
|
|
local Title, StatName = ThisStatInfo[1], ThisStatInfo[2]
|
|
|
|
-- Is this a stat header, or an actual stat?
|
|
if StatName then
|
|
-- This is a stat name. Is this stat present in the scale AND one of the items?
|
|
local StatValue = ThisScaleValues[StatName]
|
|
local Stats1, Stats2 = CurrentItemStats1[StatName], CurrentItemStats2[StatName]
|
|
if StatValue and (Stats1 or Stats2) then
|
|
-- We should show this stat. Do we need to add a header first?
|
|
if LastFoundHeader then
|
|
PawnUI_AddComparisonHeaderLine(LastFoundHeader)
|
|
LastFoundHeader = nil
|
|
end
|
|
-- Now, add the stat line.
|
|
local StatNameAndValue = Title .. " @ " .. format("%g", StatValue)
|
|
PawnUI_AddComparisonStatLineNumbers(StatNameAndValue, Stats1, Stats2)
|
|
end
|
|
else
|
|
-- This is a header; remember it. (But, for socket bonuses, ignore all headers.)
|
|
if not InSocketBonusLoop then LastFoundHeader = Title end
|
|
end
|
|
|
|
-- Increment the counter and continue.
|
|
i = i + 1
|
|
if i > 1000 then
|
|
VgerCore.Fail("Failed to break out of item comparison loop!")
|
|
break
|
|
end
|
|
end
|
|
LastFoundHeader = PawnUIFrame_CompareOtherInfoHeader_Text
|
|
|
|
-- Add item level information if the user normally has item levels visible.
|
|
local Level1, Level2 = Item1.Level, Item2.Level
|
|
if not Level1 or Level1 <= 1 then Level1 = nil end
|
|
if not Level2 or Level2 <= 1 then Level2 = nil end
|
|
if GetCVar("showItemLevel") == "1" and ((Level1 and Level1 > 0) or (Level2 and Level2 > 0)) then
|
|
if LastFoundHeader then
|
|
PawnUI_AddComparisonHeaderLine(LastFoundHeader)
|
|
LastFoundHeader = nil
|
|
end
|
|
PawnUI_AddComparisonStatLineNumbers(PawnLocal.ItemLevelTooltipLine, Level1, Level2)
|
|
end
|
|
|
|
-- Add asterisk indicator.
|
|
if PawnCommon.ShowAsterisks ~= PawnShowAsterisksNever then
|
|
local Asterisk1, Asterisk2
|
|
if Item1.UnknownLines then Asterisk1 = PawnUIFrame_CompareAsterisk_Yes end
|
|
if Item2.UnknownLines then Asterisk2 = PawnUIFrame_CompareAsterisk_Yes end
|
|
if Asterisk1 or Asterisk2 then
|
|
if LastFoundHeader then
|
|
PawnUI_AddComparisonHeaderLine(LastFoundHeader)
|
|
LastFoundHeader = nil
|
|
end
|
|
PawnUI_AddComparisonStatLineStrings(PawnUIFrame_CompareAsterisk, Asterisk1, Asterisk2)
|
|
end
|
|
end
|
|
|
|
-- Update the scrolling stat area's height.
|
|
PawnUI_RefreshCompareScrollFrame()
|
|
|
|
-- Update the total item score row.
|
|
local ValueFormat = "%." .. PawnCommon.Digits .. "f"
|
|
local r, g, b = VgerCore.HexToRGB(PawnCommon.Scales[PawnUICurrentScale].Color)
|
|
if not r then r, g, b = VgerCore.Color.BlueR, VgerCore.Color.BlueG, VgerCore.Color.BlueB end
|
|
local _, Value1 = PawnGetSingleValueFromItem(Item1, PawnUICurrentScale)
|
|
local _, Value2 = PawnGetSingleValueFromItem(Item2, PawnUICurrentScale)
|
|
local Value1String, Value2String
|
|
if Value1 then Value1String = format(ValueFormat, Value1) else Value1 = 0 end
|
|
if Value2 then Value2String = format(ValueFormat, Value2) else Value2 = 0 end
|
|
if Value1 > 0 then
|
|
PawnUICompareItemScore1:SetText(Value1String)
|
|
PawnUICompareItemScore1:SetVertexColor(r, g, b)
|
|
if Value1 > Value2 then
|
|
PawnUICompareItemScoreDifference1:SetText("(+" .. format(ValueFormat, Value1 - Value2) .. ")")
|
|
PawnUICompareItemScoreHighlight1:Show()
|
|
PawnUICompareItemScoreArrow1:Show()
|
|
end
|
|
end
|
|
if Value2 > 0 then
|
|
PawnUICompareItemScore2:SetText(Value2String)
|
|
PawnUICompareItemScore2:SetVertexColor(r, g, b)
|
|
if Value2 > Value1 then
|
|
PawnUICompareItemScoreDifference2:SetText("(+" .. format(ValueFormat, Value2 - Value1) .. ")")
|
|
PawnUICompareItemScoreHighlight2:Show()
|
|
PawnUICompareItemScoreArrow2:Show()
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Deletes all comparison stat and header lines.
|
|
function PawnUI_DeleteComparisonLines()
|
|
for i = 1, PawnUITotalComparisonLines do
|
|
local LineName = "PawnUICompareStatLine" .. i
|
|
local Line = getglobal(LineName)
|
|
if Line then Line:Hide() end
|
|
setglobal(LineName, nil)
|
|
setglobal(LineName .. "Name", nil)
|
|
setglobal(LineName .. "Quantity1", nil)
|
|
setglobal(LineName .. "Quantity2", nil)
|
|
setglobal(LineName .. "Difference1", nil)
|
|
setglobal(LineName .. "Difference2", nil)
|
|
end
|
|
PawnUITotalComparisonLines = 0
|
|
PawnUI_RefreshCompareScrollFrame()
|
|
end
|
|
|
|
-- Adds a stat line to the comparison stat area, passing in the strings to use.
|
|
function PawnUI_AddComparisonStatLineStrings(StatNameAndValue, Quantity1, Quantity2, Difference1, Difference2)
|
|
local Line, LineName = PawnUI_AddComparisonLineCore("PawnUICompareStatLineTemplate")
|
|
getglobal(LineName .. "Name"):SetText(StatNameAndValue)
|
|
getglobal(LineName .. "Quantity1"):SetText(Quantity1)
|
|
getglobal(LineName .. "Quantity2"):SetText(Quantity2)
|
|
getglobal(LineName .. "Difference1"):SetText(Difference1)
|
|
getglobal(LineName .. "Difference2"):SetText(Difference2)
|
|
Line:Show()
|
|
end
|
|
|
|
-- Adds a stat line to the comparison stat area, passing in the numbers to use. It is acceptable to use nil for either or both
|
|
-- of the numbers. Differences are calculated automatically.
|
|
function PawnUI_AddComparisonStatLineNumbers(StatNameAndValue, Quantity1, Quantity2)
|
|
local QuantityString1 = PawnFormatShortDecimal(Quantity1)
|
|
local QuantityString2 = PawnFormatShortDecimal(Quantity2)
|
|
local Difference1, Difference2
|
|
if not Quantity1 then Quantity1 = 0 end
|
|
if not Quantity2 then Quantity2 = 0 end
|
|
if Quantity1 > Quantity2 then
|
|
Difference1 = "(+" .. PawnFormatShortDecimal(Quantity1 - Quantity2) .. ")"
|
|
elseif Quantity2 > Quantity1 then
|
|
Difference2 = "(+" .. PawnFormatShortDecimal(Quantity2 - Quantity1) .. ")"
|
|
end
|
|
|
|
PawnUI_AddComparisonStatLineStrings(StatNameAndValue, QuantityString1, QuantityString2, Difference1, Difference2)
|
|
end
|
|
|
|
-- Adds a header line to the comparison stat area.
|
|
function PawnUI_AddComparisonHeaderLine(HeaderText)
|
|
local Line, LineName = PawnUI_AddComparisonLineCore("PawnUICompareStatLineHeaderTemplate")
|
|
local HeaderLabel = getglobal(LineName .. "Name")
|
|
HeaderLabel:SetText(HeaderText)
|
|
Line:Show()
|
|
end
|
|
|
|
-- Adds a line to the comparison stat area.
|
|
-- Arguments: Template
|
|
-- Template: The XML UI template to use when creating the new line.
|
|
-- Returns: Line, LineName
|
|
-- Line: A reference to the newly added line.
|
|
-- LineName: The string name of the newly added line.
|
|
function PawnUI_AddComparisonLineCore(Template)
|
|
PawnUITotalComparisonLines = PawnUITotalComparisonLines + 1
|
|
local LineName = "PawnUICompareStatLine" .. PawnUITotalComparisonLines
|
|
local Line = CreateFrame("Frame", LineName, PawnUICompareScrollContent, Template)
|
|
Line:SetPoint("TOPLEFT", PawnUICompareScrollContent, "TOPLEFT", 0, -PawnUIComparisonLineHeight * (PawnUITotalComparisonLines - 1))
|
|
return Line, LineName
|
|
end
|
|
|
|
-- Updates the height of the comparison stat list scroll area's inner frame. Call this after adding or removing a block of
|
|
-- comparison lines to ensure that the scroll area is correct.
|
|
function PawnUI_RefreshCompareScrollFrame()
|
|
PawnUICompareScrollContent:SetHeight(PawnUIComparisonLineHeight * PawnUITotalComparisonLines + PawnUIComparisonAreaPaddingBottom)
|
|
if PawnUITotalComparisonLines > 0 then
|
|
PawnUICompareMissingItemInfoFrame:Hide()
|
|
PawnUICompareScrollFrame:Show()
|
|
else
|
|
PawnUICompareScrollFrame:Hide()
|
|
PawnUICompareMissingItemInfoFrame:Show()
|
|
end
|
|
end
|
|
|
|
-- Links an item in chat.
|
|
function PawnUILinkItemInChat(Item)
|
|
if not Item then return end
|
|
local EditBox = DEFAULT_CHAT_FRAME.editBox
|
|
if EditBox then
|
|
if not EditBox:IsShown() then
|
|
EditBox:SetText("")
|
|
EditBox:Show()
|
|
end
|
|
EditBox:Insert(Item.Link)
|
|
else
|
|
VgerCore.Fail("Can't insert item link into chat because the edit box was not found.")
|
|
end
|
|
end
|
|
|
|
-- Called when one of the two upper item slots are clicked.
|
|
function PawnUICompareItemIcon_OnClick(Index)
|
|
PlaySound("igMainMenuOptionCheckBoxOn")
|
|
|
|
-- Are they shift-clicking it to insert the item into chat?
|
|
if IsModifiedClick("CHATLINK") then
|
|
PawnUILinkItemInChat(PawnUIComparisonItems[Index])
|
|
return
|
|
end
|
|
|
|
-- Are they dropping an item from their inventory?
|
|
local InfoType, Info1, Info2 = GetCursorInfo()
|
|
if InfoType == "item" then
|
|
ClearCursor()
|
|
PawnUI_SetCompareItem(Index, Info2)
|
|
if Index == 2 then PawnUI_AutoCompare() end
|
|
return
|
|
end
|
|
|
|
-- Are they dropping an item from a merchant's inventory?
|
|
if InfoType == "merchant" then
|
|
ClearCursor()
|
|
local ItemLink = GetMerchantItemLink(Info1)
|
|
if not ItemLink then return end
|
|
PawnUI_SetCompareItem(Index, ItemLink)
|
|
if Index == 2 then PawnUI_AutoCompare() end
|
|
return
|
|
end
|
|
end
|
|
|
|
-- Shows the tooltip for an item comparison slot.
|
|
function PawnUICompareItemIcon_TooltipOn(Index)
|
|
-- Is there an item set for this slot?
|
|
local Item = PawnUIComparisonItems[Index]
|
|
if Item then
|
|
if Index == 1 then
|
|
GameTooltip:SetOwner(PawnUICompareItemIcon1, "ANCHOR_BOTTOMLEFT")
|
|
elseif Index == 2 then
|
|
GameTooltip:SetOwner(PawnUICompareItemIcon2, "ANCHOR_BOTTOMRIGHT")
|
|
end
|
|
GameTooltip:SetHyperlink(Item.Link)
|
|
end
|
|
end
|
|
|
|
-- Hides the tooltip for an item comparison slot.
|
|
function PawnUICompareItemIcon_TooltipOff()
|
|
GameTooltip:Hide()
|
|
end
|
|
|
|
-- Sets the left item to the item depicted in the "currently equipped" shortcut button.
|
|
function PawnUICompareItemShortcut_OnClick(ShortcutIndex, Button)
|
|
PlaySound("igMainMenuOptionCheckBoxOn")
|
|
|
|
-- Are they shift-clicking it to insert the item into chat?
|
|
if IsModifiedClick("CHATLINK") then
|
|
PawnUILinkItemInChat(PawnUIShortcutItems[ShortcutIndex])
|
|
return
|
|
end
|
|
|
|
-- Nope; they want to set the compare item.
|
|
local Index = 1
|
|
if Button == "RightButton" then Index = 2 end
|
|
PawnUI_SetCompareItem(Index, PawnUIShortcutItems[ShortcutIndex])
|
|
end
|
|
|
|
-- Shows the tooltip for the shortcut button.
|
|
function PawnUICompareItemShortcut_TooltipOn(ShortcutIndex)
|
|
local Item = PawnUIShortcutItems[ShortcutIndex]
|
|
if Item then
|
|
GameTooltip:SetOwner(getglobal("PawnUICompareItemShortcut" .. ShortcutIndex), "ANCHOR_TOPLEFT")
|
|
local UnenchantedLink = PawnUnenchantItemLink(Item.Link)
|
|
if not UnenchantedLink then UnenchantedLink = Item.Link end
|
|
GameTooltip:SetHyperlink(UnenchantedLink)
|
|
end
|
|
end
|
|
|
|
-- Hides the tooltip for the shortcut button.
|
|
function PawnUICompareItemShortcut_TooltipOff()
|
|
GameTooltip:Hide()
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Gems tab
|
|
------------------------------------------------------------
|
|
|
|
function PawnUI_InitGemsTab()
|
|
-- Each time the gems tab is shown, immediately refresh its contents.
|
|
PawnUI_ShowBestGems()
|
|
end
|
|
|
|
-- When GemQualityDropDown is first shown, initialize it.
|
|
local PawnUIFrame_GemQualityDropDown_IsInitialized = false
|
|
function PawnUIFrame_GemQualityDropDown_OnShow()
|
|
if PawnUIFrame_GemQualityDropDown_IsInitialized then return end
|
|
PawnUIFrame_GemQualityDropDown_IsInitialized = true
|
|
|
|
UIDropDownMenu_SetWidth(PawnUIFrame_GemQualityDropDown, 140)
|
|
PawnUIFrame_GemQualityDropDown_Reset()
|
|
end
|
|
|
|
-- Resets GemQualityDropDown.
|
|
function PawnUIFrame_GemQualityDropDown_Reset()
|
|
UIDropDownMenu_Initialize(PawnUIFrame_GemQualityDropDown, PawnUIFrame_GemQualityDropDown_Initialize)
|
|
end
|
|
|
|
-- Function used by the UIDropDownMenu code to initialize GemQualityDropDown.
|
|
function PawnUIFrame_GemQualityDropDown_Initialize()
|
|
if PawnUICurrentScale == PawnUINoScale then return end
|
|
|
|
|
|
-- Add the item quality levels to the dropdown.
|
|
local QualityData
|
|
for _, QualityData in pairs(PawnGemQualityLevels) do
|
|
UIDropDownMenu_AddButton({
|
|
func = PawnUIFrame_GemQualityDropDown_ItemClicked,
|
|
value = QualityData[1],
|
|
text = QualityData[2],
|
|
})
|
|
end
|
|
end
|
|
|
|
function PawnUIFrame_GemQualityDropDown_ItemClicked(self)
|
|
local QualityLevel = self.value
|
|
PawnSetGemQualityLevel(PawnUICurrentScale, QualityLevel)
|
|
PawnUI_ShowBestGems()
|
|
end
|
|
|
|
function PawnUIFrame_GemQualityDropDown_SelectQualityLevel(QualityLevel)
|
|
UIDropDownMenu_SetSelectedValue(PawnUIFrame_GemQualityDropDown, QualityLevel)
|
|
|
|
-- Painfully stupid: manually update the text on the dropdown to handle the case where the
|
|
-- user has just switched scales and the gem quality level needs to be updated.
|
|
local QualityData
|
|
for _, QualityData in pairs(PawnGemQualityLevels) do
|
|
if QualityData[1] == QualityLevel then
|
|
UIDropDownMenu_SetText(PawnUIFrame_GemQualityDropDown, QualityData[2])
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function PawnUI_ShowBestGems()
|
|
-- Always clear out the existing gems, no matter what happens next.
|
|
PawnUI_DeleteGemLines()
|
|
if not PawnUICurrentScale or PawnUICurrentScale == PawnUINoScale then return end
|
|
|
|
-- Update the gem list for this scale.
|
|
PawnUIFrame_GemQualityDropDown_SelectQualityLevel(PawnGetGemQualityLevel(PawnUICurrentScale))
|
|
|
|
-- If no scale is selected, we can't show a gem list. (This is a valid case!)
|
|
if not PawnScaleBestGems[PawnUICurrentScale] then
|
|
VgerCore.Fail("Failed to build a gem list because no best-gem data was available for this scale.")
|
|
return
|
|
end
|
|
|
|
-- Otherwise, we're good -- show the gem list.
|
|
local ShownGems = false
|
|
|
|
if #(PawnScaleBestGems[PawnUICurrentScale].RedSocket) > 0 then
|
|
PawnUI_AddGemHeaderLine(format(PawnUIFrame_FindGemColorHeader_Text, RED_GEM))
|
|
for _, GemData in pairs(PawnScaleBestGems[PawnUICurrentScale].RedSocket) do
|
|
PawnUI_AddGemLine(GemData.Name, GemData.Texture, GemData.ID)
|
|
end
|
|
ShownGems = true
|
|
end
|
|
|
|
if #(PawnScaleBestGems[PawnUICurrentScale].YellowSocket) > 0 then
|
|
PawnUI_AddGemHeaderLine(format(PawnUIFrame_FindGemColorHeader_Text, YELLOW_GEM))
|
|
for _, GemData in pairs(PawnScaleBestGems[PawnUICurrentScale].YellowSocket) do
|
|
PawnUI_AddGemLine(GemData.Name, GemData.Texture, GemData.ID)
|
|
end
|
|
ShownGems = true
|
|
end
|
|
|
|
if #(PawnScaleBestGems[PawnUICurrentScale].BlueSocket) > 0 then
|
|
PawnUI_AddGemHeaderLine(format(PawnUIFrame_FindGemColorHeader_Text, BLUE_GEM))
|
|
for _, GemData in pairs(PawnScaleBestGems[PawnUICurrentScale].BlueSocket) do
|
|
PawnUI_AddGemLine(GemData.Name, GemData.Texture, GemData.ID)
|
|
end
|
|
ShownGems = true
|
|
end
|
|
|
|
if #(PawnScaleBestGems[PawnUICurrentScale].MetaSocket) > 0 then
|
|
PawnUI_AddGemHeaderLine(PawnUIFrame_FindGemColorHeader_Meta_Text)
|
|
for _, GemData in pairs(PawnScaleBestGems[PawnUICurrentScale].MetaSocket) do
|
|
PawnUI_AddGemLine(GemData.Name, GemData.Texture, GemData.ID)
|
|
end
|
|
ShownGems = true
|
|
end
|
|
|
|
if not ShownGems then
|
|
PawnUI_AddGemHeaderLine(PawnUIFrame_FindGemNoGemsHeader_Text)
|
|
end
|
|
|
|
PawnUI_RefreshGemScrollFrame()
|
|
end
|
|
|
|
-- Deletes all gem lines.
|
|
function PawnUI_DeleteGemLines()
|
|
for i = 1, PawnUITotalGemLines do
|
|
local LineName = "PawnUIGemLine" .. i
|
|
local Line = getglobal(LineName)
|
|
if Line then Line:Hide() end
|
|
setglobal(LineName, nil)
|
|
setglobal(LineName .. "Icon", nil)
|
|
setglobal(LineName .. "Name", nil)
|
|
setglobal(LineName .. "Highlight", nil)
|
|
end
|
|
PawnUITotalGemLines = 0
|
|
PawnUI_RefreshGemScrollFrame()
|
|
end
|
|
|
|
-- Adds a gem line to the gem list area, passing in the string and icon to use.
|
|
function PawnUI_AddGemLine(GemName, Icon, ItemID)
|
|
local Line, LineName = PawnUI_AddGemLineCore("PawnUIGemLineTemplate")
|
|
Line:SetID(ItemID)
|
|
|
|
-- Prefer data from the Pawn cache if available. It's more up-to-date if the user
|
|
-- has hovered over anything.
|
|
local Item = PawnGetItemData("item:" .. ItemID)
|
|
if Item and Item.Name then
|
|
GemName = Item.Name
|
|
Icon = Item.Texture
|
|
end
|
|
|
|
getglobal(LineName .. "Name"):SetText(GemName)
|
|
getglobal(LineName .. "Icon"):SetTexture(Icon)
|
|
Line:Show()
|
|
end
|
|
|
|
-- Adds a header to the gem list area.
|
|
function PawnUI_AddGemHeaderLine(Text)
|
|
local Line, LineName = PawnUI_AddGemLineCore("PawnUIGemHeaderLineTemplate")
|
|
getglobal(LineName .. "Name"):SetText(Text)
|
|
Line:Show()
|
|
end
|
|
|
|
-- Adds a line to the gem list area.
|
|
-- Arguments: Template
|
|
-- Template: The XML UI template to use when creating the new line.
|
|
-- Returns: Line, LineName
|
|
-- Line: A reference to the newly added line.
|
|
-- LineName: The string name of the newly added line.
|
|
function PawnUI_AddGemLineCore(Template)
|
|
PawnUITotalGemLines = PawnUITotalGemLines + 1
|
|
local LineName = "PawnUIGemLine" .. PawnUITotalGemLines
|
|
local Line = CreateFrame("Button", LineName, PawnUIGemScrollContent, Template)
|
|
Line:SetPoint("TOPLEFT", PawnUIGemScrollContent, "TOPLEFT", 0, -PawnUIGemLineHeight * (PawnUITotalGemLines - 1))
|
|
return Line, LineName
|
|
end
|
|
|
|
-- Updates the height of the gem list scroll area's inner frame. Call this after adding or removing a block of
|
|
-- gem lines to ensure that the scroll area is correct.
|
|
function PawnUI_RefreshGemScrollFrame()
|
|
PawnUIGemScrollContent:SetHeight(PawnUIGemLineHeight * PawnUITotalGemLines + PawnUIGemAreaPaddingBottom)
|
|
end
|
|
|
|
-- Raised when the user hovers over a gem in the Gems tab.
|
|
function PawnUIFrame_GemList_OnEnter(self)
|
|
GameTooltip:SetOwner(self, "ANCHOR_LEFT")
|
|
GameTooltip:SetHyperlink("item:" .. self:GetID())
|
|
PawnUIFrame_GemList_UpdateInfo(self)
|
|
end
|
|
|
|
-- Raised when the user stops hovering over a gem in the Gems tab.
|
|
function PawnUIFrame_GemList_OnLeave(self)
|
|
GameTooltip:Hide()
|
|
PawnUIFrame_GemList_UpdateInfo(self)
|
|
end
|
|
|
|
-- Updates the name and icon for a gem in the gem list if necessary.
|
|
function PawnUIFrame_GemList_UpdateInfo(self)
|
|
-- If Icon already has a texture set, then we already have item information, so skip this.
|
|
local Icon = getglobal(tostring(self:GetName()) .. "Icon")
|
|
if Icon and not Icon:GetTexture() then
|
|
local Label = getglobal(tostring(self:GetName()) .. "Name")
|
|
local Item = PawnGetItemData("item:" .. self:GetID())
|
|
if PawnRefreshCachedItem(Item) then
|
|
Label:SetText(Item.Name)
|
|
Icon:SetTexture(Item.Texture)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Raised when the user clicks a gem in the Gems tab.
|
|
function PawnUIFrame_GemList_OnClick(self)
|
|
-- Are they shift-clicking it to insert the item into chat?
|
|
if IsModifiedClick("CHATLINK") then
|
|
PawnUILinkItemInChat(PawnGetItemData("item:" .. tostring(self:GetID())))
|
|
return
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Options tab
|
|
------------------------------------------------------------
|
|
|
|
-- When the Options tab is first shown, set the values of all of the controls based on the user's settings.
|
|
function PawnUIOptionsTabPage_OnShow()
|
|
-- Tooltip options
|
|
PawnUIFrame_ShowItemIDsCheck:SetChecked(PawnCommon.ShowItemID)
|
|
PawnUIFrame_ShowIconsCheck:SetChecked(PawnCommon.ShowTooltipIcons)
|
|
PawnUIFrame_ShowExtraSpaceCheck:SetChecked(PawnCommon.ShowSpace)
|
|
PawnUIFrame_AlignRightCheck:SetChecked(PawnCommon.AlignNumbersRight)
|
|
PawnUIFrame_AsterisksList_UpdateSelection()
|
|
|
|
-- Calculation options
|
|
PawnUIFrame_DigitsBox:SetText(PawnCommon.Digits)
|
|
PawnUIFrame_UnenchantedValuesCheck:SetChecked(PawnCommon.ShowUnenchanted)
|
|
PawnUIFrame_EnchantedValuesCheck:SetChecked(PawnCommon.ShowEnchanted)
|
|
PawnUIFrame_DebugCheck:SetChecked(PawnCommon.Debug)
|
|
|
|
-- Other options
|
|
PawnUIFrame_ButtonPositionList_UpdateSelection()
|
|
end
|
|
|
|
function PawnUIFrame_ShowItemIDsCheck_OnClick()
|
|
PawnCommon.ShowItemID = PawnUIFrame_ShowItemIDsCheck:GetChecked() ~= nil
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_ShowIconsCheck_OnClick()
|
|
PawnCommon.ShowTooltipIcons = PawnUIFrame_ShowIconsCheck:GetChecked() ~= nil
|
|
PawnToggleTooltipIcons()
|
|
end
|
|
|
|
function PawnUIFrame_ShowExtraSpaceCheck_OnClick()
|
|
PawnCommon.ShowSpace = PawnUIFrame_ShowExtraSpaceCheck:GetChecked() ~= nil
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_AlignRightCheck_OnClick()
|
|
PawnCommon.AlignNumbersRight = PawnUIFrame_AlignRightCheck:GetChecked() ~= nil
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_AsterisksList_SetSelection(Value)
|
|
PawnCommon.ShowAsterisks = Value
|
|
PawnUIFrame_AsterisksList_UpdateSelection()
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_AsterisksList_UpdateSelection()
|
|
PawnUIFrame_AsterisksAutoRadio:SetChecked(PawnCommon.ShowAsterisks == PawnShowAsterisksNonzero)
|
|
PawnUIFrame_AsterisksAutoNoTextRadio:SetChecked(PawnCommon.ShowAsterisks == PawnShowAsterisksNonzeroNoText)
|
|
PawnUIFrame_AsterisksOffRadio:SetChecked(PawnCommon.ShowAsterisks == PawnShowAsterisksNever)
|
|
end
|
|
|
|
function PawnUIFrame_DigitsBox_OnTextChanged()
|
|
local Digits = tonumber(PawnUIFrame_DigitsBox:GetText())
|
|
if not Digits then Digits = 0 end
|
|
PawnCommon.Digits = Digits
|
|
PawnRecreateAnnotationFormats()
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_UnenchantedValuesCheck_OnClick()
|
|
PawnCommon.ShowUnenchanted = PawnUIFrame_UnenchantedValuesCheck:GetChecked() ~= nil
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_EnchantedValuesCheck_OnClick()
|
|
PawnCommon.ShowEnchanted = PawnUIFrame_EnchantedValuesCheck:GetChecked() ~= nil
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_DebugCheck_OnClick()
|
|
PawnCommon.Debug = PawnUIFrame_DebugCheck:GetChecked() ~= nil
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_ButtonPositionList_SetSelection(Value)
|
|
PawnCommon.ButtonPosition = Value
|
|
PawnUIFrame_ButtonPositionList_UpdateSelection()
|
|
PawnUI_InventoryPawnButton_Move()
|
|
end
|
|
|
|
function PawnUIFrame_ButtonPositionList_UpdateSelection()
|
|
PawnUIFrame_ButtonRightRadio:SetChecked(PawnCommon.ButtonPosition == PawnButtonPositionRight)
|
|
PawnUIFrame_ButtonLeftRadio:SetChecked(PawnCommon.ButtonPosition == PawnButtonPositionLeft)
|
|
PawnUIFrame_ButtonOffRadio:SetChecked(PawnCommon.ButtonPosition == PawnButtonPositionHidden)
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- About tab methods
|
|
------------------------------------------------------------
|
|
|
|
function PawnUIAboutTabPage_OnShow()
|
|
local Version = GetAddOnMetadata("Pawn", "Version")
|
|
if Version then
|
|
PawnUIFrame_AboutVersionLabel:SetText(format(PawnUIFrame_AboutVersionLabel_Text, Version))
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Item socketing UI
|
|
------------------------------------------------------------
|
|
|
|
function PawnUI_OnSocketUpdate()
|
|
-- Find out what item it is.
|
|
local _, ItemLink = ItemSocketingDescription:GetItem()
|
|
local Item = PawnGetItemData(ItemLink)
|
|
if not Item or not Item.Values then
|
|
VgerCore.Fail("Failed to update the socketing UI because we didn't know what item was in it.")
|
|
return
|
|
end
|
|
if not Item.UnenchantedStats then return end -- Can't do anything interesting if we couldn't get unenchanted item data
|
|
|
|
-- Add the annotation lines to the tooltip.
|
|
CreateFrame("GameTooltip", "PawnSocketingTooltip", ItemSocketingFrame, "PawnUI_FattyTooltip")
|
|
PawnSocketingTooltip:SetOwner(ItemSocketingFrame, "ANCHOR_NONE")
|
|
PawnSocketingTooltip:SetPoint("TOPLEFT", ItemSocketingFrame, "BOTTOMLEFT", 10, 30)
|
|
PawnSocketingTooltip:SetText("Pawn", 1, 1, 1)
|
|
PawnSocketingTooltip:AddLine(PawnUI_ItemSocketingDescription_Header)
|
|
|
|
for _, Entry in pairs(Item.Values) do
|
|
local ScaleName, UseRed, UseYellow, UseBlue = Entry[1], Entry[4], Entry[5], Entry[6]
|
|
if PawnIsScaleVisible(ScaleName) then
|
|
local Scale = PawnCommon.Scales[ScaleName]
|
|
local ScaleValues = Scale.Values
|
|
local ItemStats = Item.UnenchantedStats
|
|
local TextColor = VgerCore.Color.Blue
|
|
if Scale.Color and strlen(Scale.Color) == 6 then TextColor = "|cff" .. Scale.Color end
|
|
|
|
-- Count the number of prismatic sockets. We have to rely on the item socketing UI
|
|
-- for this, because unenchanted items don't have prismatic sockets, and enchanted items
|
|
-- have gems in those sockets.
|
|
local SocketCount = GetNumSockets()
|
|
local PrismaticSockets = 0
|
|
for i = 1, SocketCount do
|
|
if GetSocketTypes(i) == "Socket" then PrismaticSockets = PrismaticSockets + 1 end
|
|
end
|
|
|
|
local BestGems = ""
|
|
if UseRed or UseYellow or UseBlue then
|
|
-- Use all of a single color.
|
|
local TotalColoredSockets = 0
|
|
if ItemStats.RedSocket then TotalColoredSockets = TotalColoredSockets + ItemStats.RedSocket end
|
|
if ItemStats.YellowSocket then TotalColoredSockets = TotalColoredSockets + ItemStats.YellowSocket end
|
|
if ItemStats.BlueSocket then TotalColoredSockets = TotalColoredSockets + ItemStats.BlueSocket end
|
|
if PrismaticSockets then TotalColoredSockets = TotalColoredSockets + PrismaticSockets end
|
|
BestGems = PawnGetGemListString(TotalColoredSockets, UseRed, UseYellow, UseBlue, ScaleName)
|
|
else
|
|
-- Use the proper colors.
|
|
if PrismaticSockets and PrismaticSockets > 0 then
|
|
-- If there are prismatic sockets, we'll try to merge them with other sockets.
|
|
UseRed, UseYellow, UseBlue = PawnGetBestGemColorsForScale(ScaleName)
|
|
end
|
|
if ItemStats.RedSocket then
|
|
local RedSockets = ItemStats.RedSocket
|
|
if UseRed and not UseYellow and not UseBlue then
|
|
RedSockets = RedSockets + PrismaticSockets
|
|
PrismaticSockets = 0
|
|
end
|
|
if BestGems ~= "" then BestGems = BestGems .. ", " end
|
|
BestGems = BestGems .. PawnGetGemListString(RedSockets, true, false, false, ScaleName)
|
|
end
|
|
if ItemStats.YellowSocket then
|
|
local YellowSockets = ItemStats.YellowSocket
|
|
if not UseRed and UseYellow and not UseBlue then
|
|
YellowSockets = YellowSockets + PrismaticSockets
|
|
PrismaticSockets = 0
|
|
end
|
|
if BestGems ~= "" then BestGems = BestGems .. ", " end
|
|
BestGems = BestGems .. PawnGetGemListString(YellowSockets, false, true, false, ScaleName)
|
|
end
|
|
if ItemStats.BlueSocket then
|
|
local BlueSockets = ItemStats.BlueSocket
|
|
if not UseRed and not UseYellow and UseBlue then
|
|
BlueSockets = BlueSockets + PrismaticSockets
|
|
PrismaticSockets = 0
|
|
end
|
|
if BestGems ~= "" then BestGems = BestGems .. ", " end
|
|
BestGems = BestGems .. PawnGetGemListString(BlueSockets, false, false, true, ScaleName)
|
|
end
|
|
if PrismaticSockets and PrismaticSockets > 0 then
|
|
-- If the prismatic sockets were merged with another color, this will be skipped.
|
|
if BestGems ~= "" then BestGems = BestGems .. ", " end
|
|
BestGems = BestGems .. PawnGetGemListString(PrismaticSockets, UseRed, UseYellow, UseBlue, ScaleName)
|
|
end
|
|
end
|
|
if ItemStats.MetaSocket then
|
|
if BestGems ~= "" then BestGems = BestGems .. ", " end
|
|
BestGems = BestGems .. tostring(ItemStats.MetaSocket) .. " " .. META_GEM
|
|
end
|
|
local TooltipText = TextColor .. PawnGetScaleLocalizedName(ScaleName) .. ": |r" .. BestGems
|
|
PawnSocketingTooltip:AddLine(TooltipText, 1, 1, 1)
|
|
end
|
|
end
|
|
|
|
-- Show our annotations tooltip.
|
|
PawnSocketingTooltip:Show()
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Interface Options
|
|
------------------------------------------------------------
|
|
|
|
function PawnInterfaceOptionsFrame_OnLoad()
|
|
-- NOTE: If you need anything from PawnCommon in the future, you should call PawnInitializeOptions first.
|
|
|
|
-- Register the Interface Options page.
|
|
-- CoA/3.3.5a: InterfaceOptions_AddCategory is a retail-only global; guard it.
|
|
PawnInterfaceOptionsFrame.name = "Pawn"
|
|
if InterfaceOptions_AddCategory then
|
|
InterfaceOptions_AddCategory(PawnInterfaceOptionsFrame)
|
|
end
|
|
-- Update the version display.
|
|
local Version = GetAddOnMetadata("Pawn", "Version")
|
|
if Version then
|
|
PawnInterfaceOptionsFrame_AboutVersionLabel:SetText(format(PawnUIFrame_AboutVersionLabel_Text, Version))
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Other Pawn UI methods
|
|
------------------------------------------------------------
|
|
|
|
-- Switches to a tab by its Page.
|
|
function PawnUISwitchToTab(Tab)
|
|
local TabCount = #PawnUITabList
|
|
if not Tab then
|
|
VgerCore.Fail("You must specify a valid Pawn tab.")
|
|
return
|
|
end
|
|
|
|
-- Hide popup UI.
|
|
PawnUIStringDialog:Hide()
|
|
ColorPickerFrame:Hide()
|
|
|
|
-- Loop through all tab frames, showing all but the current one.
|
|
local TabNumber
|
|
for i = 1, TabCount do
|
|
local ThisTab = PawnUITabList[i]
|
|
if ThisTab == Tab then
|
|
ThisTab:Show()
|
|
TabNumber = i
|
|
else
|
|
ThisTab:Hide()
|
|
end
|
|
end
|
|
VgerCore.Assert(TabNumber, "Oh noes, we couldn't find that tab.")
|
|
PawnUICurrentTabNumber = TabNumber
|
|
|
|
-- Then, update the tabstrip itself.
|
|
VgerCore.Assert(TabNumber, "Couldn't find the tab to show!")
|
|
PanelTemplates_SetTab(PawnUIFrame, TabNumber)
|
|
|
|
-- Show/hide the scale selector as appropriate.
|
|
if PawnUIFrameNeedsScaleSelector[PawnUICurrentTabNumber] then
|
|
PawnUIScaleSelector:Show()
|
|
else
|
|
PawnUIScaleSelector:Hide()
|
|
end
|
|
|
|
-- Then, update the header text.
|
|
PawnUIUpdateHeader()
|
|
end
|
|
|
|
function PawnUIUpdateHeader()
|
|
if not PawnUIHeaders[PawnUICurrentTabNumber] then return end
|
|
local ColoredName
|
|
if PawnUICurrentScale and PawnUICurrentScale ~= PawnUINoScale then
|
|
ColoredName = PawnGetScaleColor(PawnUICurrentScale) .. PawnGetScaleLocalizedName(PawnUICurrentScale) .. "|r"
|
|
else
|
|
ColoredName = PawnUINoScale
|
|
end
|
|
PawnUIHeader:SetText(format(PawnUIHeaders[PawnUICurrentTabNumber], ColoredName))
|
|
end
|
|
|
|
-- Switches to a tab and shows the Pawn UI if not already visible.
|
|
-- If Toggle is true, close the Pawn UI if it was already visible on that page.
|
|
function PawnUIShowTab(Tab, Toggle)
|
|
if not PawnUIFrame:IsShown() then
|
|
PawnUIShow()
|
|
PawnUISwitchToTab(Tab)
|
|
elseif not Tab:IsShown() then
|
|
PlaySound("igCharacterInfoTab")
|
|
PawnUISwitchToTab(Tab)
|
|
else
|
|
if Toggle then
|
|
PawnUIShow()
|
|
else
|
|
PlaySound("igMainMenuOptionCheckBoxOn")
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Makes sure that all first-open initialization has been performed.
|
|
function PawnUI_EnsureLoaded()
|
|
if not PawnUIOpenedYet then
|
|
PawnUIOpenedYet = true
|
|
PawnUIFrame_ScaleSelector_Refresh()
|
|
PawnUIFrame_ShowScaleCheck_Label:SetText(format(PawnUIFrame_ShowScaleCheck_Label_Text, UnitName("player")))
|
|
if not PawnCommon then
|
|
VgerCore.Fail("Pawn UI OnShow handler was called before PawnCommon was initialized.")
|
|
PawnUISwitchToTab(PawnUIHelpTabPage)
|
|
elseif not PawnCommon.ShownGettingStarted then
|
|
PawnCommon.ShownGettingStarted = true
|
|
PawnUISwitchToTab(PawnUIHelpTabPage)
|
|
else
|
|
PawnUISwitchToTab(PawnUIValuesTabPage)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Shows a tooltip for a given control if available.
|
|
-- The tooltip used will be the string with the name of the control plus "_Tooltip" on the end.
|
|
-- The title of the tooltip will be the text on a control with the same name plus "_Label" on the
|
|
-- end if available, or otherwise the actual text on the control if there is any. If the tooltip text
|
|
-- OR title is missing, no tooltip is displayed.
|
|
function PawnUIFrame_TooltipOn(self)
|
|
local TooltipText = getglobal(self:GetName() .. "_Tooltip")
|
|
if TooltipText then
|
|
local Label
|
|
local FontString = getglobal(self:GetName() .. "_Label")
|
|
if type(FontString) == "string" then
|
|
Label = FontString
|
|
elseif FontString then
|
|
Label = FontString:GetText()
|
|
elseif this.GetText and self:GetText() then
|
|
Label = self:GetText()
|
|
end
|
|
if Label then
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT")
|
|
GameTooltip:AddLine(Label, 1, 1, 1, 1)
|
|
GameTooltip:AddLine(TooltipText, nil, nil, nil, 1, 1)
|
|
GameTooltip:Show()
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Hides the game tooltip.
|
|
function PawnUIFrame_TooltipOff()
|
|
GameTooltip:Hide()
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- PawnUIStringDialog methods
|
|
------------------------------------------------------------
|
|
|
|
-- Shows a dialog containing given prompt text, asking the user for a string.
|
|
-- Calls OKCallbackFunction with the typed string as the only input if the user clicked OK.
|
|
-- Calls CancelCallbackFunction if the user clicked Cancel.
|
|
function PawnUIGetString(Prompt, DefaultValue, OKCallbackFunction, CancelCallbackFunction)
|
|
PawnUIGetStringCore(Prompt, DefaultValue, true, OKCallbackFunction, CancelCallbackFunction)
|
|
end
|
|
|
|
-- Shows a dialog with a copyable string.
|
|
-- Calls CallbackFunction when the user closes the dialog.
|
|
-- Note: Successfully tested with strings of about 900 characters.
|
|
function PawnUIShowCopyableString(Prompt, Value, CallbackFunction)
|
|
PawnUIGetStringCore(Prompt, Value, false, CallbackFunction, nil)
|
|
end
|
|
|
|
-- Core function called by PawnUIGetString.
|
|
function PawnUIGetStringCore(Prompt, DefaultValue, Cancelable, OKCallbackFunction, CancelCallbackFunction)
|
|
PawnUIStringDialog_PromptText:SetText(Prompt)
|
|
PawnUIStringDialog_TextBox:SetText("") -- Causes the insertion point to move to the end on the next SetText
|
|
PawnUIStringDialog_TextBox:SetText(DefaultValue)
|
|
if Cancelable then
|
|
PawnUIStringDialog_OKButton:Show()
|
|
PawnUIStringDialog_OKButton:SetText(PawnLocal.OKButton)
|
|
PawnUIStringDialog_CancelButton:SetText(PawnLocal.CancelButton)
|
|
else
|
|
PawnUIStringDialog_OKButton:Hide()
|
|
PawnUIStringDialog_CancelButton:SetText(PawnLocal.CloseButton)
|
|
end
|
|
PawnUIStringDialog.OKCallbackFunction = OKCallbackFunction
|
|
PawnUIStringDialog.CancelCallbackFunction = CancelCallbackFunction
|
|
PawnUIStringDialog:Show()
|
|
PawnUIStringDialog_TextBox:SetFocus()
|
|
end
|
|
|
|
-- Cancels the string dialog if it's open.
|
|
function PawnUIGetStringCancel()
|
|
if not PawnUIStringDialog:IsVisible() then return end
|
|
PawnUIStringDialog_CancelButton_OnClick()
|
|
end
|
|
|
|
function PawnUIStringDialog_OKButton_OnClick()
|
|
PawnUIStringDialog:Hide()
|
|
if PawnUIStringDialog.OKCallbackFunction then PawnUIStringDialog.OKCallbackFunction(PawnUIStringDialog_TextBox:GetText()) end
|
|
end
|
|
|
|
function PawnUIStringDialog_CancelButton_OnClick()
|
|
PawnUIStringDialog:Hide()
|
|
if PawnUIStringDialog.CancelCallbackFunction then PawnUIStringDialog.CancelCallbackFunction() end
|
|
end
|
|
|
|
function PawnUIStringDialog_TextBox_OnTextChanged()
|
|
if PawnUIStringDialog_TextBox:GetText() ~= "" then
|
|
PawnUIStringDialog_OKButton:Enable()
|
|
else
|
|
PawnUIStringDialog_OKButton:Disable()
|
|
end
|
|
end |