Editor/Panels/SettingsPanel.cs

An editor UI widget for the SuperShot settings panel. It builds the settings window UI, binds serialized settings objects to form widgets, saves settings on change, and provides controls for resolution and output folder options including a button to open the output folder in the OS explorer.

File AccessNative Interop
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 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 IsOutputEssential( SerializedProperty p )
	{
		return p.Name is nameof( OutputSettings.OutputFolder )
			or nameof( OutputSettings.Format )
			or nameof( OutputSettings.Quality );
	}
}