Compare with Previous | Blame | View Log
--Register LAM with LibStub
local MAJOR, MINOR = "LibMsgWin-1.0", 8
local libmw, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not libmw then return end --the same or newer version of this lib is already loaded into memory
local function AdjustSlider(self)
local numHistoryLines = self:GetNamedChild("Buffer"):GetNumHistoryLines()
local numVisHistoryLines = self:GetNamedChild("Buffer"):GetNumVisibleLines()
local bufferScrollPos = self:GetNamedChild("Buffer"):GetScrollPosition()
local sliderMin, sliderMax = self:GetNamedChild("Slider"):GetMinMax()
local sliderValue = self:GetNamedChild("Slider"):GetValue()
self:GetNamedChild("Slider"):SetMinMax(0, numHistoryLines)
-- If the sliders at the bottom, stay at the bottom to show new text
if sliderValue == sliderMax then
self:GetNamedChild("Slider"):SetValue(numHistoryLines)
-- If the buffer is full start moving the slider up
elseif numHistoryLines == self:GetNamedChild("Buffer"):GetMaxHistoryLines() then
self:GetNamedChild("Slider"):SetValue(sliderValue-1)
end -- Else the slider does not move
-- If there are more history lines than visible lines show the slider
if numHistoryLines > numVisHistoryLines then
self:GetNamedChild("Slider"):SetHidden(false)
else
-- else hide the slider
self:GetNamedChild("Slider"):SetHidden(true)
end
end
function libmw:CreateMsgWindow(_UniqueName, _LabelText, _FadeDelay, _FadeTime)
-- Dimension Constraits
local minWidth = 200
local minHeight = 150
local tlw = WINDOW_MANAGER:CreateTopLevelWindow(_UniqueName)
tlw:SetMouseEnabled(true)
tlw:SetMovable(true)
tlw:SetHidden(false)
tlw:SetClampedToScreen(true)
tlw:SetDimensions(350, 400)
tlw:SetClampedToScreenInsets(-24)
tlw:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, 50,50)
tlw:SetDimensionConstraints(minWidth, minHeight)
tlw:SetResizeHandleSize(16)
-- Set Fade Delay/Times
tlw.fadeDelayWindow = _FadeDelay or 0
tlw.fadeTimeWindow = _FadeTime or 0
tlw.fadeDelayTextLines = tlw.fadeDelayWindow/1000
tlw.fadeTimeTextLines = tlw.fadeTimeWindow/1000
-- Create window fade timeline/animation
tlw.timeline = ANIMATION_MANAGER:CreateTimeline()
tlw.animation = tlw.timeline:InsertAnimation(ANIMATION_ALPHA, tlw, tlw.fadeDelayWindow)
tlw.animation:SetAlphaValues(1, 0)
tlw.animation:SetDuration(tlw.fadeTimeWindow)
tlw.timeline:PlayFromStart()
function tlw:AddText(_Message, _Red, _Green, _Blue)
local Red = _Red or 1
local Green = _Green or 1
local Blue = _Blue or 1
if not _Message then return end
-- Add message first
self:GetNamedChild("Buffer"):AddMessage(_Message, Red, Green, Blue)
-- Set new slider value & check visibility
AdjustSlider(self)
-- Reset Fade Timers
tlw:SetAlpha(1)
tlw.timeline:PlayFromStart()
end
function tlw:ChangeWinFade(_FadeDelay, _FadeTime)
if not (type(_FadeDelay) == "number" and type(_FadeTime) == "number") then return end
tlw.fadeDelayWindow = _FadeDelay
tlw.fadeTimeWindow = _FadeTime
tlw.timeline:SetAnimationOffset(tlw.animation, _FadeDelay)
tlw.animation:SetDuration(_FadeTime)
end
function tlw:ChangeTextFade(_FadeDelay, _FadeTime)
if not (type(_FadeDelay) == "number" and type(_FadeTime) == "number") then return end
tlw.fadeDelayTextLines = _FadeDelay/1000
tlw.fadeTimeTextLines = _FadeTime/1000
self:GetNamedChild("Buffer"):SetLineFade(_FadeDelay/1000, _FadeTime/1000)
end
function tlw:ClearText()
self:GetNamedChild("Buffer"):Clear()
end
local bg = WINDOW_MANAGER:CreateControl(_UniqueName.."Bg", tlw, CT_BACKDROP)
bg:SetAnchor(TOPLEFT, tlw, TOPLEFT, -8, -6)
bg:SetAnchor(BOTTOMRIGHT, tlw, BOTTOMRIGHT, 4, 4)
bg:SetEdgeTexture("EsoUI/Art/ChatWindow/chat_BG_edge.dds", 256, 256, 32)
bg:SetCenterTexture("EsoUI/Art/ChatWindow/chat_BG_center.dds")
bg:SetInsets(32, 32, -32, -32)
bg:SetDimensionConstraints(minWidth, minHeight)
local divider = WINDOW_MANAGER:CreateControl(_UniqueName.."Divider", tlw, CT_TEXTURE)
divider:SetDimensions(4, 8)
divider:SetAnchor(TOPLEFT, tlw, TOPLEFT, 20, 40)
divider:SetAnchor(TOPRIGHT, tlw, TOPRIGHT, -20, 40)
divider:SetTexture("EsoUI/Art/Miscellaneous/horizontalDivider.dds")
divider:SetTextureCoords(0.181640625, 0.818359375, 0, 1)
local buffer = WINDOW_MANAGER:CreateControl(_UniqueName.."Buffer", tlw, CT_TEXTBUFFER)
buffer:SetFont("ZoFontChat")
buffer:SetMaxHistoryLines(200)
buffer:SetMouseEnabled(true)
buffer:SetLinkEnabled(true)
buffer:SetAnchor(TOPLEFT, tlw, TOPLEFT, 20, 42)
buffer:SetAnchor(BOTTOMRIGHT, tlw, BOTTOMRIGHT, -35, -20)
buffer:SetLineFade(tlw.fadeDelayTextLines, tlw.fadeTimeTextLines)
buffer:SetHandler("OnLinkMouseUp", function(self, linkText, link, button)
-- ZO_PopupTooltip_SetLink(link)
ZO_LinkHandler_OnLinkMouseUp(link, button, self)
end)
buffer:SetDimensionConstraints(minWidth-55, minHeight-62)
buffer:SetHandler("OnMouseWheel", function(self, delta, ctrl, alt, shift)
local offset = delta
local slider = buffer:GetParent():GetNamedChild("Slider")
if shift then
offset = offset * buffer:GetNumVisibleLines()
elseif ctrl then
offset = offset * buffer:GetNumHistoryLines()
end
buffer:SetScrollPosition(buffer:GetScrollPosition() + offset)
slider:SetValue(slider:GetValue() - offset)
end)
buffer:SetHandler("OnMouseEnter", function(...)
tlw.timeline:Stop()
buffer:SetLineFade(0, 0)
buffer:ShowFadedLines()
tlw:SetAlpha(1)
end)
buffer:SetHandler("OnMouseExit", function(...)
buffer:SetLineFade(tlw.fadeDelayTextLines, tlw.fadeTimeTextLines)
tlw.timeline:PlayFromStart()
end)
local slider = WINDOW_MANAGER:CreateControl(_UniqueName.."Slider", tlw, CT_SLIDER)
slider:SetDimensions(15, 32)
slider:SetAnchor(TOPRIGHT, tlw, TOPRIGHT, -25, 60)
slider:SetAnchor(BOTTOMRIGHT, tlw, BOTTOMRIGHT, -15, -80)
slider:SetMinMax(1, 1)
slider:SetMouseEnabled(true)
slider:SetValueStep(1)
slider:SetValue(1)
slider:SetHidden(true)
slider:SetThumbTexture("EsoUI/Art/ChatWindow/chat_thumb.dds", "EsoUI/Art/ChatWindow/chat_thumb_disabled.dds", nil, 8, 22, nil, nil, 0.6875, nil)
slider:SetBackgroundMiddleTexture("EsoUI/Art/ChatWindow/chat_scrollbar_track.dds")
slider:SetHandler("OnValueChanged", function(self,value, eventReason)
local numHistoryLines = self:GetParent():GetNamedChild("Buffer"):GetNumHistoryLines()
local sliderValue = slider:GetValue()
if eventReason == EVENT_REASON_HARDWARE then
buffer:SetScrollPosition(numHistoryLines-sliderValue)
end
end)
local scrollUp = WINDOW_MANAGER:CreateControlFromVirtual(_UniqueName.."SliderScrollUp", slider, "ZO_ScrollUpButton")
scrollUp:SetAnchor(BOTTOM, slider, TOP, -1, 0)
scrollUp:SetNormalTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_up.dds")
scrollUp:SetPressedTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_down.dds")
scrollUp:SetMouseOverTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_over.dds")
scrollUp:SetDisabledTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_disabled.dds")
scrollUp:SetHandler("OnMouseDown", function(...)
buffer:SetScrollPosition(buffer:GetScrollPosition()+1)
slider:SetValue(slider:GetValue()-1)
end)
local scrollDown = WINDOW_MANAGER:CreateControlFromVirtual(_UniqueName.."SliderScrollDown", slider, "ZO_ScrollDownButton")
scrollDown:SetAnchor(TOP, slider, BOTTOM, -1, 0)
scrollDown:SetNormalTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_up.dds")
scrollDown:SetPressedTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_down.dds")
scrollDown:SetMouseOverTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_over.dds")
scrollDown:SetDisabledTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_disabled.dds")
scrollDown:SetHandler("OnMouseDown", function(...)
buffer:SetScrollPosition(buffer:GetScrollPosition()-1)
slider:SetValue(slider:GetValue()+1)
end)
local scrollEnd = WINDOW_MANAGER:CreateControlFromVirtual(_UniqueName.."SliderScrollEnd", slider, "ZO_ScrollEndButton")
scrollEnd:SetDimensions(16, 16)
scrollEnd:SetAnchor(TOP, scrollDown, BOTTOM, 0, 0)
scrollEnd:SetHandler("OnMouseDown", function(...)
buffer:SetScrollPosition(0)
slider:SetValue(buffer:GetNumHistoryLines())
end)
if _LabelText and _LabelText ~= "" then
local label = WINDOW_MANAGER:CreateControl(_UniqueName.."Label", tlw, CT_LABEL)
label:SetText(_LabelText)
label:SetFont("$(ANTIQUE_FONT)|24")
label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
local textHeight = label:GetTextHeight()
label:SetDimensionConstraints(minWidth-60, textHeight, nil, textHeight)
label:ClearAnchors()
label:SetAnchor(TOPLEFT, tlw, TOPLEFT, 30, (40-textHeight)/2+5)
label:SetAnchor(TOPRIGHT, tlw, TOPRIGHT, -30, (40-textHeight)/2+5)
end
return tlw
end