Files
UnrealEngineUWP/Engine/Source/Editor/UnrealEd/Private/SViewportToolBarComboMenu.cpp
Michael Noland 1263a3db47 Slate: Added the ability to specify a minimum desired width for SViewportToolBarComboMenu
[CL 2554351 by Michael Noland in Main branch]
2015-05-17 19:26:24 -04:00

150 lines
3.6 KiB
C++

// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "UnrealEd.h"
#include "SViewportToolBarComboMenu.h"
void SViewportToolBarComboMenu::Construct( const FArguments& InArgs )
{
FName ButtonStyle = FEditorStyle::Join(InArgs._Style.Get(), ".Button");
FName CheckboxStyle = FEditorStyle::Join(InArgs._Style.Get(), ".ToggleButton");
const FSlateIcon& Icon = InArgs._Icon.Get();
ParentToolBar = InArgs._ParentToolBar;
TSharedPtr<SCheckBox> ToggleControl;
{
ToggleControl = SNew(SCheckBox)
.Cursor( EMouseCursor::Default )
.Padding(FMargin( 4.0f ))
.Style(FEditorStyle::Get(), EMultiBlockLocation::ToName(CheckboxStyle, InArgs._BlockLocation))
.OnCheckStateChanged(InArgs._OnCheckStateChanged)
.ToolTipText(InArgs._ToggleButtonToolTip)
.IsChecked(InArgs._IsChecked)
.Content()
[
SNew( SBox )
.WidthOverride( 16 )
.HeightOverride( 16 )
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
[
SNew(SImage)
.Image(Icon.GetIcon())
]
];
}
{
TSharedRef<SWidget> ButtonContents =
SNew(SButton)
.ButtonStyle( FEditorStyle::Get(), EMultiBlockLocation::ToName(ButtonStyle,EMultiBlockLocation::End) )
.ContentPadding( FMargin( 5.0f, 0.0f ) )
.ToolTipText(InArgs._MenuButtonToolTip)
.OnClicked(this, &SViewportToolBarComboMenu::OnMenuClicked)
[
SNew(SVerticalBox)
+SVerticalBox::Slot()
.AutoHeight()
.HAlign(HAlign_Center)
.VAlign(VAlign_Top)
[
SNew(STextBlock)
.TextStyle( FEditorStyle::Get(), FEditorStyle::Join( InArgs._Style.Get(), ".Label" ) )
.Text(InArgs._Label)
]
+SVerticalBox::Slot()
.AutoHeight()
.VAlign(VAlign_Bottom)
[
SNew(SHorizontalBox)
+SHorizontalBox::Slot()
.FillWidth(1.0f)
+SHorizontalBox::Slot()
.AutoWidth()
[
SNew( SBox )
.WidthOverride( 4 )
.HeightOverride( 4 )
[
SNew(SImage)
.Image(FEditorStyle::GetBrush("ComboButton.Arrow"))
.ColorAndOpacity(FLinearColor::Black)
]
]
+SHorizontalBox::Slot()
.FillWidth(1.0f)
]
];
if (InArgs._MinDesiredButtonWidth > 0.0f)
{
ButtonContents =
SNew(SBox)
.MinDesiredWidth(InArgs._MinDesiredButtonWidth)
[
ButtonContents
];
}
MenuAnchor = SNew(SMenuAnchor)
.Placement( MenuPlacement_BelowAnchor )
[
ButtonContents
]
.OnGetMenuContent( InArgs._OnGetMenuContent );
}
ChildSlot
[
SNew(SHorizontalBox)
//Checkbox concept
+SHorizontalBox::Slot()
.AutoWidth()
[
ToggleControl->AsShared()
]
// Black Separator line
+SHorizontalBox::Slot()
.AutoWidth()
[
SNew(SBorder)
.Padding(FMargin(1.0f, 0.0f, 0.0f, 0.0f))
.BorderImage(FEditorStyle::GetDefaultBrush())
.BorderBackgroundColor(FLinearColor::Black)
]
// Menu dropdown concept
+SHorizontalBox::Slot()
.AutoWidth()
[
MenuAnchor->AsShared()
]
];
}
FReply SViewportToolBarComboMenu::OnMenuClicked()
{
// If the menu button is clicked toggle the state of the menu anchor which will open or close the menu
MenuAnchor->SetIsOpen( !MenuAnchor->IsOpen() );
ParentToolBar.Pin()->SetOpenMenu( MenuAnchor );
return FReply::Handled();
}
void SViewportToolBarComboMenu::OnMouseEnter( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent )
{
// See if there is another menu on the same tool bar already open
TWeakPtr<SMenuAnchor> OpenedMenu = ParentToolBar.Pin()->GetOpenMenu();
if( OpenedMenu.IsValid() && OpenedMenu.Pin()->IsOpen() && OpenedMenu.Pin() != MenuAnchor )
{
// There is another menu open so we open this menu and close the other
ParentToolBar.Pin()->SetOpenMenu( MenuAnchor );
MenuAnchor->SetIsOpen( true );
}
}