farmbuyer@1: local addon = select(2,...) farmbuyer@1: farmbuyer@1: --[[ Generator: farmbuyer@1: boolean FUNC (ttype, loot, last_printed, generated, cache) farmbuyer@1: in TTYPE: the registered text type as passed to register_text_generator farmbuyer@1: in LOOT: pointer to g_loot table farmbuyer@1: in LAST_PRINTED: index into loot most recently formatted by this routine farmbuyer@1: in GENERATED.TTYPE: (string) FIFO buffer for text created by this routine; farmbuyer@1: other parts of the GUI copy and nil out this string. Do not change farmbuyer@1: this string, only examine it if needed. If the generator is called farmbuyer@1: more than once between GUI updates, text will build up here. farmbuyer@1: in/out GENERATED.TTYPE_pos: if non-nil, this is the saved cursor position in farmbuyer@1: the text window (so that it stays where the user last left it). farmbuyer@1: Move it if you're doing something strange with the displayed text. farmbuyer@1: tmp GENERATED.loc_TTYPE_*: Use as needed. farmbuyer@1: out CACHE: Empty output table. Accumulate generated lines here, one entry farmbuyer@1: per visible line. Do not terminate with a newline unless you want farmbuyer@1: an extra blank line there. farmbuyer@1: farmbuyer@1: Preconditions: farmbuyer@1: + LAST_PRINTED < #LOOT farmbuyer@1: + all "display-relevant" information for the main Loot tab has been filled farmbuyer@1: out (e.g., LOOT[i].cols[3] might have extra text, etc) farmbuyer@1: + LOOT.TTYPE is a non-nil string containing all text in the text box (and farmbuyer@1: if the user has edited the text box, this string will be updated). Do not farmbuyer@1: change this, but like GENERATED.TTYPE it is available for examination. farmbuyer@1: farmbuyer@1: Return true if text was created, false if nothing was done. farmbuyer@1: ]] farmbuyer@1: farmbuyer@1: --[[ Optional special widgets: farmbuyer@1: FUNC (ttype, editbox, container, mkbutton) farmbuyer@1: TTYPE: see above farmbuyer@1: EDITBOX: the MultiLineEditBox widget farmbuyer@1: CONTAINER: widget container (already has 'Regenerate' button in it) farmbuyer@1: MKBUTTON: function to create more AceGUI widgets, as follows: farmbuyer@1: farmbuyer@1: mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text") farmbuyer@1: mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text") farmbuyer@1: mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text") farmbuyer@1: farmbuyer@1: The 'display key' parameter will almost certainly be specified as nil for these functions. farmbuyer@1: ]] farmbuyer@1: farmbuyer@1: local forum_warned_heroic farmbuyer@1: local warning_text farmbuyer@1: do farmbuyer@1: local red = '|cffff0505' farmbuyer@11: local green = ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex farmbuyer@1: warning_text = ([[%sWARNING:|r Heroic 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 and regenerate this loot.]]):format(red, green, green) farmbuyer@1: end farmbuyer@1: farmbuyer@1: local function forum (_, loot, last_printed, generated, cache) farmbuyer@1: local fmt = OuroLootSV_opts.forum[OuroLootSV_opts.forum_current] or "" farmbuyer@1: -- if it's capable of handling heroic items, consider them warned already farmbuyer@1: forum_warned_heroic = forum_warned_heroic or fmt:find'%$I' farmbuyer@1: farmbuyer@1: for i = last_printed+1, #loot do farmbuyer@1: local e = loot[i] farmbuyer@1: farmbuyer@1: if e.kind == 'loot' then farmbuyer@1: -- Assuming nobody names a toon "offspec" or "gvault" farmbuyer@1: -- 16Apr2011: armory finds 20 Gvaults and 77 Offspecs... hulk smash. farmbuyer@1: local disp = e.disposition or e.person farmbuyer@1: if disp == 'offspec' then farmbuyer@1: disp = e.person .. " " .. 'offspec' farmbuyer@1: elseif disp == 'gvault' then farmbuyer@1: --disp = "guild vault (".. e.person .. ")" farmbuyer@1: disp = "guild vault" farmbuyer@1: end farmbuyer@1: if e.extratext_byhand then farmbuyer@1: disp = disp .. " -- " .. e.extratext farmbuyer@1: end farmbuyer@1: if e.is_heroic and not forum_warned_heroic then farmbuyer@1: forum_warned_heroic = true farmbuyer@1: addon:Print(warning_text) farmbuyer@1: end farmbuyer@1: local t = fmt:gsub('%$I', e.id) farmbuyer@1: :gsub('%$N', e.itemname) farmbuyer@1: :gsub('%$X', e.count or "") farmbuyer@1: :gsub('%$T', disp) farmbuyer@1: cache[#cache+1] = t farmbuyer@1: farmbuyer@1: elseif e.kind == 'boss' and e.reason == 'kill' then farmbuyer@1: -- first boss in an instance gets an instance tag, others get a blank line farmbuyer@1: if generated.last_instance == e.instance then farmbuyer@1: cache[#cache+1] = "" farmbuyer@1: else farmbuyer@1: cache[#cache+1] = "\n[b]" .. e.instance .. "[/b]" farmbuyer@1: generated.last_instance = e.instance farmbuyer@1: end farmbuyer@1: cache[#cache+1] = "[i]" .. e.bosskill .. "[/i]" farmbuyer@1: farmbuyer@1: elseif e.kind == 'time' then farmbuyer@1: cache[#cache+1] = "[b]" .. e.startday.text .. "[/b]" farmbuyer@1: farmbuyer@1: end farmbuyer@1: end farmbuyer@1: return true farmbuyer@1: end farmbuyer@1: farmbuyer@1: local function forum_specials (_,_, container, mkbutton) farmbuyer@1: local map,current = {} farmbuyer@1: for label,format in pairs(OuroLootSV_opts.forum) do farmbuyer@1: table.insert(map,label) farmbuyer@1: if label == OuroLootSV_opts.forum_current then farmbuyer@1: current = #map farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: local dd, editbox farmbuyer@1: dd = mkbutton("Dropdown", nil, "", farmbuyer@1: [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]]) farmbuyer@1: dd:SetFullWidth(true) farmbuyer@1: dd:SetLabel("Item markup") farmbuyer@1: dd:SetList(map) farmbuyer@1: dd:SetValue(current) farmbuyer@1: dd:SetCallback("OnValueChanged", function(_dd,event,choice) farmbuyer@1: OuroLootSV_opts.forum_current = map[choice] farmbuyer@1: forum_warned_heroic = nil farmbuyer@1: editbox:SetDisabled(map[choice] ~= "Custom...") farmbuyer@1: end) farmbuyer@1: container:AddChild(dd) farmbuyer@1: farmbuyer@1: editbox = mkbutton("EditBox", nil, OuroLootSV_opts.forum["Custom..."], farmbuyer@1: [[Format described in Help tab (Generated Text -> Forum Markup).]]) farmbuyer@1: editbox:SetFullWidth(true) farmbuyer@1: editbox:SetLabel("Custom:") farmbuyer@1: editbox:SetCallback("OnEnterPressed", function(_e,event,value) farmbuyer@1: OuroLootSV_opts.forum["Custom..."] = value farmbuyer@1: _e.editbox:ClearFocus() farmbuyer@1: end) farmbuyer@1: editbox:SetDisabled(OuroLootSV_opts.forum_current ~= "Custom...") farmbuyer@1: container:AddChild(editbox) farmbuyer@1: end farmbuyer@1: farmbuyer@1: addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials) farmbuyer@1: farmbuyer@1: farmbuyer@1: local function att (_, loot, last_printed, _, cache) farmbuyer@1: for i = last_printed+1, #loot do farmbuyer@1: local e = loot[i] farmbuyer@1: farmbuyer@1: if e.kind == 'boss' and e.reason == 'kill' then farmbuyer@1: cache[#cache+1] = ("\n%s -- %s\n%s"):format(e.instance, e.bosskill, e.raiderlist or '') farmbuyer@1: farmbuyer@1: elseif e.kind == 'time' then farmbuyer@1: cache[#cache+1] = e.startday.text farmbuyer@1: farmbuyer@1: end farmbuyer@1: end farmbuyer@1: return true farmbuyer@1: end farmbuyer@1: farmbuyer@1: local function att_specials (_, editbox, container, mkbutton) farmbuyer@1: local w = mkbutton("Take Attendance", farmbuyer@1: [[Take attendance now (will continue to take attendance on each boss kill).]]) farmbuyer@1: w:SetFullWidth(true) farmbuyer@1: w:SetCallback("OnClick", function(_w) farmbuyer@1: local raiders = {} farmbuyer@1: for i = 1, GetNumRaidMembers() do farmbuyer@1: table.insert(raiders, (GetRaidRosterInfo(i))) farmbuyer@1: end farmbuyer@1: table.sort(raiders) farmbuyer@1: local h, m = GetGameTime() farmbuyer@1: local additional = ("Attendance at %s:%s:\n%s"):format(h,m,table.concat(raiders, ", ")) farmbuyer@1: editbox:SetText(editbox:GetText() .. '\n' .. additional) farmbuyer@1: end) farmbuyer@1: container:AddChild(w) farmbuyer@1: end farmbuyer@1: farmbuyer@1: addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials) farmbuyer@1: farmbuyer@1: -- vim:noet