From d79dc3f906f2774903bf21477f31a8faddc53de9 Mon Sep 17 00:00:00 2001 From: Jason Date: Tue, 17 Jun 2025 19:20:59 -0400 Subject: [PATCH 01/13] DYN-8326 - copy to clipboard button for warning bubble Complete implementation, but the images need to be updated --- .gitignore | 6 +- src/DynamoCoreWpf/DynamoCoreWpf.csproj | 4 + .../Properties/Resources.Designer.cs | 11 +- .../Properties/Resources.en-US.resx | 5 +- src/DynamoCoreWpf/Properties/Resources.resx | 3 + src/DynamoCoreWpf/UI/Images/copy_hover.png | Bin 0 -> 1604 bytes src/DynamoCoreWpf/UI/Images/copy_normal.png | Bin 0 -> 1241 bytes .../ViewModels/Preview/InfoBubbleViewModel.cs | 44 ++++++++ .../Views/Preview/InfoBubbleView.xaml | 95 +++++++++++++++++- 9 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 src/DynamoCoreWpf/UI/Images/copy_hover.png create mode 100644 src/DynamoCoreWpf/UI/Images/copy_normal.png diff --git a/.gitignore b/.gitignore index 849dd5651d5..d9c91dedcc3 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,7 @@ launchSettings.json # IDE # ############### .idea +.vscode/ #documentation files doc/html/ @@ -116,4 +117,7 @@ dynamods-splash-screen-*.tgz /src/Notifications/dynamods-notifications-center-*.tgz /src/DynamoCoreWpf/.npmrc /src/Notifications/.npmrc -src/LibraryViewExtensionWebView2/.npmrc \ No newline at end of file +src/LibraryViewExtensionWebView2/.npmrc + +# Ignore Issues directory +Issues/ \ No newline at end of file diff --git a/src/DynamoCoreWpf/DynamoCoreWpf.csproj b/src/DynamoCoreWpf/DynamoCoreWpf.csproj index 497325a43eb..bbd7f0357fd 100644 --- a/src/DynamoCoreWpf/DynamoCoreWpf.csproj +++ b/src/DynamoCoreWpf/DynamoCoreWpf.csproj @@ -171,6 +171,8 @@ + + @@ -1323,6 +1325,8 @@ + + diff --git a/src/DynamoCoreWpf/Properties/Resources.Designer.cs b/src/DynamoCoreWpf/Properties/Resources.Designer.cs index 1f7a0df772e..46acb526bfa 100644 --- a/src/DynamoCoreWpf/Properties/Resources.Designer.cs +++ b/src/DynamoCoreWpf/Properties/Resources.Designer.cs @@ -986,7 +986,16 @@ public static string ConverterMessageZoom { return ResourceManager.GetString("ConverterMessageZoom", resourceCulture); } } - + + /// + /// Looks up a localized string similar to Copy to clipboard. + /// + public static string CopyToClipboardTooltip { + get { + return ResourceManager.GetString("CopyToClipboardTooltip", resourceCulture); + } + } + /// /// Looks up a localized string similar to Copy. /// diff --git a/src/DynamoCoreWpf/Properties/Resources.en-US.resx b/src/DynamoCoreWpf/Properties/Resources.en-US.resx index 37b280d6f7c..4050452bbb4 100644 --- a/src/DynamoCoreWpf/Properties/Resources.en-US.resx +++ b/src/DynamoCoreWpf/Properties/Resources.en-US.resx @@ -446,6 +446,9 @@ Don't worry, you'll have the option to save your work. Download Warning + + + Copy to clipboard A Dynamo update is available. Click to install. @@ -4170,4 +4173,4 @@ To make this file into a new template, save it to a different folder, then move Node Icon Data is dumped to \"{0}\". Debug menu | Dump all node icons - \ No newline at end of file + diff --git a/src/DynamoCoreWpf/Properties/Resources.resx b/src/DynamoCoreWpf/Properties/Resources.resx index 7e29a7fbe80..66ed46cb560 100644 --- a/src/DynamoCoreWpf/Properties/Resources.resx +++ b/src/DynamoCoreWpf/Properties/Resources.resx @@ -1126,6 +1126,9 @@ Don't worry, you'll have the option to save your work. Download Warning + + Copy to clipboard + A Dynamo update is available. Click to install. diff --git a/src/DynamoCoreWpf/UI/Images/copy_hover.png b/src/DynamoCoreWpf/UI/Images/copy_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..6496efb05f781cad73904a9eec6a43f10b45bea7 GIT binary patch literal 1604 zcmY*ZdsNbA82({cq*>@@QArPY44PTT%?zwf<$&-;AOcg|Ow7$4>0w8RMj z0GDV+I1}7ac7x3ZSA|CNC%8cr%qTig-?MZC44|2`I2r()Ds!IUID+w9Ib)*&0Ont? z8^qlwMh_k+5+|o9Q{rMtJXy9MhcDv_{8ZU;up0o#RF#~=lL(Y3t{_t^rFf6EocBhF z`4n$fKpZYk9wrcp8JZlyI!$~sPb1+4@x7@bE>2_>2}H;iC^;xqc9v8@Qc=(!fJvZl zPh-&`@s~)S0Du?%>%VtW2|xppDi*voR*vt^|+G8Sjs|lz8}h$2{S9o z;}(A5cFm~+`Ac+!Lm{fUp@=>oS)Cf113S|f>Z97{KC6G7b4346ake_~cnqz3<+G>f_D`KdZp%C^t!rs?LB85q(Ai2Hn(m#_O|;4MM2|hQZ~aCH z4h}Z+{YUVM>~CQf1j82s*rt0;4GW5gqtI`P4PT=UGqc9aFF9O!oRh0o-!UbxN=Z!( zYhV|Sp3M;Y)V6nh1K zIr$Yef3oCcdfOFNecA*1p+t`GX4ZDpPkx+670| zjWpi6Fr|Yf5vPwa5UgA4Ttv9rOa4)tAe=2nIfiA4Sm=xsLJdcZrFL}Hd&mBbhBef}HFTvukyqX{)mF(ZylFK43X zT~uY6D313R0aZ0M&s}!3m+alEYZ`dEmhJRXN9~z0o6S!~SO^b~INLN0~c;N^9001W2<(itBUlj@km8yHAG$s0I>l(g3 zzg4#ua@?D16qy*y-C!4Arb@EUHZ@J9ZQi`B=OA^c^6Fy?i^WR7P2_i_tu__8!p*Jj z9K_+2HRq=P8nhh($PuGY<<)EKFkhRXmKp8VS0wVDdpB3Nt6^c2Y-snbC8gGOwzDU+YOw{8*0RmT zQni2-96TZFoaOp_cLs+8$$N3HW3VL;PoUI_TDX&~=4HE$rddYRhMcSYUJE!xBB=d_DEOFhC?ey6TC z#(4PX_eUKht6%Lkx|Ja*AV}|nOI?_R%g5gh+zm);mP1-vT84**tK8{nR2;NRyNa}d z(z_GxK!b-$Jo2KGj)X?%2Qb=!p36dV0o=zX8{xr#t`v literal 0 HcmV?d00001 diff --git a/src/DynamoCoreWpf/UI/Images/copy_normal.png b/src/DynamoCoreWpf/UI/Images/copy_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..c0219b006788998fe225d103802e7cc513856045 GIT binary patch literal 1241 zcmV;~1Sb25P)Px(lSxEDR9HvFmrqDzR}{wYm-k*`RAv~B(xOp<4s>IKrgT?Sg1C_`gt~EI6)Kh? z4oV#tgMX>gQo1RnP!&dSQAtIDq8nSrZmkSus;!8QQmrY1lnx~EnU~!5Ts*;uV|1Y8 zZEo`JefRwCcg{WMUWhC|$g+Kr0+3R^8H>eUIGxTMDW&29AQFj$&@@f`r}qF}CK8F? z0X((YY(EPjegyE(>ntQ3Y}i1qb# zrBY#Gq4ava9|QRI)&Rr9!^-H!#)dLXMrvwmQUK%%4$Siy5MHlW!L6;Wv1*6)_4Qu? z_~O<8qobp06{J8@QbhQj6;PTBt^y#x(&Wp_%PC_NCuE!+>LVcjEu}PPW@g?6@O)rk;5Z(SCjx=M z_a!AI-LC~e(M}SFLLt@ij$i;XPTQ4MPkr=zdV0DHz(Ie1|5HuV%9@*--}3oMB!62B+6&~70&QA_H~&d$CK;Mbm>o?nCzUeh!;`}+FcNhXsWZnt~g zZnv*7$c+GK@Z#cP$_2b787LNuiM+hLRR7e})Nh7iyf-;Hd2F-UG*ZVfj7Pez8?CLa z$A)1%0gzDHmPw?P@~Rl%luQ6@_~MqNeo`S4iKrw-t{EI0R4vC3jVI;Kx9LMo(;5p3 z3LXO3$q2y47=R<6waspoZQm8bJ^1Zm*S(dvs1;1-|zntz$Z5bU>dQX#G_izp1I?~qGroL}%Y)p5-Rg*|5KMMwf{nWR#w3Irc(;0v!;W}|00FB{8 zEEOvPASG&RYcm5_mi6`g{QLvT>nkfOsp3Mi)5>U~Ob?BtI|d(UTUuH~ety2FtE+pd zY1-XPF8FY7Z|@0Bvc0{n%I!s?v@(|VRUlkDXbu|d^ZC?5ii(Q90q`Ibz@z>B{m*Ig z!^1;00o8aui14beQ-LA*f>TjZq2j2xxY+mK1?E}C%V|6w-_&(ow=C<9uIq1HHpbVr zS3v;yTL|%i5Msl!tV&(iON9`0w|t&Mf{ literal 0 HcmV?d00001 diff --git a/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs b/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs index 7961145c27c..873bb0aab5f 100644 --- a/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs @@ -4,7 +4,9 @@ using System.Linq; using System.Text.RegularExpressions; using System.Windows; +using System.Windows.Input; using Dynamo.Logging; +using Dynamo.UI.Commands; using Dynamo.Wpf.ViewModels.Core; namespace Dynamo.ViewModels @@ -66,6 +68,11 @@ public enum State private double zIndex; private Style infoBubbleStyle; + /// + /// Command that copies the content of an info bubble message to clipboard + /// + public ICommand CopyToClipboardCommand { get; private set; } + [Obsolete] public Direction connectingDirection; @@ -502,10 +509,47 @@ private void InitializeInfoBubble(DynamoViewModel dynamoViewModel) InfoBubbleStyle = Style.None; InfoBubbleState = State.Minimized; + // Initialize commands + CopyToClipboardCommand = new DelegateCommand(CopyTextToClipboard, CanCopyToClipboard); + NodeMessages.CollectionChanged += NodeInformation_CollectionChanged; RefreshNodeInformationalStateDisplay(); } + + /// + /// Copies the text of an info bubble message to the clipboard + /// + /// The InfoBubbleDataPacket to copy + private void CopyTextToClipboard(object parameter) + { + if (parameter is InfoBubbleDataPacket infoBubbleDataPacket) + { + try + { + System.Windows.Clipboard.SetText(infoBubbleDataPacket.Text); + // Optional: Add analytics tracking for copy events + Analytics.TrackEvent(Actions.Copy, Categories.NodeOperations, + infoBubbleDataPacket.Style.ToString(), 1); + } + catch (Exception ex) + { + // Log the error but don't crash + DynamoViewModel.Model.Logger.Log("Error copying text to clipboard: " + ex.Message); + } + } + } + + /// + /// Determines if a message can be copied to clipboard + /// + /// The InfoBubbleDataPacket to check + /// True if the message can be copied + private bool CanCopyToClipboard(object parameter) + { + return parameter is InfoBubbleDataPacket infoBubbleDataPacket && + !string.IsNullOrEmpty(infoBubbleDataPacket.Text); + } #endregion diff --git a/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml b/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml index 0ef9d17938b..efdca8521c4 100644 --- a/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml +++ b/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml @@ -1,4 +1,4 @@ - + + + + @@ -653,6 +715,37 @@ Foreground="Black" Text="{x:Static p:Resources.InfoBubbleInfo}" Visibility="{Binding NodeInfoSectionExpanded, FallbackValue=Collapsed, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}" /> + + Date: Tue, 17 Jun 2025 19:29:02 -0400 Subject: [PATCH 02/13] Update .gitignore Removed extraneous dir from .gitignore --- .gitignore | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index d9c91dedcc3..20ea2ee26c1 100644 --- a/.gitignore +++ b/.gitignore @@ -117,7 +117,4 @@ dynamods-splash-screen-*.tgz /src/Notifications/dynamods-notifications-center-*.tgz /src/DynamoCoreWpf/.npmrc /src/Notifications/.npmrc -src/LibraryViewExtensionWebView2/.npmrc - -# Ignore Issues directory -Issues/ \ No newline at end of file +src/LibraryViewExtensionWebView2/.npmrc \ No newline at end of file From e677428f0ef0cb3d1678c3a9bf96ed6e2936890b Mon Sep 17 00:00:00 2001 From: Jason Date: Wed, 18 Jun 2025 11:29:46 -0400 Subject: [PATCH 03/13] Updated the InfoBubble copy icons --- src/DynamoCoreWpf/DynamoCoreWpf.csproj | 8 ++++---- .../UI/Images/copy_16px_default.png | Bin 0 -> 213 bytes src/DynamoCoreWpf/UI/Images/copy_16px_hover.png | Bin 0 -> 208 bytes src/DynamoCoreWpf/UI/Images/copy_hover.png | Bin 1604 -> 0 bytes src/DynamoCoreWpf/UI/Images/copy_normal.png | Bin 1241 -> 0 bytes .../Views/Preview/InfoBubbleView.xaml | 12 ++++++------ 6 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 src/DynamoCoreWpf/UI/Images/copy_16px_default.png create mode 100644 src/DynamoCoreWpf/UI/Images/copy_16px_hover.png delete mode 100644 src/DynamoCoreWpf/UI/Images/copy_hover.png delete mode 100644 src/DynamoCoreWpf/UI/Images/copy_normal.png diff --git a/src/DynamoCoreWpf/DynamoCoreWpf.csproj b/src/DynamoCoreWpf/DynamoCoreWpf.csproj index bbd7f0357fd..0688cf9da32 100644 --- a/src/DynamoCoreWpf/DynamoCoreWpf.csproj +++ b/src/DynamoCoreWpf/DynamoCoreWpf.csproj @@ -171,8 +171,8 @@ - - + + @@ -1325,8 +1325,8 @@ - - + + diff --git a/src/DynamoCoreWpf/UI/Images/copy_16px_default.png b/src/DynamoCoreWpf/UI/Images/copy_16px_default.png new file mode 100644 index 0000000000000000000000000000000000000000..4459b159f0cfddc38f0dfd141e9e83441f1e0bd9 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBewL?;V@L(#+lhu;2Mjn|gHQh4mCi5cb!YeY zmbDigU7T|k2Hz7)lKX#r?Hz?jkxU&K@AsOg+3l&;5N2=?_OwvobklST@fYK*E?uUT zku!J80k5oY8?Rh=KIOo_{u6Pb7jzD8X5Bq2UbsdqM)rf^rR$5s&H`;^@O1TaS?83{ F1ORYVN6i2L literal 0 HcmV?d00001 diff --git a/src/DynamoCoreWpf/UI/Images/copy_16px_hover.png b/src/DynamoCoreWpf/UI/Images/copy_16px_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e21ac6fa5d5969217b9328cc8f497857989f4c GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBeyXR7V@L(#+ljGU42m2rxi8nmC6}*%nCh*# z$Z4_si>H|1*1oW&R4wv^lFZt3FAcsakVYa&5q>RhyYs zDAavhensPba6_3LQ}o&irHq-}Z?pQ;Zm_w?-Bj9{ko{K~Xd#2AtDnm{r-UW|*cn63 literal 0 HcmV?d00001 diff --git a/src/DynamoCoreWpf/UI/Images/copy_hover.png b/src/DynamoCoreWpf/UI/Images/copy_hover.png deleted file mode 100644 index 6496efb05f781cad73904a9eec6a43f10b45bea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1604 zcmY*ZdsNbA82({cq*>@@QArPY44PTT%?zwf<$&-;AOcg|Ow7$4>0w8RMj z0GDV+I1}7ac7x3ZSA|CNC%8cr%qTig-?MZC44|2`I2r()Ds!IUID+w9Ib)*&0Ont? z8^qlwMh_k+5+|o9Q{rMtJXy9MhcDv_{8ZU;up0o#RF#~=lL(Y3t{_t^rFf6EocBhF z`4n$fKpZYk9wrcp8JZlyI!$~sPb1+4@x7@bE>2_>2}H;iC^;xqc9v8@Qc=(!fJvZl zPh-&`@s~)S0Du?%>%VtW2|xppDi*voR*vt^|+G8Sjs|lz8}h$2{S9o z;}(A5cFm~+`Ac+!Lm{fUp@=>oS)Cf113S|f>Z97{KC6G7b4346ake_~cnqz3<+G>f_D`KdZp%C^t!rs?LB85q(Ai2Hn(m#_O|;4MM2|hQZ~aCH z4h}Z+{YUVM>~CQf1j82s*rt0;4GW5gqtI`P4PT=UGqc9aFF9O!oRh0o-!UbxN=Z!( zYhV|Sp3M;Y)V6nh1K zIr$Yef3oCcdfOFNecA*1p+t`GX4ZDpPkx+670| zjWpi6Fr|Yf5vPwa5UgA4Ttv9rOa4)tAe=2nIfiA4Sm=xsLJdcZrFL}Hd&mBbhBef}HFTvukyqX{)mF(ZylFK43X zT~uY6D313R0aZ0M&s}!3m+alEYZ`dEmhJRXN9~z0o6S!~SO^b~INLN0~c;N^9001W2<(itBUlj@km8yHAG$s0I>l(g3 zzg4#ua@?D16qy*y-C!4Arb@EUHZ@J9ZQi`B=OA^c^6Fy?i^WR7P2_i_tu__8!p*Jj z9K_+2HRq=P8nhh($PuGY<<)EKFkhRXmKp8VS0wVDdpB3Nt6^c2Y-snbC8gGOwzDU+YOw{8*0RmT zQni2-96TZFoaOp_cLs+8$$N3HW3VL;PoUI_TDX&~=4HE$rddYRhMcSYUJE!xBB=d_DEOFhC?ey6TC z#(4PX_eUKht6%Lkx|Ja*AV}|nOI?_R%g5gh+zm);mP1-vT84**tK8{nR2;NRyNa}d z(z_GxK!b-$Jo2KGj)X?%2Qb=!p36dV0o=zX8{xr#t`v diff --git a/src/DynamoCoreWpf/UI/Images/copy_normal.png b/src/DynamoCoreWpf/UI/Images/copy_normal.png deleted file mode 100644 index c0219b006788998fe225d103802e7cc513856045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1241 zcmV;~1Sb25P)Px(lSxEDR9HvFmrqDzR}{wYm-k*`RAv~B(xOp<4s>IKrgT?Sg1C_`gt~EI6)Kh? z4oV#tgMX>gQo1RnP!&dSQAtIDq8nSrZmkSus;!8QQmrY1lnx~EnU~!5Ts*;uV|1Y8 zZEo`JefRwCcg{WMUWhC|$g+Kr0+3R^8H>eUIGxTMDW&29AQFj$&@@f`r}qF}CK8F? z0X((YY(EPjegyE(>ntQ3Y}i1qb# zrBY#Gq4ava9|QRI)&Rr9!^-H!#)dLXMrvwmQUK%%4$Siy5MHlW!L6;Wv1*6)_4Qu? z_~O<8qobp06{J8@QbhQj6;PTBt^y#x(&Wp_%PC_NCuE!+>LVcjEu}PPW@g?6@O)rk;5Z(SCjx=M z_a!AI-LC~e(M}SFLLt@ij$i;XPTQ4MPkr=zdV0DHz(Ie1|5HuV%9@*--}3oMB!62B+6&~70&QA_H~&d$CK;Mbm>o?nCzUeh!;`}+FcNhXsWZnt~g zZnv*7$c+GK@Z#cP$_2b787LNuiM+hLRR7e})Nh7iyf-;Hd2F-UG*ZVfj7Pez8?CLa z$A)1%0gzDHmPw?P@~Rl%luQ6@_~MqNeo`S4iKrw-t{EI0R4vC3jVI;Kx9LMo(;5p3 z3LXO3$q2y47=R<6waspoZQm8bJ^1Zm*S(dvs1;1-|zntz$Z5bU>dQX#G_izp1I?~qGroL}%Y)p5-Rg*|5KMMwf{nWR#w3Irc(;0v!;W}|00FB{8 zEEOvPASG&RYcm5_mi6`g{QLvT>nkfOsp3Mi)5>U~Ob?BtI|d(UTUuH~ety2FtE+pd zY1-XPF8FY7Z|@0Bvc0{n%I!s?v@(|VRUlkDXbu|d^ZC?5ii(Q90q`Ibz@z>B{m*Ig z!^1;00o8aui14beQ-LA*f>TjZq2j2xxY+mK1?E}C%V|6w-_&(ow=C<9uIq1HHpbVr zS3v;yTL|%i5Msl!tV&(iON9`0w|t&Mf{ diff --git a/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml b/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml index efdca8521c4..4ecb614192a 100644 --- a/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml +++ b/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml @@ -148,10 +148,10 @@ @@ -418,10 +418,10 @@ @@ -736,10 +736,10 @@ From 68ee940c6cd1c642a6147bf5c255228d9f12954b Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 22 Jun 2025 21:02:57 -0400 Subject: [PATCH 04/13] Moved CopyToClipboardCommand to InfoBubbleCommand.cs --- src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs | 15 +++++++++++++-- src/DynamoCoreWpf/PublicAPI.Unshipped.txt | 1 + .../ViewModels/Preview/InfoBubbleViewModel.cs | 10 +--------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs b/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs index 4f30d255b3a..22a82dbfb52 100644 --- a/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs +++ b/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs @@ -1,4 +1,4 @@ -using Dynamo.UI.Commands; +using Dynamo.UI.Commands; namespace Dynamo.ViewModels { @@ -13,6 +13,17 @@ public partial class InfoBubbleViewModel : ViewModelBase private DelegateCommand openDocumentationLinkCommand; private DelegateCommand dismissMessageCommand; private DelegateCommand undismissMessageCommand; + private DelegateCommand copyToClipboardCommand; + + public DelegateCommand CopyToClipboardCommand + { + get + { + if (copyToClipboardCommand == null) + copyToClipboardCommand = new DelegateCommand(CopyTextToClipboard, CanCopyToClipboard); + return copyToClipboardCommand; + } + } public DelegateCommand UpdateContentCommand { @@ -127,4 +138,4 @@ public DelegateCommand UndismissMessageCommand } } } -} \ No newline at end of file +} diff --git a/src/DynamoCoreWpf/PublicAPI.Unshipped.txt b/src/DynamoCoreWpf/PublicAPI.Unshipped.txt index 0445e797f91..afc54d224c3 100644 --- a/src/DynamoCoreWpf/PublicAPI.Unshipped.txt +++ b/src/DynamoCoreWpf/PublicAPI.Unshipped.txt @@ -2438,6 +2438,7 @@ Dynamo.ViewModels.InfoBubbleViewModel.TargetTopLeft.get -> System.Windows.Point Dynamo.ViewModels.InfoBubbleViewModel.TargetTopLeft.set -> void Dynamo.ViewModels.InfoBubbleViewModel.Top.get -> double Dynamo.ViewModels.InfoBubbleViewModel.UndismissMessageCommand.get -> Dynamo.UI.Commands.DelegateCommand +Dynamo.ViewModels.InfoBubbleViewModel.CopyToClipboardCommand.get -> Dynamo.UI.Commands.DelegateCommand Dynamo.ViewModels.InfoBubbleViewModel.UpdateContentCommand.get -> Dynamo.UI.Commands.DelegateCommand Dynamo.ViewModels.InfoBubbleViewModel.UpdatePositionCommand.get -> Dynamo.UI.Commands.DelegateCommand Dynamo.ViewModels.InfoBubbleViewModel.ZIndex.get -> double diff --git a/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs b/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs index 873bb0aab5f..5c87ec401ed 100644 --- a/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs @@ -67,12 +67,7 @@ public enum State // In order to stay above these, we need a high ZIndex value. private double zIndex; private Style infoBubbleStyle; - - /// - /// Command that copies the content of an info bubble message to clipboard - /// - public ICommand CopyToClipboardCommand { get; private set; } - + [Obsolete] public Direction connectingDirection; @@ -509,9 +504,6 @@ private void InitializeInfoBubble(DynamoViewModel dynamoViewModel) InfoBubbleStyle = Style.None; InfoBubbleState = State.Minimized; - // Initialize commands - CopyToClipboardCommand = new DelegateCommand(CopyTextToClipboard, CanCopyToClipboard); - NodeMessages.CollectionChanged += NodeInformation_CollectionChanged; RefreshNodeInformationalStateDisplay(); From e59edfc059b589a5e755e18675aee1ec176d6daa Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 22 Jun 2025 21:04:59 -0400 Subject: [PATCH 05/13] Renamed CanCopyToClipboard to CanCopyTextToClipboard --- src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs | 2 +- src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs b/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs index 22a82dbfb52..7bcb5805ae3 100644 --- a/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs +++ b/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs @@ -20,7 +20,7 @@ public DelegateCommand CopyToClipboardCommand get { if (copyToClipboardCommand == null) - copyToClipboardCommand = new DelegateCommand(CopyTextToClipboard, CanCopyToClipboard); + copyToClipboardCommand = new DelegateCommand(CopyTextToClipboard, CanCopyTextToClipboard); return copyToClipboardCommand; } } diff --git a/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs b/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs index 5c87ec401ed..2e38fefad09 100644 --- a/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Preview/InfoBubbleViewModel.cs @@ -537,7 +537,7 @@ private void CopyTextToClipboard(object parameter) /// /// The InfoBubbleDataPacket to check /// True if the message can be copied - private bool CanCopyToClipboard(object parameter) + private bool CanCopyTextToClipboard(object parameter) { return parameter is InfoBubbleDataPacket infoBubbleDataPacket && !string.IsNullOrEmpty(infoBubbleDataPacket.Text); From 4c49020b621c8b05012499218e4c23f6b150dd5c Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 22 Jun 2025 22:14:15 -0400 Subject: [PATCH 06/13] Missed one instance of changing to CopyTextToClipboard for consistency --- src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs b/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs index 7bcb5805ae3..336599c58c9 100644 --- a/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs +++ b/src/DynamoCoreWpf/Commands/InfoBubbleCommand.cs @@ -13,15 +13,15 @@ public partial class InfoBubbleViewModel : ViewModelBase private DelegateCommand openDocumentationLinkCommand; private DelegateCommand dismissMessageCommand; private DelegateCommand undismissMessageCommand; - private DelegateCommand copyToClipboardCommand; + private DelegateCommand copyTextToClipboardCommand; - public DelegateCommand CopyToClipboardCommand + public DelegateCommand CopyTextToClipboardCommand { get { - if (copyToClipboardCommand == null) - copyToClipboardCommand = new DelegateCommand(CopyTextToClipboard, CanCopyTextToClipboard); - return copyToClipboardCommand; + if (copyTextToClipboardCommand == null) + copyTextToClipboardCommand = new DelegateCommand(CopyTextToClipboard, CanCopyTextToClipboard); + return copyTextToClipboardCommand; } } From 221135c0150b780d3d1653b790a2ffbfef3e76c2 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 22 Jun 2025 22:14:47 -0400 Subject: [PATCH 07/13] Created a common CopyTextToClipboard button style and fixed the alignment/margin of the button --- .../Views/Preview/InfoBubbleView.xaml | 149 +++++++----------- 1 file changed, 57 insertions(+), 92 deletions(-) diff --git a/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml b/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml index 4ecb614192a..44561939ff8 100644 --- a/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml +++ b/src/DynamoCoreWpf/Views/Preview/InfoBubbleView.xaml @@ -34,8 +34,39 @@ To="0" Duration="0:0:.25" /> + - @@ -128,36 +159,14 @@ Text="{x:Static p:Resources.InfoBubbleError}" Visibility="{Binding NodeErrorsSectionExpanded, FallbackValue=Collapsed, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}" /> - + + +