annotate Comments.lua @ 275:ac6163ed8330

Resolve unit details while building the comment subject menu so units which are no longer valid afterward can still be commented on while the menu is up.
author James D. Callahan III <jcallahan@curse.com>
date Tue, 26 Mar 2013 22:57:18 -0500
parents e9670d6c6bf1
children a43a9444659e
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
jcallahan@270 118 local type_name = private.UNIT_TYPE_NAMES[unit_type + 1]
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@270 129 local CreateCursorComment
jcallahan@249 130 do
jcallahan@270 131 local CURSOR_DATA_FUNCS = {
jcallahan@270 132 item = function(type_name, id_num, data_subtype)
jcallahan@270 133 local item_name = _G.GetItemInfo(id_num)
jcallahan@270 134 NewComment(type_name, item_name, id_num)
jcallahan@270 135 end,
jcallahan@270 136 merchant = function(type_name, item_index)
jcallahan@270 137 local item_link = _G.GetMerchantItemLink(item_index)
jcallahan@270 138 local item_name = _G.GetItemInfo(item_link)
jcallahan@270 139 NewComment(type_name, item_name, ItemLinkToID(item_link))
jcallahan@270 140 end,
jcallahan@270 141 spell = function(type_name, data, data_subtype, spell_id)
jcallahan@270 142 local spell_name = _G.GetSpellInfo(spell_id)
jcallahan@270 143 NewComment(type_name, spell_name, spell_id)
jcallahan@270 144 end,
jcallahan@270 145 }
jcallahan@270 146
jcallahan@270 147 function CreateCursorComment()
jcallahan@270 148 local data_type, data, data_subtype, subdata = _G.GetCursorInfo()
jcallahan@270 149 local comment_func = CURSOR_DATA_FUNCS[data_type]
jcallahan@270 150
jcallahan@270 151 if not comment_func then
jcallahan@270 152 WDP:Print("Unable to determine comment subject from cursor.")
jcallahan@270 153 return
jcallahan@270 154 end
jcallahan@270 155 comment_func(DATA_TYPE_MAPPING[data_type] or data_type:upper(), data, data_subtype, subdata)
jcallahan@270 156 end
jcallahan@270 157 end -- do-block
jcallahan@270 158
jcallahan@270 159 local function CreateQuestComment()
jcallahan@270 160 local index = _G.GetQuestLogSelection()
jcallahan@270 161
jcallahan@270 162 if not index or not _G.QuestLogFrame:IsShown() then
jcallahan@270 163 WDP:Print("You must select a quest from the Quest frame.")
jcallahan@270 164 return
jcallahan@270 165 end
jcallahan@270 166 local title, _, tag, _, is_header, _, _, _, idnum = _G.GetQuestLogTitle(index)
jcallahan@270 167
jcallahan@270 168 if is_header then
jcallahan@270 169 WDP:Print("You must select a quest from the Quest frame.")
jcallahan@270 170 return
jcallahan@270 171 end
jcallahan@270 172 NewComment("QUEST", title, idnum)
jcallahan@270 173 end
jcallahan@270 174
jcallahan@270 175 local function CreateAchievementComment()
jcallahan@270 176 if not _G.AchievementFrame or not _G.AchievementFrame:IsShown() or not _G.AchievementFrameAchievements.selection then
jcallahan@270 177 WDP:Print("You must select an achievement from the Achievement frame.")
jcallahan@270 178 return
jcallahan@270 179 end
jcallahan@270 180
jcallahan@270 181 for _, button in next, _G.AchievementFrameAchievementsContainer.buttons do
jcallahan@270 182 if button.selected then
jcallahan@270 183 NewComment("ACHIEVEMENT", button.label:GetText(), button.id)
jcallahan@270 184 break
jcallahan@270 185 end
jcallahan@270 186 end
jcallahan@270 187 end
jcallahan@270 188
jcallahan@270 189 local ShowPossibleSubjects
jcallahan@270 190 do
jcallahan@270 191 local display
jcallahan@270 192 local old_x, old_y, click_time
jcallahan@270 193
jcallahan@270 194 _G.WorldFrame:HookScript("OnMouseDown", function(frame, ...)
jcallahan@270 195 old_x, old_y = _G.GetCursorPosition()
jcallahan@270 196 click_time = _G.GetTime()
jcallahan@270 197 end)
jcallahan@270 198
jcallahan@270 199 _G.WorldFrame:HookScript("OnMouseUp", function(frame, ...)
jcallahan@270 200 if not display then
jcallahan@270 201 return
jcallahan@270 202 end
jcallahan@270 203 local x, y = _G.GetCursorPosition()
jcallahan@270 204
jcallahan@270 205 if not old_x or not old_y or not x or not y or not click_time then
jcallahan@270 206 display = display:Release()
jcallahan@270 207 return
jcallahan@270 208 end
jcallahan@270 209
jcallahan@270 210 if (_G.math.abs(x - old_x) + _G.math.abs(y - old_y)) <= 5 and _G.GetTime() - click_time < 1 then
jcallahan@270 211 display = display:Release()
jcallahan@270 212 end
jcallahan@270 213 end)
jcallahan@270 214
jcallahan@270 215 local function CreateComment(cell, func)
jcallahan@271 216 if _G.type(func) == "table" then
jcallahan@271 217 func[1](func[2])
jcallahan@271 218 else
jcallahan@271 219 func()
jcallahan@271 220 end
jcallahan@270 221 display = display:Release()
jcallahan@270 222 end
jcallahan@270 223
jcallahan@270 224 local CURSOR_NAME_FUNCS = {
jcallahan@270 225 item = function(id_num)
jcallahan@270 226 return _G.GetItemInfo(id_num)
jcallahan@270 227 end,
jcallahan@270 228 merchant = function(item_index)
jcallahan@270 229 return _G.GetItemInfo(_G.GetMerchantItemLink(item_index))
jcallahan@270 230 end,
jcallahan@270 231 spell = function(data, data_subtype, spell_id)
jcallahan@270 232 return _G.GetSpellInfo(spell_id)
jcallahan@270 233 end,
jcallahan@270 234 }
jcallahan@270 235
jcallahan@270 236 local VALID_UNITS = {
jcallahan@270 237 boss1 = true,
jcallahan@270 238 boss2 = true,
jcallahan@270 239 boss3 = true,
jcallahan@270 240 boss4 = true,
jcallahan@270 241 focus = true,
jcallahan@270 242 mouseover = true,
jcallahan@270 243 npc = true,
jcallahan@270 244 target = true,
jcallahan@270 245 }
jcallahan@270 246
jcallahan@270 247 function ShowPossibleSubjects(anchor)
jcallahan@270 248 if not display then
jcallahan@270 249 display = LQT:Acquire(ADDON_NAME, 1, "LEFT")
jcallahan@270 250 display:EnableMouse(true)
jcallahan@270 251 end
jcallahan@270 252
jcallahan@270 253 if anchor then
jcallahan@270 254 display:SmartAnchorTo(anchor)
jcallahan@270 255 display:SetAutoHideDelay(0.2, anchor)
jcallahan@270 256 else
jcallahan@270 257 display:SetPoint("CENTER", _G.UIParent, "CENTER", 0, 0)
jcallahan@270 258 end
jcallahan@270 259 display:Clear()
jcallahan@270 260 display:AddHeader("Choose comment subject:", "CENTER")
jcallahan@270 261 display:AddSeparator()
jcallahan@270 262 display:AddSeparator()
jcallahan@270 263
jcallahan@270 264 local line
jcallahan@270 265
jcallahan@270 266 for unit_id in pairs(VALID_UNITS) do
jcallahan@270 267 if _G.UnitExists(unit_id) then
jcallahan@270 268 local unit_type, unit_idnum = ParseGUID(_G.UnitGUID(unit_id))
jcallahan@275 269 local unit_name = _G.UnitName(unit_id)
jcallahan@270 270
jcallahan@270 271 if unit_idnum then
jcallahan@275 272 comment_units[unit_id] = {
jcallahan@275 273 idnum = unit_idnum,
jcallahan@275 274 name = unit_name,
jcallahan@275 275 type = unit_type,
jcallahan@275 276 }
jcallahan@275 277 line = display:AddLine(("%s: %s"):format(unit_id:gsub("^%l", _G.string.upper), unit_name))
jcallahan@271 278 display:SetLineScript(line, "OnMouseUp", CreateComment, { CreateUnitComment, unit_id })
jcallahan@270 279 end
jcallahan@270 280 end
jcallahan@270 281 end
jcallahan@270 282
jcallahan@270 283 if _G.AchievementFrame and _G.AchievementFrame:IsShown() and _G.AchievementFrameAchievements.selection then
jcallahan@270 284 for _, button in next, _G.AchievementFrameAchievementsContainer.buttons do
jcallahan@270 285 if button.selected then
jcallahan@270 286 line = display:AddLine(("Achievement: %s"):format(button.label:GetText()))
jcallahan@270 287 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateAchievementComment)
jcallahan@270 288 break
jcallahan@270 289 end
jcallahan@270 290 end
jcallahan@270 291 end
jcallahan@270 292 local data_type, data, data_subtype, subdata = _G.GetCursorInfo()
jcallahan@270 293 local name_func = CURSOR_NAME_FUNCS[data_type]
jcallahan@270 294
jcallahan@270 295 if name_func then
jcallahan@270 296 line = display:AddLine(("Cursor: %s"):format(name_func(data, data_subtype, subdata)))
jcallahan@270 297 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateCursorComment)
jcallahan@270 298 end
jcallahan@270 299
jcallahan@270 300 local quest_index = _G.GetQuestLogSelection()
jcallahan@270 301
jcallahan@270 302 if quest_index and _G.QuestLogFrame:IsShown() then
jcallahan@270 303 local title, _, tag, _, is_header, _, _, _, idnum = _G.GetQuestLogTitle(quest_index)
jcallahan@270 304
jcallahan@270 305 if not is_header then
jcallahan@270 306 line = display:AddLine(("Quest: %s"):format(title))
jcallahan@270 307 display:SetLineScript(line, "OnMouseUp", CreateComment, CreateQuestComment)
jcallahan@270 308 end
jcallahan@270 309 end
jcallahan@270 310
jcallahan@270 311 if display:GetLineCount() == 3 then
jcallahan@272 312 display = display:Release()
jcallahan@270 313 WDP:Print("There are no possible comment subjects.")
jcallahan@270 314 return
jcallahan@270 315 end
jcallahan@270 316 display:Show()
jcallahan@270 317 end
jcallahan@272 318
jcallahan@272 319 WDP.ShowPossibleSubjects = ShowPossibleSubjects -- For Keybinding.
jcallahan@270 320 end -- do-block
jcallahan@270 321
jcallahan@270 322 -- METHODS ------------------------------------------------------------
jcallahan@270 323
jcallahan@270 324 function private.ProcessCommentCommand(arg)
jcallahan@270 325 if not arg or arg == "" then
jcallahan@270 326 ShowPossibleSubjects(nil)
jcallahan@270 327 return
jcallahan@270 328 end
jcallahan@270 329
jcallahan@270 330 if arg == "achievement" then
jcallahan@270 331 CreateAchievementComment()
jcallahan@270 332 return
jcallahan@270 333 elseif arg == "cursor" then
jcallahan@270 334 CreateCursorComment()
jcallahan@270 335 return
jcallahan@270 336 elseif arg == "quest" then
jcallahan@270 337 CreateQuestComment()
jcallahan@270 338 return
jcallahan@270 339 end
jcallahan@275 340 CreateUnitComment(arg, true)
jcallahan@270 341 end
jcallahan@270 342
jcallahan@270 343 function private.InitializeCommentSystem()
jcallahan@249 344 local panel = _G.CreateFrame("Frame", "WDP_CommentFrame", _G.UIParent, "TranslucentFrameTemplate")
jcallahan@258 345 panel:SetSize(480, 350)
jcallahan@249 346 panel:SetPoint("CENTER", _G.UIParent, "CENTER")
jcallahan@249 347 panel:SetFrameStrata("DIALOG")
jcallahan@249 348 panel.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Rock]], true, true)
jcallahan@249 349 panel.Bg:SetHorizTile(true)
jcallahan@249 350 panel.Bg:SetVertTile(true)
jcallahan@264 351 panel:EnableMouse(true)
jcallahan@264 352 panel:SetMovable(true)
jcallahan@249 353 panel:Hide()
jcallahan@249 354 comment_frame = panel
jcallahan@249 355
jcallahan@249 356 table.insert(_G.UISpecialFrames, panel:GetName())
jcallahan@249 357
jcallahan@249 358 local streaks = panel:CreateTexture("$parentTopTileStreaks", "BORDER", "_UI-Frame-TopTileStreaks", -6)
jcallahan@249 359 streaks:SetPoint("TOPLEFT", 13, -13)
jcallahan@249 360 streaks:SetPoint("BOTTOMRIGHT", panel, "TOPRIGHT", -13, -35)
jcallahan@249 361
jcallahan@249 362 local header = _G.CreateFrame("Frame", "$parentHeader", panel, "TranslucentFrameTemplate")
jcallahan@249 363 header:SetSize(128, 64)
jcallahan@249 364 header:SetPoint("CENTER", panel, "TOP", 0, -8)
jcallahan@249 365 header.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Marble]])
jcallahan@249 366 header.Bg:SetHorizTile(true)
jcallahan@249 367 header.Bg:SetVertTile(true)
jcallahan@264 368 header:SetMovable(true)
jcallahan@264 369
jcallahan@264 370 header:SetScript("OnMouseDown", function()
jcallahan@264 371 panel:StartMoving()
jcallahan@264 372 end)
jcallahan@264 373
jcallahan@264 374 header:SetScript("OnMouseUp", function()
jcallahan@264 375 panel:StopMovingOrSizing()
jcallahan@264 376 end)
jcallahan@264 377
jcallahan@249 378 panel.header = header
jcallahan@249 379
jcallahan@249 380 local logo = header:CreateTexture(nil, "ARTWORK")
jcallahan@249 381 logo:SetTexture([[Interface\AddOns\WoWDBProfiler\wowdb-logo]])
jcallahan@249 382 logo:SetPoint("TOPLEFT", header, 10, -10)
jcallahan@249 383 logo:SetPoint("BOTTOMRIGHT", header, -10, 10)
jcallahan@249 384
jcallahan@258 385 local subject_name = panel:CreateFontString(nil, "ARTWORK", "GameFontNormal")
jcallahan@258 386 subject_name:SetPoint("TOP", header, "BOTTOM", 0, -10)
jcallahan@258 387 panel.subject_name = subject_name
jcallahan@258 388
jcallahan@258 389 local subject_data = panel:CreateFontString(nil, "ARTWORK", "GameFontNormal")
jcallahan@258 390 subject_data:SetPoint("TOP", subject_name, "BOTTOM", 0, -3)
jcallahan@258 391 panel.subject_data = subject_data
jcallahan@249 392
jcallahan@249 393 local close = _G.CreateFrame("Button", nil, panel, "UIPanelCloseButton")
jcallahan@249 394 close:SetPoint("TOPRIGHT", panel, "TOPRIGHT", -7, -7)
jcallahan@249 395
jcallahan@249 396 local scroll_frame = _G.CreateFrame("ScrollFrame", "$parentScrollFrame", panel)
jcallahan@249 397 scroll_frame:SetSize(435, 150)
jcallahan@249 398 scroll_frame:SetPoint("BOTTOM", 0, 70)
jcallahan@249 399
jcallahan@249 400 scroll_frame:SetScript("OnScrollRangeChanged", function(self, x, y)
jcallahan@249 401 _G.ScrollFrame_OnScrollRangeChanged(self, x, y)
jcallahan@249 402 end)
jcallahan@249 403
jcallahan@249 404 scroll_frame:SetScript("OnVerticalScroll", function(self, offset)
jcallahan@249 405 local scrollbar = self.ScrollBar
jcallahan@249 406 scrollbar:SetValue(offset)
jcallahan@249 407
jcallahan@249 408 local min, max = scrollbar:GetMinMaxValues()
jcallahan@249 409
jcallahan@249 410 if offset == 0 then
jcallahan@249 411 scrollbar.ScrollUpButton:Disable()
jcallahan@249 412 else
jcallahan@249 413 scrollbar.ScrollUpButton:Enable()
jcallahan@249 414 end
jcallahan@249 415
jcallahan@249 416 if (scrollbar:GetValue() - max) == 0 then
jcallahan@249 417 scrollbar.ScrollDownButton:Disable()
jcallahan@249 418 else
jcallahan@249 419 scrollbar.ScrollDownButton:Enable()
jcallahan@249 420 end
jcallahan@249 421 end)
jcallahan@249 422
jcallahan@249 423 scroll_frame:SetScript("OnMouseWheel", function(self, delta)
jcallahan@249 424 _G.ScrollFrameTemplate_OnMouseWheel(self, delta)
jcallahan@249 425 end)
jcallahan@249 426
jcallahan@266 427 -- 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 428 scroll_frame:SetScript("OnMouseUp", function(self)
jcallahan@266 429 _G.EditBox_SetFocus(self.edit_box)
jcallahan@266 430 end)
jcallahan@266 431
jcallahan@258 432 panel.scroll_frame = scroll_frame
jcallahan@258 433
jcallahan@249 434 local edit_container = _G.CreateFrame("Frame", nil, scroll_frame)
jcallahan@249 435 edit_container:SetPoint("TOPLEFT", scroll_frame, -7, 7)
jcallahan@249 436 edit_container:SetPoint("BOTTOMRIGHT", scroll_frame, 7, -7)
jcallahan@249 437 edit_container:SetFrameLevel(scroll_frame:GetFrameLevel() - 1)
jcallahan@249 438 edit_container:SetBackdrop({
jcallahan@249 439 bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
jcallahan@249 440 edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]],
jcallahan@249 441 tile = true,
jcallahan@249 442 tileSize = 16,
jcallahan@249 443 edgeSize = 16,
jcallahan@249 444 insets = {
jcallahan@249 445 left = 5,
jcallahan@249 446 right = 5,
jcallahan@249 447 top = 5,
jcallahan@249 448 bottom = 5
jcallahan@249 449 }
jcallahan@249 450 })
jcallahan@249 451
jcallahan@249 452 edit_container:SetBackdropBorderColor(_G.TOOLTIP_DEFAULT_COLOR.r, _G.TOOLTIP_DEFAULT_COLOR.g, _G.TOOLTIP_DEFAULT_COLOR.b)
jcallahan@249 453 edit_container:SetBackdropColor(0, 0, 0)
jcallahan@249 454
jcallahan@259 455 local link_button = _G.CreateFrame("Button", "$parentLinkButton", panel)
jcallahan@259 456 link_button:SetSize(32, 16)
jcallahan@259 457 link_button:SetPoint("TOPRIGHT", edit_container, "BOTTOMRIGHT", 5, 0)
jcallahan@259 458
jcallahan@259 459 link_button:SetNormalTexture([[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]])
jcallahan@259 460 link_button:GetNormalTexture():SetTexCoord(0, 1, 0, 0.5)
jcallahan@259 461
jcallahan@259 462 link_button:SetHighlightTexture([[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]])
jcallahan@259 463 link_button:GetHighlightTexture():SetTexCoord(0, 1, 0.5, 1)
jcallahan@259 464
jcallahan@259 465 link_button:SetScript("OnClick", function(self)
jcallahan@259 466 Dialog:Spawn("WDP_CommentLink", { type_name = comment_subject.type_name, id = comment_subject.id, label = comment_subject.label })
jcallahan@259 467 end)
jcallahan@259 468
jcallahan@259 469 link_button:SetScript("OnEnter", function(self)
jcallahan@259 470 _G.GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
jcallahan@259 471 _G.GameTooltip:SetText(LINK_COMMENT_TOOLTIP, nil, nil, nil, nil, 1)
jcallahan@259 472 _G.GameTooltip:Show()
jcallahan@259 473 end)
jcallahan@259 474
jcallahan@259 475 link_button:SetScript("OnLeave", _G.GameTooltip_Hide)
jcallahan@259 476
jcallahan@266 477 local edit_description = edit_container:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
jcallahan@258 478 edit_description:SetHeight(36)
jcallahan@258 479 edit_description:SetPoint("BOTTOMLEFT", edit_container, "TOPLEFT", 5, 3)
jcallahan@258 480 edit_description:SetPoint("BOTTOMRIGHT", edit_container, "TOPRIGHT", 5, 3)
jcallahan@258 481 edit_description:SetFormattedText(EDIT_DESCRIPTION_FORMAT, _G.BreakUpLargeNumbers(EDIT_MAXCHARS))
jcallahan@258 482 edit_description:SetWordWrap(true)
jcallahan@258 483 edit_description:SetJustifyH("LEFT")
jcallahan@258 484
jcallahan@266 485 local edit_box = _G.CreateFrame("EditBox", "$parentEditBox", scroll_frame)
jcallahan@249 486 edit_box:SetMultiLine(true)
jcallahan@258 487 edit_box:SetMaxLetters(EDIT_MAXCHARS)
jcallahan@249 488 edit_box:EnableMouse(true)
jcallahan@249 489 edit_box:SetAutoFocus(false)
jcallahan@249 490 edit_box:SetFontObject("ChatFontNormal")
jcallahan@249 491 edit_box:SetSize(420, 220)
jcallahan@249 492 edit_box:HighlightText(0)
jcallahan@266 493 edit_box:SetFrameLevel(scroll_frame:GetFrameLevel() + 1)
jcallahan@249 494
jcallahan@249 495 edit_box:SetScript("OnCursorChanged", _G.ScrollingEdit_OnCursorChanged)
jcallahan@249 496 edit_box:SetScript("OnEscapePressed", _G.EditBox_ClearFocus)
jcallahan@249 497 edit_box:SetScript("OnShow", function(self)
jcallahan@249 498 _G.EditBox_SetFocus(self)
jcallahan@249 499
jcallahan@249 500 if self:GetNumLetters() > 0 then
jcallahan@249 501 panel.submitButton:Enable()
jcallahan@249 502 else
jcallahan@249 503 panel.submitButton:Disable()
jcallahan@249 504 end
jcallahan@249 505 end)
jcallahan@249 506
jcallahan@249 507 edit_box:SetScript("OnTextChanged", function(self, user_input)
jcallahan@249 508 local parent = self:GetParent()
jcallahan@249 509 local num_letters = self:GetNumLetters()
jcallahan@249 510 _G.ScrollingEdit_OnTextChanged(self, parent)
jcallahan@258 511 parent.charCount:SetFormattedText(_G.BreakUpLargeNumbers(self:GetMaxLetters() - num_letters))
jcallahan@249 512
jcallahan@249 513 if num_letters > 0 then
jcallahan@249 514 panel.submitButton:Enable();
jcallahan@258 515 else
jcallahan@258 516 panel.submitButton:Disable()
jcallahan@249 517 end
jcallahan@249 518 end)
jcallahan@249 519
jcallahan@249 520 edit_box:SetScript("OnUpdate", function(self, elapsed)
jcallahan@249 521 _G.ScrollingEdit_OnUpdate(self, elapsed, self:GetParent())
jcallahan@249 522 end)
jcallahan@249 523
jcallahan@258 524 scroll_frame.edit_box = edit_box
jcallahan@249 525 scroll_frame:SetScrollChild(edit_box)
jcallahan@249 526
jcallahan@249 527 local char_count = scroll_frame:CreateFontString(nil, "OVERLAY", "GameFontDisableLarge")
jcallahan@249 528 char_count:SetPoint("BOTTOMRIGHT", -15, 0)
jcallahan@249 529 scroll_frame.charCount = char_count
jcallahan@249 530
jcallahan@249 531 local scroll_bar = _G.CreateFrame("Slider", "$parentScrollBar", scroll_frame, "UIPanelScrollBarTemplate")
jcallahan@249 532 scroll_bar:SetPoint("TOPLEFT", scroll_frame, "TOPRIGHT", -13, -16)
jcallahan@249 533 scroll_bar:SetPoint("BOTTOMLEFT", scroll_frame, "BOTTOMRIGHT", -13, 16)
jcallahan@249 534 scroll_frame.ScrollBar = scroll_bar
jcallahan@249 535
jcallahan@249 536 _G.ScrollFrame_OnLoad(scroll_frame)
jcallahan@249 537
jcallahan@249 538 local submit = _G.CreateFrame("Button", "$parentSubmit", panel, "GameMenuButtonTemplate")
jcallahan@249 539 submit:SetSize(160, 30)
jcallahan@249 540 submit:SetPoint("BOTTOM", 0, 15)
jcallahan@249 541 submit:SetText(_G.SUBMIT)
jcallahan@249 542 submit:Enable(false)
jcallahan@249 543
jcallahan@249 544 submit:SetScript("OnClick", function()
jcallahan@263 545 local entry = DBEntry(URL_TYPE_MAP[comment_subject.type_name], comment_subject.id)
jcallahan@263 546
jcallahan@263 547 if not entry then
jcallahan@263 548 WDP:Print("An error has occurred; please report at http://wow.curseforge.com/addons/wowdb-profiler/create-ticket/")
jcallahan@263 549 return
jcallahan@263 550 end
jcallahan@263 551 entry.comments = entry.comments or {}
jcallahan@263 552 entry.comments[#entry.comments + 1] = edit_box:GetText()
jcallahan@263 553
jcallahan@249 554 edit_box:SetText("")
jcallahan@249 555 _G.HideUIPanel(panel)
jcallahan@249 556 end)
jcallahan@249 557 panel.submitButton = submit
jcallahan@270 558
jcallahan@275 559 -- local data_obj = LibStub("LibDataBroker-1.1"):NewDataObject(ADDON_NAME, {
jcallahan@275 560 -- type = "data source",
jcallahan@275 561 -- label = ADDON_NAME,
jcallahan@275 562 -- text = " ",
jcallahan@275 563 -- icon = [[Interface\CHATFRAME\UI-ChatIcon-Chat-Up]],
jcallahan@275 564 -- OnClick = function(self, button, down)
jcallahan@275 565 -- ShowPossibleSubjects(self)
jcallahan@275 566 -- end,
jcallahan@275 567 -- OnTooltipShow = function(self)
jcallahan@275 568 -- self:AddLine(_G.CLICK_TO_ENTER_COMMENT)
jcallahan@275 569 -- end,
jcallahan@275 570 -- })
jcallahan@275 571 --
jcallahan@275 572 -- private.data_obj = data_obj
jcallahan@275 573 -- LibStub("LibDBIcon-1.0"):Register(ADDON_NAME, data_obj, private.db.global.config.minimap_icon)
jcallahan@270 574
jcallahan@272 575 _G["BINDING_HEADER_WOWDB_PROFILER"] = "WoWDB Profiler"
jcallahan@249 576 end