Skip to content

Commit 77c6732

Browse files
committed
Added AutoPanOnNodeFocus
1 parent 3feb086 commit 77c6732

File tree

6 files changed

+41
-6
lines changed

6 files changed

+41
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
> - Improved tab and directional navigation, ensuring that focused elements are automatically brought into view
1313
> - Added keyboard navigation layers for nodes, connections and decorators; restricting keyboard navigation to the active layer
1414
> - Implemented IKeyboardNavigationLayerGroup in NodifyEditor for keyboard layers management
15-
> - Added AutoRegisterConnectionsLayer, AutoRegisterDecoratorsLayer, AutoFocusFirstElement, PanViewportOnKeyboardDrag and MinimumNavigationStepSize to NodifyEditor
15+
> - Added AutoRegisterConnectionsLayer, AutoRegisterDecoratorsLayer, AutoFocusFirstElement, AutoPanOnNodeFocus, PanViewportOnKeyboardDrag and MinimumNavigationStepSize to NodifyEditor
1616
> - Added new gestures for keyboard navigation available in EditorGestures.Editor.Keyboard
1717
> - Added ToggleContentSelection to GroupingNode to toggle the selection of nodes inside the group
1818
> - Added ZoomIn, ZoomOut and ResetViewport methods to the Minimap control and the corresponding gestures to EditorGestures.Minimap

Nodify/Connections/ConnectionsMultiSelector.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ static ConnectionsMultiSelector()
8888

8989
public ConnectionsMultiSelector()
9090
{
91-
_focusNavigator = new StatefulFocusNavigator<ConnectionContainer>(target => Editor?.BringIntoView(target.Bounds, NodifyEditor.BringIntoViewEdgeOffset));
91+
_focusNavigator = new StatefulFocusNavigator<ConnectionContainer>(OnElementFocused);
9292
}
9393

9494
protected override DependencyObject GetContainerForItemOverride()
@@ -157,6 +157,14 @@ private bool TryFindContainerToFocus(ConnectionContainer? currentElement, Traver
157157
return result?.Element;
158158
}
159159

160+
protected virtual void OnElementFocused(IKeyboardFocusTarget<ConnectionContainer> target)
161+
{
162+
if (NodifyEditor.AutoPanOnNodeFocus)
163+
{
164+
Editor?.BringIntoView(target.Bounds, NodifyEditor.BringIntoViewEdgeOffset);
165+
}
166+
}
167+
160168
void IKeyboardNavigationLayer.OnActivated()
161169
{
162170
TryRestoreFocus();

Nodify/Containers/DecoratorsControl.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ static DecoratorsControl()
4848

4949
public DecoratorsControl()
5050
{
51-
_focusNavigator = new StatefulFocusNavigator<DecoratorContainer>(target => Editor?.BringIntoView(target.Bounds, NodifyEditor.BringIntoViewEdgeOffset));
51+
_focusNavigator = new StatefulFocusNavigator<DecoratorContainer>(OnElementFocused);
5252
}
5353

5454
/// <inheritdoc />
@@ -119,6 +119,14 @@ private bool TryFindContainerToFocus(DecoratorContainer? currentElement, Travers
119119
return result?.Element;
120120
}
121121

122+
protected virtual void OnElementFocused(IKeyboardFocusTarget<DecoratorContainer> target)
123+
{
124+
if (NodifyEditor.AutoPanOnNodeFocus)
125+
{
126+
Editor?.BringIntoView(target.Bounds, NodifyEditor.BringIntoViewEdgeOffset);
127+
}
128+
}
129+
122130
void IKeyboardNavigationLayer.OnActivated()
123131
{
124132
TryRestoreFocus();

Nodify/Editor/NodifyEditor.KeyboardNavigation.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ public partial class NodifyEditor : IKeyboardNavigationLayer, IKeyboardNavigatio
2121
/// </summary>
2222
public static bool AutoFocusFirstElement { get; set; } = true;
2323

24+
/// <summary>
25+
/// Automatically pan the viewport when a node is focused via keyboard navigation.
26+
/// </summary>
27+
public static bool AutoPanOnNodeFocus { get; set; } = true;
28+
2429
/// <summary>
2530
/// Automatically registers the decorators layer for keyboard navigation.
2631
/// </summary>
@@ -101,6 +106,14 @@ private bool TryFindContainerToFocus(ItemContainer? currentElement, TraversalReq
101106
return result?.Element;
102107
}
103108

109+
protected virtual void OnElementFocused(IKeyboardFocusTarget<ItemContainer> target)
110+
{
111+
if (AutoPanOnNodeFocus)
112+
{
113+
BringIntoView(target.Bounds, BringIntoViewEdgeOffset);
114+
}
115+
}
116+
104117
public bool MoveFocus(FocusNavigationDirection direction)
105118
=> MoveFocus(new TraversalRequest(direction));
106119

Nodify/Editor/NodifyEditor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,7 @@ public NodifyEditor()
581581
Loaded += OnEditorLoaded;
582582
Unloaded += OnEditorUnloaded;
583583

584-
_focusNavigator = new StatefulFocusNavigator<ItemContainer>(target => BringIntoView(target.Element.Bounds, BringIntoViewEdgeOffset));
584+
_focusNavigator = new StatefulFocusNavigator<ItemContainer>(OnElementFocused);
585585
}
586586

587587
/// <inheritdoc />

Nodify/Editor/States/KeyboardNavigation.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,18 @@ protected override void OnKeyUp(KeyEventArgs e)
6767
if (Keyboard.FocusedElement is ItemContainer itemContainer)
6868
{
6969
itemContainer.Select(SelectionType.Invert);
70-
Element.BringIntoView(itemContainer.Bounds, NodifyEditor.BringIntoViewEdgeOffset);
70+
if (NodifyEditor.AutoPanOnNodeFocus)
71+
{
72+
Element.BringIntoView(itemContainer.Bounds, NodifyEditor.BringIntoViewEdgeOffset);
73+
}
7174
}
7275
else if (Keyboard.FocusedElement is ConnectionContainer connectionContainer)
7376
{
7477
connectionContainer.Select(SelectionType.Invert);
75-
Element.BringIntoView(connectionContainer.Bounds, NodifyEditor.BringIntoViewEdgeOffset);
78+
if (NodifyEditor.AutoPanOnNodeFocus)
79+
{
80+
Element.BringIntoView(connectionContainer.Bounds, NodifyEditor.BringIntoViewEdgeOffset);
81+
}
7682
}
7783

7884
e.Handled = true;

0 commit comments

Comments
 (0)