Mercurial > wow > inventory
diff Frames.lua @ 132:8460855e3d90
Rewrote queueing module to insert a GUI.
Minor mover window changes.
author | Zerotorescue |
---|---|
date | Tue, 18 Jan 2011 00:30:15 +0100 |
parents | dc6f405c1a5d |
children | 5ed50feddeb0 |
line wrap: on
line diff
--- a/Frames.lua Tue Jan 18 00:28:24 2011 +0100 +++ b/Frames.lua Tue Jan 18 00:30:15 2011 +0100 @@ -4,7 +4,7 @@ -- If this function is called from a widget, self is the widget and self.frame the actual frame local this = self.frame or self; - if not this.tooltipTitle then return; end + if not this.tooltipTitle or addon.db.profile.defaults.hideHelp then return; end GameTooltip:SetOwner(this, "ANCHOR_NONE"); if this.tooltipLocation and this.tooltipLocation == "BOTTOM" then @@ -26,6 +26,10 @@ end function addon:CreateMoverFrame() + if InventoriumItemMover then + return; + end + local frameWidth = 400; -- Main window @@ -136,17 +140,16 @@ frame.lblDescription = lblDescription; -- Buttons - -- Move (proceed) - local btnMove = CreateFrame("Button", "$parentProceed", frame, "UIPanelButtonTemplate"); - btnMove:SetHeight(21); - btnMove:SetWidth(125); - btnMove:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", 15, 11); - btnMove:SetText("Move Items"); - btnMove:SetScript("OnClick", function(this) this.OnClick(this); end); - btnMove:SetScript("OnEnter", ShowTooltip); - btnMove:SetScript("OnLeave", HideTooltip); + -- Proceed + local btnProceed = CreateFrame("Button", "$parentProceed", frame, "UIPanelButtonTemplate"); + btnProceed:SetHeight(21); + btnProceed:SetWidth(125); + btnProceed:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", 15, 11); + btnProceed:SetScript("OnClick", function(this) this.OnClick(this); end); + btnProceed:SetScript("OnEnter", ShowTooltip); + btnProceed:SetScript("OnLeave", HideTooltip); - frame.btnMove = btnMove; + frame.btnProceed = btnProceed; -- Cancel local btnCancel = CreateFrame("Button", "$parentCancel", frame, "UIPanelButtonTemplate"); @@ -169,12 +172,12 @@ -- Scrolling table with a list of items to be moved local ScrollingTable = LibStub("ScrollingTable"); - local table = ScrollingTable:CreateST({}, 4, 15, nil, frame); -- inserting a dummy cols, real cols to be set in SetFrameSettings - table.frame:SetPoint("TOP", frame.lblDescription, "BOTTOM", 0, -18); - table.frame:SetPoint("LEFT", frame, "LEFT", 15, 0); - table.frame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -15, 35); + local scrollTable = ScrollingTable:CreateST({}, 4, 15, nil, frame); -- inserting a dummy cols, real cols to be set in SetFrameSettings + scrollTable.frame:SetPoint("TOP", frame.lblDescription, "BOTTOM", 0, -18); + scrollTable.frame:SetPoint("LEFT", frame, "LEFT", 15, 0); + scrollTable.frame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -15, 35); -- When moving over a row, provide a tooltip for the item - table:RegisterEvents({ + scrollTable:RegisterEvents({ ["OnEnter"] = function(rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...) if row and realrow then -- Data row @@ -205,7 +208,7 @@ end, }); - frame.scrollTable = table; + frame.scrollTable = scrollTable; -- Change the amount of displayed rows based on the size of the frame frame.AdjustScrollTableRows = function(this) @@ -223,7 +226,7 @@ InventoriumItemMover:Show(); end -function addon:SetFrameSettings(title, description, proceed, cancel, headers) +function addon:SetMoverFrameSettings(title, description, proceed, cancel, headers) local frame = InventoriumItemMover; frame.lblTitle:SetText(title); @@ -232,10 +235,10 @@ frame.lblDescription:SetText(description); - frame.btnMove:SetText(proceed.text); - frame.btnMove.tooltipTitle = proceed.tooltipTitle; - frame.btnMove.tooltip = proceed.tooltip; - frame.btnMove.OnClick = proceed.onClick; + frame.btnProceed:SetText(proceed.text); + frame.btnProceed.tooltipTitle = proceed.tooltipTitle; + frame.btnProceed.tooltip = proceed.tooltip; + frame.btnProceed.OnClick = proceed.onClick; frame.btnCancel:SetText(cancel.text); frame.btnCancel.tooltipTitle = cancel.tooltipTitle; @@ -244,3 +247,379 @@ frame.scrollTable:SetDisplayCols(headers); end + +function addon:CreateQueueFrame() + if InventoriumQueuer then + return; + end + + do + local frameWidth = 400; + + -- Main window + local frame = CreateFrame("Frame", "InventoriumQueuer", UIParent); + -- Hide by default + frame:Hide(); + -- Center the frame (will be adjusted later) + frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0); + -- Put in front of other windows + frame:SetFrameStrata("FULLSCREEN_DIALOG"); + frame:SetToplevel(true); + -- Give it a size + frame:SetWidth(frameWidth); + frame:SetHeight(430); + -- Background + frame:SetBackdrop({ + bgFile = "Interface\\ChatFrame\\ChatFrameBackground", + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", + edgeSize = 20, + insets = { + left = 5, + right = 5, + top = 5, + bottom = 5, + }, + }); + frame:SetBackdropColor(0, 0, 0, .8); + -- Mouse functions + frame:EnableMouse(); + frame:SetMovable(true); + -- Set event handlers + frame:SetScript("OnMouseUp", function(this) this:StopMovingOrSizing(); end); + frame:SetScript("OnShow", function(this) + this:AdjustScrollTableRows(); + end); + + -- Title (AceGUI frame-widget-title used as example) + local titleBackground = frame:CreateTexture(nil, "OVERLAY"); + titleBackground:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header"); + titleBackground:SetTexCoord(0.31, 0.67, 0, 0.63); + titleBackground:SetPoint("TOP", 0, 12); + titleBackground:SetWidth(150); + titleBackground:SetHeight(40); + + frame.titleBackground = titleBackground; + + local titleBackgroundLeft = frame:CreateTexture(nil, "OVERLAY"); + titleBackgroundLeft:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header"); + titleBackgroundLeft:SetTexCoord(0.21, 0.31, 0, 0.63); + titleBackgroundLeft:SetPoint("RIGHT", titleBackground, "LEFT"); + titleBackgroundLeft:SetWidth(30); + titleBackgroundLeft:SetHeight(40); + + local titleBackgroundRight = frame:CreateTexture(nil, "OVERLAY"); + titleBackgroundRight:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header"); + titleBackgroundRight:SetTexCoord(0.67, 0.77, 0, 0.63); + titleBackgroundRight:SetPoint("LEFT", titleBackground, "RIGHT"); + titleBackgroundRight:SetWidth(30); + titleBackgroundRight:SetHeight(40); + + local frmTitle = CreateFrame("Frame", nil, frame); + frmTitle:EnableMouse(true); + frmTitle:SetScript("OnMouseDown", function(this) this:GetParent():StartMoving(); end); + frmTitle:SetScript("OnMouseUp", function(this) this:GetParent():StopMovingOrSizing(); end); + frmTitle:SetAllPoints(titleBackground); + + local lblTitle = frmTitle:CreateFontString(nil, "OVERLAY", "GameFontNormal"); + lblTitle:SetPoint("TOP", titleBackground, "TOP", 0, -14); + + frame.lblTitle = lblTitle; + + -- Expand button + local btnExpander = CreateFrame("Button", "$parentExpander", frame); + btnExpander:SetWidth(32); + btnExpander:SetHeight(32); + btnExpander:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -10, -10); + btnExpander:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up"); + btnExpander:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Down"); + btnExpander:SetDisabledTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Disabled"); + btnExpander:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD"); + btnExpander.tooltipTitle = "Show unqueueables"; + btnExpander.tooltip = "Click to show a list of all unqueueable but tracked items."; + btnExpander:SetScript("OnEnter", ShowTooltip); + btnExpander:SetScript("OnLeave", HideTooltip); + btnExpander:SetScript("OnClick", function(this) + if this.Expanded then + -- Collapsing + this.Expanded = nil; + InventoriumQueuerUnqueueables:Hide(); + PlaySound("igCharacterInfoClose"); + + -- Next is an expand + this:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up"); + this:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Down"); + this:SetDisabledTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Disabled"); + else + -- Expanding + this.Expanded = true; + + -- Position the frame against the queuer window + InventoriumQueuerUnqueueables:ClearAllPoints(); + InventoriumQueuerUnqueueables:SetPoint("TOPLEFT", this:GetParent(), "TOPRIGHT", 0, 0); + InventoriumQueuerUnqueueables:SetPoint("BOTTOMLEFT", this:GetParent(), "BOTTOMLEFT", 0, 0); + InventoriumQueuerUnqueueables:Show(); + PlaySound("igCharacterInfoOpen"); + + -- Next is a collapse + this:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up"); + this:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Down"); + this:SetDisabledTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Disabled"); + end + end); + + -- Description + local lblDescription = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal"); + lblDescription:SetPoint("TOPLEFT", frame, "TOPLEFT", 15, -27); + lblDescription:SetPoint("RIGHT", btnExpander, "LEFT", -15, 0); + lblDescription:SetJustifyH("LEFT"); + lblDescription:SetJustifyV("TOP"); + lblDescription:SetWidth(frameWidth - 70); + + frame.lblDescription = lblDescription; + + -- Buttons + -- Proceed + local btnProceed = CreateFrame("Button", "$parentProceed", frame, "UIPanelButtonTemplate"); + btnProceed:SetHeight(21); + btnProceed:SetWidth(125); + btnProceed:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", 15, 11); + btnProceed:SetScript("OnClick", function(this) this.OnClick(this); end); + btnProceed:SetScript("OnEnter", ShowTooltip); + btnProceed:SetScript("OnLeave", HideTooltip); + + frame.btnProceed = btnProceed; + + -- Cancel + local btnCancel = CreateFrame("Button", "$parentCancel", frame, "UIPanelButtonTemplate"); + btnCancel:SetHeight(21); + btnCancel:SetWidth(125); + btnCancel:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -15, 11); + btnCancel:SetScript("OnClick", function(this) this.OnClick(this); end); + btnCancel:SetScript("OnEnter", ShowTooltip); + btnCancel:SetScript("OnLeave", HideTooltip); + + frame.btnCancel = btnCancel; + + -- Because the scrolling table code-behind will change the scrolltable element's height, we can't rely on that. Make a dummy frame which we can measure + local frmMeasureDummy = CreateFrame("Frame", nil, frame); + frmMeasureDummy:SetPoint("TOP", frame.lblDescription, "BOTTOM", 0, -18); + frmMeasureDummy:SetPoint("LEFT", frame, "LEFT", 15, 0); + frmMeasureDummy:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -15, 35); + + frame.frmMeasureDummy = frmMeasureDummy; + + -- Scrolling table with a list of items to be queued + local ScrollingTable = LibStub("ScrollingTable"); + local scrollTable = ScrollingTable:CreateST({}, 4, 15, nil, frame); -- inserting a dummy cols, real cols to be set in SetFrameSettings + scrollTable.frame:SetPoint("TOP", frame.lblDescription, "BOTTOM", 0, -18); + scrollTable.frame:SetPoint("LEFT", frame, "LEFT", 15, 0); + scrollTable.frame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -15, 35); + -- When moving over a row, provide a tooltip for the item + scrollTable:RegisterEvents({ + ["OnEnter"] = function(rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...) + if row and realrow then + -- Data row + + if data[realrow] and data[realrow].rowData and data[realrow].rowData.itemId then + GameTooltip:SetOwner(rowFrame, "ANCHOR_NONE"); + GameTooltip:SetPoint("TOPLEFT", rowFrame, "BOTTOMLEFT"); + GameTooltip:SetHyperlink(("item:%d"):format(data[realrow].rowData.itemId)); + GameTooltip:Show(); + end + else + -- Header row + + if cols[column].tooltipTitle and type(cols[column].tooltipTitle) == "string" then + cellFrame.tooltipTitle = cols[column].tooltipTitle; + if cols[column].tooltip then + cellFrame.tooltip = cols[column].tooltip; -- Optional + else + cellFrame.tooltip = nil; + end + + ShowTooltip(cellFrame); + end + end + end, + ["OnLeave"] = function(rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...) + HideTooltip(); + end, + }); + + frame.scrollTable = scrollTable; + + -- Change the amount of displayed rows based on the size of the frame + frame.AdjustScrollTableRows = function(this) + local newRows = math.floor(( this.frmMeasureDummy:GetHeight() - 5 ) / 15); + newRows = (newRows < 4 and 4) or newRows; + + this.scrollTable:SetDisplayRows(newRows, 15); + end; + frame:SetScript("OnSizeChanged", frame.AdjustScrollTableRows); + end + do + local frameWidth = 300; + + -- Main window + local frame = CreateFrame("Frame", "InventoriumQueuerUnqueueables", InventoriumQueuer); + -- Hide by default + frame:Hide(); + -- Position the frame against the queuer window + frame:SetPoint("TOPLEFT", InventoriumQueuer, "TOPRIGHT", 0, 0); + frame:SetPoint("BOTTOMLEFT", InventoriumQueuer, "BOTTOMLEFT", 0, 0); + -- Put in front of other windows + frame:SetFrameStrata("FULLSCREEN_DIALOG"); + frame:SetToplevel(true); + -- Give it a size + frame:SetWidth(frameWidth); + -- Background + frame:SetBackdrop({ + bgFile = "Interface\\ChatFrame\\ChatFrameBackground", + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", + edgeSize = 20, + insets = { + left = 5, + right = 5, + top = 5, + bottom = 5, + }, + }); + frame:SetBackdropColor(0, 0, 0, .8); + -- Mouse functions + frame:EnableMouse(); + frame:SetMovable(true); + -- Set event handlers + frame:SetScript("OnMouseUp", function(this) this:StopMovingOrSizing(); end); + frame:SetScript("OnShow", function(this) + this:AdjustScrollTableRows(); + end); + + -- Title (AceGUI frame-widget-title used as example) + local titleBackground = frame:CreateTexture(nil, "OVERLAY"); + titleBackground:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header"); + titleBackground:SetTexCoord(0.31, 0.67, 0, 0.63); + titleBackground:SetPoint("TOP", 0, 12); + titleBackground:SetWidth(90); + titleBackground:SetHeight(40); + + frame.titleBackground = titleBackground; + + local titleBackgroundLeft = frame:CreateTexture(nil, "OVERLAY"); + titleBackgroundLeft:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header"); + titleBackgroundLeft:SetTexCoord(0.21, 0.31, 0, 0.63); + titleBackgroundLeft:SetPoint("RIGHT", titleBackground, "LEFT"); + titleBackgroundLeft:SetWidth(30); + titleBackgroundLeft:SetHeight(40); + + local titleBackgroundRight = frame:CreateTexture(nil, "OVERLAY"); + titleBackgroundRight:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header"); + titleBackgroundRight:SetTexCoord(0.67, 0.77, 0, 0.63); + titleBackgroundRight:SetPoint("LEFT", titleBackground, "RIGHT"); + titleBackgroundRight:SetWidth(30); + titleBackgroundRight:SetHeight(40); + + local frmTitle = CreateFrame("Frame", nil, frame); + frmTitle:EnableMouse(true); + frmTitle:SetScript("OnMouseDown", function(this) this:GetParent():StartMoving(); end); + frmTitle:SetScript("OnMouseUp", function(this) this:GetParent():StopMovingOrSizing(); end); + frmTitle:SetAllPoints(titleBackground); + + local lblTitle = frmTitle:CreateFontString(nil, "OVERLAY", "GameFontNormal"); + lblTitle:SetPoint("TOP", titleBackground, "TOP", 0, -14); + lblTitle:SetText("Unqueueables"); + + -- Because the scrolling table code-behind will change this element's height, we can't rely on that. Make a dummy frame which we can measure + local frmMeasureDummy = CreateFrame("Frame", nil, frame); + frmMeasureDummy:SetPoint("TOPLEFT", frame, "TOPLEFT", 15, -42); + frmMeasureDummy:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -15, 15); + + frame.frmMeasureDummy = frmMeasureDummy; + + -- Scrolling table with a list of items to be queued + local ScrollingTable = LibStub("ScrollingTable"); + local scrollTable = ScrollingTable:CreateST({}, 4, 15, nil, frame); -- inserting a dummy cols, real cols to be set in SetFrameSettings + scrollTable.frame:SetPoint("TOPLEFT", frame, "TOPLEFT", 15, -42); + scrollTable.frame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -15, 15); + -- When moving over a row, provide a tooltip for the item + scrollTable:RegisterEvents({ + ["OnEnter"] = function(rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...) + if row and realrow then + -- Data row + + if data[realrow] and data[realrow].rowData and data[realrow].rowData.itemId then + if column == 1 then + GameTooltip:SetOwner(rowFrame, "ANCHOR_NONE"); + GameTooltip:SetPoint("TOPLEFT", rowFrame, "BOTTOMLEFT"); + GameTooltip:SetHyperlink(("item:%d"):format(data[realrow].rowData.itemId)); + GameTooltip:Show(); + else + GameTooltip:SetOwner(cellFrame, "ANCHOR_NONE"); + GameTooltip:SetPoint("TOPLEFT", cellFrame, "BOTTOMLEFT"); + GameTooltip:SetText(data[realrow].rowData.reason[1]); + GameTooltip:AddLine(data[realrow].rowData.reason[2], 1, 1, 1, 1); + GameTooltip:Show(); + end + end + else + -- Header row + + if cols[column].tooltipTitle and type(cols[column].tooltipTitle) == "string" then + cellFrame.tooltipTitle = cols[column].tooltipTitle; + if cols[column].tooltip then + cellFrame.tooltip = cols[column].tooltip; -- Optional + else + cellFrame.tooltip = nil; + end + + ShowTooltip(cellFrame); + end + end + end, + ["OnLeave"] = function(rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...) + HideTooltip(); + end, + }); + + frame.scrollTable = scrollTable; + + -- Change the amount of displayed rows based on the size of the frame + frame.AdjustScrollTableRows = function(this) + local newRows = math.floor(( this.frmMeasureDummy:GetHeight() - 5 ) / 15); + newRows = (newRows < 4 and 4) or newRows; + + this.scrollTable:SetDisplayRows(newRows, 15); + end; + frame:SetScript("OnSizeChanged", frame.AdjustScrollTableRows); + end +end + +function addon:SetQueueFrameData(queueable, unqueueables) + InventoriumQueuer.scrollTable:SetData(queueable); + InventoriumQueuerUnqueueables.scrollTable:SetData(unqueueables); + + InventoriumQueuer:Show(); +end + +function addon:SetQueueFrameSettings(title, description, proceed, cancel, headers, unqueueablesHeaders) + local frame = InventoriumQueuer; + + frame.lblTitle:SetText(title); + -- Adjust size for the title background + frame.titleBackground:SetWidth((frame.lblTitle:GetWidth() or 0) + 10); -- 10 pixels margin + + frame.lblDescription:SetText(description); + + frame.btnProceed:SetText(proceed.text); + frame.btnProceed.tooltipTitle = proceed.tooltipTitle; + frame.btnProceed.tooltip = proceed.tooltip; + frame.btnProceed.OnClick = proceed.onClick; + + frame.btnCancel:SetText(cancel.text); + frame.btnCancel.tooltipTitle = cancel.tooltipTitle; + frame.btnCancel.tooltip = cancel.tooltip; + frame.btnCancel.OnClick = cancel.onClick; + + frame.scrollTable:SetDisplayCols(headers); + + InventoriumQueuerUnqueueables.scrollTable:SetDisplayCols(unqueueablesHeaders); +end