xmake.repo/packages/n/noesis/latest/Include/NsGui/KeyboardNavigation.h
2024-12-22 19:15:02 +08:00

150 lines
5.4 KiB
C++

////////////////////////////////////////////////////////////////////////////////////////////////////
// NoesisGUI - http://www.noesisengine.com
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __GUI_KEYBOARDNAVIGATION_H__
#define __GUI_KEYBOARDNAVIGATION_H__
#include <NsCore/Noesis.h>
#include <NsGui/CoreApi.h>
#include <NsCore/Ptr.h>
#include <NsCore/ReflectionDeclare.h>
#include <NsCore/BaseComponent.h>
namespace Noesis
{
class DependencyObject;
class DependencyProperty;
class Visual;
class UIElement;
class FrameworkElement;
class Keyboard;
class FocusVisualAdorner;
struct TraversalRequest;
struct DependencyPropertyChangedEventArgs;
enum FocusNavigationDirection: int32_t;
enum KeyboardNavigationMode: int32_t;
enum Key: int32_t;
NS_WARNING_PUSH
NS_MSVC_WARNING_DISABLE(4251)
////////////////////////////////////////////////////////////////////////////////////////////////////
/// Provides logical and directional navigation between focusable objects.
///
/// .. code-block:: xml
/// :caption: XAML
///
/// <Menu KeyboardNavigation.TabNavigation="Cycle">
/// <MenuItem Header="Menu Item 1" />
/// <MenuItem Header="Menu Item 2" />
/// <MenuItem Header="Menu Item 3" />
/// <MenuItem Header="Menu Item 4" />
/// </Menu>
///
/// The KeyboardNavigation class is responsible for implementing default keyboard focus navigation
/// when one of the navigation keys is pressed.
///
/// http://msdn.microsoft.com/en-us/library/system.windows.input.keyboardnavigation.aspx
////////////////////////////////////////////////////////////////////////////////////////////////////
class NS_GUI_CORE_API KeyboardNavigation final: public BaseComponent
{
public:
KeyboardNavigation();
KeyboardNavigation(Keyboard* keyboard, Visual* root);
~KeyboardNavigation();
/// Gets View root
Visual* GetRoot() const;
/// Gets or sets the logical tab navigation behavior for the children of the element that this
/// property is set on
//@{
static KeyboardNavigationMode GetTabNavigation(const DependencyObject* element);
static void SetTabNavigation(DependencyObject* element, KeyboardNavigationMode mode);
//@}
/// Gets or sets the logical control tab navigation behavior for the children of the element
/// that this property is set on
//@{
static KeyboardNavigationMode GetControlTabNavigation(const DependencyObject* element);
static void SetControlTabNavigation(DependencyObject* element, KeyboardNavigationMode mode);
//@}
/// Gets or sets the directional navigation behavior for the children of the element that this
/// property is set on
//@{
static KeyboardNavigationMode GetDirectionalNavigation(const DependencyObject* element);
static void SetDirectionalNavigation(DependencyObject* element, KeyboardNavigationMode mode);
//@}
/// Gets or sets a value indicating whether the Return character is accepted by a control
//@{
static bool GetAcceptsReturn(const DependencyObject* element);
static void SetAcceptsReturn(DependencyObject* element, bool value);
//@}
/// Gets or sets a value indicating whether the element that this property is set on is a tab
/// stop
//@{
static bool GetIsTabStop(const DependencyObject* element);
static void SetIsTabStop(DependencyObject* element, bool value);
//@}
/// Gets or sets the tab index for the element that this property is set on
//@{
static int32_t GetTabIndex(const DependencyObject* element);
static void SetTabIndex(DependencyObject* element, int32_t value);
//@}
/// Request to move the focus from source element in the specified direction. Returns true if
/// focus is moved successfully, returns false if there is no next element.
/// Note: Internally used by FrameworkElement to implement *MoveFocus()*
bool MoveFocus(FrameworkElement* source, const TraversalRequest& request);
/// Returns the element that would receive focus for a specified focus traversal direction,
/// without actually moving focus to that element.
/// Note: Internally used by FrameworkElement to implement *PredictFocus()*
FrameworkElement* PredictFocus(FrameworkElement* source, FocusNavigationDirection direction);
public:
static const DependencyProperty* AcceptsReturnProperty; // Attached
static const DependencyProperty* ControlTabNavigationProperty; // Attached
static const DependencyProperty* DirectionalNavigationProperty; // Attached
static const DependencyProperty* IsTabStopProperty; // Attached
static const DependencyProperty* TabIndexProperty; // Attached
static const DependencyProperty* TabNavigationProperty; // Attached
private:
friend class Keyboard;
bool OnKeyDown(Key key);
void OnFocused(UIElement* focusedElement, bool keyboardFocused);
void OnUnfocused(BaseComponent* sender, const DependencyPropertyChangedEventArgs& e);
void ShowFocusVisual(UIElement* focusedElement);
void HideFocusVisual();
void UpdateDirectionalFocus(UIElement* focused, FocusNavigationDirection direction,
bool enableFocusEngagement);
private:
Keyboard* mKeyboard;
Visual* mRoot;
Ptr<FocusVisualAdorner> mFocusVisual;
bool mKeyboardFocused;
NS_DECLARE_REFLECTION(KeyboardNavigation, BaseComponent)
};
NS_WARNING_POP
}
#endif