h2-mod/data/cdata/ui_scripts/motd/featured.lua
2023-03-03 21:57:19 +01:00

582 lines
16 KiB
Lua

motd.getfeaturedtabtitle = function(index)
return motd.getfeaturedtab(index).tab_title or ""
end
local animmsfull = 150
local animms = animmsfull / 2
local minimized = false
LUI.onmenuopen("main_campaign", function(menu)
if (mods.getloaded() ~= nil or motd.getnumfeaturedtabs() <= 0) then
return
end
local left = 885
local featuredcontainer = LUI.UIElement.new({
leftAnchor = true,
topAnchor = true,
left = left,
top = 420,
})
featuredcontainer:registerAnimationState("hide", {
leftAnchor = true,
topAnchor = true,
left = left,
top = 570,
})
featuredcontainer:registerAnimationState("show", {
leftAnchor = true,
topAnchor = true,
left = left,
top = 420,
})
local featuredstencil = LUI.UIStencilText.new({
leftAnchor = true,
topAnchor = true,
height = 200,
width = GenericMenuDims.menu_width_standard + (10 + 12) * 2,
})
local featured = LUI.UIElement.new({
left = 20,
leftAnchor = true,
topAnchor = true,
bottomAnchor = true,
rightAnchor = true
})
local arrowcontainer = LUI.UIElement.new({
leftAnchor = true,
topAnchor = true,
bottomAnchor = true,
rightAnchor = true
})
arrowcontainer:registerAnimationState("hide", {
alpha = 0
})
arrowcontainer:registerAnimationState("show", {
alpha = 1
})
featured:addElement(arrowcontainer)
featuredstencil:registerAnimationState("hide", {
leftAnchor = true,
topAnchor = true,
height = GenericButtonSettings.Styles.FlatButton.height + 2,
width = GenericMenuDims.menu_width_standard + (10 + 12) * 2,
})
local istopmost = function()
return LUI.FlowManager.IsMenuTopmost(Engine.GetLuiRoot(), "main_campaign")
end
featuredstencil:registerAnimationState("show", {
leftAnchor = true,
topAnchor = true,
height = 200,
width = GenericMenuDims.menu_width_standard + (10 + 12) * 2,
})
local hoverelem = LUI.UIElement.new({
leftAnchor = true,
topAnchor = true,
top = -10,
height = 150 + GenericButtonSettings.Styles.FlatButton.height + 2 + 10,
width = GenericMenuDims.menu_width_standard + 50,
left = -25
})
local header = LUI.UIElement.new({
topAnchor = true,
leftAnchor = true,
width = GenericMenuDims.menu_width_standard,
height = GenericButtonSettings.Styles.FlatButton.height,
})
local headerbg = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
bottomAnchor = true,
rightAnchor = true,
alpha = 0.55,
color = Colors.grey_14,
material = RegisterMaterial("white")
})
local headerbutton = LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
height = 10,
width = 10,
top = 10.5,
left = 10,
zRot = -90,
color = {
r = 0.6,
g = 0.6,
b = 0.6,
},
material = RegisterMaterial("widg_lobby_arrow")
})
headerbutton:registerEventHandler("mouseenter", function()
if (not istopmost()) then
return
end
Engine.PlaySound(CoD.SFX.MouseOver)
headerbutton:animateToState("focused")
end)
headerbutton:registerEventHandler("mouseleave", function()
headerbutton:animateToState("unfocused")
end)
headerbutton:registerAnimationState("down", {
zRot = -90
})
headerbutton:registerAnimationState("right", {
zRot = 0
})
headerbutton:registerAnimationState("focused", {
color = Colors.h2.yellow
})
headerbutton:registerAnimationState("unfocused", {
color = {
r = 0.6,
g = 0.6,
b = 0.6,
}
})
local tabcount = motd.getnumfeaturedtabs()
headerbutton:setHandleMouse(true)
headerbutton:registerEventHandler("leftmousedown", function()
Engine.PlaySound(CoD.SFX.MenuAccept)
headerbutton:processEvent({
name = "mouseleave"
})
minimized = not minimized
if (minimized) then
featuredstencil:animateToState("hide", animms)
featuredcontainer:animateToState("hide", animms)
headerbutton:animateToState("right", animms)
arrowcontainer:animateToState("hide", animms)
else
featuredstencil:animateToState("show", animms)
featuredcontainer:animateToState("show", animms)
headerbutton:animateToState("down", animms)
if (tabcount > 1) then
arrowcontainer:animateToState("show", animms)
end
end
end)
if (minimized) then
featuredstencil:animateToState("hide")
featuredcontainer:animateToState("hide")
headerbutton:animateToState("right")
arrowcontainer:animateToState("hide")
end
header:addElement(headerbg)
header:addElement(headerbutton)
local headertext = LUI.UIText.new({
leftAnchor = true,
left = GenericButtonSettings.Styles.FlatButton.text_padding_with_content + 10,
top = -CoD.TextSettings.Font19.Height / 2 + 1.5,
font = CoD.TextSettings.Font19.Font,
height = CoD.TextSettings.Font19.Height
})
local rightoffset = -15
local pips = {}
local focusindex = 0
local shiftto = nil
for i = 1, tabcount do
local pipmat = RegisterMaterial("h1_ui_featured_pip_unfocused")
local ratio = Engine.GetMaterialAspectRatio(pipmat)
local height = 14
local pip = LUI.UIImage.new({
topAnchor = true,
rightAnchor = true,
top = GenericButtonSettings.Styles.FlatButton.height / 2 - height / 2,
width = ratio * height,
height = height,
material = RegisterMaterial("h1_ui_featured_pip_unfocused"),
right = rightoffset
})
pip:setHandleMouse(true)
pip:registerEventHandler("mouseenter", function()
if (not istopmost() or minimized) then
return
end
Engine.PlaySound(CoD.SFX.MouseOver)
end)
pip:registerEventHandler("leftmousedown", function()
if (not istopmost() or minimized) then
return
end
Engine.PlaySound(CoD.SFX.MenuAccept)
shiftto(#pips - i)
end)
pip:registerAnimationState("focused", {
material = RegisterMaterial("h2_ui_featured_pip_focused"),
})
pip:registerAnimationState("unfocused", {
material = RegisterMaterial("h1_ui_featured_pip_unfocused"),
})
table.insert(pips, pip)
header:addElement(pip)
rightoffset = rightoffset - height
end
pips[#pips]:animateToState("focused")
headertext:setText(Engine.ToUpperCase(Engine.Localize("@LUA_MENU_FEATURED")))
local content = LUI.UIElement.new({
topAnchor = true,
leftAnchor = true,
top = GenericButtonSettings.Styles.FlatButton.height + 3,
width = GenericMenuDims.menu_width_standard,
height = 150,
})
local stencil = LUI.UIStencilText.new({
topAnchor = true,
leftAnchor = true,
bottomAnchor = true,
rightAnchor = true,
left = 1,
})
local imagelist = LUI.UIHorizontalList.new( {
left = 0,
leftAnchor = true,
width = (GenericMenuDims.menu_width_standard) * tabcount,
height = 150,
spacing = 0
} )
stencil:addElement(imagelist)
local contentborder = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
bottomAnchor = true,
rightAnchor = true,
alpha = 0,
material = RegisterMaterial("h2_ui_btn_focused_stroke_square")
})
contentborder:registerAnimationState("unfocused", {
alpha = 0
})
contentborder:registerAnimationState("focused", {
alpha = 1
})
contentborder:setup9SliceImage()
local shift = function()
imagelist:registerAnimationState("move", {
leftAnchor = true,
left = (focusindex) * -GenericMenuDims.menu_width_standard
})
imagelist:animateToState("move", animmsfull)
end
shiftto = function(index)
local prevfocus = focusindex
focusindex = (index) % tabcount
pips[#pips - (prevfocus)]:animateToState("unfocused")
pips[#pips - (focusindex)]:animateToState("focused")
shift()
end
local shiftright = function()
local prevfocus = focusindex
focusindex = (focusindex + 1) % tabcount
pips[#pips - (prevfocus)]:animateToState("unfocused")
pips[#pips - (focusindex)]:animateToState("focused")
shift()
end
local shiftleft = function()
local prevfocus = focusindex
focusindex = (focusindex - 1) % tabcount
pips[#pips - (prevfocus)]:animateToState("unfocused")
pips[#pips - (focusindex)]:animateToState("focused")
shift()
end
for i = 1, tabcount do
local panel = LUI.UIElement.new({
topAnchor = true,
leftAnchor = true,
bottomAnchor = true,
width = GenericMenuDims.menu_width_standard,
})
local text = LUI.UIText.new({
bottomAnchor = true,
leftAnchor = true,
rightAnchor = true,
alignment = LUI.Alignment.Center,
bottom = (-CoD.TextSettings.Font21.Height / 2) + 2,
height = CoD.TextSettings.Font21.Height,
font = CoD.TextSettings.Font21.Font,
})
local textbg = LUI.UIImage.new({
bottomAnchor = true,
leftAnchor = true,
rightAnchor = true,
height = CoD.TextSettings.Font21.Height * 2,
alpha = 0.75,
material = RegisterMaterial("black")
})
text:setText(motd.getfeaturedtabtitle(i - 1))
local material = RegisterMaterial("featured_panel_thumbnail_" .. i)
local ratio = Engine.GetMaterialAspectRatio(material)
local width = GenericMenuDims.menu_width_standard
local height = width / ratio
local contentimage = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
width = width,
height = height,
material = material,
})
panel:addElement(contentimage)
panel:addElement(textbg)
panel:addElement(text)
imagelist:addElement(panel)
end
local autoscrolltimer = LUI.UITimer.new(3000, "autoscroll")
featured:addElement(autoscrolltimer)
featured:registerEventHandler("autoscroll", function()
if (not minimized) then
shiftright()
end
end)
local addarrows = function()
local arrowmat = RegisterMaterial("h1_prestige_leftright_arrow")
local arrowratio = Engine.GetMaterialAspectRatio(arrowmat)
local height = 20
local width = arrowratio * height
local arrowleft = LUI.UIImage.new({
leftAnchor = true,
left = -width - 10,
top = -10,
height = height,
width = width,
alpha = 0,
material = RegisterMaterial("h1_prestige_leftright_arrow")
})
local arrowright = LUI.UIImage.new({
rightAnchor = true,
right = 0,
top = -10,
height = height,
width = width,
zRot = 180,
alpha = 0,
material = RegisterMaterial("h1_prestige_leftright_arrow")
})
local registeranimationstate = function(name, state)
arrowleft:registerAnimationState(name, state)
arrowright:registerAnimationState(name, state)
end
registeranimationstate("pulse", {
scale = -0.1
})
registeranimationstate("highlight", {
scale = 0
})
registeranimationstate("focused", {
alpha = 1
})
registeranimationstate("unfocused", {
alpha = 0
})
arrowleft:setHandleMouse(true)
arrowright:setHandleMouse(true)
local pulsearrow = function(arrow)
arrow:animateInSequence({
{
"highlight",
0
},
{
"pulse",
100
},
{
"highlight",
100
}
})
end
arrowleft:registerEventHandler("leftmousedown", function()
if (not istopmost()) then
return
end
pulsearrow(arrowleft)
Engine.PlaySound(CoD.SFX.MouseOver)
shiftleft()
end)
arrowright:registerEventHandler("leftmousedown", function()
if (not istopmost()) then
return
end
pulsearrow(arrowright)
Engine.PlaySound(CoD.SFX.MouseOver)
shiftright()
end)
arrowcontainer:addElement(arrowleft)
arrowcontainer:addElement(arrowright)
featured.arrowleft = arrowleft
featured.arrowright = arrowright
end
addarrows()
if (tabcount <= 1) then
arrowcontainer:animateToState("hide")
end
featured:registerEventHandler("focused", function()
contentborder:animateToState("focused", animms)
featured.arrowleft:animateToState("focused", animms)
featured.arrowright:animateToState("focused", animms)
LUI.UITimer.Stop(autoscrolltimer)
end)
featured:registerEventHandler("unfocused", function()
contentborder:animateToState("unfocused", animms)
featured.arrowleft:animateToState("unfocused", animms)
featured.arrowright:animateToState("unfocused", animms)
LUI.UITimer.Reset(autoscrolltimer)
end)
hoverelem:setHandleMouseMove(true)
hoverelem:registerEventHandler("mouseenter", function()
if (not istopmost()) then
return
end
featured:processEvent({
name = "focused",
dispatchChildren = true
})
end)
hoverelem:registerEventHandler("mouseleave", function()
featured:processEvent({
name = "unfocused",
dispatchChildren = true
})
end)
header:addElement(headertext)
header:addElement(LUI.DecoFrame.new(nil, LUI.DecoFrame.Grey))
featured:addElement(header)
content:addElement(stencil)
content:addElement(LUI.DecoFrame.new(nil, LUI.DecoFrame.Grey))
content:addElement(contentborder)
content:setHandleMouse(true)
content:registerEventHandler("leftmousedown", function()
if (not istopmost() or minimized) then
return
end
hoverelem:processEvent({
name = "mouseleave",
})
Engine.PlaySound(CoD.SFX.MenuAccept)
local data = motd.getfeaturedtab(focusindex)
data.popup_image = "featured_panel_" .. (focusindex + 1)
LUI.FlowManager.RequestPopupMenu( nil, "motd_main", true, nil, false, {
popupDataQueue = {data}
})
end)
content:registerEventHandler("mouseenter", function()
if (not istopmost() or minimized) then
return
end
Engine.PlaySound(CoD.SFX.MouseOver)
end)
featured:addElement(content)
featured:addElement(hoverelem)
featuredstencil:addElement(featured)
featuredcontainer:addElement(featuredstencil)
menu:addElement(featuredcontainer)
end)