annotate text_tabs.lua @ 68:3bed6d51e077

Make sure subgroup field is always set to non-nil. ("Belt *and* suspenders." Handle a previously-set nil field during text creation.)
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Wed, 09 May 2012 09:38:14 +0000
parents c01875b275ca
children 8442272a8418
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 + all "display-relevant" information for the main Loot tab has been filled
farmbuyer@1 24 out (e.g., LOOT[i].cols[3] might have extra text, etc)
farmbuyer@1 25 + LOOT.TTYPE is a non-nil string containing all text in the text box (and
farmbuyer@1 26 if the user has edited the text box, this string will be updated). Do not
farmbuyer@1 27 change this, but like GENERATED.TTYPE it is available for examination.
farmbuyer@1 28
farmbuyer@1 29 Return true if text was created, false if nothing was done.
farmbuyer@1 30 ]]
farmbuyer@1 31
farmbuyer@1 32 --[[ Optional special widgets:
farmbuyer@1 33 FUNC (ttype, editbox, container, mkbutton)
farmbuyer@1 34 TTYPE: see above
farmbuyer@1 35 EDITBOX: the MultiLineEditBox widget
farmbuyer@1 36 CONTAINER: widget container (already has 'Regenerate' button in it)
farmbuyer@1 37 MKBUTTON: function to create more AceGUI widgets, as follows:
farmbuyer@1 38
farmbuyer@65 39 mkbutton ("WidgetType", 'display key', "Text On Widget", "mouseover text")
farmbuyer@65 40 mkbutton ( [Button] 'display key', "Text On Widget", "mouseover text")
farmbuyer@65 41 mkbutton ( [Button] [text] "Text On Widget", "mouseover text")
farmbuyer@1 42
farmbuyer@65 43 The 'display key' parameter will almost certainly be specified as nil for
farmbuyer@65 44 these functions.
farmbuyer@1 45 ]]
farmbuyer@1 46
farmbuyer@1 47 local forum_warned_heroic
farmbuyer@1 48 local warning_text
farmbuyer@1 49 do
farmbuyer@1 50 local red = '|cffff0505'
farmbuyer@11 51 local green = ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex
farmbuyer@66 52 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 53 end
farmbuyer@1 54
farmbuyer@1 55 local function forum (_, loot, last_printed, generated, cache)
farmbuyer@1 56 local fmt = OuroLootSV_opts.forum[OuroLootSV_opts.forum_current] or ""
farmbuyer@1 57 -- if it's capable of handling heroic items, consider them warned already
farmbuyer@1 58 forum_warned_heroic = forum_warned_heroic or fmt:find'%$I'
farmbuyer@1 59
farmbuyer@1 60 for i = last_printed+1, #loot do
farmbuyer@1 61 local e = loot[i]
farmbuyer@1 62
farmbuyer@1 63 if e.kind == 'loot' then
farmbuyer@1 64 -- Assuming nobody names a toon "offspec" or "gvault"
farmbuyer@65 65 -- 16Apr2011: armory finds 20 Gvaults and 77 Offspecs... hulk smash.
farmbuyer@1 66 local disp = e.disposition or e.person
farmbuyer@1 67 if disp == 'offspec' then
farmbuyer@1 68 disp = e.person .. " " .. 'offspec'
farmbuyer@1 69 elseif disp == 'gvault' then
farmbuyer@1 70 --disp = "guild vault (".. e.person .. ")"
farmbuyer@1 71 disp = "guild vault"
farmbuyer@1 72 end
farmbuyer@1 73 if e.extratext_byhand then
farmbuyer@1 74 disp = disp .. " -- " .. e.extratext
farmbuyer@1 75 end
farmbuyer@66 76 if e.variant and not forum_warned_heroic then
farmbuyer@1 77 forum_warned_heroic = true
farmbuyer@1 78 addon:Print(warning_text)
farmbuyer@1 79 end
farmbuyer@1 80 local t = fmt:gsub('%$I', e.id)
farmbuyer@1 81 :gsub('%$N', e.itemname)
farmbuyer@1 82 :gsub('%$X', e.count or "")
farmbuyer@1 83 :gsub('%$T', disp)
farmbuyer@1 84 cache[#cache+1] = t
farmbuyer@1 85
farmbuyer@1 86 elseif e.kind == 'boss' and e.reason == 'kill' then
farmbuyer@65 87 -- The first boss in an instance gets an instance tag, others
farmbuyer@65 88 -- get a blank line
farmbuyer@1 89 if generated.last_instance == e.instance then
farmbuyer@1 90 cache[#cache+1] = ""
farmbuyer@1 91 else
farmbuyer@1 92 cache[#cache+1] = "\n[b]" .. e.instance .. "[/b]"
farmbuyer@1 93 generated.last_instance = e.instance
farmbuyer@1 94 end
farmbuyer@55 95 cache[#cache+1] = "[i]" .. e.bossname .. "[/i]"
farmbuyer@1 96
farmbuyer@1 97 elseif e.kind == 'time' then
farmbuyer@1 98 cache[#cache+1] = "[b]" .. e.startday.text .. "[/b]"
farmbuyer@1 99
farmbuyer@1 100 end
farmbuyer@1 101 end
farmbuyer@61 102 return #cache > 0
farmbuyer@1 103 end
farmbuyer@1 104
farmbuyer@1 105 local function forum_specials (_,_, container, mkbutton)
farmbuyer@1 106 local map,current = {}
farmbuyer@1 107 for label,format in pairs(OuroLootSV_opts.forum) do
farmbuyer@1 108 table.insert(map,label)
farmbuyer@1 109 if label == OuroLootSV_opts.forum_current then
farmbuyer@1 110 current = #map
farmbuyer@1 111 end
farmbuyer@1 112 end
farmbuyer@1 113
farmbuyer@1 114 local dd, editbox
farmbuyer@1 115 dd = mkbutton("Dropdown", nil, "",
farmbuyer@1 116 [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]])
farmbuyer@1 117 dd:SetFullWidth(true)
farmbuyer@1 118 dd:SetLabel("Item markup")
farmbuyer@1 119 dd:SetList(map)
farmbuyer@1 120 dd:SetValue(current)
farmbuyer@1 121 dd:SetCallback("OnValueChanged", function(_dd,event,choice)
farmbuyer@1 122 OuroLootSV_opts.forum_current = map[choice]
farmbuyer@1 123 forum_warned_heroic = nil
farmbuyer@1 124 editbox:SetDisabled(map[choice] ~= "Custom...")
farmbuyer@1 125 end)
farmbuyer@1 126 container:AddChild(dd)
farmbuyer@1 127
farmbuyer@1 128 editbox = mkbutton("EditBox", nil, OuroLootSV_opts.forum["Custom..."],
farmbuyer@1 129 [[Format described in Help tab (Generated Text -> Forum Markup).]])
farmbuyer@1 130 editbox:SetFullWidth(true)
farmbuyer@1 131 editbox:SetLabel("Custom:")
farmbuyer@1 132 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
farmbuyer@1 133 OuroLootSV_opts.forum["Custom..."] = value
farmbuyer@1 134 _e.editbox:ClearFocus()
farmbuyer@1 135 end)
farmbuyer@1 136 editbox:SetDisabled(OuroLootSV_opts.forum_current ~= "Custom...")
farmbuyer@1 137 container:AddChild(editbox)
farmbuyer@1 138 end
farmbuyer@1 139
farmbuyer@1 140 addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials)
farmbuyer@1 141
farmbuyer@1 142
farmbuyer@56 143 local ingroups, outgroups = {}, {}
farmbuyer@56 144 local function do_attendance (raidertable, max_group_number)
farmbuyer@56 145 local tins, wipe, tsort, tconcat =
farmbuyer@56 146 table.insert, table.wipe, table.sort, table.concat
farmbuyer@56 147
farmbuyer@56 148 -- Assumption: everybody is packed into the first N groups.
farmbuyer@56 149 if raidertable then for name,info in pairs(raidertable) do
farmbuyer@56 150 if info.online ~= 3 then -- 3 == left the raid
farmbuyer@68 151 if (info.subgroup or (NUM_RAID_GROUPS+1)) <= max_group_number then
farmbuyer@56 152 tins (ingroups, name)
farmbuyer@56 153 else
farmbuyer@56 154 tins (outgroups, name)
farmbuyer@56 155 end
farmbuyer@56 156 end
farmbuyer@56 157 end end
farmbuyer@56 158 if #ingroups > 0 then
farmbuyer@56 159 tsort(ingroups)
farmbuyer@56 160 else
farmbuyer@56 161 ingroups[1] = [[Nobody recorded as inside the instance.]]
farmbuyer@56 162 end
farmbuyer@56 163 if #outgroups > 0 then
farmbuyer@56 164 tsort(outgroups)
farmbuyer@56 165 else
farmbuyer@56 166 outgroups[1] = [[Nobody recorded as outside the instance.]]
farmbuyer@56 167 end
farmbuyer@56 168 local i,o = tconcat(ingroups,", "), tconcat(outgroups,", ")
farmbuyer@56 169 wipe(ingroups)
farmbuyer@56 170 wipe(outgroups)
farmbuyer@56 171 return i,o
farmbuyer@56 172 end
farmbuyer@56 173
farmbuyer@1 174 local function att (_, loot, last_printed, _, cache)
farmbuyer@1 175 for i = last_printed+1, #loot do
farmbuyer@1 176 local e = loot[i]
farmbuyer@1 177
farmbuyer@1 178 if e.kind == 'boss' and e.reason == 'kill' then
farmbuyer@56 179 -- This could, concievably, be different on a per-boss basis
farmbuyer@56 180 -- (e.g., "we're dropping to 10-man for the PvP boss")
farmbuyer@56 181 local i,o = do_attendance (e.raidersnap, e.maxsize / MEMBERS_PER_RAID_GROUP)
farmbuyer@56 182
farmbuyer@65 183 cache[#cache+1] = ("\n%s -- %s\n{+} %s\n{-} %s\n"):
farmbuyer@65 184 format(e.instance, e.bossname, i, o)
farmbuyer@1 185
farmbuyer@1 186 elseif e.kind == 'time' then
farmbuyer@1 187 cache[#cache+1] = e.startday.text
farmbuyer@1 188
farmbuyer@1 189 end
farmbuyer@1 190 end
farmbuyer@61 191 return #cache > 0
farmbuyer@1 192 end
farmbuyer@1 193
farmbuyer@1 194 local function att_specials (_, editbox, container, mkbutton)
farmbuyer@1 195 local w = mkbutton("Take Attendance",
farmbuyer@1 196 [[Take attendance now (will continue to take attendance on each boss kill).]])
farmbuyer@1 197 w:SetFullWidth(true)
farmbuyer@1 198 w:SetCallback("OnClick", function(_w)
farmbuyer@61 199 local ss,max,instance = addon:snapshot_raid (--[[inraid=]]true)
farmbuyer@61 200 local i,o = do_attendance (ss, max / MEMBERS_PER_RAID_GROUP)
farmbuyer@1 201 local h, m = GetGameTime()
farmbuyer@56 202
farmbuyer@61 203 local additional = ("Attendance for %s at %.2d:%.2d:\n{+} %s\n{-} %s"):
farmbuyer@61 204 format(instance, h, m, i, o)
farmbuyer@1 205 editbox:SetText(editbox:GetText() .. '\n' .. additional)
farmbuyer@1 206 end)
farmbuyer@1 207 container:AddChild(w)
farmbuyer@1 208 end
farmbuyer@1 209
farmbuyer@1 210 addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials)
farmbuyer@1 211
farmbuyer@1 212 -- vim:noet