private GestureFrame MakeNewGestureFrame()
 {
     GestureFrame newFrame = new GestureFrame();
       for (int i = 0; i < 400; i++)
       {
     newFrame.FrontCells[i] = new GestureFrameCell() { IndexInFrame = i, IsHotspot = false };
     newFrame.SideCells[i] = new GestureFrameCell() { IndexInFrame = i, IsHotspot = false };
       }
       return newFrame;
 }
 private GestureFrame DeepCopyGestureFrame(GestureFrame sourceFrame)
 {
     GestureFrame targetFrame = new GestureFrame();
       for (int i = 0; i < 400; i++)
       {
     targetFrame.FrontCells[i] = new GestureFrameCell()
     {
       IndexInFrame = sourceFrame.FrontCells[i].IndexInFrame,
       IsHotspot = sourceFrame.FrontCells[i].IsHotspot
     };
     targetFrame.SideCells[i] = new GestureFrameCell()
     {
       IndexInFrame = sourceFrame.SideCells[i].IndexInFrame,
       IsHotspot = sourceFrame.SideCells[i].IsHotspot
     };
       }
       return targetFrame;
 }
    public void DeleteFrame(GestureFrame f)
    {
      if (f == null) return;

      Gesture g = (Gesture)TheWorkspace.DataContext;
      if (g == null) return;

      g.Frames.Remove(f);

      if (g.Frames.Count == 0)
        g.Frames.Add(MakeNewGestureFrame()); // Do not let a gesture have 0 frames //TODO: having 0-framed gestures could be useful for creating named libraries of keyboard shortcuts as templates (say one library for PowerPoint, one for Media Player etc.) to which a user can then fill-in the gesture frames (would need the Visualizer to be aware of that and also maybe show the respective gestures colored as red - to signify they're not yet complete)

      if (FramesListBox.SelectedItem == null)
        FramesListBox.SelectedIndex = FramesListBox.Items.Count - 1;

      SyncEditorGrids();
    }
    public void MoveFrameBackwards(GestureFrame f)
    {
      if (f == null) return;

      Gesture g = (Gesture)TheWorkspace.DataContext;
      if (g == null) return;

      int fIndex = g.Frames.IndexOf(f);
      if (fIndex == 0)
        g.Frames.Move(fIndex, g.Frames.Count - 1);
      else
        g.Frames.Move(fIndex, fIndex - 1);

      SyncEditorGrids();
    }
        public void LoadGestureCollection(string filename)
        {
            string json = File.ReadAllText(filename);
              // DeserializeObject() does not appear to correctly deserialize Gesture objects
              // Below is a kinda-dirty solution around that
              List<Gesture> sourceList = JsonConvert.DeserializeObject<List<Gesture>>(json);
              GestureCollection.Clear();

              foreach (Gesture sourceGesture in sourceList)
              {
            RemoveNoneKeys(sourceGesture.Command); //Seems somewhere at the serialization or deserialization Key.None creeps in, so remove it

            //copy sourceGesture to targetGesture //TODO: check why this copying is needed
            Gesture targetGesture = new Gesture()
            {
              Name = sourceGesture.Name,
              Command = new ObservableCollection<Key>(sourceGesture.Command),
              Hold = sourceGesture.Hold,
              Joint = sourceGesture.Joint
            };
            //copy the frames too (note: this is not the same as DeepCopyGestureFrame)
            foreach (GestureFrame sourceFrame in sourceGesture.Frames)
            {
              GestureFrame targetFrame = new GestureFrame();
              for (int i = 0; i < 400; i++)
              {
            targetFrame.FrontCells[i] = sourceFrame.FrontCells[i];
            targetFrame.SideCells[i] = sourceFrame.SideCells[i];
              }
              targetGesture.Frames.Add(targetFrame);
            }

            GestureCollection.Add(targetGesture);

            if (GestureCollectionLoaded != null)
              GestureCollectionLoaded(this, EventArgs.Empty);
              }
        }