annotate text_tabs.lua @ 101:f7162a1cadc7

Unify remote/local change notifications, and allow option toggles for each. When passing entry tables to the registered callbacks, make proxies for them first (the goal is to prevent accidents, not fraud).
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Wed, 01 Aug 2012 06:51:52 +0000
parents ba5ff82dcf19
children fe04f5c4114a
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@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@97 106 local opts = addon.db.profile
farmbuyer@1 107 local map,current = {}
farmbuyer@97 108 for label,format in pairs(opts.forum) do
farmbuyer@1 109 table.insert(map,label)
farmbuyer@97 110 if label == opts.forum_current then
farmbuyer@1 111 current = #map
farmbuyer@1 112 end
farmbuyer@1 113 end
farmbuyer@1 114
farmbuyer@1 115 local dd, editbox
farmbuyer@1 116 dd = mkbutton("Dropdown", nil, "",
farmbuyer@1 117 [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]])
farmbuyer@1 118 dd:SetFullWidth(true)
farmbuyer@1 119 dd:SetLabel("Item markup")
farmbuyer@1 120 dd:SetList(map)
farmbuyer@1 121 dd:SetValue(current)
farmbuyer@1 122 dd:SetCallback("OnValueChanged", function(_dd,event,choice)
farmbuyer@97 123 opts.forum_current = map[choice]
farmbuyer@1 124 forum_warned_heroic = nil
farmbuyer@1 125 editbox:SetDisabled(map[choice] ~= "Custom...")
farmbuyer@1 126 end)
farmbuyer@1 127 container:AddChild(dd)
farmbuyer@1 128
farmbuyer@97 129 editbox = mkbutton("EditBox", nil, opts.forum["Custom..."],
farmbuyer@1 130 [[Format described in Help tab (Generated Text -> Forum Markup).]])
farmbuyer@1 131 editbox:SetFullWidth(true)
farmbuyer@1 132 editbox:SetLabel("Custom:")
farmbuyer@1 133 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
farmbuyer@97 134 opts.forum["Custom..."] = value
farmbuyer@1 135 _e.editbox:ClearFocus()
farmbuyer@1 136 end)
farmbuyer@97 137 editbox:SetDisabled(opts.forum_current ~= "Custom...")
farmbuyer@1 138 container:AddChild(editbox)
farmbuyer@1 139 end
farmbuyer@1 140
farmbuyer@1 141 addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials)
farmbuyer@1 142
farmbuyer@1 143
farmbuyer@56 144 local ingroups, outgroups = {}, {}
farmbuyer@56 145 local function do_attendance (raidertable, max_group_number)
farmbuyer@56 146 local tins, wipe, tsort, tconcat =
farmbuyer@56 147 table.insert, table.wipe, table.sort, table.concat
farmbuyer@56 148
farmbuyer@56 149 -- Assumption: everybody is packed into the first N groups.
farmbuyer@56 150 if raidertable then for name,info in pairs(raidertable) do
farmbuyer@56 151 if info.online ~= 3 then -- 3 == left the raid
farmbuyer@68 152 if (info.subgroup or (NUM_RAID_GROUPS+1)) <= max_group_number then
farmbuyer@56 153 tins (ingroups, name)
farmbuyer@56 154 else
farmbuyer@56 155 tins (outgroups, name)
farmbuyer@56 156 end
farmbuyer@56 157 end
farmbuyer@56 158 end end
farmbuyer@56 159 if #ingroups > 0 then
farmbuyer@56 160 tsort(ingroups)
farmbuyer@56 161 else
farmbuyer@56 162 ingroups[1] = [[Nobody recorded as inside the instance.]]
farmbuyer@56 163 end
farmbuyer@56 164 if #outgroups > 0 then
farmbuyer@56 165 tsort(outgroups)
farmbuyer@56 166 else
farmbuyer@56 167 outgroups[1] = [[Nobody recorded as outside the instance.]]
farmbuyer@56 168 end
farmbuyer@56 169 local i,o = tconcat(ingroups,", "), tconcat(outgroups,", ")
farmbuyer@56 170 wipe(ingroups)
farmbuyer@56 171 wipe(outgroups)
farmbuyer@56 172 return i,o
farmbuyer@56 173 end
farmbuyer@56 174
farmbuyer@1 175 local function att (_, loot, last_printed, _, cache)
farmbuyer@1 176 for i = last_printed+1, #loot do
farmbuyer@1 177 local e = loot[i]
farmbuyer@1 178
farmbuyer@1 179 if e.kind == 'boss' and e.reason == 'kill' then
farmbuyer@69 180 -- Raid size can potentially be different on a per-boss basis
farmbuyer@56 181 -- (e.g., "we're dropping to 10-man for the PvP boss")
farmbuyer@56 182 local i,o = do_attendance (e.raidersnap, e.maxsize / MEMBERS_PER_RAID_GROUP)
farmbuyer@56 183
farmbuyer@65 184 cache[#cache+1] = ("\n%s -- %s\n{+} %s\n{-} %s\n"):
farmbuyer@65 185 format(e.instance, e.bossname, i, o)
farmbuyer@1 186
farmbuyer@1 187 elseif e.kind == 'time' then
farmbuyer@1 188 cache[#cache+1] = e.startday.text
farmbuyer@1 189
farmbuyer@1 190 end
farmbuyer@1 191 end
farmbuyer@61 192 return #cache > 0
farmbuyer@1 193 end
farmbuyer@1 194
farmbuyer@1 195 local function att_specials (_, editbox, container, mkbutton)
farmbuyer@1 196 local w = mkbutton("Take Attendance",
farmbuyer@1 197 [[Take attendance now (will continue to take attendance on each boss kill).]])
farmbuyer@1 198 w:SetFullWidth(true)
farmbuyer@1 199 w:SetCallback("OnClick", function(_w)
farmbuyer@61 200 local ss,max,instance = addon:snapshot_raid (--[[inraid=]]true)
farmbuyer@61 201 local i,o = do_attendance (ss, max / MEMBERS_PER_RAID_GROUP)
farmbuyer@1 202 local h, m = GetGameTime()
farmbuyer@56 203
farmbuyer@61 204 local additional = ("Attendance for %s at %.2d:%.2d:\n{+} %s\n{-} %s"):
farmbuyer@61 205 format(instance, h, m, i, o)
farmbuyer@1 206 editbox:SetText(editbox:GetText() .. '\n' .. additional)
farmbuyer@1 207 end)
farmbuyer@1 208 container:AddChild(w)
farmbuyer@1 209 end
farmbuyer@1 210
farmbuyer@1 211 addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials)
farmbuyer@1 212
farmbuyer@1 213 -- vim:noet