--[[ Name: AstrolabeMapMonitor Revision: $Rev: 44 $ $Date: 2007-03-30 11:56:21 -0700 (Fri, 30 Mar 2007) $ Author(s): Esamynn (esamynn@wowinterface.com) Inspired By: Gatherer by Norganna MapLibrary by Kristofer Karlsson (krka@kth.se) Website: http://esamynn.wowinterface.com/ Documentation: http://www.esamynn.org/wiki/Astrolabe/World_Map_Monitor SVN: http://esamynn.org/svn/astrolabe/ Description: This is a small stub library to support the main Astrolabe library. It's purpose is to monitor the visibility of various World Map frames, so that Astrolabe can modify its behaviour accordingly. Copyright (C) 2007 James Carrothers License: This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Note: This library's source code is specifically designed to work with World of Warcraft's interpreted AddOn system. You have an implicit licence to use this library with these facilities since that is its designated purpose as per: http://www.fsf.org/licensing/licenses/gpl-faq.html#InterpreterIncompat ]] QuestHelper_File["AstrolabeQH/AstrolabeMapMonitor.lua"] = "4.0.1.$svnversion$" QuestHelper_Loadtime["AstrolabeQH/AstrolabeMapMonitor.lua"] = GetTime() -- WARNING!!! -- DO NOT MAKE CHANGES TO THIS LIBRARY WITHOUT FIRST CHANGING THE LIBRARY_VERSION_MAJOR -- STRING (to something unique) OR ELSE YOU MAY BREAK OTHER ADDONS THAT USE THIS LIBRARY!!! local LIBRARY_VERSION_MAJOR = "AstrolabeMapMonitor" local LIBRARY_VERSION_MINOR = tonumber(string.match("$Revision: 44 $", "(%d+)") or 1) if not DongleStub then error(LIBRARY_VERSION_MAJOR .. " requires DongleStub.") end if not DongleStub:IsNewerVersion(LIBRARY_VERSION_MAJOR, LIBRARY_VERSION_MINOR) then return end local AstrolabeMapMonitor = {}; function AstrolabeMapMonitor:GetVersion() return LIBRARY_VERSION_MAJOR, LIBRARY_VERSION_MINOR; end -------------------------------------------------------------------------------------------------------------- -- Global World Map Frame Registration Table -------------------------------------------------------------------------------------------------------------- if ( type(WorldMapDisplayFrames) ~= "table" ) then WorldMapDisplayFrames = { WorldMapFrame }; else local worldMapFound = false; for k, v in pairs(WorldMapDisplayFrames) do if ( v == WorldMapFrame ) then worldMapFound = true; break; end end if not ( worldMapFound ) then table.insert(WorldMapDisplayFrames, WorldMapFrame); end end -------------------------------------------------------------------------------------------------------------- -- Working Tables and Config Constants -------------------------------------------------------------------------------------------------------------- AstrolabeMapMonitor.TrackedWorldMaps = {}; AstrolabeMapMonitor.AstrolabeLibrarys = {}; AstrolabeMapMonitor.NumVisibleWorldMaps = 0; -------------------------------------------------------------------------------------------------------------- -- Monitor Frame Script Handlers -------------------------------------------------------------------------------------------------------------- local function onShow( frame ) AstrolabeMapMonitor.NumVisibleWorldMaps = AstrolabeMapMonitor.NumVisibleWorldMaps + 1; AstrolabeMapMonitor:Update() end local function onHide( frame ) AstrolabeMapMonitor.NumVisibleWorldMaps = AstrolabeMapMonitor.NumVisibleWorldMaps - 1; AstrolabeMapMonitor:Update() end local function setScripts( monitorFrame ) QH_Hook( monitorFrame, "OnShow", onShow); QH_Hook( monitorFrame, "OnHide", onHide); end -------------------------------------------------------------------------------------------------------------- -- Internal Utility Functions -------------------------------------------------------------------------------------------------------------- local function assert(level,condition,message) if not condition then error(message,level) end end local function argcheck(value, num, ...) assert(1, type(num) == "number", "Bad argument #2 to 'argcheck' (number expected, got " .. type(level) .. ")") for i=1,select("#", ...) do if type(value) == select(i, ...) then return end end local types = strjoin(", ", ...) local name = string.match(debugstack(2,2,0), ": in function [`<](.-)['>]") error(string.format("Bad argument #%d to 'AstrolabeMapMonitor.%s' (%s expected, got %s)", num, name, types, type(value)), 3) end -------------------------------------------------------------------------------------------------------------- -- Public API -------------------------------------------------------------------------------------------------------------- function AstrolabeMapMonitor:MonitorWorldMap( worldMapFrame ) -- check argument types argcheck(worldMapFrame, 2, "table"); assert((worldMapFrame.SetParent), "Usage Message"); local TrackedWorldMaps = self.TrackedWorldMaps; if ( TrackedWorldMaps[worldMapFrame] ) then return 1; end local monitorFrame = CreateFrame("Frame", nil, worldMapFrame); TrackedWorldMaps[worldMapFrame] = monitorFrame; setScripts(monitorFrame); self:ForceUpdate(); return 0; end function AstrolabeMapMonitor:LookForMapsToRegister() for k, frame in pairs(WorldMapDisplayFrames) do if ( type(frame) == "table" and frame.SetParent ) then self:MonitorWorldMap(frame); end end end function AstrolabeMapMonitor:Update() local visibleMap = false; if ( (self.NumVisibleWorldMaps) > 0 ) then visibleMap = true; end for lib, versionString in pairs(self.AstrolabeLibrarys) do lib.WorldMapVisible = visibleMap; if ( (not visibleMap) and lib.AllWorldMapsHidden ) then lib:AllWorldMapsHidden(); end end return visibleMap; end function AstrolabeMapMonitor:ForceUpdate() self.NumVisibleWorldMaps = 0; for worldMap, monitorFrame in pairs(self.TrackedWorldMaps) do if ( worldMap:IsVisible() ) then self.NumVisibleWorldMaps = self.NumVisibleWorldMaps + 1; end end return self:Update(); end function AstrolabeMapMonitor:RegisterAstrolabeLibrary( lib, majorVersionString ) -- check argument types argcheck(lib, 2, "table"); argcheck(majorVersionString, 3, "string"); self.AstrolabeLibrarys[lib] = majorVersionString; self:Update(); end -------------------------------------------------------------------------------------------------------------- -- Handler Scripts -------------------------------------------------------------------------------------------------------------- function AstrolabeMapMonitor:OnEvent( frame, event ) if ( event == "ADDON_LOADED" ) then self:LookForMapsToRegister(); self:ForceUpdate(); end end -------------------------------------------------------------------------------------------------------------- -- Library Registration -------------------------------------------------------------------------------------------------------------- local function activate( newInstance, oldInstance ) if ( oldInstance ) then -- this is an upgrade activate for k, v in pairs(oldInstance) do if ( type(v) ~= "function" ) then newInstance[k] = v; end end AstrolabeMapMonitor = oldInstance; else AstrolabeMapMonitor.eventFrame = CreateFrame("Frame"); end for worldMap, monitorFrame in pairs(AstrolabeMapMonitor.TrackedWorldMaps) do setScripts(monitorFrame); end local frame = AstrolabeMapMonitor.eventFrame; frame:Hide(); frame:UnregisterAllEvents(); frame:RegisterEvent("ADDON_LOADED"); frame:SetScript("OnEvent", function( frame, event, ... ) AstrolabeMapMonitor:OnEvent(frame, event, ...); end ); end DongleStub:Register(AstrolabeMapMonitor, activate)