127 lines
4.6 KiB
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
|