Files
moon-well-ui/data/addon/ForeverUI/Socketing.lua
T
Adrestie b1da47c3eb PNJ etapes 3-4 : maitre, vol, etable, sertissage, dialogues, metiers
Etape 3
- Maitre (Trainer.lua, nouveau) : liste de camelot (categories
  professions-recipe-header, lignes TrainerTextures), filtre, rang de
  metier lu dans les competences.
- Maitre de vol (Taxi.lua, nouveau) : TaxiFrame de camelot 590 x 608,
  cadre bronze, images de vol 1463 / 1464 (positions reportees du carre
  3.3.5), boutons et traits de camelot ; zones BC, Outreterre et Norfendre
  sur l'image de 3.3.5.
- Etable (Stable.lua, nouveau) : scene de camelot, fond selon la
  specialisation, rangee de 5 centree.
- Sertissage (Socketing.lua, nouveau) : decor et chasses de camelot.
- Boites de dialogue (Dialogues.lua, nouveau) : StaticPopup1-4 aux
  contours de camelot (fond sombre, bordure en losanges, croix).
- Gabarits : Gb.CadreSimple (repris de la banque de guilde), Gb.MenuFiltre.

Etape 4 (metiers, disposition de camelot)
- Fabrication (TradeSkill.lua, nouveau) : 673 x 594, liste en arbre,
  filtre, recherche, rang, fiche (carte du metier, resultat, reactifs),
  boutons ; noms mesures sur un texte a part (une ligne reutilisee coupait
  le nom suivant) ; eclat du rang rogne a la largeur du masque.
