WoWInterface SVN TactikSOD

[/] [branches/] [MyMinimapButton.lua] - Rev 2

Compare with Previous | Blame | View Log

--[[ MyMinimapButton v0.7

        This is an embedded library intended to be used by other mods.
        It's not a standalone mod.

        See MyMinimapButton_API_readme.txt for more info.
]]

local version = 1.0

if not MyMinimapButton or MyMinimapButton.Version<version then

  MyMinimapButton = {

        Version = version,              -- for version checking

        -- Dynamically create a button
        --   modName = name of the button (mandatory)
        --   modSettings = table where SavedVariables are stored for the button (optional)
        --   initSettings = table of default settings (optional)
        Create = function(self,modName,modSettings,initSettings)
                if not modName or getglobal(modName.."MinimapButton") then
                        return
                end
                initSettings = initSettings or {}
                modSettings = modSettings or {}
                self.Buttons = self.Buttons or {}

                local frameName = modName.."MinimapButton"
                local frame = CreateFrame("Button",frameName,Minimap)
                frame:SetWidth(31)
                frame:SetHeight(31)
                frame:SetFrameStrata("LOW")
                frame:SetToplevel(1) -- enabled in 1.10.2
                frame:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
                frame:SetPoint("TOPLEFT",Minimap,"TOPLEFT")
                local icon = frame:CreateTexture(frameName.."Icon","BACKGROUND")
                icon:SetTexture(initSettings.icon or "Interface\\Icons\\INV_Misc_QuestionMark")
                icon:SetWidth(20)
                icon:SetHeight(20)
                icon:SetPoint("TOPLEFT",frame,"TOPLEFT",7,-5)
                local overlay = frame:CreateTexture(frameName.."Overlay","OVERLAY")
                overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
                overlay:SetWidth(53)
                overlay:SetHeight(53)
                overlay:SetPoint("TOPLEFT",frame,"TOPLEFT")

                frame:RegisterForClicks("LeftButtonUp","RightButtonUp")
                frame:SetScript("OnClick",self.OnClick)

                frame:SetScript("OnMouseDown",self.OnMouseDown)
                frame:SetScript("OnMouseUp",self.OnMouseUp)
                frame:SetScript("OnEnter",self.OnEnter)
                frame:SetScript("OnLeave",self.OnLeave)

                frame:RegisterForDrag("LeftButton")
                frame:SetScript("OnDragStart",self.OnDragStart)
                frame:SetScript("OnDragStop",self.OnDragStop)

                frame.tooltipTitle = modName
                frame.leftClick = initSettings.left
                frame.rightClick = initSettings.right
                frame.tooltipText = initSettings.tooltip

                local firstUse = 1
                for i in pairs(modSettings) do
                        firstUse = nil -- modSettings has been populated before
                end
                if firstUse then
                        -- define modSettings from initSettings or default
                        modSettings.drag = initSettings.drag or "CIRCLE"
                        modSettings.enabled = initSettings.enabled or 1
                        modSettings.position = initSettings.position or self:GetDefaultPosition()
                        modSettings.locked = initSettings.locked or nil
                end
                frame.modSettings = modSettings

                table.insert(self.Buttons,modName)
                self:SetEnable(modName,modSettings.enabled)
        end,

        -- Changes the icon of the button.
        --   value = texture path, ie: "Interface\\AddOn\\MyMod\\MyModIcon"
        SetIcon = function(self,modName,value)
                if value and getglobal(modName.."MinimapButton") then
                        getglobal(modName.."MinimapButtonIcon"):SetTexture(value)
                end
        end,

        -- Sets the left-click function.
        --   value = function
        SetLeftClick = function(self,modName,value)
                if value and getglobal(modName.."MinimapButton") then
                        getglobal(modName.."MinimapButton").leftClick = value
                end
        end,

        -- Sets the right-click function.
        --  value = function
        SetRightClick = function(self,modName,value)
                if value and getglobal(modName.."MinimapButton") then
                        getglobal(modName.."MinimapButton").rightClick = value
                end
        end,

        -- Sets the drag route.
        --   value = "CIRCLE" or "SQUARE"
        SetDrag = function(self,modName,value)
                local button = getglobal(modName.."MinimapButton")
                if button and (value=="CIRCLE" or value=="SQUARE") then
                        button.modSettings.drag = value
                        self:Move(modName)
                end
        end,

        -- Locks minimap button from moving
        --   value = 0/nil/false or 1/non-nil/true
        SetLock = function(self,modName,value)
                local button = getglobal(modName.."MinimapButton")
                if value==0 then value = nil end
                if button then
                        button.modSettings.locked = (value and 1) or nil
                end
        end,

        -- Enables or disables the minimap button
        --    value = 0/nil/false or 1/non-nil/true
        SetEnable = function(self,modName,value)
                local button = getglobal(modName.."MinimapButton")
                if value==0 then value = nil end
                if button then
                        button.modSettings.enabled = (value and 1) or nil
                        if value then
                                button:Show()
                                self:Move(modName,nil,1)
                        else
                                button:Hide()
                        end
                end
        end,

        -- Returns a setting of this minimap button
        --   setting = "LOCKED", "ENABLED", "DRAG" or "POSITION"
        GetSetting = function(self,modName,setting)
                local button = getglobal(modName.."MinimapButton")
                setting = string.lower(setting or "")
                if button and button.modSettings[setting] then
                        return button.modSettings[setting]
                end
        end,

        -- Sets the tooltip text.
        --   value = string (can include \n)
        SetTooltip = function(self,modName,value)
                local button = getglobal(modName.."MinimapButton")
                if button and value then
                        button.tooltipText = value
                end
        end,

        -- Moves the button.
        --  newPosition = degree angle to display the button (optional)
        --  force = force move irregardless of locked status
        Move = function(self,modName,newPosition,force)
                local button = getglobal(modName.."MinimapButton")
                if button and (not button.modSettings.locked or force) then
                        button.modSettings.position = newPosition or button.modSettings.position
                        local xpos,ypos
                        local angle = button.modSettings.position
                        if button.modSettings.drag=="SQUARE" then
                                xpos = 110 * cos(angle)
                                ypos = 110 * sin(angle)
                                xpos = math.max(-82,math.min(xpos,84))
                                ypos = math.max(-86,math.min(ypos,82))
                        else
                                xpos = 80 * cos(angle)
                                ypos = 80 * sin(angle)
                        end
                        button:SetPoint("TOPLEFT","Minimap","TOPLEFT",54-xpos,ypos-54)
                end
        end,

        -- Debug. Use no parameters to list all created buttons.
        Debug = function(self,modName)
                DEFAULT_CHAT_FRAME:AddMessage("MyMinimapButton version = "..self.Version)
                if modName then
                        DEFAULT_CHAT_FRAME:AddMessage("Button: \""..modName.."\"")
                        local button = getglobal(modName.."MinimapButton")
                        if button then
                                DEFAULT_CHAT_FRAME:AddMessage("positon = "..tostring(button.modSettings.position))
                                DEFAULT_CHAT_FRAME:AddMessage("enabled = "..tostring(button.modSettings.enabled))
                                DEFAULT_CHAT_FRAME:AddMessage("drag = "..tostring(button.modSettings.drag))
                                DEFAULT_CHAT_FRAME:AddMessage("locked = "..tostring(button.modSettings.locked))
                        else
                                DEFAULT_CHAT_FRAME:AddMessage("button not defined")
                        end
                else
                        DEFAULT_CHAT_FRAME:AddMessage("Buttons created:")
                        for i=1,table.getn(self.Buttons) do
                                DEFAULT_CHAT_FRAME:AddMessage("\""..self.Buttons[i].."\"")
                        end
                end
        end,

        --[[ Internal functions: do not call anything below here ]]

        -- this gets a new default position by increments of 20 degrees
        GetDefaultPosition = function(self)
                local position,found = 0,1,0

                while found do
                        found = nil
                        for i=1,table.getn(self.Buttons) do
                                if getglobal(self.Buttons[i].."MinimapButton").modSettings.position==position then
                                        position = position + 20
                                        found = 1
                                end
                        end
                        found = (position>340) and 1 or found -- leave if we've done full circle
                end
                return position
        end,

        OnMouseDown = function()
                getglobal(this:GetName().."Icon"):SetTexCoord(.1,.9,.1,.9)
        end,

        OnMouseUp = function()
                getglobal(this:GetName().."Icon"):SetTexCoord(0,1,0,1)
        end,

        OnEnter = function()
                GameTooltip_SetDefaultAnchor(GameTooltip,UIParent)
                GameTooltip:AddLine(this.tooltipTitle)
                GameTooltip:AddLine(this.tooltipText,.8,.8,.8,1)
                GameTooltip:Show()
        end,

        OnLeave = function()
                GameTooltip:Hide()
        end,

        OnDragStart = function()
                MyMinimapButton:OnMouseDown()
                this:LockHighlight()
                this:SetScript("OnUpdate",MyMinimapButton.OnUpdate)
        end,

        OnDragStop = function()
                this:SetScript("OnUpdate",nil)
                this:UnlockHighlight()
                MyMinimapButton:OnMouseUp()
        end,

        OnUpdate = function()
                local xpos,ypos = GetCursorPosition()
                local xmin,ymin = Minimap:GetLeft(), Minimap:GetBottom()
                xpos = xmin-xpos/Minimap:GetEffectiveScale()+70
                ypos = ypos/Minimap:GetEffectiveScale()-ymin-70
                this.modSettings.position = math.deg(math.atan2(ypos,xpos))
                local modName = string.gsub(this:GetName() or "","MinimapButton$","")
                MyMinimapButton:Move(modName)
        end,

        OnClick = function()
                if arg1=="LeftButton" and this.leftClick then
                        this.leftClick()
                elseif arg1=="RightButton" and this.rightClick then
                        this.rightClick()
                end
        end

  }

end

Compare with Previous | Blame