2014-12-07 19:09:38 -05:00
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
2014-12-06 19:14:20 -05:00
2014-11-19 07:43:07 -05:00
# include "LogVisualizer.h"
# include "SVisualLoggerView.h"
# include "TimeSliderController.h"
# include "ITimeSlider.h"
# include "STimeSlider.h"
# include "SSearchBox.h"
# include "SSequencerSectionOverlay.h"
# include "STimelinesContainer.h"
# define LOCTEXT_NAMESPACE "SVisualLoggerFilters"
2014-12-10 09:22:32 -05:00
class SInputCatcherOverlay : public SOverlay
{
public :
2015-01-29 19:21:24 -05:00
void Construct ( const FArguments & InArgs , TSharedRef < class FVisualLoggerTimeSliderController > InTimeSliderController )
2014-12-10 09:22:32 -05:00
{
SOverlay : : Construct ( InArgs ) ;
TimeSliderController = InTimeSliderController ;
}
/** Controller for manipulating time */
2015-01-29 19:21:24 -05:00
TSharedPtr < class FVisualLoggerTimeSliderController > TimeSliderController ;
2014-12-10 09:22:32 -05:00
private :
/** SWidget Interface */
virtual FReply OnMouseButtonDown ( const FGeometry & MyGeometry , const FPointerEvent & MouseEvent ) override ;
virtual FReply OnMouseButtonUp ( const FGeometry & MyGeometry , const FPointerEvent & MouseEvent ) override ;
virtual FReply OnMouseMove ( const FGeometry & MyGeometry , const FPointerEvent & MouseEvent ) override ;
virtual FReply OnMouseWheel ( const FGeometry & MyGeometry , const FPointerEvent & MouseEvent ) override ;
private :
} ;
FReply SInputCatcherOverlay : : OnMouseButtonDown ( const FGeometry & MyGeometry , const FPointerEvent & MouseEvent )
{
if ( MouseEvent . GetEffectingButton ( ) ! = EKeys : : LeftMouseButton )
{
return TimeSliderController - > OnMouseButtonDown ( SharedThis ( this ) , MyGeometry , MouseEvent ) ;
}
return FReply : : Unhandled ( ) ;
}
FReply SInputCatcherOverlay : : OnMouseButtonUp ( const FGeometry & MyGeometry , const FPointerEvent & MouseEvent )
{
if ( MouseEvent . GetEffectingButton ( ) ! = EKeys : : LeftMouseButton )
{
return TimeSliderController - > OnMouseButtonUp ( SharedThis ( this ) , MyGeometry , MouseEvent ) ;
}
return FReply : : Unhandled ( ) ;
}
FReply SInputCatcherOverlay : : OnMouseMove ( const FGeometry & MyGeometry , const FPointerEvent & MouseEvent )
{
return TimeSliderController - > OnMouseMove ( SharedThis ( this ) , MyGeometry , MouseEvent ) ;
}
FReply SInputCatcherOverlay : : OnMouseWheel ( const FGeometry & MyGeometry , const FPointerEvent & MouseEvent )
{
if ( MouseEvent . IsLeftShiftDown ( ) | | MouseEvent . IsLeftControlDown ( ) )
{
return TimeSliderController - > OnMouseWheel ( SharedThis ( this ) , MyGeometry , MouseEvent ) ;
}
return FReply : : Unhandled ( ) ;
}
2014-11-19 07:43:07 -05:00
void SVisualLoggerView : : GetTimelines ( TArray < TSharedPtr < STimeline > > & OutList , bool bOnlySelectedOnes )
{
OutList = bOnlySelectedOnes ? TimelinesContainer - > GetSelectedNodes ( ) : TimelinesContainer - > GetAllNodes ( ) ;
}
2015-01-15 06:19:24 -05:00
void SVisualLoggerView : : Construct ( const FArguments & InArgs , const TSharedRef < FUICommandList > & InCommandList )
2014-11-19 07:43:07 -05:00
{
AnimationOutlinerFillPercentage = .25f ;
2015-01-15 06:19:24 -05:00
VisualLoggerEvents = FLogVisualizer : : Get ( ) . GetVisualLoggerEvents ( ) ;
2014-11-19 07:43:07 -05:00
FVisualLoggerTimeSliderArgs TimeSliderArgs ;
TimeSliderArgs . ViewRange = InArgs . _ViewRange ;
TimeSliderArgs . ClampMin = InArgs . _ViewRange . Get ( ) . GetLowerBoundValue ( ) ;
TimeSliderArgs . ClampMax = InArgs . _ViewRange . Get ( ) . GetUpperBoundValue ( ) ;
TimeSliderArgs . ScrubPosition = InArgs . _ScrubPosition ;
2015-01-15 06:19:24 -05:00
FLogVisualizer : : Get ( ) . GetTimeSliderController ( ) - > SetTimesliderArgs ( TimeSliderArgs ) ;
2014-11-19 07:43:07 -05:00
2014-12-10 09:22:32 -05:00
TSharedRef < SScrollBar > ZoomScrollBar =
SNew ( SScrollBar )
. Orientation ( EOrientation : : Orient_Horizontal )
. Thickness ( FVector2D ( 2.0f , 2.0f ) ) ;
ZoomScrollBar - > SetState ( 0.0f , 1.0f ) ;
2015-01-15 06:19:24 -05:00
FLogVisualizer : : Get ( ) . GetTimeSliderController ( ) - > SetExternalScrollbar ( ZoomScrollBar ) ;
2014-11-19 07:43:07 -05:00
// Create the top and bottom sliders
const bool bMirrorLabels = true ;
2015-01-15 06:19:24 -05:00
TSharedRef < ITimeSlider > TopTimeSlider = SNew ( STimeSlider , FLogVisualizer : : Get ( ) . GetTimeSliderController ( ) . ToSharedRef ( ) ) . MirrorLabels ( bMirrorLabels ) ;
TSharedRef < ITimeSlider > BottomTimeSlider = SNew ( STimeSlider , FLogVisualizer : : Get ( ) . GetTimeSliderController ( ) . ToSharedRef ( ) ) . MirrorLabels ( bMirrorLabels ) ;
2014-11-19 07:43:07 -05:00
TSharedRef < SScrollBar > ScrollBar =
SNew ( SScrollBar )
2014-12-10 09:22:32 -05:00
. Thickness ( FVector2D ( 2.0f , 2.0f ) ) ;
2014-11-19 07:43:07 -05:00
2014-12-04 10:00:51 -05:00
ULogVisualizerSettings * Settings = ULogVisualizerSettings : : StaticClass ( ) - > GetDefaultObject < ULogVisualizerSettings > ( ) ;
2014-12-18 08:37:06 -05:00
FFiltersPreset & CurrentPresets = Settings - > CurrentPresets ;
2014-12-04 10:00:51 -05:00
2014-11-19 07:43:07 -05:00
ChildSlot
[
SNew ( SBorder )
. Padding ( 2 )
. BorderImage ( FLogVisualizerStyle : : Get ( ) . GetBrush ( " ToolPanel.GroupBorder " ) )
[
2014-12-11 09:34:00 -05:00
SNew ( SHorizontalBox )
+ SHorizontalBox : : Slot ( )
. FillWidth ( 1.0f )
2014-11-19 07:43:07 -05:00
[
SNew ( SVerticalBox )
+ SVerticalBox : : Slot ( )
. AutoHeight ( )
[
SAssignNew ( SearchSplitter , SSplitter )
. Orientation ( Orient_Horizontal )
. OnSplitterFinishedResizing ( this , & SVisualLoggerView : : OnSearchSplitterResized )
+ SSplitter : : Slot ( )
. Value ( 0.25 )
[
SNew ( SHorizontalBox )
+ SHorizontalBox : : Slot ( )
. Padding ( FMargin ( 0 ) )
2014-12-18 08:37:06 -05:00
. AutoWidth ( )
. HAlign ( HAlign_Center )
2014-11-19 07:43:07 -05:00
. VAlign ( VAlign_Center )
2014-12-18 08:37:06 -05:00
[
SNew ( SImage )
. Visibility_Lambda ( [ this ] ( ) - > EVisibility { return ULogVisualizerSettings : : StaticClass ( ) - > GetDefaultObject < ULogVisualizerSettings > ( ) - > CurrentPresets . SelectedClasses . Num ( ) > 0 ? EVisibility : : Visible : EVisibility : : Collapsed ; } )
. Image ( FLogVisualizerStyle : : Get ( ) . GetBrush ( " Filters.FilterIcon " ) )
]
+ SHorizontalBox : : Slot ( )
. Padding ( FMargin ( 0 ) )
. HAlign ( HAlign_Right )
. AutoWidth ( )
[
SAssignNew ( ClassesComboButton , SComboButton )
. Visibility_Lambda ( [ this ] ( ) - > EVisibility { return TimelinesContainer . IsValid ( ) & & TimelinesContainer - > GetAllNodes ( ) . Num ( ) > 1 ? EVisibility : : Visible : EVisibility : : Collapsed ; } )
. ComboButtonStyle ( FLogVisualizerStyle : : Get ( ) , " Filters.Style " )
. ForegroundColor ( FLinearColor : : White )
. ContentPadding ( 0 )
. OnGetMenuContent ( this , & SVisualLoggerView : : MakeClassesFilterMenu )
. ToolTipText ( LOCTEXT ( " SetFilterByClasses " , " Select classes to show " ) )
. HasDownArrow ( true )
. ContentPadding ( FMargin ( 1 , 0 ) )
. ButtonContent ( )
[
SNew ( STextBlock )
. TextStyle ( FLogVisualizerStyle : : Get ( ) , " Filters.Text " )
. Text ( LOCTEXT ( " FilterClasses " , " Classes " ) )
]
]
+ SHorizontalBox : : Slot ( )
. Padding ( FMargin ( 0 ) )
. HAlign ( HAlign_Fill )
. FillWidth ( 1 )
2014-11-19 07:43:07 -05:00
[
SNew ( SBox )
. Padding ( FMargin ( 0 , 0 , 4 , 0 ) )
[
// Search box for searching through the outliner
SNew ( SSearchBox )
. OnTextChanged ( this , & SVisualLoggerView : : OnSearchChanged )
]
]
]
+ SSplitter : : Slot ( )
. Value ( 0.75 )
[
SNew ( SHorizontalBox )
+ SHorizontalBox : : Slot ( )
[
#if 0 //top time slider disabled to test idea with filter's search box
SNew ( SBorder )
// @todo Sequencer Do not change the paddings or the sliders scrub widgets wont line up
. Padding ( FMargin ( 0.0f , 2.0f , 0.0f , 0.0f ) )
. BorderImage ( FLogVisualizerStyle : : Get ( ) . GetBrush ( " ToolPanel.GroupBorder " ) )
. BorderBackgroundColor ( FLinearColor ( .50f , .50f , .50f , 1.0f ) )
[
TopTimeSlider
]
# else
SNew ( SBox )
. Padding ( FMargin ( 0 , 0 , 4 , 0 ) )
[
2014-12-08 08:20:42 -05:00
SAssignNew ( SearchBox , SSearchBox )
2014-11-19 07:43:07 -05:00
. OnTextChanged ( InArgs . _OnFiltersSearchChanged )
2014-12-04 10:00:51 -05:00
. HintText_Lambda ( [ Settings ] ( ) - > FText { return Settings - > bSearchInsideLogs ? LOCTEXT ( " FiltersSearchHint " , " Log Data Search " ) : LOCTEXT ( " FiltersSearchHint " , " Log Category Search " ) ; } )
2014-11-19 07:43:07 -05:00
]
# endif
]
]
]
+ SVerticalBox : : Slot ( )
. FillHeight ( 1.0 )
[
2015-01-15 06:19:24 -05:00
SNew ( SInputCatcherOverlay , FLogVisualizer : : Get ( ) . GetTimeSliderController ( ) . ToSharedRef ( ) )
2014-11-19 07:43:07 -05:00
+ SOverlay : : Slot ( )
[
2015-01-15 06:19:24 -05:00
MakeSectionOverlay ( FLogVisualizer : : Get ( ) . GetTimeSliderController ( ) . ToSharedRef ( ) , InArgs . _ViewRange , InArgs . _ScrubPosition , false )
2014-11-19 07:43:07 -05:00
]
+ SOverlay : : Slot ( )
[
SAssignNew ( ScrollBox , SScrollBox )
. ExternalScrollbar ( ScrollBar )
2014-12-10 09:22:32 -05:00
+ SScrollBox : : Slot ( )
[
2015-01-15 06:19:24 -05:00
SAssignNew ( TimelinesContainer , STimelinesContainer , SharedThis ( this ) , FLogVisualizer : : Get ( ) . GetTimeSliderController ( ) . ToSharedRef ( ) )
2014-12-10 09:22:32 -05:00
]
2014-11-19 07:43:07 -05:00
]
+ SOverlay : : Slot ( )
[
2015-01-15 06:19:24 -05:00
MakeSectionOverlay ( FLogVisualizer : : Get ( ) . GetTimeSliderController ( ) . ToSharedRef ( ) , InArgs . _ViewRange , InArgs . _ScrubPosition , true )
2014-11-19 07:43:07 -05:00
]
2014-12-10 09:22:32 -05:00
+ SOverlay : : Slot ( )
. VAlign ( VAlign_Bottom )
[
SNew ( SHorizontalBox )
+ SHorizontalBox : : Slot ( )
//.Visibility(EVisibility::HitTestInvisible)
. FillWidth ( TAttribute < float > ( this , & SVisualLoggerView : : GetAnimationOutlinerFillPercentage ) )
[
// Take up space but display nothing. This is required so that all areas dependent on time align correctly
SNullWidget : : NullWidget
]
+ SHorizontalBox : : Slot ( )
. FillWidth ( 1.0f )
[
ZoomScrollBar
]
]
2014-11-19 07:43:07 -05:00
]
+ SVerticalBox : : Slot ( )
. AutoHeight ( )
[
SNew ( SHorizontalBox )
+ SHorizontalBox : : Slot ( )
. FillWidth ( TAttribute < float > ( this , & SVisualLoggerView : : GetAnimationOutlinerFillPercentage ) )
[
SNew ( SSpacer )
]
+ SHorizontalBox : : Slot ( )
. Padding ( FMargin ( 0.0f , 0.0f , 0.0f , 0.0f ) )
. FillWidth ( 1.0f )
[
SNew ( SBorder )
// @todo Sequencer Do not change the paddings or the sliders scrub widgets wont line up
. Padding ( FMargin ( 0.0f , 0.0f , 0.0f , 2.0f ) )
. BorderImage ( FLogVisualizerStyle : : Get ( ) . GetBrush ( " ToolPanel.GroupBorder " ) )
. BorderBackgroundColor ( FLinearColor ( .50f , .50f , .50f , 1.0f ) )
[
BottomTimeSlider
]
]
]
]
2014-12-11 09:34:00 -05:00
+ SHorizontalBox : : Slot ( )
. HAlign ( HAlign_Right )
. AutoWidth ( )
[
ScrollBar
]
2014-11-19 07:43:07 -05:00
]
] ;
2014-12-18 08:37:06 -05:00
SearchBox - > SetText ( FText : : FromString ( CurrentPresets . DataFilter ) ) ;
2014-11-19 07:43:07 -05:00
}
2014-12-10 09:22:32 -05:00
void SVisualLoggerView : : SetAnimationOutlinerFillPercentage ( float FillPercentage )
{
AnimationOutlinerFillPercentage = FillPercentage ;
}
2014-12-08 08:20:42 -05:00
void SVisualLoggerView : : SetSearchString ( FText SearchString )
{
if ( SearchBox . IsValid ( ) )
{
SearchBox - > SetText ( SearchString ) ;
}
}
2014-12-02 08:07:26 -05:00
void SVisualLoggerView : : OnObjectSelectionChanged ( TSharedPtr < class STimeline > TimeLine )
{
//FIXME: scroll to selected timeline (SebaK)
//FWidgetPath WidgetPath;
//if (FSlateApplication::Get().GeneratePathToWidgetUnchecked(TimeLine.ToSharedRef(), WidgetPath))
//{
// FArrangedWidget ArrangedWidget = WidgetPath.FindArrangedWidget(TimeLine.ToSharedRef()).Get(FArrangedWidget::NullWidget);
// ScrollBox->ScrollDescendantIntoView(ArrangedWidget.Geometry, TimeLine, true);
//}
}
2014-11-19 07:43:07 -05:00
void SVisualLoggerView : : OnSearchSplitterResized ( )
{
SSplitter : : FSlot const & LeftSplitterSlot = SearchSplitter - > SlotAt ( 0 ) ;
SSplitter : : FSlot const & RightSplitterSlot = SearchSplitter - > SlotAt ( 1 ) ;
SetAnimationOutlinerFillPercentage ( LeftSplitterSlot . SizeValue . Get ( ) / RightSplitterSlot . SizeValue . Get ( ) ) ;
}
void SVisualLoggerView : : OnSearchChanged ( const FText & Filter )
{
TimelinesContainer - > OnSearchChanged ( Filter ) ;
}
2015-01-29 19:21:24 -05:00
TSharedRef < SWidget > SVisualLoggerView : : MakeSectionOverlay ( TSharedRef < FVisualLoggerTimeSliderController > TimeSliderController , const TAttribute < TRange < float > > & ViewRange , const TAttribute < float > & ScrubPosition , bool bTopOverlay )
2014-11-19 07:43:07 -05:00
{
return
SNew ( SHorizontalBox )
. Visibility ( EVisibility : : HitTestInvisible )
+ SHorizontalBox : : Slot ( )
. FillWidth ( TAttribute < float > ( this , & SVisualLoggerView : : GetAnimationOutlinerFillPercentage ) )
[
// Take up space but display nothing. This is required so that all areas dependent on time align correctly
SNullWidget : : NullWidget
]
2014-12-10 09:22:32 -05:00
+ SHorizontalBox : : Slot ( )
2014-11-19 07:43:07 -05:00
. FillWidth ( 1.0f )
[
2015-01-30 00:33:20 -05:00
SNew ( SVisualLoggerSectionOverlay , TimeSliderController )
2014-11-19 07:43:07 -05:00
. DisplayScrubPosition ( bTopOverlay )
. DisplayTickLines ( ! bTopOverlay )
] ;
}
2015-01-07 08:06:36 -05:00
void SVisualLoggerView : : ResetData ( )
{
TimelinesContainer - > ResetData ( ) ;
}
2014-11-19 07:43:07 -05:00
void SVisualLoggerView : : OnNewLogEntry ( const FVisualLogDevice : : FVisualLogEntryItem & Entry )
{
TimelinesContainer - > OnNewLogEntry ( Entry ) ;
}
void SVisualLoggerView : : OnFiltersChanged ( )
{
TimelinesContainer - > OnFiltersChanged ( ) ;
}
2014-12-04 10:00:51 -05:00
void SVisualLoggerView : : OnFiltersSearchChanged ( const FText & Filter )
{
TimelinesContainer - > OnFiltersSearchChanged ( Filter ) ;
}
2014-12-10 09:22:32 -05:00
FCursorReply SVisualLoggerView : : OnCursorQuery ( const FGeometry & MyGeometry , const FPointerEvent & CursorEvent ) const
{
2015-01-15 06:19:24 -05:00
if ( FLogVisualizer : : Get ( ) . GetTimeSliderController ( ) - > IsPanning ( ) )
2014-12-10 09:22:32 -05:00
{
return FCursorReply : : Cursor ( EMouseCursor : : GrabHand ) ;
}
return FCursorReply : : Cursor ( EMouseCursor : : Default ) ;
}
2014-12-18 08:37:06 -05:00
TSharedRef < SWidget > SVisualLoggerView : : MakeClassesFilterMenu ( )
{
const TArray < TSharedPtr < class STimeline > > & AllTimelines = TimelinesContainer - > GetAllNodes ( ) ;
FMenuBuilder MenuBuilder ( true , NULL ) ;
TArray < FString > UniqueClasses ;
MenuBuilder . BeginSection ( TEXT ( " Graphs " ) ) ;
for ( TSharedPtr < class STimeline > CurrentTimeline : AllTimelines )
{
FString OwnerClassName = CurrentTimeline - > GetOwnerClassName ( ) . ToString ( ) ;
if ( UniqueClasses . Find ( OwnerClassName ) = = INDEX_NONE )
{
FText LabelText = FText : : FromString ( OwnerClassName ) ;
MenuBuilder . AddMenuEntry (
LabelText ,
FText : : Format ( LOCTEXT ( " FilterByClassPrefix " , " Toggle {0} class " ) , LabelText ) ,
FSlateIcon ( ) ,
FUIAction (
FExecuteAction : : CreateLambda ( [ this , OwnerClassName ] ( )
{
TArray < FString > & SelectedOwnerClasses = ULogVisualizerSettings : : StaticClass ( ) - > GetDefaultObject < ULogVisualizerSettings > ( ) - > CurrentPresets . SelectedClasses ;
if ( SelectedOwnerClasses . Find ( OwnerClassName ) ! = INDEX_NONE )
SelectedOwnerClasses . Remove ( OwnerClassName ) ;
else
SelectedOwnerClasses . AddUnique ( OwnerClassName ) ;
OnChangedClassesFilter ( ) ;
} ) ,
FCanExecuteAction ( ) ,
FIsActionChecked : : CreateLambda ( [ OwnerClassName ] ( ) - > bool
{
TArray < FString > & SelectedOwnerClasses = ULogVisualizerSettings : : StaticClass ( ) - > GetDefaultObject < ULogVisualizerSettings > ( ) - > CurrentPresets . SelectedClasses ;
return SelectedOwnerClasses . Find ( OwnerClassName ) ! = INDEX_NONE ;
} ) ,
FIsActionButtonVisible ( ) ) ,
NAME_None ,
EUserInterfaceActionType : : ToggleButton
) ;
UniqueClasses . AddUnique ( OwnerClassName ) ;
}
}
MenuBuilder . EndSection ( ) ; //ContentBrowserFilterBasicAsset
FDisplayMetrics DisplayMetrics ;
FSlateApplication : : Get ( ) . GetDisplayMetrics ( DisplayMetrics ) ;
const FVector2D DisplaySize (
DisplayMetrics . PrimaryDisplayWorkAreaRect . Right - DisplayMetrics . PrimaryDisplayWorkAreaRect . Left ,
DisplayMetrics . PrimaryDisplayWorkAreaRect . Bottom - DisplayMetrics . PrimaryDisplayWorkAreaRect . Top ) ;
return
SNew ( SVerticalBox )
+ SVerticalBox : : Slot ( )
. MaxHeight ( DisplaySize . Y * 0.5 )
[
MenuBuilder . MakeWidget ( )
] ;
}
void SVisualLoggerView : : OnChangedClassesFilter ( )
{
ULogVisualizerSettings : : StaticClass ( ) - > GetDefaultObject < ULogVisualizerSettings > ( ) - > SaveConfig ( ) ;
for ( auto CurrentItem : TimelinesContainer - > GetAllNodes ( ) )
{
CurrentItem - > UpdateVisibility ( ) ;
}
}
2014-12-10 09:22:32 -05:00
2014-11-19 09:04:58 -05:00
# undef LOCTEXT_NAMESPACE