You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2722 lines
103 KiB
2722 lines
103 KiB
-- Pawn by Vger-Azjol-Nerub
|
|
-- www.vgermods.com
|
|
-- © 2006-2022 Travis Spomer. 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
|
|
|
|
-- The currently-active string dialog.
|
|
local PawnUIStringDialog
|
|
|
|
-- 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 PawnUIGemQualityLevel
|
|
|
|
local PawnUITotalScaleLines = 0
|
|
local PawnUIIsShowingNoneWarning = false
|
|
local PawnUITotalComparisonLines = 0
|
|
local PawnUITotalGemLines = 0
|
|
|
|
-- Index n is the quest advisor overlay image for the reward with index n
|
|
local PawnQuestAdvisorOverlays = {}
|
|
|
|
-- Don't taint the global variable "_".
|
|
local _
|
|
|
|
------------------------------------------------------------
|
|
-- "Constants"
|
|
------------------------------------------------------------
|
|
|
|
local PawnUIScaleSelectorNoneWarningHeight = 80 -- the "no scales selected" warning is this tall
|
|
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 = 20 -- the stats list contains 20 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 gem 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 }
|
|
|
|
|
|
------------------------------------------------------------
|
|
-- 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()
|
|
if PaperDollFrame.ExpandButton then
|
|
-- DejaCharacterStats compatibility
|
|
PawnUI_InventoryPawnButton:SetPoint("TOPRIGHT", "CharacterTrinket1Slot", "BOTTOMRIGHT", -31, -8)
|
|
else
|
|
PawnUI_InventoryPawnButton:SetPoint("TOPRIGHT", "CharacterTrinket1Slot", "BOTTOMRIGHT", -1, -8)
|
|
end
|
|
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", -14, -32)
|
|
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
|
|
if PawnUI_SocketingPawnButton then
|
|
PawnUI_SocketingPawnButton:ClearAllPoints()
|
|
PawnUI_SocketingPawnButton:SetPoint("TOPRIGHT", "ItemSocketingFrame", "TOPRIGHT", -14, -32)
|
|
PawnUI_SocketingPawnButton: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(PawnLocal.UI.InventoryButtonTooltip, 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.
|
|
if not PawnCommon.ShowValuesForUpgradesOnly then
|
|
PawnUI_AddInventoryTotalsToTooltip(GameTooltip, "player")
|
|
end
|
|
|
|
-- Finally, display the tooltip.
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
function PawnUI_InspectPawnButton_OnEnter(this)
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT")
|
|
GameTooltip:AddLine("Pawn", 1, 1, 1, 1)
|
|
-- For some reason INSPECTED_UNIT isn't getting set in Classic, so fall back to target if it's nil.
|
|
PawnUI_AddInventoryTotalsToTooltip(GameTooltip, INSPECTED_UNIT or "target")
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
function PawnUI_SocketingPawnButton_OnEnter(this)
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT")
|
|
GameTooltip:AddLine("Pawn", 1, 1, 1, 1)
|
|
GameTooltip:AddLine(PawnLocal.UI.SocketingAdvisorButtonTooltip)
|
|
|
|
-- Finally, display the tooltip.
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
function PawnUI_SocketingPawnButton_OnClick(this)
|
|
-- Set the suggested gem quality level to the level of the current item so relevant gems will be displayed.
|
|
local ItemLevel
|
|
local _, ItemLink = ItemSocketingDescription:GetItem()
|
|
_, _, _, ItemLevel = GetItemInfo(ItemLink)
|
|
PawnUI_SetGemQualityLevel(ItemLevel)
|
|
-- Show the Gems tab.
|
|
PawnUIShowTab(PawnUIGemsTabPage, true)
|
|
end
|
|
|
|
function PawnUI_AddInventoryTotalsToTooltip(Tooltip, Unit)
|
|
-- Get the total stats for all items.
|
|
local ItemValues, Count, AverageItemLevel = PawnGetInventoryItemValues(Unit)
|
|
if not PawnCommon.ShowValuesForUpgradesOnly then
|
|
if Count and Count > 0 then
|
|
Tooltip:AddLine(" ")
|
|
Tooltip:AddLine(PawnLocal.UI.InventoryButtonTotalsHeader, 1, 1, 1, 1)
|
|
PawnAddValuesToTooltip(Tooltip, ItemValues, nil, nil, nil, nil, nil, true)
|
|
end
|
|
end
|
|
-- Add average item level information to the inspect window. (It's not necessary for the current player's
|
|
-- character sheet because that's part of the default UI now.)
|
|
if AverageItemLevel and AverageItemLevel > 0 and Unit ~= "player" then
|
|
if PawnCommon.AlignNumbersRight then
|
|
Tooltip:AddDoubleLine(PawnLocal.AverageItemLevelIgnoringRarityTooltipLine, AverageItemLevel, VgerCore.Color.OrangeR, VgerCore.Color.OrangeG, VgerCore.Color.OrangeB, VgerCore.Color.OrangeR, VgerCore.Color.OrangeG, VgerCore.Color.OrangeB)
|
|
else
|
|
Tooltip:AddLine(PawnLocal.AverageItemLevelIgnoringRarityTooltipLine .. ": " .. AverageItemLevel, VgerCore.Color.OrangeR, VgerCore.Color.OrangeG, VgerCore.Color.OrangeB)
|
|
end
|
|
end
|
|
end
|
|
|
|
function PawnUI_InspectPawnButton_Attach()
|
|
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()
|
|
-- 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.
|
|
hooksecurefunc(ItemSocketingDescription, "SetSocketedItem", PawnUI_OnSocketUpdate)
|
|
end
|
|
|
|
function PawnUI_HookArtifactUI()
|
|
local OriginalOnRelicSlotMouseEnter = ArtifactFrame.PerksTab.TitleContainer.OnRelicSlotMouseEnter
|
|
ArtifactFrame.PerksTab.TitleContainer.OnRelicSlotMouseEnter =
|
|
function(...)
|
|
PawnIsHoveringSocketedRelic = true
|
|
OriginalOnRelicSlotMouseEnter(...)
|
|
PawnIsHoveringSocketedRelic = false
|
|
end
|
|
-- individual slots: ArtifactFrame.PerksTab.TitleContainer.RelicSlots[1]
|
|
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 ScaleData
|
|
local ScaleList = PawnGetAllScalesEx()
|
|
PawnUIIsShowingNoneWarning = true
|
|
for _, ScaleData in pairs(ScaleList) do
|
|
if ScaleData.IsVisible then
|
|
PawnUIIsShowingNoneWarning = false
|
|
break
|
|
end
|
|
end
|
|
if PawnUIIsShowingNoneWarning then
|
|
PawnUIFrame_ScaleSelector_NoneWarning:Show()
|
|
else
|
|
PawnUIFrame_ScaleSelector_NoneWarning:Hide()
|
|
end
|
|
|
|
local NewSelectedScale, FirstScale, LastHeader, _
|
|
for _, ScaleData in pairs(ScaleList) 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 + 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 PawnLocal.NoScale
|
|
PawnUI_HighlightCurrentScale()
|
|
|
|
-- Also refresh a few other related UI elements.
|
|
PawnUIUpdateHeader()
|
|
PawnUIFrame_ShowScaleCheck_Update()
|
|
PawnUIFrame_ScaleSelector_UpdateAuto()
|
|
end
|
|
|
|
function PawnUIFrame_ScaleSelector_UpdateAuto()
|
|
local Scale = PawnCommon.Scales[PawnUICurrentScale]
|
|
if Scale and Scale.ClassID and Scale.SpecID then
|
|
local _, LocalizedSpecName, _, IconTexturePath = PawnGetSpecializationInfoForClassID(Scale.ClassID, Scale.SpecID)
|
|
PawnUIFrame_ScaleSelector_SpecLabel:SetText(LocalizedSpecName)
|
|
PawnUIFrame_ScaleSelector_SpecIcon:SetTexture(IconTexturePath)
|
|
else
|
|
PawnUIFrame_ScaleSelector_SpecLabel:SetText("")
|
|
PawnUIFrame_ScaleSelector_SpecIcon:SetTexture(nil)
|
|
end
|
|
end
|
|
|
|
function PawnUIFrame_ScaleSelector_AddHeaderLine(Text)
|
|
local Line = PawnUIFrame_ScaleSelector_AddLineCore(Text)
|
|
Line:Disable()
|
|
end
|
|
|
|
function PawnUIFrame_ScaleSelector_AddScaleLine(ScaleName, LocalizedName, IsActive)
|
|
local ColoredName = LocalizedName
|
|
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) - (PawnUIIsShowingNoneWarning and PawnUIScaleSelectorNoneWarningHeight or 0))
|
|
Line:SetText(Text)
|
|
return Line, LineName
|
|
end
|
|
|
|
function PawnUIFrame_ScaleSelector_OnClick(self)
|
|
local ScaleName = self.ScaleName
|
|
-- If they held down the shift key, also toggle the scale visibility; otherwise, just select that scale.
|
|
if IsShiftKeyDown() then
|
|
PawnSetScaleVisible(ScaleName, not PawnIsScaleVisible(ScaleName))
|
|
PawnUIFrame_ScaleSelector_Refresh()
|
|
end
|
|
PawnUI_SelectScale(ScaleName)
|
|
end
|
|
|
|
-- Selects a scale in the scales list.
|
|
function PawnUI_SelectScale(ScaleName)
|
|
-- Close popup UI as necessary.
|
|
PawnUIStringDialogSingleLine:Hide()
|
|
PawnUIStringDialogMultiLine: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()
|
|
PawnUIFrame_ScaleSelector_UpdateAuto()
|
|
if PawnUIScalesTabPage:IsVisible() then
|
|
PawnUI_ScalesTab_Refresh()
|
|
end
|
|
if PawnUIValuesTabPage:IsVisible() then
|
|
PawnUI_ValuesTab_Refresh()
|
|
end
|
|
if PawnUICompareTabPage:IsVisible() then
|
|
PawnUI_CompareTab_Refresh()
|
|
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 ~= PawnLocal.NoScale 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(PawnLocal.NoScale)
|
|
PawnUIFrame_CopyScaleButton:Disable()
|
|
PawnUIFrame_RenameScaleButton:Disable()
|
|
PawnUIFrame_DeleteScaleButton:Disable()
|
|
PawnUIFrame_ExportScaleButton:Disable()
|
|
end
|
|
PawnUI_ScalesTab_SelectFrame()
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Values tab events
|
|
------------------------------------------------------------
|
|
|
|
function PawnUI_ValuesTab_Refresh()
|
|
PawnUIFrame_StatsList_Update()
|
|
PawnUIFrame_StatsList_SelectStat(PawnUICurrentStatIndex)
|
|
local Scale
|
|
if PawnUICurrentScale ~= PawnLocal.NoScale then Scale = PawnCommon.Scales[PawnUICurrentScale] end
|
|
|
|
if PawnUICurrentScale == PawnLocal.NoScale 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 == PawnLocal.NoScale 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 == PawnLocal.NoScale 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, nil, true)
|
|
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, nil, true)
|
|
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, nil, true)
|
|
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, nil, true)
|
|
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 == PawnLocal.NoScale 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 == PawnLocal.NoScale 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)
|
|
if PawnScaleIsReadOnly(PawnUICurrentScale) then PawnSetScaleVisible(PawnUICurrentScale, false) end
|
|
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 PawnUI_ScalesTab_SelectFrame()
|
|
if not VgerCore.SpecsExist then
|
|
PawnUIFrame_AutoSelectScalesOnButton:Hide()
|
|
PawnUIFrame_AutoSelectScalesOffButton.SelectedTexture:Show()
|
|
PawnUIScalesTab_AutoFrame:Hide()
|
|
PawnUIScalesTab_ManualFrame:Show()
|
|
elseif PawnOptions.AutoSelectScales then
|
|
PawnUIFrame_AutoSelectScalesOnButton.SelectedTexture:Show()
|
|
PawnUIScalesTab_AutoFrame:Show()
|
|
PawnUIFrame_AutoSelectScalesOffButton.SelectedTexture:Hide()
|
|
PawnUIScalesTab_ManualFrame:Hide()
|
|
else
|
|
PawnUIFrame_AutoSelectScalesOnButton.SelectedTexture:Hide()
|
|
PawnUIScalesTab_AutoFrame:Hide()
|
|
PawnUIFrame_AutoSelectScalesOffButton.SelectedTexture:Show()
|
|
PawnUIScalesTab_ManualFrame:Show()
|
|
end
|
|
PawnUISwitchToTab(PawnUIScalesTabPage)
|
|
end
|
|
|
|
function PawnUIFrame_AutoSelectScalesOnButton_OnClick()
|
|
PawnOptions.UpgradeTracking = false
|
|
PawnSetAutoSelectScales(true)
|
|
PawnUI_ScalesTab_SelectFrame()
|
|
end
|
|
|
|
function PawnUIFrame_AutoSelectScalesOffButton_OnClick()
|
|
PawnSetAutoSelectScales(false)
|
|
PawnUI_ScalesTab_SelectFrame()
|
|
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 ~= PawnLocal.NoScale 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.
|
|
if ThisScale[ThisStat] <= PawnIgnoreStatValue then
|
|
-- Well, technically, it's ignored.
|
|
Line:SetText(" " .. Title .. " " .. PawnLocal.Unusable)
|
|
Line:SetNormalFontObject("PawnFontSilver")
|
|
else
|
|
Line:SetText(" " .. Title .. " = " .. format("%g", ThisScale[ThisStat]))
|
|
Line:SetNormalFontObject("GameFontHighlight")
|
|
end
|
|
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
|
|
local ThisScaleIsReadOnly = PawnScaleIsReadOnly(PawnUICurrentScale)
|
|
if PawnUICurrentScale ~= PawnLocal.NoScale then ThisScale = PawnGetAllStatValues(PawnUICurrentScale) end
|
|
if Index > 0 and ThisScale then
|
|
-- They've selected a stat.
|
|
local ThisStatIsIgnored = ThisScale[ThisStat] and ThisScale[ThisStat] <= PawnIgnoreStatValue
|
|
ThisDescription = PawnStats[Index][3]
|
|
PawnUIFrame_DescriptionLabel:SetText(ThisDescription)
|
|
ThisPrompt = PawnStats[Index][5]
|
|
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 ThisStatIsIgnored then ThisScaleValueUneditable = "0" end
|
|
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)
|
|
if ThisScaleIsReadOnly or ThisStatIsIgnored then
|
|
PawnUIFrame_StatValueLabel:Show()
|
|
PawnUIFrame_StatValueBox:Hide()
|
|
PawnUIFrame_ClearValueButton:Hide()
|
|
else
|
|
PawnUIFrame_StatValueBox:Show()
|
|
PawnUIFrame_StatValueLabel:Hide()
|
|
if ThisScaleValue ~= "" then
|
|
PawnUIFrame_ClearValueButton:Show()
|
|
else
|
|
PawnUIFrame_ClearValueButton:Hide()
|
|
end
|
|
end
|
|
PawnUIFrame_IgnoreStatCheck:SetChecked(ThisStatIsIgnored)
|
|
local TypeOfStat = PawnStats[Index][4]
|
|
if (not ThisScaleIsReadOnly) and (TypeOfStat ~= PawnStatUnignorable) then
|
|
-- Shown and editable: scale is editable and stat is not unignorable
|
|
PawnUIFrame_IgnoreStatCheck_Label:SetText(TypeOfStat == PawnStatItemType and PawnLocal.UI.ValuesIgnoreItemType or PawnLocal.UI.ValuesIgnoreStat)
|
|
PawnUIFrame_IgnoreStatCheck:Show()
|
|
PawnUIFrame_IgnoreStatCheck:Enable()
|
|
elseif ThisScaleIsReadOnly and (ThisStatIsIgnored) then
|
|
-- Shown but not editable: scale is not editable and stat is currently ignored
|
|
PawnUIFrame_IgnoreStatCheck_Label:SetText(TypeOfStat == PawnStatItemType and PawnLocal.UI.ValuesIgnoreItemType or PawnLocal.UI.ValuesIgnoreStat)
|
|
PawnUIFrame_IgnoreStatCheck:Show()
|
|
PawnUIFrame_IgnoreStatCheck:Disable()
|
|
else
|
|
-- Hidden: anytime else
|
|
PawnUIFrame_IgnoreStatCheck:Hide()
|
|
PawnUIFrame_IgnoreStatCheck:Disable()
|
|
end
|
|
local WeaponSet = PawnGetWeaponSetForStat(ThisStat)
|
|
if WeaponSet then PawnUIFrame_NoUpgradesCheck:SetChecked(not PawnGetShowUpgradesForWeapons(PawnUICurrentScale, WeaponSet)) end
|
|
PawnUIFrame_FollowSpecializationCheck:SetChecked(PawnGetUpgradesFollowSpecialization(PawnUICurrentScale))
|
|
if WeaponSet == 1 then
|
|
PawnUIFrame_NoUpgradesCheck_Label:SetText(PawnLocal.UI.ValuesDoNotShowUpgradesFor1H)
|
|
elseif WeaponSet == 2 then
|
|
PawnUIFrame_NoUpgradesCheck_Label:SetText(PawnLocal.UI.ValuesDoNotShowUpgradesFor2H)
|
|
end
|
|
if WeaponSet == nil then
|
|
PawnUIFrame_NoUpgradesCheck:Hide()
|
|
else
|
|
PawnUIFrame_NoUpgradesCheck:Show()
|
|
end
|
|
if (PawnArmorSpecializationLevel ~= nil) and (ThisStat == "IsCloth" or ThisStat == "IsLeather" or ThisStat == "IsMail" or ThisStat == "IsPlate") then
|
|
PawnUIFrame_FollowSpecializationCheck:Show()
|
|
else
|
|
PawnUIFrame_FollowSpecializationCheck:Hide()
|
|
end
|
|
elseif PawnUICurrentScale == PawnLocal.NoScale 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_IgnoreStatCheck:Hide()
|
|
PawnUIFrame_NoUpgradesCheck:Hide()
|
|
PawnUIFrame_FollowSpecializationCheck: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_IgnoreStatCheck:Hide()
|
|
PawnUIFrame_NoUpgradesCheck:Hide()
|
|
PawnUIFrame_FollowSpecializationCheck:Hide()
|
|
end
|
|
|
|
end
|
|
|
|
function PawnUIFrame_IgnoreStatCheck_OnClick()
|
|
if PawnScaleIsReadOnly(PawnUICurrentScale) then return end
|
|
|
|
local IsIgnoredNow = PawnUIFrame_IgnoreStatCheck:GetChecked()
|
|
if IsIgnoredNow then
|
|
PawnUIFrame_ClearValueButton:Hide()
|
|
PawnUIFrame_StatValueBox:Hide()
|
|
PawnUIFrame_StatValueLabel:Show()
|
|
PawnUIFrame_StatValueLabel:SetText("0")
|
|
PawnSetStatValue(PawnUICurrentScale, PawnStats[PawnUICurrentStatIndex][2], PawnIgnoreStatValue)
|
|
else
|
|
PawnUIFrame_ClearValueButton:Disable()
|
|
PawnUIFrame_ClearValueButton:Show()
|
|
PawnUIFrame_StatValueBox:SetText("")
|
|
PawnUIFrame_StatValueBox:Show()
|
|
PawnSetStatValue(PawnUICurrentScale, PawnStats[PawnUICurrentStatIndex][2], 0)
|
|
end
|
|
PawnUIFrame_StatsList_UpdateStat(PawnUICurrentStatIndex)
|
|
end
|
|
|
|
function PawnUIFrame_NoUpgradesCheck_OnClick()
|
|
local WeaponSet = PawnGetWeaponSetForStat(PawnStats[PawnUICurrentStatIndex][2])
|
|
if not WeaponSet then VgerCore.Fail("Couldn't find the weapon set to enable or disable.") return end
|
|
|
|
PawnSetShowUpgradesForWeapons(PawnUICurrentScale, WeaponSet, not PawnUIFrame_NoUpgradesCheck:GetChecked())
|
|
end
|
|
|
|
function PawnUIFrame_FollowSpecializationCheck_OnClick()
|
|
PawnSetUpgradesFollowSpecialization(PawnUICurrentScale, PawnUIFrame_FollowSpecializationCheck:GetChecked())
|
|
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
|
|
if NewValue <= PawnIgnoreStatValue then
|
|
PawnUIFrame_StatValueBox:Hide()
|
|
PawnUIFrame_ClearValueButton:Hide()
|
|
PawnUIFrame_IgnoreStatCheck:SetChecked(true)
|
|
else
|
|
PawnUIFrame_StatValueBox:Show()
|
|
PawnUIFrame_ClearValueButton:Show()
|
|
PawnUIFrame_ClearValueButton:Enable()
|
|
PawnUIFrame_IgnoreStatCheck:SetChecked(false)
|
|
end
|
|
else
|
|
PawnUIFrame_StatValueBox:Show()
|
|
PawnUIFrame_ClearValueButton:Show()
|
|
PawnUIFrame_ClearValueButton:Disable()
|
|
PawnUIFrame_IgnoreStatCheck:SetChecked(false)
|
|
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)
|
|
end
|
|
|
|
function PawnUIFrame_ClearValueButton_OnClick()
|
|
PawnUIFrame_StatValueBox:SetText("")
|
|
end
|
|
|
|
function PawnUIFrame_GetCurrentScaleColor()
|
|
local r, g, b
|
|
if PawnUICurrentScale and PawnUICurrentScale ~= PawnLocal.NoScale 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)
|
|
ShowUIPanel(ColorPickerFrame)
|
|
end
|
|
|
|
function PawnUIFrame_ScaleColorSwatch_OnChange()
|
|
local r, g, b = ColorPickerFrame:GetColorRGB()
|
|
PawnUIFrame_ScaleColorSwatch_SetColor(r, g, b)
|
|
end
|
|
|
|
function PawnUIFrame_ScaleColorSwatch_OnCancel(rgb)
|
|
---@diagnostic disable-next-line: deprecated
|
|
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 ~= PawnLocal.NoScale then
|
|
local r, g, b = PawnUIFrame_GetCurrentScaleColor()
|
|
PawnUIFrame_ScaleColorSwatch_Color:SetColorTexture(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 ~= PawnLocal.NoScale 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_NormalizeValuesCheck_OnClick()
|
|
if PawnUICurrentScale == PawnLocal.NoScale or PawnScaleIsReadOnly(PawnUICurrentScale) then return end
|
|
|
|
if PawnUIFrame_NormalizeValuesCheck:GetChecked() then
|
|
PawnSetScaleNormalizationFactor(PawnUICurrentScale, 1)
|
|
else
|
|
PawnSetScaleNormalizationFactor(PawnUICurrentScale, nil)
|
|
end
|
|
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 so the UI is in the default state.
|
|
PawnUI_ClearCompareItems()
|
|
end
|
|
|
|
function PawnUI_CompareTab_Refresh()
|
|
PawnUI_InitCompareTab()
|
|
|
|
-- Update the currently visible comparison, if any.
|
|
PawnUI_CompareItems()
|
|
-- Then, update the best in slot shortcuts.
|
|
local Item = PawnUIComparisonItems[2]
|
|
local ItemEquipLoc, _
|
|
if Item then _, _, _, _, _, _, _, _, ItemEquipLoc = GetItemInfo(Item.Link) end
|
|
PawnUI_SetShortcutBestItem(3, ItemEquipLoc)
|
|
PawnUI_SetShortcutBestItem(4, ItemEquipLoc)
|
|
end
|
|
|
|
-- Called whenever we reset the tooltips due to a calculation change.
|
|
function PawnUI_ClearCacheValues()
|
|
if PawnUIComparisonItems[1] then PawnUIComparisonItems[1].Values = nil end
|
|
if PawnUIComparisonItems[2] then PawnUIComparisonItems[2].Values = nil end
|
|
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
|
|
elseif type(ItemLink) == "number" or tonumber(ItemLink) ~= nil then
|
|
ItemLink = "item:" .. ItemLink
|
|
Item = PawnGetItemData(ItemLink)
|
|
-- If Item is nil, then that item isn't actually a valid item with stats, so we shouldn't allow it in the compare UI.
|
|
if not Item then return end
|
|
else
|
|
-- Check to make sure it's an item link and not, say, a battle pet.
|
|
if PawnGetHyperlinkType(ItemLink) ~= "item" then return end
|
|
-- Unenchant the item link.
|
|
ItemLink = PawnUnenchantItemLink(ItemLink, true)
|
|
Item = PawnGetItemData(ItemLink)
|
|
-- If Item is nil, then that item isn't actually a valid item with stats, so we shouldn't allow it in the compare UI.
|
|
if not Item then return end
|
|
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("PawnUICompareItemIcon" .. Index .. "NormalTexture")
|
|
Label:SetText(ItemName)
|
|
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)
|
|
PawnUI_SetShortcutBestItem(3, ItemEquipLoc)
|
|
PawnUI_SetShortcutBestItem(4, ItemEquipLoc)
|
|
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)
|
|
-- 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] then
|
|
-- First, pick an appropriate scale.
|
|
local UpgradeInfo = PawnIsItemAnUpgrade(PawnUIComparisonItems[2])
|
|
local ShortcutToUse
|
|
if UpgradeInfo and #UpgradeInfo == 1 and UpgradeInfo[1].PercentUpgrade then
|
|
-- This item upgrades exactly one scale, so switch to that scale and the current best-in-slot.
|
|
PawnUI_SelectScale(UpgradeInfo[1].ScaleName)
|
|
if PawnUIShortcutItems[3] then
|
|
ShortcutToUse = PawnUIShortcutItems[3]
|
|
elseif PawnUIShortcutItems[4] then
|
|
ShortcutToUse = PawnUIShortcutItems[4]
|
|
end
|
|
end
|
|
-- Now set the left compare item.
|
|
if ShortcutToUse == nil 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.
|
|
ShortcutToUse = PawnUIShortcutItems[1]
|
|
if (not PawnUIShortcutItems[1]) or (PawnUIShortcutItems[2] and (PawnUIShortcutItems[1].Link == PawnUIComparisonItems[2].Link)) then
|
|
ShortcutToUse = PawnUIShortcutItems[2]
|
|
end
|
|
end
|
|
-- Don't bother with an auto-comparison at all if the best item we found was the same item.
|
|
if ShortcutToUse and 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
|
|
|
|
if Slot then
|
|
PawnUIShortcutItems[ShortcutIndex] = PawnGetItemDataForInventorySlot(Slot, true)
|
|
else
|
|
PawnUIShortcutItems[ShortcutIndex] = nil
|
|
end
|
|
PawnUI_SetShortcutButtonItem(ShortcutIndex)
|
|
end
|
|
|
|
-- Enables or disables one of the "best in slot" shortcut buttons based on an inventory type. If there is a best item for the
|
|
-- current scale for that inventory type, it will appear in the shortcut button. Otherwise, it will be hidden.
|
|
function PawnUI_SetShortcutBestItem(ShortcutIndex, InvType)
|
|
if ShortcutIndex ~= 3 and ShortcutIndex ~= 4 then
|
|
VgerCore.Fail("ShortcutIndex must be 3 or 4.")
|
|
return
|
|
end
|
|
|
|
-- Find the best item for this shortcut, and save it for later. (If InvType is nil, this will return nil.)
|
|
local BestItemLink = PawnGetBestItemLink(PawnUICurrentScale, InvType, ShortcutIndex - 2)
|
|
if BestItemLink then
|
|
PawnUIShortcutItems[ShortcutIndex] = PawnGetItemData(BestItemLink)
|
|
else
|
|
PawnUIShortcutItems[ShortcutIndex] = nil
|
|
end
|
|
PawnUI_SetShortcutButtonItem(ShortcutIndex)
|
|
end
|
|
|
|
function PawnUI_SetShortcutButtonItem(ShortcutIndex)
|
|
local ButtonName = "PawnUICompareItemShortcut" .. ShortcutIndex
|
|
local ShortcutButton = getglobal(ButtonName)
|
|
|
|
-- Update this button.
|
|
local Item = PawnUIShortcutItems[ShortcutIndex]
|
|
if Item then
|
|
local Texture = getglobal(ButtonName .. "NormalTexture")
|
|
local _, _, _, _, _, _, _, _, _, ItemTexture = GetItemInfo(Item.Link)
|
|
Texture:SetTexture(ItemTexture)
|
|
ShortcutButton:Show()
|
|
else
|
|
ShortcutButton:Hide()
|
|
end
|
|
|
|
-- Now, show or hide the header text above this button.
|
|
if ShortcutIndex == 1 or ShortcutIndex == 2 then
|
|
if PawnUIShortcutItems[1] or PawnUIShortcutItems[2] then
|
|
PawnUIFrame_EquippedItemsHeader:Show()
|
|
else
|
|
PawnUIFrame_EquippedItemsHeader:Hide()
|
|
end
|
|
elseif ShortcutIndex == 3 or ShortcutIndex == 4 then
|
|
if PawnUIShortcutItems[3] or PawnUIShortcutItems[4] then
|
|
PawnUIFrame_BestItemsHeader:Show()
|
|
else
|
|
PawnUIFrame_BestItemsHeader:Hide()
|
|
end
|
|
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]
|
|
if SOUNDKIT then PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON) else PlaySound("igMainMenuOptionCheckBoxOn") end
|
|
-- 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(IsAutomatedRefresh)
|
|
-- Before doing anything else, clear out the existing comparison data.
|
|
PawnUICompareItemScore1:SetText("")
|
|
PawnUICompareItemScore2:SetText("")
|
|
PawnUICompareItemScoreDifference1:SetText("")
|
|
PawnUICompareItemScorePercentDifference1:SetText("")
|
|
PawnUICompareItemScoreDifference2:SetText("")
|
|
PawnUICompareItemScorePercentDifference2: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 == PawnLocal.NoScale) 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 StatCount = #PawnStats
|
|
local LastFoundHeader
|
|
local i = 1
|
|
for i = 1, StatCount do
|
|
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 and StatName ~= "MetaSocketEffect" 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 StatValue > PawnIgnoreStatValue 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.
|
|
LastFoundHeader = Title
|
|
end
|
|
end
|
|
|
|
-- Add gem and socket information.
|
|
LastFoundHeader = PawnLocal.UI.CompareSocketsHeader
|
|
|
|
local AddSockets = function(Stat, FriendlyName)
|
|
local HasSockets1 = Item1.UnenchantedStats[Stat]
|
|
local HasSockets2 = Item2.UnenchantedStats[Stat]
|
|
if not HasSockets1 or HasSockets1 <= 0 then HasSockets1 = nil end
|
|
if not HasSockets2 or HasSockets2 <= 0 then HasSockets2 = nil end
|
|
if HasSockets1 or HasSockets2 then
|
|
if LastFoundHeader then
|
|
PawnUI_AddComparisonHeaderLine(LastFoundHeader)
|
|
LastFoundHeader = nil
|
|
end
|
|
PawnUI_AddComparisonStatLineNumbers(FriendlyName, HasSockets1, HasSockets2, false) -- hide differential
|
|
end
|
|
end
|
|
|
|
AddSockets("PrismaticSocket", PawnLocal.UI.CompareColoredSockets)
|
|
AddSockets("RedSocket", RED_GEM)
|
|
AddSockets("YellowSocket", YELLOW_GEM)
|
|
AddSockets("BlueSocket", BLUE_GEM)
|
|
AddSockets("MetaSocket", META_GEM)
|
|
|
|
local _, TotalSocketValue1, SocketBonusValue1 = PawnGetItemValue(ItemStats1, Item1.Level, ItemSocketBonusStats1, PawnUICurrentScale, false, true)
|
|
local _, TotalSocketValue2, SocketBonusValue2 = PawnGetItemValue(ItemStats2, Item2.Level, ItemSocketBonusStats2, PawnUICurrentScale, false, true)
|
|
if TotalSocketValue1 and SocketBonusValue1 then TotalSocketValue1 = TotalSocketValue1 - SocketBonusValue1 end -- socket bonus is already included in total socket value
|
|
if TotalSocketValue2 and SocketBonusValue2 then TotalSocketValue2 = TotalSocketValue2 - SocketBonusValue2 end
|
|
|
|
if not TotalSocketValue1 or TotalSocketValue1 <= 0 then TotalSocketValue1 = nil end
|
|
if not TotalSocketValue2 or TotalSocketValue2 <= 0 then TotalSocketValue2 = nil end
|
|
if TotalSocketValue1 or TotalSocketValue2 then
|
|
if LastFoundHeader then
|
|
PawnUI_AddComparisonHeaderLine(LastFoundHeader)
|
|
LastFoundHeader = nil
|
|
end
|
|
PawnUI_AddComparisonStatLineNumbers(PawnLocal.UI.CompareGemTotalValue, TotalSocketValue1, TotalSocketValue2, false) -- hide differential
|
|
end
|
|
if not SocketBonusValue1 or SocketBonusValue1 <= 0 then SocketBonusValue1 = nil end
|
|
if not SocketBonusValue2 or SocketBonusValue2 <= 0 then SocketBonusValue2 = nil end
|
|
if SocketBonusValue1 or SocketBonusValue2 then
|
|
if LastFoundHeader then
|
|
PawnUI_AddComparisonHeaderLine(LastFoundHeader)
|
|
LastFoundHeader = nil
|
|
end
|
|
PawnUI_AddComparisonStatLineNumbers(PawnLocal.UI.CompareSocketBonus, SocketBonusValue1, SocketBonusValue2, false) -- hide differential
|
|
end
|
|
|
|
-- Everything else below this point goes under an "Other" header.
|
|
LastFoundHeader = PawnLocal.UI.CompareOtherHeader
|
|
|
|
-- Add item level information if the user normally has item levels visible.
|
|
-- Note that for upgradeable items, this won't be the upgradeable level of the item—the GetItemInfo API doesn't return the
|
|
-- correct item level for upgraded items. We don't use the item level for anything important, so that'll just be a known limitation for now.
|
|
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 (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, false) -- hide differential
|
|
end
|
|
|
|
-- Add asterisk indicator.
|
|
local Asterisk1, Asterisk2
|
|
if Item1.UnknownLines then Asterisk1 = YES end
|
|
if Item2.UnknownLines then Asterisk2 = YES end
|
|
if Asterisk1 or Asterisk2 then
|
|
if LastFoundHeader then
|
|
PawnUI_AddComparisonHeaderLine(LastFoundHeader)
|
|
LastFoundHeader = nil
|
|
end
|
|
PawnUI_AddComparisonStatLineStrings(PawnLocal.UI.CompareSpecialEffects .. " " .. PawnDiamondTexture, Asterisk1, Asterisk2)
|
|
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
|
|
if Value1 >= 1000 then
|
|
Value1String = VgerCore.FormatCompactDecimal(Value1)
|
|
else
|
|
Value1String = format(ValueFormat, Value1)
|
|
end
|
|
else
|
|
Value1 = 0
|
|
end
|
|
if Value2 then
|
|
if Value2 >= 1000 then
|
|
Value2String = VgerCore.FormatCompactDecimal(Value2)
|
|
else
|
|
Value2String = format(ValueFormat, Value2)
|
|
end
|
|
else
|
|
Value2 = 0
|
|
end
|
|
if Value1 > 0 then
|
|
PawnUICompareItemScore1:SetText(Value1String)
|
|
PawnUICompareItemScore1:SetVertexColor(r, g, b)
|
|
if Value1 > Value2 and Value2 > 0 then
|
|
PawnUICompareItemScoreDifference1:SetText("(+" .. VgerCore.FormatCompactDecimal(Value1 - Value2) .. ")")
|
|
local Increase = (Value1 - Value2) / Value2
|
|
if Increase < PawnBigUpgradeThreshold then
|
|
PawnUICompareItemScorePercentDifference1:SetText(format("(+%s%%)", VgerCore.FormatInteger(Increase * 100)))
|
|
end
|
|
PawnUICompareItemScoreHighlight1:Show()
|
|
PawnUICompareItemScoreArrow1:Show()
|
|
end
|
|
end
|
|
if Value2 > 0 then
|
|
PawnUICompareItemScore2:SetText(Value2String)
|
|
PawnUICompareItemScore2:SetVertexColor(r, g, b)
|
|
if Value2 > Value1 and Value1 > 0 then
|
|
PawnUICompareItemScoreDifference2:SetText("(+" .. VgerCore.FormatCompactDecimal(Value2 - Value1) .. ")")
|
|
local Increase = (Value2 - Value1) / Value1
|
|
if Increase < PawnBigUpgradeThreshold then
|
|
PawnUICompareItemScorePercentDifference2:SetText(format("(+%s%%)", VgerCore.FormatInteger(Increase * 100)))
|
|
end
|
|
PawnUICompareItemScoreHighlight2:Show()
|
|
PawnUICompareItemScoreArrow2:Show()
|
|
end
|
|
end
|
|
|
|
-- Hack for WoW Classic: after a moment, refresh the whole thing, because we might have gotten
|
|
-- incomplete data from the tooltip the first time.
|
|
if not IsAutomatedRefresh and (VgerCore.IsClassic or VgerCore.IsBurningCrusade or VgerCore.IsWrath) then
|
|
local AutomatedRefresh = function()
|
|
if PawnUIComparisonItems[1] then PawnUIComparisonItems[1] = PawnGetItemData(PawnUIComparisonItems[1].Link) end
|
|
if PawnUIComparisonItems[2] then PawnUIComparisonItems[2] = PawnGetItemData(PawnUIComparisonItems[2].Link) end
|
|
PawnUI_CompareItems(true)
|
|
end
|
|
C_Timer.After(0.5, AutomatedRefresh)
|
|
C_Timer.After(1.0, AutomatedRefresh)
|
|
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, ShowDifference)
|
|
if ShowDifference == nil then ShowDifference = true end -- default value
|
|
|
|
local QuantityString1 = VgerCore.FormatCompactDecimal(Quantity1)
|
|
local QuantityString2 = VgerCore.FormatCompactDecimal(Quantity2)
|
|
local Difference1, Difference2
|
|
if not Quantity1 then Quantity1 = 0 end
|
|
if not Quantity2 then Quantity2 = 0 end
|
|
if ShowDifference then
|
|
if Quantity1 > Quantity2 then
|
|
Difference1 = "(+" .. VgerCore.FormatCompactDecimal(Quantity1 - Quantity2) .. ")"
|
|
elseif Quantity2 > Quantity1 then
|
|
Difference2 = "(+" .. VgerCore.FormatCompactDecimal(Quantity2 - Quantity1) .. ")"
|
|
end
|
|
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
|
|
|
|
-- Gets all of the text from an item tooltip and then puts it into a box where it can be copied.
|
|
function PawnUIGetAllTextForItem(Item)
|
|
if not Item then return end
|
|
local ItemLink
|
|
if type(Item) == "table" then
|
|
if Item.Link then
|
|
ItemLink = Item.Link
|
|
else
|
|
return
|
|
end
|
|
elseif type(Item) == "string" then
|
|
ItemLink = Item
|
|
PawnGetItemData(ItemLink) -- Not actually used, but call this here so we can use /pawn debug.
|
|
Item = nil
|
|
end
|
|
local Tooltip = _G[PawnPrivateTooltipName]
|
|
VgerCore.Assert(Tooltip, "Failed to find the private tooltip.")
|
|
|
|
Tooltip:ClearLines()
|
|
Tooltip:SetHyperlink(ItemLink)
|
|
|
|
local NumLines = Tooltip:NumLines()
|
|
local i
|
|
local AllText = ""
|
|
for i = 1, NumLines do
|
|
local LeftLine = _G[PawnPrivateTooltipName .. "TextLeft" .. i]
|
|
AllText = AllText .. LeftLine:GetText() .. "\n"
|
|
local RightLine = _G[PawnPrivateTooltipName .. "TextRight" .. i]
|
|
if RightLine then
|
|
local RightText = RightLine:GetText()
|
|
if RightText and RightText ~= "" then
|
|
AllText = AllText .. " " .. RightText .. "\n"
|
|
end
|
|
end
|
|
end
|
|
AllText = AllText .. "\n/pawn compare " .. PawnGetItemIDsForDisplay(ItemLink, false)
|
|
|
|
local ItemName
|
|
if Item then
|
|
ItemName = Item.Name
|
|
else
|
|
ItemName = (_G[PawnPrivateTooltipName .. "TextLeft1"]):GetText()
|
|
end
|
|
PawnUIShowCopyableString(ItemName, AllText, nil, true)
|
|
|
|
-- Tip: If this doesn't work for your particular situation, you can also open an item link and then do this:
|
|
-- /script PawnUIShowCopyableString("", ItemRefTooltipTextLeft8:GetText(), nil, true)
|
|
-- (where "8" is the line of the tooltip that you want to extract)
|
|
end
|
|
|
|
-- Called when one of the two upper item slots are clicked.
|
|
function PawnUICompareItemIcon_OnClick(Index)
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
|
|
|
-- 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
|
|
|
|
-- Are they holding down Alt to copy and paste text from the item?
|
|
if PawnUIComparisonItems[Index] and IsAltKeyDown() then
|
|
PawnUIGetAllTextForItem(PawnUIComparisonItems[Index])
|
|
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(self, Button)
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
|
local ShortcutIndex = self:GetID()
|
|
|
|
-- 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(self)
|
|
local ShortcutIndex = self:GetID()
|
|
local Item = PawnUIShortcutItems[ShortcutIndex]
|
|
if Item then
|
|
GameTooltip:SetOwner(getglobal("PawnUICompareItemShortcut" .. ShortcutIndex), "ANCHOR_TOPLEFT")
|
|
local ItemLink = PawnUnenchantItemLink(Item.Link, true)
|
|
GameTooltip:SetHyperlink(ItemLink)
|
|
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
|
|
|
|
-- Changes the current gem quality level. Set to nil to reset to showing the best gems overall regardless of item level.
|
|
function PawnUI_SetGemQualityLevel(GemQualityLevel)
|
|
if GemQualityLevel then
|
|
PawnUIFrame_GemQualityLevelBox:SetText(GemQualityLevel)
|
|
else
|
|
PawnUIFrame_BestGemsRadio_Click()
|
|
end
|
|
end
|
|
|
|
function PawnUI_ShowBestGems()
|
|
-- Always clear out the existing gems, no matter what happens next.
|
|
PawnUI_DeleteGemLines()
|
|
-- If no scale is selected, we can't show a gem list. (This is a valid case!)
|
|
if not PawnUICurrentScale or PawnUICurrentScale == PawnLocal.NoScale then return end
|
|
|
|
-- Update the gem list for this scale.
|
|
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
|
|
|
|
local ShownGems = false
|
|
local _
|
|
|
|
local GemQualityLevel = PawnGetGemQualityForItem(PawnGemQualityLevels, PawnUIGemQualityLevel)
|
|
|
|
if not VgerCore.IsClassic and not VgerCore.IsMainline then
|
|
-- Burning Crusade Classic and Wrath Classic: Divide by color
|
|
if #(PawnScaleBestGems[PawnUICurrentScale].RedSocket[GemQualityLevel]) > 0 then
|
|
PawnUI_AddGemHeaderLine(format(PawnLocal.UI.GemsColorHeader, RED_GEM))
|
|
for _, GemData in pairs(PawnScaleBestGems[PawnUICurrentScale].RedSocket[GemQualityLevel]) do
|
|
PawnUI_AddGemLine(GemData.Name, GemData.Texture, GemData.ID)
|
|
end
|
|
ShownGems = true
|
|
end
|
|
if #(PawnScaleBestGems[PawnUICurrentScale].YellowSocket[GemQualityLevel]) > 0 then
|
|
PawnUI_AddGemHeaderLine(format(PawnLocal.UI.GemsColorHeader, YELLOW_GEM))
|
|
for _, GemData in pairs(PawnScaleBestGems[PawnUICurrentScale].YellowSocket[GemQualityLevel]) do
|
|
PawnUI_AddGemLine(GemData.Name, GemData.Texture, GemData.ID)
|
|
end
|
|
ShownGems = true
|
|
end
|
|
if #(PawnScaleBestGems[PawnUICurrentScale].BlueSocket[GemQualityLevel]) > 0 then
|
|
PawnUI_AddGemHeaderLine(format(PawnLocal.UI.GemsColorHeader, BLUE_GEM))
|
|
for _, GemData in pairs(PawnScaleBestGems[PawnUICurrentScale].BlueSocket[GemQualityLevel]) do
|
|
PawnUI_AddGemLine(GemData.Name, GemData.Texture, GemData.ID)
|
|
end
|
|
ShownGems = true
|
|
end
|
|
else
|
|
-- Non-Classic WoW: All sockets are prismatic
|
|
if #(PawnScaleBestGems[PawnUICurrentScale].PrismaticSocket[GemQualityLevel]) > 0 then
|
|
for _, GemData in pairs(PawnScaleBestGems[PawnUICurrentScale].PrismaticSocket[GemQualityLevel]) do
|
|
PawnUI_AddGemLine(GemData.Name, GemData.Texture, GemData.ID)
|
|
end
|
|
ShownGems = true
|
|
end
|
|
end
|
|
|
|
if not ShownGems then
|
|
PawnUI_AddGemHeaderLine(PawnLocal.UI.GemsNoneFound)
|
|
end
|
|
|
|
PawnUI_RefreshGemScrollFrame()
|
|
end
|
|
|
|
function PawnUIFrame_BestGemsRadio_Click()
|
|
PawnUIFrame_BestGemsRadio:SetChecked(true)
|
|
PawnUIFrame_GemsForItemLevelRadio:SetChecked(false)
|
|
PawnUIFrame_GemQualityLevelBox:ClearFocus()
|
|
PawnUIGemQualityLevel = nil
|
|
PawnUI_ShowBestGems()
|
|
end
|
|
|
|
function PawnUIFrame_GemsForItemLevelRadio_Click()
|
|
PawnUIFrame_GemQualityLevelBox_OnTextChanged()
|
|
PawnUIFrame_BestGemsRadio:SetChecked(false)
|
|
PawnUIFrame_GemsForItemLevelRadio:SetChecked(true)
|
|
end
|
|
|
|
function PawnUIFrame_GemQualityLevelBox_OnTextChanged()
|
|
PawnUIGemQualityLevel = tonumber(PawnUIFrame_GemQualityLevelBox:GetText())
|
|
if PawnUIGemQualityLevel then
|
|
-- If the user just starts typing in the quality level box, automatically select the proper option.
|
|
PawnUIFrame_BestGemsRadio:SetChecked(false)
|
|
PawnUIFrame_GemsForItemLevelRadio:SetChecked(true)
|
|
else
|
|
PawnUIFrame_BestGemsRadio:SetChecked(true)
|
|
PawnUIFrame_GemsForItemLevelRadio:SetChecked(false)
|
|
end
|
|
PawnUI_ShowBestGems()
|
|
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 Item and 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_ShowSpecIconsCheck:SetChecked(PawnCommon.ShowSpecIcons)
|
|
PawnUIFrame_AlignRightCheck:SetChecked(PawnCommon.AlignNumbersRight)
|
|
PawnUIFrame_TooltipUpgradeList_UpdateSelection()
|
|
PawnUIFrame_ColorTooltipBorderCheck:SetChecked(PawnCommon.ColorTooltipBorder)
|
|
PawnUIFrame_EnchantedValuesCheck:SetChecked(PawnCommon.ShowEnchanted)
|
|
|
|
-- Upgrade options
|
|
PawnUIFrame_IgnoreGemsWhileLevelingCheck:SetChecked(PawnCommon.IgnoreGemsWhileLeveling)
|
|
PawnUIFrame_UpgradeTrackingList_UpdateSelection()
|
|
|
|
-- Advisor options
|
|
if not VgerCore.IsMainline then
|
|
-- The bag upgrade advisor isn't supported on Classic.
|
|
PawnUIFrame_ShowBagUpgradeAdvisorCheck:Hide()
|
|
else
|
|
PawnUIFrame_ShowBagUpgradeAdvisorCheck:SetChecked(PawnCommon.ShowBagUpgradeAdvisor)
|
|
end
|
|
PawnUIFrame_ShowLootUpgradeAdvisorCheck:SetChecked(PawnCommon.ShowLootUpgradeAdvisor)
|
|
PawnUIFrame_ShowQuestUpgradeAdvisorCheck:SetChecked(PawnCommon.ShowQuestUpgradeAdvisor)
|
|
PawnUIFrame_ShowSocketingAdvisorCheck:SetChecked(PawnCommon.ShowSocketingAdvisor)
|
|
PawnUIFrame_ShowItemLevelUpgradesCheck:SetChecked(PawnCommon.ShowItemLevelUpgrades)
|
|
|
|
-- Other options
|
|
PawnUIFrame_DebugCheck:SetChecked(PawnCommon.Debug)
|
|
PawnUIFrame_ButtonPositionList_UpdateSelection()
|
|
end
|
|
|
|
function PawnUIFrame_ShowItemIDsCheck_OnClick()
|
|
PawnCommon.ShowItemID = PawnUIFrame_ShowItemIDsCheck:GetChecked()
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_ShowIconsCheck_OnClick()
|
|
PawnCommon.ShowTooltipIcons = PawnUIFrame_ShowIconsCheck:GetChecked()
|
|
PawnToggleTooltipIcons()
|
|
end
|
|
|
|
function PawnUIFrame_ShowSpecIconsCheck_OnClick()
|
|
PawnCommon.ShowSpecIcons = PawnUIFrame_ShowSpecIconsCheck:GetChecked()
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_AlignRightCheck_OnClick()
|
|
PawnCommon.AlignNumbersRight = PawnUIFrame_AlignRightCheck:GetChecked()
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_TooltipUpgradeList_SetSelection(ShowUpgrades, ShowUpgradesOnly)
|
|
PawnCommon.ShowUpgradesOnTooltips = ShowUpgrades
|
|
PawnCommon.ShowValuesForUpgradesOnly = ShowUpgradesOnly
|
|
PawnUIFrame_TooltipUpgradeList_UpdateSelection()
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_TooltipUpgradeList_UpdateSelection()
|
|
PawnUIFrame_TooltipUpgradeOnRadio:SetChecked(PawnCommon.ShowUpgradesOnTooltips and not PawnCommon.ShowValuesForUpgradesOnly)
|
|
PawnUIFrame_TooltipUpgradeOnUpgradesOnlyRadio:SetChecked(PawnCommon.ShowUpgradesOnTooltips and PawnCommon.ShowValuesForUpgradesOnly)
|
|
PawnUIFrame_TooltipUpgradeOffRadio:SetChecked(not PawnCommon.ShowUpgradesOnTooltips)
|
|
end
|
|
|
|
function PawnUIFrame_UpgradeTrackingList_SetSelection(Enabled)
|
|
PawnSetUpgradeTracking(Enabled)
|
|
PawnUIFrame_UpgradeTrackingList_UpdateSelection()
|
|
end
|
|
|
|
function PawnUIFrame_UpgradeTrackingList_UpdateSelection()
|
|
local IsOptionAvailable = not PawnOptions.AutoSelectScales
|
|
|
|
PawnUIFrame_UpgradeTrackingOffRadio:SetChecked(not PawnOptions.UpgradeTracking)
|
|
PawnUIFrame_UpgradeTrackingOnRadio:SetChecked(PawnOptions.UpgradeTracking)
|
|
|
|
PawnUIFrame_UpgradeTrackingHeaderLabel:SetShown(IsOptionAvailable)
|
|
PawnUIFrame_UpgradeTrackingOffRadio:SetShown(IsOptionAvailable)
|
|
PawnUIFrame_UpgradeTrackingOnRadio:SetShown(IsOptionAvailable)
|
|
end
|
|
|
|
function PawnUIFrame_ColorTooltipBorderCheck_OnClick()
|
|
PawnCommon.ColorTooltipBorder = PawnUIFrame_ColorTooltipBorderCheck:GetChecked()
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_EnchantedValuesCheck_OnClick()
|
|
PawnCommon.ShowEnchanted = PawnUIFrame_EnchantedValuesCheck:GetChecked()
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_ShowBagUpgradeAdvisorCheck_OnClick()
|
|
PawnCommon.ShowBagUpgradeAdvisor = PawnUIFrame_ShowBagUpgradeAdvisorCheck:GetChecked()
|
|
|
|
-- When toggling this option, refresh all bags.
|
|
local BagIndex
|
|
for BagIndex = 1, NUM_CONTAINER_FRAMES, 1 do
|
|
local BagFrame = _G["ContainerFrame" .. BagIndex];
|
|
if BagFrame:IsShown() then
|
|
if BagFrame.UpdateItemUpgradeIcons then
|
|
-- Dragonflight onward
|
|
BagFrame:UpdateItemUpgradeIcons()
|
|
else
|
|
-- Legion through Shadowlands
|
|
ContainerFrame_UpdateItemUpgradeIcons(BagFrame)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function PawnUIFrame_ShowLootUpgradeAdvisorCheck_OnClick()
|
|
PawnCommon.ShowLootUpgradeAdvisor = PawnUIFrame_ShowLootUpgradeAdvisorCheck:GetChecked()
|
|
if LootHistoryFrame then LootHistoryFrame_FullUpdate(LootHistoryFrame) end
|
|
end
|
|
|
|
function PawnUIFrame_ShowQuestUpgradeAdvisorCheck_OnClick()
|
|
PawnCommon.ShowQuestUpgradeAdvisor = PawnUIFrame_ShowQuestUpgradeAdvisorCheck:GetChecked()
|
|
end
|
|
|
|
function PawnUIFrame_ShowSocketingAdvisorCheck_OnClick()
|
|
PawnCommon.ShowSocketingAdvisor = PawnUIFrame_ShowSocketingAdvisorCheck:GetChecked()
|
|
end
|
|
|
|
function PawnUIFrame_ShowItemLevelUpgradesCheck_OnClick()
|
|
PawnCommon.ShowItemLevelUpgrades = PawnUIFrame_ShowItemLevelUpgradesCheck:GetChecked()
|
|
end
|
|
|
|
function PawnUIFrame_IgnoreGemsWhileLevelingCheck_OnClick()
|
|
PawnCommon.IgnoreGemsWhileLeveling = PawnUIFrame_IgnoreGemsWhileLevelingCheck:GetChecked()
|
|
PawnClearCache()
|
|
PawnInvalidateBestItems()
|
|
PawnResetTooltips()
|
|
end
|
|
|
|
function PawnUIFrame_ResetUpgradesButton_OnClick()
|
|
PawnClearCache()
|
|
PawnInvalidateBestItems()
|
|
PawnResetTooltips()
|
|
PawnClearBestItemLevelData()
|
|
end
|
|
|
|
function PawnUIFrame_DebugCheck_OnClick()
|
|
PawnCommon.Debug = PawnUIFrame_DebugCheck:GetChecked()
|
|
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
|
|
if not VgerCore.IsMainline then
|
|
-- WoW Classic doesn't use the Mr. Robot scales, so hide that logo and information.
|
|
PawnUIFrame_MrRobotLogo:Hide()
|
|
PawnUIFrame_MrRobotLabel:SetPoint("TOPLEFT", 25, -210)
|
|
PawnUIFrame_MrRobotLabel:SetText("Special thanks to HawsJon for collecting the stat weights used in the starter scales.")
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Socketing Advisor
|
|
------------------------------------------------------------
|
|
|
|
function PawnUI_OnSocketUpdate()
|
|
if PawnSocketingTooltip then PawnSocketingTooltip:Hide() end
|
|
if not PawnCommon.ShowSocketingAdvisor then return end
|
|
|
|
-- Find out what item it is.
|
|
local _, ItemLink = ItemSocketingDescription:GetItem()
|
|
if strfind(ItemLink, "item:167555") then
|
|
-- Don't show an error message on Pocket-Sized Computation Device, which has three punch card sockets and no stats.
|
|
return
|
|
end
|
|
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
|
|
|
|
local ItemStats = Item.UnenchantedStats
|
|
local SocketCount = 0
|
|
+ (ItemStats.PrismaticSocket or 0)
|
|
+ (ItemStats.RedSocket or 0)
|
|
+ (ItemStats.YellowSocket or 0)
|
|
+ (ItemStats.BlueSocket or 0)
|
|
-- We intentionally ignore meta sockets, because meta gems should be selected for their non-stat effects.
|
|
-- If there are no supported gems in the item, don't add our advisor tooltip to the window.
|
|
if SocketCount == 0 then return end
|
|
|
|
-- Add the annotation lines to the tooltip.
|
|
CreateFrame("GameTooltip", "PawnSocketingTooltip", ItemSocketingFrame, "PawnUI_HintTooltip_PointsUp")
|
|
PawnSocketingTooltip:SetOwner(ItemSocketingFrame, "ANCHOR_NONE")
|
|
PawnSocketingTooltip:SetPoint("TOPLEFT", ItemSocketingFrame, "BOTTOMLEFT", 6, -6)
|
|
local ShouldIncludeSockets = (not PawnCommon.IgnoreGemsWhileLeveling) or (Item.Level ~= nil and Item.Level >= PawnMinimumItemLevelToConsiderGems)
|
|
PawnSocketingTooltip:SetText(PawnLocal.UI.SocketingAdvisorHeader, 1, 1, 1)
|
|
if not ShouldIncludeSockets then
|
|
PawnSocketingTooltip:AddLine(PawnLocal.UI.SocketingAdvisorIgnoreThisItem, VgerCore.Color.BlueR, VgerCore.Color.BlueG, VgerCore.Color.BlueB)
|
|
end
|
|
|
|
for _, Entry in pairs(Item.Values) do
|
|
local ScaleName = Entry[1]
|
|
if PawnIsScaleVisible(ScaleName) then
|
|
local Scale = PawnCommon.Scales[ScaleName]
|
|
local TextColor = VgerCore.Color.Blue
|
|
if Scale.Color and strlen(Scale.Color) == 6 then TextColor = "|cff" .. Scale.Color end
|
|
|
|
local _, _, SocketBonusValue = PawnGetItemValue(Item.UnenchantedStats, Item.Level, Item.UnenchantedSocketBonusStats, ScaleName, false, true)
|
|
local GemListString, IsVague
|
|
if SocketBonusValue and SocketBonusValue > 0 then
|
|
local ThisColorGemList
|
|
if ItemStats.PrismaticSocket then
|
|
ThisColorGemList = PawnGetGemListString(ScaleName, PawnOptions.AutoSelectScales, Item.Level, "Prismatic")
|
|
if ItemStats.PrismaticSocket > 1 then ThisColorGemList = ItemStats.PrismaticSocket .. " " .. ThisColorGemList end
|
|
if GemListString then GemListString = GemListString .. ", " .. ThisColorGemList else GemListString = ThisColorGemList end
|
|
end
|
|
if ItemStats.RedSocket then
|
|
ThisColorGemList = PawnGetGemListString(ScaleName, PawnOptions.AutoSelectScales, Item.Level, "Red")
|
|
if ItemStats.RedSocket > 1 then ThisColorGemList = ItemStats.RedSocket .. " " .. ThisColorGemList end
|
|
if GemListString then GemListString = GemListString .. ", " .. ThisColorGemList else GemListString = ThisColorGemList end
|
|
end
|
|
if ItemStats.YellowSocket then
|
|
ThisColorGemList = PawnGetGemListString(ScaleName, PawnOptions.AutoSelectScales, Item.Level, "Yellow")
|
|
if ItemStats.YellowSocket > 1 then ThisColorGemList = ItemStats.YellowSocket .. " " .. ThisColorGemList end
|
|
if GemListString then GemListString = GemListString .. ", " .. ThisColorGemList else GemListString = ThisColorGemList end
|
|
end
|
|
if ItemStats.BlueSocket then
|
|
ThisColorGemList = PawnGetGemListString(ScaleName, PawnOptions.AutoSelectScales, Item.Level, "Blue")
|
|
if ItemStats.BlueSocket > 1 then ThisColorGemList = ItemStats.BlueSocket .. " " .. ThisColorGemList end
|
|
if GemListString then GemListString = GemListString .. ", " .. ThisColorGemList else GemListString = ThisColorGemList end
|
|
end
|
|
else
|
|
GemListString, IsVague = PawnGetGemListString(ScaleName, PawnOptions.AutoSelectScales, Item.Level, "Prismatic")
|
|
if IsVague then GemListString = PawnLocal.GemListMany end
|
|
end
|
|
if GemListString then
|
|
if PawnOptions.AutoSelectScales then
|
|
-- Use a simplified list when Automatic mode is enabled, since we don't need to list multiple scales.
|
|
PawnSocketingTooltip:AddLine(GemListString, 1, 1, 1)
|
|
else
|
|
local TooltipText = TextColor .. PawnGetScaleLocalizedName(ScaleName) .. ": |r" .. GemListString
|
|
PawnSocketingTooltip:AddLine(TooltipText, 1, 1, 1)
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
-- Show our annotations tooltip.
|
|
PawnSocketingTooltip:Show()
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Loot Upgrade Advisor
|
|
------------------------------------------------------------
|
|
|
|
function PawnUI_LootUpgradeAdvisor_OnLoad(self)
|
|
self:SetFrameLevel(self:GetParent():GetFrameLevel() + 8)
|
|
|
|
self.arrow:SetSize(21, 53)
|
|
self.arrow.arrow = _G[self.arrow:GetName() .. "Arrow"]
|
|
self.arrow.glow = _G[self.arrow:GetName() .. "Glow"]
|
|
self.arrow.arrow:SetAllPoints(true)
|
|
self.arrow.glow:SetAllPoints(true)
|
|
self.arrow.arrow:SetTexCoord(0.78515625, 0.58789063, 0.99218750, 0.58789063, 0.78515625, 0.54687500, 0.99218750, 0.54687500)
|
|
self.arrow.glow:SetTexCoord(0.40625000, 0.82812500, 0.66015625, 0.82812500, 0.40625000, 0.77343750, 0.66015625, 0.77343750)
|
|
end
|
|
|
|
function PawnUI_GroupLootFrame_OnShow(self)
|
|
local Index = self:GetID()
|
|
local LootAdvisor = _G["PawnUI_LootUpgradeAdvisor" .. Index]
|
|
if not PawnCommon.ShowLootUpgradeAdvisor then LootAdvisor:Hide() return end
|
|
LootAdvisor.ItemLink = nil
|
|
|
|
-- What item are they rolling for?
|
|
local RollID = self.rollID
|
|
local ItemLink = GetLootRollItemLink(RollID)
|
|
LootAdvisor.ItemLink = ItemLink
|
|
if not ItemLink then LootAdvisor:Hide() return end
|
|
|
|
-- Is it an upgrade?
|
|
local IsUpgrade = false
|
|
if PawnCanItemHaveStats(ItemLink) then
|
|
local Item = PawnGetItemData(ItemLink)
|
|
if Item then
|
|
local UpgradeInfo = PawnIsItemAnUpgrade(Item)
|
|
if UpgradeInfo then
|
|
-- It's an upgrade! Decide how to display it.
|
|
local NumUpgrades = #UpgradeInfo
|
|
local ShowOldItems = (NumUpgrades == 1) -- If the item upgrades exactly one scale, show a detailed tooltip showing the item being replaced.
|
|
local ShowScaleNames = (NumUpgrades <= 3) -- If the item upgrades two or three scales, show a less detailed tooltip showing the upgrade percentages.
|
|
local UpgradeText
|
|
if ShowScaleNames then
|
|
UpgradeText = PawnLocal.LootUpgradeAdvisorHeader
|
|
local ThisUpgradeData, _
|
|
for _, ThisUpgradeData in pairs(UpgradeInfo) do
|
|
local ScaleName = ThisUpgradeData.ScaleName
|
|
if ScaleName then
|
|
local SetAnnotation = ""
|
|
if InvType == "INVTYPE_2HWEAPON" then
|
|
SetAnnotation = PawnLocal.TooltipUpgradeFor2H
|
|
elseif InvType == "INVTYPE_WEAPONMAINHAND" or InvType == "INVTYPE_WEAPON" or InvType == "INVTYPE_WEAPONOFFHAND" then
|
|
SetAnnotation = PawnLocal.TooltipUpgradeFor1H
|
|
end
|
|
local ThisText
|
|
if ThisUpgradeData.PercentUpgrade >= 100 then
|
|
ThisText = format(PawnLocal.TooltipBigUpgradeAnnotation, format("|n%s%s:", PawnGetScaleColor(ScaleName), ThisUpgradeData.LocalizedScaleName), SetAnnotation)
|
|
else
|
|
ThisText = format(PawnLocal.TooltipUpgradeAnnotation, format("|n%s%s:", PawnGetScaleColor(ScaleName), ThisUpgradeData.LocalizedScaleName), ThisUpgradeData.PercentUpgrade * 100, SetAnnotation)
|
|
end
|
|
if ShowOldItems and ThisUpgradeData.ExistingItemLink then
|
|
local ExistingItemName, _, Quality = GetItemInfo(ThisUpgradeData.ExistingItemLink)
|
|
if ExistingItemName then
|
|
-- It's possible (though rare) that the existing item isn't in the user's cache, so we can't get its quality color. In that case, don't display it in the tooltip.
|
|
local _, _, _, QualityColor = GetItemQualityColor(Quality)
|
|
ThisText = format(PawnLocal.TooltipVersusLine, ThisText, QualityColor, ExistingItemName)
|
|
end
|
|
end
|
|
UpgradeText = UpgradeText .. ThisText
|
|
end
|
|
end
|
|
else
|
|
-- If the item upgrades more than three scales, show a generic tooltip.
|
|
UpgradeText = format(PawnLocal.LootUpgradeAdvisorHeaderMany, NumUpgrades)
|
|
end
|
|
|
|
local ItemLevelIncrease = PawnIsItemAnItemLevelUpgrade(Item)
|
|
if ItemLevelIncrease then
|
|
UpgradeText = UpgradeText .. "|n" .. format(PawnLocal.TooltipRelicUpgradeAnnotation, PawnLocal.ItemLevelTooltipLine .. ":", ItemLevelIncrease, "")
|
|
end
|
|
|
|
LootAdvisor.text:SetText(UpgradeText)
|
|
IsUpgrade = true
|
|
end
|
|
end
|
|
elseif PawnCanItemBeArtifactUpgrade(ItemLink) then
|
|
local UpgradeInfo = PawnGetRelicUpgradeInfo(ItemLink)
|
|
if UpgradeInfo then
|
|
local ArtifactName, ArtifactUpgradeInfo, UpgradeText
|
|
for ArtifactName, ArtifactUpgradeInfo in pairs(UpgradeInfo) do
|
|
if UpgradeText then UpgradeText = UpgradeText .. "\n" else UpgradeText = "" end
|
|
UpgradeText = UpgradeText .. format(PawnLocal.TooltipRelicUpgradeAnnotation, tostring(ArtifactName) .. ":", ArtifactUpgradeInfo.ItemLevelIncrease, "")
|
|
end
|
|
LootAdvisor.text:SetText(UpgradeText)
|
|
IsUpgrade = true
|
|
end
|
|
end
|
|
|
|
if IsUpgrade then
|
|
LootAdvisor:SetHeight(LootAdvisor.text:GetHeight() + 32)
|
|
LootAdvisor:Show()
|
|
else
|
|
LootAdvisor:Hide()
|
|
end
|
|
|
|
end
|
|
|
|
function PawnUI_LootUpgradeAdvisor_OnClick(self)
|
|
if self.ItemLink then PawnUI_SetCompareItemAndShow(2, self.ItemLink) end
|
|
end
|
|
|
|
function PawnUI_LootHistoryFrame_UpdateItemFrame(self, ItemFrame, ...)
|
|
-- Figure out what item we're rolling for. It's possible that we won't have an item link or item data yet; if that's true
|
|
-- then the loot roll window should get an update when the item information is available and this should thus be
|
|
-- called again later.
|
|
local RollID, ItemLink = C_LootHistory.GetItem(ItemFrame.itemIdx)
|
|
if ItemLink == nil then return end
|
|
|
|
-- Is this item an upgrade?
|
|
local IsUpgrade = PawnCommon.ShowLootUpgradeAdvisor and PawnShouldItemLinkHaveUpgradeArrow(ItemLink, false, true)
|
|
if IsUpgrade then
|
|
-- If the arrow hasn't already been created, create it.
|
|
if not ItemFrame.PawnLootAdvisorArrow then
|
|
ItemFrame.PawnLootAdvisorArrow = ItemFrame:CreateTexture(nil, "OVERLAY", "PawnUI_LootAdvisorTexture")
|
|
ItemFrame.PawnLootAdvisorArrow:SetTexCoord(0, .5, 0, .5)
|
|
end
|
|
ItemFrame.PawnLootAdvisorArrow:Show()
|
|
else
|
|
-- Hide the upgrade arrow if it's already there from a previous loot item.
|
|
if ItemFrame.PawnLootAdvisorArrow then
|
|
ItemFrame.PawnLootAdvisorArrow:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
function PawnUI_LootWonAlertFrame_SetUp(self, ItemLink, ...)
|
|
-- Hide the upgrade arrow if it's already there from a previous loot item.
|
|
if self.PawnLootAdvisorArrow then
|
|
self.PawnLootAdvisorArrow:Hide()
|
|
end
|
|
|
|
-- Is this item an upgrade?
|
|
if ItemLink == nil then return end
|
|
local IsUpgrade = PawnCommon.ShowLootUpgradeAdvisor and PawnShouldItemLinkHaveUpgradeArrow(ItemLink, false, true)
|
|
|
|
if IsUpgrade then
|
|
-- If the arrow hasn't already been created, create it.
|
|
if not self.PawnLootAdvisorArrow then
|
|
self.PawnLootAdvisorArrow = self:CreateTexture(nil, "OVERLAY", "PawnUI_LootWonAdvisorTexture")
|
|
self.PawnLootAdvisorArrow:SetTexCoord(0, .5, 0, .5)
|
|
end
|
|
self.PawnLootAdvisorArrow:Show()
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Quest Advisor
|
|
------------------------------------------------------------
|
|
|
|
-- When quest info is displayed, call other quest info hook functions as appropriate.
|
|
function PawnUI_OnQuestInfo_Display(template)
|
|
if not PawnCommon or not PawnPlayerFullName then return end
|
|
VgerCore.Assert(QuestInfoFrame, "QuestInfoFrame should exist by the time that PawnUI_OnQuestInfo_Display is called.")
|
|
|
|
-- There are a variety of QUEST_TEMPLATE_* tables in QuestInfo.lua. Instead of hooking QuestInfo_ShowRewards directly,
|
|
-- wait until after QuestInfo_Display is finished, and then call our QuestInfo_ShowRewards hook if QuestInfo_ShowRewards
|
|
-- was ever called. (I don't remember why...)
|
|
local i = 1
|
|
while template.elements[i] do
|
|
if template.elements[i] == QuestInfo_ShowRewards then PawnUI_OnQuestInfo_ShowRewards() return end
|
|
i = i + 3
|
|
end
|
|
end
|
|
|
|
-- When quest info is shown, annotate item rewards with upgrade and vendor icons.
|
|
function PawnUI_OnQuestInfo_ShowRewards()
|
|
-- Before doing anything else, clear out our state from last time.
|
|
local i
|
|
for i = 1, MAX_NUM_ITEMS do
|
|
local Overlay = PawnQuestAdvisorOverlays[i]
|
|
if Overlay then Overlay:Hide() end
|
|
end
|
|
|
|
if not PawnCommon.ShowQuestUpgradeAdvisor then return end
|
|
|
|
-- Now, get information about this quest.
|
|
local QuestID
|
|
if C_QuestLog.GetSelectedQuest then QuestID = C_QuestLog.GetSelectedQuest() end
|
|
local IsInMap = WorldMapFrame:IsShown()
|
|
local StaticRewards, RewardChoices
|
|
local SetQuestRewardFunctionName, GetRewardInfoFunction, GetChoiceInfoFunction
|
|
if QuestInfoFrame.questLog then
|
|
StaticRewards = GetNumQuestLogRewards()
|
|
-- Ignore this warning: it's incorrect; GetNumQuestLogChoices does indeed take two parameters.
|
|
---@diagnostic disable-next-line: redundant-parameter
|
|
RewardChoices = GetNumQuestLogChoices(QuestID, false)
|
|
SetQuestRewardFunctionName = "SetQuestLogItem"
|
|
GetRewardInfoFunction = GetQuestLogRewardInfo
|
|
GetChoiceInfoFunction = GetQuestLogChoiceInfo
|
|
else
|
|
StaticRewards = GetNumQuestRewards()
|
|
RewardChoices = GetNumQuestChoices()
|
|
SetQuestRewardFunctionName = "SetQuestItem"
|
|
GetRewardInfoFunction = function(Index) return GetQuestItemInfo("reward", Index) end
|
|
GetChoiceInfoFunction = function(Index) return GetQuestItemInfo("choice", Index) end
|
|
end
|
|
-- BUG: In 7.0, sometimes when turning in a quest (the "else" case above), these numbers are still 0 by the time that this is called. Calling GetNumQuest*() too early apparently prevents the reward from getting shown at all...?
|
|
if StaticRewards + RewardChoices == 0 then return end
|
|
if not QuestInfo_GetRewardButton(QuestInfoFrame.rewardsFrame, 1) then
|
|
VgerCore.Fail("Failed to annotate quest info because we couldn't find the reward button. (Is a quest log mod interfering with Pawn?)")
|
|
return
|
|
end
|
|
|
|
-- Gather up all of the rewards for this quest.
|
|
local QuestRewards = { }
|
|
local Tooltip = _G[PawnPrivateTooltipName]
|
|
for i = 1, StaticRewards do
|
|
-- BUG: In 9.0, the "get the item link for a quest reward" functions return incorrect data for some Shadowlands quests, so
|
|
-- we work around this by calling the "show this quest reward on a tooltip" method and then getting the item link from THAT, which is correct.
|
|
Tooltip[SetQuestRewardFunctionName](Tooltip, "reward", i)
|
|
local _, ItemLink = Tooltip:GetItem()
|
|
local Item = PawnGetItemData(ItemLink)
|
|
|
|
if Item then
|
|
local _, _, _, _, Usable = GetRewardInfoFunction(i)
|
|
tinsert(QuestRewards, { ["Item"] = Item, ["RewardType"] = "reward", ["Usable"] = Usable, ["Index"] = i + RewardChoices })
|
|
else
|
|
--VgerCore.Fail("Pawn can't display upgrade information because the server hasn't given us item stats for fixed rewards yet.")
|
|
-- TODO: Queue this up and retry these calculations later...
|
|
-- Important: Don't bail out if we didn't get stats for a static reward! You could, for example, get an item and a deprecated artifact power
|
|
-- item with no stats, and we want to make sure that the item that DOES have stats still shows up.
|
|
end
|
|
end
|
|
for i = 1, RewardChoices do
|
|
Tooltip[SetQuestRewardFunctionName](Tooltip, "choice", i)
|
|
local _, ItemLink = Tooltip:GetItem()
|
|
local Item = PawnGetItemData(ItemLink)
|
|
|
|
if Item then
|
|
local _, _, _, _, Usable = GetChoiceInfoFunction(i)
|
|
tinsert(QuestRewards, { ["Item"] = Item, ["RewardType"] = "choice", ["Usable"] = Usable, ["Index"] = i })
|
|
else
|
|
--VgerCore.Fail("Pawn can't display upgrade information because the server hasn't given us item stats for reward choices yet.")
|
|
-- TODO: Queue this up and retry these calculations later...
|
|
return
|
|
end
|
|
end
|
|
|
|
-- Find the ones that are interesting (and should get an icon).
|
|
PawnFindInterestingItems(QuestRewards)
|
|
|
|
local Reward
|
|
for _, Reward in pairs(QuestRewards) do
|
|
local ItemButton = QuestInfo_GetRewardButton(QuestInfoFrame.rewardsFrame, Reward.Index)
|
|
local TextureName
|
|
if ItemButton then
|
|
local Overlay = PawnQuestAdvisorOverlays[Reward.Index]
|
|
if not Overlay then
|
|
if IsInMap then
|
|
Overlay = ItemButton:CreateTexture(nil, "OVERLAY", "PawnUI_QuestAdvisorTexture_Map")
|
|
else
|
|
Overlay = ItemButton:CreateTexture(nil, "OVERLAY", "PawnUI_QuestAdvisorTexture")
|
|
end
|
|
-- Mod compatibility: ElvUI
|
|
Overlay:SetDrawLayer("OVERLAY", 7)
|
|
|
|
PawnQuestAdvisorOverlays[Reward.Index] = Overlay
|
|
end
|
|
if Reward.Result == "upgrade" then
|
|
Overlay:SetTexture("Interface\\AddOns\\Pawn\\Textures\\UpgradeArrowBig")
|
|
Overlay:SetTexCoord(0, .5, 0, .5)
|
|
Overlay:Show()
|
|
elseif Reward.Result == "vendor" then
|
|
Overlay:SetTexture("Interface\\AddOns\\Pawn\\Textures\\UpgradeArrowBig")
|
|
Overlay:SetTexCoord(0, .5, .5, 1)
|
|
Overlay:Show()
|
|
elseif Reward.Result == "trinket" then -- trinkets or relics
|
|
Overlay:SetTexture("Interface\\AddOns\\Pawn\\Textures\\UpgradeArrowBig")
|
|
Overlay:SetTexCoord(.5, 1, .5, 1)
|
|
Overlay:Show()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------
|
|
-- Interface Options
|
|
------------------------------------------------------------
|
|
|
|
function PawnInterfaceOptionsFrame_OnLoad()
|
|
-- Register the Interface Options page.
|
|
PawnInterfaceOptionsFrame.name = "Pawn"
|
|
InterfaceOptions_AddCategory(PawnInterfaceOptionsFrame)
|
|
-- 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
|
|
------------------------------------------------------------
|
|
|
|
-- Causes a Button to respond to both left and right clicks.
|
|
-- Usage: <OnLoad function="PawnUIRegisterRightClickOnLoad" />
|
|
function PawnUIRegisterRightClickOnLoad(self)
|
|
self:RegisterForClicks("LeftButtonUp", "RightButtonUp")
|
|
end
|
|
|
|
-- Create the tab strip under the Pawn UI.
|
|
-- We need to do this in Lua because there's no tab template that exists in every version of the game.
|
|
function PawnUICreateTabs()
|
|
local TabCount = #PawnUITabList
|
|
local TabTemplate
|
|
if VgerCore.IsDragonflight then
|
|
TabTemplate = "PanelTabButtonTemplate"
|
|
else
|
|
TabTemplate = "CharacterFrameTabButtonTemplate"
|
|
end
|
|
|
|
local LastTab
|
|
for i = 1, TabCount do
|
|
local ThisTab = CreateFrame("Button", "PawnUIFrameTab" .. i, PawnUIFrame, TabTemplate, i)
|
|
ThisTab:SetText(PawnUITabLabels[i])
|
|
if i == 1 then
|
|
ThisTab:SetPoint("LEFT", PawnUIFrame, "BOTTOMLEFT", 196, -8)
|
|
else
|
|
ThisTab:SetPoint("LEFT", LastTab, "RIGHT", -16, 0)
|
|
end
|
|
ThisTab:SetScript("OnClick", PawnUITab_OnClick)
|
|
LastTab = ThisTab
|
|
end
|
|
|
|
PanelTemplates_SetNumTabs(PawnUIFrame, TabCount)
|
|
end
|
|
|
|
function PawnUITab_OnClick(self)
|
|
local TabNumber = self:GetID()
|
|
PlaySound(SOUNDKIT.IG_CHARACTER_INFO_TAB)
|
|
PawnUISwitchToTab(PawnUITabList[TabNumber])
|
|
end
|
|
|
|
-- 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
|
|
|
|
-- 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.")
|
|
local ReloadingSameTab = (TabNumber == PawnUICurrentTabNumber)
|
|
PawnUICurrentTabNumber = TabNumber
|
|
|
|
-- Show/hide the scale selector as appropriate.
|
|
-- (This also gets called when turning Automatic mode on or off, so we need to still re-run this even
|
|
-- if the tab doesn't change.)
|
|
if PawnUIFrameNeedsScaleSelector[PawnUICurrentTabNumber] then
|
|
if PawnOptions.AutoSelectScales then
|
|
PawnUIScaleSelectorAuto:Show()
|
|
PawnUIScaleSelector:Hide()
|
|
else
|
|
PawnUIScaleSelector:Show()
|
|
PawnUIScaleSelectorAuto:Hide()
|
|
end
|
|
else
|
|
PawnUIScaleSelector:Hide()
|
|
PawnUIScaleSelectorAuto:Hide()
|
|
end
|
|
|
|
-- Then, update the header text.
|
|
PawnUIUpdateHeader()
|
|
|
|
-- If we're already on that tab, we don't need to do anything else.
|
|
if ReloadingSameTab then return end
|
|
|
|
-- Hide popup UI.
|
|
PawnUIStringDialogSingleLine:Hide()
|
|
PawnUIStringDialogMultiLine:Hide()
|
|
ColorPickerFrame:Hide()
|
|
|
|
-- Then, update the tabstrip itself.
|
|
PanelTemplates_SetTab(PawnUIFrame, TabNumber)
|
|
end
|
|
|
|
function PawnUIUpdateHeader()
|
|
if not PawnUIHeaders[PawnUICurrentTabNumber] then return end
|
|
local ColoredName
|
|
if PawnUICurrentScale and PawnUICurrentScale ~= PawnLocal.NoScale then
|
|
ColoredName = PawnGetScaleColor(PawnUICurrentScale) .. PawnGetScaleLocalizedName(PawnUICurrentScale) .. "|r"
|
|
else
|
|
ColoredName = PawnLocal.NoScale
|
|
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(SOUNDKIT.IG_CHARACTER_INFO_TAB)
|
|
PawnUISwitchToTab(Tab)
|
|
else
|
|
if Toggle then
|
|
PawnUIShow()
|
|
else
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
|
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 VgerCore.IsClassic then
|
|
-- WoW Classic Era doesn't have gems.
|
|
PawnUIFrameTab4:Hide()
|
|
PawnUIFrame_IgnoreGemsWhileLevelingCheck:Hide()
|
|
PawnUIFrame_ShowSocketingAdvisorCheck:Hide()
|
|
end
|
|
if not VgerCore.HasSpecs then
|
|
PawnUIFrame_ShowSpecIconsCheck:Hide()
|
|
end
|
|
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(PawnUICompareTabPage)
|
|
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 self.GetText and self:GetText() then
|
|
Label = self:GetText()
|
|
end
|
|
if Label then
|
|
GameTooltip:ClearLines()
|
|
GameTooltip:SetOwner(self, "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, IsMultiLine)
|
|
PawnUIGetStringCore(Prompt, DefaultValue, true, OKCallbackFunction, CancelCallbackFunction, IsMultiLine)
|
|
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, IsMultiLine)
|
|
PawnUIGetStringCore(Prompt, Value, false, CallbackFunction, nil, IsMultiLine)
|
|
PawnUIStringDialog.TextBox:HighlightText()
|
|
end
|
|
|
|
-- Core function called by PawnUIGetString.
|
|
function PawnUIGetStringCore(Prompt, DefaultValue, Cancelable, OKCallbackFunction, CancelCallbackFunction, IsMultiLine)
|
|
if PawnUIStringDialog and PawnUIStringDialog:IsVisible() then
|
|
PawnUIStringDialog_CancelButton_OnClick()
|
|
end
|
|
if IsMultiLine then
|
|
PawnUIStringDialog = PawnUIStringDialogMultiLine
|
|
else
|
|
PawnUIStringDialog = PawnUIStringDialogSingleLine
|
|
end
|
|
|
|
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(OKAY)
|
|
PawnUIStringDialog.CancelButton:SetText(CANCEL)
|
|
else
|
|
PawnUIStringDialog.OKButton:Hide()
|
|
PawnUIStringDialog.CancelButton:SetText(CLOSE)
|
|
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 or not PawnUIStringDialog:IsVisible() then return end
|
|
PawnUIStringDialog_CancelButton_OnClick()
|
|
end
|
|
|
|
function PawnUIStringDialog_OKButton_OnClick()
|
|
if not PawnUIStringDialog.OKButton:IsVisible() or not PawnUIStringDialog.OKButton:IsEnabled() then return end
|
|
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
|
|
|
|
|
|
------------------------------------------------------------
|
|
|
|
-- Initialize the quest advisor.
|
|
hooksecurefunc("QuestInfo_Display", PawnUI_OnQuestInfo_Display)
|
|
|