From c5dc724c85345db8dc64730cabf094e431d44a29 Mon Sep 17 00:00:00 2001 From: tekkub Date: Thu, 13 Aug 2009 23:09:03 -0600 Subject: [PATCH] And so it begins... --- GnomishVendorShrinker.lua | 277 ++++++++++++++++++++++++++++++ GnomishVendorShrinker.toc | 16 ++ tekKonfig/LibStub.lua | 30 ++++ tekKonfig/tekKonfig.xml | 5 + tekKonfig/tekKonfigAboutPanel.lua | 115 +++++++++++++ tekKonfig/tekKonfigScroll.lua | 80 +++++++++ 6 files changed, 523 insertions(+) create mode 100644 GnomishVendorShrinker.lua create mode 100644 GnomishVendorShrinker.toc create mode 100644 tekKonfig/LibStub.lua create mode 100644 tekKonfig/tekKonfig.xml create mode 100644 tekKonfig/tekKonfigAboutPanel.lua create mode 100644 tekKonfig/tekKonfigScroll.lua diff --git a/GnomishVendorShrinker.lua b/GnomishVendorShrinker.lua new file mode 100644 index 0000000..690b20c --- /dev/null +++ b/GnomishVendorShrinker.lua @@ -0,0 +1,277 @@ + +local NUMROWS, ICONSIZE, GAP, SCROLLSTEP = 14, 17, 4, 5 + + +for _,f in pairs{MerchantNextPageButton, MerchantPrevPageButton, MerchantPageText} do + f:Hide() + f.Show = f.Hide +end + + +local GVS = CreateFrame("frame", nil, MerchantFrame) +GVS:SetWidth(315) +GVS:SetHeight(294) +GVS:SetPoint("TOPLEFT", 21, -77) +GVS:SetScript("OnEvent", function(self, event, ...) if self[event] then return self[event](self, event, ...) end end) +GVS:Hide() + + +local function OnClick(self, button) + if IsAltKeyDown() and not self.altcurrency then self:BuyItem(true) + elseif IsModifiedClick() then HandleModifiedItemClick(GetMerchantItemLink(self:GetID())) + elseif self.altcurrency then + local id = self:GetID() + local link = GetMerchantItemLink(id) + self.link, self.texture = GetMerchantItemLink(id), self.icon:GetTexture() + MerchantFrame_ConfirmExtendedItemCost(self) + else self:BuyItem() end +end + + +local function BuyItem(self, fullstack) + local id = self:GetID() + local link = GetMerchantItemLink(id) + if not link then return end + + local _, _, _, vendorStackSize, numAvailable = GetMerchantItemInfo(id) + local maxPurchase = GetMerchantItemMaxStack(id) + local _, _, _, _, _, _, _, itemStackSize = GetItemInfo(link) + local quantity = fullstack and itemStackSize/vendorStackSize or 1 + if numAvailable > 0 and numAvailable < quantity then quantity = numAvailable end + local purchased = 0 + while purchased < quantity do + local buyamount = math.min(maxPurchase, quantity - purchased) + purchased = purchased + buyamount + BuyMerchantItem(id, buyamount) + end +end + + +local function OnEnter(self) + GameTooltip:SetOwner(self, "ANCHOR_RIGHT") + if self.tiptext then GameTooltip:SetText(self.tiptext) else GameTooltip:SetMerchantCostItem(self.index, self.itemIndex) end +end + + +local function OnLeave() + GameTooltip:Hide() + ResetCursor() +end + + +local function GSC(cash) + if not cash then return end + local g, s, c = floor(cash/10000), floor((cash/100)%100), cash%100 + if g > 0 and s == 0 and c == 0 then return string.format(" |cffffd700%d", g) + elseif g > 0 and c == 0 then return string.format(" |cffffd700%d.|cffc7c7cf%02d", g, s) + elseif g > 0 then return string.format(" |cffffd700%d.|cffc7c7cf%02d.|cffeda55f%02d", g, s, c) + elseif s > 0 and c == 0 then return string.format(" |cffc7c7cf%d", s) + elseif s > 0 then return string.format(" |cffc7c7cf%d.|cffeda55f%02d", s, c) + else return string.format(" |cffc7c7cf%d", c) end +end + + +local function SetValue(self, text, icon, tiptext) + self.text:SetText(text) + self.icon:SetTexture(icon) + self.tiptext, self.index, self.itemIndex = tiptext + if tiptext == HONOR_POINTS then + self.icon:SetPoint("RIGHT", -2, 0) + self.text:SetPoint("RIGHT", self.icon, "LEFT", -GAP/2 + 2, 0) + else + self.icon:SetPoint("RIGHT") + self.text:SetPoint("RIGHT", self.icon, "LEFT", -GAP/2, 0) + end + self:Show() +end + + +local function GetAltCurrencyFrame(frame) + for i,v in ipairs(frame.altframes) do if not v:IsShown() then return v end end + + local anchor = #frame.altframes > 0 and frame.altframes[#frame.altframes].text + local f = CreateFrame('Frame', nil, frame) + f:SetWidth(ICONSIZE) f:SetHeight(ICONSIZE) + f:SetPoint("RIGHT", anchor or frame.ItemPrice, "LEFT") + + f.icon = f:CreateTexture() + f.icon:SetWidth(ICONSIZE) f.icon:SetHeight(ICONSIZE) + + f.text = f:CreateFontString(nil, nil, "NumberFontNormalSmall") + + f.SetValue = SetValue + + f:EnableMouse(true) + f:SetScript("OnEnter", OnEnter) + f:SetScript("OnLeave", OnLeave) + + table.insert(frame.altframes, f) + return f +end + + +local function AddAltCurrency(frame, i) + local lastframe = frame.ItemPrice + local honorPoints, arenaPoints, itemCount = GetMerchantItemCostInfo(i) + for j=itemCount,1,-1 do + local f = frame:GetAltCurrencyFrame() + local texture, price = GetMerchantItemCostItem(i, j) + f:SetValue(price, texture) + f.index, f.itemIndex = i, j + lastframe = f.text + end + if arenaPoints > 0 then + local f = frame:GetAltCurrencyFrame() + f:SetValue(arenaPoints, "Interface\\PVPFrame\\PVP-ArenaPoints-Icon", ARENA_POINTS) + lastframe = f.text + end + if honorPoints > 0 then + local f = frame:GetAltCurrencyFrame() + f:SetValue(honorPoints, "Interface\\PVPFrame\\PVP-Currency-".. UnitFactionGroup("player"), HONOR_POINTS) + lastframe = f.text + end + frame.ItemName:SetPoint("RIGHT", lastframe, "LEFT", -GAP, 0) +end + + +local rows = {} +for i=1,NUMROWS do + local row = CreateFrame('Button', nil, GVS) -- base frame + row:SetHeight(21) + row:SetPoint("TOP", i == 1 and GVS or rows[i-1], i == 1 and "TOP" or "BOTTOM") + row:SetPoint("LEFT") + row:SetPoint("RIGHT", -19, 0) + + row.BuyItem = BuyItem + + row:SetHighlightTexture("Interface\\HelpFrame\\HelpFrameButton-Highlight") + row:GetHighlightTexture():SetTexCoord(0, 1, 0, 0.578125) + + row:SetScript('OnClick', OnClick) + row:SetScript('OnDragStart', function(self, button) + MerchantFrame.extendedCost = nil + PickupMerchantItem(self:GetID()) + if self.extendedCost then MerchantFrame.extendedCost = self end + end) + + local icon = CreateFrame('Frame', nil, row) + icon:SetHeight(ICONSIZE) + icon:SetWidth(ICONSIZE) + icon:SetPoint('LEFT', 2, 0) + + row.icon = icon:CreateTexture(nil, "BORDER") + row.icon:SetAllPoints() + + local ItemName = row:CreateFontString(nil, nil, "GameFontNormalSmall") + ItemName:SetPoint('LEFT', icon, "RIGHT", GAP, 0) + ItemName:SetJustifyH('LEFT') + row.ItemName = ItemName + + local ItemPrice = row:CreateFontString(nil, nil, "NumberFontNormalSmall") + ItemPrice:SetPoint('RIGHT', row, -2, 0) + row.ItemPrice = ItemPrice + + row.altframes = {} + row.AddAltCurrency, row.GetAltCurrencyFrame = AddAltCurrency, GetAltCurrencyFrame + + row:SetScript('OnEnter', function(self) + GameTooltip:SetOwner(self, "ANCHOR_RIGHT") + GameTooltip:SetMerchantItem(self:GetID()) + GameTooltip_ShowCompareItem() + MerchantFrame.itemHover = self:GetID() + if IsModifiedClick("DRESSUP") then ShowInspectCursor() else ResetCursor() end + end) + row:SetScript('OnLeave', function() + GameTooltip:Hide() + ResetCursor() + MerchantFrame.itemHover = nil + end) + + rows[i] = row +end + + +local offset = 0 +local function Refresh() + local n = GetMerchantNumItems() + for i,row in pairs(rows) do + local j = i + offset + if j > n then + row:Hide() + else + local name, itemTexture, itemPrice, itemStackCount, numAvailable, isUsable, extendedCost = GetMerchantItemInfo(j) + local link = GetMerchantItemLink(j) + local color = link and select(4, GetItemQualityColor(select(3, GetItemInfo(link)))) or "|cffffffff" + + row.icon:SetTexture(itemTexture) + row.ItemName:SetText((numAvailable > -1 and ("["..numAvailable.."] ") or "").. color.. (name or "").. (itemStackCount > 1 and ("|r x"..itemStackCount) or "")) + + for i,v in pairs(row.altframes) do v:Hide() end + row.altcurrency = extendedCost + if extendedCost then + row:AddAltCurrency(j) + row.link, row.texture, row.extendedCost = link, itemTexture, true + end + if itemPrice > 0 then + row.ItemPrice:SetText(GSC(itemPrice)) + row.Price = itemPrice + end + if extendedCost and (itemPrice <= 0) then + row.ItemPrice:SetText() + row.Price = 0 + elseif extendedCost and (itemPrice > 0) then + row.ItemPrice:SetText(GSC(itemPrice)) + else + row.ItemName:SetPoint("RIGHT", row.ItemPrice, "LEFT", -GAP, 0) + row.extendedCost = nil + end + + if isUsable then row.icon:SetVertexColor(1, 1, 1) else row.icon:SetVertexColor(.9, 0, 0) end + row:SetID(j) + row:Show() + end + end +end + + +local scrollbar = LibStub("tekKonfig-Scroll").new(GVS, 0, SCROLLSTEP) +local f = scrollbar:GetScript("OnValueChanged") +scrollbar:SetScript("OnValueChanged", function(self, value, ...) + offset = math.floor(value) + Refresh() + return f(self, value, ...) +end) + + +local offset = 0 +GVS:EnableMouseWheel(true) +GVS:SetScript("OnMouseWheel", function(self, value) scrollbar:SetValue(scrollbar:GetValue() - value * SCROLLSTEP) end) +GVS:SetScript("OnShow", function() + scrollbar:SetMinMaxValues(0, math.max(0, GetMerchantNumItems() - NUMROWS)) + scrollbar:SetValue(0) + Refresh() +end) + + +-- Reanchor the buyback button, it acts weird when switching tabs otherwise... +MerchantBuyBackItem:ClearAllPoints() +MerchantBuyBackItem:SetPoint("BOTTOMLEFT", 189, 90) + + +local function Show() + for i=1,12 do _G["MerchantItem"..i]:Hide() end + if GVS:IsShown() then Refresh() else GVS:Show() end +end +hooksecurefunc("MerchantFrame_UpdateMerchantInfo", Show) + + +hooksecurefunc("MerchantFrame_UpdateBuybackInfo", function() + GVS:Hide() + for i=1,12 do _G["MerchantItem"..i]:Show() end +end) + + +if MerchantFrame:IsVisible() and MerchantFrame.selectedTab == 1 then Show() end + + +LibStub("tekKonfig-AboutPanel").new(nil, "GnomishVendorShrinker") diff --git a/GnomishVendorShrinker.toc b/GnomishVendorShrinker.toc new file mode 100644 index 0000000..c7cfc6a --- /dev/null +++ b/GnomishVendorShrinker.toc @@ -0,0 +1,16 @@ +## Interface: 30200 + +## Title: GnomishVendorShrinker +## Notes: Compact scrolling vendor frame +## Author: Tekkub Stoutwrithe +## Version: Alpha +## X-Website: http://www.tekkub.net/ +## X-Email: tekkub-wow@googlegroups.com +## X-Category: Misc + +## LoadManagers: AddonLoader +## X-LoadOn-Merchant: true + +tekKonfig\tekKonfig.xml + +GnomishVendorShrinker.lua diff --git a/tekKonfig/LibStub.lua b/tekKonfig/LibStub.lua new file mode 100644 index 0000000..725982d --- /dev/null +++ b/tekKonfig/LibStub.lua @@ -0,0 +1,30 @@ +-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info +-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke +local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! +local LibStub = _G[LIBSTUB_MAJOR] + +if not LibStub or LibStub.minor < LIBSTUB_MINOR then + LibStub = LibStub or {libs = {}, minors = {} } + _G[LIBSTUB_MAJOR] = LibStub + LibStub.minor = LIBSTUB_MINOR + + function LibStub:NewLibrary(major, minor) + assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") + minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") + + local oldminor = self.minors[major] + if oldminor and oldminor >= minor then return nil end + self.minors[major], self.libs[major] = minor, self.libs[major] or {} + return self.libs[major], oldminor + end + + function LibStub:GetLibrary(major, silent) + if not self.libs[major] and not silent then + error(("Cannot find a library instance of %q."):format(tostring(major)), 2) + end + return self.libs[major], self.minors[major] + end + + function LibStub:IterateLibraries() return pairs(self.libs) end + setmetatable(LibStub, { __call = LibStub.GetLibrary }) +end diff --git a/tekKonfig/tekKonfig.xml b/tekKonfig/tekKonfig.xml new file mode 100644 index 0000000..f9489b9 --- /dev/null +++ b/tekKonfig/tekKonfig.xml @@ -0,0 +1,5 @@ + +