# HG changeset patch # User Farmbuyer of US-Kilrogg # Date 1343803912 0 # Node ID f7162a1cadc7b16ac3ffc438db40b0cb335e6017 # Parent a57133ee3c9b8300b6c1731554f614a0dc0ab4bc 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). diff -r a57133ee3c9b -r f7162a1cadc7 core.lua --- a/core.lua Mon Jul 30 19:25:46 2012 +0000 +++ b/core.lua Wed Aug 01 06:51:52 2012 +0000 @@ -134,7 +134,8 @@ ['display_bcast_from'] = true, ['precache_history_uniques'] = false, ['chatty_on_remote_changes'] = false, - ['chatty_on_remote_changes_frame'] = 1, + ['chatty_on_local_changes'] = false, + ['chatty_on_changes_frame'] = 1, ['itemfilter'] = {}, ['itemvault'] = {}, } } @@ -392,7 +393,7 @@ -- En masse forward decls of symbols defined inside local blocks local _register_bossmod, makedate, create_new_cache, _init, _log, _do_loot_metas local _history_by_loot_id, _setup_unique_replace, _unavoidable_collision -local _notify_about_change, _notify_about_remote +local _notify_about_change -- Try to extract numbers from the .toc "Version" and munge them into an -- integral form for comparison. The result doesn't need to be meaningful as @@ -957,7 +958,7 @@ self:_scan_LOD_modules() - self:_set_remote_change_chatframe (opts.chatty_on_remote_changes_frame, --[[silent_p=]]true) + self:_set_chatty_change_chatframe (opts.chatty_on_changes_frame, --[[silent_p=]]true) if self.debug.flow then self:Print"is in control-flow debug mode." end end @@ -1058,6 +1059,15 @@ -- -- Can't *quite* use the expiring caches for this, but that's okay. do + local mtnewindex = function() error("This table is read-only", 3) end + local function make_readonly (t) + return _G.setmetatable({}, { + __newindex = mtnewindex, + __index = t, + __metatable = false, + }) + end + local unpack = _G.unpack local function F (t) addon.callbacks:Fire (unpack(t)) @@ -1066,6 +1076,9 @@ function addon:Fire (...) self.dprint('callback', ...) local capture = flib.new(...) + for k,v in ipairs(capture) do if type(v) == 'table' then + capture[k] = make_readonly(v) + end end self:ScheduleTimer (F, 1.2, capture) end end @@ -1816,9 +1829,9 @@ -- Routines for printing changes made by remote users. do - local remote_change_chatframe - - function addon:_set_remote_change_chatframe (arg, silent_p) + local change_chatframe + + function addon:_set_chatty_change_chatframe (arg, silent_p) local frame if type(arg) == 'number' then arg = _G.math.min (arg, _G.NUM_CHAT_WINDOWS) @@ -1827,7 +1840,7 @@ frame = _G[arg] end if type(frame) == 'table' and type(frame.AddMessage) == 'function' then - remote_change_chatframe = frame + change_chatframe = frame if not silent_p then local msg = "Now printing to chat frame " .. arg if frame.GetName then @@ -1844,7 +1857,7 @@ end end - function _notify_about_change (chatframe, source, index, olddisp, from_whom, from_class) + local function _notify (chatframe, source, index, olddisp, from_whom, from_class) local e = g_loot[index] if not e then -- how did this happen? @@ -1886,8 +1899,8 @@ e.itemlink, from_text, to_text) end - function _notify_about_remote (sender, index, olddisp, from_whom, from_class) - _notify_about_change (remote_change_chatframe, sender, index, olddisp, from_whom, from_class) + function _notify_about_change (sender, index, olddisp, from_whom, from_class) + _notify (change_chatframe, sender, index, olddisp, from_whom, from_class) end end @@ -3160,11 +3173,12 @@ self.loot_clean = nil if how == "local" then - _notify_about_change (_G.DEFAULT_CHAT_FRAME, _G.UNIT_YOU, index, - nil, from_name, from_person_class) + if opts.chatty_on_local_changes then + _notify_about_change (_G.UNIT_YOU, index, nil, from_name, from_person_class) + end self:vbroadcast('reassign', unique, id, from_name, to_name) elseif opts.chatty_on_remote_changes then - _notify_about_remote (sender, index, nil, from_name, from_person_class) + _notify_about_change (sender, index, nil, from_name, from_person_class) end if self.display then self.display:GetUserData("GUI state").eoiST:OuroLoot_Refresh(index) @@ -3373,6 +3387,9 @@ -- A unique tag has been set by this point. if how == "local" then unique = assert(e.unique) + if opts.chatty_on_local_changes then + _notify_about_change (_G.UNIT_YOU, index, olddisp) + end self:vbroadcast('mark', unique, id, olddisp, newdisp) end self:Fire ('MarkAs', unique, id, e, olddisp or 'normal', newdisp or 'normal') @@ -3467,7 +3484,7 @@ local index = addon:loot_mark_disposition ("remote", sender, unique, item, old, new) --if not addon.enabled then return end -- hmm if index and opts.chatty_on_remote_changes then - _notify_about_remote (sender, index, old) + _notify_about_change (sender, index, old) end end diff -r a57133ee3c9b -r f7162a1cadc7 options.lua --- a/options.lua Mon Jul 30 19:25:46 2012 +0000 +++ b/options.lua Wed Aug 01 06:51:52 2012 +0000 @@ -250,38 +250,50 @@ local chatgroup = AceGUI:Create("InlineGroup") chatgroup:SetLayout("List") chatgroup:SetRelativeWidth(0.75) - chatgroup:SetTitle("Remote Changes Chat") + chatgroup:SetTitle("Notify on Changes Chat") local toggle, editbox toggle = mktoggle('chatty_on_remote_changes', "Be chatty on remote changes", 1, [[Print something to chat when other users change recorded loot.]], function (_w,_,value) opts.chatty_on_remote_changes = value - editbox:SetDisabled(not opts.chatty_on_remote_changes) + editbox:SetDisabled((not opts.chatty_on_remote_changes) and + (not opts.chatty_on_local_changes)) end) toggle:SetFullWidth(true) chatgroup:AddChild(toggle) + toggle = mktoggle('chatty_on_local_changes', "Be chatty on your own changes", 1, + [[Print something to chat when you change recorded loot (as a reminder).]], + function (_w,_,value) + opts.chatty_on_local_changes = value + editbox:SetDisabled((not opts.chatty_on_remote_changes) and + (not opts.chatty_on_local_changes)) + end) + toggle:SetFullWidth(true) + chatgroup:AddChild(toggle) + w = AceGUI:Create("Label") w:SetFullWidth(true) - w:SetText("This controls the output of the |cff00ffff'Be chatty on remote changes'|r option. If this field is a number, it designates which chat frame to use. Otherwise it is the Lua variable name of a frame with AddMessage capability.") + w:SetText("This controls the output of the |cff00ffff'Be chatty on changes'|r options. If this field is a number, it designates which chat frame to use. Otherwise it is the Lua variable name of a frame with AddMessage capability.") chatgroup:AddChild(w) - editbox = mkbutton("EditBox", nil, opts.chatty_on_remote_changes_frame, + editbox = mkbutton("EditBox", nil, opts.chatty_on_changes_frame, [[1 = default chat frame, 2 = combat log, etc]]) editbox:SetFullWidth(true) editbox:SetLabel("Output Chatframe") editbox:SetCallback("OnTextChanged", adv_careful_OnTextChanged) editbox:SetCallback("OnEnterPressed", function(_w,event,value) - local prev = opts.chatty_on_remote_changes_frame + local prev = opts.chatty_on_changes_frame value = value:trim() value = tonumber(value) or value - if addon:_set_remote_change_chatframe (value) then - opts.chatty_on_remote_changes_frame = value + if addon:_set_chatty_change_chatframe (value) then + opts.chatty_on_changes_frame = value _w:SetText(tostring(value)) _w.editbox:ClearFocus() else _w:SetText(tostring(prev)) end end) - editbox:SetDisabled(not opts.chatty_on_remote_changes) + editbox:SetDisabled((not opts.chatty_on_remote_changes) and + (not opts.chatty_on_local_changes)) chatgroup:AddChild(editbox) w = mkbutton("Chat Frame Numbers", [[Print each chat window number in its own frame, for easy reference in the editing field.]])