// Copyright Epic Games, Inc. All Rights Reserved. #include "Widgets/Deploy/SProjectLauncherDeployTargets.h" #include "Styling/AppStyle.h" #include "ITargetDeviceProxyManager.h" #include "Interfaces/ITargetPlatform.h" #include "Interfaces/ITargetPlatformManagerModule.h" #include "SlateOptMacros.h" #include "Widgets/Images/SImage.h" #include "Widgets/Deploy/SProjectLauncherDeployTargetListRow.h" #define LOCTEXT_NAMESPACE "SProjectLauncherDeployTargets" /* SSessionSProjectLauncherDeployTargets structors *****************************************************************************/ SProjectLauncherDeployTargets::~SProjectLauncherDeployTargets() { if (Model.IsValid()) { const TSharedRef& DeviceProxyManager = Model->GetDeviceProxyManager(); DeviceProxyManager->OnProxyAdded().RemoveAll(this); DeviceProxyManager->OnProxyRemoved().RemoveAll(this); } } /* SSessionSProjectLauncherDeployTargets interface *****************************************************************************/ BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION void SProjectLauncherDeployTargets::Construct(const FArguments& InArgs, const TSharedRef& InModel) { Model = InModel; ChildSlot [ SNew(SVerticalBox) + SVerticalBox::Slot() .AutoHeight() .HAlign(HAlign_Left) .Padding(10.0f, 10.0f) [ SAssignNew(PlatformComboBox, SComboBox>) .ContentPadding(FMargin(6.0f, 2.0f)) .OptionsSource(&VanillaPlatformList) .OnGenerateWidget(this, &SProjectLauncherDeployTargets::HandlePlatformComboBoxGenerateWidget) .OnSelectionChanged(this, &SProjectLauncherDeployTargets::HandlePlatformComboBoxSelectionChanged) [ SNew(STextBlock) .Text(this, &SProjectLauncherDeployTargets::HandlePlatformComboBoxContentText) ] ] + SVerticalBox::Slot() .AutoHeight() [ // device list SAssignNew(DeviceProxyListView, SListView>) .HeaderRow ( SNew(SHeaderRow) + SHeaderRow::Column("CheckBox") .DefaultLabel(LOCTEXT("DeviceListCheckboxColumnHeader", " ")) .FixedWidth(24.0f) + SHeaderRow::Column("Device") .DefaultLabel(LOCTEXT("DeviceListDeviceColumnHeader", "Device")) .FillWidth(0.35f) + SHeaderRow::Column("Variant") .DefaultLabel(LOCTEXT("DeviceListVariantColumnHeader", "Variant")) .FillWidth(0.2f) + SHeaderRow::Column("Platform") .DefaultLabel(LOCTEXT("DeviceListPlatformColumnHeader", "Platform")) .FillWidth(0.15f) + SHeaderRow::Column("Host") .DefaultLabel(LOCTEXT("DeviceListHostColumnHeader", "Host")) .FillWidth(0.15f) + SHeaderRow::Column("Owner") .DefaultLabel(LOCTEXT("DeviceListOwnerColumnHeader", "Owner")) .FillWidth(0.15f) ) .ListItemsSource(&DeviceProxyList) .OnGenerateRow(this, &SProjectLauncherDeployTargets::HandleDeviceProxyListViewGenerateRow) .SelectionMode(ESelectionMode::Single) .Visibility(this, &SProjectLauncherDeployTargets::HandleDeviceProxyListViewVisibility) ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.0f, 12.0f, 0.0f, 0.0f) [ SNew(SHorizontalBox) .Visibility(this, &SProjectLauncherDeployTargets::HandleNoDevicesBoxVisibility) + SHorizontalBox::Slot() .AutoWidth() [ SNew(SImage) .Image(FAppStyle::GetBrush(TEXT("Icons.Warning"))) ] + SHorizontalBox::Slot() .AutoWidth() .Padding(4.0f, 0.0f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(this, &SProjectLauncherDeployTargets::HandleNoDevicesTextBlockText) ] ] ]; const TSharedRef& DeviceProxyManager = Model->GetDeviceProxyManager(); DeviceProxyManager->OnProxyAdded().AddSP(this, &SProjectLauncherDeployTargets::HandleDeviceProxyManagerProxyAdded); DeviceProxyManager->OnProxyRemoved().AddSP(this, &SProjectLauncherDeployTargets::HandleDeviceProxyManagerProxyRemoved); DeviceProxyManager->GetProxies(NAME_None, false, DeviceProxyList); VanillaPlatformList.Reset(); TSet VanillaNames; VanillaNames.Add(NAME_None); VanillaPlatformList.Add(MakeShareable(new FName(NAME_None))); for (FName VanillaName : PlatformInfo::GetAllVanillaPlatformNames()) { if (!VanillaNames.Contains(VanillaName)) { VanillaNames.Add(VanillaName); VanillaPlatformList.AddUnique(MakeShareable(new FName(VanillaName))); } } PlatformComboBox->SetSelectedItem(VanillaPlatformList[0]); } END_SLATE_FUNCTION_BUILD_OPTIMIZATION /* SProjectLauncherDeployTargets implementation *****************************************************************************/ void SProjectLauncherDeployTargets::RefreshDeviceProxyList() { Model->GetDeviceProxyManager()->GetProxies(NAME_None, false, DeviceProxyList); DeviceProxyListView->RequestListRefresh(); } /* SSessionSProjectLauncherDeployTargets callbacks *****************************************************************************/ ILauncherDeviceGroupPtr SProjectLauncherDeployTargets::HandleDeviceListRowDeviceGroup() const { ILauncherProfilePtr SelectedProfile = Model->GetSelectedProfile(); if (SelectedProfile.IsValid()) { return SelectedProfile->GetDeployedDeviceGroup(); } return nullptr; } bool SProjectLauncherDeployTargets::HandleDeviceListRowIsEnabled(TSharedPtr DeviceProxy) const { if (DeviceProxy.IsValid()) { ILauncherProfilePtr SelectedProfile = Model->GetSelectedProfile(); if (SelectedProfile.IsValid()) { /*@Todo: Fix this! we should iterate the Devices target platforms and see if any are deployable*/ //bool RetVal = SelectedProfile->IsDeployablePlatform(DeviceProxy->GetTargetPlatformName(NAME_None)); return true; } } return false; } FText SProjectLauncherDeployTargets::HandleDeviceListRowToolTipText(TSharedPtr DeviceProxy) const { FTextBuilder Builder; Builder.AppendLineFormat(LOCTEXT("DeviceListRowToolTipName", "Name: {0}"), FText::FromString(DeviceProxy->GetName())); if (DeviceProxy->HasVariant(NAME_None)) { Builder.AppendLineFormat(LOCTEXT("DeviceListRowToolTipPlatform", "Platform: {0}"), FText::FromString(DeviceProxy->GetTargetPlatformName(NAME_None))); Builder.AppendLineFormat(LOCTEXT("DeviceListRowToolTipDeviceId", "Device ID: {0}"), FText::FromString(DeviceProxy->GetTargetDeviceId(NAME_None))); } else { Builder.AppendLine(LOCTEXT("InvalidDevice", "Invalid Device")); } return Builder.ToText(); } TSharedRef SProjectLauncherDeployTargets::HandleDeviceProxyListViewGenerateRow(TSharedPtr InItem, const TSharedRef& OwnerTable) const { check(Model->GetSelectedProfile().IsValid()); return SNew(SProjectLauncherDeployTargetListRow, OwnerTable) .DeviceGroup(this, &SProjectLauncherDeployTargets::HandleDeviceListRowDeviceGroup) .DeviceProxy(InItem) .IsEnabled(this, &SProjectLauncherDeployTargets::HandleDeviceListRowIsEnabled, InItem) .ToolTipText(this, &SProjectLauncherDeployTargets::HandleDeviceListRowToolTipText, InItem); } EVisibility SProjectLauncherDeployTargets::HandleDeviceProxyListViewVisibility() const { TSharedPtr DefaultPlatformNamePtr = PlatformComboBox->GetSelectedItem(); const FName DefaultPlatformName = DefaultPlatformNamePtr.IsValid() ? *DefaultPlatformNamePtr.Get() : NAME_None; if (DeviceProxyList.Num() > 0 && (DefaultPlatformName == NAME_None)) { return EVisibility::Visible; } return EVisibility::Collapsed; } EVisibility SProjectLauncherDeployTargets::HandleNoDevicesBoxVisibility() const { if (DeviceProxyList.Num() == 0) { return EVisibility::Visible; } return EVisibility::Collapsed; } FText SProjectLauncherDeployTargets::HandleNoDevicesTextBlockText() const { if (DeviceProxyList.Num() == 0) { return LOCTEXT("NoDevicesText", "No available devices were detected."); } return FText::GetEmpty(); } void SProjectLauncherDeployTargets::HandleDeviceProxyManagerProxyAdded(const TSharedRef& AddedProxy) { RefreshDeviceProxyList(); } void SProjectLauncherDeployTargets::HandleDeviceProxyManagerProxyRemoved(const TSharedRef& RemovedProxy) { RefreshDeviceProxyList(); } FText SProjectLauncherDeployTargets::HandlePlatformComboBoxContentText() const { FName DefaultPlatformName = NAME_None; if (Model.IsValid()) { const ILauncherProfilePtr Profile = Model->GetSelectedProfile(); if (Profile.IsValid()) { DefaultPlatformName = Profile->GetDefaultDeployPlatform(); } } FString ComboText(TEXT("Default Deploy Platform: ")); ComboText += DefaultPlatformName.ToString(); //avoid creating new FTexts as much as possible. if (DefaultPlatformText.ToString().Compare(ComboText) != 0) { DefaultPlatformText = FText::FromString(ComboText); for (int32 i = 0; i < VanillaPlatformList.Num(); ++i) { if (*VanillaPlatformList[i] == DefaultPlatformName) { PlatformComboBox->SetSelectedItem(VanillaPlatformList[i]); break; } } } return DefaultPlatformText; } TSharedRef SProjectLauncherDeployTargets::HandlePlatformComboBoxGenerateWidget(TSharedPtr StringItem) { FName DefaultPlatformName = StringItem.IsValid() ? *StringItem : NAME_None; return SNew(STextBlock).Text(FText::FromName(DefaultPlatformName)); } void SProjectLauncherDeployTargets::HandlePlatformComboBoxSelectionChanged(TSharedPtr StringItem, ESelectInfo::Type SelectInfo) { if (Model.IsValid()) { const ILauncherProfilePtr Profile = Model->GetSelectedProfile(); if (Profile.IsValid()) { Profile->SetDefaultDeployPlatform(StringItem.IsValid() ? *StringItem : NAME_None); } } } #undef LOCTEXT_NAMESPACE