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