comparison ClassPlan.lua @ 4:4c7e9efec4b5

fix order of operations regarding frame visibility checking
author Nenue
date Mon, 17 Oct 2016 12:59:24 -0400
parents c006ce87a147
children 4e1883842abf
comparison
equal deleted inserted replaced
3:c006ce87a147 4:4c7e9efec4b5
1 local wipe = table.wipe 1 local wipe, tinsert, sort = table.wipe, tinsert, table.sort
2 local pairs, ipairs = pairs, ipairs 2 local pairs, ipairs = pairs, ipairs
3 local floor, mod, time = floor, mod, time
3 local GetTime = GetTime 4 local GetTime = GetTime
4 local GI_currentTime = time() 5 local GI_currentTime = time()
5 6
6 7 local BOUND_FRAMES = {}
7 local blockTemplate = { 8 local blockTemplate = {
8 point = 'TOPLEFT', 9 point = 'TOPLEFT',
9 relativePoint ='TOPLEFT', 10 relativePoint ='TOPLEFT',
10 } 11 }
11 12
25 playerFirst = false, 26 playerFirst = false,
26 prototypes = {} 27 prototypes = {}
27 } 28 }
28 ClassPlanBlockMixin = { 29 ClassPlanBlockMixin = {
29 templateName = 'ClassPlanBlock', 30 templateName = 'ClassPlanBlock',
30 events = {'GARRISON_MISSION_LIST_UPDATE', 'GARRISON_MISSION_FINISHED', 'GARRISON_MISSION_FINISHED'},} 31 events = {'GARRISON_MISSION_LIST_UPDATE', 'GARRISON_MISSION_STARTED', 'GARRISON_MISSION_FINISHED'},}
31 ClassPlanShipmentMixin = { 32 ClassPlanShipmentMixin = {
32 templateName = 'ClassPlanShipment', 33 templateName = 'ClassPlanShipment',
33 parent = false, 34 parent = false,
34 point = 'TOPRIGHT', 35 point = 'TOPRIGHT',
35 relativePoint ='TOPRIGHT', 36 relativePoint ='TOPRIGHT',
36 events = {'GARRISON_LANDINGPAGE_SHIPMENTS', 'GARRISON_TALENT_UPDATE', "GARRISON_TALENT_COMPLETE", 'GARRISON_TALENT_COMPLETE', 'GARRISON_SHIPMENT_RECEIVED', "GARRISON_SHIPMENT_RECEIVED"}, 37 events = {'GARRISON_LANDINGPAGE_SHIPMENTS', 'GARRISON_TALENT_UPDATE', "GARRISON_TALENT_COMPLETE", "GARRISON_SHIPMENT_RECEIVED"},
37 } 38 }
38 setmetatable(ClassPlanShipmentMixin, {__index = ClassPlanBlockMixin}) 39 setmetatable(ClassPlanShipmentMixin, {__index = ClassPlanBlockMixin})
39 local core, MissionsHandler, ShipmentsHandler = ClassOrderPlanCore, ClassPlanBlockMixin, ClassPlanShipmentMixin 40 local core, MissionsHandler, ShipmentsHandler = ClassOrderPlanCore, ClassPlanBlockMixin, ClassPlanShipmentMixin
40 local print = DEVIAN_WORKSPACE and function(...) print('ClassPlan', ...) end or nop 41 local print = DEVIAN_WORKSPACE and function(...) print('ClassPlan', ...) end or nop
41 42
42 43 local GetTimeLeftString = function(timeLeft)
44 local days = floor(timeLeft/(24*3600))
45 local hours = floor(mod(timeLeft, (24*3600)) / 3600)
46 local minutes = floor(mod(timeLeft, 3600) / 60)
47 local seconds = mod(timeLeft, 60)
48 if days >= 1 then
49 return (days .. 'd' .. ' ') .. ((hours > 0) and (hours .. 'h ') or '')
50 else
51 return ((hours > 0) and (hours .. 'h ') or '') .. ((minutes > 0) and (minutes .. ' min') or '')
52 end
53 end
43 54
44 MissionsHandler.GetPlayerData = function(self) 55 MissionsHandler.GetPlayerData = function(self)
45 if not self.profile then 56 if not self.profile then
46 return 57 return
47 end 58 end
48 self.items = C_Garrison.GetLandingPageItems(LE_GARRISON_TYPE_7_0) 59 self.items = C_Garrison.GetLandingPageItems(LE_GARRISON_TYPE_7_0)
49 60
50 if #self.items >= 1 then 61 wipe(self.profile.missions)
51 wipe(self.profile.missions) 62 for index, data in ipairs(self.items) do
52 for index, data in ipairs(self.items) do 63 print(' ',data.name, '|cFF00FF00'.. data.timeLeft .. '|r', date("%A %I:%m %p", data.missionEndTime))
53 print(' ',data.name, '|cFF00FF00'.. data.timeLeft .. '|r', date("%A %I:%m %p", data.missionEndTime)) 64 tinsert(self.profile.missions, data)
54 tinsert(self.profile.missions, data) 65 end
55 end 66 print('items update pending')
56 print('items update pending') 67 self.isStale = true
57 self.isStale = true
58 end
59 68
60 if self:IsVisible() then 69 if self:IsVisible() then
61 self:Refresh() 70 self:Refresh()
62 end 71 end
63 end 72 end
64 73
74 MissionsHandler.FreeBlock = function(self, block)
75 end
76
65 MissionsHandler.SortHandler = function (a,b) 77 MissionsHandler.SortHandler = function (a,b)
66 local result = false 78 local result = false
67 if not a or not b then 79 --if not a or not b then
68 result = true 80 -- return true
69 else 81 --else
70 if (a.isMine ~= b.isMine) then 82 --if (a.isMine ~= b.isMine) then
71 result = a.isMine 83 -- result = a.isMine
72 else 84 --else
73 if (not b.missionEndTime) or (not a.missionEndTime) then 85 --if (not b.missionEndTime) or (not a.missionEndTime) then
74 print('missing article', b.missionEndTime, a.missionEndTime) 86 -- print('missing article', b.missionEndTime, a.missionEndTime)
75 end 87 --end
76 result = ( b.missionEndTime > a.missionEndTime) 88 return ( b.missionEndTime > a.missionEndTime)
77 end 89 --end
78 end 90 --end
79 return result
80 end 91 end
81 92
82 93
83 ShipmentsHandler.OnGetItem = function(data) 94 ShipmentsHandler.OnGetItem = function(data)
84 if data.shipmentsTotal then 95 if data.shipmentsTotal then
97 end 108 end
98 109
99 ShipmentsHandler.SortHandler = function(a, b) 110 ShipmentsHandler.SortHandler = function(a, b)
100 if b.isComplete ~= a.isComplete then 111 if b.isComplete ~= a.isComplete then
101 return a.isComplete and true or false 112 return a.isComplete and true or false
102 end 113 elseif a.shipmentsReady or b.shipmentsReady then
103 return (a.creationTime) < (b.creationTime) 114 return (a.shipmentsReady or 0) > (b.shipmentsReady or 0)
104 end 115 else
105 116 return (a.creationTime) < (b.creationTime)
117 end
118 end
119
120 local AddShipmentInfo = function(self, shipmentType, name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID, followerID)
121 -- early login queries may return empty tables, causing the sorter to compare nil
122 if not creationTime then
123 return
124 end
125 print(shipmentType, name, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString)
126 tinsert(self.shipments,
127 {
128 shipmentType = shipmentType,
129 name = name,
130 icon = texture,
131 shipmentCapacity = shipmentCapacity,
132 shipmentsReady = shipmentsReady,
133 shipmentsTotal = shipmentsTotal,
134 creationTime = creationTime,
135 duration = duration,
136 timeleftString = timeleftString,
137 itemName = itemName,
138 itemIcon = itemIcon,
139 itemQuality = itemQuality,
140 itemID = itemID,
141 followerID = followerID,
142 })
143 end
106 ShipmentsHandler.GetPlayerData = function (self) 144 ShipmentsHandler.GetPlayerData = function (self)
107 if not self.profile then 145 if not self.profile then
108 return 146 return
109 end 147 end
110 wipe(self.shipments) 148 wipe(self.shipments)
114 local buildings = C_Garrison.GetBuildings(garrisonType); 152 local buildings = C_Garrison.GetBuildings(garrisonType);
115 local shipmentIndex = 0 153 local shipmentIndex = 0
116 --print('Buildings:') 154 --print('Buildings:')
117 for i = 1, #buildings do 155 for i = 1, #buildings do
118 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID = C_Garrison.GetLandingPageShipmentInfo(buildingID); 156 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID = C_Garrison.GetLandingPageShipmentInfo(buildingID);
119 tinsert(self.shipments, 157 AddShipmentInfo(self, 'Building', name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID)
120 {
121 shipmentType = 'Work Order',
122 name = name,
123 icon = texture,
124 shipmentCapacity = shipmentCapacity,
125 shipmentsReady = shipmentsReady,
126 shipmentsTotal = shipmentsTotal,
127 creationTime = creationTime,
128 duration = duration,
129 timeleftString = timeleftString,
130 itemName = itemName,
131 itemIcon = itemIcon,
132 itemQuality = itemQuality,
133 itemID = itemID
134 })
135 end 158 end
136 159
137 --print('Follower:') 160 --print('Follower:')
138 local followerShipments = C_Garrison.GetFollowerShipments(garrisonType); 161 local followerShipments = C_Garrison.GetFollowerShipments(garrisonType);
139 for i = 1, #followerShipments do 162 for i = 1, #followerShipments do
140 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, _, _, _, _, followerID = C_Garrison.GetLandingPageShipmentInfoByContainerID(followerShipments[i]); 163 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, _, _, _, _, followerID = C_Garrison.GetLandingPageShipmentInfoByContainerID(followerShipments[i]);
141 tinsert(self.shipments, 164 AddShipmentInfo(self, 'Follower', name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, nil, nil, nil, nil, followerID)
142 {
143 shipmentType = '',
144 name = name,
145 icon = texture,
146 shipmentCapacity = shipmentCapacity,
147 shipmentsReady = shipmentsReady,
148 shipmentsTotal = shipmentsTotal,
149 creationTime = creationTime,
150 duration = duration,
151 timeleftString = timeleftString,
152 followerID = followerID,
153 })
154 end 165 end
155 166
156 --print('Loose:') 167 --print('Loose:')
157 local looseShipments = C_Garrison.GetLooseShipments(garrisonType) 168 local looseShipments = C_Garrison.GetLooseShipments(garrisonType)
158 for i = 1, #looseShipments do 169 for i = 1, #looseShipments do
159 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString = C_Garrison.GetLandingPageShipmentInfoByContainerID(looseShipments[i]); 170 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString = C_Garrison.GetLandingPageShipmentInfoByContainerID(looseShipments[i]);
160 tinsert(self.shipments, 171 AddShipmentInfo(self, 'Follower', name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString)
161 {
162 shipmentType = '',
163 name = name,
164 icon = texture,
165 shipmentCapacity = shipmentCapacity,
166 shipmentsReady = shipmentsReady,
167 shipmentsTotal = shipmentsTotal,
168 creationTime = creationTime,
169 duration = duration,
170 timeleftString = timeleftString,
171 })
172 end 172 end
173 173
174 local talentTrees = C_Garrison.GetTalentTrees(garrisonType, select(3, UnitClass("player"))); 174 local talentTrees = C_Garrison.GetTalentTrees(garrisonType, select(3, UnitClass("player")));
175 -- this is a talent that has completed, but has not been seen in the talent UI yet. 175 -- this is a talent that has completed, but has not been seen in the talent UI yet.
176 local completeTalentID = C_Garrison.GetCompleteTalent(garrisonType); 176 local completeTalentID = C_Garrison.GetCompleteTalent(garrisonType);
177 --print('Talents:') 177 --print('Talents:')
178 if (talentTrees) then 178 if (talentTrees) then
179 for treeIndex, tree in ipairs(talentTrees) do 179 for treeIndex, tree in ipairs(talentTrees) do
180 for talentIndex, talent in ipairs(tree) do 180 for talentIndex, talent in ipairs(tree) do
181 local showTalent = false; 181 local showTalent = false;
182 if (talent.isBeingResearched) then 182 if (talent.isBeingResearched) or (talent.id == completeTalentID) then
183 showTalent = true; 183 AddShipmentInfo(self, 'Talent', talent.name, talent.icon, 1, (talent.isBeingResearched and 0 or 1), 1, talent.researchStartTime, talent.researchDuration, talent.timeleftString)
184 end
185 if (talent.id == completeTalentID) then
186 showTalent = true;
187 end
188 if (showTalent) then
189 print(talent.name)
190 talent.creationTime = talent.researchStartTime
191 talent.duration = talent.researchDuration
192 talent.shipmentType = 'Talent: '
193 tinsert(self.shipments, talent)
194 end 184 end
195 end 185 end
196 end 186 end
197 end 187 end
198 188
199 self.profile.shipments = self.profile.shipments or {} 189 self.profile.shipments = self.profile.shipments or {}
200 if #self.shipments >= 1 then 190 if #self.shipments >= 1 then
201
202
203 wipe(self.profile.shipments) 191 wipe(self.profile.shipments)
204 for index, data in ipairs(self.shipments) do 192 for index, data in ipairs(self.shipments) do
205 print(' ', data.shipmentType .. data.name, data.creationTime, data.duration) 193
194 --DEFAULT_CHAT_FRAME:AddMessage(data.shipmentType ..' '.. tostring(data.name) ..' '.. tostring(data.creationTime) ..' '.. tostring(data.duration))
206 tinsert(self.profile.shipments, data) 195 tinsert(self.profile.shipments, data)
207 end 196 end
208 self.isStale = true 197 self.isStale = true
209 end 198 end
210 199
217 self:RegisterUnitEvent('UNIT_PORTRAIT_UPDATE', 'player') 206 self:RegisterUnitEvent('UNIT_PORTRAIT_UPDATE', 'player')
218 self:RegisterEvent('PLAYER_LOGIN') 207 self:RegisterEvent('PLAYER_LOGIN')
219 self:RegisterEvent('PLAYER_ENTERING_WORLD') 208 self:RegisterEvent('PLAYER_ENTERING_WORLD')
220 self:RegisterEvent('ADDON_LOADED') 209 self:RegisterEvent('ADDON_LOADED')
221 self:RegisterEvent('PLAYER_REGEN_ENABLED') 210 self:RegisterEvent('PLAYER_REGEN_ENABLED')
211 -- Blizzard_GarrisonUI already fires a shipment data request for GARRISON_SHIPMENT_RECEIVED; this is unlikely to
212
222 213
223 self:AddHandler('missions', MissionsHandler) 214 self:AddHandler('missions', MissionsHandler)
224 self:AddHandler('shipments', ShipmentsHandler) 215 self:AddHandler('shipments', ShipmentsHandler)
216
217
218 self:Reanchor()
219 end
220 local parentFrames = {'VeneerWorldState', 'OrderHallCommandBar'}
221 function core:Reanchor()
222
223
224 self:ClearAllPoints()
225
226 self.anchorParent = UIParent
227 for i, name in ipairs(parentFrames) do
228 local frame = _G[name]
229 if frame then
230 if not BOUND_FRAMES[frame] then
231 BOUND_FRAMES[frame] = {visible = frame:IsVisible()}
232 hooksecurefunc(frame, 'Show', function()
233 BOUND_FRAMES[frame].visible = true
234 print(frame:GetName(), 'Show', 'reanchor trigger')
235 self:Reanchor()
236 end)
237 hooksecurefunc(frame, 'Hide', function()
238 BOUND_FRAMES[frame].visible = false
239 print(frame:GetName(), 'Hide', 'reanchor trigger')
240 self:Reanchor()
241 end)
242 end
243 print('f:', frame:GetName(), frame:IsVisible())
244 if BOUND_FRAMES[frame].visible then
245 self.anchorParent = frame
246 break
247 end
248 end
249 end
250 print('|cFFFF8800Using ' .. tostring(self.anchorParent:GetName()) .. ' as anchor point')
251
252 if self:IsVisible() then
253 self:SetPoint('TOP', ClassPlanButton, 'BOTTOM', 0, 0)
254 ClassPlanButton.Background:Show()
255 ClassPlanButton:SetWidth(600)
256 else
257 ClassPlanButton.Background:Hide()
258 ClassPlanButton:SetWidth(200)
259 end
260
261 ClassPlanButton:SetPoint('TOP', self.anchorParent, (self.anchorPoint == UIParent) and 'TOP' or 'BOTTOM', 0, 0)
262
225 end 263 end
226 264
227 function core:AddHandler(name, prototype) 265 function core:AddHandler(name, prototype)
228 self.prototypes[name] = setmetatable(prototype, { 266 self.prototypes[name] = setmetatable(prototype, {
229 __index = blockTemplate, 267 __index = blockTemplate,
242 print('adding', name, 'to', event) 280 print('adding', name, 'to', event)
243 self.events[event][name] = prototype.GetPlayerData 281 self.events[event][name] = prototype.GetPlayerData
244 end 282 end
245 end 283 end
246 self.sortedItems[name] = {} 284 self.sortedItems[name] = {}
285 end
286
287 function core:Setup()
288 if IsLoggedIn() then
289 WorldPlanData.OrderHall = WorldPlanData.OrderHall or {}
290 self.data = WorldPlanData.OrderHall
291 self.data.characters = self.data.characters or {}
292
293 local name, realm = UnitName('player')
294 realm = realm or GetRealmName()
295 self.profileKey = name .. '-' .. realm
296 if not self.data.characters[self.profileKey] then
297 self.data.characters[self.profileKey] = {}
298 end
299 self.profile = self.data.characters[self.profileKey]
300
301 self.profile.shipments = self.profile.shipments or {}
302 self.profile.missions = self.profile.missions or {}
303 self.profile.classColor = RAID_CLASS_COLORS[select(2, UnitClass('player'))]
304
305 if self.data.IsShown then
306 self:Show()
307 end
308 self.initialized = true
309 end
247 end 310 end
248 311
249 function core:OnEvent (event, ...) 312 function core:OnEvent (event, ...)
250 print(event) 313 print(event)
251 if event == 'UNIT_PORTRAIT_UPDATE' then 314 if event == 'UNIT_PORTRAIT_UPDATE' then
252 SetPortraitTexture(self.portrait, 'player') 315 SetPortraitTexture(self.portrait, 'player')
253 elseif event == 'PLAYER_LOGIN' then 316 elseif event == 'PLAYER_LOGIN' then
254 if not self.initialized then 317 if not self.initialized then
255 if IsLoggedIn() then 318 self:Setup()
256 WorldPlanData.OrderHall = WorldPlanData.OrderHall or {} 319 end
257 self.data = WorldPlanData.OrderHall 320 elseif self.initialized and self.events[event] then
258 321 local numCalls = 0
259
260 local name, realm = UnitName('player')
261 realm = realm or GetRealmName()
262 self.profileKey = name .. '-' .. realm
263 if not self.data[self.profileKey] then
264 self.data[self.profileKey] = {}
265 end
266 self.profile = self.data[self.profileKey]
267
268 self.profile.shipments = self.profile.shipments or {}
269 self.profile.missions = self.profile.missions or {}
270 self.profile.classColor = RAID_CLASS_COLORS[select(2, UnitClass('player'))]
271
272 C_Garrison.RequestLandingPageShipmentInfo();
273
274 if self.data.IsShown then
275 self:Show()
276 end
277 self.initialized = true
278 end
279 end
280 elseif self.events[event] then
281 for ptype, eventFunc in pairs(self.events[event]) do 322 for ptype, eventFunc in pairs(self.events[event]) do
282 print('|cFF88FF00' .. tostring(ptype) .. '|r:GetPlayerData()') 323 numCalls = numCalls + 1
324 print('|cFF88FF00' .. tostring(ptype) .. '|r:GetPlayerData() --', numCalls)
283 eventFunc(self, event) 325 eventFunc(self, event)
284 end 326 end
285 end 327 end
286 end 328 end
287 329
288 function core:UpdateNotifications() 330 function core:UpdateNotifications()
331 end
332
333
334 local SetOwnerData = function(self, data)
335 local name, realm = string.match(data.profileKey, "(.+)%-(.+)")
336 local ownerText = '|c'.. data.classColor.colorStr .. name .. '|r'
337 if realm ~= GI_currentRealm then
338 ownerText = ownerText .. ' (' .. realm .. ')'
339 end
340 self.Owner:SetText(ownerText)
341 self.Background:SetColorTexture(data.classColor.r, data.classColor.g, data.classColor.b)
289 end 342 end
290 343
291 function core:RefreshItems(configKey, prototype) 344 function core:RefreshItems(configKey, prototype)
292 local sortedItems = self.sortedItems[configKey] 345 local sortedItems = self.sortedItems[configKey]
293 346
301 local block = blocks[i] 354 local block = blocks[i]
302 355
303 if not block then 356 if not block then
304 block = CreateFrame('Button', nil, self, prototype.templateName) 357 block = CreateFrame('Button', nil, self, prototype.templateName)
305 block:SetID(i) 358 block:SetID(i)
359 block.handler = prototype
306 prototype.numBlocks = prototype.numBlocks + 1 360 prototype.numBlocks = prototype.numBlocks + 1
307 361
308 if prototype.lastBlock then 362 if prototype.lastBlock then
309 block:SetPoint('TOPLEFT', prototype.lastBlock, 'BOTTOMLEFT', 0, 0) 363 block:SetPoint('TOPLEFT', prototype.lastBlock, 'BOTTOMLEFT', 0, 0)
310 else 364 else
314 blocks[i] = block 368 blocks[i] = block
315 end 369 end
316 370
317 totalHeight = totalHeight + block:GetHeight() 371 totalHeight = totalHeight + block:GetHeight()
318 block.lastProfile = lastProfile 372 block.lastProfile = lastProfile
373 for k,v in pairs(data) do
374 if type(block[k]) ~= 'function' then
375 block[k] = v
376 end
377 end
319 block:Refresh(data) 378 block:Refresh(data)
379 SetOwnerData(block, data)
380
320 block:Show() 381 block:Show()
321 lastProfile = data.profileKey 382 lastProfile = data.profileKey
322 end 383 end
323 384
324 for i = numItems + 1, prototype.numBlocks do 385 for i = numItems + 1, prototype.numBlocks do
340 for name, info in pairs(self.prototypes) do 401 for name, info in pairs(self.prototypes) do
341 local itemsHeight = self:RefreshItems(name, info) 402 local itemsHeight = self:RefreshItems(name, info)
342 self.currentHeight = max(itemsHeight, self.currentHeight) 403 self.currentHeight = max(itemsHeight, self.currentHeight)
343 end 404 end
344 405
345 if OrderHallCommandBar and OrderHallCommandBar:IsVisible() then 406 self:Reanchor()
346 self:ClearAllPoints()
347 self:SetPoint('TOP', OrderHallCommandBar, 'BOTTOM')
348 else
349
350 local posX = self.data.posX or 0
351 local posY = self.data.posY or -24
352 local point = self.point or 'TOP'
353 local relativePoint = self.point or 'TOP'
354 self:SetPoint(point, UIParent, relativePoint, posX, posY)
355 end
356
357 self:SetHeight(self.currentHeight) 407 self:SetHeight(self.currentHeight)
358 end 408 end
359 409
360 function core:Toggle() 410 function core:Toggle()
361 if self:IsVisible() then 411 if self:IsVisible() then
378 function core:OnShow() 428 function core:OnShow()
379 if self.isStale then 429 if self.isStale then
380 print('updating items on show') 430 print('updating items on show')
381 self:Refresh() 431 self:Refresh()
382 end 432 end
383 ClassPlanButton:SetPoint('TOP', self, 'TOP', 0, 0) 433 -- grab this at least once
434 C_Garrison.RequestLandingPageShipmentInfo();
435 ClassPlanButton.Background:Show()
436 ClassPlanButton.Grip:SetShown(true)
384 end 437 end
385 function core:OnHide() 438 function core:OnHide()
386 ClassPlanButton:SetPoint('TOP', UIParent, 'TOP', 0, 0) 439 ClassPlanButton.Background:Hide()
440 ClassPlanButton.Grip:SetShown(false)
387 end 441 end
388 442
389 local GI_profileKey, GI_profile, GI_isMine 443 local GI_profileKey, GI_profile, GI_isMine
390 local GetItemList = function (source, dest, onGetItem) 444 local defaultClassColor = {r = 0.7, g = 0.7, b =0.7, colorStr = "ffffffff"}
445 local DoItemList = function (source, dest, onGetItem)
391 if not source then 446 if not source then
392 return 447 return
393 end 448 end
394 local numItems = 0 449 local numItems = 0
395 for index, data in ipairs(source) do 450 for index, data in ipairs(source) do
396 data.classColor = GI_profile.classColor or {r = 0.7, g = 0.7, b =0.7} 451 data.classColor = GI_profile.classColor or defaultClassColor
397 data.profileKey = GI_profileKey 452 data.profileKey = GI_profileKey
398 data.isMine = GI_isMine 453 data.isMine = GI_isMine
399 if onGetItem then 454 if onGetItem then
400 onGetItem(data) 455 onGetItem(data)
401 end 456 end
410 GI_currentTime = time() 465 GI_currentTime = time()
411 466
412 for key, sortedItems in pairs(self.sortedItems) do 467 for key, sortedItems in pairs(self.sortedItems) do
413 wipe(sortedItems) 468 wipe(sortedItems)
414 local ptype = self.prototypes[key] 469 local ptype = self.prototypes[key]
415 print( 'object:', ptype) 470 --print( 'object:', ptype)
416 for name, profile in pairs(self.data.characters) do 471 for name, profile in pairs(self.data.characters) do
417 GI_profileKey = name 472 GI_profileKey = name
418 GI_profile = profile 473 GI_profile = profile
419 GI_isMine = (profile == self.profile) 474 GI_isMine = (profile == self.profile)
420 475 local results = DoItemList(profile[key], sortedItems, ptype.OnGetItem)
421 local results = GetItemList(profile[key], sortedItems, ptype.OnGetItem) 476 --print(' - ', name, results, 'items')
422 print(' - ', name, results, 'items')
423
424 end 477 end
425 478
426 if ptype.SortHandler then 479 if ptype.SortHandler then
427 print(' sorting', key, #sortedItems) 480 sort(sortedItems, ptype.SortHandler)
428 table.sort(sortedItems, ptype.SortHandler) 481 end
429 end 482 end
430 end
431 end
432
433
434
435 function core:UpdateItems ()
436 end 483 end
437 484
438 function MissionsHandler:OnComplete() 485 function MissionsHandler:OnComplete()
439 self.data.isComplete = true 486 self.isComplete = true
440 self:Refresh() 487 self:Refresh()
441 end 488 end
442 489
443 local GetTimeLeftString = function(timeLeft)
444
445 local days = floor(timeLeft/(24*3600))
446 local hours = floor(mod(timeLeft, (24*3600)) / 3600)
447 local minutes = floor(mod(timeLeft, 3600) / 60)
448 local seconds = mod(timeLeft, 60)
449 if days >= 1 then
450 return (days .. 'd' .. ' ') .. ((hours > 0) and (hours .. 'h ') or '')
451 else
452 return ((hours > 0) and (hours .. 'h ') or '') .. ((minutes > 0) and (minutes .. ' min') or '')
453 end
454 end
455
456 function MissionsHandler:OnUpdate() 490 function MissionsHandler:OnUpdate()
457 if self.data.isComplete then 491 if self.isComplete then
458 return 492 return
459 end 493 end
460 494
461 if self.missionEndTime then 495 if self.missionEndTime then
462 local timeLeft = self.missionEndTime - time() 496 local timeLeft = self.missionEndTime - time()
475 else 509 else
476 self.TimeLeft:SetText(self.missionEndTime) 510 self.TimeLeft:SetText(self.missionEndTime)
477 end 511 end
478 end 512 end
479 513
480 local SetClassColors = function(self, data) 514 function MissionsHandler:Refresh()
481 515
482 if self.lastProfile ~= data.profileKey then
483 self.Owner:SetText(data.profileKey)
484 self.Owner:SetTextColor(data.classColor.r, data.classColor.g, data.classColor.b)
485 else
486 self.Owner:SetText(nil)
487 end
488 self.Background:SetColorTexture(data.classColor.r, data.classColor.g, data.classColor.b,
489 (data.isComplete and 0.5 or 0.1))
490 end
491
492 function MissionsHandler:Refresh(data)
493 data = data or self.data
494 self.data = data
495
496 self.isComplete = data.isComplete
497 self.missionEndTime = data.missionEndTime
498 516
499 local r,g,b = 1, 1, 1 517 local r,g,b = 1, 1, 1
500 if data.isRare then 518 if self.isRare then
501 r,g,b = 0.1, 0.4, 1 519 r,g,b = 0.1, 0.4, 1
502 end 520 end
503 521
504 522
505 --self.missionData = data 523 --self.missionData = data
506 self.Label:SetText(data.name) 524 self.Label:SetText(self.name)
507 self.Label:SetTextColor(r, g, b) 525 self.Label:SetTextColor(r, g, b)
508 526
509 if #data.rewards >= 1 then 527 if #self.rewards >= 1 then
510 self.Icon:SetTexture(data.rewards[1].icon or GetItemIcon(data.rewards[1].itemID)) 528 self.Icon:SetTexture(self.rewards[1].icon or GetItemIcon(self.rewards[1].itemID))
511 self.rewardInfo = data.rewards[1] 529 self.rewardInfo = self.rewards[1]
512 else 530 else
513 self.Icon:SetAtlas(data.typeAtlas, false) 531 self.Icon:SetAtlas(self.typeAtlas, false)
514 end 532 end
515 if self.isComplete then 533 if self.isComplete then
516 self.TimeLeft:SetText('Complete!') 534 self.TimeLeft:SetText('Complete!')
517 end 535 end
518 SetClassColors(self, data) 536
537 self.Background:SetAlpha(self.isComplete and 1 or 0.1)
519 end 538 end
520 539
521 540
522 function MissionsHandler:OnEnter() 541 function MissionsHandler:OnEnter()
523 if self.rewardInfo and self.rewardInfo.itemID then 542 if self.rewardInfo and self.rewardInfo.itemID then
532 end 551 end
533 end 552 end
534 553
535 554
536 555
537 function ShipmentsHandler:Refresh(data) 556 function ShipmentsHandler:Refresh()
538 data = data or self.data
539 557
540 --[[ 558 --[[
541 self.icon = data.icon 559 self.icon = data.icon
542 self.shipmentCapacity = data.shipmentCapacity 560 self.shipmentCapacity = data.shipmentCapacity
543 self.shipmentsReady = data.shipmentsReady 561 self.shipmentsReady = data.shipmentsReady
558 itemQuality = itemQuality, 576 itemQuality = itemQuality,
559 itemID = itemID 577 itemID = itemID
560 578
561 --]] 579 --]]
562 580
563 self.Icon:SetTexture(data.icon) 581 self.Icon:SetTexture(self.icon)
564 self.data = data 582
565 583 self.Name:SetText(self.name)
566 584 self.Count:SetText(self.shipmentsReady)
567 local isComplete = data.isComplete 585 self.Done:SetShown(self.shipmentsReady and (self.shipmentsReady >= 1))
568
569
570
571 self.Name:SetText(data.shipmentType .. data.name)
572 self.Count:SetText(data.shipmentsReady)
573 self.Done:SetShown(data.shipmentsReady and (data.shipmentsReady >= 1))
574 586
575 587
576 -- flag as complete 588 -- flag as complete
577 if ( data.shipmentsReady == data.shipmentsTotal ) and (not data.isBeingResearched) then 589 if ( self.shipmentsReady == self.shipmentsTotal ) and (not self.isBeingResearched) then
578 self.Swipe:SetCooldownUNIX(0, 0); 590 self.Swipe:SetCooldownUNIX(0, 0);
579 self.Done:Show(); 591 self.Done:Show();
580 isComplete = true 592 self.isComplete = true
581 else 593 else
582 self.Swipe:SetCooldownUNIX(data.creationTime or 0 , data.duration or 0); 594 self.Swipe:SetCooldownUNIX(self.creationTime or 0 , self.duration or 0);
583 end 595 end
584 596
585 data.isComplete = isComplete 597 local hasPickups = (self.isComplete or (self.shipmentsTotal and (self.shipmentsReady > 0)))
586 598 self.Background:SetAlpha(hasPickups and 1 or 0.1)
587 SetClassColors(self, data) 599 end
588 end 600 local time = time
589 function ShipmentsHandler:OnUpdate() 601 function ShipmentsHandler:OnUpdate()
590 local data = self.data 602
591 if (data.shipmentsReady and data.shipmentsTotal) and (data.shipmentsReady ~= data.shipmentsTotal) then 603 if (self.shipmentsReady and self.shipmentsTotal) and (self.shipmentsReady ~= self.shipmentsTotal) then
592 local timeLeft = data.creationTime + data.duration - time() 604 local timeLeft = self.creationTime + self.duration - time()
593 self.TimeLeft:SetText('Next: '.. GetTimeLeftString(timeLeft) .. ' |cFFFFFF00'..data.shipmentsTotal..' orders|r') 605 self.TimeLeft:SetText('Next: '.. GetTimeLeftString(timeLeft) .. ' |cFFFFFF00'..self.shipmentsTotal..' orders|r')
594 elseif data.isStale then 606 elseif self.isStale then
595 self.TimeLeft:SetText('|cFFFF0000Needs refresh|r') 607 self.TimeLeft:SetText('|cFFFF0000Needs refresh|r')
596 elseif data.isBeingResearched then 608 elseif self.isBeingResearched then
597 self.TimeLeft:SetText(GetTimeLeftString(data.researchStartTime + data.researchDuration - time())) 609 self.TimeLeft:SetText(GetTimeLeftString(self.researchStartTime + self.researchDuration - time()))
598 else 610 else
599 self.TimeLeft:SetText('Complete!') 611 self.TimeLeft:SetText('Complete!')
600 end 612 end
601 613
602 end 614 end
603 615
604 function ShipmentsHandler:OnEnter() 616 function ShipmentsHandler:OnEnter()
605 local data = self.data 617
606 if ( data.shipmentsReady and data.shipmentsTotal ) then 618 if ( self.shipmentsReady and self.shipmentsTotal ) then
607 GameTooltip:SetOwner(self, 'ANCHOR_LEFT') 619 GameTooltip:SetOwner(self, 'ANCHOR_LEFT')
608 GameTooltip:AddLine(data.shipmentsReady .. ' of '.. data.shipmentsTotal) 620
621 GameTooltip:AddLine(self.Owner:GetText(), self.Owner:GetTextColor())
622 GameTooltip:AddLine(self.shipmentType)
623 GameTooltip:AddLine(self.shipmentsReady .. ' of '.. self.shipmentsTotal)
609 GameTooltip:Show() 624 GameTooltip:Show()
610 end 625 end
611 end 626 end
612 627
613 function ShipmentsHandler:OnLeave() 628 function ShipmentsHandler:OnLeave()
616 end 631 end
617 end 632 end
618 633
619 function ShipmentsHandler:OnClick(button) 634 function ShipmentsHandler:OnClick(button)
620 if button == 'RightButton' then 635 if button == 'RightButton' then
621 for name, profile in pairs(ClassOrderPlan.data) do 636 self.handler:FreeBlock(self)
622 for index, shipment in pairs(profile.shipments) do 637 end
623 if shipment == self.data then 638 end
624 profile.shipments[index] = nil
625 ClassOrderPlan:Refresh()
626 end
627 end
628 end
629 end
630 end