view Modules/WorldState.lua @ 85:1196b8175674

missing "else" control
author Nenue
date Tue, 18 Oct 2016 13:16:57 -0400
parents 16b300d96724
children 27db212af783
line wrap: on
line source
-- 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()

    if itemID then
      local nextRankCost = GetCostForPointAtRank(pointsSpent) or 0
      print('  C_AUI:', itemID, name, 'XP:', totalXP, 'Points:', pointsSpent, 'Next:', nextRankCost)
      hasNewInfo = (self.progressAmount ~= totalXP)
      progressChange = (hasNewInfo and not self.modeChanged) and (((totalXP - self.progressAmount) / nextRankCost))

      if totalXP > nextRankCost then
        self.progressPercent = 1
      else
        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:IsVisible())
    print(self:GetWidth())
    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
      if not self.canGainXP then
        return
      end
      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