TradeSkillMaster/Core/UI/Scrollbar.lua

127 lines
4.6 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
--- Scrollbar Functions
-- @module Scrollbar
local _, TSM = ...
local Scrollbar = TSM.UI:NewPackage("Scrollbar")
local Math = TSM.Include("Util.Math")
local Theme = TSM.Include("Util.Theme")
local ScriptWrapper = TSM.Include("Util.ScriptWrapper")
local private = {
scrollbars = {},
}
-- ============================================================================
-- Module Functions
-- ============================================================================
function Scrollbar.OnInitialize()
Theme.RegisterChangeCallback(private.OnThemeChange)
end
--- Creates a scrollbar.
-- @return The newly-created scrollbar
function Scrollbar.Create(parent, isHorizontal)
local scrollbar = CreateFrame("Slider", nil, parent, nil)
scrollbar:ClearAllPoints()
if isHorizontal then
scrollbar:SetOrientation("HORIZONTAL")
scrollbar:SetPoint("BOTTOMLEFT", 4, 0)
scrollbar:SetPoint("BOTTOMRIGHT", -4, 0)
scrollbar:SetHitRectInsets(-4, -4, -6, -10)
scrollbar:SetHeight(Theme.GetScrollbarWidth())
scrollbar:SetPoint("BOTTOMLEFT", Theme.GetScrollbarMargin(), Theme.GetScrollbarMargin())
scrollbar:SetPoint("BOTTOMRIGHT", -Theme.GetScrollbarMargin(), Theme.GetScrollbarMargin())
else
scrollbar:SetOrientation("VERTICAL")
scrollbar:SetHitRectInsets(-6, -10, -4, -4)
scrollbar:SetWidth(Theme.GetScrollbarWidth())
scrollbar:SetPoint("TOPRIGHT", -Theme.GetScrollbarMargin(), -Theme.GetScrollbarMargin())
scrollbar:SetPoint("BOTTOMRIGHT", -Theme.GetScrollbarMargin(), Theme.GetScrollbarMargin())
end
scrollbar:SetValueStep(1)
scrollbar:SetObeyStepOnDrag(true)
ScriptWrapper.Set(scrollbar, "OnShow", private.ScrollbarOnLeave)
ScriptWrapper.Set(scrollbar, "OnHide", private.ScrollbarOnMouseUp)
ScriptWrapper.Set(scrollbar, "OnUpdate", private.ScrollbarOnUpdate)
ScriptWrapper.Set(scrollbar, "OnEnter", private.ScrollbarOnEnter)
ScriptWrapper.Set(scrollbar, "OnLeave", private.ScrollbarOnLeave)
ScriptWrapper.Set(scrollbar, "OnMouseDown", private.ScrollbarOnMouseDown)
ScriptWrapper.Set(scrollbar, "OnMouseUp", private.ScrollbarOnMouseUp)
scrollbar:SetThumbTexture(scrollbar:CreateTexture())
scrollbar.thumb = scrollbar:GetThumbTexture()
scrollbar.thumb:SetPoint("CENTER")
scrollbar.thumb:SetColorTexture(Theme.GetColor("ACTIVE_BG_ALT"):GetFractionalRGBA())
if isHorizontal then
scrollbar.thumb:SetHeight(Theme.GetScrollbarWidth())
else
scrollbar.thumb:SetWidth(Theme.GetScrollbarWidth())
end
tinsert(private.scrollbars, scrollbar)
return scrollbar
end
function Scrollbar.GetLength(contentLength, visibleLength)
-- arbitrary minimum length
local minLength = 25
-- the maximum length of the scrollbar is half the total visible length
local maxLength = visibleLength / 2
if minLength >= maxLength or visibleLength >= contentLength then
return maxLength
end
-- calculate the ratio of our total content length to the visible length (capped at 10)
local ratio = min(contentLength / visibleLength, 10)
assert(ratio >= 1)
-- calculate the appropriate scroll bar length based on the ratio (which is between 1 and 10)
return Math.Scale(ratio, 1, 10, maxLength, minLength)
end
-- ============================================================================
-- Local Script Handlers
-- ============================================================================
function private.ScrollbarOnUpdate(scrollbar)
scrollbar:SetFrameLevel(scrollbar:GetParent():GetFrameLevel() + 5)
end
function private.ScrollbarOnEnter(scrollbar)
scrollbar.thumb:SetColorTexture(Theme.GetColor("ACTIVE_BG_ALT+SELECTED_HOVER"):GetFractionalRGBA())
end
function private.ScrollbarOnLeave(scrollbar)
scrollbar.thumb:SetColorTexture(Theme.GetColor("ACTIVE_BG_ALT"):GetFractionalRGBA())
end
function private.ScrollbarOnMouseDown(scrollbar)
scrollbar.dragging = true
end
function private.ScrollbarOnMouseUp(scrollbar)
scrollbar.dragging = nil
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.OnThemeChange()
for _, scrollbar in ipairs(private.scrollbars) do
scrollbar.thumb:SetColorTexture(Theme.GetColor("ACTIVE_BG_ALT"):GetFractionalRGBA())
end
end