assert(LibStub, "EasyDisplay-1.0 requires LibStub") local lib, minor = LibStub:NewLibrary("EasyDisplay-1.0", 13) if not lib then return end minor = minor or 0 local GetUIPanel = GetUIPanel local HideUIPanel = HideUIPanel local ShowUIPanel = ShowUIPanel local UIPanelWindows = UIPanelWindows --[[ LOCALIZATION ]] local BAGS = "Bags" local CALENDAR = "Calendar" local CHARACTER_MSG = "|cffFFFF00Cannot display interface '%s' because the character level is too low.|r" --[[ INTERFACES ]] --[[ name (string) The name to access the interface. title (string) A human-readable name that describes the interface. alias (string) An optional name to access the interface. frameName (string) The name of the frame as it appears in the UIPanelWindows table or the name of the frame as it appears in the ProtectedFrames table. button (frame) The button that responsible to open the interface in the default UI. level (number) The minimum level that is required to display the interface to the player. func (function) The function that responsible to display the interface. special (boolean) Indicates that it requires special handling before it can be displayed. secure (boolean) Indicates that it needs to be opened from a secure context. command (string) The name of the command for key bindings. ]] local interfaces = { { name = "achievements", title = ACHIEVEMENT_BUTTON, alias = "achi", frameName = "AchievementFrame", button = AchievementMicroButton, command = "TOGGLEACHIEVEMENT", func = function() ToggleAchievementFrame() end, }, { name = "addons", title = ADDONS, frameName = "AddonList", special = true, func = function() if not AddonList:IsVisible() then ShowUIPanel(AddonList) AddonList.hideMenu = true else HideUIPanel(AddonList) end end, }, { name = "backpack", title = BACKPACK_TOOLTIP, command = "TOGGLEBACKPACK", func = function() if IsModifierKeyDown() then ToggleAllBags() else ToggleBackpack() end end, }, { name = "bags", title = BAGS, command = "OPENALLBAGS", func = function() ToggleAllBags() end, }, { name = "calendar", title = CALENDAR, alias = "cal", frameName = "CalendarFrame", func = function() ToggleCalendar() end, }, { name = "character", title = CHARACTER_BUTTON, alias = "char", frameName = "CharacterFrame", --button = CharacterMicroButton, command = "TOGGLECHARACTER0", func = function() ToggleCharacter("PaperDollFrame") end, }, { name = "collections", title = COLLECTIONS, alias = "pets", frameName = "PetJournalParent", button = CompanionsMicroButton, secure = true, command = "TOGGLECOLLECTIONS", func = function() ToggleCollectionsJournal() end, }, { name = "guild", title = LOOKINGFORGUILD, frameName = "GuildFrame", button = GuildMicroButton, secure = true, command = "TOGGLEGUILDTAB", func = function() ToggleGuildFrame() end, }, { name = "help", title = HELP_BUTTON, frameName = "HelpFrame", button = HelpMicroButton, func = function() ToggleHelpFrame() end, }, { name = "interface", title = UIOPTIONS_MENU, frameName = "InterfaceOptionsFrame", secure = true, special = true, func = function() if not InterfaceOptionsFrame:IsVisible() then ShowUIPanel(InterfaceOptionsFrame) InterfaceOptionsFrame.lastFrame = GameMenuFrame InterfaceOptionsFrame.hideMenu = true else HideUIPanel(InterfaceOptionsFrame) end end, }, { name = "journal", title = ENCOUNTER_JOURNAL, frameName = "EncounterJournal", level = SHOW_LFD_LEVEL, button = EJMicroButton, secure = true, command = "TOGGLEENCOUNTERJOURNAL", func = function() ToggleEncounterJournal() end, }, { name = "keybindings", title = KEY_BINDINGS, alias = "keys", frameName = "KeyBindingFrame", special = true, func = function() if not KeyBindingFrame:IsVisible() then ShowUIPanel(KeyBindingFrame) KeyBindingFrame.hideMenu = true else HideUIPanel(KeyBindingFrame) end end, }, { name = "lfd", title = DUNGEONS_BUTTON, frameName = "LFDParentFrame", level = SHOW_LFD_LEVEL, button = LFDMicroButton, secure = true, command = "TOGGLEGROUPFINDER", func = function() ToggleLFDParentFrame() end, }, { name = "lfr", title = RAID_FINDER, frameName = "LFRParentFrame", level = SHOW_LFD_LEVEL, func = function() ToggleRaidFrame() end, }, { name = "mac", title = MAC_OPTIONS, frameName = "MacOptionsFrame", special = true, func = function() if not MacOptionsFrame:IsVisible() then ShowUIPanel(MacOptionsFrame) MacOptionsFrame.hideMenu = true else HideUIPanel(MacOptionsFrame) end end, }, { name = "macro", title = MACROS, frameName = "MacroFrame", special = true, func = function() if not MacroFrame:IsVisible() then ShowUIPanel(MacroFrame) else HideUIPanel(MacroFrame) end end, }, { name = "mainmenu", title = MAINMENU_BUTTON, alias = "menu", frameName = "GameMenuFrame", --button = MainMenuMicroButton, command = "TOGGLEGAMEMENU", func = function() -- Calling ToggleGameMenu() causes the UI to taint. if not GameMenuFrame:IsShown() then if VideoOptionsFrame:IsShown() then VideoOptionsFrameCancel:Click() elseif AudioOptionsFrame:IsShown() then AudioOptionsFrameCancel:Click() elseif InterfaceOptionsFrame:IsShown() then InterfaceOptionsFrameCancel:Click() end CloseMenus() CloseAllWindows() ShowUIPanel(GameMenuFrame) else HideUIPanel(GameMenuFrame) end end, }, { name = "options", title = SYSTEMOPTIONS_MENU, alias = "system", frameName = "VideoOptionsFrame", secure = true, special = true, func = function() if not VideoOptionsFrame:IsVisible() then ShowUIPanel(VideoOptionsFrame) VideoOptionsFrame.lastFrame = GameMenuFrame VideoOptionsFrame.hideMenu = true else HideUIPanel(VideoOptionsFrame) end end, }, { name = "pvp", title = PLAYER_V_PLAYER, frameName = "PVPFrame", level = SHOW_PVP_LEVEL, button = PVPMicroButton, secure = true, func = function() TogglePVPUI() end, }, { name = "questlog", title = QUESTLOG_BUTTON, alias = "ql", frameName = "QuestLogFrame", button = QuestLogMicroButton, command = "TOGGLEQUESTLOG", func = function() ToggleQuestLog() end, }, { name = "shops", title = BLIZZARD_STORE, func = function() ToggleStoreUI() end, }, { name = "social", title = SOCIAL_BUTTON, alias = "soc", frameName = "FriendsFrame", special = true, func = function() ToggleFriendsFrame() end, }, { name = "spellbook", title = SPELLBOOK_ABILITIES_BUTTON, alias = "sb", frameName = "SpellBookFrame", button = SpellbookMicroButton, secure = true, command = "TOGGLESPELLBOOK", func = function() ToggleFrame(SpellBookFrame) end, }, { name = "talents", title = TALENTS_BUTTON, alias = "tal", frameName = "PlayerTalentFrame", level = SHOW_TALENT_LEVEL, button = TalentMicroButton, secure = true, command = "TOGGLETALENTS", func = function() ToggleTalentFrame() end, }, { name = "time", title = TIMEMANAGER_TITLE, frameName = "TimeManagerFrame", func = function() ToggleTimeManager() end, }, { name = "whatsnew", title = GAMEMENU_NEW_BUTTON, special = true, func = function() SplashFrame_Open() end, } } -- if we're not using a mac client, remove the interface from the table. if IsMacClient() ~= 1 then for i, v in ipairs(interfaces) do if v.name == "mac" then table.remove(interfaces, i) break end end end -- We need to show addons only when we have at least one addon available. if GetNumAddOns() <= 0 then for i, v in ipairs(interfaces) do if v.name == "addons" then table.remove(interfaces, i) break end end end local function comp(a, b) return a.title:lower() < b.title:lower() end table.sort(interfaces, comp) --[[ APIs ]] --[[ GetInterface(name) - Gets the interface by a given name, alias or title. Arguments. name - (string) The name, alias or title of the interface to display. Returns. interface - (table) The interface entry. index - (number) The index of interface in the table. ]] function lib:GetInterface(name) local interface, index = nil, 0 if name and type(name) == "string" then for i, v in ipairs(interfaces) do if v.name == name or v.alias == name or v.title == name then interface = v index = i break end end end return interface, index end --[[ GetInterfaceByIndex(index) - Gets the interface by a given index Arguments. index - (number) The index of the interface to display. Returns. interface - (table) The interface entry. ]] function lib:GetInterfaceByIndex(index) local interface if index and type(index) == "number" then interface = interfaces[index] end return interface end --[[ Interfaces() - Traverses over the interfaces. Returns. iterator - (function) An iterator to traverse over the interfaces. ]] function lib:Interfaces() return ipairs(interfaces) end --[[ InterfacesCount() - Counts the amount if interfaces we have. Returns. iterator - (function) An iterator to traverse over the interfaces. ]] local count = #interfaces function lib:InterfacesCount() return count end --[[ DisplayInterface(name) - Displays the interface. Arguments. name - (string) The key, alias or title of the interface to display. ]] -- A list of all the interfaces that require the GameMenuFrame to be closed before opening them. GameMenu_OptionFrames = { ["VideoOptionsFrame"] = true, ["AudioOptionsFrame"] = true, ["InterfaceOptionsFrame"] = true, ["MacOptionsFrame"] = true, ["KeyBindingFrame"] = true, ["AddonList"] = true } -- A list of all of the interfaces that must be loaded before they can be displayed. LoD_AddonFrames = { ["PlayerTalentFrame"] = TalentFrame_LoadUI, ["AchievementFrame"] = AchievementFrame_LoadUI, ["CalendarFrame"] = Calendar_LoadUI, ["KeyBindingFrame"] = KeyBindingFrame_LoadUI, ["MacroFrame"] = MacroFrame_LoadUI, ["TimeManagerFrame"] = TimeManager_LoadUI, ["GuildFrame"] = GuildFrame_LoadUI, ["EncounterJournal"] = EncounterJournal_LoadUI } -- Hides the GameMenuFrame and resets the hideMenu flag. -- The hideMenu flag dictates whether the GameMenuFrame should be hidden when the interface is closed. local function hideUIPanel(self) if self.hideMenu then HideUIPanel(GameMenuFrame) self.hideMenu = nil end end function lib:DisplayInterface(name) local interface = self:GetInterface(name) if interface and interface.func and type(interface.func) == "function" then if interface.frameName then local playerLevel = UnitLevel("player") -- Check whether the player is in appropriate level for the interface to be displayed. if interface.level and tonumber(interface.level) and playerLevel < interface.level then print(CHARACTER_MSG:format(interface.frameName)) return end local loadLoD = LoD_AddonFrames[interface.frameName] -- Check whether it should preload the associated addon. if loadLoD then loadLoD() end -- Manages the display of the interfaces. local panel = UIPanelWindows[interface.frameName] local centerFrame = not (GetUIPanel("left") or GetUIPanel("right") or GetUIPanel("doublewide")) and GetUIPanel("center") if panel and panel.area ~= "center" and centerFrame and centerFrame:IsShown() then HideUIPanel(centerFrame) end -- Display the interface. interface.func() -- This hides the GameMenuFrame when the interface is opened through this function. if GameMenu_OptionFrames[interface.frameName] then local frame = _G[interface.frameName] if frame then frame:HookScript("OnHide", hideUIPanel) end GameMenu_OptionFrames[interface.frameName] = nil end -- The interface does not have a frameName entry so just run the function to display it. else interface.func() end end end