diff ClassPlan.lua @ 35:26dfa661daa7

WorldPlan: - Quest pins will appear in the flight map. They follow the filter settings applied from the world map. - Reward filter toggle changed to clear out other reward filters. The assumption being that one is most often looking only for that particular type of quest when they go to use it. - Fixed filter bar info falling out of sync after player-triggered world map updates. - Code stuff: -- Quest pin shown-state management makes better use of OnShow OnHide handlers, SetShown is toggled and it all goes from there -- WorldQuests module re-factored outside of the top level frame script. ClassPlan: - Available missions are now recorded; the mission list can be toggled between in-progress and available by clicking the heading.
author Nenue
date Thu, 03 Nov 2016 17:29:15 -0400
parents e8679ecb48d8
children 589c444d4837
line wrap: on
line diff
--- a/ClassPlan.lua	Wed Nov 02 19:04:47 2016 -0400
+++ b/ClassPlan.lua	Thu Nov 03 17:29:15 2016 -0400
@@ -38,6 +38,7 @@
 ClassOrderPlanCore = {
   events = {},
   freeBlocks = {},
+  characterButtons = {},
   blocks = {},
   sortedItems = {},
   timers = {},
@@ -73,6 +74,7 @@
 local SharedHandlers = {
   numBlocks = 0,
   isStale = true,
+  maxItems = 10
 }
 local SharedEntry = {}
 local ShipmentEntry = {}
@@ -122,6 +124,8 @@
   self.Background:SetColorTexture(classColor.r, classColor.g, classColor.b, 0.5)
   self.profile.classColor = classColor
   self.profile.className = className
+  self.profile.characterName = name
+  self.profile.characterRealm = realm
   return self.profile
 end
 
@@ -189,22 +193,23 @@
         print('  |cFF00FF00'..index..' '..handler:GetName()..'|r')
         local sortedItems = handler.sortedItems
         local activeKey = handler.activeKey
+
         handler.profile = self.profile[handler.activeKey]
-
+        handler.currentTime = GI_currentTime
+        handler:GetPlayerData(self.profile)
         wipe(sortedItems)
-        handler:GetPlayerData(self.profile)
         for key, profile in pairs(self.data.characters) do
           print('profile', key, activeKey)
           local profileList = profile[activeKey]
           if profileList and #profileList >= 1 then
-            local classColor = profile.classColor or defaultClassColor
+            local classColor = profile.classColor or RAID_CLASS_COLORS['HUNTER']
             local isMine = (profile == self.profile)
             for index, data in ipairs(profileList) do
               data.classColor = classColor
               data.profileKey = key
               data.isMine = isMine
               if handler.OnGetItem then
-                handler.OnGetItem(data)
+                handler:OnGetItem(data)
               end
               tinsert(sortedItems, data)
             end
@@ -222,6 +227,37 @@
 
     end
 
+    local index = 1
+    for id, profile in pairs(self.data.characters) do
+      local button = self.characterButtons[index]
+      if not button then
+        button = CreateFrame('Button', nil, self, 'ClassOrderPlanCharacterButton')
+        button:SetID(index)
+        self.characterButtons[index] = button
+
+        if not self.lastButton then
+          button:SetPoint('BOTTOMLEFT', self, 'TOPLEFT', 0, 0)
+        else
+          button:SetPoint('BOTTOMLEFT', self.lastButton, 'BOTTOMRIGHT', 2, 0)
+        end
+        self.lastButton = button
+      end
+      if not profile.characterName then
+        profile.characterName, profile.characterRealm = id:match("%(.+)%-(.+)^")
+      end
+
+      button.className = profile.className
+      button.classColor = profile.classColor
+      button.characterName = profile.characterName
+      button.characterRealm = profile.characterRealm
+      button.hideItems = (profile.showItems == false) and (profile ~= self.profile)
+      button.isMine = (profile == self.profile)
+      button:Update()
+      button:Show()
+      index = index + 1
+    end
+
+
     self.isStale = nil
     self:Reanchor()
     self:SetHeight(self.currentHeight + CP_HEADER_SIZE)
@@ -265,6 +301,17 @@
 
   for index, frame in ipairs(self.Handlers) do
     frame:Reanchor()
+
+    local ListTab = frame.ListTab
+    if ListTab then
+      ListTab:ClearAllPoints()
+      ListTab:SetPoint('TOPLEFT', frame, 'TOPLEFT', 0, CP_HEADER_SIZE)
+      ListTab:SetPoint('BOTTOMRIGHT', frame, 'TOPRIGHT', 0, 0)
+      ListTab.Label:SetText(frame.listTitle[frame.currentListIndex])
+      ListTab:Show()
+      print(ListTab:GetSize())
+    end
+
   end
 end
 
@@ -300,6 +347,11 @@
   self.isStale = true
 end
 
+function SharedHandlers:OnMouseWheel(delta)
+  self.scrollOffset = (self.scrollOffset or 0) - ((delta > 0) and 1 or -1)
+  self:UpdateItems()
+end
+
 function SharedHandlers:RequestData()
   print('|cFF0088FF'..self:GetName()..':RequestData()')
   self.isStale = true
@@ -345,34 +397,57 @@
   self.Name:SetTextColor(data.classColor.r, data.classColor.g, data.classColor.b)
 end
 
+function SharedHandlers:Acquire(id)
+end
+function SharedHandlers:FreeBlock (block)
+end
+
 function SharedHandlers:UpdateItems()
+
+  self.MoreItemsUp:Hide()
+  self.MoreItemsDown:Hide()
+
   local sortedItems = self.sortedItems
+  local scrollOffset = self.scrollOffset or 0
+  local numItems = #sortedItems
+  if (not sortedItems[scrollOffset+1]) or (numItems <= self.maxItems) then
+    scrollOffset = 0
+  elseif (numItems > self.maxItems) and (scrollOffset > (numItems - self.maxItems)) then
+    scrollOffset = (numItems - self.maxItems)
+  end
+
 
   self.blocks = self.blocks or  {}
   local blocks = self.blocks
 
   local lastProfile
-  local numItems = #sortedItems
   local totalHeight = 0
   self.lastBlock = nil
   self.numActive = 0
-  for i, data in ipairs(sortedItems) do
+  for i = 1, self.maxItems do
+    local index = scrollOffset + i
+    local data = sortedItems[index]
+    if not data then
+      break
+    end
+
+
     local block = blocks[i]
     if not block then
       block = CreateFrame('Button', nil, self, self.templateName)
-      block:SetID(i)
       block.listType = self.activeKey
       block.handler = self
       self.numBlocks = self.numBlocks + 1
       blocks[i] = block
     end
+    block:SetID(index)
 
     print('RefreshItem', block)
     self.numActive = self.numActive + 1
 
     if self.lastBlock then
       block:SetPoint('TOPLEFT', self.lastBlock, 'BOTTOMLEFT', 0, 0)
-      print('--', i, data.isComplete, data.missionEndTime, data.name)
+      print('--', index, data.isComplete, data.missionEndTime, data.name)
     else
       block:SetPoint('TOPLEFT', 0, 0)
       print('--top')
@@ -401,12 +476,22 @@
     lastProfile = data.profileKey
   end
 
-  for i = numItems + 1, self.numBlocks do
+  if self.numActive < numItems then
+    if scrollOffset < (numItems - self.maxItems) then
+      self.MoreItemsDown:Show()
+    end
+    if scrollOffset > 0 then
+      self.MoreItemsUp:Show()
+    end
+  end
+
+  for i = self.numActive + 1, self.numBlocks do
     if blocks[i] then
       blocks[i]:Hide()
     end
   end
 
+  self.scrollOffset = scrollOffset
   self:Reanchor()
 
   return totalHeight
@@ -419,38 +504,7 @@
   self:SetPoint('BOTTOMRIGHT', -ClassOrderPlan:GetWidth()/2, 0)
 end
 
-function MissionList:Reanchor()
-  self:SetPoint('TOPRIGHT', 0, -24)
-  self:SetPoint('BOTTOMLEFT', ClassOrderPlan:GetWidth()/2, 0)
 
-  self.ListTab:ClearAllPoints()
-  self.ListTab:SetPoint('TOPLEFT', self, 'TOPLEFT', 0, CP_HEADER_SIZE)
-  self.ListTab:SetPoint('BOTTOMRIGHT', self, 'TOPRIGHT', 0, 0)
-  self.ListTab.Label:SetText(self.listTitle[self.currentListIndex])
-  self.ListTab:Show()
-  print(self.ListTab:GetSize())
-end
-
-function MissionList:GetPlayerData (profile)
-  wipe(profile.missions)
-  wipe(profile.available)
-
-  local items = C_Garrison.GetAvailableMissions(GetPrimaryGarrisonFollowerType(LE_GARRISON_TYPE_7_0));
-  for i = 1, #items do
-    if (not items[i].isBuilding and items[i].isZoneSupport) then
-    else
-
-      tinsert(profile.available, items[i])
-    end
-  end
-
-  local items = C_Garrison.GetLandingPageItems(LE_GARRISON_TYPE_7_0)
-  for index, data in ipairs(items) do
-    print(' -',data.name, '|cFF00FF00'.. data.timeLeft .. '|r', date("%A %I:%m %p", data.missionEndTime))
-    tinsert(profile.missions, data)
-  end
-  return true
-end
 
 do
   local ShipmentsInfo = {}
@@ -532,63 +586,47 @@
     return true
   end
 end
-MissionList.OnGetItem = function(data)
-  if data.missionEndTime and (data.missionEndTime < GI_currentTime) then
-    data.isComplete = true
+
+
+function SharedEntry:SetTimeLeft(expires, duration)
+  self.ProgressBG:Hide()
+  self.ProgressBar:Hide()
+  if not expires then
+    return
   end
-end
 
-MissionList.FreeBlock = function(self, block)
-end
+  -- calculate here since time isn't available
+  local timeLeft = expires - GI_currentTime
+  if timeLeft < 0 then
+    -- handle being complete
 
-MissionList.SortHandler = function (a,b)
-  local result = false
-  --if not a or not b then
-  --  return 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
-      if b.isComplete ~= a.isComplete then
-        return a.isComplete
-      elseif b.isMine ~= a.isMine then
-        return a.isMine
-      elseif b.missionEndTime then
-        return ( b.missionEndTime > a.missionEndTime)
-      else
-        return ( b.offerEndTime > a.offerEndTime)
-      end
+  else
+    self.TimeLeft:SetText(GetTimeLeftString(timeLeft))
+  end
 
-    --end
-  --end
-end
+  if (timeLeft > 0) and duration then
+    local progress = (duration - timeLeft) / duration
+    local r = ((progress >= .5) and (progress/2)) or 1
+    local g = ((progress <= .5) and (progress*2)) or 1
+    self.ProgressBG:Show()
+    self.ProgressBar:Show()
 
-
-function MissionList:OnShow()
-  print('|cFF00FF88'..self:GetName()..':OnShow()|r')
-end
-
-function ShipmentList:OnLoad()
-  C_Garrison.RequestLandingPageShipmentInfo();
-end
-function  ShipmentList:OnShow()
-  print('|cFF00FF88'..self:GetName()..':OnShow()|r')
-  C_Garrison.RequestLandingPageShipmentInfo()
+    self.ProgressBG:SetColorTexture(r,g,0,0.25)
+    self.ProgressBar:SetColorTexture(r,g,0,0.5)
+    self.ProgressBar:SetWidth(self:GetWidth() * progress)
+  end
 end
 
 -- Update shipment flags data
 local SetActualShipmentTime = function(self)
 
   if self.isComplete then
-    print('|cFF00FF88isComplete '..self.name..'|r')
-    return true
+    return nil, nil
   end
 
   local timestamp = time()
   local timeLeft = self.creationTime + self.duration - timestamp
+  local duration = self.duration * self.shipmentsTotal
   local justFinished = false
   while (self.shipmentsReady < self.shipmentsTotal) and (timeLeft <= 0) do
     if not self.originalReady then
@@ -608,10 +646,13 @@
     self.isStale = true
   end
 
-  return timeLeft
+
+  local expires = (self.originalCreationTime or self.creationTime) + duration
+
+  return expires, duration
 end
 
-ShipmentList.OnGetItem = function(data)
+function ShipmentList:OnGetItem (data)
   print('OnGetItem()')
   if data.shipmentsTotal then
     SetActualShipmentTime(data)
@@ -628,118 +669,12 @@
   end
 end
 
-
-function MissionEntry:OnComplete()
-  print('flagging complete', self.name)
-  self:Update()
+function ShipmentList:OnLoad()
+  C_Garrison.RequestLandingPageShipmentInfo();
 end
-
-function MissionEntry:OnUpdate(sinceLast)
-  self.throttle = (self.throttle or .5) + sinceLast
-  if self.throttle < .5 then
-    return
-  else
-    self.throttle = self.throttle - .5
-  end
-  if self.offerEndTime then
-    local timeLeft = self.offerEndTime
-    self.TimeLeft:SetText(GetTimeLeftString(timeLeft))
-    self.TimeLeft:SetTextColor(1,1,1)
-  elseif self.missionEndTime then
-
-    if self.isComplete then
-      return
-    end
-    local timeLeft = self.missionEndTime - time()
-    if timeLeft < 0 then
-      self:OnComplete()
-    else
-      self.TimeLeft:SetText(GetTimeLeftString(timeLeft))
-      if timeLeft > 3600 then
-        self.TimeLeft:SetTextColor(1,1,1)
-      else
-        self.TimeLeft:SetTextColor(1,1,0)
-      end
-    end
-
-    if not self.isComplete then
-      local progress = (time() - (self.missionEndTime - self.durationSeconds)) / self.durationSeconds
-      local w = self.ProgressBG:GetWidth()
-      if progress >= 1 then
-        self.ProgressBar:SetWidth(w)
-      else
-        self.ProgressBar:SetWidth(progress * w)
-        local r, g = 1, 0
-        if progress >= 0.5 then
-          g = 1
-          r = 1-((progress-0.5)*2)
-        else
-          g = min(progress * 2, 1)
-          r = 1
-        end
-        self.ProgressBar:SetColorTexture(r,g,0,.4)
-        self.ProgressBG:SetColorTexture(r,g,0,0.125)
-      end
-      self.ProgressBG:Show()
-      self.ProgressBar:Show()
-    else
-      self.ProgressBG:Hide()
-      self.ProgressBar:Hide()
-    end
-  else
-    self.TimeLeft:SetText(self.missionEndTime)
-  end
-end
-
-function MissionEntry:OnLoad()
-  print('|cFFFF4400',self:GetName() or tostring(self), 'onload')
-  self.Count = self.Overlay.Count
-  self.Name = self.Overlay.Name
-  self.TimeLeft = self.Overlay.TimeLeft
-  self.Owner = self.Overlay.Owner
-
-  self.Icon:SetDesaturated(false)
-  self.Done:Hide()
-end
-
-function MissionEntry:Update()
-  local r,g,b = 1, 1, 1
-  if self.isRare then
-    r,g,b = 0.1, 0.4, 1
-    self.IconBorder:SetVertexColor(r, g, b, 1)
-  end
-
-  --self.missionData = data
-  self.Name:SetText(self.name)
-  if #self.rewards >= 1 then
-    self.Icon:SetTexture(self.rewards[1].icon or GetItemIcon(self.rewards[1].itemID))
-    self.rewardInfo = self.rewards[1]
-  else
-    self.Icon:SetAtlas(self.typeAtlas, false)
-  end
-
-
-
-  if self.isComplete then
-    self.TimeLeft:SetText('Complete!')
-    self.Background:SetColorTexture(.25,.25,.25,1)
-  else
-    self.Background:SetColorTexture(0,0,0,0.5)
-  end
-end
-
-function MissionEntry:OnEnter()
-  if self.rewardInfo and self.rewardInfo.itemID then
-    GameTooltip:SetOwner(self, 'ANCHOR_LEFT')
-    GameTooltip:SetItemByID(self.rewardInfo.itemID)
-    GameTooltip:Show()
-  end
-end
-
-function MissionEntry:OnLeave()
-  if GameTooltip:IsOwned(self) then
-    GameTooltip:Hide()
-  end
+function  ShipmentList:OnShow()
+  print('|cFF00FF88'..self:GetName()..':OnShow()|r')
+  C_Garrison.RequestLandingPageShipmentInfo()
 end
 
 function ShipmentEntry:OnLoad()
@@ -785,52 +720,27 @@
 
 
   if (self.shipmentsReady and self.shipmentsTotal) and (self.shipmentsReady < self.shipmentsTotal) then
-    local timeLeft = SetActualShipmentTime(self)
+    local expires, duration = SetActualShipmentTime(self)
 
     if self.isComplete then
       self.TimeLeft:SetText('Complete!')
-      self.TimeLeft:SetTextColor(0,0.5,1)
+      self.TimeLeft:SetTextColor(0,1,1)
     elseif self.shipmentsReady >= 1 then
-      self.TimeLeft:SetText(GetTimeLeftString(timeLeft))
+      self:SetTimeLeft(expires, duration)
       self.TimeLeft:SetTextColor(0,1,0)
     else
-      self.TimeLeft:SetText(GetTimeLeftString(timeLeft))
+      self:SetTimeLeft(expires, duration)
       self.TimeLeft:SetTextColor(1,1,1)
     end
 
   elseif self.isBeingResearched then
-    self.TimeLeft:SetText(GetTimeLeftString(self.researchStartTime + self.researchDuration - time()))
-    self.TimeLeft:SetTextColor(1,1,0)
+    self:SetTimeLeft(self.researchStartTime + self.researchDuration - time(), self.researchDuration)
+    self.TimeLeft:SetTextColor(1,1,1)
   else
     self.TimeLeft:SetText('Complete!')
     self.TimeLeft:SetTextColor(0,1,0)
   end
 
-  if not self.isComplete then
-    local progress =  ((time() - self.creationTime) / self.duration)
-    local w = self.ProgressBG:GetWidth()
-    if progress >= 1 then
-      self.ProgressBar:SetWidth(w)
-    else
-      self.ProgressBar:SetWidth(progress * w)
-    end
-
-    local r, g = 1, 0
-    if progress >= 0.5 then
-      g = 1
-      r = 1-((progress-0.5)*2)
-    else
-      g = min(progress * 2, 1)
-      r = 1
-    end
-    self.ProgressBar:SetColorTexture(r, g, 0, .4)
-    self.ProgressBG:SetColorTexture(r, g, 0, .125)
-    self.ProgressBG:Show()
-    self.ProgressBar:Show()
-  else
-    self.ProgressBG:Hide()
-    self.ProgressBar:Hide()
-  end
 end
 
 function ShipmentEntry:OnEnter()
@@ -855,9 +765,12 @@
   end
 end
 
+
+
+
 ClassPlanMissionHandler = Mixin(MissionList, SharedHandlers)
+ClassPlanMissionEntryMixin = Mixin(MissionEntry, SharedEntry)
 ClassPlanShipmentHandler = Mixin(ShipmentList, SharedHandlers)
-ClassPlanMissionEntryMixin = Mixin(MissionEntry, SharedEntry)
 ClassPlanShipmentEntryMixin = Mixin(ShipmentEntry,SharedEntry)
 
 ClassPlanHeaderMixin = {
@@ -866,4 +779,19 @@
     self:GetParent().isStale = true
     ClassOrderPlan:Update()
   end
-}
\ No newline at end of file
+}
+
+ClassPlanCharacterButtonMixin = {
+  Update = function(self)
+    print(CLASS_ICON_TCOORDS[self.className:upper()])
+    if self.className and CLASS_ICON_TCOORDS[self.className:upper()] then
+      self.Icon:SetTexCoord(unpack(CLASS_ICON_TCOORDS[self.className:upper()]))
+    end
+    self.Icon:SetDesaturated(self.showItems)
+    self.SelectGlow:SetShown(self.isMine)
+  end
+}
+
+function ClassPlanCharacterButtonMixin:OnEnter() end
+function ClassPlanCharacterButtonMixin:OnLeave() end
+function ClassPlanCharacterButtonMixin:OnClick() end
\ No newline at end of file