view Turok/Modules/Timer/Progressbar.lua @ 9:9400a0ff8540

Ugh Timer: - container update directionality - talent update iterates over a non-volatile table to carry out updates - index management steps organized - talentRow status implemented, returns the spell associated with the talent chosen from that row CombatLog: - sort out font controls and unbork arguments
author Nenue
date Sun, 21 Feb 2016 13:08:30 -0500
parents a9b8b0866ece
children
line wrap: on
line source
--- ${PACKAGE_NAME}
-- @file-author@
-- @project-revision@ @project-hash@
-- @file-revision@ @file-hash@
-- Created: 1/15/2016 6:38 PM
local T, _G = Turok, _G
local GetTime, PlaySoundFile, format = GetTime, PlaySoundFile, string.format
local unpack, tconcat = unpack, table.concat
local ACTIVE, PASSIVE, HIDDEN = 2, 1, 0
local mod = T.modules.TimerControl
--@debug@
local cType, cText, cNum, cWord, cKey, cPink, cBool = cType, cText, cNum, cWord, cKey, cPink, cBool
local print = function(...)
  if _G.Devian and _G.DevianDB.workspace ~= 1 then
    _G.print('Progressbar', ...)
  end
end
local uprint = function(...)
  if _G.Devian and _G.DevianDB.workspace ~= 1 then
    _G.print('Update', ...)
  end
end
--@end-debug@
local GetPrint = function(trace)
  if trace then
    return print
  else
    return function() end
  end
end
T.defaults.spirit.progressbar = {
  combatFade = true,
  alpha = 1,
  alpha_ooc = 0,
  alpha_ooc_passive = 0,
  alpha_ooc_active = 1,

  width = 200, height = 24,
  parent = 1,
  anchor = 'CENTER', anchorTo = 'CENTER',
  setAllPoints = true,
  strata = 'MEDIUM',

  foreground_color = {1,0.5,0,0.5},
  foreground_blend = 'ADD',
  foreground_texture = [[Interface\Addons\Turok\Media\statusbar\Minimalist.tga]],
  background_color = {1,1,1,0.5},
  background_blend = 'BLEND',
  padding = 3,
  spacing = 1,
  foreground_inset=  0,
  icon = {
    embedded = true,
    alpha = 1,
    alpha_ooc = 1,
    size = 24,
    x = -6, y = 0,
    anchor = 'RIGHT', anchorTo = 'LEFT',
    parent = 1,
  },

  -- text
  color = {0,0,0,.5},
}

local p = mod.prototype.display.progressbar
p.type='display'

p.inherits = 'TurokProgressbarTemplate'
p.cvars = {}

--- Load-time config retrieval
p.Init = function (self)
  local print = GetPrint(self.trace)

  print(' ', self:GetName(),'<- Progressbar.Load')
  print(' ', self:GetHeight())

  if self.cvars.hideIcon then
    self.enableIcon = false
    print('Icon hidden')
  else
    self.icon:Hide()
      if self.cvars.icon then
      print('Icon data:')
      for k,v in pairs(self.cvars.icon) do
        print('   ', k, '=', v)
      end
      print(cWord('  icon=')..cText(self.itemIcon or self.spellIcon))
      self.icon:SetTexture(self.itemIcon or self.spellIcon)
      self.icon:ClearAllPoints()
      T.SetTextureLayout(self.icon, self.cvars.icon)
      self.enableIcon = true
      self.icon:Show()
    end

  end

  T.SetStatusTextures(self, self.cvars)

  uprint(self.background:GetWidth(), self.background:GetHeight())
  uprint(self.foreground:GetWidth(), self.foreground:GetHeight())
end


