CoreScriptsRoot/Modules/Stats/StatsButton.lua
--[[
  Filename: StatsButton.lua
  Written by: dbanks
  Description: Button that displays latest deets of one or two 
    particular stats.
--]]

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

--[[ Modules ]]--
local StyleWidgets = require(CoreGuiService.RobloxGui.Modules.StyleWidgets)
local StatsUtils = require(CoreGuiService.RobloxGui.Modules.Stats.StatsUtils)
local StatsMiniTextPanelClass = require(CoreGuiService.RobloxGui.Modules.Stats.StatsMiniTextPanel)
local StatsAnnotatedGraphClass = require(CoreGuiService.RobloxGui.Modules.Stats.StatsAnnotatedGraph)

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

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

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

function StatsButtonClass.new(statType) 
  local self = {}
  setmetatable(self, StatsButtonClass)

  self._statType = statType
  self._button = Instance.new("TextButton")
  self._button.Name = "PS_Button"
  self._button.Text = ""
  
  StatsUtils.StyleButton(self._button)

  self._textPanel = StatsMiniTextPanelClass.new(statType)
  self._textPanel:PlaceInParent(self._button,
    TextPanelSize, 
    TextPanelPosition)
        
  self._graph = StatsAnnotatedGraphClass.new(statType, false)
  self._graph:PlaceInParent(self._button, 
    GraphSize, 
    GraphPosition)
  
  self._textPanel:SetZIndex(StatsUtils.TextZIndex)
  self._graph:SetZIndex(StatsUtils.GraphZIndex)

  self._tabSelection = StyleWidgets.MakeTabSelectionWidget(self._button)

  self._isSelected = false
  
  self:_updateTabSelectionState();
  
  return self
end

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

function StatsButtonClass:SetToggleCallbackFunction(callbackFunction) 
    self._button.MouseButton1Click:connect(function() 
          callbackFunction(self._statType)
        end)
end

function StatsButtonClass:SetSizeAndPosition(size, position)
  self._button.Size = size;
  self._button.Position = position;
end

function StatsButtonClass:SetIsSelected(isSelected)
  self._isSelected = isSelected
  self:_updateTabSelectionState();
end

function StatsButtonClass:_updateTabSelectionState()
  self._tabSelection.Visible = self._isSelected
end

function StatsButtonClass:SetParent(parent)
  self._button.Parent = parent
end
  
function StatsButtonClass:SetStatsAggregator(aggregator) 
  self._textPanel:SetStatsAggregator(aggregator)
  self._graph:SetStatsAggregator(aggregator)
end
  
return StatsButtonClass