only1yzerman@0: -------- YOU'RE ON YOUR OWN HERE, THIS IS A FRIKKIN MESS - Osmium only1yzerman@0: -------- Challenge Accepted - Whyzerman only1yzerman@0: only1yzerman@0: local element; only1yzerman@0: local frame; only1yzerman@0: only1yzerman@0: Settings = {}; only1yzerman@0: Settings.MultiZoneMode = 0; only1yzerman@0: Settings.HerbFilter = {}; only1yzerman@0: Settings.OreFilter = {}; only1yzerman@0: Settings.ZoneFilter = {{}, {}, {}, {}, {}}; only1yzerman@0: Settings.InspectionRadius = 60; only1yzerman@0: local function Title(text) only1yzerman@0: local str = frame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge"); only1yzerman@0: str:SetPoint("TOPLEFT", element, "TOPLEFT", 16, -16); only1yzerman@0: str:SetJustifyH("LEFT"); only1yzerman@0: str:SetJustifyV("TOP"); only1yzerman@0: str:SetText(text); only1yzerman@0: element = str; only1yzerman@0: end only1yzerman@0: only1yzerman@0: local function Column2(offset) only1yzerman@0: local str = frame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge"); only1yzerman@0: str:SetPoint("TOPLEFT", element, "TOPRIGHT", -offset, -16); only1yzerman@0: str:SetText(" "); only1yzerman@0: element = str; only1yzerman@0: end only1yzerman@0: only1yzerman@0: local function Heading(text) only1yzerman@0: local str = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight"); only1yzerman@0: str:SetPoint("TOPLEFT", element, "BOTTOMLEFT", 0, -8); only1yzerman@0: str:SetText(text); only1yzerman@0: element = str; only1yzerman@0: end only1yzerman@0: only1yzerman@0: local ddCount = 0; only1yzerman@0: only1yzerman@0: local function DropDown(settings, key, width, init) only1yzerman@0: ddCount = ddCount + 1; only1yzerman@0: local dd = CreateFrame("Frame", "dropDown"..ddCount, frame, "UIDropDownMenuTemplate"); only1yzerman@0: dd:EnableMouse(true); only1yzerman@0: dd:SetPoint("TOPLEFT", element, "BOTTOMLEFT", 0, -8); only1yzerman@0: dd.State = {}; only1yzerman@0: UIDropDownMenu_Initialize(dd, init); only1yzerman@0: UIDropDownMenu_SetWidth(dd, width); only1yzerman@0: UIDropDownMenu_JustifyText(dd, "LEFT"); only1yzerman@0: UIDropDownMenu_SetSelectedValue(dd, settings[key]); only1yzerman@0: element = dd; only1yzerman@0: end only1yzerman@0: only1yzerman@0: function AddButton(settings, key, menu, label, value) only1yzerman@0: local info = UIDropDownMenu_CreateInfo(); only1yzerman@0: info.text = label; only1yzerman@0: info.value = value; only1yzerman@0: info.owner = menu; only1yzerman@0: info.func = function() only1yzerman@0: UIDropDownMenu_SetSelectedValue(menu, value); only1yzerman@0: settings[key] = value; only1yzerman@0: Bloodhound2.UpdateMinimap(); only1yzerman@0: end; only1yzerman@0: UIDropDownMenu_AddButton(info); only1yzerman@0: end only1yzerman@0: only1yzerman@0: local cbCount = 0; only1yzerman@0: only1yzerman@0: function CheckBox(label, value, relative, anchor, dx, dy, state) only1yzerman@0: cbCount = cbCount + 1; only1yzerman@0: local cb = CreateFrame("CheckButton", "checkBox"..cbCount, frame, "UICheckButtonTemplate"); only1yzerman@0: cb:SetWidth(16); only1yzerman@0: cb:SetHeight(16); only1yzerman@0: cb:SetPoint("TOPLEFT", relative, anchor, dx, dy); only1yzerman@0: local text = getglobal(cb:GetName() .. "Text"); only1yzerman@0: text:SetText(label); only1yzerman@0: cb:SetChecked(not state[value]); only1yzerman@0: cb:SetScript("OnClick", function(self) only1yzerman@0: if (self:GetChecked()) then only1yzerman@0: state[value] = nil; only1yzerman@0: else only1yzerman@0: state[value] = 1; only1yzerman@0: end only1yzerman@0: Bloodhound2.UpdateMinimap(); only1yzerman@0: end); only1yzerman@0: element = cb; only1yzerman@0: return text:GetWidth(); only1yzerman@0: end only1yzerman@0: only1yzerman@0: function ContinentName() only1yzerman@0: return select(GetCurrentMapContinent(), GetMapContinents()); only1yzerman@0: end only1yzerman@0: only1yzerman@0: function CheckBoxes(table, state) only1yzerman@0: local relative; only1yzerman@0: local bottom; only1yzerman@0: local height = 1; only1yzerman@0: local maxWidth = 0; only1yzerman@0: local i = 0; only1yzerman@0: local checkboxes = {}; only1yzerman@0: only1yzerman@0: for k, v in pairs(table) do only1yzerman@0: height = height + 1; only1yzerman@0: end only1yzerman@0: only1yzerman@0: height = floor(height / 2); only1yzerman@0: if height > 19 then height = 19; end; only1yzerman@0: only1yzerman@0: for k, v in pairs(table) do only1yzerman@0: i = i + 1; only1yzerman@0: if (i > 1) and (mod(i, height) == 1) then only1yzerman@0: width = CheckBox(v, k, relative, "TOPRIGHT", maxWidth + 6, 0, state); only1yzerman@0: relative = element; only1yzerman@0: maxWidth = width; only1yzerman@0: else only1yzerman@0: width = CheckBox(v, k, element, "BOTTOMLEFT", 0, 0, state); only1yzerman@0: if (i == 1) then relative = element; end; only1yzerman@0: maxWidth = max(width, maxWidth); only1yzerman@0: end only1yzerman@0: if (i == height) then bottom = element; end; only1yzerman@0: checkboxes[k] = element; only1yzerman@0: end only1yzerman@0: only1yzerman@0: local button = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate"); only1yzerman@0: button:SetText(L["All"]); only1yzerman@0: local allWidth = button:GetTextWidth() + 30; only1yzerman@0: button:SetWidth(allWidth); only1yzerman@0: button:SetHeight(22); only1yzerman@0: button:SetPoint("TOPLEFT", bottom, "TOPLEFT", 0, -20); only1yzerman@0: button:SetScript("OnClick", only1yzerman@0: function(self, button, down) only1yzerman@0: for k, v in pairs(table) do only1yzerman@0: checkboxes[k]:SetChecked(true); only1yzerman@0: state[k] = nil; only1yzerman@0: end only1yzerman@0: end only1yzerman@0: ); only1yzerman@0: only1yzerman@0: element = button; only1yzerman@0: only1yzerman@0: local button = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate"); only1yzerman@0: button:SetText(L["None"]); only1yzerman@0: button:SetWidth(button:GetTextWidth() + 30); only1yzerman@0: button:SetHeight(22); only1yzerman@0: button:SetPoint("TOPLEFT", bottom, "TOPLEFT", allWidth + 20, -20); only1yzerman@0: button:SetScript("OnClick", only1yzerman@0: function(self, button, down) only1yzerman@0: for k, v in pairs(table) do only1yzerman@0: checkboxes[k]:SetChecked(false); only1yzerman@0: state[k] = 1; only1yzerman@0: end only1yzerman@0: end only1yzerman@0: ); only1yzerman@0: end only1yzerman@0: only1yzerman@0: function AddZones(...) only1yzerman@0: local table = {}; only1yzerman@0: only1yzerman@0: for i=1,select("#", ...),1 do only1yzerman@0: table[i] = select(i, ...); only1yzerman@0: end only1yzerman@0: only1yzerman@0: if not Settings.ZoneFilter then only1yzerman@0: Settings.ZoneFilter = {{},{},{},{},{}}; only1yzerman@0: end only1yzerman@0: only1yzerman@0: local c = GetCurrentMapContinent() only1yzerman@0: only1yzerman@0: if not Settings.ZoneFilter[c] then only1yzerman@0: Settings.ZoneFilter[c] = {} only1yzerman@0: end only1yzerman@0: only1yzerman@0: CheckBoxes(table, Settings.ZoneFilter[c]); only1yzerman@0: end only1yzerman@0: only1yzerman@0: function AddHerbs() only1yzerman@0: local table = {}; only1yzerman@0: only1yzerman@0: for h, v in pairs(Bloodhound2.ContinentHerbs) do only1yzerman@0: local name = L[h]; only1yzerman@0: if not name then name="Herb "..h; end; only1yzerman@0: table[h] = name; only1yzerman@0: end only1yzerman@0: only1yzerman@0: if not Settings.HerbFilter then only1yzerman@0: Settings.HerbFilter = {}; only1yzerman@0: end only1yzerman@0: only1yzerman@0: CheckBoxes(table, Settings.HerbFilter); only1yzerman@0: end only1yzerman@0: only1yzerman@0: function AddOre() only1yzerman@0: local table = {}; only1yzerman@0: only1yzerman@0: for h, v in pairs(Bloodhound2.ContinentOre) do only1yzerman@0: local name = L[h]; only1yzerman@0: if not name then name="Ore "..h; end; only1yzerman@0: table[h] = name; only1yzerman@0: end only1yzerman@0: only1yzerman@0: if not Settings.OreFilter then only1yzerman@0: Settings.OreFilter = {}; only1yzerman@0: end only1yzerman@0: only1yzerman@0: CheckBoxes(table, Settings.OreFilter); only1yzerman@0: end only1yzerman@0: only1yzerman@0: local function CopyTable(table) only1yzerman@0: local copy = {}; only1yzerman@0: for k,v in pairs(table) do only1yzerman@0: if (type(v) == "table") then only1yzerman@0: copy[k] = CopyTable(v); only1yzerman@0: else only1yzerman@0: copy[k] = v; only1yzerman@0: end only1yzerman@0: end only1yzerman@0: return copy; only1yzerman@0: end only1yzerman@0: only1yzerman@0: local configFrame; only1yzerman@0: local BackupSettings; only1yzerman@0: only1yzerman@0: local function RefreshConfigFrame() only1yzerman@0: if (configFrame) then only1yzerman@0: configFrame:Hide(); only1yzerman@0: end only1yzerman@0: only1yzerman@0: BackupSettings = CopyTable(Settings); only1yzerman@0: only1yzerman@0: configFrame = CreateFrame("Frame", nil, Bloodhound2.panel); only1yzerman@0: configFrame:SetAllPoints(Bloodhound2.panel); only1yzerman@0: frame = configFrame; only1yzerman@0: element = frame; only1yzerman@0: Title(L["Bloodhound2 Options"]); only1yzerman@0: Heading(L["Multi-Zone"]); only1yzerman@0: DropDown(Settings, "MultiZoneMode", 120, function(menu) only1yzerman@0: AddButton(Settings, "MultiZoneMode", menu, L["While flying"], 0); only1yzerman@0: AddButton(Settings, "MultiZoneMode", menu, L["Always"], 1); only1yzerman@0: AddButton(Settings, "MultiZoneMode", menu, L["Never"], 2); only1yzerman@0: end); only1yzerman@0: Heading(L["Zones"].." ("..ContinentName()..")"); only1yzerman@0: AddZones(GetMapZones(GetCurrentMapContinent())); only1yzerman@0: element = frame; only1yzerman@0: Column2(150); only1yzerman@0: Heading(L["Inspection radius"]); only1yzerman@0: DropDown(Settings, "InspectionRadius", 70, function(menu) only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 30, 30); only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 35, 35); only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 40, 40); only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 45, 45); only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 50, 50); only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 60, 60); only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 70, 70); only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 80, 80); only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 90, 90); only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 100, 100); only1yzerman@0: AddButton(Settings, "InspectionRadius", menu, 120, 120); only1yzerman@0: end); only1yzerman@0: end only1yzerman@0: only1yzerman@0: local herbFrame; only1yzerman@0: only1yzerman@0: local function RefreshHerbs() only1yzerman@0: if (herbFrame) then herbFrame:Hide(); end; only1yzerman@0: herbFrame = CreateFrame("Frame", nil, Bloodhound2.herbPanel); only1yzerman@0: herbFrame:SetAllPoints(Bloodhound2.herbPanel); only1yzerman@0: frame = herbFrame; only1yzerman@0: element = frame; only1yzerman@0: Title(L["Bloodhound2 Options"]); only1yzerman@0: Heading(L["Herbs"].." ("..ContinentName()..")"); only1yzerman@0: AddHerbs(); only1yzerman@0: end only1yzerman@0: only1yzerman@0: local oreFrame; only1yzerman@0: only1yzerman@0: local function RefreshOre() only1yzerman@0: if (oreFrame) then oreFrame:Hide(); end; only1yzerman@0: oreFrame= CreateFrame("Frame", nil, Bloodhound2.orePanel); only1yzerman@0: oreFrame:SetAllPoints(Bloodhound2.orePanel); only1yzerman@0: frame = oreFrame; only1yzerman@0: element = frame; only1yzerman@0: Title(L["Bloodhound2 Options"]); only1yzerman@0: Heading(L["Minerals"].." ("..ContinentName()..")"); only1yzerman@0: AddOre(); only1yzerman@0: end only1yzerman@0: only1yzerman@0: local function RestoreHerbDefaults() only1yzerman@0: Settings.HerbFilter = {}; only1yzerman@0: end only1yzerman@0: only1yzerman@0: local function RestoreOreDefaults() only1yzerman@0: Settings.OreFilter = {}; only1yzerman@0: end only1yzerman@0: only1yzerman@0: local function RestoreZoneDefaults() only1yzerman@0: Settings.MultiZoneMode = 0; only1yzerman@0: Settings.InspectionRadius = 60; only1yzerman@0: Settings.ZoneFilter[GetCurrentMapContinent()] = {}; only1yzerman@0: end only1yzerman@0: only1yzerman@0: Bloodhound2.panel = CreateFrame("FRAME", "Bloodhound2", Bloodhound2.Frame); only1yzerman@0: Bloodhound2.panel.name = L["Bloodhound2"]; only1yzerman@0: Bloodhound2.panel.default = RestoreZoneDefaults; only1yzerman@0: Bloodhound2.panel.okay = function() end; only1yzerman@0: Bloodhound2.panel.cancel = function() Settings = BackupSettings; Bloodhound2.UpdateMinimap(); end; only1yzerman@0: Bloodhound2.panel.refresh = RefreshConfigFrame; only1yzerman@0: InterfaceOptions_AddCategory(Bloodhound2.panel); only1yzerman@0: only1yzerman@0: Bloodhound2.herbPanel = CreateFrame("FRAME", "Bloodhound2_Herbs", Bloodhound2.Frame); only1yzerman@0: Bloodhound2.herbPanel.name = L["Herbs"]; only1yzerman@0: Bloodhound2.herbPanel.parent = "Bloodhound2"; only1yzerman@0: Bloodhound2.herbPanel.default = RestoreHerbDefaults; only1yzerman@0: Bloodhound2.herbPanel.okay = function() end; only1yzerman@0: Bloodhound2.herbPanel.cancel = function() end; only1yzerman@0: Bloodhound2.herbPanel.refresh = RefreshHerbs; only1yzerman@0: InterfaceOptions_AddCategory(Bloodhound2.herbPanel); only1yzerman@0: only1yzerman@0: Bloodhound2.orePanel = CreateFrame("FRAME", "Bloodhound2_Ore", Bloodhound2.Frame); only1yzerman@0: Bloodhound2.orePanel.name = L["Minerals"]; only1yzerman@0: Bloodhound2.orePanel.parent = "Bloodhound2"; only1yzerman@0: Bloodhound2.orePanel.default = RestoreOreDefaults; only1yzerman@0: Bloodhound2.orePanel.okay = function() end; only1yzerman@0: Bloodhound2.orePanel.cancel = function() end; only1yzerman@0: Bloodhound2.orePanel.refresh = RefreshOre; only1yzerman@0: InterfaceOptions_AddCategory(Bloodhound2.orePanel); only1yzerman@0: