WoWInterface

WoWInterface (https://www.wowinterface.com/forums/index.php)
-   AddOn Help/Support (https://www.wowinterface.com/forums/forumdisplay.php?f=3)
-   -   Looking for lua code example of how to get a button to highlight on push down (https://www.wowinterface.com/forums/showthread.php?t=58908)

Zimzarina 08-26-21 11:45 PM

Looking for lua code example of how to get a button to highlight on push down
 
For an addon I am working on I have created a icon button similar to other profession buttons like cooking and leatherworking. I am able to SetNormalTexture and SetHighlightTexture fine and it looks as expected in those cases. However, when I try to SetPushedTexture, "ADD" I don't get the nice appearance I expect I get basically a transparent button with a edge highlight. What I want is to find an example code of how to create a button that uses the same highlight and pushed button effects that regular ActionBars do. Thanks!

Example code below that shows what I am asking about.

local NewButtonEventFrame, NewButtonEvents, NewButtonFunctionName = CreateFrame("Frame"), {}

function NewButtonEvents:PLAYER_ENTERING_WORLD(isInitialLogin, isReloadingUi)
if not NewButton then
NewButton = CreateFrame("Button", "NewButton", UIParent)
NewButton:SetWidth(40)
NewButton:SetHeight(40)
NewButton:SetPoint("CENTER",0,0)
NewButton:SetNormalTexture("Interface\\Icons\\INV_Misc_ArmorKit_17")
NewButton:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square","ADD",0)
NewButton:SetPushedTexture("Interface\\Icons\\INV_Misc_ArmorKit_17")
NewButton:SetPushedTexture("Interface\\Buttons\\UI-Quickslot-Depress","ADD")
NewButton:SetScript("OnClick", function() NewButtonClick() end)
end
if NewButton then NewButton:Show() end
end

function NewButtonClick()
DEFAULT_CHAT_FRAME:AddMessage("Click")
end

NewButtonEventFrame:SetScript("OnEvent", function(self, event, ...)
NewButtonEvents[event](self, ...)
end)
for NewButtonEventName, NewButtonFunctionName in pairs(NewButtonEvents) do
NewButtonEventFrame:RegisterEvent(NewButtonEventName)
end

SDPhantom 08-28-21 05:58 AM

A few notes:

I wouldn't consider NewButton a unique enough name to occupy the global namespace. It's common practice to prefix the name of your addon to any global (including frame names) you create to prevent collisions with other addons or even the DefaultUI.

In most cases, you can create your frames in the main part of your code. You don't need to wait for any special event to do so.

If both offsets for UIObject:SetPoint() are zero, they can be omitted. (If either are non-zero, you must provide both.)

Button:SetPushedTexture() replaces the normal texture when the button is in that state. To have a persistent normal texture, you'll have to create another texture object to show it.

The push texture for that path doesn't need alpha blending. Alpha blending converts gradients of white/black depending on the mode to transparent. If a texture already contains transparency, this causes the image to do unintentional things.

You don't need to call UIObject:Show() after creating an object. It is already shown by default providing it has a valid anchor and size. (Size can also be defined by setting more than one anchor if desired.)

You should use print() instead of DEFAULT_CHAT_FRAME:AddMessage(). This lets other addons redirect through their own print handler without causing taint issues.



With these in mind, here's an example.
Lua Code:
  1. local ExampleButton=CreateFrame("Button",nil,UIParent);
  2. ExampleButton:SetPoint("CENTER");
  3. ExampleButton:SetSize(40,40);
  4. ExampleButton:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square","ADD");
  5. ExampleButton:SetPushedTexture("Interface\\Buttons\\UI-Quickslot-Depress");
  6.  
  7. local ExampleButtonIcon=ExampleButton:CreateTexture(nil,"BACKGROUND");
  8. ExampleButtonIcon:SetAllPoints(ExampleButton);
  9. ExampleButtonIcon:SetTexture("Interface\\Icons\\INV_Misc_ArmorKit_17");
  10.  
  11. ExampleButton:SetScript("OnClick",function(self,button)
  12.     print("Button Clicked");
  13. end);
PS: ActionButtons do some funky thing with setting a custom size for their normal texture. This texture is the empty box you see if you have them shown on your multi-bars. If you look close enough, you might see a double-border on occupied ones. This is a side effect of that implementation. In the example above, this was removed for the sake of simplicity.

Zimzarina 08-28-21 12:49 PM

Thanks for the great feedback along with all the ideas and suggestion for code improvement! This writeup was way more detailed and helpful then I expected to receive. I really appreciate all extra effort and guidance you went to. Thanks!


All times are GMT -6. The time now is 12:31 AM.

vBulletin © 2024, Jelsoft Enterprises Ltd
© 2004 - 2022 MMOUI