Editor/Panels/SettingsPanel.cs

An editor UI widget for SuperShot settings. It builds the Settings panel with sections for capture resolution, capture content, and output settings, binds serialized settings properties to UI sheets, and provides an Open Output Folder button.

File Access
using System;
using Sandbox;

namespace Editor.SuperShot;

public sealed class SettingsPanel : Widget
{
	readonly SuperShotWindow _window;

	public SettingsPanel( SuperShotWindow window ) : base( null )
	{
		_window = window;
		Name = "Settings";
		WindowTitle = "Settings";
		SetWindowIcon( "settings" );
		Layout = Layout.Column();
		Layout.Margin = 8;
		Layout.Spacing = 8;

		Build();
	}

	void Build()
	{
		SuperShotUI.AddBanner( Layout, "Settings", "Where shots are saved and how they're named.", "settings" );

		var scroll = new ScrollArea( this );
		scroll.Canvas = new Widget( scroll );
		scroll.Canvas.Layout = Layout.Column();
		scroll.Canvas.Layout.Spacing = 8;
		var body = scroll.Canvas.Layout;

		var captureSo = _window.Settings.Capture.GetSerialized();
		captureSo.OnPropertyChanged += _ =>
		{
			_window.Settings.Save();
			_window.NotifyChanged();
		};
		var resCard = SuperShotUI.AddCard( body, "Default Capture Resolution", "aspect_ratio" );
		resCard.Body.Add( new Label( "Used by the main Capture button. Quick presets and package thumbnails override this per click." ) );
		resCard.Body.Add( SuperShotUI.SheetWidget( captureSo, IsResolutionProp ) );

		var content = SuperShotUI.AddCard( body, "Capture Content", "visibility" );
		content.Body.Add( new Label( "Controls what non-world content is included when Supershot renders a capture." ) { WordWrap = true } );
		content.Body.Add( SuperShotUI.SheetWidget( captureSo, IsCaptureContentProp ) );

		var outputSo = _window.Settings.Output.GetSerialized();
		outputSo.OnPropertyChanged += _ => _window.Settings.Save();

		var output = SuperShotUI.AddCard( body, "Output", "folder" );
		output.Body.Add( SuperShotUI.SheetWidget( outputSo, IsOutputEssential ) );

		SuperShotUI.AddSection( body, "Advanced Output", "tune",
			SuperShotUI.SheetWidget( outputSo, p => !IsOutputEssential( p ) ),
			cookie: "supershot.settings.outputadvanced" );

		body.AddStretchCell();
		Layout.Add( scroll, 1 );

		var row = Layout.AddRow();
		row.Spacing = 4;
		row.Add( new Button( "Open Output Folder", "folder_open" )
		{
			Clicked = () => SuperShotService.RevealInExplorer( _window.Settings.Output.ResolveFolder() )
		} );
		row.AddStretchCell();
	}

	static bool IsResolutionProp( SerializedProperty p )
	{
		return p.Name is nameof( CaptureSettings.Resolution )
			or nameof( CaptureSettings.CustomWidth )
			or nameof( CaptureSettings.CustomHeight );
	}

	static bool IsCaptureContentProp( SerializedProperty p )
	{
		return p.Name is nameof( CaptureSettings.ShowGameUI )
			or nameof( CaptureSettings.TransparentBackground )
			or nameof( CaptureSettings.HideTags );
	}

	static bool IsOutputEssential( SerializedProperty p )
	{
		return p.Name is nameof( OutputSettings.OutputFolder )
			or nameof( OutputSettings.Format )
			or nameof( OutputSettings.Quality );
	}
}