view Frames.lua @ 110:67bd5057ecb7

Implemented vendor restocking with the mover. Comitting so I can always review this working version, but I?ll be disabling all part of it as it is not going to work properly without seriously compromising the code structure. Debug messages are now appended with ?Inventorium? (my MailOpener addon was making stuff difficult). Now properly removing the refill window from the displayed static popup windows list so new popups won?t be aligned at odd locations. Changed ?CreateMoverFrame? to not contain any scenario-specific info. All settings can be set with SetFrameSettings. Items that belong to speciality bags are now put there. Other items now ignore spaciality bags. Implemented test code for mailbox refill support. It has been disabled due to some issues but may be introduced later. The guild withdrawal limit is now taken into consideration. Queue is now reset before scanning again.
author Zerotorescue
date Fri, 14 Jan 2011 23:25:05 +0100
parents d3fbb5676a5e
children 9765bc3b3d6b
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;
	
	if not this.tooltipTitle then return; end
	
	GameTooltip:SetOwner(this, "ANCHOR_NONE");
	if this.tooltipLocation and this.tooltipLocation == "BOTTOM" then
		GameTooltip:SetPoint("TOP", this, "BOTTOM");
	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()
	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 = 20,
			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)
			if not tContains(StaticPopup_DisplayedFrames, this) then
				-- 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);
			end
			
			this:AdjustScrollTableRows();
			
			PlaySound("OrcExploration");
		end);
		frame:SetScript("OnHide", function(this)
			StaticPopup_CollapseTable(this);
		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);
		
		frame.lblTitle = lblTitle;
	
	-- 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", 15, -27);
		lblDescription:SetWidth(frameWidth - 15 - 15); -- 10 margin left & 10 margin right
		lblDescription:SetJustifyH("LEFT");
		lblDescription:SetJustifyV("TOP");
		
		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);
			
			frame.btnMove = btnMove;
			
		-- 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 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, -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 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);
		-- When moving over a row, provide a tooltip for the item
		table: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.id then
						GameTooltip:SetOwner(rowFrame, "ANCHOR_NONE");
						GameTooltip:SetPoint("TOPLEFT", rowFrame, "BOTTOMLEFT");
						GameTooltip:SetHyperlink(("item:%d"):format(data[realrow].rowData.id));
						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 = table;
	
	-- 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

function addon:SetMoverFrameData(data)
	InventoriumItemMover.scrollTable:SetData(data);
	
	InventoriumItemMover:Show();
end

function addon:SetFrameSettings(title, description, proceed, cancel, headers)
	local frame = InventoriumItemMover;
	
	frame.lblTitle:SetText(title);
	
	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.btnCancel:SetText(cancel.text);
	frame.btnCancel.tooltipTitle = cancel.tooltipTitle;
	frame.btnCancel.tooltip = cancel.tooltip;
	frame.btnCancel.OnClick = cancel.onClick;
	
	frame.scrollTable:SetDisplayCols(headers);
end