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