diff Frames.lua @ 101:6ae44d372360

The confirmation window when refilling from the (guild) bank is enabled can now be skipped at the general config. It defaults to false. Added a window displaying a list of movable items when at least one is available at the (guild) bank. Resetting the queue when closing the storage.
author Zerotorescue
date Tue, 11 Jan 2011 19:48:35 +0100
parents
children 8502f02bf543
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Frames.lua	Tue Jan 11 19:48:35 2011 +0100
@@ -0,0 +1,242 @@
+local addon = select(2, ...);
+
+local function ShowTooltip(self)
+	-- If this function is called from a widget, self is the widget and self.frame the actual frame
+	local this = self.frame or self;
+	
+	GameTooltip:SetOwner(this, "ANCHOR_NONE");
+	if this.tooltipLocation and this.tooltipLocation == "TOP" then
+		GameTooltip:SetPoint("TOP", this, "TOP");
+	else
+		GameTooltip:SetPoint("BOTTOM", this, "TOP");
+	end
+	GameTooltip:SetText(this.tooltipTitle, 1, .82, 0, 1);
+	
+	if type(this.tooltip) == "string" then
+		GameTooltip:AddLine(this.tooltip, 1, 1, 1, 1);
+	end
+	
+	GameTooltip:Show();
+end
+
+local function HideTooltip()
+	GameTooltip:Hide();
+end
+
+function addon:CreateMoverFrame(onAccept, onCancel)
+	local frameWidth = 400;
+	
+	-- Main window
+		local frame = CreateFrame("Frame", "InventoriumItemMover", 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(175);
+		-- Background
+		frame:SetBackdrop({
+			bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
+			edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
+			edgeSize = 13,
+			insets = {
+				left = 5,
+				right = 5,
+				top = 5,
+				bottom = 5,
+			},
+		});
+		frame:SetBackdropColor(0, 0, 0, .8);
+		-- Mouse functions
+		frame:EnableMouse();
+		frame:SetMovable(true);
+		frame:SetResizable(true);
+		frame:SetMinResize(300, 175);
+		-- Set event handlers
+		frame:SetScript("OnMouseUp", function(this) this:StopMovingOrSizing(); end);
+		frame:SetScript("OnShow", function(this)
+			-- We wish to display our box at a similar position as the default interface's static popups, so we literally copied the code for these popups
+			local lastFrame = StaticPopup_DisplayedFrames[#StaticPopup_DisplayedFrames];
+			if lastFrame then
+				this:SetPoint("TOP", lastFrame, "BOTTOM", 0, 0);
+			else
+				this:SetPoint("TOP", UIParent, "TOP", 0, -135);
+			end
+			
+			-- Position other static popups below this
+			tinsert(StaticPopup_DisplayedFrames, this);
+			
+			this:AdjustScrollTableRows();
+			
+			PlaySound("OrcExploration");
+		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);
+
+		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("Inventorium Bank Refill");
+	
+	-- Resizer (vertical only)
+		local frmResizer = CreateFrame("Frame", nil, frame);
+		frmResizer:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", 0, -10);
+		frmResizer:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 0, -10);
+		frmResizer:SetHeight(20);
+		frmResizer:EnableMouse();
+		frmResizer:SetScript("OnMouseDown", function(this) this:GetParent():StartSizing("BOTTOM"); end);
+		frmResizer:SetScript("OnMouseUp", function(this) this:GetParent():StopMovingOrSizing(); end);
+	
+	-- Description
+		local lblDescription = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal");
+		lblDescription:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -23);
+		lblDescription:SetWidth(frameWidth - 10 - 10); -- 10 margin left & 10 margin right
+		lblDescription:SetJustifyH("LEFT");
+		lblDescription:SetJustifyV("TOP");
+		lblDescription:SetText("The items listed below can be refilled from this location, do you wish to move them to your bags?");
+		
+		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, 10);
+			btnMove:SetText("Move Items");
+			btnMove:SetScript("OnClick", onAccept);
+			btnMove:SetScript("OnEnter", ShowTooltip);
+			btnMove:SetScript("OnLeave", HideTooltip);
+			btnMove.tooltipTitle = "Move Items";
+			btnMove.tooltip = "Start moving these items from the bank.";
+			
+			frame.btnMove = btnMove;
+			
+		-- Cancel
+			local btnCancel = CreateFrame("Button", "$parentCancel", frame, "UIPanelButtonTemplate");
+			btnCancel:SetHeight(21);
+			btnCancel:SetWidth(125);
+			btnCancel:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -15, 10);
+			btnCancel:SetText("Cancel");
+			btnCancel:SetScript("OnClick", onCancel);
+			btnCancel:SetScript("OnEnter", ShowTooltip);
+			btnCancel:SetScript("OnLeave", HideTooltip);
+			btnCancel.tooltipTitle = "Cancel";
+			btnCancel.tooltip = "Do not move anything and close the window.";
+			
+			frame.btnCancel = btnCancel;
+		
+	-- 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("TOP", frame.lblDescription, "BOTTOM", 0, -20);
+		frmMeasureDummy:SetPoint("LEFT", frame.lblDescription, "LEFT", 10, 0);
+		frmMeasureDummy:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -10, 35);
+		
+		frame.frmMeasureDummy = frmMeasureDummy;
+		
+	-- Scrolling table with a list of items to be moved
+		local scrollTableWidth = ( frame.frmMeasureDummy:GetWidth() - 20 ); -- adjust width by the scrollbar size
+		local headers = {
+			{
+				["name"] = "Item",
+				["width"] = (scrollTableWidth * .5),
+				["defaultsort"] = "asc",
+				["comparesort"] = function(this, aRow, bRow, column)
+					local aName, _, aRarity = GetItemInfo(this:GetRow(aRow).colorargs[2]);
+					local bName, _, bRarity = GetItemInfo(this:GetRow(bRow).colorargs[2]);
+					local template = "%d%s";
+					aName = template:format((10 - (aRarity or 10)), (aName or ""):lower());
+					bName = template:format((10 - (bRarity or 10)), (bName or ""):lower());
+					
+					if this.cols[column].sort == "dsc" then
+						return aName > bName;
+					else
+						return aName < bName;
+					end
+				end,
+				["sort"] = "asc", -- when the data is set, use this column so sort the default data
+			},
+			{
+				["name"] = "Moving",
+				["width"] = (scrollTableWidth * .15),
+				["defaultsort"] = "dsc",
+			},
+			{
+				["name"] = "Missing",
+				["width"] = (scrollTableWidth * .15), 
+				["defaultsort"] = "dsc",
+			},
+			{
+				["name"] = "Available",
+				["width"] = (scrollTableWidth * .2),
+				["defaultsort"] = "dsc",
+			},
+		};
+		
+		local ScrollingTable = LibStub("ScrollingTable");
+		local table = ScrollingTable:CreateST(headers, 3, 15, nil, frame);
+		table:RegisterEvents({
+			["OnEnter"] = function(rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...)
+				if row and realrow and data[realrow] and data[realrow].colorargs and data[realrow].colorargs[2] then
+			    	GameTooltip:SetOwner(rowFrame, "ANCHOR_NONE");
+					GameTooltip:SetPoint("TOPLEFT", rowFrame, "BOTTOMLEFT");
+			    	GameTooltip:SetHyperlink(("item:%d"):format(data[realrow].colorargs[2]));
+					GameTooltip:Show();
+				end
+			end,
+			["OnLeave"] = function(rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...)
+				if row and realrow then
+					HideTooltip();
+				end
+			end,
+		});
+		
+		frame.scrollTable = table;
+		table.frame:SetPoint("TOP", frame.lblDescription, "BOTTOM", 0, -20);
+		table.frame:SetPoint("LEFT", frame.lblDescription, "LEFT", 10, 0);
+		table.frame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -10, 35);
+		
+		-- 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 < 3 and 3) or newRows;
+				
+				this.scrollTable:SetDisplayRows(newRows, 15);
+			end;
+			frame:SetScript("OnSizeChanged", frame.AdjustScrollTableRows);
+end
+
+function addon:SetMoverFrameData(data)
+	InventoriumItemMover.scrollTable:SetData(data);
+	
+	InventoriumItemMover:Show();
+end