jcallahan@249
|
1 -- LUA API ------------------------------------------------------------
|
jcallahan@249
|
2
|
jcallahan@249
|
3 local _G = getfenv(0)
|
jcallahan@249
|
4
|
jcallahan@249
|
5 local table = _G.table
|
jcallahan@249
|
6
|
jcallahan@267
|
7 local next = _G.next
|
jcallahan@270
|
8 local pairs = _G.pairs
|
jcallahan@267
|
9
|
jcallahan@249
|
10 -- ADDON NAMESPACE ----------------------------------------------------
|
jcallahan@249
|
11
|
jcallahan@249
|
12 local ADDON_NAME, private = ...
|
jcallahan@249
|
13
|
jcallahan@249
|
14 local LibStub = _G.LibStub
|
jcallahan@249
|
15 local WDP = LibStub("AceAddon-3.0"):GetAddon(ADDON_NAME)
|
jcallahan@259
|
16 local Dialog = LibStub("LibDialog-1.0")
|
jcallahan@270
|
17 local LQT = LibStub("LibQTip-1.0")
|
jcallahan@249
|
18
|
jcallahan@249
|
19 local ParseGUID = private.ParseGUID
|
jcallahan@260
|
20 local ItemLinkToID = private.ItemLinkToID
|
jcallahan@263
|
21 local DBEntry = private.DBEntry
|
jcallahan@249
|
22
|
jcallahan@258
|
23 -- CONSTANTS ----------------------------------------------------------
|
jcallahan@258
|
24
|
jcallahan@258
|
25 local EDIT_MAXCHARS = 3000
|
jcallahan@259
|
26 local EDIT_DESCRIPTION_FORMAT = "Enter your comment below, being as descriptive as possible. Comments are limited to %s characters, including newlines and spaces."
|
jcallahan@259
|
27 local LINK_COMMENT_TOOLTIP = "Click here to create a link to the comment page on WoWDB."
|
jcallahan@261
|
28 local LINK_EDITBOX_DESC_FORMAT = "Copy the highlighted text and paste it into your browser to visit the comments for |cffffd200%s|r."
|
jcallahan@259
|
29
|
jcallahan@259
|
30 local URL_BASE = "http://www.wowdb.com/"
|
jcallahan@259
|
31
|
jcallahan@259
|
32 local URL_TYPE_MAP = {
|
jcallahan@267
|
33 ACHIEVEMENT = "achievements",
|
jcallahan@259
|
34 ITEM = "items",
|
jcallahan@259
|
35 OBJECT = "objects",
|
jcallahan@259
|
36 NPC = "npcs",
|
jcallahan@261
|
37 QUEST = "quests",
|
jcallahan@260
|
38 SPELL = "spells",
|
jcallahan@259
|
39 VEHICLE = "npcs",
|
jcallahan@259
|
40 }
|
jcallahan@259
|
41
|
jcallahan@259
|
42 Dialog:Register("WDP_CommentLink", {
|
jcallahan@259
|
43 text = "",
|
jcallahan@259
|
44 editboxes = {
|
jcallahan@259
|
45 {
|
jcallahan@259
|
46 text = _G.UNKNOWN,
|
jcallahan@259
|
47 on_escape_pressed = function(self)
|
jcallahan@259
|
48 self:ClearFocus()
|
jcallahan@259
|
49 end,
|
jcallahan@265
|
50 on_enter_pressed = function(self)
|
jcallahan@265
|
51 self:GetParent().buttons[1]:Click()
|
jcallahan@265
|
52 end,
|
jcallahan@259
|
53 },
|
jcallahan@259
|
54 },
|
jcallahan@259
|
55 buttons = {
|
jcallahan@259
|
56 {
|
jcallahan@259
|
57 text = _G.OKAY,
|
jcallahan@259
|
58 }
|
jcallahan@259
|
59 },
|
jcallahan@259
|
60 show_while_dead = true,
|
jcallahan@259
|
61 hide_on_escape = true,
|
jcallahan@259
|
62 is_exclusive = true,
|
jcallahan@259
|
63 on_show = function(self, data)
|
jcallahan@259
|
64 local editbox = self.editboxes[1]
|
jcallahan@259
|
65 editbox:SetWidth(self:GetWidth() - 20)
|
jcallahan@259
|
66 editbox:SetText(("%s%s/%d#related:comments"):format(URL_BASE, URL_TYPE_MAP[data.type_name], data.id))
|
jcallahan@259
|
67 editbox:HighlightText()
|
jcallahan@259
|
68 editbox:SetFocus()
|
jcallahan@259
|
69
|
jcallahan@261
|
70 self.text:SetJustifyH("LEFT")
|
jcallahan@259
|
71 self.text:SetFormattedText(LINK_EDITBOX_DESC_FORMAT:format(data.label))
|
jcallahan@259
|
72 end,
|
jcallahan@259
|
73 })
|
jcallahan@259
|
74
|
jcallahan@270
|
75 -- VARIABLES ----------------------------------------------------------
|
jcallahan@270
|
76
|
jcallahan@259
|
77 local comment_subject = {}
|
jcallahan@270
|
78 local comment_frame
|
jcallahan@275
|
79 local comment_units = {}
|
jcallahan@258
|
80
|
jcallahan@249
|
81 -- HELPERS ------------------------------------------------------------
|
jcallahan@249
|
82
|
jcallahan@270
|
83 local function NewComment(type_name, label, id)
|
jcallahan@270
|
84 comment_subject.id = id
|
jcallahan@270
|
85 comment_subject.label = label
|
jcallahan@270
|
86 comment_subject.type_name = type_name
|
jcallahan@270
|
87
|
jcallahan@270
|
88 comment_frame.subject_name:SetText(label)
|
jcallahan@270
|
89 comment_frame.subject_data:SetFormattedText("(%s #%d)", type_name, id)
|
jcallahan@270
|
90 comment_frame.scroll_frame.edit_box:SetText("")
|
jcallahan@270
|
91 _G.ShowUIPanel(comment_frame)
|
jcallahan@270
|
92 end
|
jcallahan@270
|
93
|
jcallahan@275
|
94 local function CreateUnitComment(unit_id, is_command)
|
jcallahan@275
|
95 local unit_type, unit_idnum
|
jcallahan@275
|
96
|
jcallahan@275
|
97 if is_command then
|
jcallahan@275
|
98 if not _G.UnitExists(unit_id) then
|
jcallahan@275
|
99 WDP:Printf("Unit '%s' does not exist.", unit_id)
|
jcallahan@275
|
100 return
|
jcallahan@275
|
101 end
|
jcallahan@275
|
102 unit_type, unit_idnum = ParseGUID(_G.UnitGUID(unit_id))
|
jcallahan@275
|
103 else
|
jcallahan@275
|
104 local unit_data = comment_units[unit_id]
|
jcallahan@275
|
105
|
jcallahan@275
|
106 if not unit_data then
|
jcallahan@275
|
107 WDP:Printf("Unit '%s' does not exist.", unit_id)
|
jcallahan@275
|
108 return
|
jcallahan@275
|
109 end
|
jcallahan@275
|
110 unit_type = unit_data.type
|
jcallahan@275
|
111 unit_idnum = unit_data.idnum
|
jcallahan@270
|
112 end
|
jcallahan@270
|
113
|
jcallahan@270
|
114 if not unit_idnum then
|
jcallahan@270
|
115 WDP:Printf("Unable to determine unit from '%s'", unit_id)
|
jcallahan@270
|
116 return
|
jcallahan@270
|
117 end
|
MMOSimca@329
|
118 local type_name = private.UNIT_TYPE_NAMES[unit_type]
|
jcallahan@275
|
119 local unit_name = is_command and _G.UnitName(unit_id) or comment_units[unit_id].name
|
jcallahan@275
|
120
|
jcallahan@275
|
121 table.wipe(comment_units)
|
jcallahan@270
|
122 NewComment(type_name, unit_name, unit_idnum)
|
jcallahan@270
|
123 end
|
jcallahan@270
|
124
|
jcallahan@270
|
125 local DATA_TYPE_MAPPING = {
|
jcallahan@270
|
126 merchant = "ITEM",
|
jcallahan@270
|
127 }
|
jcallahan@270
|
128
|
jcallahan@276
|
129 local function CreateItemComment(is_command)
|
jcallahan@276
|
130 local item_name, item_id
|
jcallahan@276
|
131
|
jcallahan@276
|
132 if is_command then
|
jcallahan@276
|
133 local item_link
|
jcallahan@276
|
134 item_name, item_link = _G.GameTooltip:GetItem()
|
jcallahan@276
|
135
|
jcallahan@276
|
136 if not item_name and not item_link then
|
jcallahan@276
|
137 WDP:Print("Your mouse is not over an item.")
|
jcallahan@276
|
138 return
|
jcallahan@276
|
139 end
|
jcallahan@276
|
140 item_id = ItemLinkToID(item_link)
|
jcallahan@276
|
141 else
|
jcallahan@276
|
142 item_id = ItemLinkToID(comment_units.item.link)
|
jcallahan@276
|
143 item_name = comment_units.item.name
|
jcallahan@276
|
144 end
|
jcallahan@276
|
145 table.wipe(comment_units)
|
jcallahan@276
|
146 NewComment("ITEM", item_name, item_id)
|
jcallahan@276
|
147 end
|
jcallahan@276
|
148
|
jcallahan@277
|
149 local function CreateSpellComment(is_command)
|
jcallahan@277
|
150 local spell_name, spell_rank, spell_id
|
jcallahan@277
|
151
|
jcallahan@277
|
152 if is_command then
|
jcallahan@277
|
153 spell_name, spell_rank, spell_id = _G.GameTooltip:GetSpell()
|
jcallahan@277
|
154
|
jcallahan@277
|
155 if not spell_name and not spell_id then
|
jcallahan@277
|
156 WDP:Print("Your mouse is not over a spell.")
|
jcallahan@277
|
157 return
|
jcallahan@277
|
158 end
|
jcallahan@277
|
159 else
|
jcallahan@277
|
160 local spell_rank = comment_units.spell.rank
|
jcallahan@277
|
161 spell_id = comment_units.spell.id
|
jcallahan@277
|
162 spell_name = ("%s%s"):format(comment_units.spell.name, (spell_rank ~= "") and (" (%s)"):format(spell_rank) or "")
|
jcallahan@277
|
163 end
|
jcallahan@277
|
164 table.wipe(comment_units)
|
jcallahan@277
|
165 NewComment("SPELL", spell_name, spell_id)
|
jcallahan@277
|
166 end
|
jcallahan@277
|
167
|
jcallahan@270
|
168 local CreateCursorComment
|
jcallahan@249
|
169 do
|
jcallahan@270
|
170 local CURSOR_DATA_FUNCS = {
|
jcallahan@270
|
171 item = function(type_name, id_num, data_subtype)
|
jcallahan@270
|
172 local item_name = _G.GetItemInfo(id_num)
|
jcallahan@270
|
173 NewComment(type_name, item_name, id_num)
|
jcallahan@270
|
174 end,
|
jcallahan@270
|
175 merchant = function(type_name, item_index)
|
jcallahan@270
|
176 local item_link = _G.GetMerchantItemLink(item_index)
|
jcallahan@270
|
177 local item_name = _G.GetItemInfo(item_link)
|
jcallahan@270
|
178 NewComment(type_name, item_name, ItemLinkToID(item_link))
|
jcallahan@270
|
179 end,
|
jcallahan@270
|
180 spell = function(type_name, data, data_subtype, spell_id)
|
jcallahan@270
|
181 local spell_name = _G.GetSpellInfo(spell_id)
|
jcallahan@270
|
182 NewComment(type_name, spell_name, spell_id)
|
jcallahan@270
|
183 end,
|
jcallahan@270
|
184 }
|
jcallahan@270
|
185
|
jcallahan@270
|
186 function CreateCursorComment()
|
jcallahan@270
|
187 local data_type, data, data_subtype, subdata = _G.GetCursorInfo()
|
jcallahan@270
|
188 local comment_func = CURSOR_DATA_FUNCS[data_type]
|
jcallahan@270
|
189
|
jcallahan@270
|
190 if not comment_func then
|
jcallahan@270
|
191 WDP:Print("Unable to determine comment subject from cursor.")
|
jcallahan@270
|
192 return
|
jcallahan@270
|
193 end
|
jcallahan@270
|
194 comment_func(DATA_TYPE_MAPPING[data_type] or data_type:upper(), data, data_subtype, subdata)
|
jcallahan@270
|
195 end
|
jcallahan@270
|
196 end -- do-block
|
jcallahan@270
|
197
|
jcallahan@270
|
198 local function CreateQuestComment()
|
MMOSimca@581
|
199 local index = _G.C_QuestLog.GetSelectedQuest()
|
jcallahan@270
|
200
|
MMOSimca@335
|
201 if not index or not _G.QuestMapFrame:IsVisible() then
|
MMOSimca@335
|
202 WDP:Print("You must select a quest from the World Map's Quest frame.")
|
jcallahan@270
|
203 return
|
jcallahan@270
|
204 end
|
MMOSimca@581
|
205 local info = _G.C_QuestLog.GetInfo(index)
|
jcallahan@270
|
206
|
MMOSimca@581
|
207 if not info or info.isHeader then
|
MMOSimca@335
|
208 WDP:Print("You must select a quest from the World Map's Quest frame.")
|
jcallahan@270
|
209 return
|
jcallahan@270
|
210 end
|
MMOSimca@581
|
211 NewComment("QUEST", info.title, info.questID)
|
jcallahan@270
|
212 end
|
jcallahan@270
|
213
|
jcallahan@270
|
214 local function CreateAchievementComment()
|
MMOSimca@335
|
215 if not _G.AchievementFrame or not _G.AchievementFrame:IsVisible() or not _G.AchievementFrameAchievements.selection then
|
jcallahan@270
|
216 WDP:Print("You must select an achievement from the Achievement frame.")
|
jcallahan@270
|
217 return
|
jcallahan@270
|
218 end
|
jcallahan@270
|
219
|
jcallahan@270
|
220 for _, button in next, _G.AchievementFrameAchievementsContainer.buttons do
|
jcallahan@270
|
221 if button.selected then
|
jcallahan@270
|
222 NewComment("ACHIEVEMENT", button.label:GetText(), button.id)
|
jcallahan@270
|
223 break
|
jcallahan@270
|
224 end
|
jcallahan@270
|
225 end
|
jcallahan@270
|
226 end
|
jcallahan@270
|
227
|
jcallahan@270
|
228 local ShowPossibleSubjects
|
jcallahan@270
|
229 do
|
jcallahan@270
|
230 local display
|
jcallahan@270
|
231 local old_x, old_y, click_time
|
jcallahan@270
|
232
|
jcallahan@270
|
233 _G.WorldFrame:HookScript("OnMouseDown", function(frame, ...)
|
jcallahan@270
|
234 old_x, old_y = _G.GetCursorPosition()
|
jcallahan@270
|
235 click_time = _G.GetTime()
|
jcallahan@270
|
236 end)
|
jcallahan@270
|
237
|
jcallahan@270
|
238 _G.WorldFrame:HookScript("OnMouseUp", function(frame, ...)
|
jcallahan@270
|
239 if not display then
|
jcallahan@270
|
240 return
|
jcallahan@270
|
241 end
|
jcallahan@270
|
242 local x, y = _G.GetCursorPosition()
|
jcallahan@270
|
243
|
jcallahan@270
|
244 if not old_x or not old_y or not x or not y or not click_time then
|
jcallahan@270
|
245 display = display:Release()
|
jcallahan@270
|
246 return
|
jcallahan@270
|
247 end
|
jcallahan@270
|
248
|
jcallahan@270
|
249 if (_G.math.abs(x - old_x) + _G.math.abs(y - old_y)) <= 5 and _G.GetTime() - click_time < 1 then
|
jcallahan@270
|
250 display = display:Release()
|
jcallahan@270
|
251 end
|
jcallahan@270
|
252 end)
|
jcallahan@270
|
253
|
jcallahan@270
|
254 local function CreateComment(cell, func)
|
jcallahan@271
|
255 if _G.type(func) == "table" then
|
jcallahan@271
|
256 func[1](func[2])
|
jcallahan@271
|
257 else
|
jcallahan@271
|
258 func()
|
jcallahan@271
|
259 end
|
jcallahan@270
|
260 display = display:Release()
|
jcallahan@270
|
261 end
|
jcallahan@270
|
262
|
jcallahan@270
|
263 local CURSOR_NAME_FUNCS = {
|
jcallahan@270
|
264 item = function(id_num)
|
jcallahan@270
|
265 return _G.GetItemInfo(id_num)
|
jcallahan@270
|
266 end,
|
jcallahan@270
|
267 merchant = function(item_index)
|
jcallahan@270
|
268 return _G.GetItemInfo(_G.GetMerchantItemLink(item_index))
|
jcallahan@270
|
269 end,
|
jcallahan@270
|
270 spell = function(data, data_subtype, spell_id)
|
jcallahan@270
|
271 return _G.GetSpellInfo(spell_id)
|
jcallahan@270
|
272 end,
|
jcallahan@270
|
273 }
|
jcallahan@270
|
274
|
jcallahan@270
|
275 local VALID_UNITS = {
|
jcallahan@270
|
276 boss1 = true,
|
jcallahan@270
|
277 boss2 = true,
|
jcallahan@270
|
278 boss3 = true,
|
jcallahan@270
|
279 boss4 = true,
|
jcallahan@270
|
280 focus = true,
|
jcallahan@270
|
281 mouseover = true,
|
jcallahan@270
|
282 npc = true,
|
jcallahan@270
|
283 target = true,
|
jcallahan@270
|
284 }
|
jcallahan@270
|
285
|
jcallahan@270
|
286 function ShowPossibleSubjects(anchor)
|
jcallahan@270
|
287 if not display then
|
jcallahan@270
|
288 display = LQT:Acquire(ADDON_NAME, 1, "LEFT")
|
jcallahan@270
|
289 display:EnableMouse(true)
|
jcallahan@270
|
290 end
|
jcallahan@270
|
291
|
jcallahan@270
|
292 if anchor then
|
jcallahan@270
|
293 display:SmartAnchorTo(anchor)
|
jcallahan@270
|
294 display:SetAutoHideDelay(0.2, anchor)
|
jcallahan@270
|
295 else
|
jcallahan@270
|
296 display:SetPoint("CENTER", _G.UIParent, "CENTER", 0, 0)
|
jcallahan@270
|
297 end
|
jcallahan@270
|
298 display:Clear()
|
jcallahan@270
|
299 display:AddHeader("Choose comment subject:", "CENTER")
|
jcallahan@270
|
300 display:AddSeparator()
|
jcallahan@270
|
301 display:AddSeparator()
|
jcallahan@270
|
302
|
jcallahan@270
|
303 local line
|
jcallahan@270
|
304
|
jcallahan@270
|
305 for unit_id in pairs(VALID_UNITS) do
|
jcallahan@270
|
306 if _G.UnitExists(unit_id) then
|
jcallahan@270
|
307 local unit_type, unit_idnum = ParseGUID(_G.UnitGUID(unit_id))
|
jcallahan@275
|
308 local unit_name = _G.UnitName(unit_id)
|
jcallahan@270
|
309
|
jcallahan@270
|
310 if unit_idnum then
|
jcallahan@275
|
311 comment_units[unit_id] = {
|
jcallahan@275
|
312 idnum = unit_idnum,
|
jcallahan@275
|
313 name = unit_name,
|
jcallahan@275
|
314 type = unit_type,
|
jcallahan@275
|
315 }
|
jcallahan@275
|
316 line = display:AddLine(("%s: %s"):format(unit_id:gsub("^%l", _G.string.upper), unit_name))
|
jcallahan@271
|
317 display:SetLineScript(line, "OnMouseUp", CreateComment, { CreateUnitComment, unit_id })
|
jcallahan@270
|
318 end
|
jcallahan@270
|
319 end
|
jcallahan@270
|
320 end
|
jcallahan@270
|
321
|
MMOSimca@335
|
322 if _G.AchievementFrame and _G.AchievementFrame:IsVisible() and _G.AchievementFrameAchievements.selection then
|
jcallahan@270
|
323 for _, button in next, _G.AchievementFrameAchievementsContainer.buttons do
|
jcallahan@270
|
324 if button.selected then
|
jcallahan@270
|
325 line = display:AddLine(("Achievement: %s"):format(button.label:GetText()))
|
jcallahan@270
|
326 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateAchievementComment)
|
jcallahan@270
|
327 break
|
jcallahan@270
|
328 end
|
jcallahan@270
|
329 end
|
jcallahan@270
|
330 end
|
jcallahan@270
|
331 local data_type, data, data_subtype, subdata = _G.GetCursorInfo()
|
jcallahan@270
|
332 local name_func = CURSOR_NAME_FUNCS[data_type]
|
jcallahan@270
|
333
|
jcallahan@270
|
334 if name_func then
|
jcallahan@270
|
335 line = display:AddLine(("Cursor: %s"):format(name_func(data, data_subtype, subdata)))
|
jcallahan@270
|
336 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateCursorComment)
|
jcallahan@270
|
337 end
|
jcallahan@277
|
338 local spell_name, spell_rank, spell_id = _G.GameTooltip:GetSpell()
|
jcallahan@277
|
339
|
jcallahan@277
|
340 if spell_name and spell_rank and spell_id then
|
jcallahan@277
|
341 comment_units.spell = {
|
jcallahan@277
|
342 id = spell_id,
|
jcallahan@277
|
343 name = spell_name,
|
jcallahan@277
|
344 rank = spell_rank,
|
jcallahan@277
|
345 }
|
jcallahan@277
|
346
|
jcallahan@277
|
347 line = display:AddLine(("Spell: %s%s"):format(spell_name, (spell_rank ~= "") and (" (%s)"):format(spell_rank) or ""))
|
jcallahan@277
|
348 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateSpellComment)
|
jcallahan@277
|
349 end
|
jcallahan@277
|
350
|
jcallahan@276
|
351 local item_name, item_link = _G.GameTooltip:GetItem()
|
jcallahan@276
|
352
|
jcallahan@276
|
353 if item_name and item_link then
|
jcallahan@276
|
354 comment_units.item = {
|
jcallahan@276
|
355 link = item_link,
|
jcallahan@276
|
356 name = item_name,
|
jcallahan@276
|
357 }
|
jcallahan@277
|
358
|
jcallahan@276
|
359 line = display:AddLine(("Item: %s"):format(item_name))
|
jcallahan@276
|
360 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateItemComment)
|
jcallahan@276
|
361 end
|
jcallahan@270
|
362
|
MMOSimca@581
|
363 local quest_index = _G.C_QuestLog.GetSelectedQuest()
|
jcallahan@270
|
364
|
MMOSimca@335
|
365 if quest_index and _G.QuestMapFrame:IsVisible() and not _G.QuestScrollFrame:IsVisible() then
|
MMOSimca@581
|
366 local info = _G.C_QuestLog.GetInfo(quest_index)
|
jcallahan@270
|
367
|
MMOSimca@581
|
368 if info and not info.isHeader then
|
MMOSimca@581
|
369 line = display:AddLine(("Quest: %s"):format(info.title))
|
jcallahan@270
|
370 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateQuestComment)
|
jcallahan@270
|
371 end
|
jcallahan@270
|
372 end
|
jcallahan@270
|
373
|
jcallahan@270
|
374 if display:GetLineCount() == 3 then
|
jcallahan@272
|
375 display = display:Release()
|
jcallahan@270
|
376 WDP:Print("There are no possible comment subjects.")
|
jcallahan@270
|
377 return
|
jcallahan@270
|
378 end
|
jcallahan@270
|
379 display:Show()
|
jcallahan@270
|
380 end
|
jcallahan@272
|
381
|
jcallahan@272
|
382 WDP.ShowPossibleSubjects = ShowPossibleSubjects -- For Keybinding.
|
jcallahan@270
|
383 end -- do-block
|
jcallahan@270
|
384
|
jcallahan@270
|
385 -- METHODS ------------------------------------------------------------
|
jcallahan@270
|
386
|
jcallahan@270
|
387 function private.ProcessCommentCommand(arg)
|
jcallahan@270
|
388 if not arg or arg == "" then
|
jcallahan@270
|
389 ShowPossibleSubjects(nil)
|
jcallahan@270
|
390 return
|
jcallahan@270
|
391 end
|
jcallahan@270
|
392
|
jcallahan@270
|
393 if arg == "achievement" then
|
jcallahan@270
|
394 CreateAchievementComment()
|
jcallahan@270
|
395 return
|
jcallahan@270
|
396 elseif arg == "cursor" then
|
jcallahan@270
|
397 CreateCursorComment()
|
jcallahan@270
|
398 return
|
jcallahan@276
|
399 elseif arg == "item" then
|
jcallahan@276
|
400 CreateItemComment(true)
|
jcallahan@276
|
401 return
|
jcallahan@270
|
402 elseif arg == "quest" then
|
jcallahan@270
|
403 CreateQuestComment()
|
jcallahan@270
|
404 return
|
jcallahan@277
|
405 elseif arg == "spell" then
|
MMOSimca@429
|
406 CreateSpellComment(true)
|
jcallahan@277
|
407 return
|
jcallahan@270
|
408 end
|
jcallahan@275
|
409 CreateUnitComment(arg, true)
|
jcallahan@270
|
410 end
|
jcallahan@270
|
411
|
jcallahan@270
|
412 function private.InitializeCommentSystem()
|
jcallahan@249
|
413 local panel = _G.CreateFrame("Frame", "WDP_CommentFrame", _G.UIParent, "TranslucentFrameTemplate")
|
jcallahan@258
|
414 panel:SetSize(480, 350)
|
jcallahan@249
|
415 panel:SetPoint("CENTER", _G.UIParent, "CENTER")
|
jcallahan@249
|
416 panel:SetFrameStrata("DIALOG")
|
jcallahan@249
|
417 panel.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Rock]], true, true)
|
jcallahan@249
|
418 panel.Bg:SetHorizTile(true)
|
jcallahan@249
|
419 panel.Bg:SetVertTile(true)
|
jcallahan@264
|
420 panel:EnableMouse(true)
|
jcallahan@264
|
421 panel:SetMovable(true)
|
jcallahan@249
|
422 panel:Hide()
|
jcallahan@249
|
423 comment_frame = panel
|
jcallahan@249
|
424
|
jcallahan@249
|
425 table.insert(_G.UISpecialFrames, panel:GetName())
|
jcallahan@249
|
426
|
jcallahan@249
|
427 local streaks = panel:CreateTexture("$parentTopTileStreaks", "BORDER", "_UI-Frame-TopTileStreaks", -6)
|
jcallahan@249
|
428 streaks:SetPoint("TOPLEFT", 13, -13)
|
jcallahan@249
|
429 streaks:SetPoint("BOTTOMRIGHT", panel, "TOPRIGHT", -13, -35)
|
jcallahan@249
|
430
|
jcallahan@249
|
431 local header = _G.CreateFrame("Frame", "$parentHeader", panel, "TranslucentFrameTemplate")
|
jcallahan@249
|
432 header:SetSize(128, 64)
|
jcallahan@249
|
433 header:SetPoint("CENTER", panel, "TOP", 0, -8)
|
jcallahan@249
|
434 header.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Marble]])
|
jcallahan@249
|
435 header.Bg:SetHorizTile(true)
|
jcallahan@249
|
436 header.Bg:SetVertTile(true)
|
jcallahan@264
|
437 header:SetMovable(true)
|
jcallahan@264
|
438
|
jcallahan@264
|
439 header:SetScript("OnMouseDown", function()
|
jcallahan@264
|
440 panel:StartMoving()
|
jcallahan@264
|
441 end)
|
jcallahan@264
|
442
|
jcallahan@264
|
443 header:SetScript("OnMouseUp", function()
|
jcallahan@264
|
444 panel:StopMovingOrSizing()
|
jcallahan@264
|
445 end)
|
jcallahan@264
|
446
|
jcallahan@249
|
447 panel.header = header
|
jcallahan@249
|
448
|
jcallahan@249
|
449 local logo = header:CreateTexture(nil, "ARTWORK")
|
jcallahan@249
|
450 logo:SetTexture([[Interface\AddOns\WoWDBProfiler\wowdb-logo]])
|
jcallahan@249
|
451 logo:SetPoint("TOPLEFT", header, 10, -10)
|
jcallahan@249
|
452 logo:SetPoint("BOTTOMRIGHT", header, -10, 10)
|
jcallahan@249
|
453
|
jcallahan@258
|
454 local subject_name = panel:CreateFontString(nil, "ARTWORK", "GameFontNormal")
|
jcallahan@258
|
455 subject_name:SetPoint("TOP", header, "BOTTOM", 0, -10)
|
jcallahan@258
|
456 panel.subject_name = subject_name
|
jcallahan@258
|
457
|
jcallahan@258
|
458 local subject_data = panel:CreateFontString(nil, "ARTWORK", "GameFontNormal")
|
jcallahan@258
|
459 subject_data:SetPoint("TOP", subject_name, "BOTTOM", 0, -3)
|
jcallahan@258
|
460 panel.subject_data = subject_data
|
jcallahan@249
|
461
|
jcallahan@249
|
462 local close = _G.CreateFrame("Button", nil, panel, "UIPanelCloseButton")
|
jcallahan@249
|
463 close:SetPoint("TOPRIGHT", panel, "TOPRIGHT", -7, -7)
|
jcallahan@249
|
464
|
jcallahan@249
|
465 local scroll_frame = _G.CreateFrame("ScrollFrame", "$parentScrollFrame", panel)
|
jcallahan@249
|
466 scroll_frame:SetSize(435, 150)
|
jcallahan@249
|
467 scroll_frame:SetPoint("BOTTOM", 0, 70)
|
jcallahan@249
|
468
|
jcallahan@249
|
469 scroll_frame:SetScript("OnScrollRangeChanged", function(self, x, y)
|
jcallahan@249
|
470 _G.ScrollFrame_OnScrollRangeChanged(self, x, y)
|
jcallahan@249
|
471 end)
|
jcallahan@249
|
472
|
jcallahan@249
|
473 scroll_frame:SetScript("OnVerticalScroll", function(self, offset)
|
jcallahan@249
|
474 local scrollbar = self.ScrollBar
|
jcallahan@249
|
475 scrollbar:SetValue(offset)
|
jcallahan@249
|
476
|
jcallahan@249
|
477 local min, max = scrollbar:GetMinMaxValues()
|
jcallahan@249
|
478
|
jcallahan@249
|
479 if offset == 0 then
|
jcallahan@249
|
480 scrollbar.ScrollUpButton:Disable()
|
jcallahan@249
|
481 else
|
jcallahan@249
|
482 scrollbar.ScrollUpButton:Enable()
|
jcallahan@249
|
483 end
|
jcallahan@249
|
484
|
jcallahan@249
|
485 if (scrollbar:GetValue() - max) == 0 then
|
jcallahan@249
|
486 scrollbar.ScrollDownButton:Disable()
|
jcallahan@249
|
487 else
|
jcallahan@249
|
488 scrollbar.ScrollDownButton:Enable()
|
jcallahan@249
|
489 end
|
jcallahan@249
|
490 end)
|
jcallahan@249
|
491
|
jcallahan@249
|
492 scroll_frame:SetScript("OnMouseWheel", function(self, delta)
|
jcallahan@249
|
493 _G.ScrollFrameTemplate_OnMouseWheel(self, delta)
|
jcallahan@249
|
494 end)
|
jcallahan@249
|
495
|
jcallahan@266
|
496 -- This is needed because the EditBox starts with a height of a single line, so getting focus on click would require finding the EditBox blindly.
|
jcallahan@266
|
497 scroll_frame:SetScript("OnMouseUp", function(self)
|
jcallahan@266
|
498 _G.EditBox_SetFocus(self.edit_box)
|
jcallahan@266
|
499 end)
|
jcallahan@266
|
500
|
jcallahan@258
|
501 panel.scroll_frame = scroll_frame
|
jcallahan@258
|
502
|
MMOSimca@581
|
503 local edit_container = _G.CreateFrame("Frame", nil, scroll_frame, BackdropTemplateMixin and "BackdropTemplate")
|
jcallahan@249
|
504 edit_container:SetPoint("TOPLEFT", scroll_frame, -7, 7)
|
jcallahan@249
|
505 edit_container:SetPoint("BOTTOMRIGHT", scroll_frame, 7, -7)
|
jcallahan@249
|
506 edit_container:SetFrameLevel(scroll_frame:GetFrameLevel() - 1)
|
jcallahan@249
|
507 edit_container:SetBackdrop({
|
jcallahan@249
|
508 bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
|
jcallahan@249
|
509 edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]],
|
jcallahan@249
|
510 tile = true,
|
jcallahan@249
|
511 tileSize = 16,
|
jcallahan@249
|
512 edgeSize = 16,
|
jcallahan@249
|
513 insets = {
|
jcallahan@249
|
514 left = 5,
|
jcallahan@249
|
515 right = 5,
|
jcallahan@249
|
516 top = 5,
|
jcallahan@249
|
517 bottom = 5
|
jcallahan@249
|
518 }
|
jcallahan@249
|
519 })
|
jcallahan@249
|
520
|
jcallahan@249
|
521 edit_container:SetBackdropBorderColor(_G.TOOLTIP_DEFAULT_COLOR.r, _G.TOOLTIP_DEFAULT_COLOR.g, _G.TOOLTIP_DEFAULT_COLOR.b)
|
jcallahan@249
|
522 edit_container:SetBackdropColor(0, 0, 0)
|
MMOSimca@581
|
523 edit_container:ApplyBackdrop()
|
jcallahan@249
|
524
|
jcallahan@259
|
525 local link_button = _G.CreateFrame("Button", "$parentLinkButton", panel)
|
jcallahan@259
|
526 link_button:SetSize(32, 16)
|
jcallahan@259
|
527 link_button:SetPoint("TOPRIGHT", edit_container, "BOTTOMRIGHT", 5, 0)
|
jcallahan@259
|
528
|
jcallahan@259
|
529 link_button:SetNormalTexture([[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]])
|
jcallahan@259
|
530 link_button:GetNormalTexture():SetTexCoord(0, 1, 0, 0.5)
|
jcallahan@259
|
531
|
jcallahan@259
|
532 link_button:SetHighlightTexture([[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]])
|
jcallahan@259
|
533 link_button:GetHighlightTexture():SetTexCoord(0, 1, 0.5, 1)
|
jcallahan@259
|
534
|
jcallahan@259
|
535 link_button:SetScript("OnClick", function(self)
|
jcallahan@259
|
536 Dialog:Spawn("WDP_CommentLink", { type_name = comment_subject.type_name, id = comment_subject.id, label = comment_subject.label })
|
jcallahan@259
|
537 end)
|
jcallahan@259
|
538
|
jcallahan@259
|
539 link_button:SetScript("OnEnter", function(self)
|
jcallahan@259
|
540 _G.GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
|
jcallahan@259
|
541 _G.GameTooltip:SetText(LINK_COMMENT_TOOLTIP, nil, nil, nil, nil, 1)
|
jcallahan@259
|
542 _G.GameTooltip:Show()
|
jcallahan@259
|
543 end)
|
jcallahan@259
|
544
|
jcallahan@259
|
545 link_button:SetScript("OnLeave", _G.GameTooltip_Hide)
|
jcallahan@259
|
546
|
jcallahan@266
|
547 local edit_description = edit_container:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
|
jcallahan@258
|
548 edit_description:SetHeight(36)
|
jcallahan@258
|
549 edit_description:SetPoint("BOTTOMLEFT", edit_container, "TOPLEFT", 5, 3)
|
jcallahan@258
|
550 edit_description:SetPoint("BOTTOMRIGHT", edit_container, "TOPRIGHT", 5, 3)
|
jcallahan@258
|
551 edit_description:SetFormattedText(EDIT_DESCRIPTION_FORMAT, _G.BreakUpLargeNumbers(EDIT_MAXCHARS))
|
jcallahan@258
|
552 edit_description:SetWordWrap(true)
|
jcallahan@258
|
553 edit_description:SetJustifyH("LEFT")
|
jcallahan@258
|
554
|
jcallahan@266
|
555 local edit_box = _G.CreateFrame("EditBox", "$parentEditBox", scroll_frame)
|
jcallahan@249
|
556 edit_box:SetMultiLine(true)
|
jcallahan@258
|
557 edit_box:SetMaxLetters(EDIT_MAXCHARS)
|
jcallahan@249
|
558 edit_box:EnableMouse(true)
|
jcallahan@249
|
559 edit_box:SetAutoFocus(false)
|
jcallahan@249
|
560 edit_box:SetFontObject("ChatFontNormal")
|
jcallahan@249
|
561 edit_box:SetSize(420, 220)
|
jcallahan@249
|
562 edit_box:HighlightText(0)
|
jcallahan@266
|
563 edit_box:SetFrameLevel(scroll_frame:GetFrameLevel() + 1)
|
jcallahan@249
|
564
|
jcallahan@249
|
565 edit_box:SetScript("OnCursorChanged", _G.ScrollingEdit_OnCursorChanged)
|
jcallahan@249
|
566 edit_box:SetScript("OnEscapePressed", _G.EditBox_ClearFocus)
|
jcallahan@249
|
567 edit_box:SetScript("OnShow", function(self)
|
jcallahan@249
|
568 _G.EditBox_SetFocus(self)
|
jcallahan@249
|
569
|
jcallahan@249
|
570 if self:GetNumLetters() > 0 then
|
jcallahan@249
|
571 panel.submitButton:Enable()
|
jcallahan@249
|
572 else
|
jcallahan@249
|
573 panel.submitButton:Disable()
|
jcallahan@249
|
574 end
|
jcallahan@249
|
575 end)
|
jcallahan@249
|
576
|
jcallahan@249
|
577 edit_box:SetScript("OnTextChanged", function(self, user_input)
|
jcallahan@249
|
578 local parent = self:GetParent()
|
jcallahan@249
|
579 local num_letters = self:GetNumLetters()
|
jcallahan@249
|
580 _G.ScrollingEdit_OnTextChanged(self, parent)
|
jcallahan@258
|
581 parent.charCount:SetFormattedText(_G.BreakUpLargeNumbers(self:GetMaxLetters() - num_letters))
|
jcallahan@249
|
582
|
jcallahan@249
|
583 if num_letters > 0 then
|
jcallahan@249
|
584 panel.submitButton:Enable();
|
jcallahan@258
|
585 else
|
jcallahan@258
|
586 panel.submitButton:Disable()
|
jcallahan@249
|
587 end
|
jcallahan@249
|
588 end)
|
jcallahan@249
|
589
|
jcallahan@249
|
590 edit_box:SetScript("OnUpdate", function(self, elapsed)
|
jcallahan@249
|
591 _G.ScrollingEdit_OnUpdate(self, elapsed, self:GetParent())
|
jcallahan@249
|
592 end)
|
jcallahan@249
|
593
|
jcallahan@258
|
594 scroll_frame.edit_box = edit_box
|
jcallahan@249
|
595 scroll_frame:SetScrollChild(edit_box)
|
jcallahan@249
|
596
|
jcallahan@249
|
597 local char_count = scroll_frame:CreateFontString(nil, "OVERLAY", "GameFontDisableLarge")
|
jcallahan@249
|
598 char_count:SetPoint("BOTTOMRIGHT", -15, 0)
|
jcallahan@249
|
599 scroll_frame.charCount = char_count
|
jcallahan@249
|
600
|
jcallahan@249
|
601 local scroll_bar = _G.CreateFrame("Slider", "$parentScrollBar", scroll_frame, "UIPanelScrollBarTemplate")
|
jcallahan@249
|
602 scroll_bar:SetPoint("TOPLEFT", scroll_frame, "TOPRIGHT", -13, -16)
|
jcallahan@249
|
603 scroll_bar:SetPoint("BOTTOMLEFT", scroll_frame, "BOTTOMRIGHT", -13, 16)
|
jcallahan@249
|
604 scroll_frame.ScrollBar = scroll_bar
|
jcallahan@249
|
605
|
jcallahan@249
|
606 _G.ScrollFrame_OnLoad(scroll_frame)
|
jcallahan@249
|
607
|
jcallahan@249
|
608 local submit = _G.CreateFrame("Button", "$parentSubmit", panel, "GameMenuButtonTemplate")
|
jcallahan@249
|
609 submit:SetSize(160, 30)
|
jcallahan@249
|
610 submit:SetPoint("BOTTOM", 0, 15)
|
jcallahan@249
|
611 submit:SetText(_G.SUBMIT)
|
jcallahan@249
|
612 submit:Enable(false)
|
jcallahan@249
|
613
|
jcallahan@249
|
614 submit:SetScript("OnClick", function()
|
jcallahan@263
|
615 local entry = DBEntry(URL_TYPE_MAP[comment_subject.type_name], comment_subject.id)
|
jcallahan@263
|
616
|
jcallahan@263
|
617 if not entry then
|
jcallahan@263
|
618 WDP:Print("An error has occurred; please report at http://wow.curseforge.com/addons/wowdb-profiler/create-ticket/")
|
jcallahan@263
|
619 return
|
jcallahan@263
|
620 end
|
jcallahan@263
|
621 entry.comments = entry.comments or {}
|
jcallahan@263
|
622 entry.comments[#entry.comments + 1] = edit_box:GetText()
|
jcallahan@263
|
623
|
jcallahan@249
|
624 edit_box:SetText("")
|
jcallahan@249
|
625 _G.HideUIPanel(panel)
|
jcallahan@249
|
626 end)
|
jcallahan@249
|
627 panel.submitButton = submit
|
jcallahan@270
|
628
|
jcallahan@275
|
629 -- local data_obj = LibStub("LibDataBroker-1.1"):NewDataObject(ADDON_NAME, {
|
jcallahan@275
|
630 -- type = "data source",
|
jcallahan@275
|
631 -- label = ADDON_NAME,
|
jcallahan@275
|
632 -- text = " ",
|
jcallahan@275
|
633 -- icon = [[Interface\CHATFRAME\UI-ChatIcon-Chat-Up]],
|
jcallahan@275
|
634 -- OnClick = function(self, button, down)
|
jcallahan@275
|
635 -- ShowPossibleSubjects(self)
|
jcallahan@275
|
636 -- end,
|
jcallahan@275
|
637 -- OnTooltipShow = function(self)
|
jcallahan@275
|
638 -- self:AddLine(_G.CLICK_TO_ENTER_COMMENT)
|
jcallahan@275
|
639 -- end,
|
jcallahan@275
|
640 -- })
|
jcallahan@275
|
641 --
|
jcallahan@275
|
642 -- private.data_obj = data_obj
|
jcallahan@275
|
643 -- LibStub("LibDBIcon-1.0"):Register(ADDON_NAME, data_obj, private.db.global.config.minimap_icon)
|
jcallahan@270
|
644
|
MMOSimca@581
|
645 TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, function(self)
|
jcallahan@276
|
646 end)
|
jcallahan@276
|
647
|
jcallahan@272
|
648 _G["BINDING_HEADER_WOWDB_PROFILER"] = "WoWDB Profiler"
|
jcallahan@249
|
649 end
|