public Rect SelectStrokesByNode(IInkAnalysisNode node) { var ids = GetNodeStrokeIds(node); var strokes = GetStrokesByIds(ids); var rect = SelectStrokes(strokes); return(rect); }
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); }
private void ShowOrHideSelection(IInkAnalysisNode node) { if (node != null) { var rect = _strokeService.SelectStrokesByNode(node); _selectionRectangleService.UpdateSelectionRect(rect); } else { ClearSelection(); } }
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); } }
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); }
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); } }
public void ClearSelection() { selectedNode = null; _strokeService.ClearStrokesSelection(); _selectionRectangleService.Clear(); }