view 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 source
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