diff -r 84b3bf5ee3d2 -r 8b513df1b446 src/FingersDance.Control.TimeLine/UserControlTimeLine.xaml.cs --- a/src/FingersDance.Control.TimeLine/UserControlTimeLine.xaml.cs Wed Oct 07 17:16:46 2009 +0200 +++ b/src/FingersDance.Control.TimeLine/UserControlTimeLine.xaml.cs Fri Oct 09 11:33:35 2009 +0200 @@ -5,11 +5,13 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Data; +using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Navigation; using System.Windows.Controls.Primitives; using Microsoft.Surface.Presentation.Controls; +using Microsoft.Surface.Presentation; using System.Windows.Threading; using FingersDance.Data; @@ -119,6 +121,9 @@ CuttingVM = new CuttingViewModel(cut, AnnotWidth); tv.DataContext = CuttingVM; + tv.listview.PreviewContactDown += listview_PreviewContactDown; + SurfaceDragDrop.AddDragCanceledHandler(tv.listview, onDragCanceled); + UserControlTimeLine_SizeChanged(null, null); slider_ContactTapGesture(this, null); @@ -202,9 +207,40 @@ //startOrEndAnnotation(); } + public Boolean isAnnotationAccepted(AnnotationViewModel avm) + { + Boolean annotOk = true; + // We check if the annotation's begin and end timecodes allow a new annotation creation + if (CuttingVM != null && AnnotWaiting == false) + { + foreach (Annotation a in AnnotList) + { + //Console.WriteLine("a.TcBegin = " + a.TcBegin + ", avm.TcBegin = " + avm.TcBegin + ", tcOut = " + (a.TcBegin + a.Dur)); + // Check begin TC + if (a.TcBegin <= avm.TcBegin && avm.TcBegin <= (a.TcBegin + a.Dur)) + { + annotOk = false; + } + // Check end tc and if the new annotation will not cover any other + float endTC = avm.TcBegin + avm.Dur; + //Console.WriteLine("a.TcBegin = " + a.TcBegin + ", tcOut = " + (a.TcBegin + a.Dur) + ", AnnotTcBegin = " + AnnotTcBegin + ", currentTC = " + currentTC); + if (a.TcBegin <= endTC && endTC <= (a.TcBegin + a.Dur) || (avm.TcBegin < a.TcBegin && (a.TcBegin + a.Dur) < endTC)) + { + annotOk = false; + } + } + } + else + { + annotOk = false; + } + return annotOk; + + } + public void addAnnotation(AnnotationViewModel avm) { - Console.WriteLine("addAnnotation = " + avm.TcBegin + ", " + avm.Dur + ", " + avm.GestureType); + //Console.WriteLine("addAnnotation = " + avm.TcBegin + ", " + avm.Dur + ", " + avm.GestureType); Boolean annotOk = true; // We check if the annotation's begin and end timecodes allow a new annotation creation if (CuttingVM != null && AnnotWaiting == false) @@ -297,5 +333,98 @@ } } + + private void listview_PreviewContactDown(object sender, Microsoft.Surface.Presentation.ContactEventArgs e) + { + FrameworkElement findSource = e.OriginalSource as FrameworkElement; + SurfaceListBoxItem draggedElement = null; + + // Find the touched SurfaceListBoxItem object. + while (draggedElement == null && findSource != null) + { + if ((draggedElement = findSource as SurfaceListBoxItem) == null) + { + findSource = VisualTreeHelper.GetParent(findSource) as FrameworkElement; + } + } + + if (draggedElement == null) + { + return; + } + + // Create the cursor visual. + ContentControl cursorVisual = new ContentControl() + { + Content = new TimelineAnnotationView() + { + DataContext = findSource.DataContext + } + }; + + // We apply the current scale to the dragged annotation + ((TimelineAnnotationView)cursorVisual.Content).RenderTransform = this.RenderTransform; + + // Add a handler. This will enable the application to change the visual cues. (NOT USEFUL IN FINGERSDANCE CASE) + //SurfaceDragDrop.AddTargetChangedHandler(cursorVisual, OnTargetChanged); + + // Create a list of input devices. Add the contacts that + // are currently captured within the dragged element and + // the current contact (if it isn't already in the list). + List devices = new List(); + devices.Add(e.Contact); + foreach (Contact contact in draggedElement.ContactsCapturedWithin) + { + if (contact != e.Contact) + { + devices.Add(contact); + } + } + + // Get the drag source object + ItemsControl dragSource = ItemsControl.ItemsControlFromItemContainer(draggedElement); + + bool startDragOkay = + SurfaceDragDrop.BeginDragDrop( + dragSource, // The SurfaceListBox object that the cursor is dragged out from. + draggedElement, // The SurfaceListBoxItem object that is dragged from the drag source. + cursorVisual, // The visual element of the cursor. + draggedElement.DataContext, // The data associated with the cursor. + devices, // The input devices that start dragging the cursor. + DragDropEffects.Move); // The allowed drag-and-drop effects of the operation. + + // If the drag began successfully, set e.Handled to true. + // Otherwise SurfaceListBoxItem captures the contact + // and causes the drag operation to fail. + e.Handled = startDragOkay; + } + + private void onDragCanceled(Object sender, SurfaceDragDropEventArgs e) + { + Console.WriteLine("onDragCanceled = " + sender + ", ((ContentControl)e.Cursor.Visual).Content = " + ((ContentControl)e.Cursor.Visual).Content); + // e.Cursor.Visual is the ContentControl, so its Content is the dragged TimelineAnnotationView + AnnotationViewModel annotationDataVM = (AnnotationViewModel)((TimelineAnnotationView)((ContentControl)e.Cursor.Visual).Content).DataContext; + // We check if the annotation is well one of the current annotations + if (CuttingVM != null) + { + foreach (Annotation a in AnnotList) + { + //Console.WriteLine("a.TcBegin = " + a.TcBegin + ", avm.TcBegin = " + avm.TcBegin + ", tcOut = " + (a.TcBegin + a.Dur)); + // Check begin TC + if (a.TcBegin == annotationDataVM.TcBegin && a.Dur == annotationDataVM.Dur && a.GestureType==annotationDataVM.GestureType) + { + // We found the good annotation so we can delete it + AnnotList.Remove(a); + // We redisplay the timeline + CuttingVM.setListFromAnnotations(AnnotList, AnnotWidth); + tv.DataContext = null; + tv.DataContext = CuttingVM; + return; + } + } + } + } + + } } \ No newline at end of file