annotate Modules/PaperDoll.lua @ 93:caded2668701

Curseforge migration and source tree cleaning
author Nenue
date Sun, 01 Jan 2017 18:25:26 -0500
parents 74e714637d6a
children bb38bc0e787f
rev   line source
Nenue@62 1 -- Veneer
Nenue@62 2 -- PaperDoll.lua
Nenue@62 3 -- Created: 8/16/2016 8:18 AM
Nenue@62 4 -- %file-revision%
Nenue@80 5 -- Displays the item level and modifications of character sheet equipment, including artifact power
Nenue@93 6 local print = DEVIAN_WORKSPACE and function(...) print('PaperDoll', ...) end or nop
Nenue@62 7
Nenue@93 8 local slot_overlays = {}
Nenue@93 9 VeneerPaperDollMixin = {
Nenue@93 10 anchorFrame = 'CharacterFrame',
Nenue@93 11 anchorPoint = 'TOPLEFT',
Nenue@93 12 KnownRelics = {},
Nenue@93 13 }
Nenue@93 14
Nenue@93 15 local relic_slot_paths = {
Nenue@93 16 Arcane = {"Relic-Arcane-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.849609375, 0.919921875, 0.1181640625, 0.1884765625, false, false},
Nenue@93 17 Blood = {"Relic-Blood-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.921875, 0.9921875, 0.1181640625, 0.1884765625, false, false},
Nenue@93 18 Fel = {"Relic-Fel-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.59765625, 0.66796875, 0.572265625, 0.642578125, false, false},
Nenue@93 19 Fire = {"Relic-Fire-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.669921875, 0.740234375, 0.572265625, 0.642578125, false, false},
Nenue@93 20 Frost = {"Relic-Frost-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.7421875, 0.8125, 0.572265625, 0.642578125, false, false},
Nenue@93 21 Holy = {"Relic-Holy-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.814453125, 0.884765625, 0.572265625, 0.642578125, false, false},
Nenue@93 22 Iron = {"Relic-Iron-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.88671875, 0.95703125, 0.572265625, 0.642578125, false, false},
Nenue@93 23 Life = {"Relic-Life-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.59765625, 0.66796875, 0.64453125, 0.71484375, false, false},
Nenue@93 24 Shadow = {"Relic-Shadow-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.59765625, 0.66796875, 0.716796875, 0.787109375, false, false},
Nenue@93 25 Water = {"Relic-Water-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.59765625, 0.66796875, 0.7890625, 0.859375, false, false},
Nenue@93 26 Wind = {"Relic-Wind-Slot", [[Interface\Artifacts\Artifacts.BLP]], 72, 72, 0.59765625, 0.66796875, 0.861328125, 0.931640625, false, false},
Nenue@93 27 }
Nenue@93 28
Nenue@93 29 local slots_left = {'TOPLEFT', 'TOPRIGHT', 1, 0, 'TOPLEFT', 'BOTTOMLEFT', 0, -1}
Nenue@93 30 local slots_right = {'TOPRIGHT', 'TOPLEFT', -1, 0, 'TOPRIGHT', 'BOTTOMRIGHT', 0, -1}
Nenue@93 31 local slots_bottomleft = {'BOTTOMRIGHT', 'TOPRIGHT', 0, 1, 'BOTTOMRIGHT', 'TOPRIGHT', 0, 1 }
Nenue@93 32 local slots_bottomright = {'BOTTOMLEFT', 'TOPLEFT', 0, -1, 'BOTTOMLEFT', 'TOPLEFT', 0, 1}
Nenue@62 33
Nenue@64 34 local slot_anchors = {
Nenue@93 35 [1] = slots_left,
Nenue@93 36 [2] = slots_left,
Nenue@93 37 [3] = slots_left,
Nenue@93 38 [15] = slots_left,
Nenue@93 39 [5] = slots_left,
Nenue@93 40 [9] = slots_left,
Nenue@62 41
Nenue@93 42 [10] = slots_right,
Nenue@93 43 [6] = slots_right,
Nenue@93 44 [7] = slots_right,
Nenue@93 45 [8] = slots_right,
Nenue@93 46 [11] = slots_right,
Nenue@93 47 [12] = slots_right,
Nenue@93 48 [13] = slots_right,
Nenue@93 49 [14] = slots_right,
Nenue@64 50
Nenue@93 51 [16] = slots_bottomleft,
Nenue@93 52 [17] = slots_bottomright,
Nenue@64 53 }
Nenue@64 54
Nenue@64 55
Nenue@93 56 function VeneerPaperDollMixin:OnLoad()
Nenue@93 57 hooksecurefunc("PaperDollItemSlotButton_Update", function(...)
Nenue@93 58 self:GetSlotButton(PaperDollItemsFrame, ...)
Nenue@93 59 end)
Nenue@64 60
Nenue@93 61 hooksecurefunc("PaperDollFrame_UpdateStats", function(...)
Nenue@93 62 self:GetStats(PaperDollItemsFrame, ...)
Nenue@93 63 end)
Nenue@64 64
Nenue@93 65 self:RegisterEvent('ADDON_LOADED')
Nenue@93 66 self:RegisterEvent('INSPECT_READY')
Nenue@65 67
Nenue@93 68 self.SocketType = {}
Nenue@80 69 end
Nenue@80 70
Nenue@93 71 function VeneerPaperDollMixin:SetupInspectFrame()
Nenue@93 72 hooksecurefunc("InspectPaperDollItemSlotButton_Update", function(...)
Nenue@93 73 self:GetSlotButton(InspectFrame, ...)
Nenue@93 74 end)
Nenue@93 75 self:RegisterEvent('INSPECT_READY')
Nenue@93 76 end
Nenue@93 77 function VeneerPaperDollMixin:SetupArtifactUI()
Nenue@93 78 self:RegisterEvent('ARTIFACT_UPDATE')
Nenue@80 79 end
Nenue@80 80
Nenue@93 81 function VeneerPaperDollMixin:Setup()
Nenue@93 82 VeneerData.PaperDoll = VeneerData.PaperDoll or {}
Nenue@93 83 VeneerData.PaperDoll.KnownRelics = VeneerData.PaperDoll.KnownRelics or {}
Nenue@93 84 self.KnownRelics = VeneerData.PaperDoll.KnownRelics
Nenue@80 85
Nenue@93 86 self:RegisterEvent('UNIT_INVENTORY_CHANGED')
Nenue@93 87 self:RegisterEvent('PLAYER_EQUIPMENT_CHANGED')
Nenue@93 88 self:RegisterEvent('PLAYER_SPECIALIZATION_CHANGED')
Nenue@80 89
Nenue@93 90 self:MarkForUpdate()
Nenue@62 91 end
Nenue@62 92
Nenue@93 93 function VeneerPaperDollMixin:MarkForUpdate()
Nenue@93 94 for frame, overlays in pairs(slot_overlays) do
Nenue@93 95 for slot, overlay in pairs(overlays) do
Nenue@93 96 if overlay:IsVisible() then
Nenue@93 97 overlay:Update()
Nenue@93 98 else
Nenue@93 99 overlay.isDirty = true
Nenue@93 100 end
Nenue@64 101 end
Nenue@64 102 end
Nenue@64 103 end
Nenue@64 104
Nenue@93 105 function VeneerPaperDollMixin:GetStats()
Nenue@93 106 end
Nenue@93 107 function VeneerPaperDollMixin:GetSlotButton(panel, frame)
Nenue@93 108 print('|cFF00FF88'..self:GetName()..':GetSlotButton()', frame:GetName(), frame:GetID())
Nenue@93 109 local slot = frame:GetID()
Nenue@93 110 local unit = panel.unit or 'player'
Nenue@93 111 if slot_anchors[slot] then
Nenue@93 112 slot_overlays[panel] = slot_overlays[panel] or {}
Nenue@93 113 local overlay = slot_overlays[panel][slot]
Nenue@93 114 if not overlay then
Nenue@93 115 overlay = CreateFrame('Frame', 'VeneerPaperDollSlot' .. unit .. slot, frame, 'VeneerPaperDollSlotInfoTemplate')
Nenue@93 116 overlay:SetID(slot)
Nenue@93 117 slot_overlays[panel][slot] = overlay
Nenue@93 118 overlay.checkRelic = frame.checkRelic
Nenue@71 119
Nenue@93 120 local anchorPoint, relativePoint, dX, dY, statPoint, statRelative, statdX, statdY = unpack(slot_anchors[slot])
Nenue@93 121 local offset = 7
Nenue@93 122 overlay:SetPoint(anchorPoint, frame, relativePoint, dX * offset, dY * offset)
Nenue@93 123 overlay:SetSize(frame:GetWidth()*3, frame:GetHeight())
Nenue@93 124
Nenue@93 125 local relativeFrame = overlay
Nenue@93 126 for i, region in ipairs(overlay.StatsLeft) do
Nenue@93 127 region:ClearAllPoints()
Nenue@93 128 print(statPoint, relativeFrame, (i == 1) and statPoint or statRelative)
Nenue@93 129 region:SetPoint(statPoint, relativeFrame, (i == 1) and statPoint or statRelative, 0, 0)
Nenue@93 130 relativeFrame = region
Nenue@93 131 end
Nenue@93 132 if slot == 16 then
Nenue@93 133 overlay.Sockets:ClearAllPoints()
Nenue@93 134 overlay.Sockets:SetPoint('BOTTOM', CharacterFrameInsetBg, 'BOTTOM', 0, frame:GetHeight() + 14)
Nenue@93 135 overlay.ItemLevel:SetFontObject(VeneerNumberFontLarge)
Nenue@93 136 overlay.ItemLevel:ClearAllPoints()
Nenue@93 137 overlay.ItemLevel:SetPoint('BOTTOM', overlay.Sockets, 'TOP', 0, 4)
Nenue@93 138 end
Nenue@93 139
Nenue@93 140 print(overlay.Sockets:GetPoint(1))
Nenue@93 141 overlay.anchors = slot_anchors[slot]
Nenue@93 142 end
Nenue@93 143
Nenue@93 144 overlay.unit = unit
Nenue@93 145 overlay.checkRelic = (unit == 'player' and slot == 16)
Nenue@93 146
Nenue@93 147
Nenue@93 148 if frame.hasItem then
Nenue@93 149 overlay.isDirty = true
Nenue@93 150 overlay:Show()
Nenue@93 151 else
Nenue@93 152 overlay:Hide()
Nenue@93 153 end
Nenue@64 154 end
Nenue@64 155 end
Nenue@64 156
Nenue@80 157
Nenue@64 158
Nenue@93 159 function VeneerPaperDollMixin:OnEvent(event, arg)
Nenue@93 160 print(event, arg)
Nenue@93 161 if event == 'ADDON_LOADED' then
Nenue@93 162 if IsLoggedIn() and not self.initialized then
Nenue@93 163 self:Setup()
Nenue@93 164 self.initialized = true
Nenue@93 165 end
Nenue@64 166
Nenue@64 167
Nenue@93 168 if arg == 'Blizzard_InspectUI' then
Nenue@93 169 self:SetupInspectFrame()
Nenue@93 170 end
Nenue@93 171 if arg == 'Blizzard_ArtifactUI' then
Nenue@93 172 self:SetupArtifactUI()
Nenue@93 173 self:MarkForUpdate()
Nenue@93 174 end
Nenue@93 175 elseif event == 'ARTIFACT_UPDATE' then
Nenue@93 176 self:MarkForUpdate()
Nenue@93 177 else
Nenue@93 178 if (event == 'PLAYER_SPECIALIZATION_CHANGED' or event == 'UNIT_INVENTORY_CHANGED') then
Nenue@93 179 if arg ~= 'player' then
Nenue@93 180 return
Nenue@93 181 end
Nenue@93 182 elseif event == 'INSPECT_READY' then
Nenue@80 183
Nenue@65 184 end
Nenue@64 185
Nenue@93 186 self:MarkForUpdate()
Nenue@66 187
Nenue@65 188 end
Nenue@80 189 end
Nenue@66 190
Nenue@64 191
Nenue@93 192 VeneerPaperDollSlotMixin = {}
Nenue@66 193
Nenue@93 194 function VeneerPaperDollSlotMixin:OnLoad()
Nenue@93 195 self.SocketText = {}
Nenue@93 196 self.SocketType = {}
Nenue@93 197 self.SocketLink = {}
Nenue@93 198 end
Nenue@93 199 function VeneerPaperDollSlotMixin:OnShow()
Nenue@93 200 if self.isDirty then
Nenue@93 201 self:Update()
Nenue@93 202 end
Nenue@93 203 end
Nenue@93 204 function VeneerPaperDollSlotMixin:OnUpdate()
Nenue@93 205 if self.isDirty then
Nenue@93 206 --print('|cFF00FF00pushing update for', self:GetID())
Nenue@93 207 self:Update()
Nenue@93 208 end
Nenue@80 209
Nenue@93 210 if self.checkRelic then
Nenue@93 211 self.tooltipLink = nil
Nenue@93 212 for i = 1, 3 do
Nenue@93 213 if self.SocketLink[i] and self.Sockets.SocketIcon[i]:IsMouseOver() then
Nenue@93 214 self.tooltipLink = self.SocketLink[i]
Nenue@93 215 end
Nenue@93 216 end
Nenue@93 217
Nenue@93 218 if self.tooltipLink then
Nenue@93 219 if not GameTooltip:IsOwned(self) then
Nenue@93 220 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
Nenue@93 221 GameTooltip:SetHyperlink(self.tooltipLink)
Nenue@93 222
Nenue@93 223 GameTooltip:Show()
Nenue@93 224 end
Nenue@93 225 else
Nenue@93 226 if GameTooltip:IsOwned(self) then
Nenue@93 227 GameTooltip:Hide()
Nenue@93 228 end
Nenue@93 229 end
Nenue@93 230 end
Nenue@93 231 end
Nenue@93 232
Nenue@93 233 function VeneerPaperDollSlotMixin:UpdateRelicInfo()
Nenue@93 234
Nenue@93 235
Nenue@93 236 local itemID = GetInventoryItemID(self.unit, 16)
Nenue@93 237 if not itemID then
Nenue@93 238 return
Nenue@93 239 end
Nenue@93 240 print('|cFF00FFFFRelic Sweep:', itemID)
Nenue@93 241
Nenue@93 242
Nenue@93 243 local guid = UnitGUID(self.unit or 'player')
Nenue@93 244 local relicCache = VeneerPaperDoll.KnownRelics[guid] and VeneerPaperDoll.KnownRelics[guid][itemID]
Nenue@93 245 if VeneerPaperDoll.KnownRelics[guid] then
Nenue@93 246 for k, v in pairs(VeneerPaperDoll.KnownRelics[guid]) do
Nenue@93 247 if tonumber(k) and tonumber(k) < 72 then
Nenue@93 248 VeneerPaperDoll.KnownRelics[guid][k] = nil
Nenue@93 249 end
Nenue@93 250 end
Nenue@93 251 end
Nenue@93 252
Nenue@93 253
Nenue@93 254 if not relicCache then
Nenue@93 255 relicCache = {}
Nenue@93 256 VeneerPaperDoll.KnownRelics[guid] = VeneerPaperDoll.KnownRelics[guid] or {}
Nenue@93 257 VeneerPaperDoll.KnownRelics[guid][itemID] = relicCache
Nenue@93 258 end
Nenue@93 259
Nenue@93 260 local numRelics = C_ArtifactUI.GetNumRelicSlots()
Nenue@93 261 local isEquipped = C_ArtifactUI.IsViewedArtifactEquipped()
Nenue@93 262 local tooltip = VeneerPaperDollTooltip
Nenue@93 263 tooltip:SetOwner(self, 'ANCHOR_NONE')
Nenue@93 264 self.hasRelicSlots = true
Nenue@93 265 if numRelics and isEquipped then
Nenue@93 266 print('Relic Query:', itemID, numRelics)
Nenue@93 267 self.checkRelic = nil
Nenue@93 268 for i = 1, numRelics do
Nenue@93 269 local lockedReason, relicName, relicIcon, relicLink = C_ArtifactUI.GetRelicInfo(i);
Nenue@93 270 local relicType = C_ArtifactUI.GetRelicSlotType(i);
Nenue@93 271 if relicIcon then
Nenue@93 272 tooltip:SetHyperlink(relicLink)
Nenue@93 273 print(tooltip:NumLines())
Nenue@93 274
Nenue@93 275 local line1 = _G['VeneerPaperDollTooltipTextLeft2']
Nenue@93 276 local line2 = _G['VeneerPaperDollTooltipTextLeft3']
Nenue@93 277 local text1 = line1 and line1:GetText()
Nenue@93 278 local text2 = line2 and line2:GetText()
Nenue@93 279 if text1 or text2 then
Nenue@93 280 self.SocketText[i] = text1:match('Item Level (%d+)') or text2:match('Item Level (%d+)')
Nenue@93 281 end
Nenue@93 282
Nenue@93 283 self.SocketInfo[i] = relicIcon
Nenue@93 284 self.SocketType[i] = relicType
Nenue@93 285 self.SocketLink[i] = relicLink
Nenue@93 286 print('storing', i, self.SocketInfo[i], self.SocketText[i], self.SocketType[i], self.SocketLink[i])
Nenue@93 287 else
Nenue@93 288
Nenue@93 289 self.SocketInfo[i] = "Interface\\CharacterFrame\\TempPortraitAlphaMask"
Nenue@93 290 self.SocketType[i] = relicType
Nenue@93 291 self.SocketLink[i] = nil
Nenue@93 292 end
Nenue@93 293
Nenue@93 294 relicCache[i] = {self.SocketInfo[i], self.SocketText[i], self.SocketType[i], self.SocketLink[i]}
Nenue@93 295 end
Nenue@93 296 end
Nenue@93 297
Nenue@93 298 for i = 1, 3 do
Nenue@93 299 if relicCache[i] then
Nenue@93 300 local relicIcon, relicLevel, relicType, relicLink = unpack(relicCache[i])
Nenue@93 301
Nenue@93 302 print('loading', i, relicIcon, relicLevel, relicType, relicLink)
Nenue@93 303 self.SocketInfo[i] = relicIcon
Nenue@93 304 self.SocketText[i] = relicLevel
Nenue@93 305 self.SocketType[i] = relicType
Nenue@93 306 self.SocketLink[i] = relicLink
Nenue@93 307 end
Nenue@93 308 end
Nenue@93 309 end
Nenue@93 310
Nenue@93 311 local SocketIcon_Update = function(frame)
Nenue@93 312 end
Nenue@93 313
Nenue@93 314 function VeneerPaperDollSlotMixin:Update()
Nenue@93 315 local id = self:GetID()
Nenue@93 316
Nenue@93 317 self.SocketInfo = self.SocketInfo or {}
Nenue@93 318 table.wipe(self.SocketInfo)
Nenue@93 319 self.ItemLevel:SetText(nil)
Nenue@93 320
Nenue@93 321 local tooltip = VeneerPaperDollTooltip
Nenue@93 322 tooltip:SetOwner(self, 'ANCHOR_NONE')
Nenue@93 323 print('refresh', self.unit, id)
Nenue@93 324 tooltip:SetInventoryItem(self.unit or 'player', id)
Nenue@93 325 tooltip:Show()
Nenue@93 326
Nenue@93 327 local numLines = tooltip:NumLines()
Nenue@93 328 local numTextures = 0
Nenue@93 329 local itemLevel
Nenue@93 330 local itemLevelLine
Nenue@93 331 print('|cFFFFFF00Sockets scan:', numLines)
Nenue@93 332 for i = 1, numLines do
Nenue@93 333 local line = _G['VeneerPaperDollTooltipTextLeft'..i]
Nenue@93 334 local text = line and line:GetText()
Nenue@93 335 if text then
Nenue@93 336 itemLevel = text:match('Item Level (%d+)')
Nenue@93 337 if itemLevel then
Nenue@93 338 self.ItemLevel:SetText(itemLevel)
Nenue@93 339 break
Nenue@93 340 end
Nenue@93 341 end
Nenue@93 342
Nenue@93 343 local texture = _G['VeneerPaperDollTooltipTexture'..i]
Nenue@93 344 if texture and texture:IsShown() then
Nenue@93 345 numTextures = numTextures + 1
Nenue@93 346 print('picked up socket', numTextures, texture:GetTexture())
Nenue@93 347 self.SocketInfo[numTextures] = texture:GetTexture()
Nenue@93 348 end
Nenue@93 349 end
Nenue@93 350 if self.checkRelic then
Nenue@93 351 self:UpdateRelicInfo()
Nenue@93 352 end
Nenue@93 353
Nenue@93 354
Nenue@93 355 local relativeIcon
Nenue@93 356 local socketsWidth = 0
Nenue@93 357 local socketsHeight = 24
Nenue@93 358 for index, icon in ipairs(self.Sockets.SocketIcon) do
Nenue@93 359 if self.SocketInfo[index] then
Nenue@93 360 print('|cFF0088FFsocketInfo|r', index, self.SocketInfo[index])
Nenue@93 361 icon:ClearAllPoints()
Nenue@93 362
Nenue@93 363 icon:SetTexture(self.SocketInfo[index])
Nenue@93 364 icon:SetSize(16, 16)
Nenue@93 365 icon:Show()
Nenue@93 366 if index == 1 then
Nenue@93 367 icon:SetPoint('LEFT', self.Sockets, 'LEFT', 0, 0)
Nenue@93 368 socketsWidth = socketsWidth + icon:GetWidth()
Nenue@93 369 socketsHeight = icon:GetHeight()
Nenue@93 370 else
Nenue@93 371 if id == 16 then
Nenue@93 372 icon:SetPoint('LEFT', relativeIcon, 'RIGHT', 14, 0)
Nenue@93 373 socketsWidth = socketsWidth + 14
Nenue@93 374 else
Nenue@93 375 icon:SetPoint('LEFT', relativeIcon, 'RIGHT', 2, 0)
Nenue@93 376 socketsWidth = socketsWidth + 2
Nenue@93 377 end
Nenue@93 378 socketsWidth = socketsWidth + icon:GetWidth()
Nenue@93 379 end
Nenue@93 380
Nenue@93 381 local label = self.Sockets.SocketLabel[index]
Nenue@93 382 label:ClearAllPoints()
Nenue@93 383 label:SetPoint('BOTTOM', icon, 'TOP',0, 2)
Nenue@93 384 label:SetFontObject(VeneerNumberFont)
Nenue@93 385 label:SetText(self.SocketText[index])
Nenue@93 386
Nenue@93 387 if self.checkRelic then
Nenue@93 388 local relicAtlasName = ("Relic-%s-Slot"):format(self.SocketType[index]);
Nenue@93 389 self.Sockets.SocketBg = self.Sockets.SocketBg or {}
Nenue@93 390 self.Sockets.SocketBg[index] = self.Sockets.SocketBg[index] or self.Sockets:CreateTexture()
Nenue@93 391 self.Sockets.SocketBg[index]:SetAtlas(relicAtlasName)
Nenue@93 392 self.Sockets.SocketBg[index]:SetPoint('TOPRIGHT', icon, 'TOPRIGHT', 12, 12)
Nenue@93 393 self.Sockets.SocketBg[index]:SetPoint('BOTTOMLEFT', icon, 'BOTTOMLEFT', -12,-12)
Nenue@93 394 print('', self.SocketType[index], relicAtlasName)
Nenue@93 395
Nenue@93 396 socketsHeight = self.Sockets.SocketBg[index]:GetHeight()
Nenue@93 397 end
Nenue@93 398
Nenue@93 399
Nenue@93 400 relativeIcon = icon
Nenue@93 401 else
Nenue@93 402 if self.checkRelic and self.Sockets.SocketBg and self.Sockets.SocketBg[index] then
Nenue@93 403 self.Sockets.SocketBg[index]:SetTexture(nil)
Nenue@93 404 self.Sockets.SocketLabel[index]:SetText(nil)
Nenue@93 405 end
Nenue@93 406
Nenue@93 407 icon:Hide()
Nenue@93 408 end
Nenue@93 409
Nenue@93 410
Nenue@93 411 end
Nenue@93 412 self.Sockets:SetWidth(socketsWidth)
Nenue@93 413 self.Sockets:SetHeight(socketsHeight)
Nenue@93 414
Nenue@93 415
Nenue@93 416
Nenue@93 417
Nenue@93 418
Nenue@93 419 self.isDirty = nil
Nenue@93 420 end