Zerotorescue@0: local addon = LibStub("AceAddon-3.0"):GetAddon("Inventory"); Zerotorescue@0: local mod = addon:NewModule("Summary", "AceEvent-3.0"); Zerotorescue@0: Zerotorescue@0: local AceGUI = LibStub("AceGUI-3.0"); Zerotorescue@0: Zerotorescue@0: function mod:OnEnable() Zerotorescue@0: self:RegisterWidgets(); Zerotorescue@0: Zerotorescue@0: self:BuildMain(); Zerotorescue@0: self:Build(); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: function mod:RegisterWidgets() Zerotorescue@0: -- Register InlineGroupWithButton-widget Zerotorescue@0: -- This widget adds a button next to the header of an inline group Zerotorescue@0: -- SetPoint doesn't seem usable within AceGUI. Zerotorescue@0: Zerotorescue@0: local widgetType = "InlineGroupWithButton"; Zerotorescue@0: local widgetVersion = 1; Zerotorescue@0: Zerotorescue@0: local function Constructor() Zerotorescue@0: local widget = AceGUI:Create("InlineGroup"); Zerotorescue@0: widget.type = widgetType; Zerotorescue@0: Zerotorescue@0: widget.MakeButton = function(self, buttonSettings) Zerotorescue@0: if type(buttonSettings) == "table" then Zerotorescue@0: local button = CreateFrame("Button", nil, self.frame, "UIPanelButtonTemplate"); Zerotorescue@0: button:SetText(buttonSettings.name); Zerotorescue@0: button:SetHeight(22); Zerotorescue@0: button:SetWidth(120); Zerotorescue@0: button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -10, 5); Zerotorescue@0: button:SetScript("OnClick", buttonSettings.exec); Zerotorescue@0: button.tooltipTitle = buttonSettings.name; Zerotorescue@0: button.tooltip = buttonSettings.desc or ""; Zerotorescue@0: button:SetScript("OnEnter", function(self) Zerotorescue@0: GameTooltip:SetOwner(self, "ANCHOR_NONE") Zerotorescue@0: GameTooltip:SetPoint("BOTTOM", self, "TOP") Zerotorescue@0: GameTooltip:SetText(self.tooltipTitle, 1, .82, 0, 1) Zerotorescue@0: Zerotorescue@0: if type(self.tooltip) == "string" then Zerotorescue@0: GameTooltip:AddLine(self.tooltip, 1, 1, 1, 1); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: GameTooltip:Show(); Zerotorescue@0: end); Zerotorescue@0: button:SetScript("OnLeave", function(self) Zerotorescue@0: GameTooltip:Hide(); Zerotorescue@0: end); Zerotorescue@0: else Zerotorescue@0: error("settings must be a table - usage: MakeButton(table);"); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: return widget; Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: function mod:BuildMain() Zerotorescue@0: local frame = AceGUI:Create("Frame"); Zerotorescue@0: frame:SetTitle("Inventory Summary"); Zerotorescue@0: frame:SetLayout("Fill"); Zerotorescue@0: Zerotorescue@0: local scrollFrame = AceGUI:Create("ScrollFrame"); Zerotorescue@0: scrollFrame:SetLayout("Flow"); Zerotorescue@0: Zerotorescue@0: frame:AddChild(scrollFrame); Zerotorescue@0: Zerotorescue@0: mod.scrollFrame = scrollFrame; Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local temp = {}; Zerotorescue@0: Zerotorescue@0: local sortMethod = "item"; Zerotorescue@0: local sortDirectory = "ASC"; Zerotorescue@0: local function ReSort(subject) Zerotorescue@0: if sortMethod == subject then Zerotorescue@0: sortDirectory = (sortDirectory == "ASC" and "DESC") or "ASC"; Zerotorescue@0: else Zerotorescue@0: sortDirectory = "ASC"; Zerotorescue@0: end Zerotorescue@0: sortMethod = subject; Zerotorescue@0: Zerotorescue@0: mod:Build(); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: function mod:Build() Zerotorescue@0: mod.scrollFrame:ReleaseChildren(); Zerotorescue@0: Zerotorescue@0: for groupName, values in pairs(addon.db.global.groups) do Zerotorescue@0: if values.items then Zerotorescue@0: -- Get group settings Zerotorescue@0: local stockRequired = values.minimumStock or addon.db.global.defaults.minimumStock; Zerotorescue@0: local showWhenBelow = (values.summaryThresholdShow or addon.db.global.defaults.summaryThresholdShow); Zerotorescue@0: Zerotorescue@0: -- Make group container Zerotorescue@0: local iGroup = AceGUI:Create("InlineGroupWithButton"); Zerotorescue@0: iGroup:SetTitle(groupName); Zerotorescue@0: iGroup:SetFullWidth(true); Zerotorescue@0: iGroup:SetLayout("Flow"); Zerotorescue@0: iGroup:MakeButton({ Zerotorescue@0: name = "Queue", Zerotorescue@0: desc = "Queue all items in this group.", Zerotorescue@0: exec = function() Zerotorescue@0: print(groupName); Zerotorescue@0: end, Zerotorescue@0: }); Zerotorescue@0: Zerotorescue@0: -- Headers Zerotorescue@0: -- Itemlink Zerotorescue@0: local lblItem = AceGUI:Create("InteractiveLabel"); Zerotorescue@0: lblItem:SetText("|cfffed000Item|r"); Zerotorescue@0: lblItem:SetFontObject(GameFontHighlight); Zerotorescue@0: lblItem:SetRelativeWidth(0.7); Zerotorescue@0: lblItem:SetCallback("OnClick", function() ReSort("item"); end); Zerotorescue@0: Zerotorescue@0: iGroup:AddChild(lblItem); Zerotorescue@0: Zerotorescue@0: -- Current quantity Zerotorescue@0: local lblQuantity = AceGUI:Create("InteractiveLabel"); Zerotorescue@0: lblQuantity:SetText("|cfffed000Cur.|r"); Zerotorescue@0: lblQuantity:SetFontObject(GameFontHighlight); Zerotorescue@0: lblQuantity:SetRelativeWidth(0.149); Zerotorescue@0: lblQuantity:SetCallback("OnClick", function() ReSort("current"); end); Zerotorescue@0: Zerotorescue@0: iGroup:AddChild(lblQuantity); Zerotorescue@0: Zerotorescue@0: -- Required stock Zerotorescue@0: local lblStockRequired = AceGUI:Create("InteractiveLabel"); Zerotorescue@0: lblStockRequired:SetText("|cfffed000Req.|r"); Zerotorescue@0: lblStockRequired:SetFontObject(GameFontHighlight); Zerotorescue@0: lblStockRequired:SetRelativeWidth(0.149); Zerotorescue@0: lblStockRequired:SetCallback("OnClick", function() ReSort("percentage"); end); Zerotorescue@0: Zerotorescue@0: iGroup:AddChild(lblStockRequired); Zerotorescue@0: Zerotorescue@0: -- Sort item list Zerotorescue@0: for itemId in pairs(values.items) do Zerotorescue@0: local itemName, itemLink, itemRarity = GetItemInfo(itemId); Zerotorescue@0: Zerotorescue@0: table.insert(temp, { Zerotorescue@0: id = itemId, Zerotorescue@0: name = itemName, Zerotorescue@0: link = itemLink, Zerotorescue@0: rarity = itemRarity, Zerotorescue@0: count = addon:GetItemCount(itemId), Zerotorescue@0: }); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local sortNameFormat = "%d%s"; --rarity .. name Zerotorescue@0: table.sort(temp, function(a, b) Zerotorescue@0: if sortMethod == "item" then Zerotorescue@0: if sortDirectory == "ASC" then Zerotorescue@0: return sortNameFormat:format((7 - a.rarity), a.name):upper() < sortNameFormat:format((7 - b.rarity), b.name):upper(); Zerotorescue@0: else Zerotorescue@0: return sortNameFormat:format((7 - a.rarity), a.name):upper() > sortNameFormat:format((7 - b.rarity), b.name):upper(); Zerotorescue@0: end Zerotorescue@0: elseif sortMethod == "current" then Zerotorescue@0: if sortDirectory == "ASC" then Zerotorescue@0: return a.count < b.count; Zerotorescue@0: else Zerotorescue@0: return a.count > b.count; Zerotorescue@0: end Zerotorescue@0: elseif sortMethod == "percentage" then Zerotorescue@0: if sortDirectory == "ASC" then Zerotorescue@0: return ( a.count / stockRequired ) < ( b.count / stockRequired ); Zerotorescue@0: else Zerotorescue@0: return ( a.count / stockRequired ) > ( b.count / stockRequired ); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: end); Zerotorescue@0: Zerotorescue@0: -- Show stuff Zerotorescue@0: for _, item in pairs(temp) do Zerotorescue@0: if ( item.count / stockRequired ) < showWhenBelow then Zerotorescue@0: local btnItemLink = AceGUI:Create("ItemLinkButton"); Zerotorescue@0: btnItemLink:SetText(item.id); Zerotorescue@0: btnItemLink:SetRelativeWidth(0.7); Zerotorescue@0: btnItemLink:SetCallback("OnEnter", function() end); Zerotorescue@0: Zerotorescue@0: iGroup:AddChild(btnItemLink); Zerotorescue@0: Zerotorescue@0: -- Current quantity Zerotorescue@0: local lblQuantity = AceGUI:Create("Label"); Zerotorescue@0: lblQuantity:SetText(self:ColorCode(item.count, stockRequired)); Zerotorescue@0: lblQuantity:SetRelativeWidth(0.149); Zerotorescue@0: Zerotorescue@0: iGroup:AddChild(lblQuantity); Zerotorescue@0: Zerotorescue@0: -- Required stock Zerotorescue@0: local lblStockRequired = AceGUI:Create("Label"); Zerotorescue@0: lblStockRequired:SetText(stockRequired); Zerotorescue@0: lblStockRequired:SetRelativeWidth(0.149); Zerotorescue@0: Zerotorescue@0: iGroup:AddChild(lblStockRequired); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- We no longer need this, so forget about it Zerotorescue@0: table.wipe(temp); Zerotorescue@0: Zerotorescue@0: mod.scrollFrame:AddChild(iGroup); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: function mod:ColorCode(num, required) Zerotorescue@0: local percentage = ( num / required ); Zerotorescue@0: Zerotorescue@0: if percentage >= addon.db.global.defaults.colors.green then Zerotorescue@0: return ("|cff00ff00%d|r"):format(num); Zerotorescue@0: elseif percentage >= addon.db.global.defaults.colors.yellow then Zerotorescue@0: return ("|cffffff00%d|r"):format(num); Zerotorescue@0: elseif percentage >= addon.db.global.defaults.colors.orange then Zerotorescue@0: return ("|cffff9933%d|r"):format(num); Zerotorescue@0: elseif percentage >= addon.db.global.defaults.colors.red then Zerotorescue@0: return ("|cffff0000%d|r"):format(num); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: function mod:NumberFormat(num) Zerotorescue@0: local formatted = string.gsub(num, "(%d)(%d%d%d)$", "%1,%2", 1); Zerotorescue@0: Zerotorescue@0: while true do Zerotorescue@0: formatted, matches = string.gsub(formatted, "(%d)(%d%d%d),", "%1,%2,", 1); Zerotorescue@0: Zerotorescue@0: if matches == 0 then Zerotorescue@0: break; Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: return formatted; Zerotorescue@0: end