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