kgPanels

Sample Scripts

Sample scripts culled from the forums, credits to thos who posted in the kgPanel thread.

Adjusting Panels based on Raid or 5 Main party

In each Panel set the OnLoad script

 self:RegisterEvent("PLAYER_ENTERING_WORLD")
 self:RegisterEvent("PARTY_MEMBERS_CHANGED")
 self:RegisterEvent("RAID_ROSTER_UPDATE")

Then in each Panel OnEvent script:

 local pmems = GetNumPartyMembers()
 local rmems = GetNumRaidMembers()
 if (pmems < 1 and rmems < 1) or (pmems > 0 and pmems < 6 and rmems < 6) then
    self:Hide()
 else
    self:Show()
 end

Using a onClick handler

Be sure you enable mouse clicks on your panel Example: Hide/Show recount when you click the panel

if Recount.MainWindow:IsVisible() then
  Recount.MainWindow:Hide()
else
  Recount.MainWindow:Show()
end

Changing a frame based on Target

OnLoad

self:RegisterEvent("UNIT_TARGET")
self:Hide()

OnEvent

if UnitExists("target") == nil then
   self:Hide()
   return
end
local cl = UnitClassification("target")
if (cl == "elite") or (cl == "worldboss") or (cl == "rareeleite") then
   self:SetBackdropColor(0.1, 0.1, 0.1, 0.1)
   self:Show()
else
   self:SetBackdropColor(1, 1, 1, 1)
   self:Show()
end

Hooking another frame to control your own frame

Examples uses Violation Script Dependacy: Violation OnLoad

local myPanel = self
if Violation0 then
  Violation0:SetScript("OnShow",function(frame)
    myPanel:Show()
  end)
  Violation0:SetScript("OnHide",function(frame)
    myPanel:Hide()
  end)
end
if Violation0:IsVisible() then self:Show() else self:Hide() end

Controlling a panel based on entering a major city

OnLoad

self:RegsiterEvent('CHAT_MSG_CHANNEL_NOTICE')

OnEvent:

if event == "CHAT_MSG_CHANNEL_NOTICE" then
  -- arg1 is either "YOU JOINED", "YOU LEFT" or "THROTTLED"
  -- arg7 is channel type (trade is type 2)
  -- so
  if arg1 == "YOU_JOINED" and arg7 == 2 then
    self:Show()
  end
  if arg1 == "YOU_LEFT" and arg7 == 2 then
    self:Hide()
  end
end

Make your own spell damage display

Create a panel OnLoad

self:RegisterEvent("PLAYER_AURAS_CHANGED")

OnEvent:

dmg = GetSpellBonusDamage(6);
self.text:SetText(dmg)

Change a frame color based on your class

OnLoad

local _, class = UnitClass("player");
	if class == "WARRIOR" then
        self.bg:SetVertexColor(0.95, 0.23, 0.23, self.bg:GetAlpha())
	elseif class == "PRIEST" then
        self.bg:SetVertexColor(1, 0.96, 0.98, self.bg:GetAlpha())
	elseif class == "MAGE" then
        self.bg:SetVertexColor(0.00, 1, 1, self.bg:GetAlpha())
	elseif class == "DRUID" then
        self.bg:SetVertexColor(1, 0.49, 0.04, self.bg:GetAlpha())
	elseif class == "PALADIN" then
        self.bg:SetVertexColor(0.92, 0.22, 0.46, self.bg:GetAlpha())
	elseif class == "HUNTER" then
        self.bg:SetVertexColor(0.33, 0.86, 0.00, self.bg:GetAlpha())
	elseif class == "ROGUE" then
        self.bg:SetVertexColor(1, 0.94, 0.16, self.bg:GetAlpha())
	elseif class == "SHAMAN" then
        self.bg:SetVertexColor(0.13, 0.42, 1, self.bg:GetAlpha())
	elseif class == "WARLOCK" then
        self.bg:SetVertexColor(0.36, 0.18, 1, self.bg:GetAlpha())
	end

Show a panel based on being in combat

OnLoad

self:RegisterEvent("PLAYER_REGEN_DISABLED")
self:RegisterEvent("PLAYER_REGEN_ENABLED")

OnEvent

if event == "PLAYER_REGEN_ENABLED" then
  self:Hide()
elseif event == "PLAYER_REGEN_DISABLED" then
  self:Show()
end

How to get 8 value tex coords form 4 value examples

For instance you want to use the raid icons blizz provides as a texture. foirst add teh texture to your art library or add it to sharedmedia up to you.

On a Mac ive found use the / slash when entering items is much easier.

Now lets use the status icon as an exmaple

I used onLoad to quickly get the information i wanted.

-- coords found in the FrameXML files
-- left,right,top,bottom
self.bg:SetTexCoord(0.5,1,0,0.5)
local ULx,ULy,LLx,LLy,URx,URy,LRx,LRy = self.bg:GetTexCoord()
print(" ULX: "..ULx)
print(" ULy:"..ULy)
print(" LLX:"..LLx)
print(" LLy:"..LLy)
print(" URx: "..URx)
print(" URy:"..URy)
print(" LRx:"..LRx)
print(" LRy:"..LRy)

Now i have the 8 position coords for the combat icon which is UL(0.5,0) LL(0.5,0.5) UR(1,0) LR(1,0.5)

