Zerotorescue@0: --[[ $Id: AceGUIWidget-DropDown-Items.lua 916 2010-03-15 12:24:36Z nevcairiel $ ]]-- Zerotorescue@0: Zerotorescue@0: local AceGUI = LibStub("AceGUI-3.0") Zerotorescue@0: Zerotorescue@0: -- Lua APIs Zerotorescue@0: local select, assert = select, assert Zerotorescue@0: Zerotorescue@0: -- WoW APIs Zerotorescue@0: local PlaySound = PlaySound Zerotorescue@0: local CreateFrame = CreateFrame Zerotorescue@0: Zerotorescue@0: local function fixlevels(parent,...) Zerotorescue@0: local i = 1 Zerotorescue@0: local child = select(i, ...) Zerotorescue@0: while child do Zerotorescue@0: child:SetFrameLevel(parent:GetFrameLevel()+1) Zerotorescue@0: fixlevels(child, child:GetChildren()) Zerotorescue@0: i = i + 1 Zerotorescue@0: child = select(i, ...) Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local function fixstrata(strata, parent, ...) Zerotorescue@0: local i = 1 Zerotorescue@0: local child = select(i, ...) Zerotorescue@0: parent:SetFrameStrata(strata) Zerotorescue@0: while child do Zerotorescue@0: fixstrata(strata, child, child:GetChildren()) Zerotorescue@0: i = i + 1 Zerotorescue@0: child = select(i, ...) Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- ItemBase is the base "class" for all dropdown items. Zerotorescue@0: -- Each item has to use ItemBase.Create(widgetType) to Zerotorescue@0: -- create an initial 'self' value. Zerotorescue@0: -- ItemBase will add common functions and ui event handlers. Zerotorescue@0: -- Be sure to keep basic usage when you override functions. Zerotorescue@0: Zerotorescue@0: local ItemBase = { Zerotorescue@0: -- NOTE: The ItemBase version is added to each item's version number Zerotorescue@0: -- to ensure proper updates on ItemBase changes. Zerotorescue@0: -- Use at least 1000er steps. Zerotorescue@0: version = 1000, Zerotorescue@0: counter = 0, Zerotorescue@0: } Zerotorescue@0: Zerotorescue@0: function ItemBase.Frame_OnEnter(this) Zerotorescue@0: local self = this.obj Zerotorescue@0: Zerotorescue@0: if self.useHighlight then Zerotorescue@0: self.highlight:Show() Zerotorescue@0: end Zerotorescue@0: self:Fire("OnEnter") Zerotorescue@0: Zerotorescue@0: if self.specialOnEnter then Zerotorescue@0: self.specialOnEnter(self) Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: function ItemBase.Frame_OnLeave(this) Zerotorescue@0: local self = this.obj Zerotorescue@0: Zerotorescue@0: self.highlight:Hide() Zerotorescue@0: self:Fire("OnLeave") Zerotorescue@0: Zerotorescue@0: if self.specialOnLeave then Zerotorescue@0: self.specialOnLeave(self) Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported, AceGUI callback Zerotorescue@0: function ItemBase.OnAcquire(self) Zerotorescue@0: self.frame:SetToplevel(true) Zerotorescue@0: self.frame:SetFrameStrata("FULLSCREEN_DIALOG") Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported, AceGUI callback Zerotorescue@0: function ItemBase.OnRelease(self) Zerotorescue@0: self:SetDisabled(false) Zerotorescue@0: self.pullout = nil Zerotorescue@0: self.frame:SetParent(nil) Zerotorescue@0: self.frame:ClearAllPoints() Zerotorescue@0: self.frame:Hide() Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: -- NOTE: this is called by a Dropdown-Pullout. Zerotorescue@0: -- Do not call this method directly Zerotorescue@0: function ItemBase.SetPullout(self, pullout) Zerotorescue@0: self.pullout = pullout Zerotorescue@0: Zerotorescue@0: self.frame:SetParent(nil) Zerotorescue@0: self.frame:SetParent(pullout.itemFrame) Zerotorescue@0: self.parent = pullout.itemFrame Zerotorescue@0: fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren()) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: function ItemBase.SetText(self, text) Zerotorescue@0: self.text:SetText(text or "") Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: function ItemBase.GetText(self) Zerotorescue@0: return self.text:GetText() Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: function ItemBase.SetPoint(self, ...) Zerotorescue@0: self.frame:SetPoint(...) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: function ItemBase.Show(self) Zerotorescue@0: self.frame:Show() Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: function ItemBase.Hide(self) Zerotorescue@0: self.frame:Hide() Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: function ItemBase.SetDisabled(self, disabled) Zerotorescue@0: self.disabled = disabled Zerotorescue@0: if disabled then Zerotorescue@0: self.useHighlight = false Zerotorescue@0: self.text:SetTextColor(.5, .5, .5) Zerotorescue@0: else Zerotorescue@0: self.useHighlight = true Zerotorescue@0: self.text:SetTextColor(1, 1, 1) Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: -- NOTE: this is called by a Dropdown-Pullout. Zerotorescue@0: -- Do not call this method directly Zerotorescue@0: function ItemBase.SetOnLeave(self, func) Zerotorescue@0: self.specialOnLeave = func Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: -- NOTE: this is called by a Dropdown-Pullout. Zerotorescue@0: -- Do not call this method directly Zerotorescue@0: function ItemBase.SetOnEnter(self, func) Zerotorescue@0: self.specialOnEnter = func Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: function ItemBase.Create(type) Zerotorescue@0: -- NOTE: Most of the following code is copied from AceGUI-3.0/Dropdown widget Zerotorescue@0: local count = AceGUI:GetNextWidgetNum(type) Zerotorescue@0: local frame = CreateFrame("Button", "AceGUI30DropDownItem"..count) Zerotorescue@0: local self = {} Zerotorescue@0: self.frame = frame Zerotorescue@0: frame.obj = self Zerotorescue@0: self.type = type Zerotorescue@0: Zerotorescue@0: self.useHighlight = true Zerotorescue@0: Zerotorescue@0: frame:SetHeight(17) Zerotorescue@0: frame:SetFrameStrata("FULLSCREEN_DIALOG") Zerotorescue@0: Zerotorescue@0: local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") Zerotorescue@0: text:SetTextColor(1,1,1) Zerotorescue@0: text:SetJustifyH("LEFT") Zerotorescue@0: text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0) Zerotorescue@0: text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-8,0) Zerotorescue@0: self.text = text Zerotorescue@0: Zerotorescue@0: local highlight = frame:CreateTexture(nil, "OVERLAY") Zerotorescue@0: highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight") Zerotorescue@0: highlight:SetBlendMode("ADD") Zerotorescue@0: highlight:SetHeight(14) Zerotorescue@0: highlight:ClearAllPoints() Zerotorescue@0: highlight:SetPoint("RIGHT",frame,"RIGHT",-3,0) Zerotorescue@0: highlight:SetPoint("LEFT",frame,"LEFT",5,0) Zerotorescue@0: highlight:Hide() Zerotorescue@0: self.highlight = highlight Zerotorescue@0: Zerotorescue@0: local check = frame:CreateTexture("OVERLAY") Zerotorescue@0: check:SetWidth(16) Zerotorescue@0: check:SetHeight(16) Zerotorescue@0: check:SetPoint("LEFT",frame,"LEFT",3,-1) Zerotorescue@0: check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") Zerotorescue@0: check:Hide() Zerotorescue@0: self.check = check Zerotorescue@0: Zerotorescue@0: local sub = frame:CreateTexture("OVERLAY") Zerotorescue@0: sub:SetWidth(16) Zerotorescue@0: sub:SetHeight(16) Zerotorescue@0: sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1) Zerotorescue@0: sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow") Zerotorescue@0: sub:Hide() Zerotorescue@0: self.sub = sub Zerotorescue@0: Zerotorescue@0: frame:SetScript("OnEnter", ItemBase.Frame_OnEnter) Zerotorescue@0: frame:SetScript("OnLeave", ItemBase.Frame_OnLeave) Zerotorescue@0: Zerotorescue@0: self.OnAcquire = ItemBase.OnAcquire Zerotorescue@0: self.OnRelease = ItemBase.OnRelease Zerotorescue@0: Zerotorescue@0: self.SetPullout = ItemBase.SetPullout Zerotorescue@0: self.GetText = ItemBase.GetText Zerotorescue@0: self.SetText = ItemBase.SetText Zerotorescue@0: self.SetDisabled = ItemBase.SetDisabled Zerotorescue@0: Zerotorescue@0: self.SetPoint = ItemBase.SetPoint Zerotorescue@0: self.Show = ItemBase.Show Zerotorescue@0: self.Hide = ItemBase.Hide Zerotorescue@0: Zerotorescue@0: self.SetOnLeave = ItemBase.SetOnLeave Zerotorescue@0: self.SetOnEnter = ItemBase.SetOnEnter Zerotorescue@0: Zerotorescue@0: return self Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: --[[ Zerotorescue@0: Template for items: Zerotorescue@0: Zerotorescue@0: -- Item: Zerotorescue@0: -- Zerotorescue@0: do Zerotorescue@0: local widgetType = "Dropdown-Item-" Zerotorescue@0: local widgetVersion = 1 Zerotorescue@0: Zerotorescue@0: local function Constructor() Zerotorescue@0: local self = ItemBase.Create(widgetType) Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterAsWidget(self) Zerotorescue@0: return self Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) Zerotorescue@0: end Zerotorescue@0: --]] Zerotorescue@0: Zerotorescue@0: -- Item: Header Zerotorescue@0: -- A single text entry. Zerotorescue@0: -- Special: Different text color and no highlight Zerotorescue@0: do Zerotorescue@0: local widgetType = "Dropdown-Item-Header" Zerotorescue@0: local widgetVersion = 1 Zerotorescue@0: Zerotorescue@0: local function OnEnter(this) Zerotorescue@0: local self = this.obj Zerotorescue@0: self:Fire("OnEnter") Zerotorescue@0: Zerotorescue@0: if self.specialOnEnter then Zerotorescue@0: self.specialOnEnter(self) Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local function OnLeave(this) Zerotorescue@0: local self = this.obj Zerotorescue@0: self:Fire("OnLeave") Zerotorescue@0: Zerotorescue@0: if self.specialOnLeave then Zerotorescue@0: self.specialOnLeave(self) Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported, override Zerotorescue@0: local function SetDisabled(self, disabled) Zerotorescue@0: ItemBase.SetDisabled(self, disabled) Zerotorescue@0: if not disabled then Zerotorescue@0: self.text:SetTextColor(1, 1, 0) Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local function Constructor() Zerotorescue@0: local self = ItemBase.Create(widgetType) Zerotorescue@0: Zerotorescue@0: self.SetDisabled = SetDisabled Zerotorescue@0: Zerotorescue@0: self.frame:SetScript("OnEnter", OnEnter) Zerotorescue@0: self.frame:SetScript("OnLeave", OnLeave) Zerotorescue@0: Zerotorescue@0: self.text:SetTextColor(1, 1, 0) Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterAsWidget(self) Zerotorescue@0: return self Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Item: Execute Zerotorescue@0: -- A simple button Zerotorescue@0: do Zerotorescue@0: local widgetType = "Dropdown-Item-Execute" Zerotorescue@0: local widgetVersion = 1 Zerotorescue@0: Zerotorescue@0: local function Frame_OnClick(this, button) Zerotorescue@0: local self = this.obj Zerotorescue@0: if self.disabled then return end Zerotorescue@0: self:Fire("OnClick") Zerotorescue@0: if self.pullout then Zerotorescue@0: self.pullout:Close() Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local function Constructor() Zerotorescue@0: local self = ItemBase.Create(widgetType) Zerotorescue@0: Zerotorescue@0: self.frame:SetScript("OnClick", Frame_OnClick) Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterAsWidget(self) Zerotorescue@0: return self Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Item: Toggle Zerotorescue@0: -- Some sort of checkbox for dropdown menus. Zerotorescue@0: -- Does not close the pullout on click. Zerotorescue@0: do Zerotorescue@0: local widgetType = "Dropdown-Item-Toggle" Zerotorescue@0: local widgetVersion = 3 Zerotorescue@0: Zerotorescue@0: local function UpdateToggle(self) Zerotorescue@0: if self.value then Zerotorescue@0: self.check:Show() Zerotorescue@0: else Zerotorescue@0: self.check:Hide() Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local function OnRelease(self) Zerotorescue@0: ItemBase.OnRelease(self) Zerotorescue@0: self:SetValue(nil) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local function Frame_OnClick(this, button) Zerotorescue@0: local self = this.obj Zerotorescue@0: if self.disabled then return end Zerotorescue@0: self.value = not self.value Zerotorescue@0: if self.value then Zerotorescue@0: PlaySound("igMainMenuOptionCheckBoxOn") Zerotorescue@0: else Zerotorescue@0: PlaySound("igMainMenuOptionCheckBoxOff") Zerotorescue@0: end Zerotorescue@0: UpdateToggle(self) Zerotorescue@0: self:Fire("OnValueChanged", self.value) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: local function SetValue(self, value) Zerotorescue@0: self.value = value Zerotorescue@0: UpdateToggle(self) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: local function GetValue(self) Zerotorescue@0: return self.value Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local function Constructor() Zerotorescue@0: local self = ItemBase.Create(widgetType) Zerotorescue@0: Zerotorescue@0: self.frame:SetScript("OnClick", Frame_OnClick) Zerotorescue@0: Zerotorescue@0: self.SetValue = SetValue Zerotorescue@0: self.GetValue = GetValue Zerotorescue@0: self.OnRelease = OnRelease Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterAsWidget(self) Zerotorescue@0: return self Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Item: Menu Zerotorescue@0: -- Shows a submenu on mouse over Zerotorescue@0: -- Does not close the pullout on click Zerotorescue@0: do Zerotorescue@0: local widgetType = "Dropdown-Item-Menu" Zerotorescue@0: local widgetVersion = 2 Zerotorescue@0: Zerotorescue@0: local function OnEnter(this) Zerotorescue@0: local self = this.obj Zerotorescue@0: self:Fire("OnEnter") Zerotorescue@0: Zerotorescue@0: if self.specialOnEnter then Zerotorescue@0: self.specialOnEnter(self) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: self.highlight:Show() Zerotorescue@0: Zerotorescue@0: if not self.disabled and self.submenu then Zerotorescue@0: self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100) Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local function OnHide(this) Zerotorescue@0: local self = this.obj Zerotorescue@0: if self.submenu then Zerotorescue@0: self.submenu:Close() Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: local function SetMenu(self, menu) Zerotorescue@0: assert(menu.type == "Dropdown-Pullout") Zerotorescue@0: self.submenu = menu Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- exported Zerotorescue@0: local function CloseMenu(self) Zerotorescue@0: self.submenu:Close() Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local function Constructor() Zerotorescue@0: local self = ItemBase.Create(widgetType) Zerotorescue@0: Zerotorescue@0: self.sub:Show() Zerotorescue@0: Zerotorescue@0: self.frame:SetScript("OnEnter", OnEnter) Zerotorescue@0: self.frame:SetScript("OnHide", OnHide) Zerotorescue@0: Zerotorescue@0: self.SetMenu = SetMenu Zerotorescue@0: self.CloseMenu = CloseMenu Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterAsWidget(self) Zerotorescue@0: return self Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Item: Separator Zerotorescue@0: -- A single line to separate items Zerotorescue@0: do Zerotorescue@0: local widgetType = "Dropdown-Item-Separator" Zerotorescue@0: local widgetVersion = 1 Zerotorescue@0: Zerotorescue@0: -- exported, override Zerotorescue@0: local function SetDisabled(self, disabled) Zerotorescue@0: ItemBase.SetDisabled(self, disabled) Zerotorescue@0: self.useHighlight = false Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: local function Constructor() Zerotorescue@0: local self = ItemBase.Create(widgetType) Zerotorescue@0: Zerotorescue@0: self.SetDisabled = SetDisabled Zerotorescue@0: Zerotorescue@0: local line = self.frame:CreateTexture(nil, "OVERLAY") Zerotorescue@0: line:SetHeight(1) Zerotorescue@0: line:SetTexture(.5, .5, .5) Zerotorescue@0: line:SetPoint("LEFT", self.frame, "LEFT", 10, 0) Zerotorescue@0: line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0) Zerotorescue@0: Zerotorescue@0: self.text:Hide() Zerotorescue@0: Zerotorescue@0: self.useHighlight = false Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterAsWidget(self) Zerotorescue@0: return self Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) Zerotorescue@0: end