aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/cc/polyfrost/oneconfig
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cc/polyfrost/oneconfig')
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/gui/SideBar.java3
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/gui/animations/Animation.java2
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/gui/animations/CubicBezier.java102
3 files changed, 105 insertions, 2 deletions
diff --git a/src/main/java/cc/polyfrost/oneconfig/gui/SideBar.java b/src/main/java/cc/polyfrost/oneconfig/gui/SideBar.java
index ebfc8cb..b25a8e3 100644
--- a/src/main/java/cc/polyfrost/oneconfig/gui/SideBar.java
+++ b/src/main/java/cc/polyfrost/oneconfig/gui/SideBar.java
@@ -1,6 +1,7 @@
package cc.polyfrost.oneconfig.gui;
import cc.polyfrost.oneconfig.gui.animations.Animation;
+import cc.polyfrost.oneconfig.gui.animations.CubicBezier;
import cc.polyfrost.oneconfig.gui.animations.DummyAnimation;
import cc.polyfrost.oneconfig.gui.animations.EaseInOutQuart;
import cc.polyfrost.oneconfig.gui.elements.BasicButton;
@@ -94,7 +95,7 @@ public class SideBar {
private void moveSideBar(BasicButton button) {
if (button.equals(buttons.get(selected))) return;
buttons.get(selected).setColorPalette(ColorPalette.TERTIARY);
- moveAnimation = new EaseInOutQuart(300, buttons.get(selected).y - y, button.y - y, false);
+ moveAnimation = new CubicBezier(0.76f, 0, 0.24f, 1, 300, buttons.get(selected).y - y, button.y - y, false);
sizeAnimation = new DummyAnimation(36);
selected = buttons.indexOf(button);
}
diff --git a/src/main/java/cc/polyfrost/oneconfig/gui/animations/Animation.java b/src/main/java/cc/polyfrost/oneconfig/gui/animations/Animation.java
index 30fcc4e..77556b5 100644
--- a/src/main/java/cc/polyfrost/oneconfig/gui/animations/Animation.java
+++ b/src/main/java/cc/polyfrost/oneconfig/gui/animations/Animation.java
@@ -33,7 +33,7 @@ public abstract class Animation {
*/
public float get(float deltaTime) {
timePassed += deltaTime;
- if (timePassed >= duration) timePassed = duration;
+ if (timePassed >= duration) return start + change;
return animate(timePassed / duration) * change + start;
}
diff --git a/src/main/java/cc/polyfrost/oneconfig/gui/animations/CubicBezier.java b/src/main/java/cc/polyfrost/oneconfig/gui/animations/CubicBezier.java
new file mode 100644
index 0000000..f7848da
--- /dev/null
+++ b/src/main/java/cc/polyfrost/oneconfig/gui/animations/CubicBezier.java
@@ -0,0 +1,102 @@
+/* This file contains an adaptation of code from The Android Open Source
+ * Project found at <https://cs.android.com/>
+ * For the avoidance of doubt, this file is still licensed under the terms
+ * of OneConfig's Licensing.
+ *
+ * LICENSE NOTICE FOR ADAPTED CODE
+ *
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use the file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Significant changes (as required by the Apache 2.0):
+ * - Changed variable names
+ * - Code adapted from Kotlin to Java
+ * - Removed variables defining premade easing functions
+ * - Added constructor for JDT and OneConfig's animation system
+ *
+ * As per the terms of the Apache 2.0 License, a copy of the License
+ * is found at `src/main/resources/licenses/Android-License.txt`.
+ */
+
+package cc.polyfrost.oneconfig.gui.animations;
+
+public class CubicBezier extends Animation {
+ private static final float CubicErrorBound = 0.001f;
+ protected final float P0;
+ protected final float P1;
+ protected final float P2;
+ protected final float P3;
+
+ /**
+ * @param P0 First control point X
+ * @param P1 First control point Y
+ * @param P2 Second control point X
+ * @param P3 Second control point Y
+ * @param duration The duration of the animation
+ * @param start The start of the animation
+ * @param end The end of the animation
+ * @param reverse Reverse the animation
+ */
+ public CubicBezier(float P0, float P1, float P2, float P3, float duration, float start, float end, boolean reverse) {
+ super(duration, start, end, reverse);
+ this.P0 = P0;
+ this.P1 = P1;
+ this.P2 = P2;
+ this.P3 = P3;
+ }
+
+ /**
+ * This constructor should be used with JDT's getCubicBezier method
+ *
+ * @param points The control points
+ * @param duration The duration of the animation
+ * @param start The start of the animation
+ * @param end The end of the animation
+ * @param reverse Reverse the animation
+ */
+ public CubicBezier(float[] points, float duration, float start, float end, boolean reverse) {
+ this(points[0], points[1], points[2], points[3], duration, start, end, reverse);
+ }
+
+ /**
+ * Adapted from <a href="https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Easing.kt">Android</a>
+ * Under Apache 2.0 license
+ *
+ * @param x The current point
+ * @return The value
+ */
+ @Override
+ protected float animate(float x) {
+ float start = 0.0f;
+ float end = 1.0f;
+ while (true) {
+ float midpoint = (start + end) / 2;
+ float estimate = evaluateCubic(P0, P2, midpoint);
+ if (Math.abs(x - estimate) < CubicErrorBound)
+ return evaluateCubic(P1, P3, midpoint);
+ if (estimate < x) start = midpoint;
+ else end = midpoint;
+ }
+ }
+
+ /**
+ * Adapted from <a href="https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Easing.kt">Android</a>
+ * Under Apache 2.0 license
+ */
+ private float evaluateCubic(float a, float b, float m) {
+ return 3 * a * (1 - m) * (1 - m) * m +
+ 3 * b * (1 - m) * /* */ m * m +
+ /* */ m * m * m;
+ }
+}