annotate text_tabs.lua @ 133:47b149f9a5d7 2.20

Update for MoP.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Wed, 29 Aug 2012 22:20:51 -0400
parents fc2ff128835a
children 375059a11c1d
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@11 49 local green = ITEM_QUALITY_COLORS[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