void OnKeyDown(KeyDownEvent evt) { SliderKey sliderKey = SliderKey.None; bool isHorizontal = direction == SliderDirection.Horizontal; if (isHorizontal && evt.keyCode == KeyCode.Home || !isHorizontal && evt.keyCode == KeyCode.End) { sliderKey = inverted ? SliderKey.Highest : SliderKey.Lowest; } else if (isHorizontal && evt.keyCode == KeyCode.End || !isHorizontal && evt.keyCode == KeyCode.Home) { sliderKey = inverted ? SliderKey.Lowest : SliderKey.Highest; } else if (isHorizontal && evt.keyCode == KeyCode.PageUp || !isHorizontal && evt.keyCode == KeyCode.PageDown) { sliderKey = inverted ? SliderKey.HigherPage : SliderKey.LowerPage; } else if (isHorizontal && evt.keyCode == KeyCode.PageDown || !isHorizontal && evt.keyCode == KeyCode.PageUp) { sliderKey = inverted ? SliderKey.LowerPage : SliderKey.HigherPage; } if (sliderKey == SliderKey.None) { return; } ComputeValueFromKey(sliderKey, evt.shiftKey); evt.StopPropagation(); }
internal override void ComputeValueFromKey(SliderKey sliderKey, bool isShift) { switch (sliderKey) { case SliderKey.None: return; case SliderKey.Lowest: value = lowValue; return; case SliderKey.Highest: value = highValue; return; } bool isPageSize = sliderKey == SliderKey.LowerPage || sliderKey == SliderKey.HigherPage; // Change by approximately 1/100 of entire range, or 1/10 if holding down shift // But round to nearest power of ten to get nice resulting numbers. var delta = GetClosestPowerOfTen(Mathf.Abs((highValue - lowValue) * 0.01f)); if (delta < 1) { delta = 1; } if (isPageSize) { delta *= pageSize; } else if (isShift) { delta *= 10; } // Increment or decrement by just over half the delta. // This means that e.g. if delta is 1, incrementing from 1.0 will go to 2.0, // but incrementing from 0.9 is going to 1.0 rather than 2.0. // This feels more right since 1.0 is the "next" one. if (sliderKey == SliderKey.Lower || sliderKey == SliderKey.LowerPage) { delta = -delta; } // Now round to a multiple of our delta value so we get a round end result instead of just a round delta. value = Mathf.RoundToInt(RoundToMultipleOf(value + (delta * 0.5001f), Mathf.Abs(delta))); }
void OnNavigationMove(NavigationMoveEvent evt) { SliderKey sliderKey = SliderKey.None; bool isHorizontal = direction == SliderDirection.Horizontal; if (evt.direction == (isHorizontal ? NavigationMoveEvent.Direction.Left : NavigationMoveEvent.Direction.Down)) { sliderKey = inverted ? SliderKey.Higher : SliderKey.Lower; } else if (evt.direction == (isHorizontal ? NavigationMoveEvent.Direction.Right : NavigationMoveEvent.Direction.Up)) { sliderKey = inverted ? SliderKey.Lower : SliderKey.Higher; } if (sliderKey == SliderKey.None) { return; } ComputeValueFromKey(sliderKey, evt.shiftKey); evt.StopPropagation(); }
internal abstract void ComputeValueFromKey(SliderKey sliderKey, bool isShift);