annotate text_tabs.lua @ 146:543fcf15add7

Handle new itemstring format for item variants. Heroic, warforged, etc, are now additional fields in the itemstring rather than separate item IDs as in the last few expansions. This fixes the tooltip displays for such items; there's nothing yet in place for determining the exact variations (need to finish the list of bonus codes). Some minor efficiency tweaks.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Tue, 30 Dec 2014 17:52:30 -0500
parents 375059a11c1d
children
rev   line source
farmbuyer@1 1 local addon = select(2,...)
farmbuyer@67 2 if addon.NOLOAD then return end
farmbuyer@1 3
farmbuyer@1 4 --[[ Generator:
farmbuyer@1 5 boolean FUNC (ttype, loot, last_printed, generated, cache)
farmbuyer@1 6 in TTYPE: the registered text type as passed to register_text_generator
farmbuyer@1 7 in LOOT: pointer to g_loot table
farmbuyer@1 8 in LAST_PRINTED: index into loot most recently formatted by this routine
farmbuyer@1 9 in GENERATED.TTYPE: (string) FIFO buffer for text created by this routine;
farmbuyer@1 10 other parts of the GUI copy and nil out this string. Do not change
farmbuyer@1 11 this string, only examine it if needed. If the generator is called
farmbuyer@1 12 more than once between GUI updates, text will build up here.
farmbuyer@1 13 in/out GENERATED.TTYPE_pos: if non-nil, this is the saved cursor position in
farmbuyer@1 14 the text window (so that it stays where the user last left it).
farmbuyer@1 15 Move it if you're doing something strange with the displayed text.
farmbuyer@47 16 tmp GENERATED.loc_TTYPE_*: Fields with this pattern free to use as needed.
farmbuyer@1 17 out CACHE: Empty output table. Accumulate generated lines here, one entry
farmbuyer@1 18 per visible line. Do not terminate with a newline unless you want
farmbuyer@1 19 an extra blank line there.
farmbuyer@1 20
farmbuyer@1 21 Preconditions:
farmbuyer@1 22 + LAST_PRINTED < #LOOT
farmbuyer@1 23 + LOOT.TTYPE is a non-nil string containing all text in the text box (and
farmbuyer@1 24 if the user has edited the text box, this string will be updated). Do not
farmbuyer@1 25 change this, but like GENERATED.TTYPE it is available for examination.
farmbuyer@1 26
farmbuyer@1 27 Return true if text was created, false if nothing was done.
farmbuyer@1 28 ]]
farmbuyer@1 29
farmbuyer@1 30 --[[ Optional special widgets:
farmbuyer@1 31 FUNC (ttype, editbox, container, mkbutton)
farmbuyer@1 32 TTYPE: see above
farmbuyer@1 33 EDITBOX: the MultiLineEditBox widget
farmbuyer@1 34 CONTAINER: widget container (already has 'Regenerate' button in it)
farmbuyer@1 35 MKBUTTON: function to create more AceGUI widgets, as follows:
farmbuyer@1 36
farmbuyer@65 37 mkbutton ("WidgetType", 'display key', "Text On Widget", "mouseover text")
farmbuyer@65 38 mkbutton ( [Button] 'display key', "Text On Widget", "mouseover text")
farmbuyer@65 39 mkbutton ( [Button] [text] "Text On Widget", "mouseover text")
farmbuyer@1 40
farmbuyer@65 41 The 'display key' parameter will almost certainly be specified as nil for
farmbuyer@65 42 these functions.
farmbuyer@1 43 ]]
farmbuyer@1 44
farmbuyer@1 45 local forum_warned_heroic
farmbuyer@1 46 local warning_text
farmbuyer@1 47 do
farmbuyer@1 48 local red = '|cffff0505'
farmbuyer@142 49 local green = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_UNCOMMON].hex
farmbuyer@66 50 warning_text = ([[%sWARNING:|r Heroic (and Raid Finder) items sharing the same name as normal items often display incorrectly on forums that use the item name as the identifier. Recommend you change the %sItem markup|r dropdown in the right-hand side to %s"[item] by ID"|r (or some other format that uses $I) and regenerate this loot.]]):format(red, green, green)
farmbuyer@1 51 end
farmbuyer@1 52
farmbuyer@1 53 local function forum (_, loot, last_printed, generated, cache)
farmbuyer@97 54 local fmt = addon.db.profile.forum[addon.db.profile.forum_current] or ""
farmbuyer@1 55 -- if it's capable of handling heroic items, consider them warned already
farmbuyer@1 56 forum_warned_heroic = forum_warned_heroic or fmt:find'%$I'
farmbuyer@1 57
farmbuyer@1 58 for i = last_printed+1, #loot do
farmbuyer@1 59 local e = loot[i]
farmbuyer@1 60
farmbuyer@1 61 if e.kind == 'loot' then
farmbuyer@109 62 local destination = e.person
farmbuyer@109 63 if e.disposition then
farmbuyer@109 64 local disp = e.disposition
farmbuyer@109 65 local disptext = addon:_test_disposition(disp,'text')
farmbuyer@109 66 if disp == 'offspec' then
farmbuyer@109 67 destination = e.person .. " " .. disptext
farmbuyer@109 68 elseif disp == 'gvault' then
farmbuyer@109 69 --destination = ("%s (%s)"):format(disptext,e.person)
farmbuyer@109 70 destination = disptext
farmbuyer@109 71 else
farmbuyer@109 72 destination = disptext
farmbuyer@109 73 end
farmbuyer@1 74 end
farmbuyer@1 75 if e.extratext_byhand then
farmbuyer@109 76 destination = destination .. " -- " .. e.extratext
farmbuyer@1 77 end
farmbuyer@66 78 if e.variant and not forum_warned_heroic then
farmbuyer@1 79 forum_warned_heroic = true
farmbuyer@1 80 addon:Print(warning_text)
farmbuyer@1 81 end
farmbuyer@1 82 local t = fmt:gsub('%$I', e.id)
farmbuyer@1 83 :gsub('%$N', e.itemname)
farmbuyer@1 84 :gsub('%$X', e.count or "")
farmbuyer@109 85 :gsub('%$T', destination)
farmbuyer@1 86 cache[#cache+1] = t
farmbuyer@1 87
farmbuyer@1 88 elseif e.kind == 'boss' and e.reason == 'kill' then
farmbuyer@65 89 -- The first boss in an instance gets an instance tag, others
farmbuyer@65 90 -- get a blank line
farmbuyer@1 91 if generated.last_instance == e.instance then
farmbuyer@1 92 cache[#cache+1] = ""
farmbuyer@1 93 else
farmbuyer@1 94 cache[#cache+1] = "\n[b]" .. e.instance .. "[/b]"
farmbuyer@1 95 generated.last_instance = e.instance
farmbuyer@1 96 end
farmbuyer@55 97 cache[#cache+1] = "[i]" .. e.bossname .. "[/i]"
farmbuyer@1 98
farmbuyer@1 99 elseif e.kind == 'time' then
farmbuyer@1 100 cache[#cache+1] = "[b]" .. e.startday.text .. "[/b]"
farmbuyer@1 101
farmbuyer@1 102 end
farmbuyer@1 103 end
farmbuyer@61 104 return #cache > 0
farmbuyer@1 105 end
farmbuyer@1 106
farmbuyer@1 107 local function forum_specials (_,_, container, mkbutton)
farmbuyer@97 108 local opts = addon.db.profile
farmbuyer@1 109 local map,current = {}
farmbuyer@97 110 for label,format in pairs(opts.forum) do
farmbuyer@1 111 table.insert(map,label)
farmbuyer@97 112 if label == opts.forum_current then
farmbuyer@1 113 current = #map
farmbuyer@1 114 end
farmbuyer@1 115 end
farmbuyer@1 116
farmbuyer@1 117 local dd, editbox
farmbuyer@1 118 dd = mkbutton("Dropdown", nil, "",
farmbuyer@1 119 [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]])
farmbuyer@1 120 dd:SetFullWidth(true)
farmbuyer@1 121 dd:SetLabel("Item markup")
farmbuyer@1 122 dd:SetList(map)
farmbuyer@1 123 dd:SetValue(current)
farmbuyer@1 124 dd:SetCallback("OnValueChanged", function(_dd,event,choice)
farmbuyer@97 125 opts.forum_current = map[choice]
farmbuyer@1 126 forum_warned_heroic = nil
farmbuyer@1 127 editbox:SetDisabled(map[choice] ~= "Custom...")
farmbuyer@1 128 end)
farmbuyer@1 129 container:AddChild(dd)
farmbuyer@1 130
farmbuyer@97 131 editbox = mkbutton("EditBox", nil, opts.forum["Custom..."],
farmbuyer@1 132 [[Format described in Help tab (Generated Text -> Forum Markup).]])
farmbuyer@1 133 editbox:SetFullWidth(true)
farmbuyer@1 134 editbox:SetLabel("Custom:")
farmbuyer@1 135 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
farmbuyer@97 136 opts.forum["Custom..."] = value
farmbuyer@1 137 _e.editbox:ClearFocus()
farmbuyer@1 138 end)
farmbuyer@97 139 editbox:SetDisabled(opts.forum_current ~= "Custom...")
farmbuyer@1 140 container:AddChild(editbox)
farmbuyer@1 141 end
farmbuyer@1 142
farmbuyer@1 143 addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials)
farmbuyer@1 144
farmbuyer@1 145
farmbuyer@56 146 local ingroups, outgroups = {}, {}
farmbuyer@56 147 local function do_attendance (raidertable, max_group_number)
farmbuyer@56 148 local tins, wipe, tsort, tconcat =
farmbuyer@56 149 table.insert, table.wipe, table.sort, table.concat
farmbuyer@56 150
farmbuyer@56 151 -- Assumption: everybody is packed into the first N groups.
farmbuyer@56 152 if raidertable then for name,info in pairs(raidertable) do
farmbuyer@102 153 if info.online ~= 'no_longer' then -- 'no_longer' == left the raid
farmbuyer@68 154 if (info.subgroup or (NUM_RAID_GROUPS+1)) <= max_group_number then
farmbuyer@114 155 tins (ingroups, info.fname)
farmbuyer@56 156 else
farmbuyer@114 157 tins (outgroups, info.fname)
farmbuyer@56 158 end
farmbuyer@56 159 end
farmbuyer@56 160 end end
farmbuyer@56 161 if #ingroups > 0 then
farmbuyer@56 162 tsort(ingroups)
farmbuyer@56 163 else
farmbuyer@56 164 ingroups[1] = [[Nobody recorded as inside the instance.]]
farmbuyer@56 165 end
farmbuyer@56 166 if #outgroups > 0 then
farmbuyer@56 167 tsort(outgroups)
farmbuyer@56 168 else
farmbuyer@56 169 outgroups[1] = [[Nobody recorded as outside the instance.]]
farmbuyer@56 170 end
farmbuyer@56 171 local i,o = tconcat(ingroups,", "), tconcat(outgroups,", ")
farmbuyer@56 172 wipe(ingroups)
farmbuyer@56 173 wipe(outgroups)
farmbuyer@56 174 return i,o
farmbuyer@56 175 end
farmbuyer@56 176
farmbuyer@1 177 local function att (_, loot, last_printed, _, cache)
farmbuyer@1 178 for i = last_printed+1, #loot do
farmbuyer@1 179 local e = loot[i]
farmbuyer@1 180
farmbuyer@1 181 if e.kind == 'boss' and e.reason == 'kill' then
farmbuyer@69 182 -- Raid size can potentially be different on a per-boss basis
farmbuyer@56 183 -- (e.g., "we're dropping to 10-man for the PvP boss")
farmbuyer@56 184 local i,o = do_attendance (e.raidersnap, e.maxsize / MEMBERS_PER_RAID_GROUP)
farmbuyer@56 185
farmbuyer@65 186 cache[#cache+1] = ("\n%s -- %s\n{+} %s\n{-} %s\n"):
farmbuyer@65 187 format(e.instance, e.bossname, i, o)
farmbuyer@1 188
farmbuyer@1 189 elseif e.kind == 'time' then
farmbuyer@1 190 cache[#cache+1] = e.startday.text
farmbuyer@1 191
farmbuyer@1 192 end
farmbuyer@1 193 end
farmbuyer@61 194 return #cache > 0
farmbuyer@1 195 end
farmbuyer@1 196
farmbuyer@1 197 local function att_specials (_, editbox, container, mkbutton)
farmbuyer@1 198 local w = mkbutton("Take Attendance",
farmbuyer@1 199 [[Take attendance now (will continue to take attendance on each boss kill).]])
farmbuyer@1 200 w:SetFullWidth(true)
farmbuyer@1 201 w:SetCallback("OnClick", function(_w)
farmbuyer@61 202 local ss,max,instance = addon:snapshot_raid (--[[inraid=]]true)
farmbuyer@61 203 local i,o = do_attendance (ss, max / MEMBERS_PER_RAID_GROUP)
farmbuyer@1 204 local h, m = GetGameTime()
farmbuyer@56 205
farmbuyer@61 206 local additional = ("Attendance for %s at %.2d:%.2d:\n{+} %s\n{-} %s"):
farmbuyer@61 207 format(instance, h, m, i, o)
farmbuyer@1 208 editbox:SetText(editbox:GetText() .. '\n' .. additional)
farmbuyer@1 209 end)
farmbuyer@1 210 container:AddChild(w)
farmbuyer@1 211 end
farmbuyer@1 212
farmbuyer@1 213 addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials)
farmbuyer@1 214
farmbuyer@109 215 addon.FILES_LOADED = addon.FILES_LOADED + 1
farmbuyer@1 216 -- vim:noet