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.

2723 lines
103 KiB

5 years ago
-- 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.
5 years ago
-- 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
3 years ago
local PawnUIIsShowingNoneWarning = false
5 years ago
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"
------------------------------------------------------------
3 years ago
local PawnUIScaleSelectorNoneWarningHeight = 80 -- the "no scales selected" warning is this tall
5 years ago
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
5 years ago
-- 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)
4 years ago
-- 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")
5 years ago
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)
5 years ago
-- 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()
5 years ago
-- 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.
3 years ago
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
5 years ago
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
3 years ago
PawnUIScaleSelectorScrollContent:SetHeight(PawnUIScaleLineHeight + PawnUIScaleLineHeight * PawnUITotalScaleLines + PawnUIScaleSelectorPaddingBottom)
5 years ago
-- 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()
5 years ago
-- 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")
3 years ago
Line:SetPoint("TOPLEFT", PawnUIScaleSelectorScrollContent, "TOPLEFT", 0, -PawnUIScaleLineHeight * (PawnUITotalScaleLines - 1) - (PawnUIIsShowingNoneWarning and PawnUIScaleSelectorNoneWarningHeight or 0))
5 years ago
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()
5 years ago
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
5 years ago
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
5 years ago
-- 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
5 years ago
-- 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
5 years ago
-- 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
5 years ago
VgerCore.Fail("Unexpected PawnImportScaleResult value: " .. tostring(Status))
end
function PawnUIFrame_RenameScale_OnOK(NewScaleName)
-- Did they change anything?
if NewScaleName == PawnUICurrentScale then return end
5 years ago
-- 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
5 years ago
-- 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
5 years ago
-- 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
5 years ago
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
5 years ago
-- 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)
5 years ago
-- 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
5 years ago
-- After the user scrolled, we need to adjust their selection.
PawnUIFrame_StatsList_MoveHighlight()
5 years ago
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))
5 years ago
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)
5 years ago
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
5 years ago
-- 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
5 years ago
-- 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
5 years ago
local Offset = FauxScrollFrame_GetOffset(PawnUIFrame_StatsList)
local Index = i + Offset
5 years ago
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
5 years ago
-- 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
5 years ago
-- Show, move, or hide the highlight as appropriate.
PawnUIFrame_StatsList_MoveHighlight()
5 years ago
-- 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
5 years ago
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
5 years ago
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
5 years ago
local NewString = gsub(PawnUIFrame_StatValueBox:GetText(), ",", ".")
local NewValue = tonumber(NewString)
if NewValue == 0 then NewValue = nil end
5 years ago
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
5 years ago
-- 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
5 years ago
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
5 years ago
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
5 years ago
-- 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
5 years ago
-- Items that are not equippable cannot be placed in the Compare slots.
if ItemLink and SlotID1 == nil and SlotID2 == nil then return end
5 years ago
-- Save the item data locally, in case the item is later removed from the main Pawn item cache.
PawnUIComparisonItems[Index] = Item
5 years ago
-- 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)
5 years ago
-- 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
5 years ago
end
5 years ago
-- 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
5 years ago
-- Finally, either compare the two items, or remove the current comparison, whichever is appropriate.
PawnUI_CompareItems()
5 years ago
-- 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()
5 years ago
-- If the Pawn Compare UI is not visible, show it.
PawnUIShowTab(PawnUICompareTabPage)
end
5 years ago
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
5 years ago
-- 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)
5 years ago
-- 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
5 years ago
-- 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]
5 years ago
-- Is this a stat header, or an actual stat?
if StatName and StatName ~= "MetaSocketEffect" then
5 years ago
-- 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.
3 years ago
if not IsAutomatedRefresh and (VgerCore.IsClassic or VgerCore.IsBurningCrusade or VgerCore.IsWrath) then
5 years ago
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)
5 years ago
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
5 years ago
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
5 years ago
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)
5 years ago
-- Are they shift-clicking it to insert the item into chat?
if IsModifiedClick("CHATLINK") then
PawnUILinkItemInChat(PawnUIComparisonItems[Index])
return
end
5 years ago
-- 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
5 years ago
-- 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()
5 years ago
-- Are they shift-clicking it to insert the item into chat?
if IsModifiedClick("CHATLINK") then
PawnUILinkItemInChat(PawnUIShortcutItems[ShortcutIndex])
return
end
5 years ago
-- 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)
5 years ago
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
5 years ago
-- 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)
3 years ago
if not VgerCore.IsClassic and not VgerCore.IsMainline then
-- Burning Crusade Classic and Wrath Classic: Divide by color
5 years ago
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)
5 years ago
-- 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)
5 years ago
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)
5 years ago
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
5 years ago
PawnUIFrame_IgnoreGemsWhileLevelingCheck:SetChecked(PawnCommon.IgnoreGemsWhileLeveling)
PawnUIFrame_UpgradeTrackingList_UpdateSelection()
-- Advisor options
3 years ago
if not VgerCore.IsMainline then
5 years ago
-- 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];
3 years ago
if BagFrame:IsShown() then
if BagFrame.UpdateItemUpgradeIcons then
-- Dragonflight onward
BagFrame:UpdateItemUpgradeIcons()
else
-- Legion through Shadowlands
ContainerFrame_UpdateItemUpgradeIcons(BagFrame)
end
end
5 years ago
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
5 years ago
PawnUIFrame_AboutVersionLabel:SetText(format(PawnUIFrame_AboutVersionLabel_Text, Version))
end
3 years ago
if not VgerCore.IsMainline then
5 years ago
-- 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()
4 years ago
if PawnSocketingTooltip then PawnSocketingTooltip:Hide() end
5 years ago
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
4 years ago
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.
4 years ago
-- If there are no supported gems in the item, don't add our advisor tooltip to the window.
if SocketCount == 0 then return end
5 years ago
-- 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
5 years ago
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
4 years ago
3 years ago
local _, _, SocketBonusValue = PawnGetItemValue(Item.UnenchantedStats, Item.Level, Item.UnenchantedSocketBonusStats, ScaleName, false, true)
4 years ago
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
5 years ago
end
4 years ago
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)
5 years ago
end
end
end
end
5 years ago
-- Show our annotations tooltip.
PawnSocketingTooltip:Show()
end
------------------------------------------------------------
-- Loot Upgrade Advisor
------------------------------------------------------------
function PawnUI_LootUpgradeAdvisor_OnLoad(self)
self:SetFrameLevel(self:GetParent():GetFrameLevel() + 8)
5 years ago
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
5 years ago
-- 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
5 years ago
-- 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
5 years ago
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
5 years ago
-- Is this item an upgrade?
local IsUpgrade = PawnCommon.ShowLootUpgradeAdvisor and PawnShouldItemLinkHaveUpgradeArrow(ItemLink, false, true)
5 years ago
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)
5 years ago
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.")
5 years ago
-- 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...)
5 years ago
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
5 years ago
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
5 years ago
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
5 years ago
-- 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
5 years ago
-- Find the ones that are interesting (and should get an icon).
PawnFindInterestingItems(QuestRewards)
5 years ago
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
5 years ago
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
3 years ago
-- 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
5 years ago
-- 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
5 years ago
-- 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
5 years ago
-- 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
5 years ago
-- Hide popup UI.
PawnUIStringDialogSingleLine:Hide()
PawnUIStringDialogMultiLine:Hide()
ColorPickerFrame:Hide()
5 years ago
-- 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)