private void KeySelector_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
 {
     if (SelectorMode == KeySelectorMode.Done)
     {
         return;
     }
     if (SelectorMode == KeySelectorMode.Start)
     {
         selectedStartFrame = currentFrame;
     }
     else
     {
         selectedEndFrame = currentFrame;
     }
     if (SelectorMode == KeySelectorMode.End)
     {
         SelectorMode = KeySelectorMode.Done;
     }
     else
     {
         SelectorMode = KeySelectorMode.End;
         createCursor(ref cursor);
         KeySelector.Children.Add(cursor);
     }
 }
        private void EndBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (!int.TryParse(EndBox.Text, out selectedEndFrame))
            {
                return;
            }
            bool numChanged = false;

            if (selectedEndFrame > blitz3DAnimation.Frames)
            {
                selectedEndFrame = blitz3DAnimation.Frames;
                numChanged       = true;
            }
            if (selectedEndFrame < selectedStartFrame)
            {
                selectedEndFrame = selectedStartFrame;
                numChanged       = true;
            }
            if (numChanged)
            {
                //EndBox.Text = selectedEndFrame.ToString();
                return;
            }
            if (endCursor == null)
            {
                SelectorMode = KeySelectorMode.End;
                createCursor(ref cursor);
                KeySelector.Children.Add(cursor);
            }
            MoveSelectionCursor(endCursor, selectedEndFrame);
        }
        void Redisplay()
        {
            //reset
            SelectorMode       = KeySelectorMode.Start;
            selectedStartFrame = selectedEndFrame = 0;
            cursorShown        = false;
            endCursor          = startCursor = cursor = null;
            space = null;
            KeySelector.Children.Clear();

            //display sequences
            foreach (var seq in _sequences)
            {
                if (seq.IsRootSeq)
                {
                    continue;
                }
                SolidColorBrush randomColor     = new SolidColorBrush(AppResources.BatchRandomColor(1)[0]);
                Brush           semiTransparent = new SolidColorBrush(randomColor.Color);
                semiTransparent.Opacity = .5;
                Border border = null;
                KeySelector.Children.Add(
                    border = new Border
                {
                    Child = new TextBlock()
                    {
                        HorizontalAlignment = HorizontalAlignment.Center,
                        VerticalAlignment   = VerticalAlignment.Center,
                        Text          = (string.IsNullOrWhiteSpace(seq.Name) ? seq.ID.ToString() : seq.Name + $" ({seq.ID})") + $": {seq.FrameLength} frames",
                        Padding       = new Thickness(5, 3, 5, 3),
                        TextWrapping  = TextWrapping.Wrap,
                        Background    = randomColor,
                        TextAlignment = TextAlignment.Center
                    },
                    Padding         = new Thickness(10),
                    BorderBrush     = randomColor,
                    BorderThickness = new Thickness(2, 0, 2, 0),
                    Background      = semiTransparent,
                    Width           = (seq.FrameLength / (double)blitz3DAnimation.Frames) * KeySelector.ActualWidth,
                    Height          = KeySelector.ActualHeight
                });

                if (border.Width < 60)
                {
                    ((TextBlock)border.Child).Text = seq.ID.ToString();
                    border.Padding = new Thickness(0);
                }
                Canvas.SetLeft(border, (seq.First / (double)blitz3DAnimation.Frames) * KeySelector.ActualWidth);
            }
            DescBlock.Text = $"Sequences: {_sequences.Count()}, Frames: {preview.numPositionKeys()}";
            DataChart.DisplayAnimation(preview);
        }