Mercurial > wow > ouroloot
changeset 112:ccf90050cdc1 beta-mhg-1
Work around acegui bugs, revert when tickets fixed.
author | Farmbuyer of US-Kilrogg <farmbuyer@gmail.com> |
---|---|
date | Thu, 09 Aug 2012 23:58:30 -0400 |
parents | cfbaf001fd52 |
children | d1b914bbed8b |
files | AceGUIWidget-CheckBox.lua AceGUIWidget-Keybinding.lua Ouro_Loot.toc |
diffstat | 3 files changed, 539 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AceGUIWidget-CheckBox.lua Thu Aug 09 23:58:30 2012 -0400 @@ -0,0 +1,295 @@ +--[[----------------------------------------------------------------------------- +Checkbox Widget +-------------------------------------------------------------------------------]] +local Type, Version = "CheckBox", 22 +local AceGUI = LibStub and LibStub("AceGUI-3.0", true) +if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end + +-- Lua APIs +local select, pairs = select, pairs + +-- WoW APIs +local PlaySound = PlaySound +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: SetDesaturation, GameFontHighlight + +--[[----------------------------------------------------------------------------- +Support functions +-------------------------------------------------------------------------------]] +local function AlignImage(self) + local img = self.image:GetTexture() + self.text:ClearAllPoints() + if not img then + self.text:SetPoint("LEFT", self.checkbg, "RIGHT") + self.text:SetPoint("RIGHT") + else + self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0) + self.text:SetPoint("RIGHT") + end +end + +--[[----------------------------------------------------------------------------- +Scripts +-------------------------------------------------------------------------------]] +local function Control_OnEnter(frame) + frame.obj:Fire("OnEnter") +end + +local function Control_OnLeave(frame) + frame.obj:Fire("OnLeave") +end + +local function CheckBox_OnMouseDown(frame) + local self = frame.obj + if not self.disabled then + if self.image:GetTexture() then + self.text:SetPoint("LEFT", self.image,"RIGHT", 2, -1) + else + self.text:SetPoint("LEFT", self.checkbg, "RIGHT", 1, -1) + end + end + AceGUI:ClearFocus() +end + +local function CheckBox_OnMouseUp(frame) + local self = frame.obj + if not self.disabled then + self:ToggleChecked() + + if self.checked then + PlaySound("igMainMenuOptionCheckBoxOn") + else -- for both nil and false (tristate) + PlaySound("igMainMenuOptionCheckBoxOff") + end + + self:Fire("OnValueChanged", self.checked) + AlignImage(self) + end +end + +--[[----------------------------------------------------------------------------- +Methods +-------------------------------------------------------------------------------]] +local methods = { + ["OnAcquire"] = function(self) + self:SetType() + self:SetValue(false) + self:SetTriState(nil) + -- height is calculated from the width and required space for the description + self:SetWidth(200) + self:SetImage() + self:SetDisabled(nil) + self:SetDescription(nil) + end, + + -- ["OnRelease"] = nil, + + ["OnWidthSet"] = function(self, width) + if self.desc then + self.desc:SetWidth(width - 30) + if self.desc:GetText() and self.desc:GetText() ~= "" then + self:SetHeight(28 + self.desc:GetHeight()) + end + end + end, + + ["SetDisabled"] = function(self, disabled) + self.disabled = disabled + if disabled then + self.frame:Disable() + self.text:SetTextColor(0.5, 0.5, 0.5) + SetDesaturation(self.check, true) + if self.desc then + self.desc:SetTextColor(0.5, 0.5, 0.5) + end + else + self.frame:Enable() + self.text:SetTextColor(1, 1, 1) + if self.tristate and self.checked == nil then + SetDesaturation(self.check, true) + else + SetDesaturation(self.check, false) + end + if self.desc then + self.desc:SetTextColor(1, 1, 1) + end + end + end, + + ["SetValue"] = function(self,value) + local check = self.check + self.checked = value + if value then + SetDesaturation(self.check, false) + self.check:Show() + else + --Nil is the unknown tristate value + if self.tristate and value == nil then + SetDesaturation(self.check, true) + self.check:Show() + else + SetDesaturation(self.check, false) + self.check:Hide() + end + end + self:SetDisabled(self.disabled) + end, + + ["GetValue"] = function(self) + return self.checked + end, + + ["SetTriState"] = function(self, enabled) + self.tristate = enabled + self:SetValue(self:GetValue()) + end, + + ["SetType"] = function(self, type) + local checkbg = self.checkbg + local check = self.check + local highlight = self.highlight + + local size + if type == "radio" then + size = 16 + checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton") + checkbg:SetTexCoord(0, 0.25, 0, 1) + check:SetTexture("Interface\\Buttons\\UI-RadioButton") + check:SetTexCoord(0.25, 0.5, 0, 1) + check:SetBlendMode("ADD") + highlight:SetTexture("Interface\\Buttons\\UI-RadioButton") + highlight:SetTexCoord(0.5, 0.75, 0, 1) + else + size = 24 + checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up") + checkbg:SetTexCoord(0, 1, 0, 1) + check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") + check:SetTexCoord(0, 1, 0, 1) + check:SetBlendMode("BLEND") + highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight") + highlight:SetTexCoord(0, 1, 0, 1) + end + checkbg:SetHeight(size) + checkbg:SetWidth(size) + end, + + ["ToggleChecked"] = function(self) + local value = self:GetValue() + if self.tristate then + --cycle in true, nil, false order + if value then + self:SetValue(nil) + elseif value == nil then + self:SetValue(false) + else + self:SetValue(true) + end + else + self:SetValue(not self:GetValue()) + end + end, + + ["SetLabel"] = function(self, label) + self.text:SetText(label) + end, + + ["SetDescription"] = function(self, desc) + if desc then + if not self.desc then + local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall") + desc:ClearAllPoints() + desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21) + desc:SetWidth(self.frame.width - 30) + desc:SetJustifyH("LEFT") + desc:SetJustifyV("TOP") + self.desc = desc + end + self.desc:Show() + --self.text:SetFontObject(GameFontNormal) + self.desc:SetText(desc) + self:SetHeight(28 + self.desc:GetHeight()) + else + if self.desc then + self.desc:SetText("") + self.desc:Hide() + end + --self.text:SetFontObject(GameFontHighlight) + self:SetHeight(24) + end + end, + + ["SetImage"] = function(self, path, ...) + local image = self.image + image:SetTexture(path) + + if image:GetTexture() then + local n = select("#", ...) + if n == 4 or n == 8 then + image:SetTexCoord(...) + else + image:SetTexCoord(0, 1, 0, 1) + end + end + AlignImage(self) + end +} + +--[[----------------------------------------------------------------------------- +Constructor +-------------------------------------------------------------------------------]] +local function Constructor() + local frame = CreateFrame("Button", nil, UIParent) + frame:Hide() + + frame:EnableMouse(true) + frame:SetScript("OnEnter", Control_OnEnter) + frame:SetScript("OnLeave", Control_OnLeave) + frame:SetScript("OnMouseDown", CheckBox_OnMouseDown) + frame:SetScript("OnMouseUp", CheckBox_OnMouseUp) + + local checkbg = frame:CreateTexture(nil, "ARTWORK") + checkbg:SetWidth(24) + checkbg:SetHeight(24) + checkbg:SetPoint("TOPLEFT") + checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up") + + local check = frame:CreateTexture(nil, "OVERLAY") + check:SetAllPoints(checkbg) + check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") + + local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight") + text:SetJustifyH("LEFT") + text:SetHeight(18) + text:SetPoint("LEFT", checkbg, "RIGHT") + text:SetPoint("RIGHT") + + local highlight = frame:CreateTexture(nil, "HIGHLIGHT") + highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight") + highlight:SetBlendMode("ADD") + highlight:SetAllPoints(checkbg) + + local image = frame:CreateTexture(nil, "OVERLAY") + image:SetHeight(16) + image:SetWidth(16) + image:SetPoint("LEFT", checkbg, "RIGHT", 1, 0) + + local widget = { + checkbg = checkbg, + check = check, + text = text, + highlight = highlight, + image = image, + frame = frame, + type = Type + } + for method, func in pairs(methods) do + widget[method] = func + end + + return AceGUI:RegisterAsWidget(widget) +end + +AceGUI:RegisterWidgetType(Type, Constructor, Version)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/AceGUIWidget-Keybinding.lua Thu Aug 09 23:58:30 2012 -0400 @@ -0,0 +1,239 @@ +--[[----------------------------------------------------------------------------- +Keybinding Widget +Set Keybindings in the Config UI. +-------------------------------------------------------------------------------]] +local Type, Version = "Keybinding", 24 +local AceGUI = LibStub and LibStub("AceGUI-3.0", true) +if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end + +-- Lua APIs +local pairs = pairs + +-- 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 + +local wowMoP +do + local _, _, _, interface = GetBuildInfo() + wowMoP = (interface >= 50000) +end + +--[[----------------------------------------------------------------------------- +Scripts +-------------------------------------------------------------------------------]] + +local function Control_OnEnter(frame) + frame.obj:Fire("OnEnter") +end + +local function Control_OnLeave(frame) + frame.obj:Fire("OnLeave") +end + +local function Keybinding_OnClick(frame, button) + if button == "LeftButton" or button == "RightButton" then + local self = frame.obj + if self.waitingForKey then + frame:EnableKeyboard(false) + self.msgframe:Hide() + frame:UnlockHighlight() + self.waitingForKey = nil + else + frame:EnableKeyboard(true) + self.msgframe:Show() + frame:LockHighlight() + self.waitingForKey = true + end + end + AceGUI:ClearFocus() +end + +local ignoreKeys = { + ["BUTTON1"] = true, ["BUTTON2"] = true, + ["UNKNOWN"] = true, + ["LSHIFT"] = true, ["LCTRL"] = true, ["LALT"] = true, + ["RSHIFT"] = true, ["RCTRL"] = true, ["RALT"] = true, +} +local function Keybinding_OnKeyDown(frame, key) + local self = frame.obj + if self.waitingForKey then + local keyPressed = key + if keyPressed == "ESCAPE" then + keyPressed = "" + else + 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 + + frame:EnableKeyboard(false) + self.msgframe:Hide() + frame:UnlockHighlight() + self.waitingForKey = nil + + if not self.disabled then + self:SetKey(keyPressed) + self:Fire("OnKeyChanged", keyPressed) + end + end +end + +local function Keybinding_OnMouseDown(frame, 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(frame, button) +end + +--[[----------------------------------------------------------------------------- +Methods +-------------------------------------------------------------------------------]] +local methods = { + ["OnAcquire"] = function(self) + self:SetWidth(200) + self:SetLabel("") + self:SetKey("") + self.waitingForKey = nil + self.msgframe:Hide() + self:SetDisabled(false) + self.button:EnableKeyboard(false) + end, + + -- ["OnRelease"] = nil, + + ["SetDisabled"] = function(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, + + ["SetKey"] = function(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, + + ["GetKey"] = function(self) + local key = self.button:GetText() + if key == NOT_BOUND then + key = nil + end + return key + end, + + ["SetLabel"] = function(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, +} + +--[[----------------------------------------------------------------------------- +Constructor +-------------------------------------------------------------------------------]] + +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 keybindingMsgFixWidth(frame) + frame:SetWidth(frame.msg:GetWidth() + 10) + frame:SetScript("OnUpdate", nil) +end + +local function Constructor() + local name = "AceGUI30KeybindingButton" .. AceGUI:GetNextWidgetNum(Type) + + local frame = CreateFrame("Frame", nil, UIParent) + local button = CreateFrame("Button", name, frame, wowMoP and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2") + + button:EnableMouse(true) + button:RegisterForClicks("AnyDown") + button:SetScript("OnEnter", Control_OnEnter) + button:SetScript("OnLeave", Control_OnLeave) + button:SetScript("OnClick", Keybinding_OnClick) + button:SetScript("OnKeyDown", Keybinding_OnKeyDown) + button:SetScript("OnMouseDown", Keybinding_OnMouseDown) + button:SetPoint("BOTTOMLEFT") + button:SetPoint("BOTTOMRIGHT") + button:SetHeight(24) + button:EnableKeyboard(false) + + local text = button:GetFontString() + text:SetPoint("LEFT", 7, 0) + text:SetPoint("RIGHT", -7, 0) + + local label = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight") + label:SetPoint("TOPLEFT") + label:SetPoint("TOPRIGHT") + label:SetJustifyH("CENTER") + label:SetHeight(18) + + local msgframe = CreateFrame("Frame", nil, UIParent) + msgframe:SetHeight(30) + msgframe:SetBackdrop(ControlBackdrop) + msgframe:SetBackdropColor(0,0,0) + msgframe:SetFrameStrata("FULLSCREEN_DIALOG") + msgframe:SetFrameLevel(1000) + msgframe:SetToplevel(true) + + 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", 5, -5) + msgframe:SetScript("OnUpdate", keybindingMsgFixWidth) + msgframe:SetPoint("BOTTOM", button, "TOP") + msgframe:Hide() + + local widget = { + button = button, + label = label, + msgframe = msgframe, + frame = frame, + alignoffset = 30, + type = Type + } + for method, func in pairs(methods) do + widget[method] = func + end + button.obj = widget + + return AceGUI:RegisterAsWidget(widget) +end + +AceGUI:RegisterWidgetType(Type, Constructor, Version)
--- a/Ouro_Loot.toc Wed Aug 08 23:15:06 2012 -0400 +++ b/Ouro_Loot.toc Thu Aug 09 23:58:30 2012 -0400 @@ -32,7 +32,11 @@ AceGUIWidget-Spacer.lua AceGUIWidget-lib-st.lua AceGUIWidget-DoTimerEditBoxDropDown.lua -AceGUIWidget-CheckBoxSmallLabel.lua +#AceGUIWidget-CheckBoxSmallLabel.lua +# work around ace3 ticket 304 +AceGUIWidget-CheckBox.lua +# work around ace3 ticket 305 +AceGUIWidget-Keybinding.lua #locale-enUS.lua #locale-deDE.lua