local addonName, addon = ... local ui = addon:GetModule("Options.UI") local options = addon:NewModule("Options.Menu") local L = LibStub("AceLocale-3.0"):GetLocale(addonName) local function menuItems() local index = 0 return function () index = index + 1 for name, order in pairs(addon.db.profile.menu) do if order == index then return name end end end end local function updateMenuDb(visibleItems) local menu = {} for i, item in visibleItems:Items() do local interface = addon.display:GetInterface(item:GetText()) menu[interface.name] = i end -- Sets items that are not visible with zero so when the list of visible items is empty -- AceDB won't change back to the default profile and everything will reset. for _, interface in addon.display:Interfaces() do local exists = menu[interface.name] if not exists then menu[interface.name] = 0 end end addon.db.profile.menu = menu addon:UpdateMenu() end local function addAvailableItems(availableItems) for _, interface in addon.display:Interfaces() do local order = addon.db.profile.menu[interface.name] if order == 0 then local item = ui:CreateListItem() item:SetText(interface.title) availableItems:AddItem(item) end end end local function addVisibleItems(visibleItems) for name in menuItems() do local interface = addon.display:GetInterface(name) if interface and interface.title then local item = ui:CreateListItem() item:SetText(interface.title) visibleItems:AddItem(item) end end end local function reset(availableItems, visibleItems) visibleItems:Clear() addVisibleItems(visibleItems) updateMenuDb(visibleItems) availableItems:Clear() addAvailableItems(availableItems) addon:UpdateMenu() end function options:OnInitialize() local order = addon.options:AddSubCategory(L["Menu"]) local availableItems = ui:CreateList(order) availableItems:SetTitle("Available Interfaces") availableItems:SetPoint("TOPLEFT", 10, -80) availableItems:SetSize(220, 435) local visibleItems = ui:CreateList(order) visibleItems:SetTitle("Visible Menu Items") visibleItems:SetPoint("TOPLEFT", availableItems, "TOPRIGHT", 23, 0) visibleItems:SetSize(220, 435) reset(availableItems, visibleItems) local addToButton = ui:CreateButton(availableItems) addToButton:SetSize(24, 24) addToButton:SetPoint("CENTER", availableItems, "RIGHT", 12, 0) addToButton:SetNormalTexture([[Interface\Buttons\UI-SpellbookIcon-NextPage-Up]]) addToButton:SetPushedTexture([[Interface\Buttons\UI-SpellbookIcon-NextPage-Down]]) addToButton:OnClick(function() availableItems:MoveSelectedTo(visibleItems) updateMenuDb(visibleItems) end) local removeFromButton = ui:CreateButton(availableItems) removeFromButton:SetSize(24, 24) removeFromButton:SetPoint("TOP", addToButton, "BOTTOM") removeFromButton:SetNormalTexture([[Interface\Buttons\UI-SpellbookIcon-PrevPage-Up]]) removeFromButton:SetPushedTexture([[Interface\Buttons\UI-SpellbookIcon-PrevPage-Down]]) removeFromButton:OnClick(function() visibleItems:MoveSelectedTo(availableItems) updateMenuDb(visibleItems) end) local moveUpButton = ui:CreateButton(visibleItems) moveUpButton:SetSize(24, 24) moveUpButton:SetPoint("TOPLEFT", visibleItems, "TOPRIGHT", 0, 5) moveUpButton:SetNormalTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollUp-Up]]) moveUpButton:SetPushedTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollUp-Down]]) moveUpButton:OnClick(function() visibleItems:MoveSelectedUp() updateMenuDb(visibleItems) end) local moveDownButton = ui:CreateButton(visibleItems) moveDownButton:SetSize(24, 24) moveDownButton:SetPoint("TOP", moveUpButton, "BOTTOM") moveDownButton:SetNormalTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Up]]) moveDownButton:SetPushedTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Down]]) moveDownButton:OnClick(function() visibleItems:MoveSelectedDown() updateMenuDb(visibleItems) end) end