Slate, How to Make Fancy Custom SButtons
Contents
Overview
In this tutorial I show you how to make some fancy custom buttons!
I show you how to use images as button background, or as the entire button!
I also show you how to use custom color and font text!
I also give you the code for how to make custom Tool Tips
Lastly I show how to make text highlight when it is hovered over :)
Enjoy!
Video
Here's a video demoing what I am showing you in this tutorial!
<youtube>https://www.youtube.com/watch?v=OfA0jTeqb0A</youtube>
.H
//Buttons
  TSharedPtr<SButton> RefreshButton;
  TSharedPtr<STextBlock> RefreshButtonText;
  TSharedPtr<SButton> ClearTileButton;
.CPP
FButtonStyle
Both of my example buttons use a special Slate Core Style.
.ButtonStyle( FCoreStyle::Get(), "NoBorder" )
Rainbow Background Button
//The button!
SAssignNew( RefreshButton, SButton )
	.ButtonStyle( FCoreStyle::Get(), "NoBorder" ) 
	.OnClicked( this, &SDDFileTree::RefreshButtonPressed )
	.HAlign( HAlign_Center )
	.VAlign( VAlign_Center )
	.ForegroundColor( FSlateColor::UseForeground() )
	[
		//Colored Background
		SNew(SBorder)
		  .Padding(FMargin(3))
			
		  //~~~ Rainbow Image for Button!!! ~~~
		  .BorderImage( FCoreStyle::Get().GetBrush("ColorSpectrum.Spectrum") )
		  [
			//Button Text!! AssignNew so can change color later
			SAssignNew(RefreshButtonText , STextBlock)
			  .Text( FString("Refresh (F5) ") )
			  .Font(FSlateFontInfo(FPaths::EngineContentDir() / TEXT("Slate/Fonts/Roboto-Bold.ttf"), 16))
			  .ColorAndOpacity(FLinearColor(1,0,1,1))
			  .HighlightColor(FLinearColor(1,1,0,1))
			  .ShadowColorAndOpacity(FLinearColor::Black)
			  .ShadowOffset(FIntPoint(1, -1))
		  ]
	]
Trash Can Button
//Resizes the image
SNew(SBox)
	.WidthOverride(64)
	.HeightOverride(64)
	[
	  //~~~ Clear Button / Trash Can ~~~
	  SAssignNew( ClearTileButton, SButton )
		.ButtonStyle( FCoreStyle::Get(), "NoBorder" ) 
		.OnClicked( this, &SDDFileTree::ClearButtonPressed )
		.HAlign( HAlign_Center )
		.VAlign( VAlign_Center )
		.ForegroundColor( FSlateColor::UseForeground() )
		[
			//Button Content Image
			TSharedRef<SWidget>( SNew( SImage ) .Image( 
				FCoreStyle::Get().GetBrush("TrashCan")
			))
		]
	]
Setting The Cursors
//Set Cursors
ClearTileButton->SetCursor(EMouseCursor::SlashedCircle);
RefreshButton->SetCursor(EMouseCursor::Hand);
Setting the Custom Tooltips
ClearTileButton->SetToolTip( 
		SNew(SToolTip)
		[
			SNew(STextBlock)
			  .Text(NSLOCTEXT("FileTree", "Clear", "Clear any currently Loaded Preview Tile!  -Rama"))
			  .Font(FSlateFontInfo(FPaths::EngineContentDir() / TEXT("Slate/Fonts/Roboto-Bold.ttf"), 12))
			  .ColorAndOpacity(FLinearColor(1,0,1,1))
			  .HighlightColor(FLinearColor(1,1,0,1))
			  .ShadowColorAndOpacity(FLinearColor::Black)
			  .ShadowOffset(FIntPoint(-2, 2))
		]
	);
RefreshButton->SetToolTip(	
		SNew(SToolTip)
		[
			SNew(STextBlock)
			  .Text( NSLOCTEXT("FileTree", "Refresh", "Refresh Directory and File Listing, updating to hard drive contents! -Rama") )
			  .Font(FSlateFontInfo(FPaths::EngineContentDir() / TEXT("Slate/Fonts/Roboto-Bold.ttf"), 12))
			  .ColorAndOpacity(FLinearColor(1,0,1,1))
			  .HighlightColor(FLinearColor(1,1,0,1))
			  .ShadowColorAndOpacity(FLinearColor::Black)
			  .ShadowOffset(FIntPoint(-2, 2))
		]
	);
Updating the Text When Highlighted
void SDDFileTree::Tick( const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime )
{
	// Call parent implementation
	SCompoundWidget::Tick( AllottedGeometry, InCurrentTime, InDeltaTime );
	
	//~~~~~~~~~~~~
	// Button Hovering
	//~~~~~~~~~~~~
	if(RefreshButtonText->IsHovered())
	{
		SetRainbowGlowColor();
		RefreshButtonText->SetForegroundColor( RainbowGlowingColor );
	}
	else
	{
		RefreshButtonText->SetForegroundColor( FLinearColor(1,0,1,1) );
	}
}
Summary
Enjoy!