annotate text_tabs.lua @ 115:289c7667adab

When fixing up missing item cache during load, make sure GUI displays from scratch. Put the bang back on UI tips checkbox (widget fixed). Revent r112, widgets both fixed now.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Tue, 14 Aug 2012 20:37:12 -0400
parents 67bf97136273
children fc2ff128835a
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@97 56 local fmt = addon.db.profile.forum[addon.db.profile.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@109 64 local destination = e.person
farmbuyer@109 65 if e.disposition then
farmbuyer@109 66 local disp = e.disposition
farmbuyer@109 67 local disptext = addon:_test_disposition(disp,'text')
farmbuyer@109 68 if disp == 'offspec' then
farmbuyer@109 69 destination = e.person .. " " .. disptext
farmbuyer@109 70 elseif disp == 'gvault' then
farmbuyer@109 71 --destination = ("%s (%s)"):format(disptext,e.person)
farmbuyer@109 72 destination = disptext
farmbuyer@109 73 else
farmbuyer@109 74 destination = disptext
farmbuyer@109 75 end
farmbuyer@1 76 end
farmbuyer@1 77 if e.extratext_byhand then
farmbuyer@109 78 destination = destination .. " -- " .. e.extratext
farmbuyer@1 79 end
farmbuyer@66 80 if e.variant and not forum_warned_heroic then
farmbuyer@1 81 forum_warned_heroic = true
farmbuyer@1 82 addon:Print(warning_text)
farmbuyer@1 83 end
farmbuyer@1 84 local t = fmt:gsub('%$I', e.id)
farmbuyer@1 85 :gsub('%$N', e.itemname)
farmbuyer@1 86 :gsub('%$X', e.count or "")
farmbuyer@109 87 :gsub('%$T', destination)
farmbuyer@1 88 cache[#cache+1] = t
farmbuyer@1 89
farmbuyer@1 90 elseif e.kind == 'boss' and e.reason == 'kill' then
farmbuyer@65 91 -- The first boss in an instance gets an instance tag, others
farmbuyer@65 92 -- get a blank line
farmbuyer@1 93 if generated.last_instance == e.instance then
farmbuyer@1 94 cache[#cache+1] = ""
farmbuyer@1 95 else
farmbuyer@1 96 cache[#cache+1] = "\n[b]" .. e.instance .. "[/b]"
farmbuyer@1 97 generated.last_instance = e.instance
farmbuyer@1 98 end
farmbuyer@55 99 cache[#cache+1] = "[i]" .. e.bossname .. "[/i]"
farmbuyer@1 100
farmbuyer@1 101 elseif e.kind == 'time' then
farmbuyer@1 102 cache[#cache+1] = "[b]" .. e.startday.text .. "[/b]"
farmbuyer@1 103
farmbuyer@1 104 end
farmbuyer@1 105 end
farmbuyer@61 106 return #cache > 0
farmbuyer@1 107 end
farmbuyer@1 108
farmbuyer@1 109 local function forum_specials (_,_, container, mkbutton)
farmbuyer@97 110 local opts = addon.db.profile
farmbuyer@1 111 local map,current = {}
farmbuyer@97 112 for label,format in pairs(opts.forum) do
farmbuyer@1 113 table.insert(map,label)
farmbuyer@97 114 if label == opts.forum_current then
farmbuyer@1 115 current = #map
farmbuyer@1 116 end
farmbuyer@1 117 end
farmbuyer@1 118
farmbuyer@1 119 local dd, editbox
farmbuyer@1 120 dd = mkbutton("Dropdown", nil, "",
farmbuyer@1 121 [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]])
farmbuyer@1 122 dd:SetFullWidth(true)
farmbuyer@1 123 dd:SetLabel("Item markup")
farmbuyer@1 124 dd:SetList(map)
farmbuyer@1 125 dd:SetValue(current)
farmbuyer@1 126 dd:SetCallback("OnValueChanged", function(_dd,event,choice)
farmbuyer@97 127 opts.forum_current = map[choice]
farmbuyer@1 128 forum_warned_heroic = nil
farmbuyer@1 129 editbox:SetDisabled(map[choice] ~= "Custom...")
farmbuyer@1 130 end)
farmbuyer@1 131 container:AddChild(dd)
farmbuyer@1 132
farmbuyer@97 133 editbox = mkbutton("EditBox", nil, opts.forum["Custom..."],
farmbuyer@1 134 [[Format described in Help tab (Generated Text -> Forum Markup).]])
farmbuyer@1 135 editbox:SetFullWidth(true)
farmbuyer@1 136 editbox:SetLabel("Custom:")
farmbuyer@1 137 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
farmbuyer@97 138 opts.forum["Custom..."] = value
farmbuyer@1 139 _e.editbox:ClearFocus()
farmbuyer@1 140 end)
farmbuyer@97 141 editbox:SetDisabled(opts.forum_current ~= "Custom...")
farmbuyer@1 142 container:AddChild(editbox)
farmbuyer@1 143 end
farmbuyer@1 144
farmbuyer@1 145 addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials)
farmbuyer@1 146
farmbuyer@1 147
farmbuyer@56 148 local ingroups, outgroups = {}, {}
farmbuyer@56 149 local function do_attendance (raidertable, max_group_number)
farmbuyer@56 150 local tins, wipe, tsort, tconcat =
farmbuyer@56 151 table.insert, table.wipe, table.sort, table.concat
farmbuyer@56 152
farmbuyer@56 153 -- Assumption: everybody is packed into the first N groups.
farmbuyer@56 154 if raidertable then for name,info in pairs(raidertable) do
farmbuyer@102 155 if info.online ~= 'no_longer' then -- 'no_longer' == left the raid
farmbuyer@68 156 if (info.subgroup or (NUM_RAID_GROUPS+1)) <= max_group_number then
farmbuyer@114 157 tins (ingroups, info.fname)
farmbuyer@56 158 else
farmbuyer@114 159 tins (outgroups, info.fname)
farmbuyer@56 160 end
farmbuyer@56 161 end
farmbuyer@56 162 end end
farmbuyer@56 163 if #ingroups > 0 then
farmbuyer@56 164 tsort(ingroups)
farmbuyer@56 165 else
farmbuyer@56 166 ingroups[1] = [[Nobody recorded as inside the instance.]]
farmbuyer@56 167 end
farmbuyer@56 168 if #outgroups > 0 then
farmbuyer@56 169 tsort(outgroups)
farmbuyer@56 170 else
farmbuyer@56 171 outgroups[1] = [[Nobody recorded as outside the instance.]]
farmbuyer@56 172 end
farmbuyer@56 173 local i,o = tconcat(ingroups,", "), tconcat(outgroups,", ")
farmbuyer@56 174 wipe(ingroups)
farmbuyer@56 175 wipe(outgroups)
farmbuyer@56 176 return i,o
farmbuyer@56 177 end
farmbuyer@56 178
farmbuyer@1 179 local function att (_, loot, last_printed, _, cache)
farmbuyer@1 180 for i = last_printed+1, #loot do
farmbuyer@1 181 local e = loot[i]
farmbuyer@1 182
farmbuyer@1 183 if e.kind == 'boss' and e.reason == 'kill' then
farmbuyer@69 184 -- Raid size can potentially be different on a per-boss basis
farmbuyer@56 185 -- (e.g., "we're dropping to 10-man for the PvP boss")
farmbuyer@56 186 local i,o = do_attendance (e.raidersnap, e.maxsize / MEMBERS_PER_RAID_GROUP)
farmbuyer@56 187
farmbuyer@65 188 cache[#cache+1] = ("\n%s -- %s\n{+} %s\n{-} %s\n"):
farmbuyer@65 189 format(e.instance, e.bossname, i, o)
farmbuyer@1 190
farmbuyer@1 191 elseif e.kind == 'time' then
farmbuyer@1 192 cache[#cache+1] = e.startday.text
farmbuyer@1 193
farmbuyer@1 194 end
farmbuyer@1 195 end
farmbuyer@61 196 return #cache > 0
farmbuyer@1 197 end
farmbuyer@1 198
farmbuyer@1 199 local function att_specials (_, editbox, container, mkbutton)
farmbuyer@1 200 local w = mkbutton("Take Attendance",
farmbuyer@1 201 [[Take attendance now (will continue to take attendance on each boss kill).]])
farmbuyer@1 202 w:SetFullWidth(true)
farmbuyer@1 203 w:SetCallback("OnClick", function(_w)
farmbuyer@61 204 local ss,max,instance = addon:snapshot_raid (--[[inraid=]]true)
farmbuyer@61 205 local i,o = do_attendance (ss, max / MEMBERS_PER_RAID_GROUP)
farmbuyer@1 206 local h, m = GetGameTime()
farmbuyer@56 207
farmbuyer@61 208 local additional = ("Attendance for %s at %.2d:%.2d:\n{+} %s\n{-} %s"):
farmbuyer@61 209 format(instance, h, m, i, o)
farmbuyer@1 210 editbox:SetText(editbox:GetText() .. '\n' .. additional)
farmbuyer@1 211 end)
farmbuyer@1 212 container:AddChild(w)
farmbuyer@1 213 end
farmbuyer@1 214
farmbuyer@1 215 addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials)
farmbuyer@1 216
farmbuyer@109 217 addon.FILES_LOADED = addon.FILES_LOADED + 1
farmbuyer@1 218 -- vim:noet