--- Negotiate the config differences between different display states
-- Hidden  - display is or should (via fade-out) be hidden
-- Passive - display is visible, but no timing information is processed
-- Active  - display is visible and counting time; on expiration, it will downgrade itself to passive or hidden
p.SetState = function(self, newState, forcePrevious)
  local print = GetPrint(self.trace)

  local previous = self.displayState
  self.prevState = forcePrevious and forcePrevious or previous
  self.displayState = newState

  local newState, previous = self.displayState, self.prevState
  --- Transition
  if newState ~= previous then
    print(cText('  Transition:'), cWord(self.spellName))
    if newState == HIDDEN then
      print(cText('  to HIDDEN'))
      -- to HIDDEN
      if previous then
        -- has to have been ACTIVE or PASSIVE at this point
        self.Intro:Stop()
        if self.event then
          self.Outro:Play()
        else
          self:Hide()
        end
      end
      -- want to end here if HIDDEN from nil
    else
      -- to ACTIVE or PASSIVE
      self.Outro:Stop() -- stop any running outro


      if newState == ACTIVE then

        -- and is ACTIVE
        self:Show()
      end

      print(cText('  from'), cNum(previous))
      if previous and previous ~= HIDDEN then
        -- from visible
        if self.event then
          self.refresh = true
          self.Retro:Play()
        end
      else
        if self.event then
          self.Intro:Play()
        else
          self:Show()
        end
      end
    end
  else
    if newState == ACTIVE then
      print(cText(''))
      -- and is ACTIVE
    end

    if self.event and newState ~= HIDDEN then
      self.refresh = true
      self.Retro:Play()
    end
  end

  if newState ~= HIDDEN then
    print(cText('  CVars:'))
    local c = (newState == ACTIVE) and self.cvars.active or self.cvars.passive
    if self.icon and c.icon then
      print(cText('    '), cWord('desat=')..cBool(c.icon.desaturated), cWord('color=')..cNum(tconcat(c.icon.color, ', ')))
      self.icon:SetVertexColor(unpack(c.icon.color))
      self.icon:SetDesaturated(c.icon.desaturated)
    end
    local c
    if newState == ACTIVE then
      self.fillState = 1
      c = self.cvars.active
    else
      self.fillState = 2
      c = self.cvars.passive
    end

    if self.icon and c.icon then
      print(cText('    '), cWord('desat=')..cBool(c.icon.desaturated), cWord('color=')..cNum(tconcat(c.icon.color, ', ')))
      self.icon:SetVertexColor(unpack(c.icon.color))
      self.icon:SetDesaturated(c.icon.desaturated)
    end

    self:UpdateAlpha(T.inCombat)
  end
end

p.Update = function (self)
  local print = GetPrint(self.trace)

  -- Trigger business
  -- Passive or Hidden, evaluate once
  if self.displayState == 0 and self.prevState ~= 0 then
    self.prevState = self.displayState -- quietly advance state
    self.percent = 0
    self.valueFull = 0
    self.value = 0
    self:SetText()
    self:SetProgress(self.percent)
    print('go LOW')
  elseif self.displayState == 1 and self.prevState ~= 1 then
    self.prevState = self.displayState -- quietly advance state
    self.valueFull = 0
    self.value = 0
    self.percent = 1
    self:SetText()
    self:SetProgress(self.fill_inverse and 0 or 1)
    print('go PASSIVE', self.percent, self.duration, self.start, self.expires)
  elseif self.displayState == 2 then
    if self.prevState ~= 2 or self.refresh then
      self.prevState = self.displayState -- quietly advance state
      self.refresh = nil
    end
    -- prevState is set externally
    local time = GetTime()
    if self.expires <= time and self.charges == self.maxCharges then
      self.percent = 1
      self.duration = 0
      self.expires = 0
      self.start=  0
      self.valueFull = self.duration
      self.value = self.duration
      self.elapsed = self.duration
      self.remaining = 0
      self:SetState(self.cvars.persist and self.flags.passive or self.flags.hidden)
    else
      self.valueFull = self.expires - time
      self.percent = self.valueFull / self.duration
      self.elapsed = time - self.start
      self.remaining = self.duration - time

      self.value = floor(self.valueFull)
    end

    --PlaySoundFile(self.cvars.sound_active)
    self:SetText()
    self:SetProgress(self.percent)
  end
end