void FEpicSurvey::DisplayNotification() { if( ActiveSurvey.IsValid() ) { FNotificationInfo Info( NSLOCTEXT("EpicSurvey", "DisplayNotification", "There is a new survey avaliable!") ); Info.bUseLargeFont = false; Info.bUseThrobber = false; Info.bUseSuccessFailIcons = false; Info.FadeOutDuration = 0.3f; if( SurveyNotificationDuration > 0.0f ) { Info.ExpireDuration = SurveyNotificationDuration; } Info.ButtonDetails.Add( FNotificationButtonInfo( NSLOCTEXT("EpicSurvey", "DisplayNotificationButtonAccept", "Take Survey"), FText::GetEmpty(), FSimpleDelegate::CreateSP( this, &FEpicSurvey::AcceptSurveyNotification ) ) ); Info.ButtonDetails.Add( FNotificationButtonInfo( NSLOCTEXT("EpicSurvey", "DisplayNotificationButtonCancel", "Not Now"), FText::GetEmpty(), FSimpleDelegate::CreateSP( this, &FEpicSurvey::CancelSurveyNotification ) ) ); if ( DisplaySurveyNotification.IsValid() ) { DisplaySurveyNotification.Pin()->ExpireAndFadeout(); DisplaySurveyNotification.Reset(); } DisplaySurveyNotification = FSlateNotificationManager::Get().AddNotification(Info); DisplaySurveyNotification.Pin()->SetCompletionState(SNotificationItem::CS_Pending); DisplayToolbarNotification(); } }
void NormalMapIdentification::HandleAssetPostImport( UFactory* InFactory, UObject* InObject ) { UTextureFactory* TextureFactory = Cast<UTextureFactory>(InFactory); UTexture* Texture = Cast<UTexture>(InObject); if(TextureFactory != NULL && Texture != NULL) { // Try to automatically identify a normal map if ( !TextureFactory->bUsingExistingSettings && IsTextureANormalMap( Texture ) ) { // Set the compression settings and no gamma correction for a normal map { Texture->SetFlags(RF_Transactional); const FScopedTransaction Transaction( NSLOCTEXT("AutoNormalMapID", "ImportAsNormalMap", "Import As Normal Map") ); Texture->Modify(); Texture->CompressionSettings = TC_Normalmap; Texture->SRGB = false; Texture->LODGroup = TEXTUREGROUP_WorldNormalMap; Texture->bFlipGreenChannel = TextureFactory->bFlipNormalMapGreenChannel; } // Show the user a notification indicating that this texture will be imported as a normal map. // Offer two options to the user, "OK" dismisses the notification early, "Revert" reverts the settings to that of a diffuse map. TSharedPtr<NormalMapImportNotificationHandler> NormalMapNotificationDelegate(new NormalMapImportNotificationHandler); { NormalMapNotificationDelegate->Texture = Texture; // this is a cheat to make sure the notification keeps the callback thing alive while it's active... FText OKText = LOCTEXT("ImportTexture_OKNormalMapSettings", "OK"); FText OKTooltipText = LOCTEXT("ImportTexture_OKTooltip", "Accept normal map settings"); FText RevertText = LOCTEXT("ImportTexture_RevertNormalMapSettings", "Revert"); FText RevertTooltipText = LOCTEXT("ImportTexture_RevertTooltip", "Revert to diffuse map settings"); FFormatNamedArguments Args; Args.Add( TEXT("TextureName"), FText::FromName(Texture->GetFName()) ); FNotificationInfo NormalMapNotification( FText::Format(LOCTEXT("ImportTexture_IsNormalMap", "Texture {TextureName} was imported as a normal map"), Args ) ); NormalMapNotification.ButtonDetails.Add(FNotificationButtonInfo(OKText, OKTooltipText, FSimpleDelegate::CreateSP(NormalMapNotificationDelegate.Get(), &NormalMapImportNotificationHandler::OKSetting, NormalMapNotificationDelegate))); NormalMapNotification.ButtonDetails.Add(FNotificationButtonInfo(RevertText, RevertTooltipText, FSimpleDelegate::CreateSP(NormalMapNotificationDelegate.Get(), &NormalMapImportNotificationHandler::RevertSetting, NormalMapNotificationDelegate))); NormalMapNotification.bFireAndForget = true; NormalMapNotification.bUseLargeFont = false; NormalMapNotification.bUseSuccessFailIcons = false; NormalMapNotification.bUseThrobber = false; NormalMapNotification.ExpireDuration = 10.0f; NormalMapNotificationDelegate->Notification = FSlateNotificationManager::Get().AddNotification(NormalMapNotification); if ( NormalMapNotificationDelegate->Notification.IsValid() ) { NormalMapNotificationDelegate->Notification.Pin()->SetCompletionState(SNotificationItem::CS_Pending); } } } } }
void OnRestartRequired() { TSharedPtr<SNotificationItem> NotificationPin = NotificationPtr.Pin(); if (NotificationPin.IsValid() || !RestartApplicationDelegate.IsBound()) { return; } FNotificationInfo Info( LOCTEXT("RestartRequiredTitle", "Restart required to apply new settings") ); // Add the buttons with text, tooltip and callback Info.ButtonDetails.Add(FNotificationButtonInfo( LOCTEXT("RestartNow", "Restart Now"), LOCTEXT("RestartNowToolTip", "Restart now to finish applying your new settings."), FSimpleDelegate::CreateRaw(this, &FApplicationRestartRequiredNotification::OnRestartClicked)) ); Info.ButtonDetails.Add(FNotificationButtonInfo( LOCTEXT("RestartLater", "Restart Later"), LOCTEXT("RestartLaterToolTip", "Dismiss this notificaton without restarting. Some new settings will not be applied."), FSimpleDelegate::CreateRaw(this, &FApplicationRestartRequiredNotification::OnDismissClicked)) ); // We will be keeping track of this ourselves Info.bFireAndForget = false; // Set the width so that the notification doesn't resize as its text changes Info.WidthOverride = 300.0f; Info.bUseLargeFont = false; Info.bUseThrobber = false; Info.bUseSuccessFailIcons = false; // Launch notification NotificationPtr = FSlateNotificationManager::Get().AddNotification(Info); NotificationPin = NotificationPtr.Pin(); if (NotificationPin.IsValid()) { NotificationPin->SetCompletionState(SNotificationItem::CS_Pending); } }
void FNavigationBuildingNotificationImpl::BuildFinished() { // Finished all requests! Notify the UI. UEditorEngine* const EEngine = Cast<UEditorEngine>(GEngine); TSharedPtr<SNotificationItem> NotificationItem = NavigationBuildNotificationPtr.Pin(); if (NotificationItem.IsValid()) { NotificationItem->SetText( NSLOCTEXT("NavigationBuild", "NavigationBuildingComplete", "Navigation building done!") ); NotificationItem->SetCompletionState(SNotificationItem::CS_Success); NotificationItem->ExpireAndFadeout(); if (EEngine) { // request update for all viewports with disabled real time but with visible navmesh for (auto Viewport : EEngine->AllViewportClients) { if (Viewport && Viewport->IsRealtime() == false && Viewport->EngineShowFlags.Navigation) { Viewport->bNeedsRedraw = true; EEngine->UpdateSingleViewportClient(Viewport, true, false); } } } NavigationBuildNotificationPtr.Reset(); } if (EEngine != NULL && (FEditorBuildUtils::IsBuildingNavigationFromUserRequest())) { FNotificationInfo Info( NSLOCTEXT("NavigationBuild", "NavigationBuildDoneMessage", "Navigation building completed.") ); Info.bFireAndForget = false; Info.bUseThrobber = false; Info.FadeOutDuration = 0.0f; Info.ExpireDuration = 0.0f; Info.ButtonDetails.Add(FNotificationButtonInfo( NSLOCTEXT("NavigationBuild", "NavigationBuildOk","Ok"), FText(), FSimpleDelegate::CreateRaw(this, &FNavigationBuildingNotificationImpl::ClearCompleteNotification))); NavigationBuiltCompleteNotification = FSlateNotificationManager::Get().AddNotification(Info); if (NavigationBuiltCompleteNotification.IsValid()) { NavigationBuiltCompleteNotification.Pin()->SetCompletionState(SNotificationItem::CS_Pending); } } FEditorBuildUtils::PathBuildingFinished(); }
void FPackageAutoSaver::UpdateAutoSaveNotification() { const UEditorLoadingSavingSettings* LoadingSavingSettings = GetDefault<UEditorLoadingSavingSettings>(); const bool bIgnoreCanAutoSave = true; const int32 TimeInSecondsUntilAutosave = GetTimeTillAutoSave(bIgnoreCanAutoSave); const bool UserAllowsAutosave = LoadingSavingSettings->bAutoSaveEnable && !GIsDemoMode; const bool InGame = (GUnrealEd->PlayWorld != nullptr); if (UserAllowsAutosave && // The user has set to allow auto-save in preferences TimeInSecondsUntilAutosave < LoadingSavingSettings->AutoSaveWarningInSeconds && !InGame && // we want to hide auto-save if we are simulating/playing !GLevelEditorModeTools().IsModeActive(FBuiltinEditorModes::EM_InterpEdit) // we want to hide auto-save if we are in matinee ) { if (!bAutoSaveNotificationLaunched && !bDelayingDueToFailedSave) { if (CanAutoSave()) { ClearStalePointers(); // Starting a new request! Notify the UI. if (AutoSaveNotificationPtr.IsValid()) { AutoSaveNotificationPtr.Pin()->ExpireAndFadeout(); } // Setup button localized strings static FText AutoSaveCancelButtonText = NSLOCTEXT("AutoSaveNotify", "AutoSaveCancel", "Cancel"); static FText AutoSaveCancelButtonToolTipText = NSLOCTEXT("AutoSaveNotify", "AutoSaveCancelToolTip", "Postpone Autosave"); static FText AutoSaveSaveButtonText = NSLOCTEXT("AutoSaveNotify", "AutoSaveSave", "Save Now"); static FText AutoSaveSaveButtonToolTipText = NSLOCTEXT("AutoSaveNotify", "AutoSaveSaveToolTip", "Force Autosave"); FNotificationInfo Info( GetAutoSaveNotificationText(TimeInSecondsUntilAutosave) ); Info.Image = FEditorStyle::GetBrush("MainFrame.AutoSaveImage"); // Add the buttons with text, tooltip and callback Info.ButtonDetails.Add(FNotificationButtonInfo(AutoSaveCancelButtonText, AutoSaveCancelButtonToolTipText, FSimpleDelegate::CreateRaw(this, &FPackageAutoSaver::OnAutoSaveCancel))); Info.ButtonDetails.Add(FNotificationButtonInfo(AutoSaveSaveButtonText, AutoSaveSaveButtonToolTipText, FSimpleDelegate::CreateRaw(this, &FPackageAutoSaver::OnAutoSaveSave))); // Force the width so that any text changes don't resize the notification Info.WidthOverride = 240.0f; // We will be keeping track of this ourselves Info.bFireAndForget = false; // We want the auto-save to be subtle Info.bUseLargeFont = false; Info.bUseThrobber = false; Info.bUseSuccessFailIcons = false; // Launch notification AutoSaveNotificationPtr = FSlateNotificationManager::Get().AddNotification(Info); if(AutoSaveNotificationPtr.IsValid()) { AutoSaveNotificationPtr.Pin()->SetCompletionState(SNotificationItem::CS_Pending); } // Update launched flag bAutoSaveNotificationLaunched = true; } else // defer until the user finishes using pop-up menus or the notification will dismiss them... { ForceMinimumTimeTillAutoSave(LoadingSavingSettings->AutoSaveWarningInSeconds); } } else { // Update the remaining time on the notification if (AutoSaveNotificationPtr.IsValid()) { // update text AutoSaveNotificationPtr.Pin()->SetText(GetAutoSaveNotificationText(TimeInSecondsUntilAutosave)); } } } else { // Ensures notifications are cleaned up CloseAutoSaveNotification(false); } }
void FAssetEditorManager::SpawnRestorePreviouslyOpenAssetsNotification(const bool bCleanShutdown, const TArray<FString>& AssetsToOpen) { /** Utility functions for the notification which don't rely on the state from FAssetEditorManager */ struct Local { static ECheckBoxState GetDontAskAgainCheckBoxState() { bool bSuppressNotification = false; GConfig->GetBool(TEXT("AssetEditorManager"), TEXT("SuppressRestorePreviouslyOpenAssetsNotification"), bSuppressNotification, GEditorPerProjectIni); return bSuppressNotification ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } static void OnDontAskAgainCheckBoxStateChanged(ECheckBoxState NewState) { const bool bSuppressNotification = (NewState == ECheckBoxState::Checked); GConfig->SetBool(TEXT("AssetEditorManager"), TEXT("SuppressRestorePreviouslyOpenAssetsNotification"), bSuppressNotification, GEditorPerProjectIni); } }; FNotificationInfo Info(bCleanShutdown ? LOCTEXT("RestoreOpenAssetsAfterClose_Message", "Assets were open when the Editor was last closed, would you like to restore them now?") : LOCTEXT("RestoreOpenAssetsAfterCrash", "The Editor did not shut down cleanly, would you like to attempt to restore previously open assets now?") ); // Add the buttons Info.ButtonDetails.Add(FNotificationButtonInfo( LOCTEXT("RestoreOpenAssetsAfterClose_Confirm", "Restore Now"), FText(), FSimpleDelegate::CreateRaw(this, &FAssetEditorManager::OnConfirmRestorePreviouslyOpenAssets, AssetsToOpen), SNotificationItem::CS_None )); Info.ButtonDetails.Add(FNotificationButtonInfo( LOCTEXT("RestoreOpenAssetsAfterClose_Cancel", "Don't Restore"), FText(), FSimpleDelegate::CreateRaw(this, &FAssetEditorManager::OnCancelRestorePreviouslyOpenAssets), SNotificationItem::CS_None )); // We will let the notification expire automatically after 10 seconds Info.bFireAndForget = true; Info.ExpireDuration = 10.0f; // We want the auto-save to be subtle Info.bUseLargeFont = false; Info.bUseThrobber = false; Info.bUseSuccessFailIcons = false; // Only let the user suppress the non-crash version if(bCleanShutdown) { Info.CheckBoxState = TAttribute<ECheckBoxState>::Create(&Local::GetDontAskAgainCheckBoxState); Info.CheckBoxStateChanged = FOnCheckStateChanged::CreateStatic(&Local::OnDontAskAgainCheckBoxStateChanged); Info.CheckBoxText = NSLOCTEXT("ModalDialogs", "DefaultCheckBoxMessage", "Don't show this again"); } // Close any existing notification TSharedPtr<SNotificationItem> RestorePreviouslyOpenAssetsNotification = RestorePreviouslyOpenAssetsNotificationPtr.Pin(); if(RestorePreviouslyOpenAssetsNotification.IsValid()) { RestorePreviouslyOpenAssetsNotification->ExpireAndFadeout(); } RestorePreviouslyOpenAssetsNotificationPtr = FSlateNotificationManager::Get().AddNotification(Info); }