diff --git a/Content.Benchmarks/MapLoadBenchmark.cs b/Content.Benchmarks/MapLoadBenchmark.cs index 8c04d9a40dcd..bc050b59f160 100644 --- a/Content.Benchmarks/MapLoadBenchmark.cs +++ b/Content.Benchmarks/MapLoadBenchmark.cs @@ -46,7 +46,7 @@ public async Task Cleanup() PoolManager.Shutdown(); } - public static readonly string[] MapsSource = { "Empty", "Satlern", "Box", "Bagel", "Dev", "CentComm", "Core", "TestTeg", "Packed", "Omega", "Reach", "Meta", "Marathon", "MeteorArena", "Fland", "Oasis", "Cog" }; + public static readonly string[] MapsSource = { "Empty", "Satlern", "Box", "Bagel", "Dev", "CentComm", "Core", "TestTeg", "Packed", "Omega", "Reach", "Meta", "Marathon", "MeteorArena", "Fland", "Oasis", "Cog", "Convex"}; [ParamsSource(nameof(MapsSource))] public string Map; diff --git a/Content.Client/Cargo/BUI/CargoBountyConsoleBoundUserInterface.cs b/Content.Client/Cargo/BUI/CargoBountyConsoleBoundUserInterface.cs index 44c40143d830..04075000f5b9 100644 --- a/Content.Client/Cargo/BUI/CargoBountyConsoleBoundUserInterface.cs +++ b/Content.Client/Cargo/BUI/CargoBountyConsoleBoundUserInterface.cs @@ -39,6 +39,6 @@ protected override void UpdateState(BoundUserInterfaceState message) if (message is not CargoBountyConsoleState state) return; - _menu?.UpdateEntries(state.Bounties, state.UntilNextSkip); + _menu?.UpdateEntries(state.Bounties, state.History, state.UntilNextSkip); } } diff --git a/Content.Client/Cargo/UI/BountyHistoryEntry.xaml b/Content.Client/Cargo/UI/BountyHistoryEntry.xaml new file mode 100644 index 000000000000..905cf020ed1c --- /dev/null +++ b/Content.Client/Cargo/UI/BountyHistoryEntry.xaml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/Content.Client/Cargo/UI/BountyHistoryEntry.xaml.cs b/Content.Client/Cargo/UI/BountyHistoryEntry.xaml.cs new file mode 100644 index 000000000000..54804be641c3 --- /dev/null +++ b/Content.Client/Cargo/UI/BountyHistoryEntry.xaml.cs @@ -0,0 +1,49 @@ +using Content.Client.Message; +using Content.Shared.Cargo; +using Content.Shared.Cargo.Prototypes; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; + +namespace Content.Client.Cargo.UI; + +[GenerateTypedNameReferences] +public sealed partial class BountyHistoryEntry : BoxContainer +{ + [Dependency] private readonly IPrototypeManager _prototype = default!; + + public BountyHistoryEntry(CargoBountyHistoryData bounty) + { + RobustXamlLoader.Load(this); + IoCManager.InjectDependencies(this); + + if (!_prototype.TryIndex(bounty.Bounty, out var bountyPrototype)) + return; + + var items = new List(); + foreach (var entry in bountyPrototype.Entries) + { + items.Add(Loc.GetString("bounty-console-manifest-entry", + ("amount", entry.Amount), + ("item", Loc.GetString(entry.Name)))); + } + + ManifestLabel.SetMarkup(Loc.GetString("bounty-console-manifest-label", ("item", string.Join(", ", items)))); + RewardLabel.SetMarkup(Loc.GetString("bounty-console-reward-label", ("reward", bountyPrototype.Reward))); + IdLabel.SetMarkup(Loc.GetString("bounty-console-id-label", ("id", bounty.Id))); + + TimestampLabel.SetMarkup(bounty.Timestamp.ToString(@"hh\:mm\:ss")); + + if (bounty.Result == CargoBountyHistoryData.BountyResult.Completed) + { + NoticeLabel.SetMarkup(Loc.GetString("bounty-console-history-notice-completed-label")); + } + else + { + NoticeLabel.SetMarkup(Loc.GetString("bounty-console-history-notice-skipped-label", + ("id", bounty.ActorName ?? ""))); + } + } +} diff --git a/Content.Client/Cargo/UI/CargoBountyMenu.xaml b/Content.Client/Cargo/UI/CargoBountyMenu.xaml index bb263ff6c4ab..526ba69129bb 100644 --- a/Content.Client/Cargo/UI/CargoBountyMenu.xaml +++ b/Content.Client/Cargo/UI/CargoBountyMenu.xaml @@ -11,15 +11,28 @@ - - - - + + + + + + + diff --git a/Content.Client/Cargo/UI/CargoBountyMenu.xaml.cs b/Content.Client/Cargo/UI/CargoBountyMenu.xaml.cs index 3767b45e4bed..c289fb6ed83c 100644 --- a/Content.Client/Cargo/UI/CargoBountyMenu.xaml.cs +++ b/Content.Client/Cargo/UI/CargoBountyMenu.xaml.cs @@ -15,9 +15,12 @@ public sealed partial class CargoBountyMenu : FancyWindow public CargoBountyMenu() { RobustXamlLoader.Load(this); + + MasterTabContainer.SetTabTitle(0, Loc.GetString("bounty-console-tab-available-label")); + MasterTabContainer.SetTabTitle(1, Loc.GetString("bounty-console-tab-history-label")); } - public void UpdateEntries(List bounties, TimeSpan untilNextSkip) + public void UpdateEntries(List bounties, List history, TimeSpan untilNextSkip) { BountyEntriesContainer.Children.Clear(); foreach (var b in bounties) @@ -32,5 +35,21 @@ public void UpdateEntries(List bounties, TimeSpan untilNextSkip { MinHeight = 10 }); + + BountyHistoryContainer.Children.Clear(); + if (history.Count == 0) + { + NoHistoryLabel.Visible = true; + } + else + { + NoHistoryLabel.Visible = false; + + // Show the history in reverse, so last entry is first in the list + for (var i = history.Count - 1; i >= 0; i--) + { + BountyHistoryContainer.AddChild(new BountyHistoryEntry(history[i])); + } + } } } diff --git a/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs b/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs index 9047624f49be..d5cc4ecfa9a0 100644 --- a/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs +++ b/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs @@ -39,6 +39,8 @@ protected override void Open() SendMessage(new CriminalRecordChangeStatus(status, null)); _window.OnDialogConfirmed += (status, reason) => SendMessage(new CriminalRecordChangeStatus(status, reason)); + _window.OnStatusFilterPressed += (statusFilter) => + SendMessage(new CriminalRecordSetStatusFilter(statusFilter)); _window.OnHistoryUpdated += UpdateHistory; _window.OnHistoryClosed += () => _historyWindow?.Close(); _window.OnClose += Close; diff --git a/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml b/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml index 77da0ba1b065..d36718cf08ba 100644 --- a/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml +++ b/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml @@ -1,36 +1,142 @@ + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" + Title="{Loc 'criminal-records-console-window-title'}" + MinSize="695 440"> - - - - - - - - -