diff Modules/WorldState.lua @ 84:16b300d96724

rewritten using mixin attributes
author Nenue
date Tue, 18 Oct 2016 13:07:21 -0400
parents Modules/OrderHall.lua@4ec4fd89fced
children 1196b8175674
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Modules/WorldState.lua	Tue Oct 18 13:07:21 2016 -0400
@@ -0,0 +1,426 @@
+-- Veneer
+-- WorldState.lua
+-- Created: 10/7/2016 10:55 PM
+-- %file-revision%
+--
+
+VeneerWorldStateCurrencyMixin = {}
+VeneerWorldStateProgressMixin = {
+  keepOpen = true
+}
+VeneerWorldStateMixin = {
+  maxHeight = 0,
+  detectedFrames = {}
+}
+local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop
+
+function VeneerWorldStateMixin:Setup()
+  --DEFAULT_CHAT_FRAME:AddMessage('Loaded')
+  print('|cFFFFFF00'..self:GetName()..'|r:Setup()')
+
+  self.modules = self.modules or {self:GetChildren()}
+  for i, frame in ipairs(self.modules) do
+    print('--'.. frame:GetName()..' exists')
+    if frame.Setup then
+      print('--'.. frame:GetName()..':Setup()')
+      frame:Setup()
+    end
+
+    frame:SetScript('OnSizeChanged', function()
+      local h = frame:GetHeight()
+      if h > self.maxHeight then
+        self.maxHeight = h
+        self:SetHeight(h)
+        print('updating max height:', h)
+      elseif h < self.maxHeight then
+        self:UpdateSize()
+      end
+    end)
+    frame:SetScript('OnHide', function()
+      print('|cFF0088FF'..frame:GetName()..':OnHide()')
+      self:UpdateSize()
+    end)
+    frame:SetScript('OnShow', function()
+      frame.timeLived = 0
+      print('|cFF0088FF'..frame:GetName()..':OnShow()')
+      self:UpdateSize()
+    end)
+
+    function frame.ShowPanel(frame)
+      frame:SetShown(true)
+      self:Show()
+    end
+    function frame.HidePanel(frame)
+      frame:SetShown(false)
+      self:UpdateSize()
+    end
+  end
+  self:SetOrderHallUIMods()
+  self:UnregisterEvent('PLAYER_LOGIN')
+end
+
+function VeneerWorldStateMixin:SetOrderHallUIMods()
+  if OrderHallCommandBar then
+    if not self.detectedFrames[OrderHallCommandBar] then
+      self.detectedFrames[OrderHallCommandBar] = true
+      hooksecurefunc(OrderHallCommandBar,'Show', function()
+        self:SetOrderHallUIMods()
+      end)
+      hooksecurefunc(OrderHallCommandBar,'Hide', function()
+        self:SetOrderHallUIMods()
+        self:UpdateSize()
+      end)
+    end
+
+
+    OrderHallCommandBar:ClearAllPoints()
+    OrderHallCommandBar:SetPoint('TOP')
+    OrderHallCommandBar:SetWidth(600)
+    OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5)
+    OrderHallCommandBar.WorldMapButton:Hide()
+    OrderHallCommandBar:EnableMouse(false)
+
+    if OrderHallCommandBar:IsVisible() then
+      self:SetPoint('TOP', OrderHallCommandBar, 'BOTTOM')
+      print('anchoring to CommandBar')
+    else
+      self:SetPoint('TOP', UIParent, 'TOP')
+      print('anchoring to UIParent')
+    end
+
+    self:UnregisterEvent('ADDON_LOADED')
+  else
+    self:SetPoint('TOP', UIParent, 'TOP')
+    print('anchoring to UIParent')
+  end
+end
+
+
+function VeneerWorldStateMixin:OnLoad ()
+  print('|cFFFFFF00'..self:GetName()..'|r!')
+  self:RegisterEvent('PLAYER_LOGIN')
+  self:RegisterEvent('ADDON_LOADED')
+  self:RegisterEvent('ARTIFACT_UPDATE')
+  self:RegisterEvent('ARTIFACT_XP_UPDATE')
+  self:RegisterEvent('PLAYER_ENTERING_WORLD')
+  self:RegisterEvent('PLAYER_REGEN_ENABLED')
+  self:RegisterEvent('PLAYER_REGEN_DISABLED')
+end
+
+function VeneerWorldStateMixin:OnEvent(event, arg)
+  print(event, arg)
+
+  if event == 'PLAYER_LOGIN' then
+    if IsLoggedIn() and not self.initialized then
+      self.initialized = true
+      self:Setup()
+    end
+  elseif event == 'ADDON_LOADED' then
+    if self.initialized and IsAddOnLoaded('Blizzard_OrderHallUI') then
+      self:SetOrderHallUIMods()
+    end
+  elseif event == 'PLAYER_ENTERING_WORLD' then
+    self:Update()
+  elseif event == 'PLAYER_REGEN_ENABLED' then
+    self:SetShown(true)
+  elseif event == 'PLAYER_REGEN_DISABLED' then
+    self:SetShown(false)
+  end
+end
+
+function VeneerWorldStateMixin:Update()
+  self.modules = {self:GetChildren()}
+  print('|cFFFFFF00All:Update()|r')
+  print(self:GetChildren())
+  for i, frame in ipairs(self.modules) do
+    if frame.Update then
+      print('  |cFFFF00FF'.. frame:GetName() .. ':Update()')
+      frame:Update()
+    end
+  end
+  self:SetOrderHallUIMods()
+end
+
+function VeneerWorldStateMixin:UpdateSize()
+  print('|cFFFFFF00All:UpdateSize()|r')
+  print(self:GetChildren())
+  self.modules = {self:GetChildren()}
+  self.maxHeight = 0
+  for i, frame in ipairs(self.modules) do
+    print('  '..frame:GetName()..':',frame:IsShown(), frame:IsVisible(), frame:GetHeight())
+    if frame:IsShown() then
+      self.maxHeight = max(self.maxHeight, frame:GetHeight())
+    end
+  end
+  if self.maxHeight == 0 then
+    print ('height zero')
+    self:Hide()
+  else
+    self:Show()
+    print ('height update:', self.maxHeight)
+    self:SetHeight(self.maxHeight)
+  end
+
+end
+
+
+
+function VeneerWorldStateMixin:OnMouseDown()
+end
+
+function VeneerWorldStateCurrencyMixin:OnLoad ()
+
+  self:RegisterEvent("PLAYER_ENTERING_WORLD");
+  self:RegisterEvent("ZONE_CHANGED");
+  self:RegisterEvent("ZONE_CHANGED_INDOORS");
+  self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
+  self:RegisterEvent('CURRENCY_DISPLAY_UPDATE')
+  self:RegisterEvent('CHAT_MSG_CURRENCY')
+
+end
+
+function VeneerWorldStateCurrencyMixin:OnEvent (event, arg)
+  self:Update()
+end
+
+
+function VeneerWorldStateCurrencyMixin:Update()
+
+  print('  Zone:', GetZoneText())
+  if GetZoneText() == 'Suramar' then
+    local name, earned, texture, earnedThisWeek, weeklyMax, totalMax = GetCurrencyInfo(1155)
+
+    self.Icon:SetTexture(texture)
+    self.Label:SetFormattedText("%d / %d", earned, totalMax)
+    self:Show()
+    self:SetWidth(self.Icon:GetWidth() + self.Label:GetStringWidth() + 6)
+    self:SetSize(200,16)
+  else
+    self:Hide()
+  end
+
+
+end
+
+function VeneerWorldStateProgressMixin:OnUpdate(sinceLast)
+  if self.keepOpen then
+    return
+  end
+
+  self.timeLived = (self.timeLived or 0) + sinceLast
+  if self.timeLived >= 3 and not self.TransitionFadeOut:IsPlaying() then
+    if not self.timeOut then
+      self.timeOut = true
+      self.TimedFadeOut:Play()
+    end
+  end
+end
+
+
+function VeneerWorldStateProgressMixin:OnLoad()
+  self:RegisterEvent('PLAYER_EQUIPMENT_CHANGED')
+
+  self:RegisterEvent("PLAYER_XP_UPDATE");
+  self:RegisterEvent("UPDATE_EXHAUSTION");
+  self:RegisterEvent("PLAYER_LEVEL_UP");
+  self:RegisterEvent("PLAYER_UPDATE_RESTING");
+
+  self:RegisterEvent("ARTIFACT_UPDATE");
+  self:RegisterEvent("ARTIFACT_XP_UPDATE");
+  self:RegisterEvent("ARTIFACT_CLOSE");
+  self:RegisterEvent("ARTIFACT_MAX_RANKS_UPDATE");
+
+  self.progressPercent = 0
+  self.progressAmount = 0
+  self.progressMax = 1
+  self.progressOverflow = 0
+
+end
+
+function VeneerWorldStateProgressMixin:Setup()
+  self:UpdateXPGain()
+
+  if self.canGainXP then
+    self.mode = 'xp'
+  else
+    self.mode = 'artifact'
+  end
+  print('setup mode:', self.mode)
+end
+
+function VeneerWorldStateProgressMixin:OnEvent(event, ...)
+  local lastMode = self.mode
+  if event == 'PLAYER_LEVEL_UP' or event == 'ENABLE_XP_GAIN' or event == 'DISABLE_XP_GAIN' then
+    self:UpdateXPGain()
+  elseif event == 'ARTIFACT_XP_UPDATE' or event == 'ARTIFACT_UPDATE' then
+    self.mode = 'artifact'
+
+  elseif event == 'PLAYER_EQUIPMENT_CHANGED' then
+    local slot, hasEquip = ...
+    if slot == 16 then
+      self.mode = 'artifact'
+      lastMode = nil
+    end
+  elseif event == 'PLAYER_XP_UPDATE' or event == 'PLAYER_LEVEL_UP' then
+    print('forcing to XP mode')
+    self.mode = 'xp'
+  end
+  self.modeChanged = (lastMode ~= self.mode)
+  if self.modeChanged and self:IsVisible() then
+    print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()', event, ...)
+    self:AnimateMode()
+  else
+    print('|cFFFFFF00'..self:GetName()..':Update()', event, ...)
+    self:Update()
+  end
+end
+function VeneerWorldStateProgressMixin:UpdateXPGain()
+  self.canGainXP = (UnitLevel('player') < GetMaxPlayerLevel()) and (not IsXPUserDisabled())
+  if not self.canGainXP then
+    self.ProgressBar:SetColorTexture(0.75,0.75,0.75)
+  end
+end
+
+local GetEquippedArtifactInfo = _G.C_ArtifactUI.GetEquippedArtifactInfo
+local GetCostForPointAtRank = _G.C_ArtifactUI.GetCostForPointAtRank
+function VeneerWorldStateProgressMixin:Update()
+  local hasNewInfo = false
+  local progressChange = false
+  print('  current mode:', self.mode)
+
+
+  if self.mode == 'xp' then
+    local xp = UnitXP('player')
+    local xpMax = UnitXPMax('player')
+    local bonusXP = GetXPExhaustion()
+    if xp then
+      self.progressPercent = xp / xpMax
+    end
+
+    self.progressText = '|cFFFFCC00' .. UnitLevel('player') .. '|r ' .. xp .. '/' .. xpMax
+
+    if bonusXP then
+      self.ProgressBar:SetColorTexture(0, 0.5,1)
+      self.OverflowBar:Show()
+      self.OverflowBar:ClearAllPoints()
+      self.OverflowBar:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', 0, 0)
+
+    else
+      self.ProgressBar:SetColorTexture(0.5,0,1)
+    end
+    hasNewInfo = (self.progressAmount ~= xp)
+
+    progressChange = (hasNewInfo and not self.modeChanged) and ((xp - self.progressAmount) / xpMax)
+
+    self.progressOverFlow = bonusXP
+    self.progressAmount = xp
+    self.progressMax = xpMax
+  elseif self.mode == 'artifact' then
+
+    local itemID, altItemID, name, icon, totalXP, pointsSpent = GetEquippedArtifactInfo()
+    print('  C_AUI:', itemID, altItemID, name, icon, totalXP, pointsSpent)
+
+    if itemID then
+      local nextRankCost = GetCostForPointAtRank(pointsSpent) or 0
+      hasNewInfo = (self.progressAmount ~= totalXP)
+      progressChange = (hasNewInfo and not self.modeChanged) and (((totalXP - self.progressAmount) / nextRankCost))
+
+      if totalXP > nextRankCost then
+        self.progressPercent = 1
+        self.progressPercent = totalXP / nextRankCost
+      end
+
+      self.progressText = name .. ' ('..pointsSpent .. '): '.. totalXP .. ' / ' .. nextRankCost
+
+      self.ProgressBar:SetColorTexture(1,0.5,0,1)
+      self.OverflowBar:Hide()
+
+      self.progressOverFlow = 0
+      self.progressAmount = totalXP
+      self.progressMax = nextRankCost
+    else
+      self.progressAmount = 0
+      self.progressMax = 1
+      self.progressText = ''
+    end
+  end
+
+  if self.mode then
+    self:SetSize(600,16)
+    if hasNewInfo then
+      self.timeOut = nil
+      self.timeLived = 0
+      if self.TransitionFadeOut:IsPlaying() then
+        self.TransitionFadeOut:Stop()
+        self:SetAlpha(1)
+      end
+      if not self:IsVisible() then
+        self.TransitionFadeIn:Play()
+      else
+        self:ShowPanel()
+      end
+
+    end
+
+    --print(self.ProgressBG:GetWidth())
+    print('  Percent:', floor(self.progressPercent*100)/100, 'BarLength:', floor(self:GetWidth()* self.progressPercent), 'NewInfo:', hasNewInfo, 'IsShown:', self:IsShown())
+
+
+    if progressChange then
+      print('  Render change:', progressChange)
+      self.ProgressAdded:Show()
+      self.ProgressAdded:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', - (self:GetWidth() * progressChange), 0)
+      self.ProgressAdded:SetPoint('TOPRIGHT', self.ProgressBar, 'TOPRIGHT', 0, 0)
+      self.ProgressFlash:Play()
+    end
+
+
+    if self.progressPercent > 0 then
+      self.ProgressBar:Show()
+      self.ProgressBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPLEFT', self:GetWidth()* self.progressPercent , 0)
+      self.Label:SetText(self.progressText)
+
+      self.progressLeft = self.progressMax - self.progressAmount
+      if self.progressOverflow >= self.progressLeft then
+
+        self.OverflowBar:SetPoint('TOPRIGHT', self.ProgressBar, 'TOPRIGHT', (self.progressOverflow / self.progressMax) * self:GetWidth(), 0)
+      else
+        self.OverflowBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPRIGHT', 0, 0)
+      end
+
+    else
+      self.ProgressBar:Hide()
+    end
+  else
+    --self:HidePanel()
+  end
+
+  self.modeChanged = nil
+end
+
+function VeneerWorldStateProgressMixin:OnMouseDown(button)
+  if button == 'RightButton' then
+    if self.keepOpen then
+      self.keepOpen = nil
+    else
+      self.keepOpen = true
+    end
+    print('keepOpen =', self.keepOpen)
+  else
+    if self.mode == 'xp' then
+      self.mode = 'artifact'
+    else
+      self.mode = 'xp'
+    end
+    self:AnimateMode()
+  end
+
+end
+
+function VeneerWorldStateProgressMixin:AnimateMode()
+
+  self.TransitionFadeIn:Stop()
+  print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()')
+  self.modeChanged = true
+  self.TransitionFadeOut:Play()
+end
\ No newline at end of file