10#include <lager/lenses.hpp>
11#include <lager/constant.hpp>
17 auto formatQRealAsString = [] (qreal
value) {
18 return QString(
"%1").arg(
value, 0,
'f', 2);
21 auto formatQRealAsStringWithSuffix = [] (
const QString &suffix) {
22 return [suffix] (qreal
value) {
23 return QString(
"%1%2").arg(
value, 0,
'f', 2).arg(suffix);
28 auto curveToNormalizedCurve = lager::lenses::getset(
29 [] (
const std::tuple<QString, QRectF> &curveData)
33 const QRectF
bounds = std::get<1>(curveData);
40 points = {{0.0, 0.5,
false}, {1.0, 0.5,
false}};
42 for (
auto it = points.begin(); it != points.end(); ++it) {
44 it->setY(it->y() / (2.0 * normalized.
yLimit) + 0.5);
56 for (
auto it = points.begin(); it != points.end(); ++it) {
57 it->setX(it->x() * (normalizedCurve.xMax - normalizedCurve.xMin) + normalizedCurve.xMin);
58 it->setY((it->y() - 0.5) * normalizedCurve.yLimit * 2.0);
63 std::get<1>(curveData) = QRectF(normalizedCurve.xMin,
64 -normalizedCurve.yLimit,
65 normalizedCurve.xMax - normalizedCurve.xMin,
66 2.0 * normalizedCurve.yLimit);
79 lager::cursor<QRectF> curveRange,
80 lager::reader<QString> activeSensorId,
81 lager::reader<int> activeSensorLength,
83 const QString &yValueSuffix)
84 : m_curve(
std::move(curve))
85 , m_curveRange(
std::move(curveRange))
86 , m_activeSensorId(
std::move(activeSensorId))
87 , m_activeSensorLength(
std::move(activeSensorLength))
88 , m_normalizedCurve(lager::with(m_curve, m_curveRange).zoom(curveToNormalizedCurve))
89 , m_maxYRange(maxYRange)
90 , m_yValueSuffix(yValueSuffix)
92 ,
LAGER_QT(xMin) {m_normalizedCurve[&NormalizedCurve::xMin]}
93 ,
LAGER_QT(xMax) {m_normalizedCurve[&NormalizedCurve::xMax]}
94 ,
LAGER_QT(xMinState) {lager::with(m_normalizedCurve[&NormalizedCurve::xMin],
96 lager::make_constant(0.0),
97 lager::make_constant(
true))
99 ,
LAGER_QT(xMaxState) {lager::with(m_normalizedCurve[&NormalizedCurve::xMax],
100 lager::make_constant(1.0),
101 lager::with(m_activeSensorId, m_activeSensorLength)
103 lager::make_constant(
true))
117 [
maxYRange,
yValueSuffix](lager::cursor<QString>
curve, lager::cursor<QRectF> curveRange, lager::reader<QString> activeSensorId, lager::reader<int> activeSensorLength) {
128 std::get<1>(
curve) |= QRect(0, -1, 1, 2);
130 NormalizedCurve normalized = lager::view(curveToNormalizedCurve,
curve);
131 curve = lager::set(curveToNormalizedCurve,
curve, normalized);
187 return lager::make_constant(QString());
float value(const T *src, size_t ch)
std::function< KisCurveRangeModelInterface *(lager::cursor< QString >, lager::cursor< QRectF >, lager::reader< QString >, lager::reader< int >)> KisCurveRangeModelFactory
static qreal calcXMaxValueWithFactory(const QString &activeSensorId, const int length)
static qreal calcXMinValueWithFactory(const QString &sensorId)
lager::reader< qreal > xMaxValue() override
lager::reader< qreal > yMinValue() override
lager::reader< qreal > yMaxValue() override
lager::reader< QString > yValueSuffix() override
lager::reader< QString > yMinLabel() override
lager::reader< QString > yMaxLabel() override
const QString m_yValueSuffix
~MyPaintCurveRangeModel()
lager::cursor< NormalizedCurve > m_normalizedCurve
lager::cursor< QString > curve() override
lager::reader< QString > xMinLabel() override
lager::reader< QString > xValueSuffix() override
static std::tuple< QString, QRectF > reshapeCurve(std::tuple< QString, QRectF > curve)
static KisCurveRangeModelFactory factory(qreal maxYRange, const QString &yValueSuffix)
lager::reader< qreal > xMinValue() override
MyPaintCurveRangeModel(lager::cursor< QString > curve, lager::cursor< QRectF > curveRange, lager::reader< QString > activeSensorId, lager::reader< int > activeSensorLength, qreal maxYRange, const QString &yValueSuffix)
lager::reader< QString > xMaxLabel() override
static bool qFuzzyIsNull(half h)
const QList< KisCubicCurvePoint > & curvePoints() const