feat: track quest items in questItemBar

This commit is contained in:
Salikh Gurgenidze
2026-01-22 03:41:18 +04:00
parent 673910cf77
commit e810e40a67
5 changed files with 213 additions and 15 deletions
+43
View File
@@ -692,6 +692,49 @@ function Utils:IsBindOnEquip(bagID, slotID, itemLink)
return false return false
end end
-- Check if an item is "Unique" by scanning its tooltip
function Utils:IsUniqueItem(bagID, slotID, itemLink)
if not bagID or not slotID then return false end
local tooltip = GetScanTooltip()
if not tooltip then return false end
tooltip:ClearLines()
-- Try SetBagItem first (works for regular bags and bank when open)
tooltip:SetBagItem(bagID, slotID)
local numLines = tooltip:NumLines()
-- If no lines and we have itemLink, try SetHyperlink with itemString as fallback
if (not numLines or numLines == 0) and itemLink then
local _, _, itemString = string.find(itemLink, "(item:%d+:%d+:%d+:%d+)")
if itemString then
tooltip:ClearLines()
tooltip:SetHyperlink(itemString)
numLines = tooltip:NumLines()
end
end
if not numLines or numLines == 0 then return false end
-- Check tooltip lines for "Unique" (but not "Unique-Equipped")
for i = 1, numLines do
local line = getglobal("GudaBagScanTooltipTextLeft" .. i)
if line then
local text = line:GetText()
if text then
local textLower = string.lower(text)
-- Match "unique" but not "unique-equipped"
if textLower == "unique" or string.find(textLower, "^unique$") or string.find(textLower, "^unique%s") then
return true
end
end
end
end
return false
end
-- Check if an item is equipment (armor, weapon, or other equippable) -- Check if an item is equipment (armor, weapon, or other equippable)
-- Returns: true if item is equipment, false otherwise -- Returns: true if item is equipment, false otherwise
function Utils:IsEquipment(itemLink) function Utils:IsEquipment(itemLink)
+13 -5
View File
@@ -304,11 +304,15 @@ function Guda_ItemButton_OnLoad(self)
local itemID = addon.Modules.Utils:ExtractItemID(link) local itemID = addon.Modules.Utils:ExtractItemID(link)
if itemID then if itemID then
local isQuest = IsQuestItem(this.bagID, this.slotID, this.isBank) local isQuest = IsQuestItem(this.bagID, this.slotID, this.isBank)
if isQuest and addon.Modules.QuestItemBar and addon.Modules.QuestItemBar.PinItem then local isUnique = addon.Modules.Utils:IsUniqueItem(this.bagID, this.slotID, link)
-- Only pin to QuestItemBar if it's a unique quest item
if isQuest and isUnique and addon.Modules.QuestItemBar and addon.Modules.QuestItemBar.PinItem then
addon.Modules.QuestItemBar:PinItem(itemID) addon.Modules.QuestItemBar:PinItem(itemID)
return return
end end
-- Track non-unique quest items and regular items in TrackedItemBar
local trackedItems = addon.Modules.DB:GetSetting("trackedItems") or {} local trackedItems = addon.Modules.DB:GetSetting("trackedItems") or {}
if trackedItems[itemID] then if trackedItems[itemID] then
trackedItems[itemID] = nil trackedItems[itemID] = nil
@@ -316,7 +320,7 @@ function Guda_ItemButton_OnLoad(self)
trackedItems[itemID] = true trackedItems[itemID] = true
end end
addon.Modules.DB:SetSetting("trackedItems", trackedItems) addon.Modules.DB:SetSetting("trackedItems", trackedItems)
-- Update all item buttons -- Update all item buttons
if Guda.Modules.BagFrame and Guda.Modules.BagFrame.Update then if Guda.Modules.BagFrame and Guda.Modules.BagFrame.Update then
Guda.Modules.BagFrame:Update() Guda.Modules.BagFrame:Update()
@@ -929,8 +933,12 @@ function Guda_ItemButton_SetItem(self, bagID, slotID, itemData, isBank, otherCha
-- Search filtering and junk opacity -- Search filtering and junk opacity
if matchesFilter then if matchesFilter then
if isJunk then if isJunk then
-- Junk items: 60% opacity -- Junk items: configurable opacity (default 60%)
self:SetAlpha(0.6) local junkOpacity = 0.6
if addon.Modules.DB and addon.Modules.DB.GetSetting then
junkOpacity = addon.Modules.DB:GetSetting("junkOpacity") or 0.6
end
self:SetAlpha(junkOpacity)
else else
-- Normal items: full opacity (1.0) -- Normal items: full opacity (1.0)
self:SetAlpha(1.0) self:SetAlpha(1.0)
+53 -5
View File
@@ -36,11 +36,7 @@ function Guda_SettingsPopup_OnLoad(self)
"Left Click on an item in the bar to use it.\n" .. "Left Click on an item in the bar to use it.\n" ..
"Alt + Left Click on an item in the bar to untrack it.\n\n" .. "Alt + Left Click on an item in the bar to untrack it.\n\n" ..
"|cffffd100Moving Bars:|r\n" .. "|cffffd100Moving Bars:|r\n" ..
"Shift + Left Click and drag any item on the Quest Item Bar or Tracked Item Bar to move the bar.\n" .. "Shift + Left Click and drag any item on the Quest Item Bar or Tracked Item Bar to move the bar.\n"
"You can also drag the bar background if it's visible.\n\n" ..
"|cffffd100Quest Item Bar:|r\n" ..
"Alt + Left Click on a quest item in your bags to pin it.\n" ..
"Alt + Right Click on an item in the bar to unpin it."
instructions:SetText(text) instructions:SetText(text)
end end
@@ -132,6 +128,7 @@ function Guda_SettingsPopup_OnShow(self)
local bankViewType = Guda.Modules.DB:GetSetting("bankViewType") or "single" local bankViewType = Guda.Modules.DB:GetSetting("bankViewType") or "single"
local questBarSize = Guda.Modules.DB:GetSetting("questBarSize") or 36 local questBarSize = Guda.Modules.DB:GetSetting("questBarSize") or 36
local trackedBarSize = Guda.Modules.DB:GetSetting("trackedBarSize") or 36 local trackedBarSize = Guda.Modules.DB:GetSetting("trackedBarSize") or 36
local junkOpacity = Guda.Modules.DB:GetSetting("junkOpacity") or 0.6
-- Update sliders and checkboxes -- Update sliders and checkboxes
local bagSlider = getglobal("Guda_SettingsPopup_BagColumnsSlider") local bagSlider = getglobal("Guda_SettingsPopup_BagColumnsSlider")
@@ -142,6 +139,7 @@ function Guda_SettingsPopup_OnShow(self)
local bgTransparencySlider = getglobal("Guda_SettingsPopup_BgTransparencySlider") local bgTransparencySlider = getglobal("Guda_SettingsPopup_BgTransparencySlider")
local questBarSizeSlider = getglobal("Guda_SettingsPopup_QuestBarSizeSlider") local questBarSizeSlider = getglobal("Guda_SettingsPopup_QuestBarSizeSlider")
local trackedBarSizeSlider = getglobal("Guda_SettingsPopup_TrackedBarSizeSlider") local trackedBarSizeSlider = getglobal("Guda_SettingsPopup_TrackedBarSizeSlider")
local junkOpacitySlider = getglobal("Guda_SettingsPopup_JunkOpacitySlider")
local lockCheckbox = getglobal("Guda_SettingsPopup_LockBagsCheckbox") local lockCheckbox = getglobal("Guda_SettingsPopup_LockBagsCheckbox")
local hideBordersCheckbox = getglobal("Guda_SettingsPopup_HideBordersCheckbox") local hideBordersCheckbox = getglobal("Guda_SettingsPopup_HideBordersCheckbox")
local qualityBorderEquipmentCheckbox = getglobal("Guda_SettingsPopup_QualityBorderEquipmentCheckbox") local qualityBorderEquipmentCheckbox = getglobal("Guda_SettingsPopup_QualityBorderEquipmentCheckbox")
@@ -191,6 +189,10 @@ function Guda_SettingsPopup_OnShow(self)
trackedBarSizeSlider:SetValue(trackedBarSize) trackedBarSizeSlider:SetValue(trackedBarSize)
end end
if junkOpacitySlider then
junkOpacitySlider:SetValue(junkOpacity)
end
if lockCheckbox then if lockCheckbox then
lockCheckbox:SetChecked(lockBags and 1 or 0) lockCheckbox:SetChecked(lockBags and 1 or 0)
end end
@@ -1046,6 +1048,52 @@ function Guda_SettingsPopup_ShowTooltipCountsCheckbox_OnClick(self)
end end
end end
-- Junk Opacity Slider OnLoad
function Guda_SettingsPopup_JunkOpacitySlider_OnLoad(self)
getglobal(self:GetName().."Low"):SetText("10%")
getglobal(self:GetName().."High"):SetText("100%")
local text = getglobal(self:GetName().."Text")
text:SetText("Junk item opacity")
-- Increase font size
local font, _, flags = text:GetFont()
if font then
text:SetFont(font, 12, flags)
end
self:SetMinMaxValues(0.1, 1.0)
self:SetValueStep(0.05)
local currentValue = Guda.Modules.DB:GetSetting("junkOpacity") or 0.6
self:SetValue(currentValue)
end
-- Junk Opacity Slider OnValueChanged
function Guda_SettingsPopup_JunkOpacitySlider_OnValueChanged(self)
local value = self:GetValue()
-- Round to 2 decimal places
value = math.floor(value * 100 + 0.5) / 100
-- Update display text
getglobal(self:GetName().."Text"):SetText("Junk item opacity: " .. math.floor(value * 100) .. "%")
-- Save setting
Guda.Modules.DB:SetSetting("junkOpacity", value)
-- Update bag frame if visible
local bagFrame = getglobal("Guda_BagFrame")
if bagFrame and bagFrame:IsShown() then
Guda.Modules.BagFrame:Update()
end
-- Update bank frame if visible
local bankFrame = getglobal("Guda_BankFrame")
if bankFrame and bankFrame:IsShown() then
Guda.Modules.BankFrame:Update()
end
end
-- Mark Unusable Items Checkbox OnLoad -- Mark Unusable Items Checkbox OnLoad
function Guda_SettingsPopup_MarkUnusableCheckbox_OnLoad(self) function Guda_SettingsPopup_MarkUnusableCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text") local text = getglobal(self:GetName().."Text")
+24 -2
View File
@@ -3,7 +3,7 @@
<!-- Settings Popup Frame --> <!-- Settings Popup Frame -->
<Frame name="Guda_SettingsPopup" toplevel="true" movable="true" enableMouse="true" hidden="true" parent="UIParent" frameStrata="DIALOG"> <Frame name="Guda_SettingsPopup" toplevel="true" movable="true" enableMouse="true" hidden="true" parent="UIParent" frameStrata="DIALOG">
<Size> <Size>
<AbsDimension x="500" y="520"/> <AbsDimension x="500" y="525"/>
</Size> </Size>
<Anchors> <Anchors>
@@ -554,10 +554,32 @@
</Scripts> </Scripts>
</Slider> </Slider>
<!-- Junk Item Opacity Slider -->
<Slider name="Guda_SettingsPopup_JunkOpacitySlider" inherits="OptionsSliderTemplate">
<Size>
<AbsDimension x="450" y="17"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativePoint="BOTTOMLEFT" relativeTo="Guda_SettingsPopup_TrackedBarSizeSlider">
<Offset>
<AbsDimension x="0" y="-40"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
Guda_SettingsPopup_JunkOpacitySlider_OnLoad(this)
</OnLoad>
<OnValueChanged>
Guda_SettingsPopup_JunkOpacitySlider_OnValueChanged(this)
</OnValueChanged>
</Scripts>
</Slider>
<!-- Quality Border Equipment Checkbox --> <!-- Quality Border Equipment Checkbox -->
<CheckButton name="Guda_SettingsPopup_QualityBorderEquipmentCheckbox" inherits="OptionsCheckButtonTemplate"> <CheckButton name="Guda_SettingsPopup_QualityBorderEquipmentCheckbox" inherits="OptionsCheckButtonTemplate">
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativePoint="BOTTOMLEFT" relativeTo="Guda_SettingsPopup_TrackedBarSizeSlider"> <Anchor point="TOPLEFT" relativePoint="BOTTOMLEFT" relativeTo="Guda_SettingsPopup_JunkOpacitySlider">
<Offset> <Offset>
<AbsDimension x="0" y="-30"/> <AbsDimension x="0" y="-30"/>
</Offset> </Offset>
+80 -3
View File
@@ -21,15 +21,25 @@ local function GetScanTooltip()
return scanTooltip return scanTooltip
end end
-- Check if an item is a quest item by scanning tooltip
local function IsQuestItem(bagID, slotID)
if addon.Modules.Utils and addon.Modules.Utils.IsQuestItem then
return addon.Modules.Utils:IsQuestItem(bagID, slotID, nil, false, false)
end
return false, false
end
-- Scan bags for tracked items and calculate total counts -- Scan bags for tracked items and calculate total counts
function TrackedItemBar:ScanForTrackedItems() function TrackedItemBar:ScanForTrackedItems()
trackedItemsInfo = {} trackedItemsInfo = {}
local trackedIDs = addon.Modules.DB:GetSetting("trackedItems") or {} local trackedIDs = addon.Modules.DB:GetSetting("trackedItems") or {}
local itemCounts = {} local itemCounts = {}
local itemTextures = {} local itemTextures = {}
local itemLinks = {} local itemLinks = {}
local itemOrder = {} local itemOrder = {}
local itemIsQuest = {}
local itemIsQuestStarter = {}
-- Scan backpack and 4 bags -- Scan backpack and 4 bags
for bagID = 0, 4 do for bagID = 0, 4 do
@@ -46,6 +56,10 @@ function TrackedItemBar:ScanForTrackedItems()
itemLinks[id] = link itemLinks[id] = link
itemCounts[id .. "_bag"] = bagID itemCounts[id .. "_bag"] = bagID
itemCounts[id .. "_slot"] = slotID itemCounts[id .. "_slot"] = slotID
-- Check if quest item
local isQuest, isStarter = IsQuestItem(bagID, slotID)
itemIsQuest[id] = isQuest
itemIsQuestStarter[id] = isStarter
table.insert(itemOrder, id) table.insert(itemOrder, id)
end end
itemCounts[id] = itemCounts[id] + count itemCounts[id] = itemCounts[id] + count
@@ -61,7 +75,9 @@ function TrackedItemBar:ScanForTrackedItems()
count = itemCounts[id], count = itemCounts[id],
link = itemLinks[id], link = itemLinks[id],
bagID = itemCounts[id .. "_bag"], bagID = itemCounts[id .. "_bag"],
slotID = itemCounts[id .. "_slot"] slotID = itemCounts[id .. "_slot"],
isQuest = itemIsQuest[id],
isQuestStarter = itemIsQuestStarter[id]
}) })
end end
end end
@@ -92,7 +108,32 @@ function TrackedItemBar:Update()
if not button then if not button then
button = CreateFrame("Button", "Guda_TrackedItemBarButton" .. i, frame, "Guda_ItemButtonTemplate") button = CreateFrame("Button", "Guda_TrackedItemBarButton" .. i, frame, "Guda_ItemButtonTemplate")
table.insert(buttons, button) table.insert(buttons, button)
-- Create quest border (golden)
local questBorder = CreateFrame("Frame", nil, button)
questBorder:SetFrameLevel(button:GetFrameLevel() + 6)
questBorder:SetBackdrop({
bgFile = nil,
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
edgeSize = 12,
insets = {left = 4, right = 4, top = 4, bottom = 4}
})
questBorder:SetBackdropBorderColor(1.0, 0.82, 0, 1)
questBorder:Hide()
button.questBorder = questBorder
-- Create quest icon (question mark in corner)
local questIcon = CreateFrame("Frame", nil, button)
questIcon:SetFrameLevel(button:GetFrameLevel() + 7)
questIcon:SetWidth(16)
questIcon:SetHeight(16)
local iconTex = questIcon:CreateTexture(nil, "OVERLAY")
iconTex:SetAllPoints(questIcon)
iconTex:SetTexture("Interface\\GossipFrame\\ActiveQuestIcon")
iconTex:SetTexCoord(0, 1, 0, 1)
questIcon:Hide()
button.questIcon = questIcon
button:RegisterForDrag("LeftButton") button:RegisterForDrag("LeftButton")
button:SetScript("OnDragStart", function() end) button:SetScript("OnDragStart", function() end)
button:SetScript("OnReceiveDrag", function() end) button:SetScript("OnReceiveDrag", function() end)
@@ -190,6 +231,42 @@ function TrackedItemBar:Update()
emptyBg:SetHeight(buttonSize) emptyBg:SetHeight(buttonSize)
end end
-- Position and show/hide quest border
if button.questBorder then
button.questBorder:ClearAllPoints()
button.questBorder:SetPoint("TOPLEFT", icon, "TOPLEFT", -2, 2)
button.questBorder:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", 2, -2)
if info.isQuest then
button.questBorder:Show()
else
button.questBorder:Hide()
end
end
-- Position and show/hide quest icon
if button.questIcon then
local questIconSize = math.max(12, math.min(20, buttonSize * 0.35))
button.questIcon:SetWidth(questIconSize)
button.questIcon:SetHeight(questIconSize)
button.questIcon:ClearAllPoints()
button.questIcon:SetPoint("TOPRIGHT", button, "TOPRIGHT", 1, 0)
if info.isQuest then
-- Set appropriate texture based on quest type
local tex = button.questIcon:GetRegions()
if tex and tex.SetTexture then
if info.isQuestStarter then
tex:SetTexture("Interface\\GossipFrame\\AvailableQuestIcon")
else
tex:SetTexture("Interface\\GossipFrame\\ActiveQuestIcon")
end
end
button.questIcon:Show()
else
button.questIcon:Hide()
end
end
button:Show() button:Show()
end end