Files
sbox-public/game/addons/base/code/UI/Components/PackageCard.razor
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

138 lines
3.5 KiB
Plaintext

@using Sandbox;
@using Sandbox.UI;
@namespace Sandbox.UI
@inherits Panel
@{
var aspect = this.Box.RectOuter.Size.x / this.Box.RectOuter.Size.y;
var bg = Package.Thumb;
if (aspect < 0.8f) bg = Package.ThumbTall;
if (aspect > 1.2f) bg = Package.ThumbWide;
if (this.HasHovered)
{
bg = Package.VideoThumb ?? bg;
}
}
<root class="card card-vertical card-package @FavouriteClass @RatingClass">
<div class="card-image" @onrightclick=@OnCardRightClicked onclick=@OnCardClicked style="background-image: url( @bg )">
@if ( Decorated )
{
if (Package.Public == false)
{
<div class="card-decorator-hidden" tooltip="This is hidden from the public">Hidden</div>
}
if ( UsersNow > 0 )
{
<div class="card-decorator-users" tooltip="This many users are playing now">
<i>sports_esports</i>
<span> @UsersNow.KiloFormat() </span>
</div>
}
else if ( Package.Usage.UsersNow > 0 )
{
<div class="card-decorator-users" tooltip="This many users are playing now">
<i>sports_esports</i>
<span> @Package.Usage.UsersNow.KiloFormat() </span>
</div>
}
}
</div>
<div class="package-card-body">
<label class="title" @onclick=@OnCardClicked>@Package.Title</label>
<label class="orgname" onclick=@( () => Game.Overlay.ShowOrganizationModal( Package.Org ) )>@Package.Org.Title</label>
</div>
</root>
@code
{
[Parameter] public Package Package { get; set; }
/// <summary>
/// Called when the icon part of the card is pressed
/// </summary>
[Parameter] public System.Action OnLaunch { get; set; }
/// <summary>
/// Called when the icon part of the card is right clicked
/// </summary>
[Parameter] public System.Action OnMenu { get; set; }
[Parameter] public bool Decorated { get; set; } = true;
public int UsersNow { get; set; }
protected override int BuildHash() => HashCode.Combine(Package, this.HasHovered, this.Box.RectOuter.Size);
string FavouriteClass => Package.Interaction.Favourite ? "is-favourite" : "";
string RatingClass
{
get
{
if (Package.Interaction.Rating == null) return "";
if (Package.Interaction.Rating == 0) return "is-rated-up";
if (Package.Interaction.Rating == 1) return "is-rated-down";
return "";
}
}
public string FormatHoursPlayed()
{
double minutes = Package.Interaction.Seconds / 60.0;
if ( minutes < 60 )
return minutes.ToString("0m");
double hours = Package.Interaction.Seconds / 60.0 / 60.0;
if (hours > 10)
return hours.ToString("0h");
return hours.ToString("0.#h");
}
public string UpdatedString()
{
return Package.Updated.LocalDateTime.ToRelativeTimeString();
}
void OnCardClicked()
{
OnLaunch?.Invoke();
}
void OnCardRightClicked()
{
OnMenu?.Invoke();
}
[Event("package.update.users")]
public void UpdateUsers( string ident, long value )
{
if (ident != Package.FullIdent) return;
var u = Package.Usage;
u.UsersNow = value;
Package.Usage = u;
StateHasChanged();
}
[Event("package.update.favourites")]
public void UpdateFaves(string ident, long value)
{
if (ident != Package.FullIdent) return;
Package.Favourited = (int) value;
StateHasChanged();
}
}