diff --git a/.editorconfig b/.editorconfig index 1583c600aa..8b92144453 100644 --- a/.editorconfig +++ b/.editorconfig @@ -344,6 +344,9 @@ resharper_keep_existing_attribute_arrangement = true resharper_wrap_chained_binary_patterns = chop_if_long resharper_wrap_chained_method_calls = chop_if_long resharper_csharp_trailing_comma_in_multiline_lists = true +resharper_csharp_qualified_using_at_nested_scope = false +resharper_csharp_prefer_qualified_reference = false +resharper_csharp_allow_alias = false [*.{csproj,xml,yml,yaml,dll.config,msbuildproj,targets,props}] indent_size = 2 diff --git a/.envrc b/.envrc index 7fd05db3e5..b1ad7237ed 100644 --- a/.envrc +++ b/.envrc @@ -1,4 +1,5 @@ -if ! has nix_direnv_version || ! nix_direnv_version 3.0.4; then - source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.4/direnvrc" "sha256-DzlYZ33mWF/Gs8DDeyjr8mnVmQGx7ASYqA5WlxwvBG4=" +set -e +if ! has nix_direnv_version || ! nix_direnv_version 3.0.6; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.6/direnvrc" "sha256-RYcUJaRMf8oF5LznDrlCXbkOQrywm0HDv1VjYGaJGdM=" fi use flake diff --git a/.github/workflows/publish-testing.yml b/.github/workflows/publish-testing.yml new file mode 100644 index 0000000000..aa3b35dea1 --- /dev/null +++ b/.github/workflows/publish-testing.yml @@ -0,0 +1,45 @@ +name: Publish Testing + +concurrency: + group: publish-testing + +on: + workflow_dispatch: + schedule: + - cron: '0 10 * * *' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3.6.0 + with: + submodules: 'recursive' + - name: Setup .NET Core + uses: actions/setup-dotnet@v3.2.0 + with: + dotnet-version: 9.0.x + + - name: Get Engine Tag + run: | + cd RobustToolbox + git fetch --depth=1 + + - name: Install dependencies + run: dotnet restore + + - name: Build Packaging + run: dotnet build Content.Packaging --configuration Release --no-restore /m + + - name: Package server + run: dotnet run --project Content.Packaging server --platform win-x64 --platform linux-x64 --platform osx-x64 --platform linux-arm64 + + - name: Package client + run: dotnet run --project Content.Packaging client --no-wipe-release + + - name: Publish version + run: Tools/publish_multi_request.py --fork-id wizards-testing + env: + PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }} + GITHUB_REPOSITORY: ${{ vars.GITHUB_REPOSITORY }} diff --git a/BuildChecker/BuildChecker.csproj b/BuildChecker/BuildChecker.csproj index 63d16fa970..4bd7fcf78c 100644 --- a/BuildChecker/BuildChecker.csproj +++ b/BuildChecker/BuildChecker.csproj @@ -12,12 +12,12 @@ You want to handle the Build, Clean and Rebuild tasks to prevent missing task er If you want to learn more about these kinds of things, check out Microsoft's official documentation about MSBuild: https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild --> - + python3 py -3 {C899FCA4-7037-4E49-ABC2-44DE72487110} - .NETFramework, Version=v4.7.2 + net4.7.2 false diff --git a/Content.Benchmarks/MapLoadBenchmark.cs b/Content.Benchmarks/MapLoadBenchmark.cs index abf99f9836..2bb71bb59d 100644 --- a/Content.Benchmarks/MapLoadBenchmark.cs +++ b/Content.Benchmarks/MapLoadBenchmark.cs @@ -47,7 +47,7 @@ public class MapLoadBenchmark 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", "Convex"}; [ParamsSource(nameof(MapsSource))] public string Map; diff --git a/Content.Client/Actions/ActionsSystem.cs b/Content.Client/Actions/ActionsSystem.cs index b594817701..5f0a8e1f2f 100644 --- a/Content.Client/Actions/ActionsSystem.cs +++ b/Content.Client/Actions/ActionsSystem.cs @@ -88,6 +88,7 @@ namespace Content.Client.Actions return; component.Whitelist = state.Whitelist; + component.Blacklist = state.Blacklist; component.CanTargetSelf = state.CanTargetSelf; BaseHandleState(uid, component, state); } @@ -137,6 +138,7 @@ namespace Content.Client.Actions component.Priority = state.Priority; component.AttachedEntity = EnsureEntity(state.AttachedEntity, uid); component.RaiseOnUser = state.RaiseOnUser; + component.RaiseOnAction = state.RaiseOnAction; component.AutoPopulate = state.AutoPopulate; component.Temporary = state.Temporary; component.ItemIconStyle = state.ItemIconStyle; diff --git a/Content.Client/Atmos/Consoles/AtmosAlertsComputerBoundUserInterface.cs b/Content.Client/Atmos/Consoles/AtmosAlertsComputerBoundUserInterface.cs index 6f0e7f80da..8abf0cbd73 100644 --- a/Content.Client/Atmos/Consoles/AtmosAlertsComputerBoundUserInterface.cs +++ b/Content.Client/Atmos/Consoles/AtmosAlertsComputerBoundUserInterface.cs @@ -11,6 +11,8 @@ public sealed class AtmosAlertsComputerBoundUserInterface : BoundUserInterface protected override void Open() { + base.Open(); + _menu = new AtmosAlertsComputerWindow(this, Owner); _menu.OpenCentered(); _menu.OnClose += Close; diff --git a/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs b/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs index 86cf0a9eb8..ad26436946 100644 --- a/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs +++ b/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs @@ -16,6 +16,7 @@ namespace Content.Client.Atmos.EntitySystems [Dependency] private readonly IResourceCache _resourceCache = default!; [Dependency] private readonly IOverlayManager _overlayMan = default!; [Dependency] private readonly SpriteSystem _spriteSys = default!; + [Dependency] private readonly SharedTransformSystem _xformSys = default!; private GasTileOverlay _overlay = default!; @@ -25,7 +26,7 @@ namespace Content.Client.Atmos.EntitySystems SubscribeNetworkEvent(HandleGasOverlayUpdate); SubscribeLocalEvent(OnHandleState); - _overlay = new GasTileOverlay(this, EntityManager, _resourceCache, ProtoMan, _spriteSys); + _overlay = new GasTileOverlay(this, EntityManager, _resourceCache, ProtoMan, _spriteSys, _xformSys); _overlayMan.AddOverlay(_overlay); } diff --git a/Content.Client/Atmos/Overlays/GasTileOverlay.cs b/Content.Client/Atmos/Overlays/GasTileOverlay.cs index 17027525e5..55aeaa12af 100644 --- a/Content.Client/Atmos/Overlays/GasTileOverlay.cs +++ b/Content.Client/Atmos/Overlays/GasTileOverlay.cs @@ -21,6 +21,7 @@ namespace Content.Client.Atmos.Overlays { private readonly IEntityManager _entManager; private readonly IMapManager _mapManager; + private readonly SharedTransformSystem _xformSys; public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities | OverlaySpace.WorldSpaceBelowWorld; private readonly ShaderInstance _shader; @@ -46,10 +47,11 @@ namespace Content.Client.Atmos.Overlays public const int GasOverlayZIndex = (int) Shared.DrawDepth.DrawDepth.Effects; // Under ghosts, above mostly everything else - public GasTileOverlay(GasTileOverlaySystem system, IEntityManager entManager, IResourceCache resourceCache, IPrototypeManager protoMan, SpriteSystem spriteSys) + public GasTileOverlay(GasTileOverlaySystem system, IEntityManager entManager, IResourceCache resourceCache, IPrototypeManager protoMan, SpriteSystem spriteSys, SharedTransformSystem xformSys) { _entManager = entManager; _mapManager = IoCManager.Resolve(); + _xformSys = xformSys; _shader = protoMan.Index("unshaded").Instance(); ZIndex = GasOverlayZIndex; @@ -158,7 +160,8 @@ namespace Content.Client.Atmos.Overlays _fireFrameCounter, _shader, overlayQuery, - xformQuery); + xformQuery, + _xformSys); var mapUid = _mapManager.GetMapEntityId(args.MapId); @@ -180,7 +183,8 @@ namespace Content.Client.Atmos.Overlays int[] fireFrameCounter, ShaderInstance shader, EntityQuery overlayQuery, - EntityQuery xformQuery) state) => + EntityQuery xformQuery, + SharedTransformSystem xformSys) state) => { if (!state.overlayQuery.TryGetComponent(uid, out var comp) || !state.xformQuery.TryGetComponent(uid, out var gridXform)) @@ -188,7 +192,7 @@ namespace Content.Client.Atmos.Overlays return true; } - var (_, _, worldMatrix, invMatrix) = gridXform.GetWorldPositionRotationMatrixWithInv(); + var (_, _, worldMatrix, invMatrix) = state.xformSys.GetWorldPositionRotationMatrixWithInv(gridXform); state.drawHandle.SetTransform(worldMatrix); var floatBounds = invMatrix.TransformBox(state.WorldBounds).Enlarged(grid.TileSize); var localBounds = new Box2i( diff --git a/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml b/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml index 1b7bd490b8..003a2203d5 100644 --- a/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml +++ b/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml @@ -1,6 +1,6 @@ + MinSize="280 160" Title="{Loc comp-space-heater-ui-title}"> diff --git a/Content.Client/Buckle/BuckleSystem.cs b/Content.Client/Buckle/BuckleSystem.cs index 035e1300ca..40b2092a26 100644 --- a/Content.Client/Buckle/BuckleSystem.cs +++ b/Content.Client/Buckle/BuckleSystem.cs @@ -3,13 +3,15 @@ using Content.Shared.Buckle; using Content.Shared.Buckle.Components; using Content.Shared.Rotation; using Robust.Client.GameObjects; -using Robust.Shared.GameStates; +using Robust.Client.Graphics; namespace Content.Client.Buckle; internal sealed class BuckleSystem : SharedBuckleSystem { [Dependency] private readonly RotationVisualizerSystem _rotationVisualizerSystem = default!; + [Dependency] private readonly IEyeManager _eye = default!; + [Dependency] private readonly SharedTransformSystem _xformSystem = default!; public override void Initialize() { @@ -17,6 +19,8 @@ internal sealed class BuckleSystem : SharedBuckleSystem SubscribeLocalEvent(OnAppearanceChange); SubscribeLocalEvent(OnStrapMoveEvent); + SubscribeLocalEvent(OnBuckledEvent); + SubscribeLocalEvent(OnUnbuckledEvent); } private void OnStrapMoveEvent(EntityUid uid, StrapComponent component, ref MoveEvent args) @@ -28,13 +32,21 @@ internal sealed class BuckleSystem : SharedBuckleSystem // This code is garbage, it doesn't work with rotated viewports. I need to finally get around to reworking // sprite rendering for entity layers & direction dependent sorting. + // Future notes: + // Right now this doesn't handle: other grids, other grids rotating, the camera rotation changing, and many other fun rotation specific things + // The entire thing should be a concern of the engine, or something engine helps to implement properly. + // Give some of the sprite rotations their own drawdepth, maybe as an offset within the rsi, or something like this + // And we won't ever need to set the draw depth manually + if (args.NewRotation == args.OldRotation) return; if (!TryComp(uid, out var strapSprite)) return; - var isNorth = Transform(uid).LocalRotation.GetCardinalDir() == Direction.North; + var angle = _xformSystem.GetWorldRotation(uid) + _eye.CurrentEye.Rotation; // Get true screen position, or close enough + + var isNorth = angle.GetCardinalDir() == Direction.North; foreach (var buckledEntity in component.BuckledEntities) { if (!TryComp(buckledEntity, out var buckle)) @@ -45,6 +57,7 @@ internal sealed class BuckleSystem : SharedBuckleSystem if (isNorth) { + // This will only assign if empty, it won't get overwritten by new depth on multiple calls, which do happen easily buckle.OriginalDrawDepth ??= buckledSprite.DrawDepth; buckledSprite.DrawDepth = strapSprite.DrawDepth - 1; } @@ -56,6 +69,42 @@ internal sealed class BuckleSystem : SharedBuckleSystem } } + /// + /// Lower the draw depth of the buckled entity without needing for the strap entity to rotate/move. + /// Only do so when the entity is facing screen-local north + /// + private void OnBuckledEvent(Entity ent, ref BuckledEvent args) + { + if (!TryComp(args.Strap, out var strapSprite)) + return; + + if (!TryComp(ent.Owner, out var buckledSprite)) + return; + + var angle = _xformSystem.GetWorldRotation(args.Strap) + _eye.CurrentEye.Rotation; // Get true screen position, or close enough + + if (angle.GetCardinalDir() != Direction.North) + return; + + ent.Comp.OriginalDrawDepth ??= buckledSprite.DrawDepth; + buckledSprite.DrawDepth = strapSprite.DrawDepth - 1; + } + + /// + /// Was the draw depth of the buckled entity lowered? Reset it upon unbuckling. + /// + private void OnUnbuckledEvent(Entity ent, ref UnbuckledEvent args) + { + if (!TryComp(ent.Owner, out var buckledSprite)) + return; + + if (!ent.Comp.OriginalDrawDepth.HasValue) + return; + + buckledSprite.DrawDepth = ent.Comp.OriginalDrawDepth.Value; + ent.Comp.OriginalDrawDepth = null; + } + private void OnAppearanceChange(EntityUid uid, BuckleComponent component, ref AppearanceChangeEvent args) { if (!TryComp(uid, out var rotVisuals)) diff --git a/Content.Client/Cargo/BUI/CargoBountyConsoleBoundUserInterface.cs b/Content.Client/Cargo/BUI/CargoBountyConsoleBoundUserInterface.cs index 44c40143d8..04075000f5 100644 --- a/Content.Client/Cargo/BUI/CargoBountyConsoleBoundUserInterface.cs +++ b/Content.Client/Cargo/BUI/CargoBountyConsoleBoundUserInterface.cs @@ -39,6 +39,6 @@ public sealed class CargoBountyConsoleBoundUserInterface : BoundUserInterface 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 0000000000..905cf020ed --- /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 0000000000..54804be641 --- /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 bb263ff6c4..526ba69129 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 3767b45e4b..c289fb6ed8 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 sealed partial class CargoBountyMenu : FancyWindow { 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/Changelog/ChangelogWindow.xaml.cs b/Content.Client/Changelog/ChangelogWindow.xaml.cs index 9b7fd75436..cb07e16a9c 100644 --- a/Content.Client/Changelog/ChangelogWindow.xaml.cs +++ b/Content.Client/Changelog/ChangelogWindow.xaml.cs @@ -8,6 +8,8 @@ using JetBrains.Annotations; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface; using Robust.Client.UserInterface.XAML; +using Robust.Shared; +using Robust.Shared.Configuration; using Robust.Shared.Console; namespace Content.Client.Changelog @@ -15,8 +17,9 @@ namespace Content.Client.Changelog [GenerateTypedNameReferences] public sealed partial class ChangelogWindow : FancyWindow { - [Dependency] private readonly IClientAdminManager _adminManager = default!; [Dependency] private readonly ChangelogManager _changelog = default!; + [Dependency] private readonly IClientAdminManager _adminManager = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; public ChangelogWindow() { @@ -67,8 +70,22 @@ namespace Content.Client.Changelog Tabs.SetTabTitle(i++, Loc.GetString($"changelog-tab-title-{changelog.Name}")); } - var version = typeof(ChangelogWindow).Assembly.GetName().Version ?? new Version(1, 0); - VersionLabel.Text = Loc.GetString("changelog-version-tag", ("version", version.ToString())); + // Try to get the current version from the build.json file + var version = _cfg.GetCVar(CVars.BuildVersion); + var forkId = _cfg.GetCVar(CVars.BuildForkId); + + var versionText = Loc.GetString("changelog-version-unknown"); + + // Make sure these aren't empty, like in a dev env + if (!string.IsNullOrEmpty(version) && !string.IsNullOrEmpty(forkId)) + { + versionText = Loc.GetString("changelog-version-tag", + ("fork", forkId), + ("version", version[..7])); // Only show the first 7 characters + } + + // if else statements are ugly, shut up + VersionLabel.Text = versionText; TabsUpdated(); } diff --git a/Content.Client/Chat/UI/EmotesMenu.xaml b/Content.Client/Chat/UI/EmotesMenu.xaml index cc4d5bb77e..845b631617 100644 --- a/Content.Client/Chat/UI/EmotesMenu.xaml +++ b/Content.Client/Chat/UI/EmotesMenu.xaml @@ -1,4 +1,4 @@ - - - + + - - + + - - + + - + - + - + - + diff --git a/Content.Client/Chat/UI/EmotesMenu.xaml.cs b/Content.Client/Chat/UI/EmotesMenu.xaml.cs index f3b7837f21..80daa405a6 100644 --- a/Content.Client/Chat/UI/EmotesMenu.xaml.cs +++ b/Content.Client/Chat/UI/EmotesMenu.xaml.cs @@ -50,7 +50,6 @@ public sealed partial class EmotesMenu : RadialMenu var button = new EmoteMenuButton { - StyleClasses = { "RadialMenuButton" }, SetSize = new Vector2(64f, 64f), ToolTip = Loc.GetString(emote.Name), ProtoId = emote.ID, @@ -106,7 +105,7 @@ public sealed partial class EmotesMenu : RadialMenu } -public sealed class EmoteMenuButton : RadialMenuTextureButton +public sealed class EmoteMenuButton : RadialMenuTextureButtonWithSector { public ProtoId ProtoId { get; set; } } diff --git a/Content.Client/Clickable/ClickMapManager.cs b/Content.Client/Clickable/ClickMapManager.cs index 6a77c7e054..557ef57ef1 100644 --- a/Content.Client/Clickable/ClickMapManager.cs +++ b/Content.Client/Clickable/ClickMapManager.cs @@ -20,7 +20,7 @@ namespace Content.Client.Clickable "/Textures/Logo", }; - private const float Threshold = 0.25f; + private const float Threshold = 0.1f; private const int ClickRadius = 2; [Dependency] private readonly IResourceCache _resourceCache = default!; diff --git a/Content.Client/CrewManifest/UI/CrewManifestSection.cs b/Content.Client/CrewManifest/UI/CrewManifestSection.cs index 29cf850e2b..1e853bf153 100644 --- a/Content.Client/CrewManifest/UI/CrewManifestSection.cs +++ b/Content.Client/CrewManifest/UI/CrewManifestSection.cs @@ -22,7 +22,7 @@ public sealed class CrewManifestSection : BoxContainer AddChild(new Label() { StyleClasses = { "LabelBig" }, - Text = Loc.GetString($"department-{section.ID}") + Text = Loc.GetString(section.Name) }); var gridContainer = new GridContainer() diff --git a/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs b/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs index 9047624f49..d5cc4ecfa9 100644 --- a/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs +++ b/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs @@ -39,6 +39,8 @@ public sealed class CriminalRecordsConsoleBoundUserInterface : BoundUserInterfac 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 77da0ba1b0..179304a978 100644 --- a/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml +++ b/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml @@ -1,36 +1,140 @@ + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" + Title="{Loc 'criminal-records-console-window-title'}" + MinSize="695 440"> - - - - - - - - -