예제 #1
0
        public Rect SelectStrokesByNode(IInkAnalysisNode node)
        {
            var ids     = GetNodeStrokeIds(node);
            var strokes = GetStrokesByIds(ids);
            var rect    = SelectStrokes(strokes);

            return(rect);
        }
예제 #2
0
        private IReadOnlyList <uint> GetNodeStrokeIds(IInkAnalysisNode node)
        {
            var strokeIds = node.GetStrokeIds();

            if (node.Kind == InkAnalysisNodeKind.Paragraph && node.Children[0].Kind == InkAnalysisNodeKind.ListItem)
            {
                strokeIds = new HashSet <uint>(strokeIds).ToList();
            }
            return(strokeIds);
        }
예제 #3
0
 private void ShowOrHideSelection(IInkAnalysisNode node)
 {
     if (node != null)
     {
         var rect = _strokeService.SelectStrokesByNode(node);
         _selectionRectangleService.UpdateSelectionRect(rect);
     }
     else
     {
         ClearSelection();
     }
 }
예제 #4
0
        private void InkCanvas_Tapped(object sender, TappedRoutedEventArgs e)
        {
            var position = e.GetPosition(_inkCanvas);

            if (selectedNode != null && RectHelper.Contains(selectedNode.BoundingRect, position))
            {
                if (DateTime.Now.Subtract(lastDoubleTapTime).TotalMilliseconds < TripleTapTime)
                {
                    ExpandSelection();
                }
            }
            else
            {
                selectedNode = _analyzer.FindHitNode(position);
                ShowOrHideSelection(selectedNode);
            }
        }
예제 #5
0
        private async void InkCanvas_PointerPressed(object sender, PointerRoutedEventArgs e)
        {
            var position = e.GetCurrentPoint(_inkCanvas).Position;

            while (_analyzer.IsAnalyzing)
            {
                await Task.Delay(TimeSpan.FromMilliseconds(BusyWaitingTime));
            }

            if (_selectionRectangleService.ContainsPosition(position))
            {
                // Pressed on the selected rect, do nothing
                return;
            }

            selectedNode = _analyzer.FindHitNode(position);
            ShowOrHideSelection(selectedNode);
        }
예제 #6
0
        private void ExpandSelection()
        {
            if (selectedNode != null &&
                selectedNode.Kind != InkAnalysisNodeKind.UnclassifiedInk &&
                selectedNode.Kind != InkAnalysisNodeKind.InkDrawing &&
                selectedNode.Kind != InkAnalysisNodeKind.WritingRegion)
            {
                selectedNode = selectedNode.Parent;
                if (selectedNode.Kind == InkAnalysisNodeKind.ListItem && selectedNode.Children.Count == 1)
                {
                    // Hierarchy: WritingRegion->Paragraph->ListItem->Line->{Bullet, Word1, Word2...}
                    // When a ListItem has only one Line, the bounding rect is same with its child Line,
                    // in this case, we skip one level to avoid confusion.
                    selectedNode = selectedNode.Parent;
                }

                ShowOrHideSelection(selectedNode);
            }
        }
예제 #7
0
 public void ClearSelection()
 {
     selectedNode = null;
     _strokeService.ClearStrokesSelection();
     _selectionRectangleService.Clear();
 }