annotate Comments.lua @ 258:88d2c426f876

Add instructions as well as name and type/ID of comment subject to comment frame. Behavioral polish.
author James D. Callahan III <jcallahan@curse.com>
date Mon, 18 Mar 2013 13:45:21 -0500
parents 3fe3e55c327e
children eac4dc8f462e
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@249 13
jcallahan@249 14 local ParseGUID = private.ParseGUID
jcallahan@249 15
jcallahan@258 16 -- CONSTANTS ----------------------------------------------------------
jcallahan@258 17
jcallahan@258 18 local EDIT_MAXCHARS = 3000
jcallahan@258 19 local EDIT_DESCRIPTION_FORMAT = [[Enter your comment below, being as descriptive as possible. Comments are limited to %s characters, including newlines and spaces.]]
jcallahan@258 20
jcallahan@249 21 -- HELPERS ------------------------------------------------------------
jcallahan@249 22
jcallahan@249 23 local comment_frame
jcallahan@249 24 do
jcallahan@249 25 local panel = _G.CreateFrame("Frame", "WDP_CommentFrame", _G.UIParent, "TranslucentFrameTemplate")
jcallahan@258 26 panel:SetSize(480, 350)
jcallahan@249 27 panel:SetPoint("CENTER", _G.UIParent, "CENTER")
jcallahan@249 28 panel:SetFrameStrata("DIALOG")
jcallahan@249 29 panel.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Rock]], true, true)
jcallahan@249 30 panel.Bg:SetHorizTile(true)
jcallahan@249 31 panel.Bg:SetVertTile(true)
jcallahan@249 32 panel:Hide()
jcallahan@249 33 comment_frame = panel
jcallahan@249 34
jcallahan@249 35 table.insert(_G.UISpecialFrames, panel:GetName())
jcallahan@249 36
jcallahan@249 37 local streaks = panel:CreateTexture("$parentTopTileStreaks", "BORDER", "_UI-Frame-TopTileStreaks", -6)
jcallahan@249 38 streaks:SetPoint("TOPLEFT", 13, -13)
jcallahan@249 39 streaks:SetPoint("BOTTOMRIGHT", panel, "TOPRIGHT", -13, -35)
jcallahan@249 40
jcallahan@249 41 local header = _G.CreateFrame("Frame", "$parentHeader", panel, "TranslucentFrameTemplate")
jcallahan@249 42 header:SetSize(128, 64)
jcallahan@249 43 header:SetPoint("CENTER", panel, "TOP", 0, -8)
jcallahan@249 44 header.Bg:SetTexture([[Interface\FrameGeneral\UI-Background-Marble]])
jcallahan@249 45 header.Bg:SetHorizTile(true)
jcallahan@249 46 header.Bg:SetVertTile(true)
jcallahan@249 47 panel.header = header
jcallahan@249 48
jcallahan@249 49 local logo = header:CreateTexture(nil, "ARTWORK")
jcallahan@249 50 logo:SetTexture([[Interface\AddOns\WoWDBProfiler\wowdb-logo]])
jcallahan@249 51 logo:SetPoint("TOPLEFT", header, 10, -10)
jcallahan@249 52 logo:SetPoint("BOTTOMRIGHT", header, -10, 10)
jcallahan@249 53
jcallahan@258 54 local subject_name = panel:CreateFontString(nil, "ARTWORK", "GameFontNormal")
jcallahan@258 55 subject_name:SetPoint("TOP", header, "BOTTOM", 0, -10)
jcallahan@258 56 panel.subject_name = subject_name
jcallahan@258 57
jcallahan@258 58 local subject_data = panel:CreateFontString(nil, "ARTWORK", "GameFontNormal")
jcallahan@258 59 subject_data:SetPoint("TOP", subject_name, "BOTTOM", 0, -3)
jcallahan@258 60 panel.subject_data = subject_data
jcallahan@249 61
jcallahan@249 62 local close = _G.CreateFrame("Button", nil, panel, "UIPanelCloseButton")
jcallahan@249 63 close:SetPoint("TOPRIGHT", panel, "TOPRIGHT", -7, -7)
jcallahan@249 64
jcallahan@249 65 local scroll_frame = _G.CreateFrame("ScrollFrame", "$parentScrollFrame", panel)
jcallahan@249 66 scroll_frame:SetSize(435, 150)
jcallahan@249 67 scroll_frame:SetPoint("BOTTOM", 0, 70)
jcallahan@249 68
jcallahan@249 69 scroll_frame:SetScript("OnScrollRangeChanged", function(self, x, y)
jcallahan@249 70 _G.ScrollFrame_OnScrollRangeChanged(self, x, y)
jcallahan@249 71 end)
jcallahan@249 72
jcallahan@249 73 scroll_frame:SetScript("OnVerticalScroll", function(self, offset)
jcallahan@249 74 local scrollbar = self.ScrollBar
jcallahan@249 75 scrollbar:SetValue(offset)
jcallahan@249 76
jcallahan@249 77 local min, max = scrollbar:GetMinMaxValues()
jcallahan@249 78
jcallahan@249 79 if offset == 0 then
jcallahan@249 80 scrollbar.ScrollUpButton:Disable()
jcallahan@249 81 else
jcallahan@249 82 scrollbar.ScrollUpButton:Enable()
jcallahan@249 83 end
jcallahan@249 84
jcallahan@249 85 if (scrollbar:GetValue() - max) == 0 then
jcallahan@249 86 scrollbar.ScrollDownButton:Disable()
jcallahan@249 87 else
jcallahan@249 88 scrollbar.ScrollDownButton:Enable()
jcallahan@249 89 end
jcallahan@249 90 end)
jcallahan@249 91
jcallahan@249 92 scroll_frame:SetScript("OnMouseWheel", function(self, delta)
jcallahan@249 93 _G.ScrollFrameTemplate_OnMouseWheel(self, delta)
jcallahan@249 94 end)
jcallahan@249 95
jcallahan@258 96 panel.scroll_frame = scroll_frame
jcallahan@258 97
jcallahan@249 98 local edit_container = _G.CreateFrame("Frame", nil, scroll_frame)
jcallahan@249 99 edit_container:SetPoint("TOPLEFT", scroll_frame, -7, 7)
jcallahan@249 100 edit_container:SetPoint("BOTTOMRIGHT", scroll_frame, 7, -7)
jcallahan@249 101 edit_container:SetFrameLevel(scroll_frame:GetFrameLevel() - 1)
jcallahan@249 102 edit_container:SetBackdrop({
jcallahan@249 103 bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
jcallahan@249 104 edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]],
jcallahan@249 105 tile = true,
jcallahan@249 106 tileSize = 16,
jcallahan@249 107 edgeSize = 16,
jcallahan@249 108 insets = {
jcallahan@249 109 left = 5,
jcallahan@249 110 right = 5,
jcallahan@249 111 top = 5,
jcallahan@249 112 bottom = 5
jcallahan@249 113 }
jcallahan@249 114 })
jcallahan@249 115
jcallahan@249 116 edit_container:SetBackdropBorderColor(_G.TOOLTIP_DEFAULT_COLOR.r, _G.TOOLTIP_DEFAULT_COLOR.g, _G.TOOLTIP_DEFAULT_COLOR.b)
jcallahan@249 117 edit_container:SetBackdropColor(0, 0, 0)
jcallahan@249 118
jcallahan@258 119 local edit_description = edit_container:CreateFontString("MUFASA", "ARTWORK", "GameFontHighlight")
jcallahan@258 120 edit_description:SetHeight(36)
jcallahan@258 121 edit_description:SetPoint("BOTTOMLEFT", edit_container, "TOPLEFT", 5, 3)
jcallahan@258 122 edit_description:SetPoint("BOTTOMRIGHT", edit_container, "TOPRIGHT", 5, 3)
jcallahan@258 123 edit_description:SetFormattedText(EDIT_DESCRIPTION_FORMAT, _G.BreakUpLargeNumbers(EDIT_MAXCHARS))
jcallahan@258 124 edit_description:SetWordWrap(true)
jcallahan@258 125 edit_description:SetJustifyH("LEFT")
jcallahan@258 126
jcallahan@249 127 local edit_box = _G.CreateFrame("EditBox", nil, scroll_frame)
jcallahan@249 128 edit_box:SetMultiLine(true)
jcallahan@258 129 edit_box:SetMaxLetters(EDIT_MAXCHARS)
jcallahan@249 130 edit_box:EnableMouse(true)
jcallahan@249 131 edit_box:SetAutoFocus(false)
jcallahan@249 132 edit_box:SetFontObject("ChatFontNormal")
jcallahan@249 133 edit_box:SetSize(420, 220)
jcallahan@249 134 edit_box:HighlightText(0)
jcallahan@258 135 edit_box:SetFrameLevel(scroll_frame:GetFrameLevel() - 1)
jcallahan@249 136
jcallahan@249 137 edit_box:SetScript("OnCursorChanged", _G.ScrollingEdit_OnCursorChanged)
jcallahan@249 138 edit_box:SetScript("OnEscapePressed", _G.EditBox_ClearFocus)
jcallahan@249 139 edit_box:SetScript("OnShow", function(self)
jcallahan@249 140 _G.EditBox_SetFocus(self)
jcallahan@249 141
jcallahan@249 142 if self:GetNumLetters() > 0 then
jcallahan@249 143 panel.submitButton:Enable()
jcallahan@249 144 else
jcallahan@249 145 panel.submitButton:Disable()
jcallahan@249 146 end
jcallahan@249 147 end)
jcallahan@249 148
jcallahan@249 149 edit_box:SetScript("OnTextChanged", function(self, user_input)
jcallahan@249 150 local parent = self:GetParent()
jcallahan@249 151 local num_letters = self:GetNumLetters()
jcallahan@249 152 _G.ScrollingEdit_OnTextChanged(self, parent)
jcallahan@258 153 parent.charCount:SetFormattedText(_G.BreakUpLargeNumbers(self:GetMaxLetters() - num_letters))
jcallahan@249 154
jcallahan@249 155 if num_letters > 0 then
jcallahan@249 156 panel.submitButton:Enable();
jcallahan@258 157 else
jcallahan@258 158 panel.submitButton:Disable()
jcallahan@249 159 end
jcallahan@249 160 end)
jcallahan@249 161
jcallahan@249 162 edit_box:SetScript("OnUpdate", function(self, elapsed)
jcallahan@249 163 _G.ScrollingEdit_OnUpdate(self, elapsed, self:GetParent())
jcallahan@249 164 end)
jcallahan@249 165
jcallahan@258 166 edit_container:SetScript("OnMouseUp", function()
jcallahan@258 167 _G.EditBox_SetFocus(edit_box)
jcallahan@258 168 end)
jcallahan@258 169
jcallahan@258 170 scroll_frame.edit_box = edit_box
jcallahan@249 171 scroll_frame:SetScrollChild(edit_box)
jcallahan@249 172
jcallahan@249 173 local char_count = scroll_frame:CreateFontString(nil, "OVERLAY", "GameFontDisableLarge")
jcallahan@249 174 char_count:SetPoint("BOTTOMRIGHT", -15, 0)
jcallahan@249 175 scroll_frame.charCount = char_count
jcallahan@249 176
jcallahan@249 177 local scroll_bar = _G.CreateFrame("Slider", "$parentScrollBar", scroll_frame, "UIPanelScrollBarTemplate")
jcallahan@249 178 scroll_bar:SetPoint("TOPLEFT", scroll_frame, "TOPRIGHT", -13, -16)
jcallahan@249 179 scroll_bar:SetPoint("BOTTOMLEFT", scroll_frame, "BOTTOMRIGHT", -13, 16)
jcallahan@249 180 scroll_frame.ScrollBar = scroll_bar
jcallahan@249 181
jcallahan@249 182 _G.ScrollFrame_OnLoad(scroll_frame)
jcallahan@249 183
jcallahan@249 184 local submit = _G.CreateFrame("Button", "$parentSubmit", panel, "GameMenuButtonTemplate")
jcallahan@249 185 submit:SetSize(160, 30)
jcallahan@249 186 submit:SetPoint("BOTTOM", 0, 15)
jcallahan@249 187 submit:SetText(_G.SUBMIT)
jcallahan@249 188 submit:Enable(false)
jcallahan@249 189
jcallahan@249 190 submit:SetScript("OnClick", function()
jcallahan@249 191 -- TODO: Make this assign the comment to the correct SavedVariables entry.
jcallahan@249 192 edit_box:SetText("")
jcallahan@249 193 _G.HideUIPanel(panel)
jcallahan@249 194 end)
jcallahan@249 195 panel.submitButton = submit
jcallahan@249 196 end
jcallahan@249 197
jcallahan@258 198 local function CreateUnitComment(unit_id, unit_type, unit_idnum)
jcallahan@258 199 comment_frame.subject_name:SetText(_G.UnitName(unit_id))
jcallahan@258 200 comment_frame.subject_data:SetFormattedText("(%s #%d)", private.UNIT_TYPE_NAMES[unit_type + 1], unit_idnum)
jcallahan@258 201 comment_frame.scroll_frame.edit_box:SetText("")
jcallahan@249 202 comment_frame:Show()
jcallahan@249 203 end
jcallahan@249 204
jcallahan@249 205 local function CreateCursorComment()
jcallahan@249 206 -- TODO: Implement!
jcallahan@249 207 end
jcallahan@249 208
jcallahan@249 209 -- METHODS ------------------------------------------------------------
jcallahan@249 210
jcallahan@249 211 function private.ProcessCommentCommand(arg)
jcallahan@249 212 if not arg or arg == "" then
jcallahan@249 213 WDP:Print("You must supply a valid comment type.")
jcallahan@249 214 return
jcallahan@249 215 end
jcallahan@249 216
jcallahan@249 217 if arg == "cursor" then
jcallahan@249 218 WDP:Print("Not yet implemented.")
jcallahan@249 219 return
jcallahan@249 220 end
jcallahan@249 221
jcallahan@249 222 if not _G.UnitExists(arg) then
jcallahan@249 223 WDP:Printf("Unit '%s' does not exist.", arg)
jcallahan@249 224 return
jcallahan@249 225 end
jcallahan@249 226 local unit_type, unit_idnum = ParseGUID(_G.UnitGUID(arg))
jcallahan@249 227
jcallahan@249 228 if not unit_idnum then
jcallahan@249 229 WDP:Printf("Unable to determine unit from '%s'", arg)
jcallahan@249 230 return
jcallahan@249 231 end
jcallahan@258 232 CreateUnitComment(arg, unit_type, unit_idnum)
jcallahan@249 233 end