diff Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua @ 0:169f5211fc7f

First public revision. At this point ItemAuditor watches mail for auctions sold or purchased, watches for buy/sell (money and 1 item type change) and conversions/tradeskills. Milling isn't working yet because there is too much time between the first event and the last event.
author Asa Ayers <Asa.Ayers@Gmail.com>
date Thu, 20 May 2010 19:22:19 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua	Thu May 20 19:22:19 2010 -0700
@@ -0,0 +1,230 @@
+local AceGUI = LibStub("AceGUI-3.0")
+
+-- Lua APIs
+
+-- WoW APIs
+local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
+local CreateFrame, UIParent = CreateFrame, UIParent
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: NOT_BOUND
+
+--------------------------
+-- Keybinding  		    --
+--------------------------
+
+do
+	local Type = "Keybinding"
+	local Version = 13
+
+	local ControlBackdrop  = {
+		bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
+		edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
+		tile = true, tileSize = 16, edgeSize = 16,
+		insets = { left = 3, right = 3, top = 3, bottom = 3 }
+	}
+
+	local function Control_OnEnter(this)
+		this.obj:Fire("OnEnter")
+	end
+
+	local function Control_OnLeave(this)
+		this.obj:Fire("OnLeave")
+	end
+	
+	local function keybindingMsgFixWidth(this)
+		this:SetWidth(this.msg:GetWidth()+10)
+		this:SetScript("OnUpdate",nil)
+	end
+
+	local function Keybinding_OnClick(this, button)
+		if button == "LeftButton" or button == "RightButton" then
+			local self = this.obj
+			if self.waitingForKey then
+				this:EnableKeyboard(false)
+				self.msgframe:Hide()
+				this:UnlockHighlight()
+				self.waitingForKey = nil
+			else
+				this:EnableKeyboard(true)
+				self.msgframe:Show()
+				this:LockHighlight()
+				self.waitingForKey = true
+			end
+		end
+		AceGUI:ClearFocus()
+	end
+
+	local ignoreKeys = nil
+	local function Keybinding_OnKeyDown(this, key)
+		local self = this.obj
+		if self.waitingForKey then
+			local keyPressed = key
+			if keyPressed == "ESCAPE" then
+				keyPressed = ""
+			else
+				if not ignoreKeys then
+					ignoreKeys = {
+						["BUTTON1"] = true, ["BUTTON2"] = true,
+						["UNKNOWN"] = true,
+						["LSHIFT"] = true, ["LCTRL"] = true, ["LALT"] = true,
+						["RSHIFT"] = true, ["RCTRL"] = true, ["RALT"] = true,
+					}
+				end
+				if ignoreKeys[keyPressed] then return end
+				if IsShiftKeyDown() then
+					keyPressed = "SHIFT-"..keyPressed
+				end
+				if IsControlKeyDown() then
+					keyPressed = "CTRL-"..keyPressed
+				end
+				if IsAltKeyDown() then
+					keyPressed = "ALT-"..keyPressed
+				end
+			end
+	
+			this:EnableKeyboard(false)
+			self.msgframe:Hide()
+			this:UnlockHighlight()
+			self.waitingForKey = nil	
+			
+			if not self.disabled then
+				self:SetKey(keyPressed)
+				self:Fire("OnKeyChanged",keyPressed)
+			end
+		end
+	end
+	
+	local function Keybinding_OnMouseDown(this, button)
+		if button == "LeftButton" or button == "RightButton" then
+			return
+		elseif button == "MiddleButton" then
+			button = "BUTTON3"
+		elseif button == "Button4" then
+			button = "BUTTON4"
+		elseif button == "Button5" then
+			button = "BUTTON5"
+		end
+		Keybinding_OnKeyDown(this, button)
+	end
+	
+	local function OnAcquire(self)
+		self:SetWidth(200)
+		self:SetHeight(44)
+		self:SetLabel("")
+		self:SetKey("")
+	end
+	
+	local function OnRelease(self)
+		self.frame:ClearAllPoints()
+		self.frame:Hide()
+		self.waitingForKey = nil
+		self.msgframe:Hide()
+		self:SetDisabled(false)
+	end
+	
+	local function SetDisabled(self, disabled)
+		self.disabled = disabled
+		if disabled then
+			self.button:Disable()
+			self.label:SetTextColor(0.5,0.5,0.5)
+		else
+			self.button:Enable()
+			self.label:SetTextColor(1,1,1)
+		end
+	end
+	
+	local function SetKey(self, key)
+		if (key or "") == "" then
+			self.button:SetText(NOT_BOUND)
+			self.button:SetNormalFontObject("GameFontNormal")
+		else
+			self.button:SetText(key)
+			self.button:SetNormalFontObject("GameFontHighlight")
+		end
+	end
+	
+	local function SetLabel(self, label)
+		self.label:SetText(label or "")
+		if (label or "") == "" then
+			self.alignoffset = nil
+			self:SetHeight(24)
+		else
+			self.alignoffset = 30
+			self:SetHeight(44)
+		end
+	end
+
+	local function Constructor()
+		local num  = AceGUI:GetNextWidgetNum(Type)
+		local frame = CreateFrame("Frame",nil,UIParent)
+		
+		local button = CreateFrame("Button","AceGUI-3.0 KeybindingButton"..num,frame,"UIPanelButtonTemplate2")
+		
+		local self = {}
+		self.type = Type
+		self.num = num
+
+		local text = button:GetFontString()
+		text:SetPoint("LEFT",button,"LEFT",7,0)
+		text:SetPoint("RIGHT",button,"RIGHT",-7,0)
+	
+		button:SetScript("OnClick",Keybinding_OnClick)
+		button:SetScript("OnKeyDown",Keybinding_OnKeyDown)
+		button:SetScript("OnEnter",Control_OnEnter)
+		button:SetScript("OnLeave",Control_OnLeave)
+		button:SetScript("OnMouseDown",Keybinding_OnMouseDown)
+		button:RegisterForClicks("AnyDown")
+		button:EnableMouse()
+	
+		button:SetHeight(24)
+		button:SetWidth(200)
+		button:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
+		button:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
+		
+		frame:SetWidth(200)
+		frame:SetHeight(44)
+		
+		self.alignoffset = 30
+		
+		self.button = button
+		
+		local label = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight")
+		label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
+		label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
+		label:SetJustifyH("CENTER")
+		label:SetHeight(18)
+		self.label = label
+		
+		local msgframe = CreateFrame("Frame",nil,UIParent)
+		msgframe:SetHeight(30)
+		msgframe:SetBackdrop(ControlBackdrop)
+		msgframe:SetBackdropColor(0,0,0)
+		msgframe:SetFrameStrata("FULLSCREEN_DIALOG")
+		msgframe:SetFrameLevel(1000)
+		self.msgframe = msgframe
+		local msg = msgframe:CreateFontString(nil,"OVERLAY","GameFontNormal")
+		msg:SetText("Press a key to bind, ESC to clear the binding or click the button again to cancel")
+		msgframe.msg = msg
+		msg:SetPoint("TOPLEFT",msgframe,"TOPLEFT",5,-5)
+		msgframe:SetScript("OnUpdate", keybindingMsgFixWidth)
+		msgframe:SetPoint("BOTTOM",button,"TOP",0,0)
+		msgframe:Hide()
+	
+		self.OnRelease = OnRelease
+		self.OnAcquire = OnAcquire
+		self.SetLabel = SetLabel
+		self.SetDisabled = SetDisabled
+		self.SetKey = SetKey
+		
+		self.frame = frame
+		frame.obj = self
+		button.obj = self
+
+		AceGUI:RegisterAsWidget(self)
+		return self
+	end
+	
+	AceGUI:RegisterWidgetType(Type,Constructor,Version)
+end