/** Appends the key binding to the end of the provided ToolTip */ static FText AppendKeyBindingToToolTip( const TAttribute<FText> ToolTip, TWeakPtr< const FUICommandInfo> Command ) { TSharedPtr<const FUICommandInfo> CommandPtr = Command.Pin(); if( CommandPtr.IsValid() && CommandPtr->GetActiveChord()->IsValidChord() ) { FFormatNamedArguments Args; Args.Add( TEXT("ToolTipDescription"), ToolTip.Get() ); Args.Add( TEXT("Keybinding"), CommandPtr->GetInputText() ); return FText::Format( NSLOCTEXT("ToolBar", "ToolTip + Keybinding", "{ToolTipDescription} ({Keybinding})"), Args ); } else { return ToolTip.Get(); } }
void FMenuBuilder::BeginSection( FName InExtensionHook, const TAttribute< FText >& InHeadingText ) { check(CurrentSectionExtensionHook == NAME_None && !bSectionNeedsToBeApplied); ApplyHook(InExtensionHook, EExtensionHook::Before); // Do not actually apply the section header, because if this section is ended immediately // then nothing ever gets created, preventing empty sections from ever appearing bSectionNeedsToBeApplied = true; CurrentSectionExtensionHook = InExtensionHook; CurrentSectionHeadingText = InHeadingText.Get(); // Do apply the section beginning if we are in developer "show me all the hooks" mode if (FMultiBoxSettings::DisplayMultiboxHooks.Get()) { ApplySectionBeginning(); } ApplyHook(InExtensionHook, EExtensionHook::First); }
TSharedRef< class SToolTip > FDocumentation::CreateToolTip(const TAttribute<FText>& Text, const TSharedPtr<SWidget>& OverrideContent, const FString& Link, const FString& ExcerptName) const { TSharedPtr< SDocumentationToolTip > DocToolTip; if ( !Text.IsBound() && Text.Get().IsEmpty() ) { return SNew( SToolTip ); } if ( OverrideContent.IsValid() ) { SAssignNew( DocToolTip, SDocumentationToolTip ) .DocumentationLink( Link ) .ExcerptName( ExcerptName ) [ OverrideContent.ToSharedRef() ]; } else { SAssignNew( DocToolTip, SDocumentationToolTip ) .Text( Text ) .DocumentationLink( Link ) .ExcerptName( ExcerptName ); } return SNew( SToolTip ) .IsInteractive( DocToolTip.ToSharedRef(), &SDocumentationToolTip::IsInteractive ) // Emulate text-only tool-tip styling that SToolTip uses when no custom content is supplied. We want documentation tool-tips to // be styled just like text-only tool-tips .BorderImage( FCoreStyle::Get().GetBrush("ToolTip.BrightBackground") ) .TextMargin(FMargin(11.0f)) [ DocToolTip.ToSharedRef() ]; }
static FText PassThroughAttribute( TAttribute< FString > InString ) { return FText::FromString( InString.Get( TEXT("") ) ); }
static FString GetPIENotifyText(TAttribute<FGraphAppearanceInfo> Appearance, FString DefaultText) { FString OverrideText = Appearance.Get().PIENotifyText; return OverrideText.Len() ? OverrideText : DefaultText; }
/** * Builds this MultiBlock widget up from the MultiBlock associated with it */ void SToolBarButtonBlock::BuildMultiBlockWidget(const ISlateStyle* StyleSet, const FName& StyleName) { struct Local { /** Appends the key binding to the end of the provided ToolTip */ static FText AppendKeyBindingToToolTip( const TAttribute<FText> ToolTip, TWeakPtr< const FUICommandInfo> Command ) { TSharedPtr<const FUICommandInfo> CommandPtr = Command.Pin(); if( CommandPtr.IsValid() && CommandPtr->GetActiveChord()->IsValidChord() ) { FFormatNamedArguments Args; Args.Add( TEXT("ToolTipDescription"), ToolTip.Get() ); Args.Add( TEXT("Keybinding"), CommandPtr->GetInputText() ); return FText::Format( NSLOCTEXT("ToolBar", "ToolTip + Keybinding", "{ToolTipDescription} ({Keybinding})"), Args ); } else { return ToolTip.Get(); } } }; TSharedRef< const FMultiBox > MultiBox( OwnerMultiBoxWidget.Pin()->GetMultiBox() ); TSharedRef< const FToolBarButtonBlock > ToolBarButtonBlock = StaticCastSharedRef< const FToolBarButtonBlock >( MultiBlock.ToSharedRef() ); // Allow the block to override the action's label and tool tip string, if desired TAttribute<FText> ActualLabel; if (ToolBarButtonBlock->LabelOverride.IsSet()) { ActualLabel = ToolBarButtonBlock->LabelOverride; } else { ActualLabel = ToolBarButtonBlock->GetAction()->GetLabel(); } // Add this widget to the search list of the multibox if (MultiBlock->GetSearchable()) OwnerMultiBoxWidget.Pin()->AddSearchElement(this->AsWidget(), ActualLabel.Get()); TAttribute<FText> ActualToolTip; if (ToolBarButtonBlock->ToolTipOverride.IsSet()) { ActualToolTip = ToolBarButtonBlock->ToolTipOverride; } else { ActualToolTip = ToolBarButtonBlock->GetAction()->GetDescription(); } // If a key is bound to the command, append it to the tooltip text. TWeakPtr<const FUICommandInfo> Action = ToolBarButtonBlock->GetAction(); ActualToolTip = TAttribute< FText >::Create( TAttribute< FText >::FGetter::CreateStatic( &Local::AppendKeyBindingToToolTip, ActualToolTip, Action ) ); // If we were supplied an image than go ahead and use that, otherwise we use a null widget TSharedRef< SWidget > IconWidget = SNew( SImage ) .Visibility( this, &SToolBarButtonBlock::GetIconVisibility, false ) .Image( this, &SToolBarButtonBlock::GetIconBrush ); TSharedRef< SWidget > SmallIconWidget = SNew( SImage ) .Visibility( this, &SToolBarButtonBlock::GetIconVisibility, true ) .Image( this, &SToolBarButtonBlock::GetSmallIconBrush ); // Create the content for our button TSharedRef< SWidget > ButtonContent = SNew(SHorizontalBox) .AddMetaData<FTagMetaData>(FTagMetaData(TutorialHighlightName)) + SHorizontalBox::Slot() .FillWidth(1) .VAlign(VAlign_Center) [ SNew( SVerticalBox ) // Icon image + SVerticalBox::Slot() .AutoHeight() .HAlign( HAlign_Center ) // Center the icon horizontally, so that large labels don't stretch out the artwork [ IconWidget ] + SVerticalBox::Slot().AutoHeight() .HAlign( HAlign_Center ) [ SmallIconWidget ] // Label text + SVerticalBox::Slot().AutoHeight() .HAlign( HAlign_Center ) // Center the label text horizontally [ SNew( STextBlock ) .Visibility( LabelVisibility ) .Text( ActualLabel ) .TextStyle( StyleSet, ISlateStyle::Join( StyleName, ".Label" ) ) // Smaller font for tool tip labels .ShadowOffset( FVector2D::UnitVector ) ] ]; EMultiBlockLocation::Type BlockLocation = GetMultiBlockLocation(); // What type of UI should we create for this block? EUserInterfaceActionType::Type UserInterfaceType = ToolBarButtonBlock->UserInterfaceActionType; if ( Action.IsValid() ) { // If we have a UICommand, then this is specified in the command. UserInterfaceType = Action.Pin()->GetUserInterfaceType(); } if( UserInterfaceType == EUserInterfaceActionType::Button ) { FName BlockStyle = EMultiBlockLocation::ToName(ISlateStyle::Join( StyleName, ".Button" ), BlockLocation); ChildSlot [ // Create a button SNew( SButton ) .ContentPadding(0) // Use the tool bar item style for this button .ButtonStyle( StyleSet, BlockStyle ) .ForegroundColor( FSlateColor::UseForeground() ) .IsFocusable(bIsFocusable) [ ButtonContent ] // Bind the button's "on clicked" event to our object's method for this .OnClicked( this, &SToolBarButtonBlock::OnClicked ) // Pass along the block's tool-tip string .ToolTip( FMultiBoxSettings::ToolTipConstructor.Execute( ActualToolTip, nullptr, Action.Pin() ) ) ]; } else if( ensure( UserInterfaceType == EUserInterfaceActionType::ToggleButton || UserInterfaceType == EUserInterfaceActionType::RadioButton ) ) { FName BlockStyle = EMultiBlockLocation::ToName(ISlateStyle::Join( StyleName, ".ToggleButton" ), BlockLocation); FName CheckboxStyle = ISlateStyle::Join( StyleName, ".SToolBarButtonBlock.CheckBox.Padding" ); ChildSlot [ // Create a check box SNew( SCheckBox ) // Use the tool bar style for this check box .Style( StyleSet, BlockStyle ) // User will have set the focusable attribute for the block, honor it .IsFocusable( bIsFocusable ) // Pass along the block's tool-tip string .ToolTip( FMultiBoxSettings::ToolTipConstructor.Execute( ActualToolTip, nullptr, Action.Pin() ) ) [ ButtonContent ] // Bind the button's "on checked" event to our object's method for this .OnCheckStateChanged( this, &SToolBarButtonBlock::OnCheckStateChanged ) // Bind the check box's "checked" state to our user interface action .IsChecked( this, &SToolBarButtonBlock::OnIsChecked ) .Padding( StyleSet->GetMargin(CheckboxStyle) ) ]; } ChildSlot.Padding(StyleSet->GetMargin(ISlateStyle::Join( StyleName, ".SToolBarButtonBlock.Padding" ))); // Bind our widget's enabled state to whether or not our action can execute SetEnabled( TAttribute< bool >( this, &SToolBarButtonBlock::IsEnabled ) ); // Bind our widget's visible state to whether or not the button should be visible SetVisibility( TAttribute<EVisibility>(this, &SToolBarButtonBlock::GetBlockVisibility) ); }
void SAssetSearchBox::SetText(const TAttribute< FText >& InNewText) { InputText->SetText(InNewText); PreCommittedText = InNewText.Get(); }