core/easingcurve: add EasingCurve type

This commit is contained in:
outfoxxed committed 2024-03-21 02:54:21 -07:00
1 parent dd811ac423
commit 8e25c1cee0
5 files changed
+76 -1

No files matched your search

+1 -1
Submodule docs updated: b130193160...a036d378c0.
+1
View File
@@ -21,6 +21,7 @@ qt_add_library(quickshell-core STATIC
qsintercept.cpp
incubator.cpp
lazyloader.cpp
easingcurve.cpp
)
set_source_files_properties(main.cpp PROPERTIES COMPILE_DEFINITIONS GIT_REVISION="${GIT_REVISION}")
+33
View File
@@ -0,0 +1,33 @@
#include "easingcurve.hpp"
#include <utility>
#include <qeasingcurve.h>
#include <qpoint.h>
#include <qrect.h>
#include <qtmetamacros.h>
#include <qtypes.h>
qreal EasingCurve::valueAt(qreal x) const { return this->mCurve.valueForProgress(x); }
qreal EasingCurve::interpolate(qreal x, qreal a, qreal b) const {
return a + (b - a) * this->valueAt(x);
}
QPointF EasingCurve::interpolate(qreal x, const QPointF& a, const QPointF& b) const {
return QPointF(this->interpolate(x, a.x(), b.x()), this->interpolate(x, a.y(), b.y()));
}
QRectF EasingCurve::interpolate(qreal x, const QRectF& a, const QRectF& b) const {
return QRectF(
this->interpolate(x, a.topLeft(), b.topLeft()),
this->interpolate(x, a.bottomRight(), b.bottomRight())
);
}
QEasingCurve EasingCurve::curve() const { return this->mCurve; }
void EasingCurve::setCurve(QEasingCurve curve) {
if (this->mCurve == curve) return;
this->mCurve = std::move(curve);
emit this->curveChanged();
}
+40
View File
@@ -0,0 +1,40 @@
#pragma once
#include <qeasingcurve.h>
#include <qobject.h>
#include <qpoint.h>
#include <qqmlintegration.h>
#include <qrect.h>
#include <qtmetamacros.h>
///! Easing curve.
/// Directly accessible easing curve as used in property animations.
class EasingCurve: public QObject {
Q_OBJECT;
/// Easing curve settings. Works exactly the same as
/// [PropertyAnimation.easing](https://doc.qt.io/qt-6/qml-qtquick-propertyanimation.html#easing-prop).
Q_PROPERTY(QEasingCurve curve READ curve WRITE setCurve NOTIFY curveChanged);
QML_ELEMENT;
public:
EasingCurve(QObject* parent = nullptr): QObject(parent) {}
/// Returns the Y value for the given X value on the curve
/// from 0.0 to 1.0.
Q_INVOKABLE [[nodiscard]] qreal valueAt(qreal x) const;
/// Interpolates between two values using the given X coordinate.
Q_INVOKABLE [[nodiscard]] qreal interpolate(qreal x, qreal a, qreal b) const;
/// Interpolates between two points using the given X coordinate.
Q_INVOKABLE [[nodiscard]] QPointF interpolate(qreal x, const QPointF& a, const QPointF& b) const;
/// Interpolates two rects using the given X coordinate.
Q_INVOKABLE [[nodiscard]] QRectF interpolate(qreal x, const QRectF& a, const QRectF& b) const;
[[nodiscard]] QEasingCurve curve() const;
void setCurve(QEasingCurve curve);
signals:
void curveChanged();
private:
QEasingCurve mCurve;
};
+1
View File
@@ -15,5 +15,6 @@ headers = [
"popupwindow.hpp",
"singleton.hpp",
"lazyloader.hpp",
"easingcurve.hpp",
]
-----