a4blank@8
|
1
|
a4blank@8
|
2
|
a4blank@11
|
3 RTT = LibStub("AceAddon-3.0"):NewAddon("RaidTargetTactics", "AceConsole-3.0", "AceEvent-3.0")
|
a4blank@11
|
4 local _G = _G
|
a4blank@8
|
5 local L = LibStub("AceLocale-3.0"):GetLocale("RaidTargetTactics")
|
a4blank@8
|
6 local LDB = LibStub("LibDataBroker-1.1", true)
|
a4blank@8
|
7 local LDBIcon = LibStub("LibDBIcon-1.0", true)
|
a4blank@11
|
8 local Completion = LibStub("AceGUI-3.0-Completing-EditBox");
|
a4blank@11
|
9
|
a4blank@11
|
10 Completion:Register("Raid", -1, 0)
|
a4blank@11
|
11 local GetAutoCompleteResults_original = _G.GetAutoCompleteResults
|
a4blank@11
|
12 _G.GetAutoCompleteResults = function(text, include, exclude, results, position)
|
a4blank@11
|
13 if include == -1 then -- special hack for Raid members and self
|
a4blank@11
|
14 local users = RTT.partyInfo:GetUsers()
|
a4blank@11
|
15 local result = {}
|
a4blank@11
|
16 for _, name in ipairs(users) do
|
a4blank@11
|
17 if name:find(text) == 1 then
|
a4blank@11
|
18 table.insert(result, name)
|
a4blank@11
|
19 end
|
a4blank@11
|
20 if #result > results then
|
a4blank@11
|
21 break
|
a4blank@11
|
22 end
|
a4blank@11
|
23 end
|
a4blank@11
|
24 return unpack(result)
|
a4blank@11
|
25 else
|
a4blank@11
|
26 return GetAutoCompleteResults_original(text, include, exclude, results, position)
|
a4blank@11
|
27 end
|
a4blank@11
|
28 end
|
a4blank@11
|
29
|
a4blank@8
|
30
|
a4blank@8
|
31 local RTTIcon = LibStub("LibDataBroker-1.1"):NewDataObject("RTTIcon", {
|
a4blank@8
|
32 type = "data source",
|
a4blank@8
|
33 text = "Raid Target Tactics",
|
a4blank@8
|
34 icon = "Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_8",
|
a4blank@11
|
35 OnClick = function(frame, button) RTT:OnIconClick(frame, button) end,
|
a4blank@8
|
36 OnTooltipShow = function(tooltip)
|
a4blank@8
|
37 tooltip:AddLine("Raid Target Tactics")
|
a4blank@8
|
38 tooltip:AddLine(L.Minimap_Icon_Tooltip)
|
a4blank@8
|
39 end,
|
a4blank@8
|
40 })
|
a4blank@8
|
41
|
a4blank@8
|
42 local defaults = {
|
a4blank@8
|
43 profile = {
|
a4blank@8
|
44 visible = true,
|
a4blank@8
|
45 minimap = {
|
a4blank@8
|
46 hide = false,
|
a4blank@8
|
47 },
|
a4blank@11
|
48 setups = {},
|
a4blank@11
|
49 locked = false,
|
a4blank@8
|
50 },
|
a4blank@8
|
51 }
|
a4blank@8
|
52
|
a4blank@8
|
53 function RTT:OnInitialize()
|
a4blank@8
|
54 self.db = LibStub("AceDB-3.0"):New("TacticsSettings", defaults, true)
|
a4blank@11
|
55 self.partyInfo = PartyInfo()
|
a4blank@11
|
56 self.nameDialog = NameDialog(self:GetSetupNames())
|
a4blank@8
|
57
|
a4blank@8
|
58 LDBIcon:Register("RTTIcon", RTTIcon, self.db.profile.minimap)
|
a4blank@8
|
59 self:InitFrame()
|
a4blank@11
|
60 self:BindEvents()
|
a4blank@11
|
61 self.nameDialog:InitDialog()
|
a4blank@11
|
62 self.partyInfo:Update()
|
a4blank@10
|
63 if self.f:IsShown() ~= self.db.profile.visible then
|
a4blank@8
|
64 if self.db.profile.visible then
|
a4blank@8
|
65 self:ShowFrame()
|
a4blank@8
|
66 else
|
a4blank@8
|
67 self:HideFrame()
|
a4blank@8
|
68 end
|
a4blank@8
|
69 end
|
a4blank@11
|
70 if self.db.profile.locked then
|
a4blank@11
|
71 self.f:SetMovable(false)
|
a4blank@11
|
72 self.f:EnableMouse(false)
|
a4blank@11
|
73 end
|
a4blank@11
|
74 end
|
a4blank@11
|
75
|
a4blank@11
|
76 function RTT:GetSetupNames()
|
a4blank@11
|
77 local result = {}
|
a4blank@11
|
78 for name, _ in pairs(self.db.profile.setups) do
|
a4blank@11
|
79 table.insert(result, name)
|
a4blank@11
|
80 end
|
a4blank@11
|
81 return result
|
a4blank@11
|
82 end
|
a4blank@11
|
83
|
a4blank@11
|
84 function RTT:BindEvents()
|
a4blank@11
|
85 self:RegisterEvent("PARTY_MEMBERS_CHANGED")
|
a4blank@11
|
86 self:RegisterEvent("RAID_ROSTER_UPDATE")
|
a4blank@11
|
87 end
|
a4blank@11
|
88
|
a4blank@11
|
89 function RTT:PARTY_MEMBERS_CHANGED()
|
a4blank@11
|
90 self.partyInfo:Update()
|
a4blank@11
|
91 end
|
a4blank@11
|
92
|
a4blank@11
|
93 function RTT:RAID_ROSTER_UPDATE()
|
a4blank@11
|
94 self.partyInfo:Update()
|
a4blank@8
|
95 end
|
a4blank@8
|
96
|
a4blank@8
|
97 function RTT:InitFrame()
|
a4blank@11
|
98 self.f = CreateFrame("Frame", "__RTT_MAIN", UIParent)
|
a4blank@10
|
99 self.f:SetWidth(300)
|
a4blank@11
|
100 self.f:SetHeight(270)
|
a4blank@10
|
101 self.f:SetAlpha(0.8)
|
a4blank@11
|
102 self.f:SetMovable(true)
|
a4blank@11
|
103 self.f:EnableMouse(true)
|
a4blank@11
|
104 self.f:RegisterForDrag("LeftButton")
|
a4blank@11
|
105 self.f:SetScript("OnDragStart", self.f.StartMoving)
|
a4blank@11
|
106 self.f:SetScript("OnDragStop", self.f.StopMovingOrSizing)
|
a4blank@8
|
107 self.f:SetPoint("LEFT", UIParent, "LEFT", 10, 0)
|
a4blank@10
|
108 --[[self.f:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
|
a4blank@10
|
109 edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
a4blank@10
|
110 tile = true, tileSize = 16, edgeSize = 16,
|
a4blank@10
|
111 insets = { left = 4, right = 4, top = 4, bottom = 4 }})
|
a4blank@10
|
112 ]]
|
a4blank@10
|
113 local backdrop = {
|
a4blank@10
|
114 -- path to the background texture
|
a4blank@10
|
115 bgFile = "Interface\\FrameGeneral\\UI-Background-Marble",
|
a4blank@10
|
116 -- path to the border texture
|
a4blank@10
|
117 edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Gold-Border",
|
a4blank@10
|
118 -- true to repeat the background texture to fill the frame, false to scale it
|
a4blank@10
|
119 tile = true,
|
a4blank@10
|
120 -- size (width or height) of the square repeating background tiles (in pixels)
|
a4blank@10
|
121 tileSize = 256,
|
a4blank@10
|
122 -- thickness of edge segments and square size of edge corners (in pixels)
|
a4blank@10
|
123 edgeSize = 32,
|
a4blank@10
|
124 -- distance from the edges of the frame to those of the background texture (in pixels)
|
a4blank@10
|
125 insets = {
|
a4blank@10
|
126 left = 11,
|
a4blank@10
|
127 right = 12,
|
a4blank@10
|
128 top = 12,
|
a4blank@10
|
129 bottom = 11
|
a4blank@10
|
130 }
|
a4blank@10
|
131 }
|
a4blank@10
|
132 self.f:SetBackdrop(backdrop)
|
a4blank@10
|
133 self.f:SetFrameStrata("HIGH")
|
a4blank@10
|
134 --self.f:SetBackdropColor(0, 0, 0, 0.5)
|
a4blank@10
|
135
|
a4blank@11
|
136 local str1 = self.f:CreateFontString()
|
a4blank@11
|
137 str1:SetFontObject(GameFontHighlightSmall)
|
a4blank@11
|
138 str1:SetPoint("TOPLEFT", 45, -15)
|
a4blank@11
|
139 str1:SetText(L.Action .. ":")
|
a4blank@11
|
140 str1:SetTextColor(YELLOW_FONT_COLOR.r, YELLOW_FONT_COLOR.g, YELLOW_FONT_COLOR.b)
|
a4blank@11
|
141 str1:Show()
|
a4blank@11
|
142
|
a4blank@11
|
143 local str1 = self.f:CreateFontString()
|
a4blank@11
|
144 str1:SetFontObject(GameFontHighlightSmall)
|
a4blank@11
|
145 str1:SetPoint("TOPLEFT", 175, -15)
|
a4blank@11
|
146 str1:SetText(L.Player .. ":")
|
a4blank@11
|
147 str1:SetTextColor(YELLOW_FONT_COLOR.r, YELLOW_FONT_COLOR.g, YELLOW_FONT_COLOR.b)
|
a4blank@11
|
148 str1:Show()
|
a4blank@11
|
149
|
a4blank@11
|
150 self.icons = {}
|
a4blank@10
|
151 self.fields = {}
|
a4blank@10
|
152 self.selects = {}
|
a4blank@10
|
153 for num, icon in ipairs(RaidIcons) do
|
a4blank@11
|
154 self.icons[num] = icon
|
a4blank@11
|
155 icon:draw(self.f, 16, (num - 1) * -25 - 30)
|
a4blank@10
|
156
|
a4blank@11
|
157 local field = RoleField()
|
a4blank@11
|
158 field:draw(self.f, 45, (num -1) * -25 - 30)
|
a4blank@11
|
159 self.fields[num] = field
|
a4blank@10
|
160
|
a4blank@11
|
161 local userSelect = UserSelect()
|
a4blank@11
|
162 userSelect:draw(self.f, 170, ((num - 1) * -25) - 30)
|
a4blank@11
|
163 self.selects[num] = userSelect
|
a4blank@11
|
164 end
|
a4blank@11
|
165 self.talkButton = CreateFrame("Button", nil, self.f, "OptionsButtonTemplate")
|
a4blank@11
|
166 self.talkButton:ClearAllPoints()
|
a4blank@11
|
167 self.talkButton:SetText(L.Announce)
|
a4blank@11
|
168 self.talkButton:SetPoint("TOPLEFT", 170, -230)
|
a4blank@11
|
169 self.talkButton:SetWidth(102)
|
a4blank@11
|
170 self.talkButton:SetScript("OnClick", function() RTT:Announce() end)
|
a4blank@11
|
171
|
a4blank@11
|
172 self.dropdown = CreateFrame("Frame", "__RTT_DROPDOWN", UIParent, "UIDropDownMenuTemplate");
|
a4blank@11
|
173 UIDropDownMenu_Initialize(self.dropdown, self.InitDropdown, "MENU");
|
a4blank@11
|
174 end
|
a4blank@11
|
175
|
a4blank@11
|
176 function RTT:InitDropdown(level)
|
a4blank@11
|
177 level = level or 1
|
a4blank@11
|
178 if (level == 1) then
|
a4blank@11
|
179 local info = UIDropDownMenu_CreateInfo()
|
a4blank@11
|
180 info.hasArrow = false
|
a4blank@11
|
181 info.notCheckable = false
|
a4blank@11
|
182 info.text = L.Lock
|
a4blank@11
|
183 info.func = function() RTT:ToggleMovable() end
|
a4blank@11
|
184 info.keepShownOnClick = true
|
a4blank@11
|
185 info.checked = RTT.db.profile.locked
|
a4blank@11
|
186 UIDropDownMenu_AddButton(info, level)
|
a4blank@11
|
187
|
a4blank@11
|
188 info.hasArrow = true
|
a4blank@11
|
189 info.notCheckable = true
|
a4blank@11
|
190 info.text = L.Load
|
a4blank@11
|
191 info.value = "load"
|
a4blank@11
|
192 info.keepShownOnClick = false
|
a4blank@11
|
193 UIDropDownMenu_AddButton(info, level)
|
a4blank@11
|
194
|
a4blank@11
|
195 info.hasArrow = false
|
a4blank@11
|
196 info.notCheckable = true
|
a4blank@11
|
197 info.text = L.Save .. "…"
|
a4blank@11
|
198 info.keepShownOnClick = false
|
a4blank@11
|
199 local rows = RTT:GetFormData()
|
a4blank@11
|
200 if #rows == 0 then
|
a4blank@11
|
201 info.disabled = true
|
a4blank@11
|
202 else
|
a4blank@11
|
203 info.func = function() RTT:AskForSave() end
|
a4blank@10
|
204 end
|
a4blank@11
|
205 UIDropDownMenu_AddButton(info, level)
|
a4blank@11
|
206 end
|
a4blank@11
|
207
|
a4blank@11
|
208 if (level == 2 and UIDROPDOWNMENU_MENU_VALUE == "load") then
|
a4blank@11
|
209 local info = UIDropDownMenu_CreateInfo();
|
a4blank@11
|
210 for key, setup in pairs(RTT.db.profile.setups) do
|
a4blank@11
|
211 info.hasArrow = false
|
a4blank@11
|
212 info.notCheckable = true
|
a4blank@11
|
213 info.text = key
|
a4blank@11
|
214 info.func = function() RTT:Load(key) end
|
a4blank@11
|
215 UIDropDownMenu_AddButton(info, level);
|
a4blank@11
|
216 end
|
a4blank@10
|
217 end
|
a4blank@8
|
218 end
|
a4blank@8
|
219
|
a4blank@11
|
220 function RTT:AskForSave()
|
a4blank@11
|
221 local this = self
|
a4blank@11
|
222 self.nameDialog:Show()
|
a4blank@11
|
223 self.nameDialog:OnNameChosen(function(name) this:Save(name) end)
|
a4blank@11
|
224 end
|
a4blank@11
|
225
|
a4blank@11
|
226 function RTT:Save(name)
|
a4blank@11
|
227 self.db.profile.setups[name] = self:GetFormData(true)
|
a4blank@11
|
228 self.nameDialog:SetInvalidNames(self:GetSetupNames())
|
a4blank@11
|
229 end
|
a4blank@11
|
230
|
a4blank@11
|
231 function RTT:Load(name)
|
a4blank@11
|
232 local data = self.db.profile.setups[name]
|
a4blank@11
|
233 self:SetFormData(data)
|
a4blank@11
|
234 end
|
a4blank@11
|
235
|
a4blank@11
|
236 function RTT:OnIconClick(frame, button)
|
a4blank@11
|
237 if button == "RightButton" then
|
a4blank@11
|
238 -- context menu
|
a4blank@11
|
239 ToggleDropDownMenu(1, nil, self.dropdown, LDBIcon.objects["RTTIcon"], 0, 0)
|
a4blank@8
|
240 else
|
a4blank@11
|
241 if self.db.profile.visible then
|
a4blank@11
|
242 self:HideFrame()
|
a4blank@11
|
243 else
|
a4blank@11
|
244 self:ShowFrame()
|
a4blank@11
|
245 end
|
a4blank@11
|
246 self.db.profile.visible = not self.db.profile.visible
|
a4blank@8
|
247 end
|
a4blank@8
|
248 end
|
a4blank@8
|
249
|
a4blank@8
|
250 function RTT:HideFrame()
|
a4blank@8
|
251 self.f:Hide()
|
a4blank@8
|
252 end
|
a4blank@8
|
253
|
a4blank@8
|
254 function RTT:ShowFrame()
|
a4blank@8
|
255 self.f:Show()
|
a4blank@8
|
256 end
|
a4blank@8
|
257
|
a4blank@11
|
258 function RTT:ToggleMovable()
|
a4blank@11
|
259 if self.f:IsMovable() then
|
a4blank@11
|
260 self.f:SetMovable(false)
|
a4blank@11
|
261 self.f:EnableMouse(false)
|
a4blank@11
|
262 self.db.profile.locked = true
|
a4blank@11
|
263 else
|
a4blank@11
|
264 self.f:SetMovable(true)
|
a4blank@11
|
265 self.f:EnableMouse(true)
|
a4blank@11
|
266 self.db.profile.locked = false
|
a4blank@11
|
267 end
|
a4blank@11
|
268 end
|
a4blank@8
|
269
|
a4blank@11
|
270 function RTT:GetDefaultChatChannel()
|
a4blank@11
|
271 if self.partyInfo.is_in_raid then
|
a4blank@11
|
272 return "RAID"
|
a4blank@11
|
273 end
|
a4blank@11
|
274 if self.partyInfo.is_in_party then
|
a4blank@11
|
275 return "PARTY"
|
a4blank@11
|
276 end
|
a4blank@11
|
277 return nil
|
a4blank@11
|
278 end
|
a4blank@8
|
279
|
a4blank@11
|
280 function RTT:SetFormData(data)
|
a4blank@11
|
281 for idx, row in ipairs(data) do
|
a4blank@11
|
282 self.fields[idx]:SetText(row[2])
|
a4blank@11
|
283 self.selects[idx]:SetText(row[3])
|
a4blank@11
|
284 end
|
a4blank@11
|
285 end
|
a4blank@8
|
286
|
a4blank@11
|
287 function RTT:GetFormData(with_empty)
|
a4blank@11
|
288 local result = {}
|
a4blank@11
|
289 for idx, icon in ipairs(self.icons) do
|
a4blank@11
|
290 local action = strtrim(self.fields[idx]:GetText())
|
a4blank@11
|
291 local player = strtrim(self.selects[idx]:GetText())
|
a4blank@11
|
292 -- Either we want empty rows (for save)
|
a4blank@11
|
293 -- Or action or player are filled
|
a4blank@11
|
294 if with_empty or (#action > 0 or #player > 0) then
|
a4blank@11
|
295 table.insert(result, {icon:GetChatCommand(),
|
a4blank@11
|
296 action,
|
a4blank@11
|
297 player})
|
a4blank@11
|
298 end
|
a4blank@11
|
299 end
|
a4blank@11
|
300 return result
|
a4blank@11
|
301 end
|
a4blank@11
|
302
|
a4blank@11
|
303 function RTT:Announce()
|
a4blank@11
|
304 local channel = self:GetDefaultChatChannel()
|
a4blank@11
|
305 if channel then
|
a4blank@11
|
306 for _, data in ipairs(self:GetFormData()) do
|
a4blank@13
|
307 local str = data.icon
|
a4blank@13
|
308 if data.action then
|
a4blank@13
|
309 str = str .. " — " .. data.action
|
a4blank@13
|
310 end
|
a4blank@13
|
311 if data.player then
|
a4blank@13
|
312 str = str .. " — " .. data.player
|
a4blank@13
|
313 end
|
a4blank@11
|
314 SendChatMessage(str, channel)
|
a4blank@11
|
315 end
|
a4blank@11
|
316 end
|
a4blank@11
|
317 end
|
a4blank@11
|
318
|
a4blank@11
|
319
|