Skip to content

Commit 0a3969d

Browse files
committed
[DYN-8338] Move Auto-Complete Marker Triggering to ViewModel Instead of Codebehind (DynamoDS#15969)
1 parent f98122b commit 0a3969d

8 files changed

Lines changed: 56 additions & 63 deletions

File tree

src/DynamoCoreWpf/Properties/Resources.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/DynamoCoreWpf/Properties/Resources.en-US.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4137,4 +4137,7 @@ To make this file into a new template, save it to a different folder, then move
41374137
<data name="PreferencesViewShowDefaultGroupDescription" xml:space="preserve">
41384138
<value>Show default group description</value>
41394139
</data>
4140+
<data name="NodeAutoCompleteToolTip" xml:space="preserve">
4141+
<value>Click to get Node Autocomplete suggestions</value>
4142+
</data>
41404143
</root>

src/DynamoCoreWpf/Properties/Resources.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4124,4 +4124,7 @@ To make this file into a new template, save it to a different folder, then move
41244124
<data name="PreferencesViewShowDefaultGroupDescription" xml:space="preserve">
41254125
<value>Show default group description</value>
41264126
</data>
4127-
</root>
4127+
<data name="NodeAutoCompleteToolTip" xml:space="preserve">
4128+
<value>Click to get Node Autocomplete suggestions</value>
4129+
</data>
4130+
</root>

src/DynamoCoreWpf/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5035,6 +5035,7 @@ static Dynamo.Wpf.Properties.Resources.NextGuideText.get -> string
50355035
static Dynamo.Wpf.Properties.Resources.NodeAutocomplete.get -> string
50365036
static Dynamo.Wpf.Properties.Resources.NodeAutocompleteDocumentationUriString.get -> string
50375037
static Dynamo.Wpf.Properties.Resources.NodeAutoCompleteNotAvailableForCollapsedGroups.get -> string
5038+
static Dynamo.Wpf.Properties.Resources.NodeAutoCompleteToolTip.get -> string
50385039
static Dynamo.Wpf.Properties.Resources.NodeContextMenuEnablePeriodicUpdate.get -> string
50395040
static Dynamo.Wpf.Properties.Resources.NodeContextMenuHelp.get -> string
50405041
static Dynamo.Wpf.Properties.Resources.NodeContextMenuIsInput.get -> string

src/DynamoCoreWpf/UI/Themes/Modern/InPorts.xaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,13 @@
220220
>✨</Label>
221221

222222
<interactivity:Interaction.Triggers>
223-
<interactivity:EventTrigger EventName="PreviewMouseDown">
223+
<interactivity:EventTrigger EventName="PreviewMouseLeftButtonDown">
224224
<interactivity:InvokeCommandAction Command="{Binding NodeAutoCompleteCommand}" PassEventArgsToCommand="True"/>
225225
</interactivity:EventTrigger>
226226
</interactivity:Interaction.Triggers>
227+
<Border.ToolTip>
228+
<dynui:DynamoToolTip AttachmentSide="Left" Style="{DynamicResource ResourceKey=SLightToolTip}" Content="{x:Static p:Resources.NodeAutoCompleteToolTip}"/>
229+
</Border.ToolTip>
227230
</Border>
228231
<Border x:Name="PortBorderHighlight"
229232
Grid.Column="1"

src/DynamoCoreWpf/UI/Themes/Modern/OutPorts.xaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
xmlns:dynui="clr-namespace:Dynamo.UI.Controls;assembly=DynamoCoreWpf"
55
xmlns:interactivity="clr-namespace:Dynamo.Microsoft.Xaml.Behaviors;assembly=Dynamo.Microsoft.Xaml.Behaviors"
66
xmlns:ui="clr-namespace:Dynamo.UI;assembly=DynamoCoreWpf"
7+
xmlns:p="clr-namespace:Dynamo.Wpf.Properties;assembly=DynamoCoreWpf"
78
xmlns:viewModels="clr-namespace:Dynamo.ViewModels;assembly=DynamoCoreWpf"
89
xmlns:views="clr-namespace:Dynamo.UI.Views;assembly=DynamoCoreWpf">
910
<ResourceDictionary.MergedDictionaries>
@@ -217,10 +218,13 @@
217218
>✨</Label>
218219

219220
<interactivity:Interaction.Triggers>
220-
<interactivity:EventTrigger EventName="PreviewMouseDown">
221+
<interactivity:EventTrigger EventName="PreviewMouseLeftButtonDown">
221222
<interactivity:InvokeCommandAction Command="{Binding NodeAutoCompleteCommand}" PassEventArgsToCommand="True"/>
222223
</interactivity:EventTrigger>
223224
</interactivity:Interaction.Triggers>
225+
<Border.ToolTip>
226+
<dynui:DynamoToolTip AttachmentSide="Right" Style="{DynamicResource ResourceKey=SLightToolTip}" Content="{x:Static p:Resources.NodeAutoCompleteToolTip}"/>
227+
</Border.ToolTip>
224228
</Border>
225229

226230
<Border x:Name="PortBorderHighlight"
@@ -232,7 +236,6 @@
232236
CornerRadius="11,0,0,11"
233237
Visibility="{Binding Highlight, UpdateSourceTrigger=PropertyChanged}"
234238
SnapsToDevicePixels="True">
235-
236239
</Border>
237240
</Grid>
238241
</DataTemplate>

src/DynamoCoreWpf/ViewModels/Core/PortViewModel.cs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Dynamo.Search.SearchElements;
1313
using Dynamo.UI.Commands;
1414
using Dynamo.Utilities;
15+
using static Dynamo.ViewModels.SearchViewModel;
1516

1617
namespace Dynamo.ViewModels
1718
{
@@ -114,11 +115,36 @@ public bool NodeAutoCompleteMarkerVisible
114115
get => nodeAutoCompleteMarkerVisible;
115116
set
116117
{
117-
nodeAutoCompleteMarkerVisible = value;
118+
if (!IsAutoCompleteMarkerDisabled() && CanHaveAutoCompleteMarker())
119+
{
120+
nodeAutoCompleteMarkerVisible = value;
121+
}
122+
else
123+
{
124+
nodeAutoCompleteMarkerVisible = false;
125+
}
118126
RaisePropertyChanged(nameof(NodeAutoCompleteMarkerVisible));
119127
}
120128
}
121-
129+
private bool IsAutoCompleteMarkerDisabled()
130+
{
131+
// True if autocomplete is turned off globally
132+
// Or a connector is being created now
133+
// Or node is frozen.
134+
// Or node is transient state.
135+
return !NodeViewModel.DynamoViewModel.EnableNodeAutoComplete ||
136+
NodeViewModel.WorkspaceViewModel.IsConnecting ||
137+
NodeViewModel.IsFrozen ||
138+
NodeViewModel.IsTransient;
139+
}
140+
private bool CanHaveAutoCompleteMarker()
141+
{
142+
return PortModel.Connectors.Count == 0
143+
&& NodeViewModel.NodeModel is not CodeBlockNodeModel
144+
&& NodeViewModel.NodeModel is not CoreNodeModels.Watch
145+
&& NodeViewModel.NodeModel is not PythonNodeModels.PythonNode
146+
&& NodeViewModel.NodeModel is not PythonNodeModels.PythonStringNode;
147+
}
122148
/// <summary>
123149
/// The height of port.
124150
/// </summary>
@@ -437,6 +463,7 @@ private void NodePropertyChanged(object sender, System.ComponentModel.PropertyCh
437463
{
438464
case nameof(IsSelected):
439465
RaisePropertyChanged(nameof(IsSelected));
466+
NodeAutoCompleteMarkerVisible = IsSelected;
440467
break;
441468
case nameof(State):
442469
RaisePropertyChanged(nameof(State));

src/DynamoCoreWpf/Views/Core/NodeView.xaml.cs

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -508,9 +508,6 @@ private void OnNodeViewMouseEnter(object sender, MouseEventArgs e)
508508
// ViewModel.DynamoViewModel.ShowPreviewBubbles will be updated AFTER node mouse enter event occurs
509509
// so, wait while ShowPreviewBubbles binding updates value
510510
Dispatcher.BeginInvoke(new Action(TryShowPreviewBubbles), DispatcherPriority.Loaded);
511-
512-
513-
Dispatcher.BeginInvoke(new Action(TryShowAutoCompleteMarker), DispatcherPriority.Loaded);
514511
}
515512

516513
private void TryShowPreviewBubbles()
@@ -537,43 +534,6 @@ private void TryShowPreviewBubbles()
537534
Dispatcher.DelayInvoke(previewDelay, BringToFront);
538535
}
539536

540-
private void TryShowAutoCompleteMarker()
541-
{
542-
//show the node autocomplete marker if available, skip codeblocks and watch nodes
543-
if (IsAutoCompleteMarkerDisabled())
544-
{
545-
return;
546-
}
547-
548-
if (ViewModel.NodeModel is not CodeBlockNodeModel && ViewModel.NodeModel is not CoreNodeModels.Watch && ViewModel.NodeModel is not PythonNodeModels.PythonNode && ViewModel.NodeModel is not PythonNodeModels.PythonStringNode)
549-
{
550-
//For input ports, if there are connectors present, do not show marker.
551-
foreach (PortViewModel port in ViewModel.InPorts)
552-
{
553-
//We check for connector count because 'IsConnected' returns true for use of default value
554-
port.NodeAutoCompleteMarkerVisible = port.PortModel.Connectors.Count < 1;
555-
}
556-
557-
//For output ports, we always show the marker.
558-
foreach (PortViewModel port in ViewModel.OutPorts)
559-
{
560-
port.NodeAutoCompleteMarkerVisible = true;
561-
}
562-
}
563-
}
564-
565-
private void TryHideAutoCompleteMaker()
566-
{
567-
//hide the node autocomplete marker if mouse leaves the node
568-
var ports = new List<PortViewModel>(ViewModel.InPorts);
569-
ports.AddRange(ViewModel.OutPorts);
570-
571-
foreach (PortViewModel port in ports)
572-
{
573-
port.NodeAutoCompleteMarkerVisible = false;
574-
}
575-
}
576-
577537
private bool IsPreviewDisabled()
578538
{
579539
// True if preview bubbles are turned off globally
@@ -588,23 +548,9 @@ private bool IsPreviewDisabled()
588548
ViewModel.WorkspaceViewModel.IsSelecting || !previewEnabled ||
589549
!ViewModel.IsPreviewInsetVisible || ViewModel.IsFrozen || viewModel.IsTransient;
590550
}
591-
private bool IsAutoCompleteMarkerDisabled()
592-
{
593-
// True if autocomplete is turned off globally
594-
// Or a connector is being created now
595-
// Or node is frozen.
596-
// Or node is transient state.
597-
return !ViewModel.DynamoViewModel.EnableNodeAutoComplete ||
598-
ViewModel.WorkspaceViewModel.IsConnecting ||
599-
ViewModel.IsFrozen ||
600-
viewModel.IsTransient;
601-
}
602551
private void OnNodeViewMouseLeave(object sender, MouseEventArgs e)
603552
{
604553
ViewModel.ZIndex = oldZIndex;
605-
606-
//hide the node autocomplete marker if mouse leaves the node
607-
TryHideAutoCompleteMaker();
608554

609555
//Watch nodes doesn't have Preview so we should avoid to use any method/property in PreviewControl class due that Preview is created automatically
610556
if (ViewModel.NodeModel != null && ViewModel.NodeModel is CoreNodeModels.Watch) return;
@@ -733,16 +679,14 @@ private void OnNodeViewMouseMove(object sender, MouseEventArgs e)
733679
{
734680
PreviewControl.TransitionToState(PreviewControl.State.Hidden);
735681
}
736-
737-
TryHideAutoCompleteMaker();
738682
}
739683

740684
/// <summary>
741685
/// When Mouse is captured, all mouse events are handled by element, that captured it.
742686
/// So we can't use MouseLeave/MouseEnter events.
743687
/// In this case, when we want to ensure, that mouse really left node, we use HitTest.
744688
/// </summary>
745-
/// <param name="mousePosition">Currect position of mouse</param>
689+
/// <param name="mousePosition">Correct position of mouse</param>
746690
/// <returns>bool</returns>
747691
private bool IsMouseInsideNodeOrPreview(Point mousePosition)
748692
{

0 commit comments

Comments
 (0)