#include "fancyslider.h"
#include "qboxlayout.h"

#include <cmath>

FancySlider::FancySlider(QWidget *parent)
    : QWidget{parent}
{
    QHBoxLayout* hbox = new QHBoxLayout(this);
    hbox->setMargin(0);
    hbox->setContentsMargins(0, 0, 0, 0);
    setLayout(hbox);

    slider = new QSlider();
    slider->setOrientation(Qt::Orientation::Horizontal);
    slider->setMaximum(sliderResolution);

    box = new QDoubleSpinBox();
    label = new QLabel();

    layout()->addWidget(slider);
    layout()->addWidget(box);
    layout()->addWidget(label);

    connect(box, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &FancySlider::setValue);
    connect(slider, &QSlider::valueChanged, this, [&](int v)
    {
        setValue(((v / (double)sliderResolution) * (max - min)) + min);
    });


}

void FancySlider::setValue(double v)
{
    if (v != value)
    {
        value = v;
        updateValues();

        emit valueChanged(value);
    }
}

void FancySlider::updateValues()
{
    box->setMaximum(max);
    box->setMinimum(min);
    if (value != box->value())
        box->setValue(value);

    slider->setValue(((value - min) / (max - min)) * sliderResolution);

    box->setSingleStep((max-min) / sliderResolution);
    box->setDecimals(std::ceil(-std::log10(box->singleStep())));
}