CoreScriptsRoot/Modules/Stats/StatsViewer.lua
--[[
  Filename: StatsButtonViewer.lua
  Written by: dbanks
  Description: Widget that displays one or more stats in closeup view:
      text and graphics.
--]]

--[[ Services ]]--
local CoreGuiService = game:GetService('CoreGui')

--[[ Modules ]]--
local StatsUtils = require(CoreGuiService.RobloxGui.Modules.Stats.StatsUtils)
local StatsTextPanelClass = require(CoreGuiService.RobloxGui.Modules.Stats.StatsTextPanel)
local StatsAnnotatedGraphClass = require(CoreGuiService.RobloxGui.Modules.Stats.StatsAnnotatedGraph)

--[[ Globals ]]--
local TextPanelXFraction = 0.4
local GraphXFraction = 1 - TextPanelXFraction

local TextPanelPosition = UDim2.new(0, 0, 0, 0)
local TextPanelSize = UDim2.new(TextPanelXFraction, 0, 1, 0)
local GraphPosition = UDim2.new(TextPanelXFraction, 0, 0, 0)
local GraphSize = UDim2.new(GraphXFraction, 0, 1, 0)

--[[ Classes ]]--
local StatsViewerClass = {}
StatsViewerClass.__index = StatsViewerClass


function StatsViewerClass.new() 
  local self = {}
  setmetatable(self, StatsViewerClass)
  
  self._frameImageLabel = Instance.new("ImageLabel")
  self._frameImageLabel.Name = "PS_Viewer"
	self._frameImageLabel.Image = 'rbxasset://textures/ui/PerformanceStats/BackgroundRounded.png'
  self._frameImageLabel.ScaleType = Enum.ScaleType.Slice
  self._frameImageLabel.SliceCenter = Rect.new(10, 10, 22, 22)
  self._frameImageLabel.BackgroundTransparency = 1
  self._frameImageLabel.ImageColor3 = StatsUtils.NormalColor
  self._frameImageLabel.ImageTransparency = StatsUtils.Transparency 
  
  self._textPanel = nil
  self._statType = nil
  self._graph = nil

  return self
end

function StatsViewerClass:OnPerformanceStatsShouldBeVisibleChanged()
  if self._graph then 
    self._graph:OnPerformanceStatsShouldBeVisibleChanged()
  end
  if self._textPanel then 
    self._textPanel:OnPerformanceStatsShouldBeVisibleChanged()
  end
  if self._textPanel then 
    self._textPanel:OnVisibilityChanged()
  end
end

function StatsViewerClass:GetIsVisible()
  return self._frameImageLabel.Visible
end

function StatsViewerClass:GetStatType()
  return self._statType
end

function StatsViewerClass:SetSizeAndPosition(size, position)
  self._frameImageLabel.Size = size
  self._frameImageLabel.Position = position
end

function StatsViewerClass:SetParent(parent)
  self._frameImageLabel.Parent = parent
end
  
function StatsViewerClass:SetVisible(visible)
  self._frameImageLabel.Visible = visible
  
  if (self._graph) then   
    self._graph:SetVisible(visible)
  end
  
  if (self._textPanel) then 
    self._textPanel:SetVisible(visible)
  end
end

function StatsViewerClass:SetStatType(statType) 
  self._statType = statType
  self._frameImageLabel:ClearAllChildren()
  -- If there's already a text panel, make it clear it is no longer visible.
  if (self._textPanel) then 
    self._textPanel:SetVisible(false)
    self._textPanel = nil
  end
  
  self._textPanel = StatsTextPanelClass.new(statType, true)
  self._textPanel:PlaceInParent(self._frameImageLabel,
    TextPanelSize, 
    TextPanelPosition)
  
  self._graph = StatsAnnotatedGraphClass.new(statType, true)
  self._graph:PlaceInParent(self._frameImageLabel, 
    GraphSize, 
    GraphPosition)
  
  self._textPanel:SetZIndex(StatsUtils.TextZIndex)
  self._graph:SetZIndex(StatsUtils.GraphZIndex)
  
  self._graph:SetVisible(self._frameImageLabel.Visible)
  self._textPanel:SetVisible(self._frameImageLabel.Visible)

  
  self:_applyStatsAggregator();
end

function StatsViewerClass:_applyStatsAggregator()
  if (self._aggregator == nil) then 
    return
  end
  
  if (self._textPanel) then 
    self._textPanel:SetStatsAggregator(self._aggregator)
  end
  if (self._graph) then 
      self._graph:SetStatsAggregator(self._aggregator)
  end
end
  

function StatsViewerClass:SetStatsAggregator(aggregator) 
  self._aggregator = aggregator
  self:_applyStatsAggregator();
 end

return StatsViewerClass