comparison Comments.lua @ 270:e1566483082c

Added visual menu for selecting a comment subject via minimap icon (defaults to off), LDB icon, or the /comment command without an argument.
author James D. Callahan III <jcallahan@curse.com>
date Thu, 21 Mar 2013 15:11:34 -0500
parents 463b0f117b1b
children fbd94a0be29c
comparison
equal deleted inserted replaced
269:463b0f117b1b 270:e1566483082c
3 local _G = getfenv(0) 3 local _G = getfenv(0)
4 4
5 local table = _G.table 5 local table = _G.table
6 6
7 local next = _G.next 7 local next = _G.next
8 local pairs = _G.pairs
8 9
9 -- ADDON NAMESPACE ---------------------------------------------------- 10 -- ADDON NAMESPACE ----------------------------------------------------
10 11
11 local ADDON_NAME, private = ... 12 local ADDON_NAME, private = ...
12 13
13 local LibStub = _G.LibStub 14 local LibStub = _G.LibStub
14 local WDP = LibStub("AceAddon-3.0"):GetAddon(ADDON_NAME) 15 local WDP = LibStub("AceAddon-3.0"):GetAddon(ADDON_NAME)
15 local Dialog = LibStub("LibDialog-1.0") 16 local Dialog = LibStub("LibDialog-1.0")
17 local LQT = LibStub("LibQTip-1.0")
16 18
17 local ParseGUID = private.ParseGUID 19 local ParseGUID = private.ParseGUID
18 local ItemLinkToID = private.ItemLinkToID 20 local ItemLinkToID = private.ItemLinkToID
19 local DBEntry = private.DBEntry 21 local DBEntry = private.DBEntry
20 22
68 self.text:SetJustifyH("LEFT") 70 self.text:SetJustifyH("LEFT")
69 self.text:SetFormattedText(LINK_EDITBOX_DESC_FORMAT:format(data.label)) 71 self.text:SetFormattedText(LINK_EDITBOX_DESC_FORMAT:format(data.label))
70 end, 72 end,
71 }) 73 })
72 74
75 -- VARIABLES ----------------------------------------------------------
76
73 local comment_subject = {} 77 local comment_subject = {}
78 local comment_frame
74 79
75 -- HELPERS ------------------------------------------------------------ 80 -- HELPERS ------------------------------------------------------------
76 81
77 local comment_frame 82 local function NewComment(type_name, label, id)
83 comment_subject.id = id
84 comment_subject.label = label
85 comment_subject.type_name = type_name
86
87 comment_frame.subject_name:SetText(label)
88 comment_frame.subject_data:SetFormattedText("(%s #%d)", type_name, id)
89 comment_frame.scroll_frame.edit_box:SetText("")
90 _G.ShowUIPanel(comment_frame)
91 end
92
93 local function CreateUnitComment(unit_id)
94 if not _G.UnitExists(unit_id) then
95 WDP:Printf("Unit '%s' does not exist.", unit_id)
96 return
97 end
98 local unit_type, unit_idnum = ParseGUID(_G.UnitGUID(unit_id))
99
100 if not unit_idnum then
101 WDP:Printf("Unable to determine unit from '%s'", unit_id)
102 return
103 end
104 local type_name = private.UNIT_TYPE_NAMES[unit_type + 1]
105 local unit_name = _G.UnitName(unit_id)
106 NewComment(type_name, unit_name, unit_idnum)
107 end
108
109 local DATA_TYPE_MAPPING = {
110 merchant = "ITEM",
111 }
112
113 local CreateCursorComment
78 do 114 do
115 local CURSOR_DATA_FUNCS = {
116 item = function(type_name, id_num, data_subtype)
117 local item_name = _G.GetItemInfo(id_num)
118 NewComment(type_name, item_name, id_num)
119 end,
120 merchant = function(type_name, item_index)
121 local item_link = _G.GetMerchantItemLink(item_index)
122 local item_name = _G.GetItemInfo(item_link)
123 NewComment(type_name, item_name, ItemLinkToID(item_link))
124 end,
125 spell = function(type_name, data, data_subtype, spell_id)
126 local spell_name = _G.GetSpellInfo(spell_id)
127 NewComment(type_name, spell_name, spell_id)
128 end,
129 }
130
131 function CreateCursorComment()
132 local data_type, data, data_subtype, subdata = _G.GetCursorInfo()
133 local comment_func = CURSOR_DATA_FUNCS[data_type]
134
135 if not comment_func then
136 WDP:Print("Unable to determine comment subject from cursor.")
137 return
138 end
139 comment_func(DATA_TYPE_MAPPING[data_type] or data_type:upper(), data, data_subtype, subdata)
140 end
141 end -- do-block
142
143 local function CreateQuestComment()
144 local index = _G.GetQuestLogSelection()
145
146 if not index or not _G.QuestLogFrame:IsShown() then
147 WDP:Print("You must select a quest from the Quest frame.")
148 return
149 end
150 local title, _, tag, _, is_header, _, _, _, idnum = _G.GetQuestLogTitle(index)
151
152 if is_header then
153 WDP:Print("You must select a quest from the Quest frame.")
154 return
155 end
156 NewComment("QUEST", title, idnum)
157 end
158
159 local function CreateAchievementComment()
160 if not _G.AchievementFrame or not _G.AchievementFrame:IsShown() or not _G.AchievementFrameAchievements.selection then
161 WDP:Print("You must select an achievement from the Achievement frame.")
162 return
163 end
164
165 for _, button in next, _G.AchievementFrameAchievementsContainer.buttons do
166 if button.selected then
167 NewComment("ACHIEVEMENT", button.label:GetText(), button.id)
168 break
169 end
170 end
171 end
172
173 local ShowPossibleSubjects
174 do
175 local display
176 local old_x, old_y, click_time
177
178 _G.WorldFrame:HookScript("OnMouseDown", function(frame, ...)
179 old_x, old_y = _G.GetCursorPosition()
180 click_time = _G.GetTime()
181 end)
182
183 _G.WorldFrame:HookScript("OnMouseUp", function(frame, ...)
184 if not display then
185 return
186 end
187 local x, y = _G.GetCursorPosition()
188
189 if not old_x or not old_y or not x or not y or not click_time then
190 display = display:Release()
191 return
192 end
193
194 if (_G.math.abs(x - old_x) + _G.math.abs(y - old_y)) <= 5 and _G.GetTime() - click_time < 1 then
195 display = display:Release()
196 end
197 end)
198
199 local function CreateComment(cell, func)
200 func()
201 display = display:Release()
202 end
203
204 local CURSOR_NAME_FUNCS = {
205 item = function(id_num)
206 return _G.GetItemInfo(id_num)
207 end,
208 merchant = function(item_index)
209 return _G.GetItemInfo(_G.GetMerchantItemLink(item_index))
210 end,
211 spell = function(data, data_subtype, spell_id)
212 return _G.GetSpellInfo(spell_id)
213 end,
214 }
215
216 local VALID_UNITS = {
217 boss1 = true,
218 boss2 = true,
219 boss3 = true,
220 boss4 = true,
221 focus = true,
222 mouseover = true,
223 npc = true,
224 target = true,
225 }
226
227 function ShowPossibleSubjects(anchor)
228 if not display then
229 display = LQT:Acquire(ADDON_NAME, 1, "LEFT")
230 display:EnableMouse(true)
231 end
232
233 if anchor then
234 display:SmartAnchorTo(anchor)
235 display:SetAutoHideDelay(0.2, anchor)
236 else
237 display:SetPoint("CENTER", _G.UIParent, "CENTER", 0, 0)
238 end
239 display:Clear()
240 display:AddHeader("Choose comment subject:", "CENTER")
241 display:AddSeparator()
242 display:AddSeparator()
243
244 local line
245
246 for unit_id in pairs(VALID_UNITS) do
247 if _G.UnitExists(unit_id) then
248 local unit_type, unit_idnum = ParseGUID(_G.UnitGUID(unit_id))
249
250 if unit_idnum then
251 line = display:AddLine(("%s: %s"):format(unit_id:gsub("^%l", _G.string.upper), _G.UnitName(unit_id)))
252 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateUnitComment)
253 end
254 end
255 end
256
257 if _G.AchievementFrame and _G.AchievementFrame:IsShown() and _G.AchievementFrameAchievements.selection then
258 for _, button in next, _G.AchievementFrameAchievementsContainer.buttons do
259 if button.selected then
260 line = display:AddLine(("Achievement: %s"):format(button.label:GetText()))
261 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateAchievementComment)
262 break
263 end
264 end
265 end
266 local data_type, data, data_subtype, subdata = _G.GetCursorInfo()
267 local name_func = CURSOR_NAME_FUNCS[data_type]
268
269 if name_func then
270 line = display:AddLine(("Cursor: %s"):format(name_func(data, data_subtype, subdata)))
271 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateCursorComment)
272 end
273
274 local quest_index = _G.GetQuestLogSelection()
275
276 if quest_index and _G.QuestLogFrame:IsShown() then
277 local title, _, tag, _, is_header, _, _, _, idnum = _G.GetQuestLogTitle(quest_index)
278
279 if not is_header then
280 line = display:AddLine(("Quest: %s"):format(title))
281 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateQuestComment)
282 end
283 end
284
285 if display:GetLineCount() == 3 then
286 WDP:Print("There are no possible comment subjects.")
287 return
288 end
289 display:Show()
290 end
291 end -- do-block
292
293 -- METHODS ------------------------------------------------------------
294
295 function private.ProcessCommentCommand(arg)
296 if not arg or arg == "" then
297 ShowPossibleSubjects(nil)
298 return
299 end
300
301 if arg == "achievement" then
302 CreateAchievementComment()
303 return
304 elseif arg == "cursor" then
305 CreateCursorComment()
306 return
307 elseif arg == "quest" then
308 CreateQuestComment()
309 return
310 end
311 CreateUnitComment(arg)
312 end
313
314 function private.InitializeCommentSystem()
79 local panel = _G.CreateFrame("Frame", "WDP_CommentFrame", _G.UIParent, "TranslucentFrameTemplate") 315 local panel = _G.CreateFrame("Frame", "WDP_CommentFrame", _G.UIParent, "TranslucentFrameTemplate")
80 panel:SetSize(480, 350) 316 panel:SetSize(480, 350)
81 panel:SetPoint("CENTER", _G.UIParent, "CENTER") 317 panel:SetPoint("CENTER", _G.UIParent, "CENTER")
82 panel:SetFrameStrata("DIALOG") 318 panel:SetFrameStrata("DIALOG")
83 panel.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Rock]], true, true) 319 panel.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Rock]], true, true)
288 524
289 edit_box:SetText("") 525 edit_box:SetText("")
290 _G.HideUIPanel(panel) 526 _G.HideUIPanel(panel)
291 end) 527 end)
292 panel.submitButton = submit 528 panel.submitButton = submit
529
530 local data_obj = LibStub("LibDataBroker-1.1"):NewDataObject(ADDON_NAME, {
531 type = "data source",
532 label = ADDON_NAME,
533 text = " ",
534 icon = [[Interface\CHATFRAME\UI-ChatIcon-Chat-Up]],
535 OnClick = function(self, button, down)
536 ShowPossibleSubjects(self)
537 end,
538 OnTooltipShow = function(self)
539 self:AddLine(_G.CLICK_TO_ENTER_COMMENT)
540 end,
541 })
542
543 private.data_obj = data_obj
544 LibStub("LibDBIcon-1.0"):Register(ADDON_NAME, data_obj, private.db.global.config.minimap_icon)
293 end 545 end
294
295 local function NewComment(type_name, label, id)
296 comment_subject.id = id
297 comment_subject.label = label
298 comment_subject.type_name = type_name
299
300 comment_frame.subject_name:SetText(label)
301 comment_frame.subject_data:SetFormattedText("(%s #%d)", type_name, id)
302 comment_frame.scroll_frame.edit_box:SetText("")
303 _G.ShowUIPanel(comment_frame)
304 end
305
306 local function CreateUnitComment(unit_id)
307 if not _G.UnitExists(unit_id) then
308 WDP:Printf("Unit '%s' does not exist.", unit_id)
309 return
310 end
311 local unit_type, unit_idnum = ParseGUID(_G.UnitGUID(unit_id))
312
313 if not unit_idnum then
314 WDP:Printf("Unable to determine unit from '%s'", unit_id)
315 return
316 end
317 local type_name = private.UNIT_TYPE_NAMES[unit_type + 1]
318 local unit_name = _G.UnitName(unit_id)
319 NewComment(type_name, unit_name, unit_idnum)
320 end
321
322 local DATA_TYPE_MAPPING = {
323 merchant = "ITEM",
324 }
325
326 local CreateCursorComment
327 do
328 local CURSOR_DATA_FUNCS = {
329 item = function(type_name, id_num, data_subtype)
330 local item_name = _G.GetItemInfo(id_num)
331 NewComment(type_name, item_name, id_num)
332 end,
333 merchant = function(type_name, item_index)
334 local item_link = _G.GetMerchantItemLink(item_index)
335 local item_name = _G.GetItemInfo(item_link)
336 NewComment(type_name, item_name, ItemLinkToID(item_link))
337 end,
338 spell = function(type_name, data, data_subtype, spell_id)
339 local spell_name = _G.GetSpellInfo(spell_id)
340 NewComment(type_name, spell_name, spell_id)
341 end,
342 }
343
344 function CreateCursorComment()
345 local data_type, data, data_subtype, subdata = _G.GetCursorInfo()
346 local comment_func = CURSOR_DATA_FUNCS[data_type]
347
348 if not comment_func then
349 WDP:Print("Unable to determine comment subject from cursor.")
350 return
351 end
352 comment_func(DATA_TYPE_MAPPING[data_type] or data_type:upper(), data, data_subtype, subdata)
353 end
354 end
355
356 local function CreateQuestComment()
357 local index = _G.GetQuestLogSelection()
358
359 if not index or not _G.QuestLogFrame:IsShown() then
360 WDP:Print("You must select a quest from the Quest frame.")
361 return
362 end
363 local title, _, tag, _, is_header, _, _, _, idnum = _G.GetQuestLogTitle(index)
364
365 if is_header then
366 WDP:Print("You must select a quest from the Quest frame.")
367 return
368 end
369 NewComment("QUEST", title, idnum)
370 end
371
372 local function CreateAchievementComment()
373 if not _G.AchievementFrame or not _G.AchievementFrameAchievements.selection then
374 WDP:Print("You must select an achievement from the Achievement frame.")
375 return
376 end
377
378 for _, button in next, _G.AchievementFrameAchievementsContainer.buttons do
379 if button.selected then
380 NewComment("ACHIEVEMENT", button.label:GetText(), button.id)
381 break
382 end
383 end
384 end
385
386 -- METHODS ------------------------------------------------------------
387
388 function private.ProcessCommentCommand(arg)
389 if not arg or arg == "" then
390 WDP:Print("You must supply a valid comment type.")
391 return
392 end
393
394 if arg == "achievement" then
395 CreateAchievementComment()
396 return
397 elseif arg == "cursor" then
398 CreateCursorComment()
399 return
400 elseif arg == "quest" then
401 CreateQuestComment()
402 return
403 end
404 CreateUnitComment(arg)
405 end