Editor UI builder for the SuperShot tool. It constructs a menu in the editor MenuBar with capture, quick capture resolutions, package thumbnail options, navigation to editor docks, sharing (Discord and upload), view options and toggles, and wires menu commands to SuperShotService and SuperShotWindow functionality.
using Editor;
using Editor.SuperShot;
using Sandbox;
public static class SuperShotMenu
{
[Event( "refresh" )]
public static void BuildMenu()
{
var bar = Sandbox.Internal.GlobalToolsNamespace.EditorWindow?.MenuBar;
if ( bar is null || !bar.IsValid )
return;
var root = bar.FindOrCreateMenu( "Supershot" );
if ( root is null )
return;
root.Clear();
root.AddOption( "Capture Current View", "photo_camera", CaptureCurrentView );
var quick = root.AddMenu( "Quick Capture" );
quick.AddOption( "720p", null, () => SuperShotService.QuickCapture( ShotResolution.HD720 ) );
quick.AddOption( "1080p", null, () => SuperShotService.QuickCapture( ShotResolution.HD1080 ) );
quick.AddOption( "1440p", null, () => SuperShotService.QuickCapture( ShotResolution.QHD1440 ) );
quick.AddOption( "4K", null, () => SuperShotService.QuickCapture( ShotResolution.UHD4K ) );
quick.AddOption( "8K", null, () => SuperShotService.QuickCapture( ShotResolution.UHD8K ) );
var pkg = root.AddMenu( "Package Thumbnails" );
pkg.AddOption( "Square (512x512)", null, () => SuperShotService.QuickCapture( ShotResolution.PackageSquare ) );
pkg.AddOption( "Wide (910x512)", null, () => SuperShotService.QuickCapture( ShotResolution.PackageWide ) );
pkg.AddOption( "Tall (512x910)", null, () => SuperShotService.QuickCapture( ShotResolution.PackageTall ) );
pkg.AddOption( "Capture All Three", null, () => SuperShotService.CaptureAllPackageThumbnails() );
var open = root.AddMenu( "Open" );
open.AddOption( "Home", "home", () => OpenDock( "Home" ) );
open.AddOption( "Editor", "tune", () => OpenDock( "Edit" ) );
open.AddOption( "Gallery", "collections", () => OpenDock( "Gallery" ) );
open.AddOption( "Discord", "forum", () => OpenDock( "Discord" ) );
open.AddOption( "Settings", "settings", () => OpenDock( "Settings" ) );
var share = root.AddMenu( "Share" );
var discord = share.AddMenu( "Discord" );
discord.AboutToShow += () => PopulateDiscordMenu( discord );
share.AddOption( "Upload to s&box Artwork", "image", () => SuperShotService.CaptureAndUploadToArtPage() );
share.AddOption( "Open Output Folder", "folder", OpenOutputFolder );
var view = root.AddMenu( "View" );
view.AddOption( "Restore Studio Layout", "settings_backup_restore", () => SuperShotWindow.Open().RestoreStudioLayout() );
view.AddOption( SuperShotSettings.Current.LivePreview ? "Live Preview: On" : "Live Preview: Off", "videocam", ToggleLivePreview );
}
static void CaptureCurrentView()
{
var settings = SuperShotSettings.Current;
SuperShotService.CaptureAndSave( settings.Capture, settings.Edit, settings.Output );
}
static void OpenDock( string dock )
{
var window = SuperShotWindow.Open();
window.DockManager.RaiseDock( dock );
window.DockManager.Update();
}
static void ToggleLivePreview()
{
var settings = SuperShotSettings.Current;
settings.LivePreview = !settings.LivePreview;
settings.Save();
}
static void PopulateDiscordMenu( Menu menu )
{
if ( menu is null || !menu.IsValid )
return;
menu.Clear();
var share = SuperShotSettings.Current.Share;
var configured = share.Webhooks.FindAll( w => w is not null && w.IsConfigured );
if ( configured.Count == 0 )
{
var none = menu.AddOption( "No Discord channels configured" );
none.Enabled = false;
menu.AddSeparator();
menu.AddOption( "Open Discord tab", null, () => SuperShotWindow.Open() );
return;
}
if ( SuperShotService.EnabledWebhooks( share ).Count > 0 )
{
menu.AddOption( "Post to all Discord Channels", null, () =>
_ = new MessagePromptDialog(
"Post to all Discord Channels",
"Add an optional message for this post (leave blank to post without one):",
msg => _ = SuperShotService.CaptureAndPostAll( msg ) ) );
menu.AddSeparator();
}
var favorites = configured.FindAll( w => w.Favorite );
if ( favorites.Count > 0 )
{
var heading = menu.AddOption( "Favorites" );
heading.Enabled = false;
foreach ( var wh in favorites )
{
var target = wh;
menu.AddOption( wh.Name, "star", () => _ = SuperShotService.CaptureAndPostTo( target ) );
}
menu.AddSeparator();
}
foreach ( var wh in configured.FindAll( w => !w.Favorite ) )
{
var target = wh;
menu.AddOption( wh.Name, null, () => _ = SuperShotService.CaptureAndPostTo( target ) );
}
}
static void OpenOutputFolder()
{
SuperShotService.RevealInExplorer( SuperShotSettings.Current.Output.ResolveFolder() );
}
}