- Micro-bouton Professions (BottomBar.lua) apres la feuille de personnage.
- Livre des metiers (ProfessionsBook.lua, nouveau) : cartes de camelot,
  rangs, sorts securises, oubli ; plus de deux metiers principaux (zone a
  defilement, colonnes reduites) ; portrait cuit rond ; onglets lateraux
  (ensemble + metiers a fabrication, retrecis s'ils sont trop nombreux) ;
  fenetre deplacable (place commune livre / fabrication).
- DropDown : liste du filtre des metiers elargie a ses entrees.
- Art : feuilles et elements des metiers, icones d'onglets cuites
  (cuire_masque.py), portrait rond (cuire_portrait.py, nouveau).
- Banc : essais des etapes 3 et 4 ; micro-menu a neuf boutons.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 00:02:35 +02:00

354 lines
17 KiB
Lua

-- ForeverUI : la fenetre de sertissage (ItemSocketingFrame, Blizzard_Item-
-- SocketingUI charge a la demande), a la DA de camelot (chantier des PNJ,
-- etape 3, demande de l'utilisateur du 2026-09-28).
--
-- RELEVE -- CAMELOT (blizzard_itemsocketingui.xml / .lua) :
-- cadre ButtonFrameTemplate 338 x 424 (PortraitFrameBaseTemplate),
-- portrait = l'icone de l'objet ; titre ITEM_SOCKETING,
-- GameFontNormal TOP (15, -5) ; encart InsetFrameTemplate
-- (4, -60 / -6, 4 : ButtonFrameTemplate_HideButtonBar) ;
-- croix (-2, 1)
-- parchemin (ARTWORK) UI-ItemSocketingFrame-_tile : haut 42 de (2,
-- -21) a (-4, -21), v .375-.703125 ; bas 22 de (2, 3) a
-- (-4, 3), v .1875-.359375 ; UI-ItemSocketParchementFrame-
-- Left : gauche 9 de (2, -62) a (2, 25), droite 5 de (-4,
-- -62) a (-4, 25), u 0-.75 ;
-- plaques UI-ItemSocketingFrame 158 x 51 : BOTTOMLEFT (11, 26) v
-- .0039-.2031, BOTTOMRIGHT (-11, 26) v .2109-.4102, u
-- .0039-.6211 ; cadre du bouton : bouts 4 x 21 a (-167, 4)
-- du BOTTOMRIGHT et (-5, 4), milieu en _tile v .0078-.1719
-- or UI-Goldborder, coins 66 x 55 : BR (-10, 79), BL (11, 79),
-- TR (-10, -64), TL (11, -64) ; bords UI-Goldborder-!tile 9
-- (u .0078-.0781) et -_tile 9 (v .0156-.1563) entre eux
-- panneau (BORDER) couleur (.078, .121, .215, .4) de (20, -74) a
-- (-20, 80), et UI-ItemSocketingFrame (u .0039-.5039, v
-- .418-.918) par-dessus ; ombre UI-Goldborder, coins 32 (u
-- .1289-.2539, v .0078-.2578, en miroir), bords -_tile (v
-- .1875-.6875) et -!tile (u .34375-.59375) de 32 ; six
-- clous NubTemplate 11 x 12 (u .6289-.6719, v .0039-.0508)
-- a BL (6, 20), BR (-5, 20), BL (6, 72), BR (-5, 72), TL
-- (6, -57), TR (-5, -57)
-- description ItemSocketingScrollFrame 293 x 258 a (22, -74), enfant
-- 259 x 254, largeur minimale 240 ; barre MinimalScrollBar
-- (-14, -5 / -14, 1), cachee si rien ne defile
-- chasses Socket1 a BOTTOM (-75 | -35 | 0, 33) selon 3 | 2 | 1
-- chasses, les suivantes (40, 0) ; filigrane droit 70 x 55
-- (u .28515625-.565) ; fond socket-<kit>-background,
-- crochets socket-<kit>-closed / -open a la taille de leur
-- atlas, centres ; eclat CENTER (1, 0) ; kits yellow, red,
-- blue, meta, prismatic
-- Appliquer APPLY, 162 x 22, BOTTOMRIGHT (-5, 4)
--
-- RELEVE -- 3.3.5 (Blizzard_ItemSocketingUI.xml / .lua) : 354 x 467, une
-- seule image de 512 pour toute la fenetre (sans nom), titre sans nom TOP
-- (15, -18), portrait ItemSocketingFramePortrait ; defilement 269 x 255 a
-- (32, -89), porte a 269 + 28 et la largeur minimale a 240 + 28 sans barre
-- (ItemSocketingFrame_Update, ItemSocketingSocketButton_OnScrollRange-
-- Changed) ; chasses a BOTTOM (x, 62) ; types Yellow, Red, Blue, Meta et
-- Socket (le prismatique) ; bouton ItemSocketingSocketButton (SOCKET_GEMS)
-- BOTTOMRIGHT (-10, 33).
--
-- CE QUI DIFFERE, ET POURQUOI.
-- * Les couches : 3.3.5 n'a pas de sous-calques. Roche (BACKGROUND),
-- marbre (BORDER), liseré et couleur du panneau (ARTWORK), son image
-- (OVERLAY) sont des regions de la fenetre ; ombre, clous, parchemin, or
-- et plaques, dans cet ordre, sont dans un cadre fils (au-dessus), et la
-- description, les chasses et le bouton un niveau plus haut encore.
-- * Les pieces « tile » de camelot se repetent ; 3.3.5 ne repete pas une
-- partie d'image (SetTexCoord) : elles s'etirent.
-- * La barre suit la regle de l'atelier (28/09) : sans elle, la
-- description va jusqu'a laisser a droite du panneau la marge qu'elle a
-- a gauche (enfant 294, largeur minimale 240 + 35) ; camelot garde 259.
-- * Le portrait suit la regle VALIDEE (48 a (1, 1,5)), l'icone arrondie.
-- * Les confirmations et le texte de couleur (daltonisme) restent ceux du
-- client ; les evenements de camelot absents de 3.3.5 (SOCKET_INFO_ACCEPT,
-- BIND_CONFIRM...) n'ont pas d'equivalent.
local ForeverUI = ForeverUI or {}
_G.ForeverUI = ForeverUI
local Gb = ForeverUI.Gabarits
local SO = {}
ForeverUI.Sertissage = SO
local SEP = string.char(92)
local DOSSIER = "Interface" .. SEP .. "ForeverUI" .. SEP .. "itemsocketingframe" .. SEP
local COMMUN = "Interface" .. SEP .. "ForeverUI" .. SEP .. "common" .. SEP
local ART = {
feuille = DOSSIER .. "ui-itemsocketingframe",
tuile = DOSSIER .. "ui-itemsocketingframe-_tile",
parchemin = DOSSIER .. "ui-itemsocketparchementframe-left",
or_ = COMMUN .. "ui-goldborder",
orV = COMMUN .. "ui-goldborder-!tile",
orH = COMMUN .. "ui-goldborder-_tile",
marbre = "interface" .. SEP .. "ForeverUI" .. SEP .. "framegeneral" .. SEP .. "ui-background-marble",
}
local N = {
fenetre = { 338, 424 },
portrait = { cote = 48, x = 1, y = 1.5 },
titre = { 15, -5 },
encart = { 4, -60, -6, 4 },
panneau = { 20, -74, -20, 80 },
couleur = { 0.078125, 0.12109375, 0.21484375, 0.4 },
defile = { 22, -74, 293, 258 },
enfant = 259, minimum = 240,
-- sans barre : le panneau va de 20 a 318, le defilement part de 22 ; il
-- va a 316, la meme marge (2) qu'a gauche
enfantSans = 294,
barre = { -14, -5, 1 },
chasse = { y = 33, x = { [1] = 0, [2] = -35, [3] = -75 } },
eclat = { 1, 0 },
appliquer = { 162, 22, -5, 4 },
niveauHabit = 1, niveauContenu = 2, niveauCroix = 22,
}
local KITS = { Yellow = "yellow", Red = "red", Blue = "blue", Meta = "meta", Socket = "prismatic" }
local function poser(r, ...)
r:ClearAllPoints()
r:SetPoint(...)
end
-- une texture de fichier a coordonnees : { fichier, u1, u2, v1, v2 }
local function morceau(hote, couche, fichier, u1, u2, v1, v2, l, h)
local t = hote:CreateTexture(nil, couche)
t:SetTexture(fichier)
t:SetTexCoord(u1, u2, v1, v2)
if l then t:SetWidth(l) end
if h then t:SetHeight(h) end
return t
end
-- ------------------------------------------------------------ l'habillage
local function habillage(f)
local d = CreateFrame("Frame", nil, f)
d:SetAllPoints(f)
d:SetFrameLevel(f:GetFrameLevel() + N.niveauHabit)
d:EnableMouse(false)
local p = {}
-- l'ombre du panneau (BACKGROUND du cadre fils : sous tout le reste)
local c = {
hg = morceau(d, "BACKGROUND", ART.or_, 0.12890625, 0.25390625, 0.0078125, 0.2578125, 32, 32),
hd = morceau(d, "BACKGROUND", ART.or_, 0.25390625, 0.12890625, 0.0078125, 0.2578125, 32, 32),
bg = morceau(d, "BACKGROUND", ART.or_, 0.12890625, 0.25390625, 0.2578125, 0.0078125, 32, 32),
bd = morceau(d, "BACKGROUND", ART.or_, 0.25390625, 0.12890625, 0.2578125, 0.0078125, 32, 32),
}
c.hg:SetPoint("TOPLEFT", f, "TOPLEFT", 20, -74)
c.hd:SetPoint("TOPRIGHT", f, "TOPRIGHT", -20, -74)
c.bg:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 20, 88)
c.bd:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -20, 88)
local function entre(t, a1, c1, r1, a2, c2, r2)
t:SetPoint(a1, c1, r1)
t:SetPoint(a2, c2, r2)
return t
end
p.ombre = c
p.ombreHaut = entre(morceau(d, "BACKGROUND", ART.orH, 0, 1, 0.1875, 0.6875, nil, 32), "TOPLEFT", c.hg, "TOPRIGHT", "TOPRIGHT", c.hd, "TOPLEFT")
p.ombreBas = entre(morceau(d, "BACKGROUND", ART.orH, 0, 1, 0.6875, 0.1875, nil, 32), "BOTTOMLEFT", c.bg, "BOTTOMRIGHT", "BOTTOMRIGHT", c.bd, "BOTTOMLEFT")
p.ombreGauche = entre(morceau(d, "BACKGROUND", ART.orV, 0.34375, 0.59375, 0, 1, 32, nil), "TOPLEFT", c.hg, "BOTTOMLEFT", "BOTTOMLEFT", c.bg, "TOPLEFT")
p.ombreDroite = entre(morceau(d, "BACKGROUND", ART.orV, 0.59375, 0.34375, 0, 1, 32, nil), "TOPRIGHT", c.hd, "BOTTOMRIGHT", "BOTTOMRIGHT", c.bd, "TOPRIGHT")
-- les clous (NubTemplate)
p.clous = {}
for _, v in ipairs({ { "BOTTOMLEFT", 6, 20 }, { "BOTTOMRIGHT", -5, 20 }, { "BOTTOMLEFT", 6, 72 },
{ "BOTTOMRIGHT", -5, 72 }, { "TOPLEFT", 6, -57 }, { "TOPRIGHT", -5, -57 } }) do
local t = morceau(d, "BORDER", ART.feuille, 0.62890625, 0.671875, 0.00390625, 0.05078125, 11, 12)
t:SetPoint(v[1], f, v[1], v[2], v[3])
p.clous[#p.clous + 1] = t
end
-- le parchemin
local haut = morceau(d, "ARTWORK", ART.tuile, 0, 1, 0.375, 0.703125, nil, 42)
haut:SetPoint("TOPLEFT", f, "TOPLEFT", 2, -21)
haut:SetPoint("TOPRIGHT", f, "TOPRIGHT", -4, -21)
local bas = morceau(d, "ARTWORK", ART.tuile, 0, 1, 0.1875, 0.359375, nil, 22)
bas:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 2, 3)
bas:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -4, 3)
local gauche = morceau(d, "ARTWORK", ART.parchemin, 0, 0.75, 0, 1, 9, nil)
gauche:SetPoint("TOPLEFT", f, "TOPLEFT", 2, -62)
gauche:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 2, 25)
local droite = morceau(d, "ARTWORK", ART.parchemin, 0, 0.75, 0, 1, 5, nil)
droite:SetPoint("TOPRIGHT", f, "TOPRIGHT", -4, -62)
droite:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -4, 25)
p.parchemin = { haut = haut, bas = bas, gauche = gauche, droite = droite }
-- les plaques des chasses et le cadre du bouton
local pg = morceau(d, "ARTWORK", ART.feuille, 0.00390625, 0.62109375, 0.00390625, 0.203125, 158, 51)
pg:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 11, 26)
local pd = morceau(d, "ARTWORK", ART.feuille, 0.00390625, 0.62109375, 0.2109375, 0.41015625, 158, 51)
pd:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -11, 26)
local bg = morceau(d, "ARTWORK", ART.feuille, 0.62890625, 0.64453125, 0.05859375, 0.140625, 4, 21)
bg:SetPoint("BOTTOMLEFT", f, "BOTTOMRIGHT", -167, 4)
local bd = morceau(d, "ARTWORK", ART.feuille, 0.65234375, 0.66796875, 0.05859375, 0.140625, 4, 21)
bd:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -5, 4)
local bm = morceau(d, "ARTWORK", ART.tuile, 0, 1, 0.0078125, 0.171875, nil, 21)
bm:SetPoint("TOPLEFT", bg, "TOPRIGHT")
bm:SetPoint("TOPRIGHT", bd, "TOPLEFT")
p.plaques = { pg, pd }
p.cadreBouton = { bg, bm, bd }
-- la bordure doree
local o = {
bd = morceau(d, "ARTWORK", ART.or_, 0.26171875, 0.51953125, 0.0078125, 0.4375, 66, 55),
bg = morceau(d, "ARTWORK", ART.or_, 0.26171875, 0.51953125, 0.453125, 0.8828125, 66, 55),
hd = morceau(d, "ARTWORK", ART.or_, 0.52734375, 0.78515625, 0.0078125, 0.4375, 66, 55),
hg = morceau(d, "ARTWORK", ART.or_, 0.52734375, 0.78515625, 0.453125, 0.8828125, 66, 55),
}
o.bd:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", -10, 79)
o.bg:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 11, 79)
o.hd:SetPoint("TOPRIGHT", f, "TOPRIGHT", -10, -64)
o.hg:SetPoint("TOPLEFT", f, "TOPLEFT", 11, -64)
p.or_ = o
p.orGauche = entre(morceau(d, "ARTWORK", ART.orV, 0.0078125, 0.078125, 0, 1, 9, nil), "TOPLEFT", o.hg, "BOTTOMLEFT", "BOTTOMLEFT", o.bg, "TOPLEFT")
p.orDroite = entre(morceau(d, "ARTWORK", ART.orV, 0.0078125, 0.078125, 0, 1, 9, nil), "TOPRIGHT", o.hd, "BOTTOMRIGHT", "BOTTOMRIGHT", o.bd, "TOPRIGHT")
p.orHaut = entre(morceau(d, "ARTWORK", ART.orH, 0, 1, 0.015625, 0.15625, nil, 9), "TOPLEFT", o.hg, "TOPRIGHT", "TOPRIGHT", o.hd, "TOPLEFT")
p.orBas = entre(morceau(d, "ARTWORK", ART.orH, 0, 1, 0.015625, 0.15625, nil, 9), "BOTTOMLEFT", o.bg, "BOTTOMRIGHT", "BOTTOMRIGHT", o.bd, "BOTTOMLEFT")
p.cadre = d
return p
end
-- ------------------------------------------------------------ apres le client
-- la description selon la barre (regle de l'atelier) : le meme test que le
-- client (GetVerticalScrollRange), apres lui ; la fenetre a defilement et
-- son enfant a nos largeurs
function SO.Largeurs()
local fx = ItemSocketingScrollFrame
if not fx then return end
local avec = (fx:GetVerticalScrollRange() or 0) ~= 0
fx:SetWidth(avec and N.defile[3] or N.enfantSans)
ItemSocketingScrollChild:SetWidth(avec and N.enfant or N.enfantSans)
end
-- LA LARGEUR MINIMALE SE TRADUIT AU MOMENT OU LE CLIENT LA POSE : il demande
-- 240 + 28 sans barre, puis remplit la description. La reposer APRES lui et
-- remplir a nouveau changerait la plage, et le client, rappele, la
-- reposerait a son tour : chacun renverrait la balle a l'autre. Une
-- post-accroche sur la methode de la description remplace donc sa valeur
-- sans barre par la notre (240 + 35), avant qu'il remplisse.
local function minimumSansBarre(self, largeur, force)
if SO.dansMinimum then return end
if largeur == (ITEM_SOCKETING_DESCRIPTION_MIN_WIDTH or N.minimum) + 28 then
SO.dansMinimum = true
self:SetMinimumWidth(N.minimum + N.enfantSans - N.enfant, force)
SO.dansMinimum = false
end
end
-- APRES ItemSocketingFrame_Update : portrait, chasses a leur place de
-- camelot, fonds et crochets de camelot
function SO.Apres()
local h = ItemSocketingFrame and ItemSocketingFrame.foreverHabit
if not h then return end
local _, icone = GetSocketItemInfo()
if icone then SetPortraitToTexture(h.portrait, icone) end
local n = GetNumSockets() or 0
local C = N.chasse
poser(ItemSocketingSocket1, "BOTTOM", ItemSocketingFrame, "BOTTOM", C.x[n] or C.x[1], C.y)
for i = 1, math.min(n, MAX_NUM_SOCKETS or 3) do
local nom = "ItemSocketingSocket" .. i
local kit = KITS[GetSocketTypes(i) or ""]
if kit then
ForeverUI.SetAtlas(_G[nom .. "Background"], "socket-" .. kit .. "-background")
ForeverUI.SetAtlas(_G[nom .. "BracketFrameClosedBracket"], "socket-" .. kit .. "-closed")
ForeverUI.SetAtlas(_G[nom .. "BracketFrameOpenBracket"], "socket-" .. kit .. "-open")
end
end
SO.Largeurs()
end
function SO.Habiller()
local f = ItemSocketingFrame
if not f or f.foreverHabit then return end
-- l'image de 512 et le titre sans nom de 3.3.5, le portrait du client
for _, r in ipairs({ f:GetRegions() }) do
if r:GetObjectType() == "Texture" then
local t = r:GetTexture()
if type(t) == "string" and string.find(string.lower(t), "ui-itemsocketingframe", 1, true) then r:SetAlpha(0) end
elseif r:GetObjectType() == "FontString" and r:GetText() == ITEM_SOCKETING then
r:SetAlpha(0)
end
end
ItemSocketingFramePortrait:SetAlpha(0)
f:SetWidth(N.fenetre[1])
f:SetHeight(N.fenetre[2])
local habit = Gb.FenetrePortrait(f, {
portraitCote = N.portrait.cote, portraitX = N.portrait.x, portraitY = N.portrait.y,
titre = ITEM_SOCKETING,
})
f.foreverHabit = habit
habit.titre:ClearAllPoints()
habit.titre:SetPoint("TOP", f, "TOP", N.titre[1], N.titre[2])
-- l'encart : marbre (BORDER, au-dessus de la roche), liseré en ARTWORK
local E = N.encart
local rect = CreateFrame("Frame", nil, f)
rect:EnableMouse(false)
rect:SetPoint("TOPLEFT", f, "TOPLEFT", E[1], E[2])
rect:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", E[3], E[4])
local marbre = f:CreateTexture(nil, "BORDER")
marbre:SetTexture(ART.marbre, true)
if marbre.SetHorizTile then marbre:SetHorizTile(true) marbre:SetVertTile(true) end
marbre:SetAllPoints(rect)
habit.encart = { rect = rect, marbre = marbre, lisere = Gb.NeufTranches(f, "InsetFrameTemplate", rect, "ARTWORK") }
-- le panneau de la description : sa couleur (ARTWORK), son image (OVERLAY)
local P = N.panneau
local couleur = f:CreateTexture(nil, "ARTWORK")
couleur:SetTexture(N.couleur[1], N.couleur[2], N.couleur[3], N.couleur[4])
couleur:SetPoint("TOPLEFT", f, "TOPLEFT", P[1], P[2])
couleur:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", P[3], P[4])
local lumiere = morceau(f, "OVERLAY", ART.feuille, 0.00390625, 0.50390625, 0.41796875, 0.91796875)
lumiere:SetPoint("TOPLEFT", f, "TOPLEFT", P[1], P[2])
lumiere:SetPoint("BOTTOMRIGHT", f, "BOTTOMRIGHT", P[3], P[4])
habit.panneau = { couleur = couleur, lumiere = lumiere }
habit.decor = habillage(f)
-- le contenu au-dessus du decor
local niveau = f:GetFrameLevel() + N.niveauContenu
local D = N.defile
local fx = ItemSocketingScrollFrame
fx:SetFrameLevel(niveau)
poser(fx, "TOPLEFT", f, "TOPLEFT", D[1], D[2])
fx:SetWidth(D[3])
fx:SetHeight(D[4])
for _, s in ipairs({ "Top", "Bottom" }) do
local t = _G["ItemSocketingScrollFrame" .. s]
if t then t:SetAlpha(0) end
end
Gb.BarreA(ItemSocketingScrollFrameScrollBar, fx, N.barre[1], N.barre[2], N.barre[3])
-- les chasses : filigrane droit de camelot, crochet ouvert centre, eclat
for i = 1, MAX_NUM_SOCKETS or 3 do
local nom = "ItemSocketingSocket" .. i
local s = _G[nom]
if s then
s:SetFrameLevel(niveau)
local droite = _G[nom .. "Right"]
droite:SetWidth(70)
droite:SetHeight(55)
droite:SetTexCoord(0.28515625, 0.565, 0, 0.21484375)
poser(_G[nom .. "BracketFrameOpenBracket"], "CENTER", _G[nom .. "BracketFrame"], "CENTER", 0, 0)
poser(_G[nom .. "Shine"], "CENTER", s, "CENTER", N.eclat[1], N.eclat[2])
end
end
local A = N.appliquer
local b = ItemSocketingSocketButton
b:SetFrameLevel(niveau)
b:SetWidth(A[1])
b:SetHeight(A[2])
poser(b, "BOTTOMRIGHT", f, "BOTTOMRIGHT", A[3], A[4])
b:SetText(APPLY)
Gb.Croix(ItemSocketingCloseButton, f)
ItemSocketingCloseButton:SetFrameLevel(f:GetFrameLevel() + N.niveauCroix)
hooksecurefunc(ItemSocketingDescription, "SetMinimumWidth", minimumSansBarre)
hooksecurefunc("ItemSocketingFrame_Update", SO.Apres)
hooksecurefunc("ItemSocketingSocketButton_OnScrollRangeChanged", SO.Largeurs)
end
SO.Habiller()
local veille = CreateFrame("Frame")
veille:RegisterEvent("ADDON_LOADED")
veille:SetScript("OnEvent", function(_, _, nom)
if nom == "Blizzard_ItemSocketingUI" then
SO.Habiller()
end
end)