# HG changeset patch
# User Nenue
# Date 1476539696 14400
# Node ID c006ce87a14775c8bdaa3f0398d0048de9a5c454
# Parent b8a19781f79b2d4c8df82bb3875a29459d16926c
prototype structure
diff -r b8a19781f79b -r c006ce87a147 ClassPlan.lua
--- a/ClassPlan.lua Thu Oct 13 09:08:38 2016 -0400
+++ b/ClassPlan.lua Sat Oct 15 09:54:56 2016 -0400
@@ -1,6 +1,9 @@
local wipe = table.wipe
local pairs, ipairs = pairs, ipairs
local GetTime = GetTime
+local GI_currentTime = time()
+
+
local blockTemplate = {
point = 'TOPLEFT',
relativePoint ='TOPLEFT',
@@ -9,260 +12,98 @@
SLASH_CLASSPLAN1 = "/classplan"
SLASH_CLASSPLAN2 = "/cp"
SlashCmdList.CLASSPLAN = function(args)
- if ClassOrderPlan:IsVisible() then
- ClassOrderPlan:Hide()
- else
- ClassOrderPlan:Show()
- DEFAULT_CHAT_FRAME:AddMessage('|cFF88FF00WorldPlan|r: Order Hall Panel')
+ ClassOrderPlan:Toggle()
+end
+
+ClassOrderPlanCore = {
+ events = {},
+ freeBlocks = {},
+ blocks = {},
+ sortedItems = {},
+ timers = {},
+ shipments = {},
+ playerFirst = false,
+ prototypes = {}
+}
+ClassPlanBlockMixin = {
+ templateName = 'ClassPlanBlock',
+ events = {'GARRISON_MISSION_LIST_UPDATE', 'GARRISON_MISSION_FINISHED', 'GARRISON_MISSION_FINISHED'},}
+ClassPlanShipmentMixin = {
+ templateName = 'ClassPlanShipment',
+ parent = false,
+ point = 'TOPRIGHT',
+ relativePoint ='TOPRIGHT',
+ events = {'GARRISON_LANDINGPAGE_SHIPMENTS', 'GARRISON_TALENT_UPDATE', "GARRISON_TALENT_COMPLETE", 'GARRISON_TALENT_COMPLETE', 'GARRISON_SHIPMENT_RECEIVED', "GARRISON_SHIPMENT_RECEIVED"},
+}
+setmetatable(ClassPlanShipmentMixin, {__index = ClassPlanBlockMixin})
+local core, MissionsHandler, ShipmentsHandler = ClassOrderPlanCore, ClassPlanBlockMixin, ClassPlanShipmentMixin
+local print = DEVIAN_WORKSPACE and function(...) print('ClassPlan', ...) end or nop
+
+
+
+MissionsHandler.GetPlayerData = function(self)
+ if not self.profile then
+ return
+ end
+ self.items = C_Garrison.GetLandingPageItems(LE_GARRISON_TYPE_7_0)
+
+ if #self.items >= 1 then
+ wipe(self.profile.missions)
+ for index, data in ipairs(self.items) do
+ print(' ',data.name, '|cFF00FF00'.. data.timeLeft .. '|r', date("%A %I:%m %p", data.missionEndTime))
+ tinsert(self.profile.missions, data)
+ end
+ print('items update pending')
+ self.isStale = true
+ end
+
+ if self:IsVisible() then
+ self:Refresh()
end
end
-ClassOrderPlanCore = {
- freeBlocks = {},
- blocks = {},
- shipmentBlocks = {},
- freeShipmentBlocks = {},
- sortedShipments = {},
- sortedMissions = {},
- timers = {},
- shipments = {},
- playerFirst = false,
- templates = setmetatable({}, {
- __newindex = function(t,k ,v)
- if type(v) == 'table' then
- setmetatable(v, {__index = blockTemplate})
- rawset(t,k,v)
+MissionsHandler.SortHandler = function (a,b)
+ local result = false
+ if not a or not b then
+ result = true
+ else
+ if (a.isMine ~= b.isMine) then
+ result = a.isMine
+ else
+ if (not b.missionEndTime) or (not a.missionEndTime) then
+ print('missing article', b.missionEndTime, a.missionEndTime)
end
+ result = ( b.missionEndTime > a.missionEndTime)
end
- })
-}
-ClassPlanBlockMixin = {}
-ClassPlanShipmentMixin = setmetatable({}, {__index = ClassPlanBlockMixin})
-local core, block, shipment = ClassOrderPlanCore, ClassPlanBlockMixin, ClassPlanShipmentMixin
-local print = DEVIAN_WORKSPACE and function(...) print('ClassPlan', ...) end or nop
-
-
-
-function core:OnLoad ()
- self:RegisterUnitEvent('UNIT_PORTRAIT_UPDATE', 'player')
- self:RegisterEvent('PLAYER_LOGIN')
- self:RegisterEvent('PLAYER_ENTERING_WORLD')
- self:RegisterEvent('PLAYER_REGEN_ENABLED')
-
- self:RegisterEvent('GARRISON_MISSION_LIST_UPDATE')
- self:RegisterEvent('GARRISON_MISSION_FINISHED')
- self:RegisterEvent("GARRISON_LANDINGPAGE_SHIPMENTS");
- self:RegisterEvent("GARRISON_SHIPMENT_RECEIVED");
- self:RegisterEvent("GARRISON_TALENT_UPDATE");
- self:RegisterEvent("GARRISON_TALENT_COMPLETE");
+ end
+ return result
end
-core.templates.ClassPlanBlock = {
- SetItemData = function(block, data)
- block.isComplete = data.isComplete
- block.missionEndTime = data.missionEndTime
- end
-}
-core.templates.ClassPlanShipment = {
+ShipmentsHandler.OnGetItem = function(data)
+ if data.shipmentsTotal then
+ local timeLeft = data.creationTime + data.duration - GI_currentTime
+ if (timeLeft <= 0) and (data.shipmentsReady < data.shipmentsTotal) then
+ local numOrders = -1*floor(timeLeft/data.duration)
- parent = false,
- point = 'TOPRIGHT',
- relativePoint ='TOPRIGHT',
- SetItemData = function(block, data)
- block.icon = data.icon
- block.shipmentCapacity = data.shipmentCapacity
- block.shipmentsReady = data.shipmentsReady
- block.shipmentsTotal = data.shipmentsTotal
- block.creationTime = data.creationTime
- block.duration = data.duration
- block.itemID = data.itemID
- block.itemQuality = data.itemQuality
- --[[
- icon = texture,
- shipmentCapacity = shipmentCapacity,
- shipmentsReady = shipmentsReady,
- shipmentsTotal = shipmentsTotal,
- creationTime = creationTime,
- duration = duration,
- timeleftString = timeleftString,
- itemName = itemName,
- itemIcon = itemIcon,
- itemQuality = itemQuality,
- itemID = itemID
+ data.originalCreationTime = data.creationTime
+ data.originalShipmentsReady = data.shipmentsReady
- --]]
- end
-}
-
-function core:OnEvent (event, ...)
- print(event)
- if event == 'UNIT_PORTRAIT_UPDATE' then
- SetPortraitTexture(self.portrait, 'player')
- elseif event == 'PLAYER_LOGIN' then
- if not self.initialized then
- if IsLoggedIn() then
- WorldPlanData.OrderHall = WorldPlanData.OrderHall or {}
- self.data = WorldPlanData.OrderHall
-
-
- local name, realm = UnitName('player')
- realm = realm or GetRealmName()
- self.profileKey = name .. '-' .. realm
- if not self.data[self.profileKey] then
- self.data[self.profileKey] = {}
- end
- self.profile = self.data[self.profileKey]
-
- self.profile.shipments = self.profile.shipments or {}
- self.profile.missions = self.profile.missions or {}
- self.profile.classColor = RAID_CLASS_COLORS[select(2, UnitClass('player'))]
-
- C_Garrison.RequestLandingPageShipmentInfo();
- self.initialized = true
- end
- end
- elseif event == 'GARRISON_LANDINGPAGE_SHIPMENTS' or event == 'GARRISON_TALENT_UPDATE' then
- self:UpdateShipments()
- elseif event == 'PLAYER_REGEN_ENABLED' or event == 'GARRISON_MISSION_FINISHED' or event == 'GARRISON_TALENT_COMPLETE' or event == 'GARRISON_SHIPMENT_RECEIVED' then
- self:UpdateNotifications()
- else
- self:UpdateItems ()
- end
-end
-
-function core:UpdateNotifications()
-end
-
-function core:RefreshItems(sortedItems, templateName)
- self.blocks[templateName] = self.blocks[templateName] or {}
- local blocks = self.blocks[templateName]
- local template = self.templates[templateName] or {
- parent = self.portrait,
- point = 'TOPLEFT',
- relativePoint ='TOPRIGHT',
- }
-
- local lastProfile
- local numItems = #sortedItems
- for i, data in ipairs(sortedItems) do
- local block = blocks[i]
-
- if not block then
- block = CreateFrame('Frame', nil, self, templateName)
- block:SetID(i)
- template.numBlocks = (template.numBlocks or 0) + 1
-
- if template.lastBlock then
- block:SetPoint('TOPLEFT', template.lastBlock, 'BOTTOMLEFT', 0, 0)
- else
- block:SetPoint(template.point, self[template.parent] or self, template.relativePoint, 0, 0)
- end
- template.lastBlock = block
- blocks[i] = block
- end
-
- if template.SetItemData then
- template.SetItemData(block, data)
- end
-
-
- block.lastProfile = lastProfile
- block:Refresh(data)
- block:Show()
- lastProfile = data.profileKey
- end
-
- for i = numItems + 1, template.numBlocks do
- if blocks[i] then
- blocks[i]:Hide()
+ data.creationTime = data.creationTime + numOrders*data.duration
+ data.shipmentsReady = data.shipmentsReady + numOrders
+ print(data.profileKey, 'shipment "'.. data.name..'" reconciling', numOrders, 'lapsed orders. -->', data.creationTime, data.shipmentsReady)
end
end
end
-function core:Refresh()
- if self.isStale then
- self:SortLists()
+ShipmentsHandler.SortHandler = function(a, b)
+ if b.isComplete ~= a.isComplete then
+ return a.isComplete and true or false
end
- self.isStale = nil
-
- self:RefreshItems(self.sortedMissions, 'ClassPlanBlock')
- self:RefreshItems(self.sortedShipments, 'ClassPlanShipment')
-
-
- local posX = self.data.posX or 0
- local posY = self.data.posY or -24
- local point = self.point or 'TOP'
- local relativePoint = self.point or 'TOP'
- self:SetPoint(point, UIParent, relativePoint, posX, posY)
-
-
+ return (a.creationTime) < (b.creationTime)
end
-function core:OnUpdate()
- if self.fadeTimer and self.fadeTimer < GetTime() then
- self:Hide()
- end
-end
-
-function core:OnShow()
- if self.isStale then
- print('updating items on show')
- self:Refresh()
- end
-
-end
-
-function core:SortLists()
-
- wipe(self.sortedShipments)
- wipe(self.sortedMissions)
- for name, profile in pairs(self.data) do
- local isMine = (profile == self.profile)
- for index, data in pairs(profile.missions) do
-
- data.classColor = profile.classColor or {r = 0.7, g = 0.7, b =0.7}
- data.profileKey = name
- data.isMine = (profile == self.profile)
- tinsert(self.sortedMissions, data)
- end
-
- if not profile.shipments then
- profile.shipments = {}
- profile.shipment = nil
- end
-
- for index, data in pairs(profile.shipments) do
- data.classColor = profile.classColor or {r = 0.7, g = 0.7, b =0.7}
- data.profileKey = name
- data.isMine = (profile == self.profile)
- tinsert(self.sortedShipments, data)
- end
- end
-
- table.sort(self.sortedMissions, function (a,b)
- local result = false
- if not a or not b then
- result = true
- else
- if (a.isMine ~= b.isMine) and self.playerFirst then
- result = a.isMine
- else
- if (not b.missionEndTime) or (not a.missionEndTime) then
- print('missing article', b.missionEndTime, a.missionEndTime)
- end
- result = ( b.missionEndTime > a.missionEndTime)
- end
- end
-
- --print('cmp', (b and (b.missionEndTime .. ' ' .. tostring(b.isMine)) or '-'), '>', (a and (a.missionEndTime .. ' ' .. tostring(a.isMine)) or '-'), result, n)
- return result
- end)
-
-end
-
-function core:UpdateShipments()
- print('|cFF0088FFShipments|r:', self.profileKey)
+ShipmentsHandler.GetPlayerData = function (self)
if not self.profile then
return
end
@@ -272,10 +113,9 @@
local garrisonType = LE_GARRISON_TYPE_7_0
local buildings = C_Garrison.GetBuildings(garrisonType);
local shipmentIndex = 0
- print('Buildings:')
+ --print('Buildings:')
for i = 1, #buildings do
local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID = C_Garrison.GetLandingPageShipmentInfo(buildingID);
- print(buildings[i], name, creationTime, duration)
tinsert(self.shipments,
{
shipmentType = 'Work Order',
@@ -294,11 +134,10 @@
})
end
- print('Follower:')
+ --print('Follower:')
local followerShipments = C_Garrison.GetFollowerShipments(garrisonType);
for i = 1, #followerShipments do
local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, _, _, _, _, followerID = C_Garrison.GetLandingPageShipmentInfoByContainerID(followerShipments[i]);
- print(followerShipments[i], name, creationTime, duration)
tinsert(self.shipments,
{
shipmentType = '',
@@ -314,11 +153,10 @@
})
end
- print('Loose:')
+ --print('Loose:')
local looseShipments = C_Garrison.GetLooseShipments(garrisonType)
for i = 1, #looseShipments do
local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString = C_Garrison.GetLandingPageShipmentInfoByContainerID(looseShipments[i]);
- print(looseShipments[i], name, creationTime, duration)
tinsert(self.shipments,
{
shipmentType = '',
@@ -336,7 +174,7 @@
local talentTrees = C_Garrison.GetTalentTrees(garrisonType, select(3, UnitClass("player")));
-- this is a talent that has completed, but has not been seen in the talent UI yet.
local completeTalentID = C_Garrison.GetCompleteTalent(garrisonType);
- print('Talents:')
+ --print('Talents:')
if (talentTrees) then
for treeIndex, tree in ipairs(talentTrees) do
for talentIndex, talent in ipairs(tree) do
@@ -361,9 +199,11 @@
self.profile.shipments = self.profile.shipments or {}
if #self.shipments >= 1 then
+
wipe(self.profile.shipments)
- for index, shipment in ipairs(self.shipments) do
- tinsert(self.profile.shipments, shipment)
+ for index, data in ipairs(self.shipments) do
+ print(' ', data.shipmentType .. data.name, data.creationTime, data.duration)
+ tinsert(self.profile.shipments, data)
end
self.isStale = true
end
@@ -373,34 +213,230 @@
end
end
-function core:UpdateItems ()
- if not self.profile then
- return
+function core:OnLoad ()
+ self:RegisterUnitEvent('UNIT_PORTRAIT_UPDATE', 'player')
+ self:RegisterEvent('PLAYER_LOGIN')
+ self:RegisterEvent('PLAYER_ENTERING_WORLD')
+ self:RegisterEvent('ADDON_LOADED')
+ self:RegisterEvent('PLAYER_REGEN_ENABLED')
+
+ self:AddHandler('missions', MissionsHandler)
+ self:AddHandler('shipments', ShipmentsHandler)
+end
+
+function core:AddHandler(name, prototype)
+ self.prototypes[name] = setmetatable(prototype, {
+ __index = blockTemplate,
+ __tostring = function() return name end
+ })
+
+ for i, event in ipairs(prototype.events) do
+ if not self.events[event] then
+ self:RegisterEvent(event)
+ self.events[event] = {}
+ print('|cFF00FF00registering', event)
+ end
+
+ prototype.numBlocks = 0
+ if not self.events[event][name] then
+ print('adding', name, 'to', event)
+ self.events[event][name] = prototype.GetPlayerData
+ end
end
- self.items = C_Garrison.GetLandingPageItems(LE_GARRISON_TYPE_7_0)
+ self.sortedItems[name] = {}
+end
+function core:OnEvent (event, ...)
+ print(event)
+ if event == 'UNIT_PORTRAIT_UPDATE' then
+ SetPortraitTexture(self.portrait, 'player')
+ elseif event == 'PLAYER_LOGIN' then
+ if not self.initialized then
+ if IsLoggedIn() then
+ WorldPlanData.OrderHall = WorldPlanData.OrderHall or {}
+ self.data = WorldPlanData.OrderHall
+ local name, realm = UnitName('player')
+ realm = realm or GetRealmName()
+ self.profileKey = name .. '-' .. realm
+ if not self.data[self.profileKey] then
+ self.data[self.profileKey] = {}
+ end
+ self.profile = self.data[self.profileKey]
- print('|cFF0088FFLandingPageItems|r:', self.profileKey)
- if #self.items >= 1 then
- wipe(self.profile.missions)
- for index, data in ipairs(self.items) do
- print('', data.name)
- print(' |cFF00FF00', data.timeLeft .. '|r', date("%A %I:%m %p", data.missionEndTime))
- tinsert(self.profile.missions, data)
+ self.profile.shipments = self.profile.shipments or {}
+ self.profile.missions = self.profile.missions or {}
+ self.profile.classColor = RAID_CLASS_COLORS[select(2, UnitClass('player'))]
+
+ C_Garrison.RequestLandingPageShipmentInfo();
+
+ if self.data.IsShown then
+ self:Show()
+ end
+ self.initialized = true
+ end
end
- print('items update pending')
- self.isStale = true
- end
-
- if self:IsVisible() then
- self:Refresh()
+ elseif self.events[event] then
+ for ptype, eventFunc in pairs(self.events[event]) do
+ print('|cFF88FF00' .. tostring(ptype) .. '|r:GetPlayerData()')
+ eventFunc(self, event)
+ end
end
end
-function block:OnComplete()
- self.isComplete = true
+function core:UpdateNotifications()
+end
+
+function core:RefreshItems(configKey, prototype)
+ local sortedItems = self.sortedItems[configKey]
+
+ self.blocks[configKey] = self.blocks[configKey] or {}
+ local blocks = self.blocks[configKey]
+
+ local lastProfile
+ local numItems = #sortedItems
+ local totalHeight = 0
+ for i, data in ipairs(sortedItems) do
+ local block = blocks[i]
+
+ if not block then
+ block = CreateFrame('Button', nil, self, prototype.templateName)
+ block:SetID(i)
+ prototype.numBlocks = prototype.numBlocks + 1
+
+ if prototype.lastBlock then
+ block:SetPoint('TOPLEFT', prototype.lastBlock, 'BOTTOMLEFT', 0, 0)
+ else
+ block:SetPoint(prototype.point, self[prototype.parent] or self, prototype.relativePoint, 0, 0)
+ end
+ prototype.lastBlock = block
+ blocks[i] = block
+ end
+
+ totalHeight = totalHeight + block:GetHeight()
+ block.lastProfile = lastProfile
+ block:Refresh(data)
+ block:Show()
+ lastProfile = data.profileKey
+ end
+
+ for i = numItems + 1, prototype.numBlocks do
+ if blocks[i] then
+ blocks[i]:Hide()
+ end
+ end
+
+ return totalHeight
+end
+local max = math.max
+function core:Refresh()
+ if self.isStale then
+ self:SortItems()
+ end
+ self.isStale = nil
+
+ self.currentHeight = 0
+ for name, info in pairs(self.prototypes) do
+ local itemsHeight = self:RefreshItems(name, info)
+ self.currentHeight = max(itemsHeight, self.currentHeight)
+ end
+
+ if OrderHallCommandBar and OrderHallCommandBar:IsVisible() then
+ self:ClearAllPoints()
+ self:SetPoint('TOP', OrderHallCommandBar, 'BOTTOM')
+ else
+
+ local posX = self.data.posX or 0
+ local posY = self.data.posY or -24
+ local point = self.point or 'TOP'
+ local relativePoint = self.point or 'TOP'
+ self:SetPoint(point, UIParent, relativePoint, posX, posY)
+ end
+
+ self:SetHeight(self.currentHeight)
+end
+
+function core:Toggle()
+ if self:IsVisible() then
+ self:Hide()
+ else
+ self:Show()
+ end
+
+ if self.data then
+ self.data.IsShown = self:IsVisible()
+ end
+end
+
+function core:OnUpdate()
+ if self.fadeTimer and self.fadeTimer < GetTime() then
+ self:Hide()
+ end
+end
+
+function core:OnShow()
+ if self.isStale then
+ print('updating items on show')
+ self:Refresh()
+ end
+ ClassPlanButton:SetPoint('TOP', self, 'TOP', 0, 0)
+end
+function core:OnHide()
+ ClassPlanButton:SetPoint('TOP', UIParent, 'TOP', 0, 0)
+end
+
+local GI_profileKey, GI_profile, GI_isMine
+local GetItemList = function (source, dest, onGetItem)
+ if not source then
+ return
+ end
+ local numItems = 0
+ for index, data in ipairs(source) do
+ data.classColor = GI_profile.classColor or {r = 0.7, g = 0.7, b =0.7}
+ data.profileKey = GI_profileKey
+ data.isMine = GI_isMine
+ if onGetItem then
+ onGetItem(data)
+ end
+ numItems = numItems + 1
+ tinsert(dest, data)
+ end
+ return numItems
+end
+
+function core:SortItems()
+ print('|cFF0088FFSortItems()|r')
+ GI_currentTime = time()
+
+ for key, sortedItems in pairs(self.sortedItems) do
+ wipe(sortedItems)
+ local ptype = self.prototypes[key]
+ print( 'object:', ptype)
+ for name, profile in pairs(self.data.characters) do
+ GI_profileKey = name
+ GI_profile = profile
+ GI_isMine = (profile == self.profile)
+
+ local results = GetItemList(profile[key], sortedItems, ptype.OnGetItem)
+ print(' - ', name, results, 'items')
+
+ end
+
+ if ptype.SortHandler then
+ print(' sorting', key, #sortedItems)
+ table.sort(sortedItems, ptype.SortHandler)
+ end
+ end
+end
+
+
+
+function core:UpdateItems ()
+end
+
+function MissionsHandler:OnComplete()
+ self.data.isComplete = true
self:Refresh()
end
@@ -417,8 +453,8 @@
end
end
-function block:OnUpdate()
- if self.isComplete then
+function MissionsHandler:OnUpdate()
+ if self.data.isComplete then
return
end
@@ -453,10 +489,13 @@
(data.isComplete and 0.5 or 0.1))
end
-function block:Refresh(data)
+function MissionsHandler:Refresh(data)
data = data or self.data
self.data = data
+ self.isComplete = data.isComplete
+ self.missionEndTime = data.missionEndTime
+
local r,g,b = 1, 1, 1
if data.isRare then
r,g,b = 0.1, 0.4, 1
@@ -473,23 +512,21 @@
else
self.Icon:SetAtlas(data.typeAtlas, false)
end
-
- SetClassColors(self, data)
-
if self.isComplete then
self.TimeLeft:SetText('Complete!')
end
+ SetClassColors(self, data)
end
-function block:OnEnter()
+function MissionsHandler:OnEnter()
if self.rewardInfo and self.rewardInfo.itemID then
GameTooltip:SetOwner(self, 'ANCHOR_LEFT')
GameTooltip:SetItemByID(self.rewardInfo.itemID)
GameTooltip:Show()
end
end
-function block:OnLeave()
+function MissionsHandler:OnLeave()
if GameTooltip:IsOwned(self) then
GameTooltip:Hide()
end
@@ -497,55 +534,65 @@
-function shipment:Refresh(data)
+function ShipmentsHandler:Refresh(data)
data = data or self.data
+
+ --[[
+ self.icon = data.icon
+ self.shipmentCapacity = data.shipmentCapacity
+ self.shipmentsReady = data.shipmentsReady
+ self.shipmentsTotal = data.shipmentsTotal
+ self.creationTime = data.creationTime
+ self.duration = data.duration
+ self.itemID = data.itemID
+ self.itemQuality = data.itemQuality
+ icon = texture,
+ shipmentCapacity = shipmentCapacity,
+ shipmentsReady = shipmentsReady,
+ shipmentsTotal = shipmentsTotal,
+ creationTime = creationTime,
+ duration = duration,
+ timeleftString = timeleftString,
+ itemName = itemName,
+ itemIcon = itemIcon,
+ itemQuality = itemQuality,
+ itemID = itemID
+
+ --]]
+
self.Icon:SetTexture(data.icon)
self.data = data
+
+ local isComplete = data.isComplete
+
+
+
self.Name:SetText(data.shipmentType .. data.name)
self.Count:SetText(data.shipmentsReady)
-
self.Done:SetShown(data.shipmentsReady and (data.shipmentsReady >= 1))
- if ( data.shipmentsReady == data.shipmentsTotal ) then
+
+ -- flag as complete
+ if ( data.shipmentsReady == data.shipmentsTotal ) and (not data.isBeingResearched) then
self.Swipe:SetCooldownUNIX(0, 0);
self.Done:Show();
- if not data.isBeingResearched then
- data.isComplete = true
- end
+ isComplete = true
else
self.Swipe:SetCooldownUNIX(data.creationTime or 0 , data.duration or 0);
end
-
+ data.isComplete = isComplete
SetClassColors(self, data)
end
-function shipment:UpdateShipment()
-
- local data = self.data
- if data.shipmentsTotal then
- local timeLeft = data.creationTime + data.duration - time()
- if timeLeft < 0 then
- local numReady = floor((1*timeLeft) / data.duration)
- data.shipmentsReady = data.shipmentsReady + numReady
- data.creationTime = data.creationTime + (numReady * data.duration)
- self:Refresh()
- end
- end
-end
-function shipment:OnUpdate()
+function ShipmentsHandler:OnUpdate()
local data = self.data
if (data.shipmentsReady and data.shipmentsTotal) and (data.shipmentsReady ~= data.shipmentsTotal) then
local timeLeft = data.creationTime + data.duration - time()
- if timeLeft < 0 then
- self:UpdateShipment()
- return
- end
-
self.TimeLeft:SetText('Next: '.. GetTimeLeftString(timeLeft) .. ' |cFFFFFF00'..data.shipmentsTotal..' orders|r')
-
-
+ elseif data.isStale then
+ self.TimeLeft:SetText('|cFFFF0000Needs refresh|r')
elseif data.isBeingResearched then
self.TimeLeft:SetText(GetTimeLeftString(data.researchStartTime + data.researchDuration - time()))
else
@@ -554,7 +601,7 @@
end
-function shipment:OnEnter()
+function ShipmentsHandler:OnEnter()
local data = self.data
if ( data.shipmentsReady and data.shipmentsTotal ) then
GameTooltip:SetOwner(self, 'ANCHOR_LEFT')
@@ -563,12 +610,21 @@
end
end
-function shipment:OnLeave()
+function ShipmentsHandler:OnLeave()
if GameTooltip:IsOwned(self) then
GameTooltip:Hide()
end
end
-function shipment:OnClick(button)
- --todo: trigger cleanup script for dead shipment data
+function ShipmentsHandler:OnClick(button)
+ if button == 'RightButton' then
+ for name, profile in pairs(ClassOrderPlan.data) do
+ for index, shipment in pairs(profile.shipments) do
+ if shipment == self.data then
+ profile.shipments[index] = nil
+ ClassOrderPlan:Refresh()
+ end
+ end
+ end
+ end
end
\ No newline at end of file
diff -r b8a19781f79b -r c006ce87a147 ClassPlan.xml
--- a/ClassPlan.xml Thu Oct 13 09:08:38 2016 -0400
+++ b/ClassPlan.xml Sat Oct 15 09:54:56 2016 -0400
@@ -15,6 +15,7 @@
+
@@ -29,7 +30,36 @@
-
+
+
+
-
+
\ No newline at end of file