view Frames.lua @ 104:8502f02bf543

Increased edge size to make them more visible. Item mover window is no longer setting point to itself. Lowered description position so it doesn?t overlap the title.
author Zerotorescue
date Tue, 11 Jan 2011 23:13:40 +0100
parents 6ae44d372360
children d3fbb5676a5e
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 == "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(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 = 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);
	
	-- 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", 15, -25);
		lblDescription:SetWidth(frameWidth - 15 - 15); -- 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, 11);
			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, 11);
			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", 15, 0);
		frmMeasureDummy:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -15, 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, "LEFT", 15, 0);
		table.frame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -15, 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