From c5cde62cecfdd413e9902b26b30b0d4dfd05a24d Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Thu, 14 Mar 2019 13:25:32 +0200 Subject: Machine Studio v4.0.10 PPC v1.0.9 --- .../ExtensionMethods/ExceptionExtensions.cs | 6 +- .../ExtensionMethods/FrameworkElementExtensions.cs | 199 +++++++++++++++++++-- 2 files changed, 191 insertions(+), 14 deletions(-) (limited to 'Software/Visual_Studio/Tango.Core/ExtensionMethods') diff --git a/Software/Visual_Studio/Tango.Core/ExtensionMethods/ExceptionExtensions.cs b/Software/Visual_Studio/Tango.Core/ExtensionMethods/ExceptionExtensions.cs index 86434cdc4..af4fc39b5 100644 --- a/Software/Visual_Studio/Tango.Core/ExtensionMethods/ExceptionExtensions.cs +++ b/Software/Visual_Studio/Tango.Core/ExtensionMethods/ExceptionExtensions.cs @@ -43,10 +43,14 @@ public static class ExceptionExtensions { try { - message += Environment.NewLine + String.Join(Environment.NewLine, (exception as AggregateException).InnerExceptions.Select(x => x.Message)); + message = String.Join(Environment.NewLine, (exception as AggregateException).InnerExceptions.Select(x => x.FlattenMessage())); } catch { } } + else if (exception.InnerException != null) + { + message += Environment.NewLine + exception.InnerException.FlattenMessage(); + } return message; } diff --git a/Software/Visual_Studio/Tango.Core/ExtensionMethods/FrameworkElementExtensions.cs b/Software/Visual_Studio/Tango.Core/ExtensionMethods/FrameworkElementExtensions.cs index 2e1791b63..08f3bb101 100644 --- a/Software/Visual_Studio/Tango.Core/ExtensionMethods/FrameworkElementExtensions.cs +++ b/Software/Visual_Studio/Tango.Core/ExtensionMethods/FrameworkElementExtensions.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; +using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media; using System.Windows.Media.Animation; @@ -18,6 +19,14 @@ public static class FrameworkElementExtensions { #region Mouse Or Touch Events + //Used to hold the registered event handlers for later use by UnRegisterMouseOrTouch. + private static List _containers = new List(); + private class ElementEventsContainer + { + public EventHandler Handler { get; set; } + public Action Clear { get; set; } + } + /// /// Registers for mouse or touch down. /// @@ -29,7 +38,7 @@ public static class FrameworkElementExtensions bool mousePressed = false; bool touchDown = false; - element.MouseDown += (x, e) => + MouseButtonEventHandler mouseDownHandler = (x, e) => { if (!touchDown) { @@ -53,7 +62,9 @@ public static class FrameworkElementExtensions } }; - element.TouchDown += (x, e) => + element.MouseDown += mouseDownHandler; + + EventHandler touchDownHandler = (x, e) => { if (!mousePressed) { @@ -77,16 +88,31 @@ public static class FrameworkElementExtensions } }; - element.MouseUp += (_, __) => + element.TouchDown += touchDownHandler; + + MouseButtonEventHandler mouseUpHandler = (_, __) => { touchDown = false; mousePressed = false; }; - element.TouchDown += (_, __) => - { + element.MouseUp += mouseUpHandler; + + //element.TouchDown += (_, __) => + //{ + + //}; + ElementEventsContainer container = new ElementEventsContainer(); + container.Handler = handler; + container.Clear = () => + { + element.MouseUp -= mouseUpHandler; + element.TouchDown -= touchDownHandler; + element.MouseDown -= mouseDownHandler; }; + + _containers.Add(container); } /// @@ -99,6 +125,101 @@ public static class FrameworkElementExtensions RegisterForMouseOrTouchDown(element, null, handler); } + /// + /// Registers for mouse or touch up. + /// + /// The element. + /// The relative to. + /// The handler. + public static void RegisterForMouseOrTouchUp(this FrameworkElement element, FrameworkElement relativeTo, EventHandler handler) + { + bool mouseReleased = false; + bool touchReleased = false; + + MouseButtonEventHandler mouseUpHandler = (x, e) => + { + if (!touchReleased) + { + mouseReleased = true; + + var args = new MouseOrTouchEventArgs() + { + Location = new Point(e.GetPosition(relativeTo != null ? relativeTo : element).X, e.GetPosition(relativeTo != null ? relativeTo : element).Y), + Source = e.Source, + OriginalSource = e.OriginalSource, + Handled = e.Handled, + GetPositionAction = e.GetPosition + }; + + handler(element, args); + e.Handled = args.Handled; + } + else + { + touchReleased = false; + } + }; + + element.MouseUp += mouseUpHandler; + + EventHandler touchUpHandler = (x, e) => + { + + if (!mouseReleased) + { + touchReleased = true; + + var args = new MouseOrTouchEventArgs() + { + Location = new Point(e.GetTouchPoint(relativeTo != null ? relativeTo : element).Position.X, e.GetTouchPoint(relativeTo != null ? relativeTo : element).Position.Y), + Source = e.Source, + OriginalSource = e.OriginalSource, + Handled = e.Handled, + GetPositionAction = (s) => { return e.GetTouchPoint(s).Position; }, + }; + + handler(element, args); + e.Handled = args.Handled; + } + else + { + touchReleased = false; + } + + }; + + element.TouchUp += touchUpHandler; + + EventHandler touchDownHandler = (_, __) => + { + touchReleased = false; + mouseReleased = false; + }; + + element.TouchDown += touchDownHandler; + + ElementEventsContainer container = new ElementEventsContainer(); + container.Handler = handler; + container.Clear = () => + { + element.TouchDown -= touchDownHandler; + element.TouchUp -= touchUpHandler; + element.MouseUp -= mouseUpHandler; + }; + + _containers.Add(container); + } + + /// + /// Registers for mouse or touch up. + /// + /// The element. + /// The handler. + public static void RegisterForMouseOrTouchUp(this FrameworkElement element, EventHandler handler) + { + RegisterForMouseOrTouchUp(element, null, handler); + } + /// /// Registers for preview mouse or touch down. /// @@ -110,7 +231,7 @@ public static class FrameworkElementExtensions bool mousePressed = false; bool touchDown = false; - element.PreviewMouseDown += (x, e) => + MouseButtonEventHandler previewMouseDownHandler = (x, e) => { if (!touchDown) { @@ -134,7 +255,9 @@ public static class FrameworkElementExtensions } }; - element.PreviewTouchDown += (x, e) => + element.PreviewMouseDown += previewMouseDownHandler; + + EventHandler previewTouchDownHandler = (x, e) => { if (!mousePressed) { @@ -158,16 +281,31 @@ public static class FrameworkElementExtensions } }; - element.PreviewMouseUp += (_, __) => + element.PreviewTouchDown += previewTouchDownHandler; + + MouseButtonEventHandler previewMouseUpHandler = (_, __) => { touchDown = false; mousePressed = false; }; - element.PreviewTouchDown += (_, __) => - { + element.PreviewMouseUp += previewMouseUpHandler; + + //element.PreviewTouchDown += (_, __) => + //{ + + //}; + ElementEventsContainer container = new ElementEventsContainer(); + container.Handler = handler; + container.Clear = () => + { + element.PreviewTouchDown -= previewTouchDownHandler; + element.PreviewMouseDown -= previewMouseDownHandler; + element.PreviewMouseUp -= previewMouseUpHandler; }; + + _containers.Add(container); } /// @@ -191,7 +329,7 @@ public static class FrameworkElementExtensions bool mouseReleased = false; bool touchReleased = false; - element.PreviewMouseUp += (x, e) => + MouseButtonEventHandler previewMouseUpHandler = (x, e) => { if (!touchReleased) { @@ -215,8 +353,11 @@ public static class FrameworkElementExtensions } }; - element.PreviewTouchUp += (x, e) => + element.PreviewMouseUp += previewMouseUpHandler; + + EventHandler previewTouchHandler = (x, e) => { + if (!mouseReleased) { touchReleased = true; @@ -237,13 +378,29 @@ public static class FrameworkElementExtensions { touchReleased = false; } + }; - element.PreviewTouchDown += (_, __) => + element.PreviewTouchUp += previewTouchHandler; + + EventHandler previewTouchDownHandler = (_, __) => { touchReleased = false; mouseReleased = false; }; + + element.PreviewTouchDown += previewTouchDownHandler; + + ElementEventsContainer container = new ElementEventsContainer(); + container.Handler = handler; + container.Clear = () => + { + element.PreviewTouchDown -= previewTouchDownHandler; + element.PreviewTouchUp -= previewTouchHandler; + element.PreviewMouseUp -= previewMouseUpHandler; + }; + + _containers.Add(container); } /// @@ -256,6 +413,22 @@ public static class FrameworkElementExtensions RegisterForPreviewMouseOrTouchUp(element, null, handler); } + /// + /// Detaches the specified handler from event which it was originally registered. + /// + /// The element. + /// The handler. + public static void UnRegisterMouseOrTouch(this FrameworkElement element, EventHandler handler) + { + var containers = _containers.Where(x => x.Handler == handler); + + foreach (var container in containers.ToList()) + { + container.Clear(); + _containers.Remove(container); + } + } + /// /// Registers for mouse or touch move. /// -- cgit v1.3.1