コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 private void ClearState()
 {
     hoveredEntry  = null;
     selectedEntry = null;
     movingEntry   = false;
     hoveredHandle = Handle.None;
     movingHandle  = Handle.None;
 }
コード例 #4
0
        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);
        }
コード例 #5
0
        private CurveEntry CreateCurveEntry(Vector2 position)
        {
            var newPos = ClampValue(position);
            var entry  = new CurveEntry(newPos);

            curve.Add(entry);
            OnCurveChange();
            return(entry);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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));
        }
コード例 #12
0
        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);
        }
コード例 #13
0
 private void RemoveCurveEntry(CurveEntry entry)
 {
     curve.Remove(entry);
     ClearState();
     OnCurveChange();
 }