Its a little bit of a pain, but the 8 coord setup allows for so much more flexibility as you can do transforms. The 4 position method only allows you to make rectangles.

Healer mana warning by warlocomotif

OnLoad

self:RegisterEvent("PLAYER_REGEN_ENABLED")
HEALERWARNING_TIME = 5
HEALERWARNING_PERCENT = 20
HWSHOWTIMER = 0
self:Hide()

OnEvent

if UnitGroupRolesAssigned("player") then
  for i=1,GetNumPartyMembers() do
    if select(2, UnitGroupRolesAssigned("party"..i)) then 
      if (UnitPower("party"..i) / UnitPowerMax("party"..i)) < (HEALERWARNING_PERCENT / 100) then
        self:Show()
        HWSHOWTIMER = GetTime()
      end
      break
    end
  end
end

OnUpdate

if HWSHOWTIMER ~= 0 then
  if (GetTime() - HWSHOWTIMER) > HEALERWARNING_TIME then
    HWSHOWTIMER = 0
    self:Hide()
  end
end

You must login to post a comment. Don't have an account? Register to get one!

  • Avatar of ThuBz ThuBz Oct 12, 2012 at 14:30 UTC - 0 likes

    Hey guys,

    here a little script i found to find out what frame your mouse is over, handy to attach artwork to unitframes/minimap and so on.. works for realy everything!

    /run local e,m,n,f=EnumerateFrames,MouseIsOver;ChatFrame1:AddMessage("The mouse is over the following frames:")f=e()while f do n=f:GetName()if n and f:IsVisible()and m(f)then ChatFrame1:AddMessage(" - "..n)end;f=e(f)end

    i did not write this my self but couldnt find any other script macro's for it. Enjoy

  • Avatar of DrabAngel DrabAngel Sep 29, 2012 at 08:55 UTC - 0 likes

    ** that's not the way it is here **

    Controlling a panel based on entering a major city

     
    OnLoad
    self:RegsiterEvent('CHAT_MSG_CHANNEL_NOTICE')
     
    OnEvent:
    if event == "CHAT_MSG_CHANNEL_NOTICE" then
      -- arg1 is either "YOU JOINED", "YOU LEFT" or "THROTTLED"
      -- arg7 is channel type (trade is type 2)
      -- so
      if arg1 == "YOU_JOINED" and arg7 == 2 then
        self:Show()
      end
      if arg1 == "YOU_LEFT" and arg7 == 2 then
        self:Hide()
      end
    end

    Last edited Sep 29, 2012 by DrabAngel
  • Avatar of steste78 steste78 Sep 13, 2012 at 16:40 UTC - 0 likes

    I m trying to hide and show the xp bar and rep bar in bartender4 but every time the xp bar updates it shows and everytime the rep bar updates it shows now I m looking at a way to disable them and enable them in the db file for bartender please help?

  • Avatar of kagaro kagaro Apr 14, 2012 at 21:34 UTC - 0 likes

    Phanx, fixed your right that script was very bad and shouldn't have been up there. most of the samples were from the forum and i just pasted them in here for a quick reference

  • Avatar of Phanx Phanx Feb 21, 2012 at 01:19 UTC - 0 likes

    The OnUpdate script under "Resizing your panel on the fly" is very poorly written. Most significantly, it fails to set the "self.resized" flag after setting the script, so it will create a new function and set it as ChatFrame1's OnSizeChanged script every time a new video frame is drawn, which can occur over 100 times per second depending on your hardware and settings. Also, it's a poor example in the first place, as no scripts at all are necessary to achieve the result. The panel should simply be parented to ChatFrame1, with two points set anchoring it to the frame's opposing corners (eg. TOPLEFT and BOTTOMRIGHT) so that its size automatically changes along with the frame.

  • Avatar of Hurtlock Hurtlock Sep 10, 2011 at 11:42 UTC - 0 likes

    I now have the Onclick working to show my bars but when im in combat i cant hide or show the bars any script needed for that to work?

  • Avatar of zero_fenix zero_fenix Aug 11, 2011 at 03:17 UTC - 0 likes

    Referencing a remote panel by name.

    local myMapPanel = kgPanels:FetchFrame("mapPanel") myMapPanel:Hide()

  • Avatar of WGSXFrank WGSXFrank Feb 01, 2011 at 15:41 UTC - 0 likes

    Is there any way to make a single graphic continuously spin around in a circle (like a wheel) at all times? I want to create a spinning spiral in my UI... but I suck at scripting.

  • Avatar of FaelynneMarie FaelynneMarie Nov 14, 2010 at 16:37 UTC - 0 likes

    How would I make a panel show/hide based on whether I have active cooldowns? (To use with SexyCooldown) Thanks!

  • Avatar of Eilensar Eilensar Nov 08, 2010 at 10:27 UTC - 0 likes

    @ Magieus

    try this:

    OnLoad

    self:RegisterEvent("PLAYER_ENTERING_WORLD");
    self:RegisterEvent("PLAYER_MONEY");
    

    OnEvent

    local copper = GetMoney()
    self.text:SetText(("%dg %ds %dc"):format(copper / 100 / 100, (copper / 100) % 100, copper % 100));
    

    This will display something like 342g 32s 54c, but only AFTER you reload UI or make/lose money for the first time to update.