local GatherMate = LibStub("AceAddon-3.0"):GetAddon("GatherMate2") local Config = GatherMate:NewModule("Config","AceEvent-3.0") local Display = GatherMate:GetModule("Display") local L = LibStub("AceLocale-3.0"):GetLocale("GatherMate2", false) -- Databroker support local DataBroker = LibStub:GetLibrary("LibDataBroker-1.1",true) local SaveBindings = SaveBindings or AttemptToSaveBindings --[[ Code here for configuring the mod, and making the minimap button ]] -- Setup keybinds (these need to be global strings to show up properly in ESC -> Key Bindings) BINDING_HEADER_GatherMate2 = "GatherMate2" BINDING_NAME_TOGGLE_GATHERMATE2_MINIMAPICONS = L["Keybind to toggle Minimap Icons"] BINDING_NAME_TOGGLE_GATHERMATE2_MAINMAPICONS = L["Keybind to toggle Worldmap Icons"] -- A helper function for keybindings local KeybindHelper = {} do local t = {} function KeybindHelper:MakeKeyBindingTable(...) for k in pairs(t) do t[k] = nil end for i = 1, select("#", ...) do local key = select(i, ...) if key ~= "" then tinsert(t, key) end end return t end end local prof_options = { always = L["Always show"], with_profession = L["Only with profession"], active = L["Only while tracking"], never = L["Never show"], } local prof_options2 = { -- For Gas, which doesn't have tracking as a skill always = L["Always show"], with_profession = L["Only with profession"], never = L["Never show"], } local prof_options3 = { always = L["Always show"], active = L["Only while tracking"], never = L["Never show"], } local prof_options4 = { -- For Archaeology, which doesn't have tracking as a skill always = L["Always show"], active = L["Only with digsite"], with_profession = L["Only with profession"], never = L["Never show"], } local db local imported = {} -- setup the options, we need to reference GatherMate for this local function get(k) return db[k.arg] end local function set(k, v) db[k.arg] = v; Config:UpdateConfig(); end local generalOptions = { type = "group", get = function(k) return db.show[k.arg] end, set = function(k, v) db.show[k.arg] = v; Config:UpdateConfig(); end, args = { desc = { order = 0, type = "description", name = L["Selected databases are shown on both the World Map and Minimap."], }, showMinerals = { order = 1, name = L["Show Mining Nodes"], desc = L["Toggle showing mining nodes."], type = "select", values = prof_options, arg = "Mining" }, showHerbs = { order = 2, name = L["Show Herbalism Nodes"], desc = L["Toggle showing herbalism nodes."], type = "select", values = prof_options, arg = "Herb Gathering" }, showFishes = { order = 3, name = L["Show Fishing Nodes"], desc = L["Toggle showing fishing nodes."], type = "select", values = prof_options, arg = "Fishing" }, showGases = { order = 4, name = L["Show Gas Clouds"], desc = L["Toggle showing gas clouds."], type = "select", values = prof_options2, arg = "Extract Gas", }, showTreasure = { order = 5, name = L["Show Treasure Nodes"], desc = L["Toggle showing treasure nodes."], type = "select", values = prof_options3, arg = "Treasure" }, showArchaeology = { order = 6, name = L["Show Archaeology Nodes"], desc = L["Toggle showing archaeology nodes."], type = "select", values = prof_options4, arg = "Archaeology", }, showTimber = { order = 7, name = L["Show Timber Nodes"], desc = L["Toggle showing timber nodes."], type = "select", values = prof_options3, arg = "Logging", }, }, } local minimapOptions = { type = "group", get = get, set = set, args = { desc = { order = 0, type = "description", name = L["Control various aspects of node icons on both the World Map and Minimap."], }, showWorldMapIcons = { order = 1, name = L["Show World Map Icons"], desc = L["Toggle showing World Map icons."], type = "toggle", arg = "showWorldMap", width = "full", }, worldMapIconsInteractive = { order = 1.5, name = L["World Map Icons Clickable"], desc = L["Toggle if World Map icons are clickable (to remove them or generate way points)."], type = "toggle", arg = "worldMapIconsInteractive", width = "full", disabled = function() return not db.showWorldMap end, }, showMinimapIcons = { order = 2, name = L["Show Minimap Icons"], desc = L["Toggle showing Minimap icons."], type = "toggle", arg = "showMinimap", width = "full", }, minimapTooltips = { order = 3, name = L["Minimap Icon Tooltips"], desc = L["Toggle showing Minimap icon tooltips."], type = "toggle", arg = "minimapTooltips", width = "full", disabled = function() return not db.showMinimap end, }, minimapNodeRange = { order = 4, type = "toggle", name = L["Show Nodes on Minimap Border"], desc = L["Shows more Nodes that are currently out of range on the minimap's border."], arg = "nodeRange", width = "full", disabled = function() return not db.showMinimap end, }, togglekey = { order = 5, name = L["Keybind to toggle Minimap Icons"], desc = L["Keybind to toggle Minimap Icons"], type = "keybinding", width = "full", get = function(info) return table.concat(KeybindHelper:MakeKeyBindingTable(GetBindingKey("TOGGLE_GATHERMATE2_MINIMAPICONS")), ", ") end, set = function(info, key) if key == "" then local t = KeybindHelper:MakeKeyBindingTable(GetBindingKey("TOGGLE_GATHERMATE2_MINIMAPICONS")) for i = 1, #t do SetBinding(t[i]) end else local oldAction = GetBindingAction(key) local frame = LibStub("AceConfigDialog-3.0").OpenFrames["GatherMate"] if frame then if ( oldAction ~= "" and oldAction ~= "TOGGLE_GATHERMATE2_MINIMAPICONS" ) then frame:SetStatusText(KEY_UNBOUND_ERROR:format(GetBindingText(oldAction, "BINDING_NAME_"))) else frame:SetStatusText(KEY_BOUND) end end SetBinding(key, "TOGGLE_GATHERMATE2_MINIMAPICONS") end SaveBindings(GetCurrentBindingSet()) end, }, toggleWkey = { order = 6, name = L["Keybind to toggle Worldmap Icons"], desc = L["Keybind to toggle Worldmap Icons"], type = "keybinding", width = "full", get = function(info) return table.concat(KeybindHelper:MakeKeyBindingTable(GetBindingKey("TOGGLE_GATHERMATE2_MAINMAPICONS")), ", ") end, set = function(info, key) if key == "" then local t = KeybindHelper:MakeKeyBindingTable(GetBindingKey("TOGGLE_GATHERMATE2_MAINMAPICONS")) for i = 1, #t do SetBinding(t[i]) end else local oldAction = GetBindingAction(key) local frame = LibStub("AceConfigDialog-3.0").OpenFrames["GatherMate"] if frame then if ( oldAction ~= "" and oldAction ~= "TOGGLE_GATHERMATE2_MAINMAPICONS" ) then frame:SetStatusText(KEY_UNBOUND_ERROR:format(GetBindingText(oldAction, "BINDING_NAME_"))) else frame:SetStatusText(KEY_BOUND) end end SetBinding(key, "TOGGLE_GATHERMATE2_MAINMAPICONS") end SaveBindings(GetCurrentBindingSet()) end, }, iconScale = { order = 10, name = L["World Map Icon Scale"], desc = L["Icon scaling, this lets you enlarge or shrink your icons on the World Map."], type = "range", min = 0.5, max = 5, step = 0.01, arg = "scale", }, miconScale = { order = 11, name = L["Minimap Icon Scale"], desc = L["Icon scaling, this lets you enlarge or shrink your icons on the Minimap."], type = "range", min = 0.5, max = 5, step = 0.01, arg = "miniscale", }, iconAlpha = { order = 12, name = L["Icon Alpha"], desc = L["Icon alpha value, this lets you change the transparency of the icons. Only applies on World Map."], type = "range", min = 0.1, max = 1, step = 0.05, arg = "alpha", }, tracking = { order = 20, name = L["Tracking Circle Color"], desc = L["Color of the tracking circle."], type = "group", inline = true, get = function(info) local t = db.trackColors[info.arg] return t.Red, t.Green, t.Blue, t.Alpha end, set = function(info, r, g, b, a) local t = db.trackColors[info.arg] t.Red = r t.Green = g t.Blue = b t.Alpha = a Config:UpdateConfig() end, args = { trackingColorMine = { order = 1, name = L["Mineral Veins"], desc = L["Color of the tracking circle."], type = "color", hasAlpha = true, arg = "Mining", }, trackingColorHerb = { order = 2, name = L["Herb Bushes"], desc = L["Color of the tracking circle."], type = "color", hasAlpha = true, arg = "Herb Gathering", }, trackingColorFish = { order = 3, name = L["Fishing"], desc = L["Color of the tracking circle."], type = "color", hasAlpha = true, arg = "Fishing", }, trackingColorGas = { order = 4, name = L["Gas Clouds"], desc = L["Color of the tracking circle."], type = "color", hasAlpha = true, arg = "Extract Gas", }, trackingColorTreasure = { order = 6, name = L["Treasure"], desc = L["Color of the tracking circle."], type = "color", hasAlpha = true, arg = "Treasure", }, trackingColorArchaelogy = { order = 7, name = L["Archaeology"], desc = L["Color of the tracking circle."], type = "color", hasAlpha = true, arg = "Archaeology", }, space = { order = 10, name = "", desc = "", type = "description", width = "full", }, trackDistance = { order = 15, name = L["Tracking Distance"], desc = L["The distance in yards to a node before it turns into a tracking circle"], type = "range", min = 50, max = 240, step = 5, get = get, set = set, arg = "trackDistance", }, trackShow = { order = 20, name = L["Show Tracking Circle"], desc = L["Toggle showing the tracking circle."], type = "select", get = get, set = set, values = prof_options, arg = "trackShow", }, }, }, }, } -- Setup some storage arrays by db to sort node names and zones alphabetically local delocalizedZones = {} local denormalizedNames = {} local sortedFilter = setmetatable({}, {__index = function(t, k) local new = {} table.wipe(delocalizedZones) if k == "zones" then for index, zoneID in pairs(GatherMate.HBD:GetAllMapIDs()) do local name = GatherMate:MapLocalize(zoneID) new[name] = name delocalizedZones[name] = zoneID end else local expansion = GatherMate.nodeExpansion[k] local map = GatherMate.nodeIDs[k] for name in pairs(map) do local idx = #new+1 new[idx] = name denormalizedNames[name] = name end if expansion then -- We only end up creating one function per tracked type anyway table.sort(new, function(a, b) local mA, mB = expansion[map[a]], expansion[map[b]] if not mA or not mB or mA == mB then return map[a] > map[b] else return mA > mB end end) else table.sort(new) end end rawset(t, k, new) return new end}) -- Setup some helper functions local ConfigFilterHelper = {} function ConfigFilterHelper:SelectAll(info) local db = db.filter[info.arg] local nids = GatherMate.nodeIDs[info.arg] for k, v in pairs(nids) do db[v] = true end Config:UpdateConfig() end function ConfigFilterHelper:SelectNone(info) local db = db.filter[info.arg] local nids = GatherMate.nodeIDs[info.arg] for k, v in pairs(nids) do db[v] = false end Config:UpdateConfig() end function ConfigFilterHelper:SetState(info, nodeIndex, state) local nodeName = sortedFilter[info.arg][nodeIndex] if nodeName:find("^%(%d+%)") then nodeName = nodeName:match("^%(%d+%) (.*)$") end db.filter[info.arg][GatherMate.nodeIDs[info.arg][nodeName]] = state Config:UpdateConfig() end function ConfigFilterHelper:GetState(info, nodeIndex) local nodeName = sortedFilter[info.arg][nodeIndex] if nodeName:find("^%(%d+%)") then nodeName = nodeName:match("^%(%d+%) (.*)$") end return db.filter[info.arg][GatherMate.nodeIDs[info.arg][nodeName]] end local ImportHelper = {} function ImportHelper:GetImportStyle(info,k) return db["importers"][info.arg].Style end function ImportHelper:SetImportStyle(info,k,state) db["importers"][info.arg].Style = k end function ImportHelper:GetImportDatabase(info,k) return db["importers"][info.arg].Databases[k] end function ImportHelper:SetImportDatabase(info,k,state) db["importers"][info.arg].Databases[k] = state end function ImportHelper:GetAutoImport(info, k) return db["importers"][info.arg].autoImport end function ImportHelper:SetAutoImport(info,state) db["importers"][info.arg].autoImport = state end function ImportHelper:GetBCOnly(info,k) return db["importers"][info.arg].bcOnly end function ImportHelper:SetBCOnly(info,state) db["importers"][info.arg].bcOnly = state end function ImportHelper:GetExpacOnly(info,k) return db["importers"][info.arg].expacOnly end function ImportHelper:SetExpacOnly(info,state) db["importers"][info.arg].expacOnly = state end function ImportHelper:GetExpac(info,k) return db["importers"][info.arg].expac end function ImportHelper:SetExpac(info,state) db["importers"][info.arg].expac = state end local filterOptions = { type = "group", name = L["Filters"], order = 2, get = get, set = set, childGroups = "tab", handler = ConfigFilterHelper, args = { heading = { order = 0, type = "description", name = L["Filter_Desc"], width = "full", }, }, } filterOptions.args.herbs = { type = "group", name = L["Herbalism"], desc = L["Select the herb nodes you wish to display."], args = { select_all = { order = 1, name = L["Select All"], desc = L["Select all nodes"], type = "execute", func = "SelectAll", arg = "Herb Gathering", }, select_none = { order = 2, desc = L["Clear node selections"], name = L["Select None"], type = "execute", func = "SelectNone", arg = "Herb Gathering", }, herblist = { order = 3, name = L["Herb Bushes"], type = "multiselect", values = sortedFilter["Herb Gathering"], set = "SetState", get = "GetState", arg = "Herb Gathering", }, }, } filterOptions.args.mines = { type = "group", name = L["Mining"], desc = L["Select the mining nodes you wish to display."], args = { select_all = { order = 1, name = L["Select All"], desc = L["Select all nodes"], type = "execute", func = "SelectAll", arg = "Mining", }, select_none = { order = 2, desc = L["Clear node selections"], name = L["Select None"], type = "execute", func = "SelectNone", arg = "Mining", }, minelist = { order = 3, name = L["Mineral Veins"], type = "multiselect", values = sortedFilter["Mining"], set = "SetState", get = "GetState", arg = "Mining", }, }, } filterOptions.args.fish = { type = "group", name = L["Fishing"], args = { select_all = { order = 1, name = L["Select All"], desc = L["Select all nodes"], type = "execute", func = "SelectAll", arg = "Fishing", }, select_none = { order = 2, desc = L["Clear node selections"], name = L["Select None"], type = "execute", func = "SelectNone", arg = "Fishing", }, fishlist = { order = 3, name = L["Fishes"], type = "multiselect", desc = L["Select the fish nodes you wish to display."], values = sortedFilter["Fishing"], set = "SetState", get = "GetState", arg = "Fishing", }, }, } filterOptions.args.gas = { type = "group", name = L["Gas Clouds"], args = { select_all = { order = 1, name = L["Select All"], desc = L["Select all nodes"], type = "execute", func = "SelectAll", arg = "Extract Gas", }, select_none = { order = 2, name = L["Select None"], desc = L["Clear node selections"], type = "execute", func = "SelectNone", arg = "Extract Gas", }, gaslist = { order = 3, name = L["Gas Clouds"], desc = L["Select the gas clouds you wish to display."], type = "multiselect", values = sortedFilter["Extract Gas"], set = "SetState", get = "GetState", arg = "Extract Gas", }, }, } filterOptions.args.treasure = { type = "group", name = L["Treasure"], args = { select_all = { order = 1, name = L["Select All"], desc = L["Select all nodes"], type = "execute", func = "SelectAll", arg = "Treasure", }, select_none = { order = 2, name = L["Select None"], desc = L["Clear node selections"], type = "execute", func = "SelectNone", arg = "Treasure", }, treasurelist = { order = 3, name = L["Treasure"], desc = L["Select the treasure you wish to display."], type = "multiselect", values = sortedFilter["Treasure"], set = "SetState", get = "GetState", arg = "Treasure", }, }, } filterOptions.args.archaeology = { type = "group", name = L["Archaeology"], args = { select_all = { order = 1, name = L["Select All"], desc = L["Select all nodes"], type = "execute", func = "SelectAll", arg = "Archaeology", }, select_none = { order = 2, name = L["Select None"], desc = L["Clear node selections"], type = "execute", func = "SelectNone", arg = "Archaeology", }, diglist = { order = 3, name = L["Archaeology"], desc = L["Select the archaeology nodes you wish to display."], type = "multiselect", values = sortedFilter["Archaeology"], set = "SetState", get = "GetState", arg = "Archaeology", }, }, } local selectedDatabase, selectedNode, selectedZone = "Herb Gathering", 0, nil -- Cleanup config tree local maintenanceOptions = { type = "group", name = L["Database Maintenance"], get = get, set = set, args = { desc = { order = 1, type = "description", name = L["Cleanup_Desc"], }, cleanup = { name = L["Cleanup Database"], desc = L["Cleanup your database by removing duplicates. This takes a few moments, be patient."], type = "execute", handler = GatherMate, func = "CleanupDB", order = 5, width = "full", disabled = function() return GatherMate:IsCleanupRunning() end }, cleanup_range = { order = 10, name = L["Cleanup radius"], type = "group", get = function(info) return db.cleanupRange[info.arg] end, set = function(info, v) db.cleanupRange[info.arg] = v end, args = { desc = { order = 0, type = "description", name = L["CLEANUP_RADIUS_DESC"], }, Mine = { order = 5, name = L["Mineral Veins"], desc = L["Cleanup radius"], type = "range", min = 0, max = 30, step = 1, arg = "Mining", }, Herb = { order = 5, name = L["Herb Bushes"], desc = L["Cleanup radius"], type = "range", min = 0, max = 30, step = 1, arg = "Herb Gathering", }, Fish = { order = 5, name = L["Fishes"], desc = L["Cleanup radius"], type = "range", min = 0, max = 30, step = 1, arg = "Fishing", }, Gas = { order = 5, name = L["Gas Clouds"], desc = L["Cleanup radius"], type = "range", min = 0, max = 100, step = 1, arg = "Extract Gas", }, Treasure = { order = 5, name = L["Treasure"], desc = L["Cleanup radius"], type = "range", min = 0, max = 30, step = 1, arg = "Treasure", }, Archaeology = { order = 5, name = L["Archaeology"], desc = L["Cleanup radius"], type = "range", min = 0, max = 30, step = 1, arg = "Archaeology", } }, }, deleteSelective = { order = 20, name = L["Delete Specific Nodes"], type = "group", args = { desc = { order = 0, type = "description", name = L["DELETE_SPECIFIC_DESC"], }, selectDB = { order = 30, name = L["Select Database"], desc = L["Select Database"], type = "select", values = { ["Fishing"] = L["Fishes"], ["Treasure"] = L["Treasure"], ["Herb Gathering"] = L["Herb Bushes"], ["Mining"] = L["Mineral Veins"], ["Extract Gas"] = L["Gas Clouds"], ["Archaeology"] = L["Archaeology"], }, get = function() return selectedDatabase end, set = function(k, v) selectedDatabase = v selectedNode = 0 end, }, selectNode = { order = 40, name = L["Select Node"], desc = L["Select Node"], type = "select", values = function() return sortedFilter[selectedDatabase] end, get = function() return selectedNode end, set = function(k, v) selectedNode = v end, }, selectZone = { order = 50, name = L["Select Zone"], desc = L["Select Zone"], type = "select", values = sortedFilter["zones"], get = function() return selectedZone end, set = function(k, v) selectedZone = v end, }, delete = { order = 60, name = L["Delete"], desc = L["Delete selected node from selected zone"], type = "execute", confirm = true, confirmText = L["Are you sure you want to delete all of the selected node from the selected zone?"], func = function() if selectedZone and selectedNode ~= 0 then local nodeName = sortedFilter[selectedDatabase][selectedNode] nodeName = denormalizedNames[nodeName] GatherMate:DeleteNodeFromZone(selectedDatabase, GatherMate.nodeIDs[selectedDatabase][nodeName], delocalizedZones[selectedZone]) end end, disabled = function() return selectedNode == 0 or selectedZone == nil end, }, }, }, delete = { order = 30, name = L["Delete Entire Database"], type = "group", func = function(info) GatherMate:ClearDB(info.arg) end, args = { desc = { order = 0, type = "description", name = L["DELETE_ENTIRE_DESC"], }, Mine = { order = 5, name = L["Mineral Veins"], desc = L["Delete Entire Database"], type = "execute", arg = "Mining", confirm = true, confirmText = L["Are you sure you want to delete all nodes from this database?"], }, Herb = { order = 5, name = L["Herb Bushes"], desc = L["Delete Entire Database"], type = "execute", arg = "Herb Gathering", confirm = true, confirmText = L["Are you sure you want to delete all nodes from this database?"], }, Fish = { order = 5, name = L["Fishes"], desc = L["Delete Entire Database"], type = "execute", arg = "Fishing", confirm = true, confirmText = L["Are you sure you want to delete all nodes from this database?"], }, Gas = { order = 5, name = L["Gas Clouds"], desc = L["Delete Entire Database"], type = "execute", arg = "Extract Gas", confirm = true, confirmText = L["Are you sure you want to delete all nodes from this database?"], }, Treasure = { order = 5, name = L["Treasure"], desc = L["Delete Entire Database"], type = "execute", arg = "Treasure", confirm = true, confirmText = L["Are you sure you want to delete all nodes from this database?"], }, Archaeology = { order = 5, name = L["Archaeology"], desc = L["Delete Entire Database"], type = "execute", arg = "Archaeology", confirm = true, confirmText = L["Are you sure you want to delete all nodes from this database?"], }, }, }, dblocking = { order = 11, name = L["Database Locking"], type = "group", get = function(info) return db.dbLocks[info.arg] end, set = function(info,v) db.dbLocks[info.arg] = v end, args = { desc = { order = 0, type = "description", name = L["DATABASE_LOCKING_DESC"], }, Mine = { order = 5, name = L["Mineral Veins"], desc = L["Database locking"], type = "toggle", arg = "Mining", }, Herb = { order = 5, name = L["Herb Bushes"], desc = L["Database locking"], type = "toggle", arg = "Herb Gathering", }, Fish = { order = 5, name = L["Fishes"], desc = L["Database locking"], type = "toggle", arg = "Fishing", }, Gas = { order = 5, name = L["Gas Clouds"], desc = L["Database locking"], type = "toggle", arg = "Extract Gas", }, Treasure = { order = 5, name = L["Treasure"], desc = L["Database locking"], type = "toggle", arg = "Treasure", }, Archaeology = { order = 5, name = L["Archaeology"], desc = L["Database locking"], type = "toggle", arg = "Archaeology", } } }, }, } -- GatherMateData Import config tree local importOptions = { type = "group", name = L["Import Data"], order = 10, args = {}, get = get, set = set, childGroups = "tab", } ImportHelper.db_options = { ["Merge"] = L["Merge"], ["Overwrite"] = L["Overwrite"] } ImportHelper.db_tables = { ["Herbs"] = L["Herbalism"], ["Mines"] = L["Mining"], ["Gases"] = L["Gas Clouds"], ["Fish"] = L["Fishing"], ["Treasure"] = L["Treasure"], ["Archaeology"] = L["Archaeology"], } ImportHelper.expac_data = { ["TBC"] = L["The Burning Crusades"], ["WRATH"] = L["Wrath of the Lich King"], ["CATACLYSM"] = L["Cataclysm"], ["MISTS"] = L["Mists of Pandaria"], ["WOD"] = L["Warlords of Draenor"], ["LEGION"] = L["Legion"], ["BFA"] = L["Battle for Azeroth"], ["SL"] = L["Shadowlands"], ["DF"] = L["Dragonflight"], } imported["GatherMate2_Data"] = false importOptions.args.GatherMateData = { type = "group", name = "GatherMate2Data", -- addon name to import from, don't localize handler = ImportHelper, disabled = function() local name, title, notes, loadable, reason, security, newVersion = GetAddOnInfo("GatherMate2_Data") local enabled = GetAddOnEnableState(UnitName("player"), "GatherMate2_Data") > 0 -- disable if the addon is not enabled, or -- disable if there is a reason why it can't be loaded ("MISSING" or "DISABLED") return not enabled or (reason ~= nil and reason ~= "DEMAND_LOADED") end, args = { desc = { order = 0, type = "description", name = L["Importing_Desc"], }, loadType = { order = 1, name = L["Import Style"], desc = L["Merge will add GatherMate2Data to your database. Overwrite will replace your database with the data in GatherMate2Data"], type = "select", values = ImportHelper.db_options, set = "SetImportStyle", get = "GetImportStyle", arg = "GatherMate2_Data", }, loadDatabase = { order = 2, name = L["Databases to Import"], desc = L["Databases you wish to import"], type = "multiselect", values = ImportHelper.db_tables, set = "SetImportDatabase", get = "GetImportDatabase", arg = "GatherMate2_Data", }, stylebox = { order = 4, type = "group", name = L["Import Options"], inline = true, args = { loadExpacToggle = { order = 4, name = L["Expansion Data Only"], type = "toggle", get = "GetExpacOnly", set = "SetExpacOnly", arg = "GatherMate2_Data" }, loadExpansion = { order = 4, name = L["Expansion"], desc = L["Only import selected expansion data from WoWhead"], type = "select", get = "GetExpac", set = "SetExpac", values = ImportHelper.expac_data, arg = "GatherMate2_Data", }, loadAuto = { order = 5, name = L["Auto Import"], desc = L["Automatically import when ever you update your data module, your current import choice will be used."], type = "toggle", get = "GetAutoImport", set = "SetAutoImport", arg = "GatherMate2_Data", }, } }, loadData = { order = 8, name = L["Import GatherMate2Data"], desc = L["Load GatherMate2Data and import the data to your database."], type = "execute", func = function() local loaded, reason = LoadAddOn("GatherMate2_Data") local GatherMateData = LibStub("AceAddon-3.0"):GetAddon("GatherMate2_Data") if loaded and GatherMateData.generatedVersion then local dataVersion = tonumber(GatherMateData.generatedVersion:match("%d+")) local filter = nil if db.importers["GatherMate2_Data"].expacOnly then filter = db.importers["GatherMate2_Data"].expac end GatherMateData:PerformMerge(db.importers["GatherMate2_Data"].Databases,db.importers["GatherMate2_Data"].Style,filter) GatherMateData:CleanupImportData() print(L["GatherMate2Data has been imported."]) Config:SendMessage("GatherMate2ConfigChanged") db["importers"]["GatherMate2_Data"]["lastImport"] = dataVersion imported["GatherMate2_Data"] = true GatherMate:RemoveDepracatedNodes() else print(L["Failed to load GatherMateData due to "]..reason) end end, disabled = function() local cm = 0 if db["importers"]["GatherMate2_Data"].Databases["Mines"] then cm = 1 end if db["importers"]["GatherMate2_Data"].Databases["Herbs"] then cm = 1 end if db["importers"]["GatherMate2_Data"].Databases["Fish"] then cm = 1 end if db["importers"]["GatherMate2_Data"].Databases["Gases"] then cm = 1 end if db["importers"]["GatherMate2_Data"].Databases["Treasure"] then cm = 1 end if db["importers"]["GatherMate2_Data"].Databases["Archaeology"] then cm = 1 end return imported["GatherMate2_Data"] or (cm == 0 and not imported["GatherMate2_Data"]) end, } }, } local faqOptions = { type = "group", name = L["Frequently Asked Questions"], args = { desc = { type = "description", name = L["FAQ_TEXT"], width = "full", fontSize = "medium", }, }, } --[[ Initialize the Config System ]] local acr = LibStub("AceConfigRegistry-3.0") local acd = LibStub("AceConfigDialog-3.0") local function findPanel(name, parent) for i, button in next, InterfaceOptionsFrameAddOns.buttons do if button.element then if name and button.element.name == name then return button elseif parent and button.element.parent == parent then return button end end end end function Config:OnInitialize() db = GatherMate.db.profile self.importHelper = ImportHelper acr:RegisterOptionsTable("GatherMate 2", generalOptions) local options = acd:AddToBlizOptions("GatherMate 2", "GatherMate 2") if InterfaceOptionsFrameAddOns then options:HookScript("OnShow", function() local p = findPanel("GatherMate 2") if p and p.element.collapsed then OptionsListButtonToggle_OnClick(p.toggle) end end) end acr:RegisterOptionsTable("GM2/Minimap", minimapOptions) acd:AddToBlizOptions("GM2/Minimap", "Minimap", "GatherMate 2") acr:RegisterOptionsTable("GM2/Filter", filterOptions) acd:AddToBlizOptions("GM2/Filter", "Filters", "GatherMate 2") acr:RegisterOptionsTable("GM2/Maintenance", maintenanceOptions) acd:AddToBlizOptions("GM2/Maintenance", "Maintenance", "GatherMate 2") acr:RegisterOptionsTable("GM2/Import", importOptions) acd:AddToBlizOptions("GM2/Import", "Import", "GatherMate 2") acr:RegisterOptionsTable("GM2/Profiles", LibStub("AceDBOptions-3.0"):GetOptionsTable(GatherMate2.db)) acd:AddToBlizOptions("GM2/Profiles", "Profiles", "GatherMate 2") acr:RegisterOptionsTable("GM2/FAQ", faqOptions) acd:AddToBlizOptions("GM2/FAQ", "FAQ", "GatherMate 2") local function openOptions() InterfaceOptionsFrame_OpenToCategory("GatherMate 2") end SLASH_GatherMate21 = "/gathermate" SlashCmdList.GatherMate2 = openOptions self:RegisterMessage("GatherMate2ConfigChanged") if DataBroker then local launcher = DataBroker:NewDataObject("GatherMate2", { type = "launcher", icon = "Interface\\AddOns\\GatherMate2\\Artwork\\Icon.tga", OnClick = function(obj, btn) if btn == "RightButton" then return openOptions() elseif IsShiftKeyDown() then GatherMate2.db.profile.showWorldMap = not GatherMate2.db.profile.showWorldMap else GatherMate2.db.profile.showMinimap = not GatherMate2.db.profile.showMinimap end Config:UpdateConfig() end, OnTooltipShow = function(tip) tip:AddLine("GatherMate2", NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b) tip:AddLine(" ") tip:AddDoubleLine(L["Minimap Icons"], GatherMate2.db.profile.showMinimap and (GREEN_FONT_COLOR_CODE .. L["Enabled"] .. "|r") or (GRAY_FONT_COLOR_CODE .. L["Disabled"] .. "|r")) tip:AddDoubleLine(L["World Map Icons"], GatherMate2.db.profile.showWorldMap and (GREEN_FONT_COLOR_CODE .. L["Enabled"] .. "|r") or (GRAY_FONT_COLOR_CODE .. L["Disabled"] .. "|r")) tip:AddLine(" ") tip:AddLine(L["Click to toggle minimap icons."]) tip:AddLine(L["Shift-click to toggle world map icons."]) tip:AddLine(L["Right-click for options."]) tip:Show() end, }) end end function Config:OnEnable() self:CheckAutoImport() end function Config:UpdateConfig() self:SendMessage("GatherMate2ConfigChanged") end function Config:GatherMate2ConfigChanged() db = GatherMate.db.profile end function Config:CheckAutoImport() for k,v in pairs(db.importers) do local verline = GetAddOnMetadata(k, "X-Generated-Version") if verline and v["autoImport"] then local dataVersion = tonumber(verline:match("%d+")) if dataVersion and dataVersion > v["lastImport"] then local loaded, reason = LoadAddOn(k) if loaded then local addon = LibStub("AceAddon-3.0"):GetAddon(k) local filter = nil if v.expacOnly then filter = v.expac end addon:PerformMerge(v.Databases,v.Style,filter) addon:CleanupImportData() imported[k] = true Config:SendMessage("GatherMate2ConfigChanged") v["lastImport"] = dataVersion print(L["Auto import complete for addon "]..k) end end end end end -- Allows an external import module to insert their aceopttable into the Importing tree -- returns a reference to the saved variables state for the addon function Config:RegisterImportModule(moduleName, optionsTable) importOptions.args[moduleName] = optionsTable return db.importers[moduleName] end -- Allows an external module to insert their aceopttable function Config:RegisterModule(moduleName, optionsTable) acr:RegisterOptionsTable("GM2/" .. moduleName, optionsTable) acd:AddToBlizOptions("GM2/" .. moduleName, moduleName, "GatherMate 2") end