Mercurial > wow > ouroloot
changeset 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 | a57133ee3c9b |
| children | fe04f5c4114a |
| files | core.lua options.lua |
| diffstat | 2 files changed, 51 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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 <X> 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.]])
