WoWInterface

WoWInterface (https://www.wowinterface.com/forums/index.php)
-   Lua/XML Help (https://www.wowinterface.com/forums/forumdisplay.php?f=16)
-   -   Problem using a custom backdrop with the new backdrop system changes (https://www.wowinterface.com/forums/showthread.php?t=58762)

fullmoon_sulfuras 05-24-21 08:42 PM

Problem using a custom backdrop with the new backdrop system changes
 
Hi there! I'm having a hard time understanding how to translate the old <Backdrop> tags to the new system.

I'm creating the following frame in XML:

Code:

<Frame name="TestFrame" parent="UIParent" inherits="BackdropTemplate">
    <KeyValues>
        <KeyValue key="backdropInfo" value="BACKDROP_TOOLTIP_16_16_5555" type="global"/>
        <KeyValue key="backdropBorderColor" value="LEGENDARY_ORANGE_COLOR" type="global"/>
        <KeyValue key="backdropBorderColorAlpha" value="0.25" type="number"/>
    </KeyValues>
    <Size x="300" y="300"/>
    <Anchors>
        <Anchor point="CENTER"/>
    </Anchors>
    <Scripts>
        <OnLoad inherit="prepend">
            print("Loaded!");
        </OnLoad>
    </Scripts>
</Frame>

This works perfectly. Now I want to customize my backdrop with the following info:

Lua Code:
  1. BACKDROP_TOOLTIP_MYBACKDROP = {
  2.     bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
  3.     edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
  4.     tile = true,
  5.     tileEdge = true,
  6.     tileSize = 16,
  7.     edgeSize = 16,
  8.     insets = { left = 5, right = 5, top = 5, bottom = 5 },
  9. };

I've added that to a .lua file that's listed in the ToC file, and changed my frame to:

Code:

<Frame name="TestFrame" parent="UIParent" inherits="BackdropTemplate">
    <KeyValues>
        <KeyValue key="backdropInfo" value="BACKDROP_TOOLTIP_MYBACKDROP" type="global"/>
        <KeyValue key="backdropBorderColor" value="LEGENDARY_ORANGE_COLOR" type="global"/>
        <KeyValue key="backdropBorderColorAlpha" value="0.25" type="number"/>
    </KeyValues>
    <Size x="300" y="300"/>
    <Anchors>
        <Anchor point="CENTER"/>
    </Anchors>
    <Scripts>
        <OnLoad inherit="prepend">
            print("Loaded!");
        </OnLoad>
    </Scripts>
</Frame>

The BACKDROP_TOOLTIP_MYBACKDROP is exactly the same as BACKDROP_TOOLTIP_16_16_5555. But now I don't get a frame anymore!

Do I need to place BACKDROP_TOOLTIP_MYBACKDROP somewhere special?

I've also tried to use:

Code:

<Frame name="TestFrame" parent="UIParent">
        <KeyValues>
                <KeyValue key="backdropInfo" value="BACKDROP_TOOLTIP_16_16_5555" type="global"/>
                <KeyValue key="backdropBorderColor" value="LEGENDARY_ORANGE_COLOR" type="global"/>
                <KeyValue key="backdropBorderColorAlpha" value="0.25" type="number"/>
        </KeyValues>
        <Size x="300" y="300"/>
        <Anchors>
                <Anchor point="CENTER"/>
        </Anchors>
        <Scripts>
                <OnLoad inherit="prepend">
                        if BackdropTemplateMixin then -- if this is NOT a Classic type frame, add the backdrop mixin
                                Mixin(self, BackdropTemplateMixin)
                        end
                        self:Setbackdrop( {
                                bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
                                edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
                                tile = true,
                                tileEdge = true,
                                tileSize = 16,
                                edgeSize = 16,
                                insets = { left = 5, right = 5, top = 5, bottom = 5 }
                        })
                        print("Loaded!");
                </OnLoad>
        </Scripts>
</Frame>

But I get an error:

Code:

Message: [string "TestFrame:OnLoad"]:4: attempt to call method 'Setbackdrop' (a nil value)
Time: Mon May 24 22:39:22 2021
Count: 1
Stack: [string "TestFrame:OnLoad"]:4: attempt to call method 'Setbackdrop' (a nil value)
[string "*:OnLoad"]:4: in function <[string "*:OnLoad"]:1>

Thanks!

Fizzlemizz 05-24-21 09:32 PM

First decision. Do you want to make seperate xml frames for classic and non-classic

If yes then:
Classic: (same as always)
Lua Code:
  1. <Frame name="TestFrame" parent="UIParent">
  2.     <Size x="300" y="300"/>
  3.     <Backdrop bgFile="Interface\Tooltips\UI-Tooltip-Background" edgeFile="Interface\Tooltips\UI-Tooltip-Border" tile="true">
  4.         <BackgroundInsets>
  5.             <AbsInset left="5" right="5" top="5" bottom="5"/>
  6.         </BackgroundInsets>
  7.         <TileSize>
  8.             <AbsValue val="16"/>
  9.         </TileSize>
  10.         <EdgeSize>
  11.             <AbsValue val="16"/>
  12.         </EdgeSize>
  13.     </Backdrop>    
  14.     <Anchors>
  15.         <Anchor point="CENTER"/>
  16.     </Anchors>
  17.     <Scripts>
  18.         <OnLoad inherit="prepend">
  19.             self:SetBackdropColor(0.5, 0.3, 0.3)
  20.             self:SetBackdropBorderColor(0.5, 0.3, 0.3, 0.25)
  21.             print("Loaded!");
  22.         </OnLoad>
  23.     </Scripts>
  24. </Frame>
Others, Mostly the same xml frame but inherits the BackdropTemplate and all backdrop information is set in lua (OnLoad)
Lua Code:
  1. <Frame name="TestFrame" parent="UIParent" inherits="BackdropTemplate">
  2.     <Size x="300" y="300"/>
  3.     <Anchors>
  4.         <Anchor point="CENTER"/>
  5.     </Anchors>
  6.     <Scripts>
  7.         <OnLoad inherit="prepend">
  8.             self:SetBackdrop( {
  9.                 bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
  10.                 edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
  11.                 tile = true,
  12.                 tileEdge = true,
  13.                 tileSize = 16,
  14.                 edgeSize = 16,
  15.                 insets = { left = 5, right = 5, top = 5, bottom = 5 }
  16.             })
  17.             self:SetBackdropColor(0.5, 0.3, 0.3)
  18.             self:SetBackdropBorderColor(0.5, 0.3, 0.3, 0.25)
  19.             print("Loaded!");
  20.         </OnLoad>
  21.     </Scripts>
  22. </Frame>

Or, do you want one frame for both Classic and the rest: Mostly the same xml frame but detecting if backdrop mixin (template) is needed and all backdrop information is set in lua (OnLoad)
Lua Code:
  1. <Frame name="TestFrame" parent="UIParent">
  2.     <Size x="300" y="300"/>
  3.     <Anchors>
  4.         <Anchor point="CENTER"/>
  5.     </Anchors>
  6.     <Scripts>
  7.         <OnLoad inherit="prepend">
  8.             if BackdropTemplateMixin then -- if this is NOT a Classic type frame, add the backdrop mixin
  9.                 Mixin(self, BackdropTemplateMixin)
  10.             end
  11.             self:SetBackdrop( {
  12.                 bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
  13.                 edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
  14.                 tile = true,
  15.                 tileEdge = true,
  16.                 tileSize = 16,
  17.                 edgeSize = 16,
  18.                 insets = { left = 5, right = 5, top = 5, bottom = 5 }
  19.             })
  20.             self:SetBackdropColor(0.5, 0.3, 0.3)
  21.             self:SetBackdropBorderColor(0.5, 0.3, 0.3, 0.25)
  22.             print("Loaded!");
  23.         </OnLoad>
  24.     </Scripts>
  25. </Frame>
Done this way to show separation of xml and lua. With the Classic and non-Classic you could use <KeyValues></KeyValues> for both but not with the one frame for multiple versions layout.

Definitions like BACKDROP_TOOLTIP_16_16_5555 and LEGENDARY_ORANGE_COLOR don't exist in Classic and may not BCC either so probably easiest not to use them and just define backdrop, colours, alpha manually in both.


All times are GMT -6. The time now is 05:59 PM.

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