// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Layout/Visibility.h" #include "Input/Reply.h" #include "ViewportClient.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "ShowFlags.h" #include "Widgets/SCompoundWidget.h" #include "Styling/SlateTypes.h" #include "Widgets/SWindow.h" #include "Widgets/Text/STextBlock.h" #include "Slate/SceneViewport.h" #include "SCaptureRegionWidget.h" #include "Widgets/Input/SCheckBox.h" #include "HighResScreenshot.h" class SButton; class SHighResScreenshotDialog : public SCompoundWidget { public: SLATE_BEGIN_ARGS( SHighResScreenshotDialog ){} SLATE_END_ARGS() void Construct( const FArguments& InArgs ); SHighResScreenshotDialog(); virtual ~SHighResScreenshotDialog() { Window.Reset(); } void SetWindow( TSharedPtr InWindow ) { Window = InWindow; } void SetCaptureRegionWidget(TSharedPtr InCaptureRegionWidget) { CaptureRegionWidget = InCaptureRegionWidget; } void SetCaptureRegion(const FIntRect& InCaptureRegion) { Config.UnscaledCaptureRegion = InCaptureRegion; auto ConfigViewport = Config.TargetViewport.Pin(); if (ConfigViewport.IsValid()) { ConfigViewport->Invalidate(); } } FHighResScreenshotConfig& GetConfig() { return Config; } TSharedPtr GetCaptureRegionWidget() { return CaptureRegionWidget; } static TWeakPtr OpenDialog(const TSharedPtr& InViewport, TSharedPtr InCaptureRegionWidget = TSharedPtr()); private: FReply OnCaptureClicked(); FReply OnSelectCaptureRegionClicked(); FReply OnSelectCaptureCancelRegionClicked(); FReply OnSelectCaptureAcceptRegionClicked(); FReply OnSetFullViewportCaptureRegionClicked(); FReply OnSetCameraSafeAreaCaptureRegionClicked(); bool IsSetCameraSafeAreaCaptureRegionEnabled() const; void OnResolutionMultiplierSliderChanged( float NewValue ) { Config.ResolutionMultiplier = NewValue; // scale needs to be [0, 1.0] Config.ResolutionMultiplierScale = (NewValue - FHighResScreenshotConfig::MinResolutionMultipler) / (FHighResScreenshotConfig::MaxResolutionMultipler - FHighResScreenshotConfig::MinResolutionMultipler); } void OnMaskEnabledChanged( ECheckBoxState NewValue ) { Config.bMaskEnabled = (NewValue == ECheckBoxState::Checked); auto ConfigViewport = Config.TargetViewport.Pin(); if (ConfigViewport.IsValid()) { ConfigViewport->GetClient()->GetEngineShowFlags()->SetHighResScreenshotMask(Config.bMaskEnabled); ConfigViewport->Invalidate(); } } void OnHDREnabledChanged(ECheckBoxState NewValue) { Config.SetHDRCapture(NewValue == ECheckBoxState::Checked); auto ConfigViewport = Config.TargetViewport.Pin(); if (ConfigViewport.IsValid()) { ConfigViewport->Invalidate(); } } void OnForce128BitRenderingChanged(ECheckBoxState NewValue) { Config.SetForce128BitRendering(NewValue == ECheckBoxState::Checked); auto ConfigViewport = Config.TargetViewport.Pin(); if (ConfigViewport.IsValid()) { ConfigViewport->Invalidate(); } } void OnDateTimeBasedNamingEnabledChanged(ECheckBoxState NewValue) { bool bEnabled = (NewValue == ECheckBoxState::Checked); Config.bDateTimeBasedNaming = bEnabled; } void OnBufferVisualizationDumpEnabledChanged(ECheckBoxState NewValue) { bool bEnabled = (NewValue == ECheckBoxState::Checked); Config.bDumpBufferVisualizationTargets = bEnabled; SetHDRUIEnableState(bEnabled); SetForce128BitRenderingState(bEnabled); } EVisibility GetSpecifyCaptureRegionVisibility() const { return bCaptureRegionControlsVisible ? EVisibility::Collapsed: EVisibility::Visible; } EVisibility GetCaptureRegionControlsVisibility() const { return bCaptureRegionControlsVisible ? EVisibility::Visible : EVisibility::Collapsed; } void SetCaptureRegionControlsVisibility(bool bVisible) { bCaptureRegionControlsVisible = bVisible; } float GetResolutionMultiplierSlider() const { return Config.ResolutionMultiplier; } ECheckBoxState GetMaskEnabled() const { return Config.bMaskEnabled ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } ECheckBoxState GetHDRCheckboxUIState() const { return Config.bCaptureHDR ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } ECheckBoxState GetForce128BitRenderingCheckboxUIState() const { return Config.bForce128BitRendering ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } ECheckBoxState GetBufferVisualizationDumpEnabled() const { return Config.bDumpBufferVisualizationTargets ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } ECheckBoxState GetDateTimeBasedNamingEnabled() const { return Config.bDateTimeBasedNaming ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } bool IsCaptureRegionEditingAvailable() const { return CaptureRegionWidget.IsValid(); } void SetHDRUIEnableState(bool bEnable) { HDRCheckBox->SetEnabled(bEnable); HDRLabel->SetEnabled(bEnable); } void SetForce128BitRenderingState(bool bEnable) { Force128BitRenderingCheckBox->SetEnabled(bEnable); Force128BitRenderingLabel->SetEnabled(bEnable); } static void WindowClosedHandler(const TSharedRef& InWindow); static void ResetViewport(); static void ResetFrameBuffer(); TSharedPtr Window; TSharedPtr CaptureRegionWidget; TSharedPtr CaptureRegionButton; TSharedPtr RegionCaptureActiveControlRoot; TSharedPtr HDRCheckBox; TSharedPtr HDRLabel; TSharedPtr Force128BitRenderingCheckBox; TSharedPtr Force128BitRenderingLabel; FHighResScreenshotConfig& Config; bool bCaptureRegionControlsVisible; static TWeakPtr CurrentWindow; static TWeakPtr CurrentDialog; static bool bMaskVisualizationWasEnabled; };