// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#include "axisgrid_p.h"

QT_BEGIN_NAMESPACE

AxisGrid::AxisGrid(QQuickItem *parent) :
      QQuickShaderEffect(parent)
{
}

AxisGrid::~AxisGrid() {}

void AxisGrid::componentComplete()
{
    QQuickShaderEffect::componentComplete();
    setupShaders();
}

void AxisGrid::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
{
    m_iResolution = QVector3D(newGeometry.width(), newGeometry.height(), 1.0);
    emit iResolutionChanged();

    QQuickShaderEffect::geometryChange(newGeometry, oldGeometry);
}

void AxisGrid::setupShaders()
{
    setFragmentShader(QUrl(QStringLiteral("qrc:/shaders/gridshader.frag.qsb")));
    setVertexShader(QUrl(QStringLiteral("qrc:/shaders/gridshader.vert.qsb")));
}

QVector3D AxisGrid::iResolution() const
{
    return m_iResolution;
}

qreal AxisGrid::smoothing() const
{
    return m_smoothing;
}

void AxisGrid::setSmoothing(qreal newSmoothing)
{
    if (qFuzzyCompare(m_smoothing, newSmoothing))
        return;
    m_smoothing = newSmoothing;
    emit smoothingChanged();
}

int AxisGrid::origo() const
{
    return m_origo;
}

void AxisGrid::setOrigo(int newOrigo)
{
    if (m_origo == newOrigo)
        return;
    m_origo = newOrigo;
    emit origoChanged();
}

QVector4D AxisGrid::gridVisibility() const
{
    return m_gridVisibility;
}

void AxisGrid::setGridVisibility(const QVector4D &newGridVisibility)
{
    if (m_gridVisibility == newGridVisibility)
        return;
    m_gridVisibility = newGridVisibility;
    emit gridVisibilityChanged();
}

qreal AxisGrid::gridWidth() const
{
    return m_gridWidth;
}

void AxisGrid::setGridWidth(qreal newGridWidth)
{
    if (qFuzzyCompare(m_gridWidth, newGridWidth))
        return;
    m_gridWidth = newGridWidth;
    emit gridWidthChanged();
}

qreal AxisGrid::gridHeight() const
{
    return m_gridHeight;
}

void AxisGrid::setGridHeight(qreal newGridHeight)
{
    if (qFuzzyCompare(m_gridHeight, newGridHeight))
        return;
    m_gridHeight = newGridHeight;
    emit gridHeightChanged();
}

QPointF AxisGrid::gridMovement() const
{
    return m_gridMovement;
}

void AxisGrid::setGridMovement(QPointF newGridMovement)
{
    if (m_gridMovement == newGridMovement)
        return;
    m_gridMovement = newGridMovement;
    emit gridMovementChanged();
}

QColor AxisGrid::subGridColor() const
{
    return m_subGridColor;
}

void AxisGrid::setSubGridColor(QColor newSubGridColor)
{
    if (m_subGridColor == newSubGridColor)
        return;
    m_subGridColor = newSubGridColor;
    emit subGridColorChanged();
}

QColor AxisGrid::gridColor() const
{
    return m_gridColor;
}

void AxisGrid::setGridColor(QColor newGridColor)
{
    if (m_gridColor == newGridColor)
        return;
    m_gridColor = newGridColor;
    emit gridColorChanged();
}

QColor AxisGrid::plotAreaBackgroundColor() const
{
    return m_plotAreaBackgroundColor;
}

void AxisGrid::setPlotAreaBackgroundColor(QColor color)
{
    if (m_plotAreaBackgroundColor == color)
        return;
    m_plotAreaBackgroundColor = color;
    emit plotAreaBackgroundColorChanged();
}

qreal AxisGrid::subGridLineWidth() const
{
    return m_subGridLineWidth;
}

void AxisGrid::setSubGridLineWidth(qreal newSubGridLineWidth)
{
    if (qFuzzyCompare(m_subGridLineWidth, newSubGridLineWidth))
        return;
    m_subGridLineWidth = newSubGridLineWidth;
    emit subGridLineWidthChanged();
}

qreal AxisGrid::gridLineWidth() const
{
    return m_gridLineWidth;
}

void AxisGrid::setGridLineWidth(qreal newGridLineWidth)
{
    if (qFuzzyCompare(m_gridLineWidth, newGridLineWidth))
        return;
    m_gridLineWidth = newGridLineWidth;
    emit gridLineWidthChanged();
}

qreal AxisGrid::verticalSubGridScale() const
{
    return m_verticalSubGridScale;
}

void AxisGrid::setVerticalSubGridScale(qreal newVerticalSubGridScale)
{
    if (qFuzzyCompare(m_verticalSubGridScale, newVerticalSubGridScale))
        return;
    m_verticalSubGridScale = newVerticalSubGridScale;
    emit verticalSubGridScaleChanged();
}

qreal AxisGrid::horizontalSubGridScale() const
{
    return m_horizontalSubGridScale;
}

void AxisGrid::setHorizontalSubGridScale(qreal newHorizontalSubGridScale)
{
    if (qFuzzyCompare(m_horizontalSubGridScale, newHorizontalSubGridScale))
        return;
    m_horizontalSubGridScale = newHorizontalSubGridScale;
    emit horizontalSubGridScaleChanged();
}

QT_END_NAMESPACE
