annotate Comments.lua @ 259:eac4dc8f462e

Added support for opening a page link in a dialog so users can copy/paste the URL for comments on their comment subject.
author James D. Callahan III <jcallahan@curse.com>
date Mon, 18 Mar 2013 15:12:05 -0500
parents 88d2c426f876
children 3558ba83eacd
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@249 7 -- ADDON NAMESPACE ----------------------------------------------------
jcallahan@249 8
jcallahan@249 9 local ADDON_NAME, private = ...
jcallahan@249 10
jcallahan@249 11 local LibStub = _G.LibStub
jcallahan@249 12 local WDP = LibStub("AceAddon-3.0"):GetAddon(ADDON_NAME)
jcallahan@259 13 local Dialog = LibStub("LibDialog-1.0")
jcallahan@249 14
jcallahan@249 15 local ParseGUID = private.ParseGUID
jcallahan@249 16
jcallahan@258 17 -- CONSTANTS ----------------------------------------------------------
jcallahan@258 18
jcallahan@258 19 local EDIT_MAXCHARS = 3000
jcallahan@259 20 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 21 local LINK_COMMENT_TOOLTIP = "Click here to create a link to the comment page on WoWDB."
jcallahan@259 22 local LINK_EDITBOX_DESC_FORMAT = "Copy the highlighted text and paste it into your browser to visit the comments for %s."
jcallahan@259 23
jcallahan@259 24 local URL_BASE = "http://www.wowdb.com/"
jcallahan@259 25
jcallahan@259 26 local URL_TYPE_MAP = {
jcallahan@259 27 ITEM = "items",
jcallahan@259 28 OBJECT = "objects",
jcallahan@259 29 NPC = "npcs",
jcallahan@259 30 VEHICLE = "npcs",
jcallahan@259 31 }
jcallahan@259 32
jcallahan@259 33 Dialog:Register("WDP_CommentLink", {
jcallahan@259 34 text = "",
jcallahan@259 35 editboxes = {
jcallahan@259 36 {
jcallahan@259 37 text = _G.UNKNOWN,
jcallahan@259 38 on_escape_pressed = function(self)
jcallahan@259 39 self:ClearFocus()
jcallahan@259 40 end,
jcallahan@259 41 },
jcallahan@259 42 },
jcallahan@259 43 buttons = {
jcallahan@259 44 {
jcallahan@259 45 text = _G.OKAY,
jcallahan@259 46 }
jcallahan@259 47 },
jcallahan@259 48 show_while_dead = true,
jcallahan@259 49 hide_on_escape = true,
jcallahan@259 50 is_exclusive = true,
jcallahan@259 51 on_show = function(self, data)
jcallahan@259 52 local editbox = self.editboxes[1]
jcallahan@259 53 editbox:SetWidth(self:GetWidth() - 20)
jcallahan@259 54 editbox:SetText(("%s%s/%d#related:comments"):format(URL_BASE, URL_TYPE_MAP[data.type_name], data.id))
jcallahan@259 55 editbox:HighlightText()
jcallahan@259 56 editbox:SetFocus()
jcallahan@259 57
jcallahan@259 58 self.text:SetFormattedText(LINK_EDITBOX_DESC_FORMAT:format(data.label))
jcallahan@259 59 end,
jcallahan@259 60 })
jcallahan@259 61
jcallahan@259 62 local comment_subject = {}
jcallahan@258 63
jcallahan@249 64 -- HELPERS ------------------------------------------------------------
jcallahan@249 65
jcallahan@249 66 local comment_frame
jcallahan@249 67 do
jcallahan@249 68 local panel = _G.CreateFrame("Frame", "WDP_CommentFrame", _G.UIParent, "TranslucentFrameTemplate")
jcallahan@258 69 panel:SetSize(480, 350)
jcallahan@249 70 panel:SetPoint("CENTER", _G.UIParent, "CENTER")
jcallahan@249 71 panel:SetFrameStrata("DIALOG")
jcallahan@249 72 panel.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Rock]], true, true)
jcallahan@249 73 panel.Bg:SetHorizTile(true)
jcallahan@249 74 panel.Bg:SetVertTile(true)
jcallahan@249 75 panel:Hide()
jcallahan@249 76 comment_frame = panel
jcallahan@249 77
jcallahan@249 78 table.insert(_G.UISpecialFrames, panel:GetName())
jcallahan@249 79
jcallahan@249 80 local streaks = panel:CreateTexture("$parentTopTileStreaks", "BORDER", "_UI-Frame-TopTileStreaks", -6)
jcallahan@249 81 streaks:SetPoint("TOPLEFT", 13, -13)
jcallahan@249 82 streaks:SetPoint("BOTTOMRIGHT", panel, "TOPRIGHT", -13, -35)
jcallahan@249 83
jcallahan@249 84 local header = _G.CreateFrame("Frame", "$parentHeader", panel, "TranslucentFrameTemplate")
jcallahan@249 85 header:SetSize(128, 64)
jcallahan@249 86 header:SetPoint("CENTER", panel, "TOP", 0, -8)
jcallahan@249 87 header.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Marble]])
jcallahan@249 88 header.Bg:SetHorizTile(true)
jcallahan@249 89 header.Bg:SetVertTile(true)
jcallahan@249 90 panel.header = header
jcallahan@249 91
jcallahan@249 92 local logo = header:CreateTexture(nil, "ARTWORK")
jcallahan@249 93 logo:SetTexture([[Interface\AddOns\WoWDBProfiler\wowdb-logo]])
jcallahan@249 94 logo:SetPoint("TOPLEFT", header, 10, -10)
jcallahan@249 95 logo:SetPoint("BOTTOMRIGHT", header, -10, 10)
jcallahan@249 96
jcallahan@258 97 local subject_name = panel:CreateFontString(nil, "ARTWORK", "GameFontNormal")
jcallahan@258 98 subject_name:SetPoint("TOP", header, "BOTTOM", 0, -10)
jcallahan@258 99 panel.subject_name = subject_name
jcallahan@258 100
jcallahan@258 101 local subject_data = panel:CreateFontString(nil, "ARTWORK", "GameFontNormal")
jcallahan@258 102 subject_data:SetPoint("TOP", subject_name, "BOTTOM", 0, -3)
jcallahan@258 103 panel.subject_data = subject_data
jcallahan@249 104
jcallahan@249 105 local close = _G.CreateFrame("Button", nil, panel, "UIPanelCloseButton")
jcallahan@249 106 close:SetPoint("TOPRIGHT", panel, "TOPRIGHT", -7, -7)
jcallahan@249 107
jcallahan@249 108 local scroll_frame = _G.CreateFrame("ScrollFrame", "$parentScrollFrame", panel)
jcallahan@249 109 scroll_frame:SetSize(435, 150)
jcallahan@249 110 scroll_frame:SetPoint("BOTTOM", 0, 70)
jcallahan@249 111
jcallahan@249 112 scroll_frame:SetScript("OnScrollRangeChanged", function(self, x, y)
jcallahan@249 113 _G.ScrollFrame_OnScrollRangeChanged(self, x, y)
jcallahan@249 114 end)
jcallahan@249 115
jcallahan@249 116 scroll_frame:SetScript("OnVerticalScroll", function(self, offset)
jcallahan@249 117 local scrollbar = self.ScrollBar
jcallahan@249 118 scrollbar:SetValue(offset)
jcallahan@249 119
jcallahan@249 120 local min, max = scrollbar:GetMinMaxValues()
jcallahan@249 121
jcallahan@249 122 if offset == 0 then
jcallahan@249 123 scrollbar.ScrollUpButton:Disable()
jcallahan@249 124 else
jcallahan@249 125 scrollbar.ScrollUpButton:Enable()
jcallahan@249 126 end
jcallahan@249 127
jcallahan@249 128 if (scrollbar:GetValue() - max) == 0 then
jcallahan@249 129 scrollbar.ScrollDownButton:Disable()
jcallahan@249 130 else
jcallahan@249 131 scrollbar.ScrollDownButton:Enable()
jcallahan@249 132 end
jcallahan@249 133 end)
jcallahan@249 134
jcallahan@249 135 scroll_frame:SetScript("OnMouseWheel", function(self, delta)
jcallahan@249 136 _G.ScrollFrameTemplate_OnMouseWheel(self, delta)
jcallahan@249 137 end)
jcallahan@249 138
jcallahan@258 139 panel.scroll_frame = scroll_frame
jcallahan@258 140
jcallahan@249 141 local edit_container = _G.CreateFrame("Frame", nil, scroll_frame)
jcallahan@249 142 edit_container:SetPoint("TOPLEFT", scroll_frame, -7, 7)
jcallahan@249 143 edit_container:SetPoint("BOTTOMRIGHT", scroll_frame, 7, -7)
jcallahan@249 144 edit_container:SetFrameLevel(scroll_frame:GetFrameLevel() - 1)
jcallahan@249 145 edit_container:SetBackdrop({
jcallahan@249 146 bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
jcallahan@249 147 edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]],
jcallahan@249 148 tile = true,
jcallahan@249 149 tileSize = 16,
jcallahan@249 150 edgeSize = 16,
jcallahan@249 151 insets = {
jcallahan@249 152 left = 5,
jcallahan@249 153 right = 5,
jcallahan@249 154 top = 5,
jcallahan@249 155 bottom = 5
jcallahan@249 156 }
jcallahan@249 157 })
jcallahan@249 158
jcallahan@249 159 edit_container:SetBackdropBorderColor(_G.TOOLTIP_DEFAULT_COLOR.r, _G.TOOLTIP_DEFAULT_COLOR.g, _G.TOOLTIP_DEFAULT_COLOR.b)
jcallahan@249 160 edit_container:SetBackdropColor(0, 0, 0)
jcallahan@249 161
jcallahan@259 162 local link_button = _G.CreateFrame("Button", "$parentLinkButton", panel)
jcallahan@259 163 link_button:SetSize(32, 16)
jcallahan@259 164 link_button:SetPoint("TOPRIGHT", edit_container, "BOTTOMRIGHT", 5, 0)
jcallahan@259 165
jcallahan@259 166 link_button:SetNormalTexture([[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]])
jcallahan@259 167 link_button:GetNormalTexture():SetTexCoord(0, 1, 0, 0.5)
jcallahan@259 168
jcallahan@259 169 link_button:SetHighlightTexture([[Interface\TradeSkillFrame\UI-TradeSkill-LinkButton]])
jcallahan@259 170 link_button:GetHighlightTexture():SetTexCoord(0, 1, 0.5, 1)
jcallahan@259 171
jcallahan@259 172 link_button:SetScript("OnClick", function(self)
jcallahan@259 173 Dialog:Spawn("WDP_CommentLink", { type_name = comment_subject.type_name, id = comment_subject.id, label = comment_subject.label })
jcallahan@259 174 end)
jcallahan@259 175
jcallahan@259 176 link_button:SetScript("OnEnter", function(self)
jcallahan@259 177 _G.GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
jcallahan@259 178 _G.GameTooltip:SetText(LINK_COMMENT_TOOLTIP, nil, nil, nil, nil, 1)
jcallahan@259 179 _G.GameTooltip:Show()
jcallahan@259 180 end)
jcallahan@259 181
jcallahan@259 182 link_button:SetScript("OnLeave", _G.GameTooltip_Hide)
jcallahan@259 183
jcallahan@258 184 local edit_description = edit_container:CreateFontString("MUFASA", "ARTWORK", "GameFontHighlight")
jcallahan@258 185 edit_description:SetHeight(36)
jcallahan@258 186 edit_description:SetPoint("BOTTOMLEFT", edit_container, "TOPLEFT", 5, 3)
jcallahan@258 187 edit_description:SetPoint("BOTTOMRIGHT", edit_container, "TOPRIGHT", 5, 3)
jcallahan@258 188 edit_description:SetFormattedText(EDIT_DESCRIPTION_FORMAT, _G.BreakUpLargeNumbers(EDIT_MAXCHARS))
jcallahan@258 189 edit_description:SetWordWrap(true)
jcallahan@258 190 edit_description:SetJustifyH("LEFT")
jcallahan@258 191
jcallahan@249 192 local edit_box = _G.CreateFrame("EditBox", nil, scroll_frame)
jcallahan@249 193 edit_box:SetMultiLine(true)
jcallahan@258 194 edit_box:SetMaxLetters(EDIT_MAXCHARS)
jcallahan@249 195 edit_box:EnableMouse(true)
jcallahan@249 196 edit_box:SetAutoFocus(false)
jcallahan@249 197 edit_box:SetFontObject("ChatFontNormal")
jcallahan@249 198 edit_box:SetSize(420, 220)
jcallahan@249 199 edit_box:HighlightText(0)
jcallahan@258 200 edit_box:SetFrameLevel(scroll_frame:GetFrameLevel() - 1)
jcallahan@249 201
jcallahan@249 202 edit_box:SetScript("OnCursorChanged", _G.ScrollingEdit_OnCursorChanged)
jcallahan@249 203 edit_box:SetScript("OnEscapePressed", _G.EditBox_ClearFocus)
jcallahan@249 204 edit_box:SetScript("OnShow", function(self)
jcallahan@249 205 _G.EditBox_SetFocus(self)
jcallahan@249 206
jcallahan@249 207 if self:GetNumLetters() > 0 then
jcallahan@249 208 panel.submitButton:Enable()
jcallahan@249 209 else
jcallahan@249 210 panel.submitButton:Disable()
jcallahan@249 211 end
jcallahan@249 212 end)
jcallahan@249 213
jcallahan@249 214 edit_box:SetScript("OnTextChanged", function(self, user_input)
jcallahan@249 215 local parent = self:GetParent()
jcallahan@249 216 local num_letters = self:GetNumLetters()
jcallahan@249 217 _G.ScrollingEdit_OnTextChanged(self, parent)
jcallahan@258 218 parent.charCount:SetFormattedText(_G.BreakUpLargeNumbers(self:GetMaxLetters() - num_letters))
jcallahan@249 219
jcallahan@249 220 if num_letters > 0 then
jcallahan@249 221 panel.submitButton:Enable();
jcallahan@258 222 else
jcallahan@258 223 panel.submitButton:Disable()
jcallahan@249 224 end
jcallahan@249 225 end)
jcallahan@249 226
jcallahan@249 227 edit_box:SetScript("OnUpdate", function(self, elapsed)
jcallahan@249 228 _G.ScrollingEdit_OnUpdate(self, elapsed, self:GetParent())
jcallahan@249 229 end)
jcallahan@249 230
jcallahan@258 231 edit_container:SetScript("OnMouseUp", function()
jcallahan@258 232 _G.EditBox_SetFocus(edit_box)
jcallahan@258 233 end)
jcallahan@258 234
jcallahan@258 235 scroll_frame.edit_box = edit_box
jcallahan@249 236 scroll_frame:SetScrollChild(edit_box)
jcallahan@249 237
jcallahan@249 238 local char_count = scroll_frame:CreateFontString(nil, "OVERLAY", "GameFontDisableLarge")
jcallahan@249 239 char_count:SetPoint("BOTTOMRIGHT", -15, 0)
jcallahan@249 240 scroll_frame.charCount = char_count
jcallahan@249 241
jcallahan@249 242 local scroll_bar = _G.CreateFrame("Slider", "$parentScrollBar", scroll_frame, "UIPanelScrollBarTemplate")
jcallahan@249 243 scroll_bar:SetPoint("TOPLEFT", scroll_frame, "TOPRIGHT", -13, -16)
jcallahan@249 244 scroll_bar:SetPoint("BOTTOMLEFT", scroll_frame, "BOTTOMRIGHT", -13, 16)
jcallahan@249 245 scroll_frame.ScrollBar = scroll_bar
jcallahan@249 246
jcallahan@249 247 _G.ScrollFrame_OnLoad(scroll_frame)
jcallahan@249 248
jcallahan@249 249 local submit = _G.CreateFrame("Button", "$parentSubmit", panel, "GameMenuButtonTemplate")
jcallahan@249 250 submit:SetSize(160, 30)
jcallahan@249 251 submit:SetPoint("BOTTOM", 0, 15)
jcallahan@249 252 submit:SetText(_G.SUBMIT)
jcallahan@249 253 submit:Enable(false)
jcallahan@249 254
jcallahan@249 255 submit:SetScript("OnClick", function()
jcallahan@249 256 -- TODO: Make this assign the comment to the correct SavedVariables entry.
jcallahan@249 257 edit_box:SetText("")
jcallahan@249 258 _G.HideUIPanel(panel)
jcallahan@249 259 end)
jcallahan@249 260 panel.submitButton = submit
jcallahan@249 261 end
jcallahan@249 262
jcallahan@258 263 local function CreateUnitComment(unit_id, unit_type, unit_idnum)
jcallahan@259 264 local type_name = private.UNIT_TYPE_NAMES[unit_type + 1]
jcallahan@259 265 local unit_name = _G.UnitName(unit_id)
jcallahan@259 266
jcallahan@259 267 comment_subject.type_name = type_name
jcallahan@259 268 comment_subject.id = unit_idnum
jcallahan@259 269 comment_subject.label = unit_name
jcallahan@259 270
jcallahan@259 271 comment_frame.subject_name:SetText(unit_name)
jcallahan@259 272 comment_frame.subject_data:SetFormattedText("(%s #%d)", type_name, unit_idnum)
jcallahan@258 273 comment_frame.scroll_frame.edit_box:SetText("")
jcallahan@249 274 comment_frame:Show()
jcallahan@249 275 end
jcallahan@249 276
jcallahan@249 277 local function CreateCursorComment()
jcallahan@249 278 -- TODO: Implement!
jcallahan@249 279 end
jcallahan@249 280
jcallahan@249 281 -- METHODS ------------------------------------------------------------
jcallahan@249 282
jcallahan@249 283 function private.ProcessCommentCommand(arg)
jcallahan@249 284 if not arg or arg == "" then
jcallahan@249 285 WDP:Print("You must supply a valid comment type.")
jcallahan@249 286 return
jcallahan@249 287 end
jcallahan@249 288
jcallahan@249 289 if arg == "cursor" then
jcallahan@249 290 WDP:Print("Not yet implemented.")
jcallahan@249 291 return
jcallahan@249 292 end
jcallahan@249 293
jcallahan@249 294 if not _G.UnitExists(arg) then
jcallahan@249 295 WDP:Printf("Unit '%s' does not exist.", arg)
jcallahan@249 296 return
jcallahan@249 297 end
jcallahan@249 298 local unit_type, unit_idnum = ParseGUID(_G.UnitGUID(arg))
jcallahan@249 299
jcallahan@249 300 if not unit_idnum then
jcallahan@249 301 WDP:Printf("Unable to determine unit from '%s'", arg)
jcallahan@249 302 return
jcallahan@249 303 end
jcallahan@258 304 CreateUnitComment(arg, unit_type, unit_idnum)
jcallahan@249 305 end