// Copyright Epic Games, Inc. All Rights Reserved. #include "SFileListReportDialog.h" #include "Framework/Application/SlateApplication.h" #include "Interfaces/IMainFrameModule.h" #include "Misc/App.h" #include "Widgets/Input/SButton.h" #include "Widgets/Layout/SBorder.h" #include "Widgets/SWindow.h" #include "Widgets/Text/STextBlock.h" #include "Widgets/Views/ITableRow.h" #include "Widgets/Views/SListView.h" #include "Widgets/Views/STableViewBase.h" #define LOCTEXT_NAMESPACE "FileListReportDialog" void SFileListReportDialog::Construct(const FArguments& InArgs) { for (const FText& File : InArgs._Files) { Files.Add(MakeShareable(new FText(File))); } ChildSlot [ SNew(SBorder) .BorderImage(FAppStyle::GetBrush("Docking.Tab.ContentAreaBrush")) .Padding(FMargin(4, 8, 4, 4)) [ SNew(SVerticalBox) // Title text + SVerticalBox::Slot() .AutoHeight() [ SNew(STextBlock).Text(InArgs._Header) .AutoWrapText(true) ] // Files To Sync list + SVerticalBox::Slot() .Padding(0, 8) .FillHeight(1.f) [ SNew(SBorder) .BorderImage(FAppStyle::GetBrush("ToolPanel.GroupBorder")) [ SNew(SListView>) .ListItemsSource(&Files) .SelectionMode(ESelectionMode::None) .OnGenerateRow(this, &SFileListReportDialog::MakeListViewWidget) ] ] // Buttons + SVerticalBox::Slot() .AutoHeight() .Padding(0, 4) .HAlign(HAlign_Right) [ ConstructButtons(InArgs) ] ] ]; } void SFileListReportDialog::OpenListDialog(const FText& InTitle, const FText& InHeader, const TArray& InFiles, bool bOpenAsModal /*= false*/) { if (FApp::IsUnattended() || GIsRunningUnattendedScript) { return; } TSharedRef FileListReportDialogRef = SNew(SFileListReportDialog).Header(InHeader).Files(InFiles); FileListReportDialogRef->bOpenAsModal = bOpenAsModal; FileListReportDialogRef->bAllowTitleBarX = true; FileListReportDialogRef->Title = InTitle; CreateWindow(FileListReportDialogRef); } TSharedRef SFileListReportDialog::MakeListViewWidget(TSharedRef Item, const TSharedRef& OwnerTable) { return SNew(STableRow< TSharedRef >, OwnerTable) [ SNew(STextBlock).Text(Item.Get()) ]; } TSharedRef SFileListReportDialog::ConstructButtons(const FArguments& InArgs) { return SNew(SHorizontalBox) + SHorizontalBox::Slot() .AutoWidth() .HAlign(HAlign_Right) [ SNew(SButton) .OnClicked(this, &SFileListReportDialog::CloseWindow) .Text(LOCTEXT("WindowCloseButton", "Close")) ]; } FReply SFileListReportDialog::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& InKeyEvent) { if (InKeyEvent.GetKey() == EKeys::Enter || InKeyEvent.GetKey() == EKeys::Escape) { CloseWindow(); return FReply::Handled(); } return SCompoundWidget::OnKeyDown(MyGeometry, InKeyEvent); } bool SFileListReportDialog::SupportsKeyboardFocus() const { return true; } void SFileListReportDialog::CreateWindow(TSharedRef InFileListReportDialogRef) { TSharedRef FileListReportWindow = SNew(SWindow) .Title(InFileListReportDialogRef->Title) .ClientSize(FVector2D(800, 400)) .SupportsMaximize(false) .SupportsMinimize(false) .HasCloseButton(InFileListReportDialogRef->bAllowTitleBarX) [ InFileListReportDialogRef ]; FileListReportWindow->GetOnWindowActivatedEvent().AddLambda([InFileListReportDialogRef]() { FSlateApplication::Get().SetKeyboardFocus(InFileListReportDialogRef); }); FileListReportWindow->SetOnWindowClosed(FOnWindowClosed::CreateRaw(&InFileListReportDialogRef.Get(), &SFileListReportDialog::OnWindowClosed)); IMainFrameModule& MainFrameModule = FModuleManager::LoadModuleChecked(TEXT("MainFrame")); if (MainFrameModule.GetParentWindow().IsValid()) { if (InFileListReportDialogRef->bOpenAsModal) { FSlateApplication::Get().AddModalWindow(FileListReportWindow, MainFrameModule.GetParentWindow().ToSharedRef()); } else { FSlateApplication::Get().AddWindowAsNativeChild(FileListReportWindow, MainFrameModule.GetParentWindow().ToSharedRef()); } } else { if (InFileListReportDialogRef->bOpenAsModal) { FSlateApplication::Get().AddModalWindow(FileListReportWindow, nullptr); } else { FSlateApplication::Get().AddWindow(FileListReportWindow); }; } } FReply SFileListReportDialog::CloseWindow() { bClosingWithoutTitleBarX = true; TSharedPtr Window = FSlateApplication::Get().FindWidgetWindow(AsShared()); if (Window.IsValid()) { Window->RequestDestroyWindow(); } return FReply::Handled(); } void SFileListReportDialog::OnWindowClosed(const TSharedRef& Window) { if (!bClosingWithoutTitleBarX) { OnClosedWithTitleBarX(Window); } } void SFileListReportDialog::SetModal(bool bInIsModal) { bOpenAsModal = bInIsModal; } void SFileListReportDialog::SetAllowTitleBarX(bool bInAllowTitleBarX) { bAllowTitleBarX = bInAllowTitleBarX; } #undef LOCTEXT_NAMESPACE