private void UpdateHandlePosition(Vector2 position) { if (selectedEntry == null) { return; } if (movingHandle == Handle.None) { return; } var area = GraphArea; var leftHandle = selectedEntry.LeftHandle; var rightHandle = selectedEntry.RightHandle; var pos = FromScreen(position, area); if (movingHandle == Handle.Left) { leftHandle = pos; } else { rightHandle = pos; } selectedEntry = ReplaceCurveHandles(selectedEntry, leftHandle, rightHandle); }
private void UpdateEntryPosition(Vector2 position) { if (selectedEntry == null) { return; } var area = GraphArea; var p = ToScreen(selectedEntry.Value, area); if ((p - position).Length() < 0.1f) { return; } p = FromScreen(position, area); if (HasZeroLine) { if (Math.Abs(p.Y) < 0.03f * RangeY) { p.Y = 0; } } selectedEntry = ReplaceCurveEntry(selectedEntry, p); }
private void ClearState() { hoveredEntry = null; selectedEntry = null; movingEntry = false; hoveredHandle = Handle.None; movingHandle = Handle.None; }
private CurveEntry ReplaceCurveHandles(CurveEntry oldEntry, Vector2 leftHandle, Vector2 rightHandle) { var entry = new CurveEntry(oldEntry.Type, oldEntry.Value, leftHandle, rightHandle); curve.Remove(oldEntry); curve.Add(entry); OnCurveChange(); return(entry); }
private CurveEntry CreateCurveEntry(Vector2 position) { var newPos = ClampValue(position); var entry = new CurveEntry(newPos); curve.Add(entry); OnCurveChange(); return(entry); }
private bool LeftMousePress(Vector2 position, bool doubleClick) { var area = GraphArea; //if (doubleClick && selectedEntry != null) //{ // movingEntry = false; // selectedEntry = SwitchCurveEntry( // selectedEntry, // selectedEntry.Type == CurveEntry.EntryType.Linear ? CurveEntry.EntryType.Bezier : CurveEntry.EntryType.Linear); //} if (!movingEntry) { if (movingHandle == Handle.None) { movingHandle = GetHandle(position, area); } if (movingHandle == Handle.None) { selectedEntry = GetEntryAt(position); QueueDraw(); if (selectedEntry != null) { movingHandle = GetHandle(position, area); if (movingHandle == Handle.None && !movingEntry) { movingEntry = true; } } else { var p = FromScreen(position, area); var closestP = Evaluate(p.X, area); if (curve.Count == 0 || (Math.Abs(closestP.Y - position.Y) < 12 || doubleClick)) { selectedEntry = CreateCurveEntry(p); movingEntry = true; } } } } //if (movingEntry) //{ // UpdateEntryPosition(position); //} return(true); }
private CurveEntry ReplaceCurveEntry(CurveEntry oldEntry, Vector2 position) { var newPos = ClampValue(position); var diff = newPos - oldEntry.Value; var entry = new CurveEntry(oldEntry.Type, newPos, diff + oldEntry.LeftHandle, diff + oldEntry.RightHandle); curve.Remove(oldEntry); curve.Add(entry); OnCurveChange(); return(entry); }
internal void KeyPress(EventKey evnt) { // Hack: can't get normal keypress event for some reason, so hook it up from the parent if (selectedEntry != null && (evnt.Key == Key.Delete || evnt.Key == Key.BackSpace)) { RemoveCurveEntry(selectedEntry); } if (selectedEntry != null && (evnt.Key == Key.b)) { selectedEntry = SwitchCurveEntry(selectedEntry, CurveEntry.EntryType.Bezier); } if (selectedEntry != null && (evnt.Key == Key.n)) { selectedEntry = SwitchCurveEntry(selectedEntry, CurveEntry.EntryType.Linear); } }
protected override bool OnMotionNotifyEvent(EventMotion evnt) { if (curve == null) { return(true); } var mousePos = new Vector2((float)evnt.X, (float)evnt.Y); if (movingHandle != Handle.None) { UpdateHandlePosition(mousePos); } if (movingEntry) { UpdateEntryPosition(mousePos); } else { var oldHandle = hoveredHandle; hoveredHandle = GetHandle(mousePos, GraphArea); if (hoveredHandle != oldHandle) { QueueDraw(); } else { var oldEntry = hoveredEntry; hoveredEntry = GetEntryAt(mousePos); if (hoveredEntry != oldEntry) { //GdkWindow.Cursor = hoveredEntry != null ? Resources.HandCursor : null; QueueDraw(); } } } return(true); }
private CurveEntry SwitchCurveEntry(CurveEntry oldEntry, CurveEntry.EntryType newType) { CurveEntry entry = null; const float bezierOffset = 0.1f; switch (newType) { case CurveEntry.EntryType.Linear: { entry = new CurveEntry(newType, oldEntry.Value, oldEntry.LeftHandle, oldEntry.RightHandle); } break; case CurveEntry.EntryType.Bezier: { entry = new CurveEntry(newType, oldEntry.Value, oldEntry.Value - new Vector2(bezierOffset, 0.0f), oldEntry.Value + new Vector2(bezierOffset, 0.0f)); } break; } if (entry == null) { throw new NotImplementedException("curve entry type"); } curve.Remove(oldEntry); curve.Add(entry); OnCurveChange(); return(entry); }
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string) { var curve = new Curve(); string[] entries = ((string)value).Split(new[] { ListSeparator }, StringSplitOptions.None); foreach (var entryText in entries) { if (string.IsNullOrEmpty(entryText)) { continue; } var p = entryText.Split(new[] { EntrySeparator }); if ((p.Length == 2) || (p.Length == 3 && p[0] == "lin")) // Backward compatibility { var position = new Vector2(Convert.ToSingle(p[p.Length - 2], culture), Convert.ToSingle(p[p.Length - 1], culture)); var entry = new CurveEntry(position); curve.Add(entry); } else if ((p.Length == 6) || (p.Length == 7 && p[0] == "bez")) // Backward compatibility { var position = new Vector2(Convert.ToSingle(p[p.Length - 6], culture), Convert.ToSingle(p[p.Length - 5], culture)); var left = new Vector2(Convert.ToSingle(p[p.Length - 4], culture), Convert.ToSingle(p[p.Length - 3], culture)); var right = new Vector2(Convert.ToSingle(p[p.Length - 2], culture), Convert.ToSingle(p[p.Length - 1], culture)); var entry = new CurveEntry(position, left, right); curve.Add(entry); } } return(curve); } return(base.ConvertFrom(context, culture, value)); }
private bool RightMousePress(Vector2 position) { selectedEntry = GetEntryAt(position); QueueDraw(); var m = new Menu(); if (selectedEntry != null) { var currentEntry = selectedEntry; AddMenuEntry(m, "Linear", Resources.IconCurveLinear, delegate { selectedEntry = SwitchCurveEntry(currentEntry, CurveEntry.EntryType.Linear); }); AddMenuEntry(m, "Bezier", Resources.IconCurveBezier, delegate { selectedEntry = SwitchCurveEntry(currentEntry, CurveEntry.EntryType.Bezier); }); m.Add(new SeparatorMenuItem()); AddMenuEntry(m, "Delete", Resources.IconCurveDelete, delegate { RemoveCurveEntry(currentEntry); }); } AddMenuEntry(m, "Clear All", Resources.IconCancel, delegate { ClearCurve(); }); m.ShowAll(); m.Popup(); return(true); }
private void RemoveCurveEntry(CurveEntry entry) { curve.Remove(entry); ClearState(); OnCurveChange(); }