annotate Comments.lua @ 427:181c7f8cd087 6.0.3-8

Removed hacky workaround for duplicate world bosses, since the only use was in MoP and nobody will care about that boss now.
author MMOSimca <MMOSimca@gmail.com>
date Tue, 13 Jan 2015 03:48:22 -0500
parents 4a4ed54e4201
children 95af8e72aa19
rev   line source
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()
jcallahan@270 199 local index = _G.GetQuestLogSelection()
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@375 205 local title, _, _, is_header, _, _, _, idnum = _G.GetQuestLogTitle(index)
jcallahan@270 206
jcallahan@270 207 if is_header 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
jcallahan@270 211 NewComment("QUEST", title, idnum)
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
jcallahan@270 363 local quest_index = _G.GetQuestLogSelection()
jcallahan@270 364
MMOSimca@335 365 if quest_index and _G.QuestMapFrame:IsVisible() and not _G.QuestScrollFrame:IsVisible() then
MMOSimca@375 366 local title, _, _, is_header = _G.GetQuestLogTitle(quest_index)
jcallahan@270 367
jcallahan@270 368 if not is_header then
jcallahan@270 369 line = display:AddLine(("Quest: %s"):format(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
jcallahan@277 406 CreateSpellComent(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
jcallahan@249 503 local edit_container = _G.CreateFrame("Frame", nil, scroll_frame)
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)
jcallahan@249 523
jcallahan@259 524 local link_button = _G.CreateFrame("Button", "$parentLinkButton", panel)
jcallahan@259 525 link_button:SetSize(32, 16)
jcallahan@259 526 link_button:SetPoint("TOPRIGHT", edit_container, "BOTTOMRIGHT", 5, 0)
jcallahan@259 527
jcallahan@259 528 link_button:SetNormalTexture([[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]])
jcallahan@259 529 link_button:GetNormalTexture():SetTexCoord(0, 1, 0, 0.5)
jcallahan@259 530
jcallahan@259 531 link_button:SetHighlightTexture([[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]])
jcallahan@259 532 link_button:GetHighlightTexture():SetTexCoord(0, 1, 0.5, 1)
jcallahan@259 533
jcallahan@259 534 link_button:SetScript("OnClick", function(self)
jcallahan@259 535 Dialog:Spawn("WDP_CommentLink", { type_name = comment_subject.type_name, id = comment_subject.id, label = comment_subject.label })
jcallahan@259 536 end)
jcallahan@259 537
jcallahan@259 538 link_button:SetScript("OnEnter", function(self)
jcallahan@259 539 _G.GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
jcallahan@259 540 _G.GameTooltip:SetText(LINK_COMMENT_TOOLTIP, nil, nil, nil, nil, 1)
jcallahan@259 541 _G.GameTooltip:Show()
jcallahan@259 542 end)
jcallahan@259 543
jcallahan@259 544 link_button:SetScript("OnLeave", _G.GameTooltip_Hide)
jcallahan@259 545
jcallahan@266 546 local edit_description = edit_container:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
jcallahan@258 547 edit_description:SetHeight(36)
jcallahan@258 548 edit_description:SetPoint("BOTTOMLEFT", edit_container, "TOPLEFT", 5, 3)
jcallahan@258 549 edit_description:SetPoint("BOTTOMRIGHT", edit_container, "TOPRIGHT", 5, 3)
jcallahan@258 550 edit_description:SetFormattedText(EDIT_DESCRIPTION_FORMAT, _G.BreakUpLargeNumbers(EDIT_MAXCHARS))
jcallahan@258 551 edit_description:SetWordWrap(true)
jcallahan@258 552 edit_description:SetJustifyH("LEFT")
jcallahan@258 553
jcallahan@266 554 local edit_box = _G.CreateFrame("EditBox", "$parentEditBox", scroll_frame)
jcallahan@249 555 edit_box:SetMultiLine(true)
jcallahan@258 556 edit_box:SetMaxLetters(EDIT_MAXCHARS)
jcallahan@249 557 edit_box:EnableMouse(true)
jcallahan@249 558 edit_box:SetAutoFocus(false)
jcallahan@249 559 edit_box:SetFontObject("ChatFontNormal")
jcallahan@249 560 edit_box:SetSize(420, 220)
jcallahan@249 561 edit_box:HighlightText(0)
jcallahan@266 562 edit_box:SetFrameLevel(scroll_frame:GetFrameLevel() + 1)
jcallahan@249 563
jcallahan@249 564 edit_box:SetScript("OnCursorChanged", _G.ScrollingEdit_OnCursorChanged)
jcallahan@249 565 edit_box:SetScript("OnEscapePressed", _G.EditBox_ClearFocus)
jcallahan@249 566 edit_box:SetScript("OnShow", function(self)
jcallahan@249 567 _G.EditBox_SetFocus(self)
jcallahan@249 568
jcallahan@249 569 if self:GetNumLetters() > 0 then
jcallahan@249 570 panel.submitButton:Enable()
jcallahan@249 571 else
jcallahan@249 572 panel.submitButton:Disable()
jcallahan@249 573 end
jcallahan@249 574 end)
jcallahan@249 575
jcallahan@249 576 edit_box:SetScript("OnTextChanged", function(self, user_input)
jcallahan@249 577 local parent = self:GetParent()
jcallahan@249 578 local num_letters = self:GetNumLetters()
jcallahan@249 579 _G.ScrollingEdit_OnTextChanged(self, parent)
jcallahan@258 580 parent.charCount:SetFormattedText(_G.BreakUpLargeNumbers(self:GetMaxLetters() - num_letters))
jcallahan@249 581
jcallahan@249 582 if num_letters > 0 then
jcallahan@249 583 panel.submitButton:Enable();
jcallahan@258 584 else
jcallahan@258 585 panel.submitButton:Disable()
jcallahan@249 586 end
jcallahan@249 587 end)
jcallahan@249 588
jcallahan@249 589 edit_box:SetScript("OnUpdate", function(self, elapsed)
jcallahan@249 590 _G.ScrollingEdit_OnUpdate(self, elapsed, self:GetParent())
jcallahan@249 591 end)
jcallahan@249 592
jcallahan@258 593 scroll_frame.edit_box = edit_box
jcallahan@249 594 scroll_frame:SetScrollChild(edit_box)
jcallahan@249 595
jcallahan@249 596 local char_count = scroll_frame:CreateFontString(nil, "OVERLAY", "GameFontDisableLarge")
jcallahan@249 597 char_count:SetPoint("BOTTOMRIGHT", -15, 0)
jcallahan@249 598 scroll_frame.charCount = char_count
jcallahan@249 599
jcallahan@249 600 local scroll_bar = _G.CreateFrame("Slider", "$parentScrollBar", scroll_frame, "UIPanelScrollBarTemplate")
jcallahan@249 601 scroll_bar:SetPoint("TOPLEFT", scroll_frame, "TOPRIGHT", -13, -16)
jcallahan@249 602 scroll_bar:SetPoint("BOTTOMLEFT", scroll_frame, "BOTTOMRIGHT", -13, 16)
jcallahan@249 603 scroll_frame.ScrollBar = scroll_bar
jcallahan@249 604
jcallahan@249 605 _G.ScrollFrame_OnLoad(scroll_frame)
jcallahan@249 606
jcallahan@249 607 local submit = _G.CreateFrame("Button", "$parentSubmit", panel, "GameMenuButtonTemplate")
jcallahan@249 608 submit:SetSize(160, 30)
jcallahan@249 609 submit:SetPoint("BOTTOM", 0, 15)
jcallahan@249 610 submit:SetText(_G.SUBMIT)
jcallahan@249 611 submit:Enable(false)
jcallahan@249 612
jcallahan@249 613 submit:SetScript("OnClick", function()
jcallahan@263 614 local entry = DBEntry(URL_TYPE_MAP[comment_subject.type_name], comment_subject.id)
jcallahan@263 615
jcallahan@263 616 if not entry then
jcallahan@263 617 WDP:Print("An error has occurred; please report at http://wow.curseforge.com/addons/wowdb-profiler/create-ticket/")
jcallahan@263 618 return
jcallahan@263 619 end
jcallahan@263 620 entry.comments = entry.comments or {}
jcallahan@263 621 entry.comments[#entry.comments + 1] = edit_box:GetText()
jcallahan@263 622
jcallahan@249 623 edit_box:SetText("")
jcallahan@249 624 _G.HideUIPanel(panel)
jcallahan@249 625 end)
jcallahan@249 626 panel.submitButton = submit
jcallahan@270 627
jcallahan@275 628 -- local data_obj = LibStub("LibDataBroker-1.1"):NewDataObject(ADDON_NAME, {
jcallahan@275 629 -- type = "data source",
jcallahan@275 630 -- label = ADDON_NAME,
jcallahan@275 631 -- text = " ",
jcallahan@275 632 -- icon = [[Interface\CHATFRAME\UI-ChatIcon-Chat-Up]],
jcallahan@275 633 -- OnClick = function(self, button, down)
jcallahan@275 634 -- ShowPossibleSubjects(self)
jcallahan@275 635 -- end,
jcallahan@275 636 -- OnTooltipShow = function(self)
jcallahan@275 637 -- self:AddLine(_G.CLICK_TO_ENTER_COMMENT)
jcallahan@275 638 -- end,
jcallahan@275 639 -- })
jcallahan@275 640 --
jcallahan@275 641 -- private.data_obj = data_obj
jcallahan@275 642 -- LibStub("LibDBIcon-1.0"):Register(ADDON_NAME, data_obj, private.db.global.config.minimap_icon)
jcallahan@270 643
jcallahan@276 644 _G.GameTooltip:HookScript("OnTooltipSetItem", function(self)
jcallahan@276 645 end)
jcallahan@276 646
jcallahan@272 647 _G["BINDING_HEADER_WOWDB_PROFILER"] = "WoWDB Profiler"
jcallahan@249 648 end