annotate Comments.lua @ 268:b6036060c096

Cleanup.
author James D. Callahan III <jcallahan@curse.com>
date Wed, 20 Mar 2013 13:02:29 -0500
parents f6f1d49b2a43
children 463b0f117b1b
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@267 8
jcallahan@249 9 -- ADDON NAMESPACE ----------------------------------------------------
jcallahan@249 10
jcallahan@249 11 local ADDON_NAME, private = ...
jcallahan@249 12
jcallahan@249 13 local LibStub = _G.LibStub
jcallahan@249 14 local WDP = LibStub("AceAddon-3.0"):GetAddon(ADDON_NAME)
jcallahan@259 15 local Dialog = LibStub("LibDialog-1.0")
jcallahan@249 16
jcallahan@249 17 local ParseGUID = private.ParseGUID
jcallahan@260 18 local ItemLinkToID = private.ItemLinkToID
jcallahan@263 19 local DBEntry = private.DBEntry
jcallahan@249 20
jcallahan@258 21 -- CONSTANTS ----------------------------------------------------------
jcallahan@258 22
jcallahan@258 23 local EDIT_MAXCHARS = 3000
jcallahan@259 24 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 25 local LINK_COMMENT_TOOLTIP = "Click here to create a link to the comment page on WoWDB."
jcallahan@261 26 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 27
jcallahan@259 28 local URL_BASE = "http://www.wowdb.com/"
jcallahan@259 29
jcallahan@259 30 local URL_TYPE_MAP = {
jcallahan@267 31 ACHIEVEMENT = "achievements",
jcallahan@259 32 ITEM = "items",
jcallahan@259 33 OBJECT = "objects",
jcallahan@259 34 NPC = "npcs",
jcallahan@261 35 QUEST = "quests",
jcallahan@260 36 SPELL = "spells",
jcallahan@259 37 VEHICLE = "npcs",
jcallahan@259 38 }
jcallahan@259 39
jcallahan@259 40 Dialog:Register("WDP_CommentLink", {
jcallahan@259 41 text = "",
jcallahan@259 42 editboxes = {
jcallahan@259 43 {
jcallahan@259 44 text = _G.UNKNOWN,
jcallahan@259 45 on_escape_pressed = function(self)
jcallahan@259 46 self:ClearFocus()
jcallahan@259 47 end,
jcallahan@265 48 on_enter_pressed = function(self)
jcallahan@265 49 self:GetParent().buttons[1]:Click()
jcallahan@265 50 end,
jcallahan@259 51 },
jcallahan@259 52 },
jcallahan@259 53 buttons = {
jcallahan@259 54 {
jcallahan@259 55 text = _G.OKAY,
jcallahan@259 56 }
jcallahan@259 57 },
jcallahan@259 58 show_while_dead = true,
jcallahan@259 59 hide_on_escape = true,
jcallahan@259 60 is_exclusive = true,
jcallahan@259 61 on_show = function(self, data)
jcallahan@259 62 local editbox = self.editboxes[1]
jcallahan@259 63 editbox:SetWidth(self:GetWidth() - 20)
jcallahan@259 64 editbox:SetText(("%s%s/%d#related:comments"):format(URL_BASE, URL_TYPE_MAP[data.type_name], data.id))
jcallahan@259 65 editbox:HighlightText()
jcallahan@259 66 editbox:SetFocus()
jcallahan@259 67
jcallahan@261 68 self.text:SetJustifyH("LEFT")
jcallahan@259 69 self.text:SetFormattedText(LINK_EDITBOX_DESC_FORMAT:format(data.label))
jcallahan@259 70 end,
jcallahan@259 71 })
jcallahan@259 72
jcallahan@259 73 local comment_subject = {}
jcallahan@258 74
jcallahan@249 75 -- HELPERS ------------------------------------------------------------
jcallahan@249 76
jcallahan@249 77 local comment_frame
jcallahan@249 78 do
jcallahan@249 79 local panel = _G.CreateFrame("Frame", "WDP_CommentFrame", _G.UIParent, "TranslucentFrameTemplate")
jcallahan@258 80 panel:SetSize(480, 350)
jcallahan@249 81 panel:SetPoint("CENTER", _G.UIParent, "CENTER")
jcallahan@249 82 panel:SetFrameStrata("DIALOG")
jcallahan@249 83 panel.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Rock]], true, true)
jcallahan@249 84 panel.Bg:SetHorizTile(true)
jcallahan@249 85 panel.Bg:SetVertTile(true)
jcallahan@264 86 panel:EnableMouse(true)
jcallahan@264 87 panel:SetMovable(true)
jcallahan@249 88 panel:Hide()
jcallahan@249 89 comment_frame = panel
jcallahan@249 90
jcallahan@249 91 table.insert(_G.UISpecialFrames, panel:GetName())
jcallahan@249 92
jcallahan@249 93 local streaks = panel:CreateTexture("$parentTopTileStreaks", "BORDER", "_UI-Frame-TopTileStreaks", -6)
jcallahan@249 94 streaks:SetPoint("TOPLEFT", 13, -13)
jcallahan@249 95 streaks:SetPoint("BOTTOMRIGHT", panel, "TOPRIGHT", -13, -35)
jcallahan@249 96
jcallahan@249 97 local header = _G.CreateFrame("Frame", "$parentHeader", panel, "TranslucentFrameTemplate")
jcallahan@249 98 header:SetSize(128, 64)
jcallahan@249 99 header:SetPoint("CENTER", panel, "TOP", 0, -8)
jcallahan@249 100 header.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Marble]])
jcallahan@249 101 header.Bg:SetHorizTile(true)
jcallahan@249 102 header.Bg:SetVertTile(true)
jcallahan@264 103 header:SetMovable(true)
jcallahan@264 104
jcallahan@264 105 header:SetScript("OnMouseDown", function()
jcallahan@264 106 panel:StartMoving()
jcallahan@264 107 end)
jcallahan@264 108
jcallahan@264 109 header:SetScript("OnMouseUp", function()
jcallahan@264 110 panel:StopMovingOrSizing()
jcallahan@264 111 end)
jcallahan@264 112
jcallahan@249 113 panel.header = header
jcallahan@249 114
jcallahan@249 115 local logo = header:CreateTexture(nil, "ARTWORK")
jcallahan@249 116 logo:SetTexture([[Interface\AddOns\WoWDBProfiler\wowdb-logo]])
jcallahan@249 117 logo:SetPoint("TOPLEFT", header, 10, -10)
jcallahan@249 118 logo:SetPoint("BOTTOMRIGHT", header, -10, 10)
jcallahan@249 119
jcallahan@258 120 local subject_name = panel:CreateFontString(nil, "ARTWORK", "GameFontNormal")
jcallahan@258 121 subject_name:SetPoint("TOP", header, "BOTTOM", 0, -10)
jcallahan@258 122 panel.subject_name = subject_name
jcallahan@258 123
jcallahan@258 124 local subject_data = panel:CreateFontString(nil, "ARTWORK", "GameFontNormal")
jcallahan@258 125 subject_data:SetPoint("TOP", subject_name, "BOTTOM", 0, -3)
jcallahan@258 126 panel.subject_data = subject_data
jcallahan@249 127
jcallahan@249 128 local close = _G.CreateFrame("Button", nil, panel, "UIPanelCloseButton")
jcallahan@249 129 close:SetPoint("TOPRIGHT", panel, "TOPRIGHT", -7, -7)
jcallahan@249 130
jcallahan@249 131 local scroll_frame = _G.CreateFrame("ScrollFrame", "$parentScrollFrame", panel)
jcallahan@249 132 scroll_frame:SetSize(435, 150)
jcallahan@249 133 scroll_frame:SetPoint("BOTTOM", 0, 70)
jcallahan@249 134
jcallahan@249 135 scroll_frame:SetScript("OnScrollRangeChanged", function(self, x, y)
jcallahan@249 136 _G.ScrollFrame_OnScrollRangeChanged(self, x, y)
jcallahan@249 137 end)
jcallahan@249 138
jcallahan@249 139 scroll_frame:SetScript("OnVerticalScroll", function(self, offset)
jcallahan@249 140 local scrollbar = self.ScrollBar
jcallahan@249 141 scrollbar:SetValue(offset)
jcallahan@249 142
jcallahan@249 143 local min, max = scrollbar:GetMinMaxValues()
jcallahan@249 144
jcallahan@249 145 if offset == 0 then
jcallahan@249 146 scrollbar.ScrollUpButton:Disable()
jcallahan@249 147 else
jcallahan@249 148 scrollbar.ScrollUpButton:Enable()
jcallahan@249 149 end
jcallahan@249 150
jcallahan@249 151 if (scrollbar:GetValue() - max) == 0 then
jcallahan@249 152 scrollbar.ScrollDownButton:Disable()
jcallahan@249 153 else
jcallahan@249 154 scrollbar.ScrollDownButton:Enable()
jcallahan@249 155 end
jcallahan@249 156 end)
jcallahan@249 157
jcallahan@249 158 scroll_frame:SetScript("OnMouseWheel", function(self, delta)
jcallahan@249 159 _G.ScrollFrameTemplate_OnMouseWheel(self, delta)
jcallahan@249 160 end)
jcallahan@249 161
jcallahan@266 162 -- 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 163 scroll_frame:SetScript("OnMouseUp", function(self)
jcallahan@266 164 _G.EditBox_SetFocus(self.edit_box)
jcallahan@266 165 end)
jcallahan@266 166
jcallahan@258 167 panel.scroll_frame = scroll_frame
jcallahan@258 168
jcallahan@249 169 local edit_container = _G.CreateFrame("Frame", nil, scroll_frame)
jcallahan@249 170 edit_container:SetPoint("TOPLEFT", scroll_frame, -7, 7)
jcallahan@249 171 edit_container:SetPoint("BOTTOMRIGHT", scroll_frame, 7, -7)
jcallahan@249 172 edit_container:SetFrameLevel(scroll_frame:GetFrameLevel() - 1)
jcallahan@249 173 edit_container:SetBackdrop({
jcallahan@249 174 bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
jcallahan@249 175 edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]],
jcallahan@249 176 tile = true,
jcallahan@249 177 tileSize = 16,
jcallahan@249 178 edgeSize = 16,
jcallahan@249 179 insets = {
jcallahan@249 180 left = 5,
jcallahan@249 181 right = 5,
jcallahan@249 182 top = 5,
jcallahan@249 183 bottom = 5
jcallahan@249 184 }
jcallahan@249 185 })
jcallahan@249 186
jcallahan@249 187 edit_container:SetBackdropBorderColor(_G.TOOLTIP_DEFAULT_COLOR.r, _G.TOOLTIP_DEFAULT_COLOR.g, _G.TOOLTIP_DEFAULT_COLOR.b)
jcallahan@249 188 edit_container:SetBackdropColor(0, 0, 0)
jcallahan@249 189
jcallahan@259 190 local link_button = _G.CreateFrame("Button", "$parentLinkButton", panel)
jcallahan@259 191 link_button:SetSize(32, 16)
jcallahan@259 192 link_button:SetPoint("TOPRIGHT", edit_container, "BOTTOMRIGHT", 5, 0)
jcallahan@259 193
jcallahan@259 194 link_button:SetNormalTexture([[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]])
jcallahan@259 195 link_button:GetNormalTexture():SetTexCoord(0, 1, 0, 0.5)
jcallahan@259 196
jcallahan@259 197 link_button:SetHighlightTexture([[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]])
jcallahan@259 198 link_button:GetHighlightTexture():SetTexCoord(0, 1, 0.5, 1)
jcallahan@259 199
jcallahan@259 200 link_button:SetScript("OnClick", function(self)
jcallahan@259 201 Dialog:Spawn("WDP_CommentLink", { type_name = comment_subject.type_name, id = comment_subject.id, label = comment_subject.label })
jcallahan@259 202 end)
jcallahan@259 203
jcallahan@259 204 link_button:SetScript("OnEnter", function(self)
jcallahan@259 205 _G.GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
jcallahan@259 206 _G.GameTooltip:SetText(LINK_COMMENT_TOOLTIP, nil, nil, nil, nil, 1)
jcallahan@259 207 _G.GameTooltip:Show()
jcallahan@259 208 end)
jcallahan@259 209
jcallahan@259 210 link_button:SetScript("OnLeave", _G.GameTooltip_Hide)
jcallahan@259 211
jcallahan@266 212 local edit_description = edit_container:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
jcallahan@258 213 edit_description:SetHeight(36)
jcallahan@258 214 edit_description:SetPoint("BOTTOMLEFT", edit_container, "TOPLEFT", 5, 3)
jcallahan@258 215 edit_description:SetPoint("BOTTOMRIGHT", edit_container, "TOPRIGHT", 5, 3)
jcallahan@258 216 edit_description:SetFormattedText(EDIT_DESCRIPTION_FORMAT, _G.BreakUpLargeNumbers(EDIT_MAXCHARS))
jcallahan@258 217 edit_description:SetWordWrap(true)
jcallahan@258 218 edit_description:SetJustifyH("LEFT")
jcallahan@258 219
jcallahan@266 220 local edit_box = _G.CreateFrame("EditBox", "$parentEditBox", scroll_frame)
jcallahan@249 221 edit_box:SetMultiLine(true)
jcallahan@258 222 edit_box:SetMaxLetters(EDIT_MAXCHARS)
jcallahan@249 223 edit_box:EnableMouse(true)
jcallahan@249 224 edit_box:SetAutoFocus(false)
jcallahan@249 225 edit_box:SetFontObject("ChatFontNormal")
jcallahan@249 226 edit_box:SetSize(420, 220)
jcallahan@249 227 edit_box:HighlightText(0)
jcallahan@266 228 edit_box:SetFrameLevel(scroll_frame:GetFrameLevel() + 1)
jcallahan@249 229
jcallahan@249 230 edit_box:SetScript("OnCursorChanged", _G.ScrollingEdit_OnCursorChanged)
jcallahan@249 231 edit_box:SetScript("OnEscapePressed", _G.EditBox_ClearFocus)
jcallahan@249 232 edit_box:SetScript("OnShow", function(self)
jcallahan@249 233 _G.EditBox_SetFocus(self)
jcallahan@249 234
jcallahan@249 235 if self:GetNumLetters() > 0 then
jcallahan@249 236 panel.submitButton:Enable()
jcallahan@249 237 else
jcallahan@249 238 panel.submitButton:Disable()
jcallahan@249 239 end
jcallahan@249 240 end)
jcallahan@249 241
jcallahan@249 242 edit_box:SetScript("OnTextChanged", function(self, user_input)
jcallahan@249 243 local parent = self:GetParent()
jcallahan@249 244 local num_letters = self:GetNumLetters()
jcallahan@249 245 _G.ScrollingEdit_OnTextChanged(self, parent)
jcallahan@258 246 parent.charCount:SetFormattedText(_G.BreakUpLargeNumbers(self:GetMaxLetters() - num_letters))
jcallahan@249 247
jcallahan@249 248 if num_letters > 0 then
jcallahan@249 249 panel.submitButton:Enable();
jcallahan@258 250 else
jcallahan@258 251 panel.submitButton:Disable()
jcallahan@249 252 end
jcallahan@249 253 end)
jcallahan@249 254
jcallahan@249 255 edit_box:SetScript("OnUpdate", function(self, elapsed)
jcallahan@249 256 _G.ScrollingEdit_OnUpdate(self, elapsed, self:GetParent())
jcallahan@249 257 end)
jcallahan@249 258
jcallahan@258 259 scroll_frame.edit_box = edit_box
jcallahan@249 260 scroll_frame:SetScrollChild(edit_box)
jcallahan@249 261
jcallahan@249 262 local char_count = scroll_frame:CreateFontString(nil, "OVERLAY", "GameFontDisableLarge")
jcallahan@249 263 char_count:SetPoint("BOTTOMRIGHT", -15, 0)
jcallahan@249 264 scroll_frame.charCount = char_count
jcallahan@249 265
jcallahan@249 266 local scroll_bar = _G.CreateFrame("Slider", "$parentScrollBar", scroll_frame, "UIPanelScrollBarTemplate")
jcallahan@249 267 scroll_bar:SetPoint("TOPLEFT", scroll_frame, "TOPRIGHT", -13, -16)
jcallahan@249 268 scroll_bar:SetPoint("BOTTOMLEFT", scroll_frame, "BOTTOMRIGHT", -13, 16)
jcallahan@249 269 scroll_frame.ScrollBar = scroll_bar
jcallahan@249 270
jcallahan@249 271 _G.ScrollFrame_OnLoad(scroll_frame)
jcallahan@249 272
jcallahan@249 273 local submit = _G.CreateFrame("Button", "$parentSubmit", panel, "GameMenuButtonTemplate")
jcallahan@249 274 submit:SetSize(160, 30)
jcallahan@249 275 submit:SetPoint("BOTTOM", 0, 15)
jcallahan@249 276 submit:SetText(_G.SUBMIT)
jcallahan@249 277 submit:Enable(false)
jcallahan@249 278
jcallahan@249 279 submit:SetScript("OnClick", function()
jcallahan@263 280 local entry = DBEntry(URL_TYPE_MAP[comment_subject.type_name], comment_subject.id)
jcallahan@263 281
jcallahan@263 282 if not entry then
jcallahan@263 283 WDP:Print("An error has occurred; please report at http://wow.curseforge.com/addons/wowdb-profiler/create-ticket/")
jcallahan@263 284 return
jcallahan@263 285 end
jcallahan@263 286 entry.comments = entry.comments or {}
jcallahan@263 287 entry.comments[#entry.comments + 1] = edit_box:GetText()
jcallahan@263 288
jcallahan@249 289 edit_box:SetText("")
jcallahan@249 290 _G.HideUIPanel(panel)
jcallahan@249 291 end)
jcallahan@249 292 panel.submitButton = submit
jcallahan@249 293 end
jcallahan@249 294
jcallahan@268 295 local function NewComment(type_name, label, id)
jcallahan@268 296 comment_subject.id = id
jcallahan@268 297 comment_subject.label = label
jcallahan@268 298 comment_subject.type_name = type_name
jcallahan@268 299
jcallahan@268 300 comment_frame.subject_name:SetText(label)
jcallahan@268 301 comment_frame.subject_data:SetFormattedText("(%s #%d)", type_name, id)
jcallahan@268 302 comment_frame.scroll_frame.edit_box:SetText("")
jcallahan@268 303 _G.ShowUIPanel(comment_frame)
jcallahan@268 304 end
jcallahan@268 305
jcallahan@260 306 local function CreateUnitComment(unit_id)
jcallahan@260 307 if not _G.UnitExists(unit_id) then
jcallahan@260 308 WDP:Printf("Unit '%s' does not exist.", unit_id)
jcallahan@260 309 return
jcallahan@260 310 end
jcallahan@260 311 local unit_type, unit_idnum = ParseGUID(_G.UnitGUID(unit_id))
jcallahan@260 312
jcallahan@260 313 if not unit_idnum then
jcallahan@260 314 WDP:Printf("Unable to determine unit from '%s'", unit_id)
jcallahan@260 315 return
jcallahan@260 316 end
jcallahan@259 317 local type_name = private.UNIT_TYPE_NAMES[unit_type + 1]
jcallahan@259 318 local unit_name = _G.UnitName(unit_id)
jcallahan@268 319 NewComment(type_name, unit_name, unit_idnum)
jcallahan@249 320 end
jcallahan@249 321
jcallahan@260 322 local DATA_TYPE_MAPPING = {
jcallahan@260 323 merchant = "ITEM",
jcallahan@260 324 }
jcallahan@260 325
jcallahan@268 326 local CreateCursorComment
jcallahan@268 327 do
jcallahan@268 328 local CURSOR_DATA_FUNCS = {
jcallahan@268 329 item = function(type_name, id_num, data_subtype)
jcallahan@268 330 local item_name = _G.GetItemInfo(id_num)
jcallahan@268 331 NewComment(type_name, item_name, id_num)
jcallahan@268 332 end,
jcallahan@268 333 merchant = function(type_name, item_index)
jcallahan@268 334 local item_link = _G.GetMerchantItemLink(item_index)
jcallahan@268 335 local item_name = _G.GetItemInfo(item_link)
jcallahan@268 336 NewComment(type_name, item_name, ItemLinkToID(item_link))
jcallahan@268 337 end,
jcallahan@268 338 spell = function(type_name, data, data_subtype, spell_id)
jcallahan@268 339 local spell_name = _G.GetSpellInfo(spell_id)
jcallahan@268 340 NewComment(type_name, spell_name, spell_id)
jcallahan@268 341 end,
jcallahan@268 342 }
jcallahan@260 343
jcallahan@268 344 function CreateCursorComment()
jcallahan@268 345 local data_type, data, data_subtype, subdata = _G.GetCursorInfo()
jcallahan@260 346
jcallahan@268 347 if not CURSOR_DATA_FUNCS[data_type] then
jcallahan@268 348 WDP:Print("Unable to determine comment subject from cursor.")
jcallahan@268 349 return
jcallahan@268 350 end
jcallahan@268 351 CURSOR_DATA_FUNCS[data_type](DATA_TYPE_MAPPING[data_type] or data_type:upper(), data, data_subtype, subdata)
jcallahan@260 352 end
jcallahan@249 353 end
jcallahan@249 354
jcallahan@261 355 local function CreateQuestComment()
jcallahan@261 356 local index = _G.GetQuestLogSelection()
jcallahan@261 357
jcallahan@261 358 if not index or not _G.QuestLogFrame:IsShown() then
jcallahan@261 359 WDP:Print("You must select a quest from the Quest frame.")
jcallahan@261 360 return
jcallahan@261 361 end
jcallahan@261 362 local title, _, tag, _, is_header, _, _, _, idnum = _G.GetQuestLogTitle(index)
jcallahan@261 363
jcallahan@261 364 if is_header then
jcallahan@261 365 WDP:Print("You must select a quest from the Quest frame.")
jcallahan@261 366 return
jcallahan@261 367 end
jcallahan@268 368 NewComment("QUEST", title, idnum)
jcallahan@261 369 end
jcallahan@261 370
jcallahan@267 371 local function CreateAchievementComment()
jcallahan@267 372 if not _G.AchievementFrame or not _G.AchievementFrameAchievements.selection then
jcallahan@267 373 WDP:Print("You must select an achievement from the Achievement frame.")
jcallahan@267 374 return
jcallahan@267 375 end
jcallahan@267 376
jcallahan@267 377 for _, button in next, _G.AchievementFrameAchievementsContainer.buttons do
jcallahan@267 378 if button.selected then
jcallahan@268 379 NewComment("ACHIEVEMENT", button.label:GetText(), button.id)
jcallahan@267 380 break
jcallahan@267 381 end
jcallahan@267 382 end
jcallahan@267 383 end
jcallahan@267 384
jcallahan@249 385 -- METHODS ------------------------------------------------------------
jcallahan@249 386
jcallahan@249 387 function private.ProcessCommentCommand(arg)
jcallahan@249 388 if not arg or arg == "" then
jcallahan@249 389 WDP:Print("You must supply a valid comment type.")
jcallahan@249 390 return
jcallahan@249 391 end
jcallahan@249 392
jcallahan@267 393 if arg == "achievement" then
jcallahan@267 394 CreateAchievementComment()
jcallahan@267 395 return
jcallahan@267 396 elseif arg == "cursor" then
jcallahan@260 397 CreateCursorComment()
jcallahan@249 398 return
jcallahan@261 399 elseif arg == "quest" then
jcallahan@261 400 CreateQuestComment()
jcallahan@261 401 return
jcallahan@249 402 end
jcallahan@260 403 CreateUnitComment(arg)
jcallahan@249 404 end