Thread Tools Display Modes
Prev Previous Post   Next Post Next
Old 07-19-12, 04:59 AM   #1
ballagarba
A Fallenroot Satyr
 
ballagarba's Avatar
Join Date: Mar 2009
Posts: 22
StanceButton1 taint in nMainbar

So, Blizzard was kind enough introduce StanceButton1:SetPoint(...) inside StanceBar.lua:StanceBar_Update()

Code:
function StanceBar_Update ()
    local numForms = GetNumShapeshiftForms();
    if ( numForms > 0 and not IsPossessBarVisible()) then
        --Setup the Stance bar to display the appropriate number of slots
        if ( numForms == 1 ) then
                        StanceBarMiddle:Hide();
                        StanceBarRight:SetPoint("LEFT", "StanceBarLeft", "LEFT", 12, 0);
                        StanceButton1:SetPoint("BOTTOMLEFT", "StanceBarFrame", "BOTTOMLEFT", 12, 3);
        elseif ( numForms == 2 ) then
                        StanceBarMiddle:Hide();
                        StanceBarRight:SetPoint("LEFT", "StanceBarLeft", "RIGHT", 0, 0);
        else
            StanceBarMiddle:Show();
            StanceBarMiddle:SetPoint("LEFT", "StanceBarLeft", "RIGHT", 0, 0);
            StanceBarMiddle:SetWidth(37 * (numForms-2));
            StanceBarMiddle:SetTexCoord(0, numForms-2, 0, 1);
            StanceBarRight:SetPoint("LEFT", "StanceBarMiddle", "RIGHT", 0, 0);
        end

        StanceBarFrame:Show();
        StanceBar_UpdateState();
    else
        StanceBarFrame:Hide();
    end
    UIParent_ManageFramePositions();
end
The problem I'm having is that I set StanceButton1:SetMovable(true) and StanceButton1:SetUserPlaced(true). However, StanceBar_Update() gets executed after whatever code that does user placement rendering it useless.

So I tried a couple of hacks to prevent StanceBar_Update() from moving StanceButton1:

1. I just override Blizzard's function, however this obviously caused taint issues.

lua Code:
  1. function StanceBar_Update()
  2.     local numForms = GetNumShapeshiftForms()
  3.     if (numForms > 0 and not IsPossessBarVisible()) then
  4.         StanceBarFrame:Show()
  5.         securecall('StanceBar_UpdateState')
  6.     else
  7.         StanceBarFrame:Hide()
  8.     end
  9.     securecall('UIParent_ManageFramePositions')
  10. end

2. I figured I could force the statement numForms == 1 to always be false, because that's the only time they re-position. I figured this was a golden solution, however, it also caused taint

lua Code:
  1. StanceBarFrame.numForms = GetNumShapeshiftForms()

3. Now I tried to save the position of StanceButton1 before StanceBar_Update() moves it, and do a hooksecurefunc('StanceBar_Update', ...) and move it after that. Also taint, apparently, you can't do StanceButton1:ClearAllPoints() from inside that hook (WTF?):

lua Code:
  1. local point, relativeTo, relativePoint, xOffset, yOffset = StanceButton1:GetPoint()
  2. hooksecurefunc('StanceBar_Update', function()
  3.     if (GetNumShapeshiftForms() == 1) then
  4.         StanceButton1:ClearAllPoints()
  5.         StanceButton1:SetPoint(point, relativeTo, relativePoint, xOffset, yOffset)
  6.     end
  7. end

4. Next, I came up with the idea of just calling StanceBar_Update() immediately in my code to have it execute before the user position got set. This oddly enough also caused taint

lua Code:
  1. securecall('StanceBar_Update')

5. This works, but is ugly as hell and some quirks appear from time to time:

lua Code:
  1. local point, relativeTo, relativePoint, xOffset, yOffset
  2.  
  3. local f = CreateFrame('Frame')
  4. f:RegisterEvent('VARIABLES_LOADED')
  5. f:RegisterEvent('PLAYER_ALIVE')
  6. f:SetScript('OnEvent', function(self, event, ...)
  7.     if (event == 'VARIABLES_LOADED') then
  8.         point, relativeTo, relativePoint, xOffset, yOffset = StanceButton1:GetPoint()
  9.         self:UnregisterEvent('VARIABLES_LOADED')
  10.     end
  11.  
  12.     if (event == 'PLAYER_ALIVE') then
  13.         if (point) then
  14.             StanceButton1:ClearAllPoints()
  15.             StanceButton1:SetPoint(point, relativeTo, relativePoint, xOffset, yOffset)
  16.         end
  17.         self:UnregisterEvent('PLAYER_ALIVE')
  18.     end
  19. end)

The taint causes a interface blocked action thingie when trying to do action bar switching when in combat, and blocked it from switching. Anyone have any thoughts? I find it weird that StanceButton1:ClearAllPoints() sometimes causes taint, and sometimes it doesn't.

Oh yeah, the addon is nMainbar and here's the MoP source:
https://github.com/renstrom/NeavUI/b.../stancebar.lua.
ballagarba is offline  
 

Go BackWoWInterface » WoD Beta » MoP archived threads » StanceButton1 taint in nMainbar

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off