/** * See SWidget::OnMouseButtonDown. * * @param MyGeometry The Geometry of the widget receiving the event * @param MouseEvent Information about the input event * * @return Whether the event was handled along with possible requests for the system to take action. */ FReply SCheckBox::OnMouseButtonDown( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) { if ( MouseEvent.GetEffectingButton() == EKeys::LeftMouseButton ) { bIsPressed = true; if( ClickMethod == EButtonClickMethod::MouseDown ) { ToggleCheckedState(); const ECheckBoxState State = IsCheckboxChecked.Get(); if(State == ECheckBoxState::Checked) { PlayCheckedSound(); } else if(State == ECheckBoxState::Unchecked) { PlayUncheckedSound(); } // Set focus to this button, but don't capture the mouse return FReply::Handled().SetUserFocus(AsShared(), EFocusCause::Mouse); } else { // Capture the mouse, and also set focus to this button return FReply::Handled().CaptureMouse(AsShared()).SetUserFocus(AsShared(), EFocusCause::Mouse); } } else if ( MouseEvent.GetEffectingButton() == EKeys::RightMouseButton && OnGetMenuContent.IsBound() ) { FWidgetPath WidgetPath = MouseEvent.GetEventPath() != nullptr ? *MouseEvent.GetEventPath() : FWidgetPath(); FSlateApplication::Get().PushMenu( AsShared(), WidgetPath, OnGetMenuContent.Execute(), MouseEvent.GetScreenSpacePosition(), FPopupTransitionEffect( FPopupTransitionEffect::ContextMenu ) ); return FReply::Handled(); } else { return FReply::Unhandled(); } }
FReply SCheckBox::OnKeyUp( const FGeometry& MyGeometry, const FKeyboardEvent& InKeyboardEvent ) { if ( InKeyboardEvent.GetKey() == EKeys::SpaceBar ) { ToggleCheckedState(); const TAttribute<ESlateCheckBoxState::Type>& State = IsCheckboxChecked.Get(); if(State == ESlateCheckBoxState::Checked) { PlayCheckedSound(); } else if(State == ESlateCheckBoxState::Unchecked) { PlayUncheckedSound(); } return FReply::Handled(); } return FReply::Unhandled(); }
/** * See SWidget::OnMouseButtonUp. * * @param MyGeometry The Geometry of the widget receiving the event * @param MouseEvent Information about the input event * * @return Whether the event was handled along with possible requests for the system to take action. */ FReply SCheckBox::OnMouseButtonUp( const FGeometry& MyGeometry, const FPointerEvent& MouseEvent ) { if ( MouseEvent.GetEffectingButton() == EKeys::LeftMouseButton ) { bIsPressed = false; if( ClickMethod == EButtonClickMethod::MouseDown ) { // NOTE: If we're configured to click on mouse-down, then we never capture the mouse thus // may never receive an OnMouseButtonUp() call. We make sure that our bIsPressed // state is reset by overriding OnMouseLeave(). } else { const bool IsUnderMouse = MyGeometry.IsUnderLocation( MouseEvent.GetScreenSpacePosition() ); if ( IsUnderMouse ) { // If we were asked to allow the button to be clicked on mouse up, regardless of whether the user // pressed the button down first, then we'll allow the click to proceed without an active capture if( ClickMethod == EButtonClickMethod::MouseUp || HasMouseCapture() ) { ToggleCheckedState(); const TAttribute<ESlateCheckBoxState::Type>& State = IsCheckboxChecked.Get(); if(State == ESlateCheckBoxState::Checked) { PlayCheckedSound(); } else if(State == ESlateCheckBoxState::Unchecked) { PlayUncheckedSound(); } } } } return FReply::Handled().ReleaseMouseCapture(); } return FReply::Unhandled(); }