a4blank@8: a4blank@8: a4blank@11: RTT = LibStub("AceAddon-3.0"):NewAddon("RaidTargetTactics", "AceConsole-3.0", "AceEvent-3.0") a4blank@11: local _G = _G a4blank@8: local L = LibStub("AceLocale-3.0"):GetLocale("RaidTargetTactics") a4blank@8: local LDB = LibStub("LibDataBroker-1.1", true) a4blank@8: local LDBIcon = LibStub("LibDBIcon-1.0", true) a4blank@11: local Completion = LibStub("AceGUI-3.0-Completing-EditBox"); a4blank@11: a4blank@11: Completion:Register("Raid", -1, 0) a4blank@11: local GetAutoCompleteResults_original = _G.GetAutoCompleteResults a4blank@11: _G.GetAutoCompleteResults = function(text, include, exclude, results, position) a4blank@11: if include == -1 then -- special hack for Raid members and self a4blank@11: local users = RTT.partyInfo:GetUsers() a4blank@11: local result = {} a4blank@11: for _, name in ipairs(users) do a4blank@11: if name:find(text) == 1 then a4blank@11: table.insert(result, name) a4blank@11: end a4blank@11: if #result > results then a4blank@11: break a4blank@11: end a4blank@11: end a4blank@11: return unpack(result) a4blank@11: else a4blank@11: return GetAutoCompleteResults_original(text, include, exclude, results, position) a4blank@11: end a4blank@11: end a4blank@11: a4blank@8: a4blank@8: local RTTIcon = LibStub("LibDataBroker-1.1"):NewDataObject("RTTIcon", { a4blank@8: type = "data source", a4blank@8: text = "Raid Target Tactics", a4blank@8: icon = "Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_8", a4blank@11: OnClick = function(frame, button) RTT:OnIconClick(frame, button) end, a4blank@8: OnTooltipShow = function(tooltip) a4blank@8: tooltip:AddLine("Raid Target Tactics") a4blank@8: tooltip:AddLine(L.Minimap_Icon_Tooltip) a4blank@8: end, a4blank@8: }) a4blank@8: a4blank@8: local defaults = { a4blank@8: profile = { a4blank@8: visible = true, a4blank@8: minimap = { a4blank@8: hide = false, a4blank@8: }, a4blank@11: setups = {}, a4blank@11: locked = false, a4blank@8: }, a4blank@8: } a4blank@8: a4blank@8: function RTT:OnInitialize() a4blank@8: self.db = LibStub("AceDB-3.0"):New("TacticsSettings", defaults, true) a4blank@11: self.partyInfo = PartyInfo() a4blank@11: self.nameDialog = NameDialog(self:GetSetupNames()) a4blank@8: a4blank@8: LDBIcon:Register("RTTIcon", RTTIcon, self.db.profile.minimap) a4blank@8: self:InitFrame() a4blank@11: self:BindEvents() a4blank@11: self.nameDialog:InitDialog() a4blank@11: self.partyInfo:Update() a4blank@10: if self.f:IsShown() ~= self.db.profile.visible then a4blank@8: if self.db.profile.visible then a4blank@8: self:ShowFrame() a4blank@8: else a4blank@8: self:HideFrame() a4blank@8: end a4blank@8: end a4blank@11: if self.db.profile.locked then a4blank@11: self.f:SetMovable(false) a4blank@11: self.f:EnableMouse(false) a4blank@11: end a4blank@11: end a4blank@11: a4blank@11: function RTT:GetSetupNames() a4blank@11: local result = {} a4blank@11: for name, _ in pairs(self.db.profile.setups) do a4blank@11: table.insert(result, name) a4blank@11: end a4blank@11: return result a4blank@11: end a4blank@11: a4blank@11: function RTT:BindEvents() a4blank@11: self:RegisterEvent("PARTY_MEMBERS_CHANGED") a4blank@11: self:RegisterEvent("RAID_ROSTER_UPDATE") a4blank@11: end a4blank@11: a4blank@11: function RTT:PARTY_MEMBERS_CHANGED() a4blank@11: self.partyInfo:Update() a4blank@11: end a4blank@11: a4blank@11: function RTT:RAID_ROSTER_UPDATE() a4blank@11: self.partyInfo:Update() a4blank@8: end a4blank@8: a4blank@8: function RTT:InitFrame() a4blank@11: self.f = CreateFrame("Frame", "__RTT_MAIN", UIParent) a4blank@10: self.f:SetWidth(300) a4blank@11: self.f:SetHeight(270) a4blank@10: self.f:SetAlpha(0.8) a4blank@11: self.f:SetMovable(true) a4blank@11: self.f:EnableMouse(true) a4blank@11: self.f:RegisterForDrag("LeftButton") a4blank@11: self.f:SetScript("OnDragStart", self.f.StartMoving) a4blank@11: self.f:SetScript("OnDragStop", self.f.StopMovingOrSizing) a4blank@8: self.f:SetPoint("LEFT", UIParent, "LEFT", 10, 0) a4blank@10: --[[self.f:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", a4blank@10: edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", a4blank@10: tile = true, tileSize = 16, edgeSize = 16, a4blank@10: insets = { left = 4, right = 4, top = 4, bottom = 4 }}) a4blank@10: ]] a4blank@10: local backdrop = { a4blank@10: -- path to the background texture a4blank@10: bgFile = "Interface\\FrameGeneral\\UI-Background-Marble", a4blank@10: -- path to the border texture a4blank@10: edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Gold-Border", a4blank@10: -- true to repeat the background texture to fill the frame, false to scale it a4blank@10: tile = true, a4blank@10: -- size (width or height) of the square repeating background tiles (in pixels) a4blank@10: tileSize = 256, a4blank@10: -- thickness of edge segments and square size of edge corners (in pixels) a4blank@10: edgeSize = 32, a4blank@10: -- distance from the edges of the frame to those of the background texture (in pixels) a4blank@10: insets = { a4blank@10: left = 11, a4blank@10: right = 12, a4blank@10: top = 12, a4blank@10: bottom = 11 a4blank@10: } a4blank@10: } a4blank@10: self.f:SetBackdrop(backdrop) a4blank@10: self.f:SetFrameStrata("HIGH") a4blank@10: --self.f:SetBackdropColor(0, 0, 0, 0.5) a4blank@10: a4blank@11: local str1 = self.f:CreateFontString() a4blank@11: str1:SetFontObject(GameFontHighlightSmall) a4blank@11: str1:SetPoint("TOPLEFT", 45, -15) a4blank@11: str1:SetText(L.Action .. ":") a4blank@11: str1:SetTextColor(YELLOW_FONT_COLOR.r, YELLOW_FONT_COLOR.g, YELLOW_FONT_COLOR.b) a4blank@11: str1:Show() a4blank@11: a4blank@11: local str1 = self.f:CreateFontString() a4blank@11: str1:SetFontObject(GameFontHighlightSmall) a4blank@11: str1:SetPoint("TOPLEFT", 175, -15) a4blank@11: str1:SetText(L.Player .. ":") a4blank@11: str1:SetTextColor(YELLOW_FONT_COLOR.r, YELLOW_FONT_COLOR.g, YELLOW_FONT_COLOR.b) a4blank@11: str1:Show() a4blank@11: a4blank@11: self.icons = {} a4blank@10: self.fields = {} a4blank@10: self.selects = {} a4blank@10: for num, icon in ipairs(RaidIcons) do a4blank@11: self.icons[num] = icon a4blank@11: icon:draw(self.f, 16, (num - 1) * -25 - 30) a4blank@10: a4blank@11: local field = RoleField() a4blank@11: field:draw(self.f, 45, (num -1) * -25 - 30) a4blank@11: self.fields[num] = field a4blank@10: a4blank@11: local userSelect = UserSelect() a4blank@11: userSelect:draw(self.f, 170, ((num - 1) * -25) - 30) a4blank@11: self.selects[num] = userSelect a4blank@11: end a4blank@11: self.talkButton = CreateFrame("Button", nil, self.f, "OptionsButtonTemplate") a4blank@11: self.talkButton:ClearAllPoints() a4blank@11: self.talkButton:SetText(L.Announce) a4blank@11: self.talkButton:SetPoint("TOPLEFT", 170, -230) a4blank@11: self.talkButton:SetWidth(102) a4blank@11: self.talkButton:SetScript("OnClick", function() RTT:Announce() end) a4blank@11: a4blank@11: self.dropdown = CreateFrame("Frame", "__RTT_DROPDOWN", UIParent, "UIDropDownMenuTemplate"); a4blank@11: UIDropDownMenu_Initialize(self.dropdown, self.InitDropdown, "MENU"); a4blank@11: end a4blank@11: a4blank@11: function RTT:InitDropdown(level) a4blank@11: level = level or 1 a4blank@11: if (level == 1) then a4blank@11: local info = UIDropDownMenu_CreateInfo() a4blank@11: info.hasArrow = false a4blank@11: info.notCheckable = false a4blank@11: info.text = L.Lock a4blank@11: info.func = function() RTT:ToggleMovable() end a4blank@11: info.keepShownOnClick = true a4blank@11: info.checked = RTT.db.profile.locked a4blank@11: UIDropDownMenu_AddButton(info, level) a4blank@11: a4blank@11: info.hasArrow = true a4blank@11: info.notCheckable = true a4blank@11: info.text = L.Load a4blank@11: info.value = "load" a4blank@11: info.keepShownOnClick = false a4blank@11: UIDropDownMenu_AddButton(info, level) a4blank@11: a4blank@11: info.hasArrow = false a4blank@11: info.notCheckable = true a4blank@11: info.text = L.Save .. "…" a4blank@11: info.keepShownOnClick = false a4blank@11: local rows = RTT:GetFormData() a4blank@11: if #rows == 0 then a4blank@11: info.disabled = true a4blank@11: else a4blank@11: info.func = function() RTT:AskForSave() end a4blank@10: end a4blank@11: UIDropDownMenu_AddButton(info, level) a4blank@11: end a4blank@11: a4blank@11: if (level == 2 and UIDROPDOWNMENU_MENU_VALUE == "load") then a4blank@11: local info = UIDropDownMenu_CreateInfo(); a4blank@11: for key, setup in pairs(RTT.db.profile.setups) do a4blank@11: info.hasArrow = false a4blank@11: info.notCheckable = true a4blank@11: info.text = key a4blank@11: info.func = function() RTT:Load(key) end a4blank@11: UIDropDownMenu_AddButton(info, level); a4blank@11: end a4blank@10: end a4blank@8: end a4blank@8: a4blank@11: function RTT:AskForSave() a4blank@11: local this = self a4blank@11: self.nameDialog:Show() a4blank@11: self.nameDialog:OnNameChosen(function(name) this:Save(name) end) a4blank@11: end a4blank@11: a4blank@11: function RTT:Save(name) a4blank@11: self.db.profile.setups[name] = self:GetFormData(true) a4blank@11: self.nameDialog:SetInvalidNames(self:GetSetupNames()) a4blank@11: end a4blank@11: a4blank@11: function RTT:Load(name) a4blank@11: local data = self.db.profile.setups[name] a4blank@11: self:SetFormData(data) a4blank@11: end a4blank@11: a4blank@11: function RTT:OnIconClick(frame, button) a4blank@11: if button == "RightButton" then a4blank@11: -- context menu a4blank@11: ToggleDropDownMenu(1, nil, self.dropdown, LDBIcon.objects["RTTIcon"], 0, 0) a4blank@8: else a4blank@11: if self.db.profile.visible then a4blank@11: self:HideFrame() a4blank@11: else a4blank@11: self:ShowFrame() a4blank@11: end a4blank@11: self.db.profile.visible = not self.db.profile.visible a4blank@8: end a4blank@8: end a4blank@8: a4blank@8: function RTT:HideFrame() a4blank@8: self.f:Hide() a4blank@8: end a4blank@8: a4blank@8: function RTT:ShowFrame() a4blank@8: self.f:Show() a4blank@8: end a4blank@8: a4blank@11: function RTT:ToggleMovable() a4blank@11: if self.f:IsMovable() then a4blank@11: self.f:SetMovable(false) a4blank@11: self.f:EnableMouse(false) a4blank@11: self.db.profile.locked = true a4blank@11: else a4blank@11: self.f:SetMovable(true) a4blank@11: self.f:EnableMouse(true) a4blank@11: self.db.profile.locked = false a4blank@11: end a4blank@11: end a4blank@8: a4blank@11: function RTT:GetDefaultChatChannel() a4blank@11: if self.partyInfo.is_in_raid then a4blank@11: return "RAID" a4blank@11: end a4blank@11: if self.partyInfo.is_in_party then a4blank@11: return "PARTY" a4blank@11: end a4blank@11: return nil a4blank@11: end a4blank@8: a4blank@11: function RTT:SetFormData(data) a4blank@11: for idx, row in ipairs(data) do a4blank@11: self.fields[idx]:SetText(row[2]) a4blank@11: self.selects[idx]:SetText(row[3]) a4blank@11: end a4blank@11: end a4blank@8: a4blank@11: function RTT:GetFormData(with_empty) a4blank@11: local result = {} a4blank@11: for idx, icon in ipairs(self.icons) do a4blank@11: local action = strtrim(self.fields[idx]:GetText()) a4blank@11: local player = strtrim(self.selects[idx]:GetText()) a4blank@11: -- Either we want empty rows (for save) a4blank@11: -- Or action or player are filled a4blank@11: if with_empty or (#action > 0 or #player > 0) then a4blank@11: table.insert(result, {icon:GetChatCommand(), a4blank@11: action, a4blank@11: player}) a4blank@11: end a4blank@11: end a4blank@11: return result a4blank@11: end a4blank@11: a4blank@11: function RTT:Announce() a4blank@11: local channel = self:GetDefaultChatChannel() a4blank@11: if channel then a4blank@11: for _, data in ipairs(self:GetFormData()) do a4blank@13: local str = data.icon a4blank@13: if data.action then a4blank@13: str = str .. " — " .. data.action a4blank@13: end a4blank@13: if data.player then a4blank@13: str = str .. " — " .. data.player a4blank@13: end a4blank@11: SendChatMessage(str, channel) a4blank@11: end a4blank@11: end a4blank@11: end a4blank@11: a4blank@11: